thepsychdr.com / Resident Evil / RE7: 21
Resident Evil 7 · Banned Footage Vol. 2
21, decoded
The rules, trump cards and opponents of RE7's card game, read from the game's own data and code instead of pieced together from play. What the files settle, what they don't, and the odds that follow.
- The deck11 cards, one each of 1 to 11. No number appears twice in a round.
- The target21, until a Go-for card moves it to 17, 24 or 27.
- Predicting cardsNot possible: the shuffle uses the game-wide random generator, seeded from the clock.
- Story modeSome opening deals are written into the files. If yours matches one, his hidden card is very likely the one written with it.
- Trump cards49 in the data, with every effect field decoded.
- SurvivalFive fights in a row, or ten in Survival+, against Hoffmans with their own trump pools.
The basics
How a round works
You play against Hoffman. The game's code calls him the Banker.
- One deck of 11. One card of each number from 1 to 11. Every deal the files write out uses four different numbers from that range, and a scripted deal places four cards and shuffles "the remaining 7".
- Two cards each, one hidden. Both of you start with two cards. Every card has a face state, and the game totals a hand both in full and face-up only. His logic takes your face-up total (
OpenPlayerSum) among its inputs and checks which numbers he can't see (BankerCantSeeCard). - Draw or stay. You take turns drawing a card or staying. Closest to the target wins; over it is a bust (the files spell it "Burst"). A drawn round exists too.
- The target is 21 until someone plays Go for 17, Go for 24 or Go for 27, which rewrite it.
- Life and bets. Each side has a life total and a bet. The files call the punishment for a lost round torture, and check whether the next one would finish a side. Bet trumps raise the other side's bet or lower your own.
- Trumps. Both sides hold trump cards and play them onto the table. Some act once; the data marks others to stay on the table until something removes them.
Here's the one habit that wins more rounds than any trump: keep the 1 to 11 strip in your head and cross numbers off as they appear.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
Example: 7 and 8 are yours, 10 is his face-up card, 3 was removed. The seven numbers left are the deck plus his hidden card.
From the files: STATUS.md §1 and §5; fsm_findings.md (CardGameLayoutInit, CardGameCheckCondition fields, CardGameCheckBurst, CardGameCheckPlayerDraw, CardGameSetTorture, IsPlayerNextTortureDead); 21Research.lua (the card Face field, calcSum's face-up flag, player and banker life and bet, the ThinkParam fields); trump_effects_groundtruth.md §1 (GoalTargetNo, TableStayTime).
Story, Survival, Survival+
The modes
Story mode
Three games against the same Hoffman, each with its own stakes:
- Fingers first, then shocks, then the saw (the files' bet types: Finger, Electric, Saw).
- In the finger game Hoffman's settings are draw border 11 with "Chicken" on. The shock and saw games raise his border to 14, turn Chicken off and set his PlayerHand ranges.
- Your trumps come from one small pool all story long. Hoffman's pool changes for the saw game: out go the 4 and 5 Cards and two of his three Two-Ups, in come two Destroys and a Go for 24.
- Fixed hand-outs are written in too, such as a 6 Card for you as the shock game opens.
- Some opening deals are scripted. See Scripted deals.
Survival
- Five fights in a row. The files count kills from 0 to 4 and finish at 5.
- Opponents: Attacker, Defence, Tricky and Molded, each with its own trump pool and settings, plus a weak Attacker (own pool and settings) and a strong Defence (own pool). The first fight's setup binds the story Hoffman's pool.
- Hoffman starts Survival fights with trumps already in hand, from opening sets fixed in the files. Your opening hand comes from six hand-out slots with no fixed type.
- Your trumps come from a 40-slot pool, three-tenths of it Two-Up.
Survival+
- Ten fights. The Survival scene counts kills from 0 to 9 for it and finishes at 10.
- Sharper opponents: Attacker, Defence and Tricky return with border 14 and their PlayerHand ranges set, and a last boss opens with Perfect Draw+, Dead Silence, Ultimate Draw and Oblivion.
- The special guest: a rare Hoffman whose trump pool is a single Escape. The files roll for him in Survival+: a 10% lottery in its opponent switcher, and a 20% roll in the Survival scene from six kills on, tied to a rare-encounter flag. Beating him once earns a reward; beating him twice unlocks Replace.
From the files: fsm_findings.md: ChangeMaster (GameBetType per game), SetItemTable (pool per game and mode), Banker (settings), AddItem (fsm_200_introevent, fsm_spcardfirstset, fsm_plspcardfirstset), KillCount checks in levelfsm_c07_2_survivalmode.scn.20 (0–4 then 5, 0–9 then 10), fsm_changehoffmans_survival(_p) and fsm_cardgamemaster_suvival, CardGameRareEm9800Lottery (Percent 10; Percent 20 after KillCount ≥ 6); STATUS.md §3; trump_effects_groundtruth.md §2–3.
All 49
Every trump card
The DLC defines exactly one entry for each of its 49 trumps, and every effect below comes from that entry's own fields. Read each one from the side of whoever plays it: "opponent" is the other side, "your" is the card's player. BetUp is read as the other side's bet because its pair, MyBetDown, names the player's own. Where the data carries only a tag (the SP_ effects, Happiness, Gift), the real math lives in the game's code and isn't logged yet.
Trump catalog, grouped by what the card works on
| Card | Data name | What the data says it does | Who gets it |
|---|---|---|---|
| Bets | |||
| One-Up | BetUp_1p #10 | Opponent's bet +1. Stays on the table | Hoffman |
| Two-Up | BetUp_2 #11 | Opponent's bet +2. Stays on the table | You + Hoffman |
| Two-Up | BetUp_2p #12 | Opponent's bet +2. Stays on the table | You + Hoffman |
| Two-Up+ | BetUp_2x #13 | Opponent's bet +2; takes a card out of play (RemoveType Remove: dead, not back in the deck). Stays on the table | You + Hoffman |
| Shield | BetDown_1 #15 | Your own bet −1. Stays on the table | You + Hoffman |
| Shield+ | BetDown_2 #16 | Your own bet −2. Stays on the table | You |
| Twenty-One Up | BetUp_21 #20 | A special bet change (SP_BetUp_21); its size is set in code, not data. Stays on the table | Hoffman |
| Shield Assault | ShieldAssault #61 | Opponent's bet +3; its removal field targets 3 bet-down (Shield-type) trumps on the table. Stays on the table | Hoffman |
| Shield Assault+ | ShieldAssault_p #62 | Opponent's bet +5; its removal field targets 2 bet-down (Shield-type) trumps on the table. Stays on the table | Hoffman |
| Desperation | Desperation #60 | A special bet change (SP_Desperation); its size is set in code, not data; blocks drawing cards while it stays (IsBlockPlayerTakeCard). Stays on the table | Hoffman |
| Desire | Desire #66 | A special bet change (SP_Desire); its size is set in code, not data. Stays on the table | Hoffman |
| Desire+ | Desire_p #67 | A special bet change (SP_Desire_p); its size is set in code, not data. Stays on the table | Hoffman |
| Conjure | Conjuring #71 | A special bet change (SP_Conjuring); its size is set in code, not data. Stays on the table | Hoffman |
| Draws | |||
| 2 Card | Draw_2 #30 | Draws the 2, if the 2 is still in the deck. | You |
| 3 Card | Draw_3 #31 | Draws the 3, if the 3 is still in the deck. | You |
| 4 Card | Draw_4 #32 | Draws the 4, if the 4 is still in the deck. | You + Hoffman |
| 5 Card | Draw_5 #33 | Draws the 5, if the 5 is still in the deck. | You + Hoffman |
| 6 Card | Draw_6 #34 | Draws the 6, if the 6 is still in the deck. | You |
| 7 Card | Draw_7 #35 | Draws the 7, if the 7 is still in the deck. | You |
| 2 Card | Draw_2p #36 | Draws the 2, if the 2 is still in the deck. | Hoffman |
| 3 Card | Draw_3p #37 | Draws the 3, if the 3 is still in the deck. | Hoffman |
| 4 Card | Draw_4p #38 | Draws the 4, if the 4 is still in the deck. | Hoffman |
| 5 Card | Draw_5p #39 | Draws the 5, if the 5 is still in the deck. | Hoffman |
| 6 Card | Draw_6p #40 | Draws the 6, if the 6 is still in the deck. | Hoffman |
| 7 Card | Draw_7p #41 | Draws the 7, if the 7 is still in the deck. | Not handed out |
| Perfect Draw | PerfectDraw #45 | A best-card draw (SP_PerfectDraw); the game picks the card in code. | You + Hoffman |
| Ultimate Draw | PerfectDraw_x #46 | A best-card draw (SP_PerfectDraw); the game picks the card in code. | You + Hoffman |
| Perfect Draw+ | PerfectDraw_p #47 | Opponent's bet +5; a best-card draw (SP_PerfectDraw); the game picks the card in code. Stays on the table | You + Hoffman |
| Gift | Gift #50 | A special draw (SP_Gift); the game picks the card in code. | You |
| Curse | Curse #73 | A cursed draw (SP_Curse); the game picks the card in code; costs 1 of the user's own held trump. | Hoffman |
| Black Magic | BlackMagic #72 | Opponent's bet +10; a best-card draw (SP_PerfectDraw); the game picks the card in code; the user discards half of their own held trumps. Stays on the table | Hoffman |
| Cards in play | |||
| Exchange | Exchange #53 | Swaps cards between the two hands (IsCardExchange); which cards is set in code. | You |
| Return | Return #54 | Puts a card back into the deck (RemoveType Return). | You + Hoffman |
| Remove | Remove #55 | Takes a card out of play (RemoveType Remove: dead, not back in the deck). | You + Hoffman |
| Target | |||
| Go for 24 | Goal_24 #80 | The target becomes 24; any other Go-for card on the table is cleared. Stays on the table | You + Hoffman |
| Go for 27 | Goal_27 #81 | The target becomes 27; any other Go-for card on the table is cleared. Stays on the table | You |
| Go for 17 | Goal_17 #82 | The target becomes 17; any other Go-for card on the table is cleared. Stays on the table | Hoffman |
| Table trumps | |||
| Destroy | Destroy #56 | Removes the last trump on the table. | You + Hoffman |
| Destroy+ | Destroy_p #57 | Removes every trump on the table. | You + Hoffman |
| Destroy++ | Destroy_pp #58 | Removes every trump on the table; stops trumps being played while it stays (IsBlockUseItem). Stays on the table | You |
| Trumps in hand | |||
| Trump Switch | SPChange #51 | Costs 2 of the user's own held trumps. | You |
| Trump Switch+ | SPChange_p #52 | Costs 1 of the user's own held trump. | You + Hoffman |
| Mind Shift | MindShift #64 | Hits half of the other side's held trumps; cleared once they play 2 trumps. Stays on the table | Hoffman |
| Mind Shift+ | MindShift_p #65 | Hits all of the other side's held trumps; cleared once they play 3 trumps. Stays on the table | Hoffman |
| Special | |||
| Happiness | Happiness #63 | No effect values in the data at all; the effect lives in code. | Hoffman |
| Replace | Replace #59 | Sets IsItemReplace while it stays; the effect is in code. Stays on the table | You |
| Dead Silence | DeadSilence #69 | Blocks drawing cards while it stays (IsBlockPlayerTakeCard). Stays on the table | Hoffman |
| Escape | Escape #68 | Sets IsEscape while it stays; the effect is in code. Stays on the table | Hoffman |
| Oblivion | Oblivion #70 | Forces the round to end (IsForceRoundEnd). Stays on the table | Hoffman |
"Stays on the table" marks the trumps whose data says they persist (a table time of −1; the one-shot cards have 0.5). Card names follow the names my helper uses; the names in italics have no confirmed on-screen name yet, so they show the data name. Two-Up appears twice (BetUp_2 in story mode's pools, BetUp_2p in Survival's) and so do the number cards (Draw_N and Draw_Np): same data, separate entries. "Who gets it" counts a trump pool, a hand-out written into the files, an unlock, or a scripted story play (Hoffman's Desperation and Perfect Draw).
What the data settles
- Remove kills a card. Its removal type is Remove, not Return, and the game flags removed cards (
isRemoved): the card is out of play, not back in the deck. Return is the one that puts a card back. Which card each picks isn't in the data; the helper's card text says the last face-up card, the opponent's for Remove and yours for Return. - Two-Up+ kills a card too: +2 to the opponent's bet, plus the same Remove-type removal.
- Ultimate Draw's data is identical to Perfect Draw's. If it does anything extra, that's in the code, not the data.
- The price tags: Trump Switch costs 2 of your held trumps (Trump Switch+ costs 1), Curse costs its player 1, Black Magic costs half.
- Shield Assault pairs a bet raise with a Shield clear: +3 to the opponent's bet, and its removal field targets 3 bet-down trumps on the table (Shield Assault+: +5, and 2).
- Mind Shift wears off: it's cleared once its target plays 2 trumps (Mind Shift+: 3).
From the files: trump_effects_groundtruth.md §1 (all 21 fields of cardgameitemtypedata.user.2, byte-exact) and §2–3 (pools, unlocks); STATUS.md §2; fsm_findings.md AddItem and ItemTable; 21Research.lua (each card's isRemoved flag). Cross-checked field by field by tools/odds_21.py --verify-research.
Story mode
The scripted opening deals
The shuffle takes four card numbers. When all four are set, it places your two cards and Hoffman's two first and shuffles only the other seven. The finger game's card setup writes four of these deals (one of them twice) and leaves two entries random. The story scene's own list repeats two of those and adds four more, without naming a game.
He shows one of his two cards and the other is under it; nothing in the files says which of the two is face-up, so read each row both ways. If your opening hand and his face-up card match a row, you know his hidden card and exactly which seven are left in the deck. A random deal matches one row's visible cards about once in 250 deals (2 in 495), so a match is far more likely the written deal than chance.
Authored story deals, from your seat: odds of your next card from the 7 left
| You hold | His two cards | Totals | Left in the deck | Next card busts | Makes 21 | Beats his total |
|---|---|---|---|---|---|---|
| 111 | 68 | 12 vs 14 | 23457910 | 1/7 | 1/7 | 5/7 |
| 211 | 78 | 13 vs 15 | 13456910 | 2/7 | 0/7 | 4/7 |
| 56 | 311 | 11 vs 14 | 12478910 | 0/7 | 1/7 | 5/7 |
| 56 | 411 | 11 vs 15 | 12378910 | 0/7 | 1/7 | 4/7 |
| 710 | 511 | 17 vs 16 | 1234689 | 3/7 | 1/7 | 4/7 |
| 89 | 610 | 17 vs 16 | 12345711 | 3/7 | 1/7 | 4/7 |
| 810 | 79 | 18 vs 16 | 12345611 | 4/7 | 1/7 | 3/7 |
| 910 | 711 | 19 vs 18 | 1234568 | 5/7 | 1/7 | 2/7 |
- Holding 5 and 6: if he shows the 11, two written deals fit, with the 3 or the 4 under it; if he shows the 3 or the 4, the 11 is under it. Nothing left in the deck can bust you either way.
- Holding 1 and 11 or 2 and 11, you're behind, and four or five of the seven cards left put you past him without a bust.
- Holding 17 or more (7 and 10, 8 and 9, 8 and 10, 9 and 10), you're already ahead of his two cards, and a draw busts you on 3 to 5 of the 7.
Which round gets which deal isn't in the static data: the files list the deals, and one logged session in the game will pin the order. The story scene also writes one more deal, 1 and 2 for you against 4 and 11, beside Hoffman's scripted Desperation and Perfect Draw.
From the files: STATUS.md §1 (shuffle with four pre-placed cards, 7 shuffled); fsm_findings.md LayoutInit: mainflow\100_cardinitset.fsm.16 and levelfsm_c07_2_storymode.scn.20; odds computed by tools/odds_21.py.
The shuffle
Why nobody can predict your next card
- The shuffle (
app.CardGameMaster.shuffle) draws its numbers from the engine's one global random generator, an xorshift128-family design. - That generator is seeded once, when the game starts, from the wall clock in seconds (
_time64). - The same stream feeds 1,684 places across the whole game: enemy AI, particles, item drops, IDs. By the time you're dealt in, it has moved on by however many numbers everything else took first.
So even knowing the exact second you launched the game wouldn't give you the next card. Per-card prediction needs live reads of the game's memory, on any platform. What does work is counting, which is the rest of this page. The one exception is by design: the scripted story deals above are fixed by the files, not by the generator.
From the files: STATUS.md §1; disasm/app.CardGameMaster.shuffle.v4.asm.txt, disasm/rng_helper_140051ee0.asm.txt, disasm/global_rng_seeder.asm.txt (the shuffle → helper → global state → time seeder chain, byte-verified).
Counting
Odds you can use
Count what you can't see
- Start from 1 to 11.
- Cross off both of your cards, every face-up card of his, and any card Remove took out of play.
- What's left is the deck plus his hidden card. Treat each of those as equally likely to be your next card: the deck order comes from the random generator, and nothing you can see tells them apart.
- Count the ones that would bust you (bigger than the target minus your total) and divide by how many are left.
Example. You hold 7 and 8 (15) and he shows 10. You can't see 1, 2, 3, 4, 5, 6, 9 and 11: eight cards. Anything over 6 busts you, so 9 and 11 do: 2 in 8, 25%. Exactly 21 needs the 6: 1 in 8.
His choices can hint at his hidden card. Staying on a low face-up card, for example, says something. The count above doesn't use that, so treat it as your floor of knowledge. It also treats the shuffle as fair: the files show where its randomness comes from, not a logged draw order.
Your opening total
There are 55 possible two-card hands. A natural 21 (10 and 11) is 1 in 55.
| Opening total | Hands (of 55) | Chance | Bar |
|---|---|---|---|
| 3 | 1 | 1.8% | |
| 4 | 1 | 1.8% | |
| 5 | 2 | 3.6% | |
| 6 | 2 | 3.6% | |
| 7 | 3 | 5.5% | |
| 8 | 3 | 5.5% | |
| 9 | 4 | 7.3% | |
| 10 | 4 | 7.3% | |
| 11 | 5 | 9.1% | |
| 12 | 5 | 9.1% | |
| 13 | 5 | 9.1% | |
| 14 | 4 | 7.3% | |
| 15 | 4 | 7.3% | |
| 16 | 3 | 5.5% | |
| 17 | 3 | 5.5% | |
| 18 | 2 | 3.6% | |
| 19 | 2 | 3.6% | |
| 20 | 1 | 1.8% | |
| 21 | 1 | 1.8% |
One more card, by total
At 10 or less no single card can bust you, so the table starts there. The chances average every opening hand with that total, before you've seen his card. Once you can see it, count exactly as above. The bust list always shrinks by whatever's already visible.
| Your total | Exactly 21 needs | Cards that bust you | Bust chance | Exactly-21 chance |
|---|---|---|---|---|
| 10 | 11 | none | 0% | 11.1% |
| 11 | 10 | 11 | 11.1% | 8.9% |
| 12 | 9 | 1011 | 17.8% | 8.9% |
| 13 | 8 | 91011 | 26.7% | 8.9% |
| 14 | 7 | 891011 | 33.3% | 11.1% |
| 15 | 6 | 7891011 | 41.7% | 8.3% |
| 16 | 5 | 67891011 | 48.1% | 7.4% |
| 17 | 4 | 567891011 | 55.6% | 11.1% |
| 18 | 3 | 4567891011 | 66.7% | 11.1% |
| 19 | 2 | 34567891011 | 77.8% | 11.1% |
| 20 | 1 | 234567891011 | 88.9% | 11.1% |
| 21 | — | 1234567891011 | 100% | 0% |
Number cards: will it land?
A number card (2 Card to 7 Card) draws that exact number, so it only works while the number is in the deck. If you can't see the number, it's in the deck unless it's his hidden card, and his hidden card is equally likely to be any card you can't see.
| Cards you can’t see | Number card lands |
|---|---|
| 8 | 7/8 = 87.5% |
| 7 | 6/7 = 85.7% |
| 6 | 5/6 = 83.3% |
| 5 | 4/5 = 80% |
| 4 | 3/4 = 75% |
| 3 | 2/3 = 66.7% |
| 2 | 1/2 = 50% |
If the number is anywhere you can see it, the card can't land. The same holds against you: if Hoffman reaches for a number that's your face-down card, it can't come from the deck.
What a trump draw can be
Each pool is a plain list of slots with no weights in the data, so a share is the chance one draw lands on that card if every slot is equally likely. Starting hands and scripted hand-outs are on top of these.
| Who draws | Pool in the files | Slots | What a draw can be (share of slots) |
|---|---|---|---|
| You, story mode | PlayerTestTable | 9 | Two-Up ×2 (22%), Remove ×2 (22%), Return ×2 (22%), 3 Card ×1 (11%), 4 Card ×1 (11%), 5 Card ×1 (11%) |
| You, Survival and Survival+ | Survival_PL_Table | 40 | Two-Up ×12 (30%), Destroy ×4 (10%), Remove ×4 (10%), Return ×4 (10%), Shield ×3 (8%), Trump Switch ×3 (8%), 5 Card ×2 (5%), 6 Card ×2 (5%), Perfect Draw ×2 (5%), 2 Card ×1 (2%), 3 Card ×1 (2%), 4 Card ×1 (2%), 7 Card ×1 (2%) |
| Hoffman, story: finger and shock games, and the first Survival fight | BankerTestTable | 8 | Two-Up ×3 (38%), 4 Card ×2 (25%), Remove ×2 (25%), 5 Card ×1 (12%) |
| Hoffman, story: saw game | BankerTable_StorySaw | 6 | Destroy ×2 (33%), Remove ×2 (33%), Two-Up ×1 (17%), Go for 24 ×1 (17%) |
| Attacker | Survival_1_AttackerItemTable | 6 | One-Up ×3 (50%), 2 Card ×1 (17%), 4 Card ×1 (17%), 6 Card ×1 (17%) |
| Attacker, weak variant | Survival_11_AttackerWeekItemTable | 6 | Twenty-One Up ×2 (33%), One-Up ×1 (17%), Two-Up ×1 (17%), 4 Card ×1 (17%), 6 Card ×1 (17%) |
| Defence | Survival_2_DefenceItemTable | 7 | Shield ×7 (100%) |
| Defence, strong variant | Survival_21 | 8 | Shield ×6 (75%), One-Up ×2 (25%) |
| Tricky | Survival_3_TrickyItemTable | 9 | Happiness ×3 (33%), Mind Shift ×3 (33%), Desire ×2 (22%), Return ×1 (11%) |
| Molded | Survival_4_MoldedItemTable | 12 | Curse ×3 (25%), Two-Up ×2 (17%), Black Magic ×2 (17%), Conjure ×2 (17%), Go for 17 ×2 (17%), Destroy+ ×1 (8%) |
| Survival+ Attacker | 5_Attacker_p | 9 | Two-Up ×4 (44%), Twenty-One Up ×1 (11%), 2 Card ×1 (11%), 3 Card ×1 (11%), 4 Card ×1 (11%), 5 Card ×1 (11%) |
| Survival+ Defence | 6_Defence_p | 10 | Shield ×6 (60%), Two-Up ×2 (20%), Trump Switch+ ×1 (10%), Shield Assault+ ×1 (10%) |
| Survival+ Tricky | 7_Tricky_p | 11 | Happiness ×4 (36%), Mind Shift+ ×4 (36%), Desire+ ×2 (18%), Go for 24 ×1 (9%) |
| Survival+ last boss | 8_LassBoss | 9 | Two-Up+ ×3 (33%), Ultimate Draw ×3 (33%), Dead Silence ×2 (22%), Perfect Draw+ ×1 (11%) |
| Special guest (rare) | 9_Rare | 1 | Escape ×1 (100%) |
From the files: the deck and deal rules above; trump_effects_groundtruth.md §1–2 (DrawNo, pool entries with no weight field); fsm_findings.md ItemTable. Every number in this section comes out of tools/odds_21.py, which ships with this page's source.
The opponent
How Hoffman plays
His settings
Every Hoffman carries the same seven settings, and every one of them has a good-hand border of 18. By their names, TakeCardBorder is a draw threshold, Chicken a cautious switch, and the two PlayerHand ranges judge your face-up total. The formula that turns them into "draw" or "stay" is the one part of his logic not logged yet, so read them as each opponent's profile rather than a rule.
| Opponent | TakeCardBorder | Chicken | PlayerHandGood | PlayerHandBad |
|---|---|---|---|---|
| Story: finger game | 11 | yes | off | off |
| Story: shock and saw games | 14 | no | 9–13 | 5–18 |
| Attacker | 11 | no | off | off |
| Attacker, weak variant | 17 | yes | off | off |
| Defence | 12 | yes | off | off |
| Tricky | 11 | no | off | off |
| Molded | 11 | no | off | off |
| Survival+ Attacker, Tricky, last boss, special guest | 14 | no | 9–13 | 5–18 |
| Survival+ Defence | 14 | yes | 9–13 | 5–18 |
What he can see
His bust-risk number is worked out from the real remaining deck, the same as if he'd peeked at your face-down card. Whether it changes his play is still being decoded.
Rules written into his files
These are the conditions written next to each card in his files. The pairing comes from the files' structure, not from watching him play, but the numbers line up card for card.
- Survival Hoffmans with number cardsHe plays a number card N only when his total is 21 − N or less and N is a number he can't see: 15 or less for a 6, 16 or less for a 5, 17 or less for a 4, 18 or less for a 3, 19 or less for a 2. A 4 Card from him means his total was 17 or less.
- Story HoffmanHis number cards have tighter windows: the 5 Card at 13 to 16 (one file says 14 to 16) and the 4 Card at 14 to 16, each only when he can't see that number. He answers your bet-raising trumps with Two-Up, plays Remove when you stop drawing, plays Destroy once you have a trump on the table and have raised his bet, and plays Go for 24 at 22 to 24.
- SurvivalAt 22 to 24, with no Go for 24 on the table, he plays Go for 24 to save the bust.
- DefenceHe plays Shields when you've raised his bet, while 3 or fewer are down (2 or fewer once his life is 3 or less), and when the next punishment would finish him (2 or fewer down). At life 3 or less, with a total of 11 to 17 and no Go for 17 down, he plays Go for 17.
- Survival+ AttackerHe keeps adding Two-Ups while his total isn't 21 and 2 or fewer are down (3 or fewer once his life is 6 or less).
- Also in the filesThese checks sit near these cards too, with looser pairing: Tricky's Desire at 19 to 21; Molded's Curse after you draw a 5 or more, or an 8 or more; Survival+ Tricky's Return after his own last card is 8 or more. Nearly every Hoffman checks for 5 or more trumps on his side of the table, and your inventory file checks for 5 on yours, which suggests a table limit of 5.
From the files: fsm_findings.md: Banker (app.CardGameBanker per opponent), levelfsm_c07_2_common.scn.20 (the story Hoffman's rules, indices 1138–1366), item\fsm_bkitemusecheck.fsm.16, survival\hoffmans\1_attacker to 9_rare.fsm.16, levelfsm_c07_2_survivalmode.scn.20 (the Survival Go for 24 condition), item\fsm_useinventory.fsm.16; STATUS.md §3; banker_formula.md (updateBankerThinkParam: his bust-risk ratio, NextCardGoodRatio, counts the real deck; checked against the 2026-06-09 live log).
Rewards
Unlocks
The reward list ties these goals to rewards, in this order. Counts are as the files store them. Four goals, BurstWin and the three Survival-clear goals, use counters whose meaning isn't decoded, so they show the files' own names.
Reward list
| Goal | Reward |
|---|---|
| 5 wins in total | Unlocks Go for 24 |
| 15 wins in total | Unlocks Two-Up+ |
| 2 perfect wins in a row | Unlocks Shield+ |
| 3 21s in total | AddDrawNum reward (its text names Exchange) |
| 3 21s in a row | Unlocks Go for 27 |
| 10 trumps played in total | Unlocks Exchange |
| 15 trumps played in one round | Unlocks Trump Switch+ |
| 10 removes in total | Unlocks Destroy+ |
| 20 removes in total | Unlocks Destroy++ |
BurstWin, counter 30 | AddDrawNum reward (its text names Destroy++) |
ClearSurvival1, counter 10 | Unlocks Perfect Draw+ |
PerfectClearSurvival1, counter 50 | Unlocks Ultimate Draw |
PerfectClearSurvival2, counter 4 | Everywhere reward (its text names Ultimate Draw) |
| 1 wins against the special guest | AddDrawNum reward (its text names One-Up) |
| 2 wins against the special guest | Unlocks Replace |
From the files: trump_effects_groundtruth.md §3 (prefab\reward\dlc\cp7cardgamereward.user.2: 15 rewards, AchieveType, Count, RewardType, the trump each reward names).
Honest gaps
Still open
Everything above comes from the static files. These need the game running, with a logger watching:
- Hoffman's exact draw-or-stay formula. The settings are known; the code that reads them isn't logged yet.
- Which story round gets which written deal, and which of his two cards is the face-up one.
- Whether his bust-risk number, worked out from the real deck, changes his play, and whether anything else he uses reads your face-down card.
- The effects that live in code: Happiness, Gift, Desire, Conjure, Desperation, Twenty-One Up, Escape and Replace, and anything extra Ultimate Draw does.
- Whether "stays on the table" is exactly what a table time of −1 means. It fits every card, but it's inferred.
- Which rare-guest roll, 10% or 20%, applies where, and the story 5 Card's exact window (13 or 14 to 16).
Until they're logged, this page doesn't guess.
The helper. My open-source helper for 21 is on GitHub, built for playing alongside the game.
Source: Resident Evil 7 Banned Footage Vol. 2, PC (Steam DLC 530610): the DLC's data, scene and state-machine files and the game's executable code, decoded by ThePsych (research notes dated 2026-06-09). Tables are derived from that decode by tools/odds_21.py; no game files or art are reproduced. Unofficial fan page, not affiliated with or endorsed by Capcom.