Skip to content

Battle System Design

Source: Extracted and expanded from master_gdd.md §3.
Status: DRAFT — needs producer review on numeric parameters.


Table of Contents

  1. The Grid
  2. Turn Order — The CT Timeline
  3. Damage — Deterministic
  4. Height Mechanics
  5. Core Verbs
  6. Downed State & Permadeath
  7. Status Effects
  8. UI & Feedback
  9. Scope Boundaries
  10. Open Questions

1. The Grid

Dimensions

  • 8 columns × 12 rows (portrait orientation)
  • Isometric rendering — rows are offset for diamond-tile illusion
  • Wider at top with perspective projection for depth

Height Tiers

TierValueExamplesGameplay Impact
Pit−1Water, lava, void, chasmCannot walk. Fly/teleport only. Fall into = banished at height 0.
Ground0Grass, stone, ash, marbleDefault. All units can traverse.
Platform+1Crates, low walls, shallow hillsStep up costs +1 move. Small advantage.
Elevated+2Cliffs, buildings, pillarsStep up costs +2 move. Significant advantage.
Tower/Peak+3Watchtowers, floating platforms, caldera rimStep up costs +3 move. Major LOS and damage advantage.

Tile Properties

Each tile can hold:

  • Height (int, −1..+3)
  • Terrain type (determines visuals, footstep SFX, and elemental interactions)
  • Hazard (null or a timed/damage effect: lava, poison cloud, electrified water)
  • Cover (null or a destructible obstacle with HP)
  • Occupant (null or one unit)
  • Prepared effect (Ritualist-trapped tiles, Engineer mines)

Deployment Zones

Battle TypePlayer DeployEnemy Deploy
StandardLeft 2 columns (x=0,1), any y, ground heightRight 2 columns (x=6,7), any y, ground height
AmbushCenter 4×4 squarePerimeter: all tiles at distance ≥ 4 from center
EscortLeft 2 columns + NPC at (x=2, y=6)Right 2 columns + reinforcement spawns
King of the HillEdge columns (x=0,7)Edge columns (opposite side)
BossMap-specificPre-placed, hand-authored

Camera

  • Isometric fixed angle (30° or 45°?)
  • Player can pan (scroll edges or middle-mouse drag)
  • Zoom range: can see entire grid at minimum zoom, ~4×6 tiles at maximum
  • Co-op: each player has independent camera

2. Turn Order — The CT Timeline

CT Formula

CT_this_tick = CT_previous + Speed
If CT ≥ 100: unit is READY to act
After acting: CT -= 100 (overflow carries to next cycle)

Speed Values (Design Range)

SpeedDescriptionExample Unit
1–4Very slowGolem, heavily armored Knight
5–7SlowKnight, Priest, Mage
8–10ModerateArcher, Shaman, Bard
11–14FastRogue, Monk, Beastmaster
15–18Very fastHasted unit, Ninja-equivalent
19–20Capped maximumChronomancer-buffed, boss phase

Tick Resolution

  • Ticks are discrete. No fractions.
  • Multiple units reaching CT ≥ 100 on the same tick: player units act first (choose order), then enemies (AI decides order).
  • Co-op: P1 → P2 on the same tick (whichever player's units hit CT first).

The Timeline Bar (UI)

 ┌──────────────────────────────────────────────────────────────┐
 │ TICK:    1      2      3      4      5      6      7      8  │
 │        [You]          [EnemyA]    [Ally]      [EnemyB]    [You]
 │        Slash          Fireball    Heal@       Bite        ???
 │        @(3,4)         lands(6,2)  (3,3)       @(5,4)
 │                        ⚠ CANCEL?                            │
 └──────────────────────────────────────────────────────────────┘

Display requirements:

  • Always visible (bottom or top of screen)
  • Current tick highlighted
  • Player's upcoming actions clearly marked
  • Enemy actions show: ability name, target tile, damage number
  • Charge spells show countdown: [⏳ 2 turns remaining]
  • Cancellable spells show ⚠ CANCEL? badge
  • Hover over any entry shows tooltip with full details

Speed Manipulation

EffectCT ImpactTimeline Display
HasteTarget gains +50% Speed for 3 ticksUnit icon slides LEFT on timeline
SlowTarget loses −50% Speed for 3 ticksUnit icon slides RIGHT on timeline
StopTarget's CT freezes for 2 ticksUnit icon freezes, shows 🔒
RewindTarget's CT set to 0Unit jumps to back of queue
EncoreAlly acts again immediatelyExtra turn inserted at current tick

Charge Time & Cancellation

Spells with charge time:

  1. Caster begins casting at their turn. Spell enters timeline at tick N + charge_time.
  2. If caster takes any damage during charge: spell cancelled. ⚠ CANCEL? appears on timeline.
  3. If caster is displaced (pushed/pulled/teleported): spell cancelled.
  4. If caster is killed/downed: spell cancelled.
  5. If caster is stunned/stopped/frozen: spell cancelled.
  6. If target tile is raised/lowered (terrain change): spell hits new height. Can result in miss if target is no longer there.

Cancellation Hierarchy

What HappensDoes Spell Cancel?
Caster takes damageYes
Caster pushed/pulledYes
Caster teleported (ally)Yes
Caster stunned/stopped/frozenYes
Caster killed/downedYes
Target moves out of AoENo — spell hits the tile, even if empty
Target dies before spell landsNo — spell hits the tile (may hit corpse for some effects)
Cover placed in spell pathSpell hits the cover (cover takes damage)
Spell timer expires normallySpell resolves, hits tile

3. Damage — Deterministic

Base Formula

Damage = Ability_Base_Damage − Target_DEF
Minimum damage = 1 (unless absorbed/voided entirely)

No variance. No crits. No miss chance (except Evasion defense aspect — see below).

Damage Types

TypeUsed ByDefended BySpecial
PhysicalStrike, Shoot, Shove into wallDEFStandard
MagicalCast, elemental spellsDEF (magic) or WardCan have elemental tags
TrueFall damage, %HP effects, poisonNoneIgnores all DEF/resistances
HealHeal abilitiesNone (negative damage)Caps at max HP unless overheal

Elemental Interactions

ElementStrong vs.Weak vs.Terrain Interaction
FireIce armor (+2 dmg)Water armor (−2 dmg)Ignites oil, evaporates shallow water
IceFire armor (+2 dmg)Ice armor (−2 dmg, immune)Freezes water tiles (creates walkable surface)
LightningWater armor (+2 dmg), Wet statusStone armor (−2 dmg)Electrifies water (damage/tick to all in water)
EarthFlying units (+2 dmg)Air armor (−2 dmg)Creates temporary cover, raises/lowers terrain
WindEarth armor (+2 dmg)Stone armor (−2 dmg)Pushes units, extends fall trajectories
HolyUndead (+4 dmg)Holy armor (−2 dmg)Bonus vs Necromancer spawns
DarkLiving units (+2 dmg)Dark armor (−2 dmg)Damage scales with missing HP

The Evasion Exception

The Dodge Defense aspect (and certain enemy Tricksters) are the only non-deterministic mechanic. When a unit with Dodge is targeted:

  • Timeline shows (?) instead of the damage number
  • When the attack resolves, the dodge check happens
  • The game never rolls dice for anything else

Justification: The Ninja fantasy requires the threat of unpredictability. The player can choose to target someone else and avoid the gamble entirely. The (?) telegraph means they know the risk before committing.


4. Height Mechanics

Damage Modifier

Height Advantage = Attacker.z − Defender.z
Final Damage = Base_Damage × (1.0 + Height_Modifier)
ΔHeightRange ModDamage ModLOS Rule
+3 or more+2+30%Ignores LOS blockers ≤ attacker height
+2+1+20%Normal LOS
+1+1+10%Normal LOS
00NormalNormal LOS
−1−1−10%Normal LOS
−2 or less−1−20%Normal LOS

Fall Damage

Fall_Damage = (Height_Dropped × 3) true damage
  • Push off a +3 ledge: 9 true damage
  • Push off a +2 ledge: 6 true damage
  • Into water/lava/void at height −1: banished (not dead — removed from battle, some bosses return)
  • Unit with Flight movement aspect: immune to fall damage
  • Unit with Stone Skin defense aspect: immune to push/pull (can't be shoved off)

Ranged Attacks Uphill

  • Can only target tiles within base range + height range modifier
  • Height difference may reduce effective range if shooting uphill
  • Example: Archer at height 0 targeting +3: range −1 penalty applied
  • Flying units attacking downward ignore range penalties

Terrain Manipulation

VerbEffectTarget
Raise TerrainTarget tile's height +1 (max +3)Any non-occupied tile
Lower TerrainTarget tile's height −1 (min −1)Any non-occupied tile
Create CoverSpawn destructible obstacle on target tileAdjacent tile

5. Core Verbs

Every unit can perform one Move and one Act per turn, in that order. Some abilities modify this (Haste grants an extra Move, Encore grants an extra Act).

Strike

ParameterValue
TypePhysical, melee
RangeAdjacent (1 tile)
Base damageWeapon-dependent (sword: 6–10, axe: 8–14, dagger: 3–5 × 2 hits)
PushSome weapons push target 1 tile (if target not Stone Skin)
Height allowed±1 height difference from attacker

Expanded parameters (TBD):

  • [ ] Weapon-specific push distance (0, 1, or 2 tiles)?
  • [ ] Strike from height advantage: bonus tile of push for every +2 height?
  • [ ] Dual-wield (Rogue): two strikes, each at −2 damage?

Shoot

ParameterValue
TypePhysical, ranged
RangeWeapon-dependent (bow: 3–5 tiles, crossbow: 2–4 tiles)
Base damageWeapon-dependent (bow: 5–8, crossbow: 7–10)
LOS requiredYes (Bresenham raycast, blocked by cover)
Height penalty−1 range per −1 height disadvantage

Expanded parameters (TBD):

  • [ ] Ammo system? (Probably not for MVP — infinite arrows)
  • [ ] Pin (Archer Key ability): immobilize target for 1 tick on hit?
  • [ ] Volley (AoE): 3-tile line or 2×2 area?

Cast

ParameterValue
TypeMagical, ranged
RangeSpell-dependent (2–6 tiles)
Charge time0–3 ticks (instant spells = 0 charge)
CancellableYes (see cancellation hierarchy)
LOS requiredFor targeted spells. Ground-targeted AoEs: no LOS required.

Charge time by spell tier (TBD):

Spell TierCharge TimeExample
Cantrip0 ticksFire Spark, Frost Touch
Basic1 tickFireball, Heal, Ice Lance
Advanced2 ticksMeteor, Holy Light, Tornado
Ultimate3 ticksTime Stop, Geomancy, Eclipse

Shove

ParameterValue
TypePhysical, melee
RangeAdjacent
Push distance1–3 tiles (aspect-dependent)
Into obstacleBonus damage = push distance × 2
Off ledgeTarget takes fall damage
No damage on shove itselfUnless aspect modifier (Berserker: shove deals damage)

Grapple

ParameterValue
TypePhysical, melee
Range1–2 tiles
Pull distance1–2 tiles toward user
Sets up combosPull into ally threat range, into hazard, off safe terrain
No damageUnless aspect modifier

Fortify

ParameterValue
TypeSelf-buff
Effect+DEF for 3 ticks, OR temporary HP shield, OR create cover on adjacent tile
Aspect-dependentKnight: create cover. Berserker: temp HP. Priest: DEF buff.

Heal

ParameterValue
TypeMagical, targeted
RangeSelf or adjacent (Priest: range 1–3)
Charge time0 ticks (instant)
AmountMAG × 1.5 (TBD formula)
OverhealRequires Healer's Wisdom aspect (excess → temp shield)

Taunt

ParameterValue
TypeStatus, targeted
EffectTarget enemy's next telegraphed action redirects to taunter
DurationUntil enemy acts once, or taunter dies
ImmunityBosses partially resistant (50% chance to ignore taunt)

Teleport

ParameterValue
TypeMovement-replace (replaces Move, not Act)
Range2–4 tiles (aspect-dependent)
LOSNot required
HeightCan teleport to any height
IgnoresObstacles, hazards, occupied tiles
Some aspectsBlink: free action (doesn't consume Move). Shadowstep: must start/end in shadow.

Additional Verbs (expansion candidates)

VerbDescriptionMVP?
BarrierCreate temporary HP wall on adjacent tilesPost-MVP
DispelRemove buffs/debuffs from targetYes (Priest)
TransmuteChange terrain type on target tileYes (Alchemist)
DeployPlace turret/mine/trap (Engineer)Yes
PledgeLink two units (damage shared, buffs shared)Post-MVP

6. Downed State & Permadeath

State Machine

ALIVE → [HP reaches 0] → DOWNED → [counter expires] → DEAD
  ↑                         │          (permadeath for run)
  └── Revive ───────────────┘

Downed State

PropertyValue
Can act?No
Can move?No
Can be targeted?Yes (some enemies prioritize, some ignore)
Occupies tile?Yes (blocks movement)
Counter duration3 turns (shown as ⚰️3→⚰️2→⚰️1→💀)
Counter ticksOn the downed unit's would-be turn

Revive

ParameterValue
Cost1 action from any ally
RangeAdjacent (Priest: range 1–2)
HP after revive25% of max HP
Counter reset?Yes — counter stops, unit is ALIVE
Abilities granted?Can act on their next turn (CT is reset to 0)

Permadeath Effects

When a unit dies permanently:

  1. Their equipped Aspects are lost for the run (returned to inventory? TBD)
  2. An empty slot opens in the squad
  3. A "Last Will" note is generated and displayed (comedic tone)
  4. Other units may have a brief banter reaction
  5. Player can recruit a replacement at the next RECRUIT node

Co-op Ghost Mode

When one player loses all units:

  1. That player enters Ghost Mode
  2. Can still: ping, emote, spectate (free camera)
  3. Cannot: take turns, control units
  4. Surviving partner can revive one ghost-player unit at next CAMP if they have Phoenix Down
  5. If both players lose all units → run over

7. Status Effects

Buffs (Positive)

StatusEffectDurationStackable?Removable?
Haste+50% Speed3 ticksNo (refresh)Yes (Dispel)
Fortified+3 DEF3 ticksNo (refresh)Yes
RegenHeal %HP per tick3 ticksNo (refresh)Yes
ShieldAbsorb next hitUntil hitNoYes
InvisibleCannot be targeted2 ticks or until actNoNo
FlyingIgnore terrain, −accuracy vs youPermanent (aspect)N/AN/A

Debuffs (Negative)

StatusEffectDurationStackable?Removable?
Slow−50% Speed3 ticksNo (refresh)Yes (Cleanse)
RootedCannot move (can act)2 ticksNoYes
FrozenCannot move OR act1 tickNoYes
StunnedCannot move OR act1 tickNoYes
PoisonedTake 2 true damage/tick4 ticksYes (intensity)Yes (Antidote)
BleedingTake 3 true damage/tick3 ticksYes (intensity)Yes (Heal)
Cursed−3 ATK, −3 MAG3 ticksNoYes (Dispel)
BurningTake 1 damage/tick, can spread3 ticksNoMove to water
Wet−50% fire damage, +50% lightning3 ticksNoWait
ConfusedNext action targets random unit1 actionNoOn hit

Interaction Table

ComboResult
Wet + Lightning×2 lightning damage, stun for 1 tick
Wet + IceFrozen for 2 ticks instead of 1
Burning + Oil tileExplosion: 5 damage AoE, removes oil
Poisoned + BleedingCrimson Agony: both tick twice as fast
Invisible + StrikeGuaranteed crit (×1.5 damage)

8. UI & Feedback

In-Battle HUD

ElementLocationContent
Timeline barBottom of screen (horizontal scroll)All tick entries, charge indicators
Unit info panelSide (on hover/select)HP, MP, stats, aspects, status effects
Action paletteBottom-center (on unit select)Available moves and acts
Targeting overlayOn gridMove range, attack range, AoE shape, damage preview
Height indicatorOn tile (hover)Height tier color-code + number
Turn indicatorTop-center"Your Turn" / "Player 2's Turn" / "Enemy Phase"
Undo buttonBottom-leftLast move only (not entire turn)

Feedback Priorities

PriorityFeedbackMethod
CriticalSpell charge countdown⏳ icon on timeline + target tile pulse
CriticalUnit about to permadieRed flash on ⚰️ counter
HighDamage previewNumber overlay on target tile
HighHeight advantage+% damage text color-coded (green=advantage, red=disadvantage)
MediumSynergy triggered"Synergy Discovered!" popup with particle burst
MediumLevel-up availableIcon on unit portrait
LowAmbienceWeather particles, tile glow for prepared effects

9. Scope Boundaries

MVP (20–24 weeks)

  • [x] Full CT timeline system with timeline bar UI
  • [x] Full grid: 8×12, 5 height tiers, isometric rendering
  • [x] All core verbs (Strike, Shoot, Cast, Shove, Grapple, Fortify, Heal, Taunt, Teleport, Deploy, Dispel, Transmute)
  • [x] Downed state + permadeath + revive
  • [x] Height mechanics (damage, range, LOS, fall damage)
  • [x] Deterministic damage formula
  • [x] Charge time + cancellation system
  • [x] Status effects: Haste, Slow, Rooted, Frozen, Poisoned, Burning, Cursed
  • [x] Single-move undo
  • [x] Tooltip system

Post-MVP

  • [ ] Additional status effects: Confused, Bleeding, Wet, Invisible
  • [ ] Full undo (entire turn rewind, not just last move)
  • [ ] Elemental interaction VFX (water electrification, oil fires)
  • [ ] Kill-cam (cinematic replay of killing blow)
  • [ ] Battle log (text history of all actions)
  • [ ] Damage prediction accounting for all modifiers (currently: base damage − DEF only)

Won't Do (For Now)

  • [ ] Facing mechanics (back attacks, flanking bonuses)
  • [ ] Weapon durability
  • [ ] Ammo system
  • [ ] Cover-building as a free action
  • [ ] Destructible terrain affecting pathfinding (post-collapse, grid updates)

10. Open Questions

  1. Tick resolution order: When multiple units hit CT ≥ 100 on the same tick, player units act first, but within player units, does the player choose order or is it Speed-descending? (Recommend: player chooses order for their units.)
  2. CT cap: Is there a maximum CT value? If a unit is continuously Hasted and never acts, does CT overflow? (Recommend: cap at 200.)
  3. Strike range from height: Can melee Strike hit a unit at +2 height? Current rule says ±1 height for melee. Should height advantage grant +1 melee reach? (Recommend: no — that's what ranged weapons are for.)
  4. Spell charge damage threshold: "Any damage" cancels the spell. Should there be a minimum damage threshold? (Example: poison tick = 2 damage. Does this cancel the Archmage's Meteor?) (Recommend: yes, any damage. Poison is a valid counterplay to casters.)
  5. Undo scope: Single-move undo is MVP. Full-turn undo? Post-MVP? What about undo in co-op? (Recommend: single-move undo in solo, no undo in co-op.)
  6. Boss immunities: Which status effects can bosses resist? (Recommend: immune to Stun, Frozen, Confused; resistant to Slow/Rooted; vulnerable to everything else.)
  7. Fall damage + death: If a unit at 3 HP is pushed off a +3 ledge (9 fall damage), do they go directly to Downed or is there a DEATH skip? (Recommend: Downed. Counter starts. Same as any HP→0 event.)

Next: Aspect Catalog

Markdown is the canonical GDD source.