Status: Designed
Author: Nathan + Claude
Last Updated: 2026-03-29
Implements Pillar: Meaningful Choices, Emergent Combos
Overview
The Manipulation System gives players active tools to modify dice during the roll phase of combat. It has two layers: innate abilities (permanent, mana-gated, used every turn) and consumables (single-use items, free to play, found as loot). Relics remain passive. This system is the primary source of player agency beyond hold/reroll — without it, turns reduce to "reroll and hope." With it, players craft hands deliberately.
Player Fantasy
"I'm not just rolling dice — I'm cheating fate." The player should feel like a cunning gambler who always has a trick up their sleeve. Innate abilities provide a steady baseline of control ("I can always nudge a die"), while consumables are dramatic moments of power ("I've been saving this Clone for the boss — watch this five-of-a-kind"). The tension of when to spend a rare consumable mirrors Balatro's Tarot card decisions.
Detailed Design
Core Rules
Layer 1: Innate Abilities
Each run starts with 2 innate ability slots, populated by the character's starting kit.
Default starting kit (Adventurer):
Nudge (1 mana): Select a die, change its value by +1 or -1. Cannot go below 1 or above the die's max face value. Can be used multiple times per turn if mana allows.
Reroll+ (1 mana): Gain +2 rerolls this turn. Stacks with base rerolls and relic bonuses. Can be used multiple times per turn.
Innate abilities can only be used during the roll phase (before scoring).
Using an innate ability does NOT consume a reroll.
Mana resets to max_mana at the start of each turn.
Base max_mana = 3. Modified by relics (Mana Crystal: +1).
Future character classes replace the default innates (architecture supports this, not implemented now).
Layer 2: Consumables
Players carry up to 5 consumables at a time. Attempting to gain a 6th requires discarding one first.
Consumables are free to use — no mana cost.
Consumables are single-use — removed from inventory after playing.
Consumables can only be used during the roll phase (before scoring).
Sources: combat rewards, shop purchases, rest site events (rare).
Consumable pool (8 types):
ID
Name
Rarity
Target
Effect
set_die
Set Die
Uncommon
1 die
Set the die to any face value (1 through max faces)
clone
Clone
Uncommon
2 dice
Copy source die's value onto target die
flip
Flip
Common
1 die
Flip to opposite face: 1↔6, 2↔5, 3↔4 (for d6). Formula: max_face + 1 - current
add_die
Add Die
Rare
none
Roll one extra temporary d6. Removed after scoring this turn.
lock
Lock
Common
1 die
Lock the die — keeps its value into the next turn (survives roll_all). Unlock after that turn.
transmute
Transmute
Uncommon
1 die
Upgrade die from d6→d8 for this turn only. Re-rolls it with new range. Reverts after scoring.
salvage
Salvage
Uncommon
none
If current hand is HIGH_DIE, score as sum_of_all_dice × 2 instead. No effect on better hands.
shatter
Shatter
Rare
1 die
Destroy a die to deal value × 10 direct damage to target enemy. Die is removed for rest of combat, restored after.
Targeting Flow (UX)
Player clicks a consumable slot or innate ability button.
If the ability needs a target die: UI enters targeting mode.
Dice glow/pulse to indicate they're selectable.
Phase label shows "Select a die…" (or "Select source die…" / "Select target die…" for Clone).
Clicking a die applies the effect.
Right-click or pressing Escape cancels targeting mode.
If the ability needs a second target (Clone): after selecting source, prompt for target die.
If the ability needs a value choice (Set Die): after selecting die, show value picker (1 through max faces).
If the ability needs no target (Add Die, Salvage, Reroll+): effect applies immediately on click.
Innate: Nudge shows ±1 buttons on the selected die (or up/down arrows).
States and Transitions
State
Description
Valid Actions
IDLE
Normal roll phase, no ability selected
Click die (hold/unhold), Reroll, Score, click ability/consumable
TARGETING_DIE
Ability selected, waiting for die pick
Click die (applies effect), right-click/Esc (cancel)
TARGETING_SECOND
Clone selected source, waiting for target
Click different die (applies clone), right-click/Esc (cancel)
CHOOSING_VALUE
Set Die targeting done, choosing value
Click value button (1-N), right-click/Esc (cancel)
NUDGE_DIRECTION
Nudge selected a die, choosing ±1
Click +1 or -1, right-click/Esc (cancel)
Transitions:
IDLE → TARGETING_DIE: click consumable/innate that needs a die target
IDLE → (effect applied): click consumable/innate with no target needed
TARGETING_DIE → CHOOSING_VALUE: die selected for Set Die
TARGETING_DIE → NUDGE_DIRECTION: die selected for Nudge
TARGETING_DIE → TARGETING_SECOND: source die selected for Clone
TARGETING_SECOND → IDLE: target die selected, clone applied
CHOOSING_VALUE → IDLE: value picked, Set Die applied
NUDGE_DIRECTION → IDLE: direction picked, Nudge applied
Any targeting state → IDLE: cancel (right-click/Esc)
Interactions with Other Systems
System
Direction
Interface
DicePool
Outbound
Manipulation calls set_die_value(), add_die(), remove_die(), lock_die() + new flip_die(), nudge_die()
DiceCombatManager
Bidirectional
Owns mana state, routes ability/consumable use, resets mana per turn
HandScorer
Downstream
Scores dice after all manipulations applied. No changes needed.
SoloGameManager
Upstream
Tracks consumable inventory between combats, adds consumables to reward options
RelicDatabase
Read
Mana Crystal relic increases max_mana. Future relics may modify consumable effects.
UI (dice_combat_screen)
Outbound
Emits signals for mana changes, consumable use, targeting state. UI subscribes.
direct_damage = die_value × SHATTER_MULTIPLIER
# SHATTER_MULTIPLIER = 10
# Die is removed from pool for remainder of combat
# Pool restored to pre-combat state after combat ends
Salvage
if hand_type == HIGH_DIE:
score = sum(all_dice_values) × SALVAGE_MULTIPLIER
# SALVAGE_MULTIPLIER = 2
else:
no effect (consumable still consumed)
Reward Rates
# After combat, reward options (pick 1 of 3):
# - Relic (weight 3)
# - Consumable (weight 4)
# - Gold (weight 3)
# Consumables appear more frequently since they're single-use
# Shop prices:
# Common consumable: 15 gold
# Uncommon consumable: 30 gold
# Rare consumable: 50 gold
Edge Cases
Scenario
Resolution
Nudge at boundary (die = 1, nudge -1)
Disable the -1 button. Only +1 is available. Same for max face.
Flip a non-standard die (d8, crystal)
Formula max + 1 - value works for any die. Crystal die [2,2,4,4,6,6]: flip 2→5, but 5 isn't a face. Resolution: Flip uses the die's actual value, not face list. Result may be a value not on the face list — that's fine, the value is what matters for scoring.
Clone onto a locked die
Allowed. Clone overwrites the current value. Lock preserves the new value into next turn.
Set Die on a d8
Value picker shows 1-8 (die's max faces).
Add Die when pool already at max
No hard max on dice count. The temporary die is added and removed after scoring.
Shatter last die
Prevented — cannot Shatter if only 1 die remains in pool.
Shatter a temporary die (from Add Die)
Allowed. Deals damage, temp die is removed. No lasting pool loss.
Salvage with hand better than HIGH_DIE
Consumable is consumed but no effect. Player is warned in targeting mode: "Only works on High Die hands."
Use consumable when inventory full + reward
Before adding, show discard picker: "Inventory full. Discard one to make room?"
Mana at 0, try to use innate
Button disabled. Greyed out with "Not enough mana" tooltip.
Transmute — what happens to held status?
Transmuted die is unheld and re-rolled with new range.
Lock + next turn roll_all
roll_all() already skips locked dice. Lock consumable sets locked = true, which persists one turn, then auto-unlocks at the start of the following turn.
Cancel during targeting
Return to IDLE, no effect applied, consumable/mana not spent.
Dependencies
System
Direction
Hard/Soft
Interface
DicePool
Hard
Manipulation cannot function without dice to modify
DiceCombatManager
Hard
Owns combat flow, mana state, and turn lifecycle
HandScorer
Soft
Scoring happens after manipulation; scorer doesn't know about manipulation
SoloGameManager
Hard
Owns consumable inventory persistence between combats
RelicDatabase
Soft
Mana Crystal relic boosts max_mana; future relics may interact
StatusEffectSystem
Soft
Future: status effects could disable abilities (e.g., "Silenced" prevents innates)
EnemyDatabase
None
Enemies don't interact with manipulation directly
Tuning Knobs
Knob
Default
Safe Range
Breaks If
BASE_MANA
3
2–5
<2: innates unusable most turns. >5: too much control, dice rolls irrelevant
MAX_CONSUMABLE_SLOTS
5
3–7
<3: too scarce, feels bad. >7: hoarding, choice paralysis
NUDGE_MANA_COST
1
1–2
0: free manipulation breaks difficulty. >2: never used
REROLL_PLUS_MANA_COST
1
1–2
Same as Nudge
REROLL_PLUS_AMOUNT
2
1–3
>3: infinite rerolls with mana, trivializes rolling
SHATTER_MULTIPLIER
10
5–15
<5: not worth losing a die. >15: always shatter high dice
SALVAGE_MULTIPLIER
2
1.5–3.0
<1.5: worse than just scoring normally. >3: intentionally aim for bad hands
CONSUMABLE_REWARD_WEIGHT
4
2–6
<2: too rare, system feels absent. >6: floods inventory
SHOP_PRICE_COMMON
15
10–25
<10: trivial to buy. >25: never bought
SHOP_PRICE_UNCOMMON
30
20–45
Same scaling
SHOP_PRICE_RARE
50
35–75
Same scaling
Acceptance Criteria
Mana display: Mana shows in combat UI, decrements on innate use, resets each turn.
Nudge works: Clicking Nudge → die → ±1 changes die value. Mana deducted. Boundary clamped.
Reroll+ works: Clicking Reroll+ adds 2 to reroll counter. Mana deducted.
All 8 consumables function: Each consumable applies its effect correctly per the rules table.
Targeting flow: Click consumable → targeting mode → click die → effect. Esc cancels. No mana/consumable spent on cancel.
Consumable persistence: Consumables carry between combats via SoloGameManager.
Consumable rewards: Consumables appear as reward options after combat.
Inventory limit: Cannot exceed 5 consumables. Prompted to discard when full.
Shatter guard: Cannot shatter last remaining die.
Lock persistence: Locked die survives into next turn, then auto-unlocks.
Temporary die cleanup: Add Die's extra die is removed after scoring.
Hand preview updates: Dice preview (hand name + score) updates live after any manipulation.
Scoring unaffected: HandScorer produces correct results regardless of how dice values were set.