2026-05-17 Type It All devlog
Tutorial and huge internal rework
published: Sun 17 May 2026Looking over my commit logs, I have no idea how I accomplished this much in a week. The big items you'll notice are the addition of a tutorial story and the second rough draft of music for chapter 1. However, what ate up most of my code time this week was a huge rework of how text is communicated between the main driver and chapter objects.
Starting with the tutorial: you now start with a tutorial. It's fairly quick, only 14-15 paragraphs long (depending on 1 choice), skippable, and walks the player through the basic interface conceits, such as typing blue words to change the onscreen text or perform other actions. The tutorial can be reached from the main menu story-selection sub-menu if it is skipped. The game will eventually start with a "welcome message" before the tutorial is displayed, but this should be good enough for now.
The second draft of music for chapter 1 was intended to be "forest" themed, but I think I ended up with "winter wonderland" instead. Since then, I've been listening to some forest-themed and Celtic music and getting ideas for how to improve. I'll also hopefully get my dad to help identify the instruments in said songs, which will speed up progress.
The options page also got a big rework, with settings now having their own sub-pages where the user can select the specific option value they want, rather than incrementing through them. The story-resets also got their own sub-pages in anticipation of some work I'm going to do on adding meta-progress to stories. The "set instead of increment" change was prompted by a request from Squish and I have to agree that this is much better. She also suggested adding font sizes and that's in the options menu now, too.
Lots of other, smaller changes have been made to improve the player experience. Fuzzy searching has been improved in reliability and has allowed me to change the collection behavior so that more text is collected, rather than just the first matched string from a random section. And if that still isn't enough and there's an annoying loose letter, you can now click individual letters to collect them! To prevent the "collect all matches" behavior from becoming an exploit, I've also set a threshold limit on matches so the user can't just slowly type the alphabet to collect all on-screen text. Red, spiky challenge words can now be "defused" by typing the words on either side of them, and can also span two words. Later challenge words will require other defusing techniques. Resizing the window no longer erases any typing progress you've made. Unfortunately, it still gets erased when entering the menu and returning, but I've already got ideas on how to prevent that particular annoyance.
That's all of the user-facing changes, but I also made my life easier by adding a bunch of writing improvements. I've added !ifaddinventory, !loadmusic, !pagebreak, !storereplace, !markstorycomplete, and LAUNCH as text commands this week. Most of those are EWISOTT, but a few demand some clarification. !ifaddinventory conditionally adds an inventory item, which is primarily useful for setting up future !ifreplaces. This was practically necessary for chapter 2's hub-and-spoke design. !storereplace and LAUNCH are used together in the tutorial (and will be later used in a sub-menu) to allow launching the appropriate Steam/itch.io/Discord links in a browser to report issues or feedback.
I also finally got syntax-highlighting working for my tiac files in Vim! I can now see exactly how much of my text is commands versus raw, displayed text. Having seen that, it's now clear how much more complex chapter 2 is than chapter 1.
Some minor updates to the other file types include tias files now allowing custom resource descriptions, which automatically get the default description appended (e.g. "LPM" can be changed to "dex", which becomes "dex (LPM)" in-game). MusicGroup (tiam) files can also now specify the tempo. I still don't know how to include the signature in my calculations for seconds-per-measure, so I'm omitting that for now.
Finally, we get to the code-only changes. Some minor refactoring was performed to DRY things up (especially _execute_change_command, which was getting quite messy), but the big change was how the main class and chapter objects communicated about the paragraph text. Previously, chapters would just build a huge string for all of the paragraphs that could be displayed on-screen and then passed that to main, which would build all of the necessary letter labels and manually place them in the right sections. Now, chapters take each paragraph of text and put it in a special Paragraph object which handles building all of the labels, putting them in various Control containers to arrange them, and hooking up all of the collected signals. This means that letters, words, and paragraphs now handle their own collection logic, challenge defusing, letter greying-out, etc. This was a major headache to implement, involving roughly 20 hours of work (in only two sittings, because I'm insane), but it has been very worth it. All of the code cleanliness from this has enabled much faster development on other tickets.
I only have 5 tickets remaining in the "demo" milestone and two of those are "create music." I still need to put together the marketing materials (gameplay video, screenshots, store page description, etc.), but I hopefully won't get too sidetracked next week before I get around to those.