Skip to content

v1.21.1

Choose a tag to compare

@duysqubix duysqubix released this 24 May 03:50
· 83 commits to master since this release

v1.21.1 — Combat Has Depth Now

v1.21.0 added the tier system but combat still resolved in a single d20 check. A Hunter died from one hit; an Imp died from one hit; the only thing that varied was which monster the zone picked. The mechanics matched the tier nomenclature only by accident.

v1.21.1 closes that gap. Every monster now has an HP pool. Combat is a multi-turn loop within a single tick — player swings, monster swings back if still alive, repeat until someone hits zero. The boss-combat depth (crits, class signatures, signature bonuses) now applies to every fight, not just the 0.1% boss encounters.


⚔️ Multi-Turn Combat in One Tick

Each sq tick that triggers a fight now runs the full battle internally:

turn 1: player swings → 12 dmg → Hunter 26/38 HP
turn 1: Hunter swings → 5 dmg → player 145/150 HP
turn 2: player swings → CRIT → 24 dmg → Hunter 2/38 HP  ← Wizard arcane burn applied
turn 3: player swings → 11 dmg → Hunter dies

You don't see this turn-by-turn output — combat reports a single summary line, same as before. But the outcome is different: damage accumulates, kills can take 2-5 swings, and tougher monsters live up to their tier.

Vermin (HP 1-3) still die in one player swing for any character that can land a hit. The depth shows up against Bruiser+ tiers.


🩸 You'll Take More Damage Per Fight

This is the visible change. In single-roll combat, you either won cleanly or won-with-damage in one outcome. Now multi-turn combat means monsters get multiple swings if they don't die instantly.

old:  Wizard fights Hunter → 1 roll → maybe 8 dmg → done
new:  Wizard fights Hunter → 3 turns → 8+11+0 = 19 dmg → done

For your character this means:

  • Vermin tier: no change (one-shot kills, no damage)
  • Bruiser tier: ~1-2 turns of damage exchange at mid-game
  • Hunter tier: ~2-4 turns; cumulative damage of 10-30 is normal
  • Horror / Boss-adjacent: empty in v1.21, populating in v1.22

You'll see the combat_tough message variant (which already existed for the old TOUGH outcome) much more often. That's expected — it's now used for "won but took N damage in the fight" instead of just "won the single-roll TOUGH branch".

If this feels too punishing, the healer (1 HP / 30s from $HOME) is unchanged and absorbs the new damage rate gracefully.


✨ Class Signatures Fire Per-Turn

Wizard's arcane burn, Warrior's battle frenzy, Ranger's mark prey, Rogue's shadow strike — all of these previously fired at most once per combat (one roll = one trigger check). They now fire on every player attack within the multi-turn loop.

For multi-turn fights this is a real damage boost:

  • Wizard: arcane burn applies on every swing — sustained DPS goes up against high-HP monsters
  • Warrior: battle frenzy triggers per-turn once HP drops below 60% (the v1.19 threshold change), so in a long fight you can chain it
  • Necromancer: soul-drain heals you on every kill, so multi-encounter sessions in /tmp actually sustain you
  • Rogue: shadow strike still saves the nat-1 fumble per swing — more swings, more saves

This means class identity matters more than it did. A Wizard with INT 30 against a Hunter is now noticeably better than a Wizard with INT 10.


🎯 Crits Land Per-Turn Now Too

The crit formula (crit_threshold = max(15, 20 - INT/4), x2 damage) used to apply once per fight. Now per swing. INT-built classes get more reliable burst windows in multi-turn fights.


🧹 Code Health

combat() and combat_elite() were near-duplicate single-roll resolvers. Merged into a single combat() that takes an is_elite: bool parameter and dispatches to the right message variant internally. Net effect: 160 lines collapse to one HP-pool loop. Future combat-resolution changes touch one function, not two.

The encounter pipeline (random_monster_for_zone → EncounterProfile → apply_elite_pressure → combat) now threads HP through end-to-end. Elite monsters get 1.5× HP in addition to their existing 1.6× ATK + 2× XP — they live longer to justify their existing reward bump.


⚙ Compatibility

Saves are unchanged. No schema migration. No CLI changes. The change is purely in combat resolution math. Old saves load identically; the new fights apply going forward.

This is genuinely a difficulty change. Mid-game players will see noticeably more damage per fight at first. It evens out as you level (your max HP scales faster than monster damage does), but the first few sessions after upgrade may feel like the game pushes back harder. That's the point — combat used to be a single coin flip; now it's a sustained exchange.


Full Changelog: v1.21.0...v1.21.1