Card Game β€” Balance & Strategy Analysis

nsba-markets • 2026-07-31

TL;DR

Overnight I shipped the full buzz/rotation/bonus overhaul + a per-game Elo ladder, then ran a 2,400-game bot-vs-bot tournament on the live tuned model to stress-test balance and strategy. The core fixes work: specialists now reliably win their categories (a 94-ess card beats a 68-ess card to the buzz ~100%, up from ~50% in a crowded field), buzzing is genuinely risky (weak cards neg 70-86% on hard questions), fatigue bites (~1 tier lost per 3 questions), and rest-and-return rotation is mechanically real. The tournament surfaces one clear balance issue β€” aggressive on-category specialists dominate optimal play β€” and confirms your instinct that captains are power-balanced but flavor-identical (so: abilities, not stat changes). Everything is live at nsba.djiang.xyz/cardgame/play. Details, numbers, and a prioritized tuning list below.

How this was tested

All numbers are from scripts/oneoffs/balance_analysis.py β€” bot-vs-bot games on the exact live config (resolution_model=field, winner_picks, 10-card decks, 4-seat tables) over the real 198-card pool. Two caveats up front: (1) a bot policy is an imperfect proxy for a strategy β€” "the rotation bot loses" can mean the bot pilots badly, not that staggering is bad; I flag where this matters. (2) Bots play near-optimally and identically, so they make far fewer mistakes than a human β€” neg rates and upsets are lower in bot games than they'll feel in your hands.


1. The buzz race β€” the core fix (before β†’ after)

The problem you kept hitting: mediocre cards out-buzzing specialists, no negs, and implausible timing. Root cause was a single overtuned constant, FIELD_NOISE_SD = 26, bigger than most skill gaps *and* bigger than the aggression shift, so luck drowned skill. Retuned to 10, with skill weighted harder (FIELD_SKILL_WEIGHT 1.8 β†’ 2.6):

  • Specialists win their category now. akhil (ess 94) vs Sohil Rathi (ess 68), who buzzes first at Normal: 0.89 β†’ 1.00. Anurag (phys 84) vs 4435 (phys 55): 0.94 β†’ 1.00. In your games these were coin flips because the *field* had 16 cards each rolling Β±26 noise; now the best card reliably gets there first.
  • Timing is realistic. The word-1 buzz pile collapsed 0.148 β†’ 0.008; "whole question reads, nobody buzzes" dropped 0.89 β†’ 0.46. Buzzes now cluster mid-to-late and scale with difficulty (median buzz point: Regs RR 28% of the question, Regs DE 57%, Nats RR 64%, Nats DE 79%).
  • Buzzing is risky again. A weak card (skill 55) that buzzes on a hard question now negs 73% / 72% / 86% on Regs-DE / Nats-RR / Nats-DE, while a real specialist (skill β‰₯ 85) still converts ~85%+. That's the self-correcting mechanism you wanted: fast-but-ignorant buzzes neg and hand it to whoever actually knows it.
  • Aggression is a real lever, not noise. A worse card set Aggressive steals the buzz from a better Normal card 51-62% of the time (was a coin flip vs its own Normal baseline of ~7%), and it pays for it: aggressive negs 14-34% across buckets vs 2-4% for the patient card. Genuine gamble, scarier on hard questions.
  • Verdict: the buzz feel is fixed. Skill wins by default; stealing is a deliberate, costed risk.


    2. Drafting strategy β€” specialists are strong, maybe too strong

    Controlled tables, seat-0 archetype vs 3 generalists (fair share = 25%):

  • Steep specialist (spike): 60% win β€” dominant.
  • Mono-specialist: 40%.
  • Synergy (same-team stack): 25% β€” neutral.
  • Smartfield / topstrength: ~21-25% β€” neutral-to-weak.
  • And the free-for-all tournament (12 bots, 2,400 games) tells the same story β€” the top four are all aggressive on-category specialists (spike 50%, boosteasy 45%, oppaware 44%, mono 39%), the bottom are rounded/rotation play (smartfield 13%, rotation 11%).

    Interpretation: your "specialist ceiling > generalist" goal is *achieved* β€” arguably overachieved. Against good piloting, a specialist steered onto its categories just wins; the "harder to execute / punished off-category" cost isn't biting because the bots steer well and the category-card economy lets them stay on-topic. This is the #1 balance flag (see recommendations). The lever is the category-card economy (make steering scarcer / off-category exposure harsher) and/or energy-round frequency (energy favors generalists).

    Synergy is currently a *neutral* draft β€” a same-team stack realizes ~1.28 shared-team pairs per fielded round (the +18 speed bonus is firing), but it doesn't out-perform a flat generalist draft. It's a fine flavor axis but not yet a competitive one; if you want synergy to be a real strategy, the team bonus needs to be worth more than the raw-strength you give up to chase it.


    3. Rotation & stamina β€” front-load vs stagger

    You asked specifically: do you play your strongest four first, or stagger your rotation? The mechanics are healthy — rest-and-return works (26 bench→field returns per game; a benched star recovers to fresh in ~3 questions; fatigue drops ~1 tier per 3 contests). But the result is counter-intuitive:

  • The proactive-rotation bot loses (11-16% win rate), even though it *is* rotating (4.8 bench-returns/game). Riding your best cards (front-load / topstrength) beats it head-to-head.
  • Why (and the caveat): with regen this generous, you don't *need* to pre-emptively rotate β€” you can ride your best four, and only swap a card once it's genuinely worn, because a short rest fully restores it. The rotation bot rotates *too early*, giving up peak-stat rounds to rest cards that weren't tired yet. So on current tuning the answer is "front-load, and rotate reactively" β€” stagger-from-the-start is a trap.

    Is that the game you want? Probably not β€” you wanted rotation to be a live judgment call, and right now "ride your studs, rest only when red" is close to strictly correct. Two dials: make regen slower (so a rested card doesn't come back fully fresh β†’ staggering to never-fully-fatigue becomes worth it) or make decay hit sooner (so four questions of front-loading already costs you). This is the #2 balance flag. Worth a gut-check in a real playthrough first β€” it may *feel* fine even if the bots solve it.


    4. Bonuses β€” the knowledge axis works

    Bonuses are now a pure knowledge test (no speed): answered by your highest-knowledge fielded card in the category, off its *fatigue-decayed* skill. Difficulty-scaled with a real miss chance:

  • Epic specialist (~88) at Nats DE: 83% (not locked in) / 93% (locked in, +2 stamina).
  • Legendary (~92): 88% / 96%.
  • Weak card (55): 12% / 27% β€” bonuses punish fielding the wrong card.
  • Near-automatic at Regs for anyone rare+.
  • This is a genuinely different sub-game from tossups and it does what you wanted: a slow, brilliant specialist who loses the buzzer race still earns their slot by converting bonuses. Overall bonus conversion across bot games was 87% (bots always have a good card for the category they steered to β€” a human off-category will see the misses). Two scope trims the agent flagged: lock-in is declared at commit ("if I win, lock in") rather than a post-win pause, and there's no moderator-reads-a-bonus + huddle animation yet β€” the timeline's "bonus…" beat plays instead. Both are clean follow-ups if you want the literal version.


    5. Card & tier balance β€” healthy

    Field-presence by tier across the tournament (card-rounds fielded): legendary 15%, epic 14%, rare 23%, uncommon 31%, common 17%. Commons and uncommons are not dead weight β€” they see real play, which is exactly what you want from a 1/1/2/3/3 deck where you can only field 4 at once. No single card ran away with games. Captain field-presence (15%) is healthy too β€” you field your captain most rounds but not every round, because fatigue forces rotation.

    Runaway is moderate: longest single-coach convert streak averaged 3.5 (max 9) per game, and the category-card budget (24/n, spend-till-empty) is doing its job limiting a leader from steering to their strength every round. Not broken, but the streaks are on the high side β€” if games feel snowbally, tightening the category budget is the dial.


    6. Captains β€” balanced power, identical feel (β†’ abilities)

    You nailed this before I even ran it. Power is well-balanced: every captain wins 19-29% when a seat leads with them (fair share 25%), no broken outlier:

  • ne 29%, Kian 27%, sanj 27%, Rohan 26%, arolakiv 26% (top)
  • thedoge 23%, Anurag 22%, yufei 20%, akhil 19% (bottom)
  • That Β±5% spread is *fine* β€” you can't misdraft a captain. But 7 of the 10 are near-identical elite generalists (OVR 80-87, small stat spreads), differing only in *which* categories, not in *how they play*. Only three have a real identity: VulcanForge (phys/math cannon, dead in bio/ess), ne (chem/phys/math spike), akhil (ess/chem, weak math). That's *why* they feel the same β€” most of them are the same archetype reskinned.

    Fix = abilities, not stats (they're already balanced). Here are ten ability sketches, each tied to a captain's real identity, designed to differentiate *play-feel* without touching the tight power band β€” for you to approve/reshape later:

  • VulcanForge (Isaac Zhu) β€” phys/math cannon β†’ "Overclock": once per game, all four fielded cards go Aggressive for free (no stamina). A burst-damage captain.
  • ne β€” chem/phys spike β†’ "Chain Reaction": converting a chem/phys/math tossup refunds a little stamina to the whole field. Rewards staying on his subjects.
  • akhil β€” ess/chem, bonus-shaped β†’ "Study Group": +knowledge on bonuses for the whole team. The bonus captain.
  • Kian β€” bio/chem/math breadth β†’ "Prodigy": ignores the first tier of fatigue decay (stays peak longer before rotation is forced). An endurance captain.
  • Rohan G β€” math/phys, the aggressive-negger archetype β†’ "Gunslinger": Aggressive buzzes neg less for him, but cost more stamina. Leans into the gamble.
  • sanj β€” flat elite generalist, phys-top β†’ "Anchor": decay is capped lower for him; he never fully craters. The reliable-all-game captain.
  • yufei β€” bio/chem β†’ "Specialist's Eye": his best-category card converts bonuses at a bump. Knowledge-leaning.
  • arolakiv β€” bio/math β†’ "Fast Study": benched cards regen faster under him. A rotation-enabler captain.
  • thedoge β€” math/phys β†’ "Buzzer Beater": small speed boost to the whole field on Regs (speed-race) buckets, nothing on Nats. A tempo captain.
  • Anurag S β€” chem/math β†’ "Counterpick": once per round, see and pre-empt one opponent's category steer. A control captain.
  • These map to distinct roles (burst, endurance, bonus, tempo, control, rotation) so drafting a captain would actually change your gameplan.


    7. Bot Elo ladder β€” recalibrated

    The new ladder (/cardgame/ladder) rates you per game vs fixed-Elo bots. The tournament caught that my initial bot Elos were inverted β€” I'd rated smartfield 1500 (it actually wins ~13%) and spike 1000 (it wins ~50%). Fixed: bot Elos now track measured strength (spike/boosteasy/oppaware ~1450-1500, rotation/smartfield ~1020-1050). Side note: smartfield under-performing its "prices every lever" role is itself a bot-tuning flag β€” its heuristic is mis-priced for the new buzz model. Not urgent (it's just an opponent), but it's why the "smart" bot is currently a pushover.


    Prioritized recommendations

    1. Playtest the buzz/rotation feel first β€” the model is fixed on paper; confirm fatigue at ~Q12 and specialists-win *feel* right in your hands before tuning further. (Numbers say yes; your gut is the judge.)

    2. Rein in specialist dominance (#1 flag). Specialists win ~60% vs generalists against good steering. Tighten the category-card budget or make off-category rounds harsher so the "hard to execute" cost actually bites.

    3. Make rotation a real decision (#2 flag). Front-loading + reactive rest currently beats staggering because regen is too generous. Slow regen or steepen early decay so proactive rotation earns its keep.

    4. Decide the bonus follow-ups β€” do you want the literal post-win lock-in pause + the moderator-reads-a-bonus + huddle animation? Both are clean adds.

    5. Approve/reshape the captain abilities β€” pick which of the ten sketches to build; that's what breaks the "they all feel the same."

    6. Re-tune the smartfield bot eventually so the ladder's mid-tier opponent isn't a pushover.

    What's live right now

    Everything above is deployed to nsba.djiang.xyz/cardgame/play (and the ladder at /cardgame/ladder, gallery at /cardgame/all). The buzz overhaul, per-card postures, steep fatigue + regen, forced/unlimited swaps, 0-100 freshness bar, knowledge bonuses, post-round breakdown panel, and Elo recording are all in. 889 backend tests pass. The two known gaps are the bonus lock-in pause and the moderator-bonus animation.