Skip to content

Dev Log: 2026-07-05

"You can now press Back on a tutorial step and actually go back, gauge, position, shield state and all, instead of the game politely pretending you did."


Tutorial navigation: a real Back button

The tutorial has had Next for a while. Back existed too, but only for plain message chains: a stack of "click through this text" steps with nothing else going on. The moment a step involved an actual game action (move here, attack this, activate a limit break) Back either did not appear or did not do anything meaningful, and the player was stuck waiting for a timeout or fumbling forward.

The redesign makes every step type support Back, scoped so it can never rewind across a sector boundary. Under the hood this reuses the same checkpoint machinery the real Undo button already relies on: each tutorial sector pushes a checkpoint at its start, and every state-changing step compares the current checkpoint count against the count recorded when that step began. If nothing changed, Back just moves the step pointer backward in place, cheap and instant. If something did change, the tutorial runner unwinds cleanly, hands control to a full checkpoint restore (unit positions, HP, drone state, all of it), and resumes teaching from the earlier step once the board is back to how it looked.

if step_result == Result.PREV:
    var target_floor: int = int(_step_floor.get(target_fi, _sector_floor_idx + 1))
    if GameManager.checkpoints.size() > target_floor:
        # Real state changed since the target step began: unwind and let
        # TutorialDirector reload the checkpoint and resume us there.
        result = Result.RESTART
        break
    # Nothing to undo: just re-show the earlier step in place.
    fi = target_fi
    continue

The buttons themselves also got a pass: they are now half the width of the tutorial bubble and as tall as the Skip Tutorial pill, with icons, sized for a thumb on a phone screen rather than a mouse cursor. When only one of Back or Next is usable, both still keep their fixed left/right slot instead of letting the visible one stretch to fill the row, so it is always obvious at a glance which button does something.

A couple of rounds of playtesting turned up two smaller issues in the same area, both now fixed: a terminal handoff step in stage 1 timed out instead of offering Back/Next, and the tutorial bubble could render underneath the Skip Tutorial pill instead of avoiding it.


Iron Curtain: one prompt instead of three choices

Katyusha's Iron Curtain used to ask three things when you triggered it in queue mode: activate now, queue it for later, or cancel. In practice the queued version behaved identically to activating immediately, so the extra choice was just an extra tap for no payoff. It is now a single "Activate Iron Curtain now?" Yes/No prompt. The now-dead queue plumbing (a field on the queue-plan data, a three-choice confirm dialog variant) was removed along with it rather than left around unused.


Auto-attack now respects enemy movement

The most consistent player complaint has been auto-attack chaining through multiple drones in a single tap when some of those drones are mobile. The chain is fully deterministic under the hood, but from the player's seat it can look chaotic: kill one drone, and suddenly a patrol two tiles away has drifted into range and gotten hit too, with no visible decision point in between.

The fix: auto-attack now snapshots every drone's cell right before each shot, and checks that snapshot again right after the shot's reactions and drift resolve. If any drone moved, the chain stops there and hands control back, rather than continuing into a target the player has not had a chance to see coming.

var pre_positions := _snapshot_drone_positions()
var still_alive := await _do_single_attack(attacker, target)
...
if _any_drone_position_changed(pre_positions):
    break

Queue mode needed no special-casing here: drone drift and pursuit are already deferred until the whole queue finishes executing, so mid-batch attacks correctly see "nothing moved" and keep chaining, exactly matching how queued actions are meant to behave.


Bug fixes

  • Iron Curtain state lost on tutorial rewind: Iron Curtain is a free action for Katyusha, so it never pushed its own checkpoint the way turn-consuming actions do. Rewinding a tutorial step past an Iron Curtain activation left the shield state and spent gauge out of sync with the checkpoint being restored to, stranding the player on a step that told them to activate a shield they had already spent. The free-action path now pushes a checkpoint too, same as every other action.
  • Tutorial step unselectable after rewinding past an action: A "step onto this cell" tutorial step relies on the acting unit already being selected, normally a side effect of the previous action's auto-reselect. A checkpoint restore does not carry UI selection state, so after rewinding, nobody was selected and the step's tap gate only allowed the destination cell, not the unit itself; there was no way to select it and no way to proceed. The tutorial now reselects the hinted unit itself when a step needs it and nobody is selected.
  • Duplicate speaker bubbles that could appear during tutorials are removed.
  • Loading a locked stage: a stray path let the world map (and a debug shortcut) launch a stage that had not actually been unlocked yet. Both entry points now check is_stage_unlocked first.
  • Challenge Mode score submission silently did nothing when pressed (there is no server to receive submissions, and the action log is too large for a mailto link). It now walks you through exporting the log and submitting it manually.
  • Challenge Mode clears now count toward unlocking the next stage, matching a clear on any other difficulty.

Miscellaneous

  • Chapter 1 stage props cleaned up: several decorative objects were adding visual noise without any gameplay purpose.
  • Tutorial button prompts now read "Tap" on mobile and "Click" on desktop instead of one generic wording.
  • New portrait added for Commandant Reiss.
  • GDScript test suite: 874/874 passing.
  • Python solver test suite: 526/526 passing (17 skipped).
  • Build 71 shipped to Steam (demo and full), Google Play, and web.

Most of this entry is one theme wearing different clothes: state that the game already tracks (checkpoints, drone positions, selection) being read more carefully before letting the player or the AI take the next automatic step. The tutorial rewind and the auto-attack change both come down to the same question, does anything look different than what the player last saw, and if so, stop and let them look again instead of assuming they are still following along.