New Armor, Cleaner Text, and Fairer Floors
· playtest, items, generation, ui
Three RulesVersion bumps this week (148 → 151), an armor rework that changes both damage and turn order, a generation change that alters how every floor reads, and a long tail of text and panel fixes. If you're certifying runs, anything recorded against last week's build will not replay clean against this one — expected, not a bug.
Priority this week
Three things are most likely to be hiding a regression: the armor rework touches the damage formula and the speed that drives turn order, the de-clustering change alters every floor's shape, and the reaction-timing fix rewrote how counter-strikes are scheduled on screen.
- Armor rework (GH #479, RulesVersion 150) — get to depth 4+ and wear the renamed tiers: iron carapace (+5), bloodforged cuirass (+6), dragonscale (+7). Confirm scale hauberk now outranks chain hauberk (+4 vs +3), that dragonscale never lets a hit through for less than 3 blocked even when flanked or sundered, and that elven chain visibly moves you up the turn order.
--start-depth 6gets you there in a minute. - Floor de-clustering (GH #492, RulesVersion 151) — descend a few fresh seeds through depths 1–5 and pay attention to the rhythm of empty vs. occupied rooms. It should read as alternating now, not as a stretch of fights followed by a stretch of dead space. Tell me if it now feels too metronomic — that's the failure mode on this one.
- Reaction timing (GH #485) — fight on Measured or Deliberate pacing with Riposte and/or Opportunist active. The counter-strike, the damage number and the corpse should all land just after the step that provoked them, on the reacting creature's own beat — not a beat or two later, and without dragging the rest of the round out of sync.
Fixed
Buying from the Merchant trained you instead (GH #493). The Merchant and Trainer can both end up within reach at once — the generator deliberately allows a two-stall landing in the down-stairs room — and both panels were drawing on the same rect, stacked. The hidden Trainer panel underneath swallowed clicks aimed at the Merchant painted over it, so a player buying a mace learned Grapple instead. Only one stall can be open at a time now; walking into an NPC focuses its stall and closes the other, and stepping out of one NPC's reach never shuts the panel you're actually trading at. Test: from depth 3, find a floor where both NPCs stand near the down stairs, stand within reach of both, and buy something. Watch for: you get the item you clicked, and only one panel is ever on screen.
Scroll of Identify skipped rings (GH #478, RulesVersion 149). The scroll identified every other unknown item but silently passed over an unidentified ring in your pack — the read action carried its own private list of "what counts as disguised" and that copy had rings missing. There's now one definition shared by the scroll, the display name, and the tooltip, so they can't drift apart again. Test: pick up an unidentified ring, read a Scroll of Identify with the ring in your pack. Watch for: the ring appears in the target list and can be revealed, same as a potion or wand.
Chest gold under-reported the Magpie ring's cut (GH #475). The "Inside you find…" line printed the chest's base gold while your purse quietly received the ring-scaled amount, so there was no way to tell the ring was working at all. Both now use the scaled number, and the line names the ring's contribution explicitly — "18 gold (+6 from a ring)". Test: wear a Magpie ring, open a chest. Watch for: the logged number matches what your purse actually gains, with the bonus called out.
No way to tell how far a battered piece had been ground down (GH #482). A sundered armor piece showed its correct live protection, but nothing told you what it had started as — "is this +4 of +6, or +2 of +6?" A battered piece's inventory row and hover tooltip now show both: "+X of +Y armor". Test: let a sunder-capable enemy chew on your armor for a few rounds, then open your inventory. Watch for: the pristine grade shown beside the live number, and nothing extra shown on a piece that hasn't been battered.
Inventory scrolling stopped short of the last row (GH #484). The panel computed its scroll height from a measurement IMGUI hadn't taken yet, so the list was laid out taller than the space actually available and the panel silently clipped the bottom rows off — including the "Read anyway" button in the scroll read picker. Test: fill a tab past the visible rows and scroll to the bottom; also open the read picker with a long item list. Watch for: the last row is reachable, and the picker's buttons are all present.
Clipped text in four places, and a guard so it stops happening (GH #487, GH #490). The Heart-of-the-Labyrinth choice screen cut its flavour paragraph off at the bottom; long Labyrinth voice barks lost their tails out of the caption box; the win screen's blessing line and the name-entry "remembered seed" notice both depended on staying one line and didn't. All four now size themselves from the actual text. Underneath that, every piece of text in the game now draws through one surface that measures what it's about to draw, and the test suite fails if anything bypasses it — which turned up eleven more slots a few pixels short of the font's line box (the pause and settings titles, the Player Guide search bar, the boss banner's name, the fragment page title, the seed row's Copy button, and more). Test: reach the Hollow and open the Heart choice; trigger long voice barks; finish a run with several blessings; open the pause menu, Settings, and the Player Guide. Watch for: any text touching or crossing the edge of its box, any word cut off mid-sentence, any label overlapping its neighbour. This is the single most worthwhile thing to eyeball this week — the guard catches clipping in the editor, but only on screens someone actually walks through.
Reaction strikes played off the beat (GH #485). With Riposte and Opportunist running, enemies appeared to "move into squares and die" with only the log explaining why. The counter-strike's damage was claiming your next turn slot instead of the reacting beat, so the lunge, the damage number and the corpse all played a beat or more after the step that provoked them — and the jumped cursor dragged every later mover along with it. Reactions now hold the beat they inherit and play a fraction behind it, so the provoking step visibly lands first. Opportunist also finally narrates ("You seize the opening!") and both reactions draw a named popup on the hero. Test: see Priority, above. An enemy's own Guard free-strike has the same fix and is worth the same look.
Creatures blocked click-to-travel routes (GH #476). Travel searched its route treating every living actor as a wall — seen or unseen, hostile or the Merchant — so a body standing in the only corridor made a plainly-visible path fail with "no mapped route", and an unseen creature turned a click into a free reveal. Travel now plans as if the floor were empty; the hostile-in-sight check re-run before each step is the one and only creature stop, and it logs "Enemy sighted." A friendly NPC in the way is simply bumped past. Test: click across a floor with an NPC or a known enemy on the direct route. Watch for: the route is found and walked, and it halts the instant something hostile comes into view, one step before a move could become an attack.
A creature stepping into view arrived early (GH #480). A mover that entered your sight mid-round appeared ahead of its own beat. It now appears on the gated beat, and animation segments are timed relative to their batch. Test: stand where enemies will walk into view around a corner, on Measured or Deliberate pacing. Watch for: nothing popping into existence before its slot in the turn order.
The Merchant was in the wrong Player Guide tab (GH #486). The in-game guide (?) put the
Merchant section under Abilities instead of World, where the Trainer already lives. Moved, with
a test pinning where a handful of headings land so it can't silently drift again.
Added / changed
Armor diversification (GH #479, RulesVersion 150). The top of the armor ladder was
reported as flat — black plate and great plate were near-identical and turned up at similar
depths. Four changes. The top three tiers are renamed for a more distinctive register: black
plate → iron carapace (+5), great plate → bloodforged cuirass (+6), dread plate →
dragonscale (+7). Scale and chain swapped stats, so scale hauberk is now +4 at depth 4
and chain hauberk is +3 at depth 3 — scale outranks chain, matching every convention this
game's register draws on. Depth availability across the ladder as a whole is unchanged. Two new
properties give the top of the ladder some actual character: dragonscale carries a block
floor of 3 and elven chain a block floor of 2 — a minimum the armor roll can never fall
below, and which nothing reduces, not flanking, not sunder. Elven chain also carries +1
speed, folded into your base speed while worn, so it scales with Mire, potions and Berserk
the way weapon damage already does. Test: --start-depth 6 and hunt for the new tiers; wear
dragonscale and let something flank you. Watch for: the block floor holding under a rear
attack and against a sundered piece; elven chain moving your position in the turn-order bar;
and a hit stopped entirely now reading as "turns off your armor, stopped cold" rather than a
flat "for 0 damage". Two of the reporter's other points — elven chain's apparent rarity in
loot, and a tier beyond depth 10 — are deliberately still open on GH #479.
Floors no longer clump their empty rooms (GH #492, RulesVersion 151). A report said empty and occupied rooms feel grouped — a run of fights, then a run of dead space. The generator wasn't biased; 500 seeds confirmed the roll was genuinely independent. But the observation was right anyway: over a floor's dozen rooms, independent coin-flips throw runs of three-plus far more often than intuition expects, and a maze that's meant to be herding you downward has no business handing out four dead rooms in a row. So the generator now actively pushes against it — a room's chance of being quiet drops for each occupied neighbour already decided, and rises for each quiet one. The entrance counts as quiet, so its neighbours lean toward holding a fight. Measured over 250 seeds: the share of rooms sitting inside a same-status blob of three or more fell from 0.54 to 0.35, and floor density — and therefore difficulty — is preserved to within a couple of percent, confirmed by a paired probe sweep. Test: see Priority, above.
Immobile creatures now wear a broken iron ring (GH #494). Some creatures are rooted by design and will never leave their tile — and every time one turns up, it gets reported as broken AI (twice now: the gibbet-warden, and the barrow-thrall before it). The rule was only surfaced by a hover tooltip and a one-time novice hint, which meant the veterans most likely to meet one were exactly the players who'd never see the explanation. A permanently rooted creature now carries a broken pewter ring on the floor at the edge of its tile — distinct from the threat ring by shape and radius, with the gaps falling on the cardinals. Test: find a rooted creature (depth 3+) and stand out of its reach. Watch for: the broken ring reads as clearly different from the solid threat ring at a glance, and doesn't bleed into neighbouring tiles. Note the mark is for permanently immobile creatures only — a temporary root from a Trip, Gaze or Snare doesn't get one.
Inventory rows lost their class symbol (GH #491). Every row still opened with its old
ASCII class glyph — ) ! ? [ / = — prefixed onto the item name. The tab strip already
sorts by class and draws the class sprites, and the row text is already colour-coded by class,
so it was the third time the same fact was stated in one panel, and the last raw ASCII in a
panel otherwise set in the game's own typeface. Removed; nothing takes its place.
Steam wishlist links (GH #382). The name-entry screen, the website, the itch page and the Player Guide's Links tab all carry a Steam wishlist link now. The store page is live as Coming Soon. If you've been meaning to wishlist it, that's the easiest it's going to get.
Also landed
An official contact address (hello@, GH #477); a decision recorded that bug reporting stays
in the pause menu and will not be added to the death or win screens (GH #495 — Esc during a
run, or the last-run.labreport file, remain the two routes); the mailing list's sending half
deferred behind the Steam launch plan (GH #488); documentation trimmed to present behaviour
(GH #490); and a large tooling pass that took the engine test suite from twenty-three minutes
back down to about one, which is why several of the fixes above could land in the same week.
Found something? Esc → Report a Bug/Feature, same as always.