Gatcha Gauntlet
Category: Systems Architecture & Lottery Mechanics
Context: Gatcha Gauntlet features a fully realized virtual scratch-off ticket system. It is heavily systems-driven, simulating probability, grid evaluation, and payout multiplier logic often found in real-world gacha or casino mechanics. The core of this system resides in ScratchEvaluator.cs, the live ScratchRules.asset, and the runtime ScratchArtLibrary.asset.
Ticket Cover
The cover texture referenced by ScratchArtLibrary.asset before the scratch surface reveals the board.
Berries
Frequent pair symbol with lower payouts, useful for keeping the board visibly active.
Gold
Mid-tier symbol that helps the grid feel materially different from pure dud churn.
Sigil
Rare symbol with sharper payout leverage and stronger near-miss value.
Chalice
High-value standard symbol used by the evaluator before full-house logic is applied.
Dud
The dud texture is the dominant symbol in the live rules asset, which is why the rescue logic exists at all.
Ticket Lifecycle
The full loop from generation to outcome follows a strict pipeline. TicketManager orchestrates the state, ScratchEvaluator handles the math, and TicketResolver watches the physical scratch progress to trigger resolution.
The survival payout (baseSurvivalPayout * (1 + growth)^dayIndex) scales with session progression, displayed at ticket creation so the player knows the stakes before scratching. Jackpot growth on losses creates an escalating tension curve — the longer a losing streak runs, the larger the eventual jackpot becomes.
Grid Generation & Anti-Clustering
When a new virtual ticket is generated, ScratchEvaluator.GenerateGrid() creates a 2x4 grid evaluated row-major.
- Weighted Symbol Drops: The live
ScratchRules.assetassigns relative weights of Berries (3), Gold (2), Sigils (1), Chalice (1), and Duds (14). UsingErisRandom.NextInt(backed by the same Kairos entropy pipeline used in Numbers), the evaluator drops these symbols into the 8 spaces. - Anti-Clustering Logic: The live board is dud-heavy by design. With those weights, there is roughly a 7.7% chance of generating a board that is entirely duds. The evaluator intercepts this case and promotes two random positions into non-dud symbols. This is not a pity timer — it is a structural guarantee that every ticket has near-miss psychological tension. The player should always feel like they almost had something.
The Payout Cascade
Once the player clears the ScratchSurface past the 95% reveal threshold, TicketResolver fires and ScratchEvaluator.EvaluatePayout() runs the full cascade. The rules interlock in a specific order:
The cascade is deliberately layered so that small wins (column pairs) are common enough to sustain engagement, while the explosive outcomes (full house, row multipliers stacking with column multipliers) are mathematically rare but structurally possible. The column multiplier cap (2) prevents the economy from breaking when multiple columns hit simultaneously.
Win Damage
Winning is not free. When a ticket resolves as a win, PlayerManager.CalculateWinDamage(payout, jackpot) applies HP damage to the player proportional to the payout size. A Sigil full house that hits the jackpot is the best possible outcome — but it also hits the hardest. This creates a risk-reward tension where the player is simultaneously hoping for and dreading a big win.
Why The Symbols Matter
ScratchArtLibrary.asset maps each ScratchSymbol enum directly to a texture. The evaluator is not acting on abstract enums alone — it is acting on the exact icon language the player reads while scratching. The visual distinction between symbols (warm Berries, metallic Gold, arcane Sigils, ornate Chalice, flat Dud) is part of the near-miss psychology: the player needs to instantly recognize what they have and what they almost had.