2026-08-23 To Type a Tale devlog
Achievement hints and interrogations
published: Sun 23 August 2026This week saw the completion of the encounter side-stories in chapter 3 and the beginning of the interrogation sequence. I also added a few debug tools to help with checking my work on the more complicated parts of the story.
The final encounter side-story — waiting in the trees for the third hostile — has been completed. It has the first and probably only bad end where you don't actually die. There will be an achievement for it, as it is quite difficult to pull off. The other extreme edge-case in the encounter side-stories happens at the end, when you're prepping to return to the HIA. I won't spoil it, but it effectively requires you to make both really good choices and really bad choices at the same time. And yes, there will be an achievement for this one (I'm thinking of calling it "You looked up a guide for this, didn't you?").
The interrogation sequence is somewhat similar to chapter 2's hub-and-choice system, but with a twist: after each question, you can be interrupted by one of your teammates requesting a turn. If they're too rough, the responses you get to questions will change and you might even lose out on asking any more questions (yes, I am planning achievements for both "minimum questioning" and "maximum questioning").
Scripting has also just seen a significant improvement: I've added strict inequalities, equality, and non-equality to the conditionals! This means that "ifreplace" and such can now check greater-than without also allowing equals. That may not seem like much, but combined with the ability to use the inventory for the compare quantity, it means I can now check if one item is greater than another. This was effectively necessary to the incredibly-difficult achievement at the end of the encounters.
The backend saw two minor improvements: the RESTART_CHAPTER change command now works properly with the first-restart message, and I added a debug tool to check text-generation coverage of stories. The former was previously impossible because there was no way to communicate between the requesting chapter and the restart message, but I managed it via a story-progress variable. Not the cleanest solution, but it will do for now. The debug tool is slightly more exciting in that it will allow me to make sure I cover all of the possible conditional values in the very complicated chapter 3. That chapter has several paragraphs where the text commands are longer than the paragraph text itself. The debug coverage tool means I can make several runs through the chapter and then check which conditional values I haven't covered yet. It's not perfect or polished, but debug tools don't need to be.
Next week will hopefully see the conclusion of chapter 3 and the start of chapter 4. I'm running a bit behind, so I won't make my end-of-August game completion goal, but it should still be finished in the first two weeks of September. Once it's finished, I move on to marketing!
Raw Git Log
- fixed some orphan nodes
- I got tired of the "orphan node" warnings that pop up every time I close the exported game, so I tracked them down; at least some of them were due to Paragraph objects being created but never parented, so I added an "InvisibleParagraphs" node to act as temporary parent when they're not on-screen
- there are still two warnings that pop up about RefCounted objects, but I have not yet figured out how to make them go away
- also dealt with freeing the animation paths once they're done animating (e.g. fly-to-bank)
- also fixed an extreme-edge-case bug where triggering a words penalty before any words have been collected resulted in a bad-index lookup; this was due to Godot's modulo operator retaining the sign of the dividend, rather than my expected behavior of always being positive
- writing: start of third encounter SS
- also edited the previous encounter SS endings to mention that these are not crin, so that I don't have to keep replacing text based on whether you previously spotted them
- reworked chapter-restart to allow first-restart message
- previously, if you had not yet seen the first-restart message, using a RESTART_CHAPTER change command would instead restart you at the beginning of the story, rather than at the requested chapter; logic has been altered so that using a RESTART_CHAPTER and then viewing the first-restart message will still put you back in the requested chapter
- this involved adding a "restart_to" var to StoryProgress, reworking the logic in Story.reset_progress, and slightly tweaking the Main._execute_change_command logic (so it doesn't try to double-load)
- during the debug for this, I discovered that there was a bug with the logic for determining if the scroll should open/close or just scroll; this was due to Godot arbitrarily undoing the custom names I set for Paragraphs, so I had to use an alternate method to check for those specific node children
- added DebugState for testing new chapter-restart behavior
- writing: finished third encounter SS and trip back to Atrion
- added debug buttons for quickly resetting story/chapter
- added debug tool for determining tiac covered stats
- I needed a tool to determine how much of a tiac's possible paragraphs and paragraph forms had been generated and displayed, so I added logic to the ParagraphGenerator and ParsedTextCommand objects which track whether the ParagraphGenerator has had generate_text called and which conditionals in the ifreplace and ifreplacelist commands have evaluated to true; this is not perfect, but reaching 100% of this coverage should be enough to evaluate if I have any odd verbiage based on inventory
- added buttons to DebugWindow for generating said covered stats (pops up in a window and gets written to a file in user://analyses) and for forcing the GeneratedParagraphs to write out to user://records (so I can rapidly run through various choice paths and then review the text later)
- enabled strict inequalities
- I ran into a situation in ch2 that would benefit from strict inequalities, and the inequality eval is safely contained in util, so I figured I'd finally implement strict inequalities
- all combinations of "<", ">", and "=" are now supported, which also enables checking for equals and not-equals
- writing: tweaked the encounter ending to use strict inequalities
- writing: set up interrogation intro and sections for each teammate