Dev Log: 2026-08-19¶
The bug worth fixing first is the one that ends the session, not the one that looks bad.
"Boring" was the wrong diagnosis¶
The most common piece of player feedback on Chapter 1, the free demo, has been some version of "it's boring" or "too much filler." The instinct that feedback points to is length: cut scenes down, trim dialogue, get to the gameplay faster. I tried that on the very first stage as a test and found nothing to cut. The scenes weren't padded, they were just missing a reason to care what happens next.
That reframed the whole pass. The actual question for each stage became: if this chapter were volume one of a multi-part novel series, would it read as a satisfying opening on its own? Not "is the prose tight" but "does the team have a reason they can't just walk away, does the antagonist do anything between her big scenes, does a choice cost something." Read that way, Chapter 1 wasn't overwritten, it was under-conflicted. A cutscene with no filler in it can still be boring if nothing in it is actually at stake.
Giving the team a reason they can't just leave¶
Chapter 1's opening had the crew making planning decisions with no stated cost to not deciding. Nothing was stopping them from turning around. One added line late in Stage 1 closes that gap:
{"speaker": "Katyusha", "text": "This compound has no power beyond what is already draining, and no channel out. Whatever is inland is the only way off this island."}
That's the whole fix: not a new scene, one sentence establishing that retreat isn't actually an option. The same "does the team have a reason they can't quit" check turned up a matching gap in Chapter 3, fixed the same way, and in Chapter 4 the same fix was drafted, tested, and then reverted after independent review found it added a beat the chapter didn't need. Not every chapter is missing the same thing, and "this fix worked in Chapter 1" is not a license to paste it into every chapter afterward for consistency's sake.
An antagonist has to do something between her scenes¶
Drona, the game's antagonist for most of the runtime, only had presence in Chapter 1 at her two biggest confrontation beats. In between, she was narratively silent, which reads less like a scheming opponent and more like a plot device that gets switched on when the story needs her. The webnovel this game is adapted from has an unused chapter establishing her actual agenda: she needs Erika's team to succeed, but that doesn't mean she's on their side, she tests and provokes them the entire way there. Backporting that gave Chapter 1 several small beats where Drona's hand is visible without her being on screen: a burned supply cache before a crossing, framed by Erika as Drona checking whether the team can still function without help, not just harassment.
{"speaker": "Erika", "text": "She is not only watching how we fight. She wants to know if we can still move without help."}
Chapter 2 got a matching pass: a bridge crossing that turns out to have been engineered by cut maintenance cables, not chance. An antagonist who's only sharp in her marquee scenes and inert everywhere else isn't actually functioning as an antagonist for the other 90% of the runtime.
A reveal that was supposed to be a lock releasing, not new information arriving¶
The one outright continuity bug this pass found: Katyusha's Chapter 5 disclosure of Wilhelm's name was written as if the record she's reading were the source of the information, when the character's established mechanic is a classification lock, she has the data the entire time and is blocked from saying it, not missing the data. The fix keeps the same beat and the same line placement, and rewrites what it means:
{"speaker": "Katyusha", "text": "I have been holding a fragment from before the catastrophe: the word Doctor, a designation for someone I was assigned to protect. I have had the name the entire time. I was not permitted to disclose it."},
{"speaker": "Katyusha", "text": "Longer. Something in this record satisfies the condition. I am permitted to say it now. Wilhelm."}
Small wording change, different story: this is a lock releasing on an already-known fact, not a data recovery moment. Getting this wrong once earlier in the same pass (misdiagnosing which chapter had actually drifted from the character's rules, not this one) was a useful reminder that a "the character wouldn't say that" instinct is worth chasing down to the actual source file before touching anything.
By the time this pass reached Chapter 6, the finale didn't need a story fix at all, its structure, crucible, and antagonist payoff were already solid. Two stale quotes in the design document that no longer matched the shipped dialogue got corrected while in there, but nothing player-facing changed in that chapter.
Paying down a translation debt¶
Every English edit above needs a matching edit in the Japanese and German overlay files, they mirror the English cutscene files line for line, not as sparse overrides. That sync got deferred to the end of the pass on purpose (translation is quality-sensitive work, not something to rush through mid-edit), and closing it out surfaced three small bugs that predated this pass entirely:
- A German line used the formal Sie where the game's rule is informal du, no exceptions.
- Drona's name was misspelled in katakana (ドローナ instead of ドロナ) across several Chapter 4 lines.
- One old Katyusha line used a first-person pronoun (私) where her character voice always self-references in third person by name.
All three are fixed now, and a full-game automated scan for the Katyusha pronoun issue came back clean everywhere else, that was the only instance.
Bug fixes¶
- Challenge Mode could freeze entirely on the player-name screen. Closing the name dialog without submitting, whether by the X button, tapping outside it, or the Android back gesture, never resolved the signal the world map was waiting on. The game just sat there. Fixed by making every dismissal path unblock the flow:
closed.connect(_on_modal_closed)
func _on_modal_closed() -> void:
if _resolved:
return
_resolved = true
name_confirmed.emit()
Two more layers went in alongside it: any leaderboard request that errors, times out, or comes back malformed now flips the game into a permanent offline mode for the rest of the session instead of risking another hang, and if the same name gets rejected twice in a row, the game stops asking the server and just accepts it locally rather than trapping the player in a retry loop. - Default music and SFX volume was too loud out of the box. Master, music, and SFX defaults are quieter on fresh installs; existing saved settings are untouched.
Miscellaneous¶
- Upgraded the project to Godot 4.7.
- Android builds now target API level 36 (Android 16), per current Play Store requirements.
- GDScript test suite: 1164/1167 passing (3 pending: sprite assets unavailable in the headless test environment, not failures).
- Python solver test suite: 590/590 passing (17 skipped).
- Build 0.1.6 shipped to Steam, Google Play, and itch.io.
None of this pass added a single new scene. Every fix above is a sentence added, a line reframed, or a beat relocated to where it was already implied, because the diagnosis was never "there isn't enough story here," it was "the story that's here isn't allowed to cost anything." The leaderboard freeze is the same lesson from a different angle: the fix isn't a better error message, it's making sure the failure can never be the last thing that happens.