• Per-card 5-copy cap (MAX_COPIES_PER_CARD): base-name counted so “Strike” and “Strike+” share the cap. TryAddCardToDeck helper routes every add site through the gate; reward + shop + event pools filter at-cap cards out.
  • Specialization algorithm now combines deck count + play count per BuildPath via GetPathCommitmentScores. Commitment re-evaluates freshly every query, so picking up more cards of a different archetype (or actively playing them) dynamically flips your spec.
  • Weapon-swap rules: cross-class weapons now REJECTED at equip time (CanEquipGear). Deck is never reset on weapon change. Same-class Mk1 / Mk2 / Mk3 upgrades still apply their rarity bonus.
  • Essential-card flag: upgraded 0-cost powers start in the opening hand, handled by CombatDeck.InitializeFromDeck moving them out of the draw pile into the hand before shuffle.
  • PostCombatHandler respects copy cap + applies pending event-combat bonuses on victory (bonus gold / forced rare gear / card upgrade).

Commit 40f0065 by astafford8488.