Appearance
Battle System Design
Source: Extracted and expanded from
master_gdd.md§3.
Status: DRAFT — needs producer review on numeric parameters.
Table of Contents
- The Grid
- Turn Order — The CT Timeline
- Damage — Deterministic
- Height Mechanics
- Core Verbs
- Downed State & Permadeath
- Status Effects
- UI & Feedback
- Scope Boundaries
- 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
| Tier | Value | Examples | Gameplay Impact |
|---|---|---|---|
| Pit | −1 | Water, lava, void, chasm | Cannot walk. Fly/teleport only. Fall into = banished at height 0. |
| Ground | 0 | Grass, stone, ash, marble | Default. All units can traverse. |
| Platform | +1 | Crates, low walls, shallow hills | Step up costs +1 move. Small advantage. |
| Elevated | +2 | Cliffs, buildings, pillars | Step up costs +2 move. Significant advantage. |
| Tower/Peak | +3 | Watchtowers, floating platforms, caldera rim | Step 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 Type | Player Deploy | Enemy Deploy |
|---|---|---|
| Standard | Left 2 columns (x=0,1), any y, ground height | Right 2 columns (x=6,7), any y, ground height |
| Ambush | Center 4×4 square | Perimeter: all tiles at distance ≥ 4 from center |
| Escort | Left 2 columns + NPC at (x=2, y=6) | Right 2 columns + reinforcement spawns |
| King of the Hill | Edge columns (x=0,7) | Edge columns (opposite side) |
| Boss | Map-specific | Pre-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)
| Speed | Description | Example Unit |
|---|---|---|
| 1–4 | Very slow | Golem, heavily armored Knight |
| 5–7 | Slow | Knight, Priest, Mage |
| 8–10 | Moderate | Archer, Shaman, Bard |
| 11–14 | Fast | Rogue, Monk, Beastmaster |
| 15–18 | Very fast | Hasted unit, Ninja-equivalent |
| 19–20 | Capped maximum | Chronomancer-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
| Effect | CT Impact | Timeline Display |
|---|---|---|
| Haste | Target gains +50% Speed for 3 ticks | Unit icon slides LEFT on timeline |
| Slow | Target loses −50% Speed for 3 ticks | Unit icon slides RIGHT on timeline |
| Stop | Target's CT freezes for 2 ticks | Unit icon freezes, shows 🔒 |
| Rewind | Target's CT set to 0 | Unit jumps to back of queue |
| Encore | Ally acts again immediately | Extra turn inserted at current tick |
Charge Time & Cancellation
Spells with charge time:
- Caster begins casting at their turn. Spell enters timeline at tick N + charge_time.
- If caster takes any damage during charge: spell cancelled. ⚠ CANCEL? appears on timeline.
- If caster is displaced (pushed/pulled/teleported): spell cancelled.
- If caster is killed/downed: spell cancelled.
- If caster is stunned/stopped/frozen: spell cancelled.
- 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 Happens | Does Spell Cancel? |
|---|---|
| Caster takes damage | Yes |
| Caster pushed/pulled | Yes |
| Caster teleported (ally) | Yes |
| Caster stunned/stopped/frozen | Yes |
| Caster killed/downed | Yes |
| Target moves out of AoE | No — spell hits the tile, even if empty |
| Target dies before spell lands | No — spell hits the tile (may hit corpse for some effects) |
| Cover placed in spell path | Spell hits the cover (cover takes damage) |
| Spell timer expires normally | Spell 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
| Type | Used By | Defended By | Special |
|---|---|---|---|
| Physical | Strike, Shoot, Shove into wall | DEF | Standard |
| Magical | Cast, elemental spells | DEF (magic) or Ward | Can have elemental tags |
| True | Fall damage, %HP effects, poison | None | Ignores all DEF/resistances |
| Heal | Heal abilities | None (negative damage) | Caps at max HP unless overheal |
Elemental Interactions
| Element | Strong vs. | Weak vs. | Terrain Interaction |
|---|---|---|---|
| Fire | Ice armor (+2 dmg) | Water armor (−2 dmg) | Ignites oil, evaporates shallow water |
| Ice | Fire armor (+2 dmg) | Ice armor (−2 dmg, immune) | Freezes water tiles (creates walkable surface) |
| Lightning | Water armor (+2 dmg), Wet status | Stone armor (−2 dmg) | Electrifies water (damage/tick to all in water) |
| Earth | Flying units (+2 dmg) | Air armor (−2 dmg) | Creates temporary cover, raises/lowers terrain |
| Wind | Earth armor (+2 dmg) | Stone armor (−2 dmg) | Pushes units, extends fall trajectories |
| Holy | Undead (+4 dmg) | Holy armor (−2 dmg) | Bonus vs Necromancer spawns |
| Dark | Living 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)| ΔHeight | Range Mod | Damage Mod | LOS Rule |
|---|---|---|---|
| +3 or more | +2 | +30% | Ignores LOS blockers ≤ attacker height |
| +2 | +1 | +20% | Normal LOS |
| +1 | +1 | +10% | Normal LOS |
| 0 | 0 | Normal | Normal 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
| Verb | Effect | Target |
|---|---|---|
| Raise Terrain | Target tile's height +1 (max +3) | Any non-occupied tile |
| Lower Terrain | Target tile's height −1 (min −1) | Any non-occupied tile |
| Create Cover | Spawn destructible obstacle on target tile | Adjacent 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
| Parameter | Value |
|---|---|
| Type | Physical, melee |
| Range | Adjacent (1 tile) |
| Base damage | Weapon-dependent (sword: 6–10, axe: 8–14, dagger: 3–5 × 2 hits) |
| Push | Some 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
| Parameter | Value |
|---|---|
| Type | Physical, ranged |
| Range | Weapon-dependent (bow: 3–5 tiles, crossbow: 2–4 tiles) |
| Base damage | Weapon-dependent (bow: 5–8, crossbow: 7–10) |
| LOS required | Yes (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
| Parameter | Value |
|---|---|
| Type | Magical, ranged |
| Range | Spell-dependent (2–6 tiles) |
| Charge time | 0–3 ticks (instant spells = 0 charge) |
| Cancellable | Yes (see cancellation hierarchy) |
| LOS required | For targeted spells. Ground-targeted AoEs: no LOS required. |
Charge time by spell tier (TBD):
| Spell Tier | Charge Time | Example |
|---|---|---|
| Cantrip | 0 ticks | Fire Spark, Frost Touch |
| Basic | 1 tick | Fireball, Heal, Ice Lance |
| Advanced | 2 ticks | Meteor, Holy Light, Tornado |
| Ultimate | 3 ticks | Time Stop, Geomancy, Eclipse |
Shove
| Parameter | Value |
|---|---|
| Type | Physical, melee |
| Range | Adjacent |
| Push distance | 1–3 tiles (aspect-dependent) |
| Into obstacle | Bonus damage = push distance × 2 |
| Off ledge | Target takes fall damage |
| No damage on shove itself | Unless aspect modifier (Berserker: shove deals damage) |
Grapple
| Parameter | Value |
|---|---|
| Type | Physical, melee |
| Range | 1–2 tiles |
| Pull distance | 1–2 tiles toward user |
| Sets up combos | Pull into ally threat range, into hazard, off safe terrain |
| No damage | Unless aspect modifier |
Fortify
| Parameter | Value |
|---|---|
| Type | Self-buff |
| Effect | +DEF for 3 ticks, OR temporary HP shield, OR create cover on adjacent tile |
| Aspect-dependent | Knight: create cover. Berserker: temp HP. Priest: DEF buff. |
Heal
| Parameter | Value |
|---|---|
| Type | Magical, targeted |
| Range | Self or adjacent (Priest: range 1–3) |
| Charge time | 0 ticks (instant) |
| Amount | MAG × 1.5 (TBD formula) |
| Overheal | Requires Healer's Wisdom aspect (excess → temp shield) |
Taunt
| Parameter | Value |
|---|---|
| Type | Status, targeted |
| Effect | Target enemy's next telegraphed action redirects to taunter |
| Duration | Until enemy acts once, or taunter dies |
| Immunity | Bosses partially resistant (50% chance to ignore taunt) |
Teleport
| Parameter | Value |
|---|---|
| Type | Movement-replace (replaces Move, not Act) |
| Range | 2–4 tiles (aspect-dependent) |
| LOS | Not required |
| Height | Can teleport to any height |
| Ignores | Obstacles, hazards, occupied tiles |
| Some aspects | Blink: free action (doesn't consume Move). Shadowstep: must start/end in shadow. |
Additional Verbs (expansion candidates)
| Verb | Description | MVP? |
|---|---|---|
| Barrier | Create temporary HP wall on adjacent tiles | Post-MVP |
| Dispel | Remove buffs/debuffs from target | Yes (Priest) |
| Transmute | Change terrain type on target tile | Yes (Alchemist) |
| Deploy | Place turret/mine/trap (Engineer) | Yes |
| Pledge | Link 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
| Property | Value |
|---|---|
| Can act? | No |
| Can move? | No |
| Can be targeted? | Yes (some enemies prioritize, some ignore) |
| Occupies tile? | Yes (blocks movement) |
| Counter duration | 3 turns (shown as ⚰️3→⚰️2→⚰️1→💀) |
| Counter ticks | On the downed unit's would-be turn |
Revive
| Parameter | Value |
|---|---|
| Cost | 1 action from any ally |
| Range | Adjacent (Priest: range 1–2) |
| HP after revive | 25% 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:
- Their equipped Aspects are lost for the run (returned to inventory? TBD)
- An empty slot opens in the squad
- A "Last Will" note is generated and displayed (comedic tone)
- Other units may have a brief banter reaction
- Player can recruit a replacement at the next RECRUIT node
Co-op Ghost Mode
When one player loses all units:
- That player enters Ghost Mode
- Can still: ping, emote, spectate (free camera)
- Cannot: take turns, control units
- Surviving partner can revive one ghost-player unit at next CAMP if they have Phoenix Down
- If both players lose all units → run over
7. Status Effects
Buffs (Positive)
| Status | Effect | Duration | Stackable? | Removable? |
|---|---|---|---|---|
| Haste | +50% Speed | 3 ticks | No (refresh) | Yes (Dispel) |
| Fortified | +3 DEF | 3 ticks | No (refresh) | Yes |
| Regen | Heal %HP per tick | 3 ticks | No (refresh) | Yes |
| Shield | Absorb next hit | Until hit | No | Yes |
| Invisible | Cannot be targeted | 2 ticks or until act | No | No |
| Flying | Ignore terrain, −accuracy vs you | Permanent (aspect) | N/A | N/A |
Debuffs (Negative)
| Status | Effect | Duration | Stackable? | Removable? |
|---|---|---|---|---|
| Slow | −50% Speed | 3 ticks | No (refresh) | Yes (Cleanse) |
| Rooted | Cannot move (can act) | 2 ticks | No | Yes |
| Frozen | Cannot move OR act | 1 tick | No | Yes |
| Stunned | Cannot move OR act | 1 tick | No | Yes |
| Poisoned | Take 2 true damage/tick | 4 ticks | Yes (intensity) | Yes (Antidote) |
| Bleeding | Take 3 true damage/tick | 3 ticks | Yes (intensity) | Yes (Heal) |
| Cursed | −3 ATK, −3 MAG | 3 ticks | No | Yes (Dispel) |
| Burning | Take 1 damage/tick, can spread | 3 ticks | No | Move to water |
| Wet | −50% fire damage, +50% lightning | 3 ticks | No | Wait |
| Confused | Next action targets random unit | 1 action | No | On hit |
Interaction Table
| Combo | Result |
|---|---|
| Wet + Lightning | ×2 lightning damage, stun for 1 tick |
| Wet + Ice | Frozen for 2 ticks instead of 1 |
| Burning + Oil tile | Explosion: 5 damage AoE, removes oil |
| Poisoned + Bleeding | Crimson Agony: both tick twice as fast |
| Invisible + Strike | Guaranteed crit (×1.5 damage) |
8. UI & Feedback
In-Battle HUD
| Element | Location | Content |
|---|---|---|
| Timeline bar | Bottom of screen (horizontal scroll) | All tick entries, charge indicators |
| Unit info panel | Side (on hover/select) | HP, MP, stats, aspects, status effects |
| Action palette | Bottom-center (on unit select) | Available moves and acts |
| Targeting overlay | On grid | Move range, attack range, AoE shape, damage preview |
| Height indicator | On tile (hover) | Height tier color-code + number |
| Turn indicator | Top-center | "Your Turn" / "Player 2's Turn" / "Enemy Phase" |
| Undo button | Bottom-left | Last move only (not entire turn) |
Feedback Priorities
| Priority | Feedback | Method |
|---|---|---|
| Critical | Spell charge countdown | ⏳ icon on timeline + target tile pulse |
| Critical | Unit about to permadie | Red flash on ⚰️ counter |
| High | Damage preview | Number overlay on target tile |
| High | Height advantage | +% damage text color-coded (green=advantage, red=disadvantage) |
| Medium | Synergy triggered | "Synergy Discovered!" popup with particle burst |
| Medium | Level-up available | Icon on unit portrait |
| Low | Ambience | Weather 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
- 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.)
- CT cap: Is there a maximum CT value? If a unit is continuously Hasted and never acts, does CT overflow? (Recommend: cap at 200.)
- 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.)
- 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.)
- 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.)
- Boss immunities: Which status effects can bosses resist? (Recommend: immune to Stun, Frozen, Confused; resistant to Slow/Rooted; vulnerable to everything else.)
- 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