v32-v33: The Bugs Behind 'Combat Is Unclear' and 'Can't Open the Chest'
Two pieces of user feedback, two subtle root causes: a 16ms UI overwite that made combat invisible, and a quest guide ordering bug that made the chest unreachable.
Two pieces of user feedback, two subtle root causes: a 16ms UI overwite that made combat invisible, and a quest guide ordering bug that made the chest unreachable.
Erik tested the game at v20 and left this feedback at 19:13:
“Combat is unclear (no visual or sound effect when hitting/missing). I couldn’t manage to open the chest.”
v30 fixed WASD movement. v31 rebuilt the world into a Skyrim-vibe design (mountains, village, castle). Then v32 and v33 went after the two items Erik named directly: combat feedback and the chest.
Both turned out to have root causes that weren’t what the feedback described.
v32: The 16ms Overwite
The feedback was “no visual effect when hitting/missing.” The factory went looking for missing flash code. What it found: the flash code existed and had always existed. It just wasn’t visible.
The bug: HIT! / MISS! text was drawn to a label that also served as the status bar. Every frame, the status bar update ("HP: 80 | Slimes: 2 HP: 40") overwrote whatever flash text had been set. The flash lasted exactly one frame — approximately 16ms at 60fps, invisible even on a standard display, and completely imperceptible at Mac M2 retina DPI.
# Before: flash and status shared a label
status_label.text = "HIT!" # Set in attack handler
# Then, 16ms later, in _process():
status_label.text = "HP: %d | Slimes: ..." % [hp, ...] # Clobbers it
The fix was structural, not cosmetic: separate the flash label from the status label.
# After: two labels, separate lifecycles
flash_label.text = "HIT!" # Flash label: shows for 1.5s then fades
flash_label.modulate.a = 1.0
flash_tween.tween_property(flash_label, "modulate:a", 0.0, 1.5)
# Status label is never written to from combat handlers
status_label.text = "HP: %d | ..." % [hp, ...]
v32 added center-screen flash text at 64px with a 1.5-second fade-out. MISS! is orange (the previous grey was invisible on bright backgrounds). GUARD DEFEATED! shows as a full-screen-width flash. The combat now reads clearly.
v33: The Guide Ordering Bug
The feedback was “I couldn’t manage to open the chest.” That sounds like a chest interaction bug — wrong trigger key, wrong proximity check, wrong state flag.
The actual problem: the quest guide was showing the wrong step at the wrong time.
In v31, the ★ NEXT indicator (top-right HUD) was showing “Light the torch” as the step after getting the gem and opening the gate. The corridor guard was standing between the gate and the torch room. So:
- Gem pickup → gate opens → guide says “★ NEXT: Light the torch (E)”
- Player walks toward torch
- Guard attacks player with no warning and no guide instruction
- Player, confused, doesn’t defeat the guard
- Without the guard defeated, entering the chest room doesn’t progress — the chest is locked behind that state
The chest wasn’t broken. The guide was sending players into a fight they weren’t prepared for.
v33 fixed the ordering:
# Guide step after gate opens:
# Before: "Light the torch (E)" ← shows before guard is defeated
# After: "⚔ NEXT: Defeat the corridor guard (F to attack)"
# Then: "Light the torch (E)" ← only after guard defeated
Additional UX changes in v33:
- Blocked chest flash: if you try to open the chest with the guard still alive, center-screen text shows “Defeat the guard first! (F to attack)” — was previously a tiny bottom-bar message that blended into the status bar
- Guard HP during combat: status bar shows “⚔ Guard HP: 65 / 80” when you’re hitting the guard, so progress is visible
- Guard combat audio: hits and blocks for the guard were silent in v32 (slimes had audio from v14, but the guard had no sounds). Added attack and hit sounds.
The full chest sequence in v33 is now guided step-by-step. The ★ NEXT indicator never asks you to do something the game hasn’t physically unblocked yet.
The Pattern
Both bugs share a structure: the symptom matched a plausible-but-wrong explanation.
“Combat is unclear” → looked like missing flash code → was actually flash code running at frame rate, invisible at ~16ms.
“Can’t open the chest” → looked like a broken interaction → was actually a guide ordering bug that sent the player into a fight without instruction.
This is probably the most common failure mode when debugging user feedback: the symptom description matches an implementation-level fix, but the actual bug is one level up. For v32 it was the rendering pipeline (shared labels vs separate labels). For v33 it was the UX flow (guide step ordering).
The factory found both by looking for root causes rather than applying the obvious patch. Worth noting as a pattern.