2026-08-16 To Type a Tale devlog
Chapter 3 progress and minor overhaul to word/letter banks
published: Sun 16 August 2026This devlog series's purpose is twofold: to keep alpha/beta players up-to-date on what is happening with the game's progress, and to give fellow indie devs a peek into how I work through dev challenges. What I realized today is that I haven't detailed how I make these devlogs, which is apparently something that other indie devs struggle with. So I'll give a quick summary in this devlog entry.
First off, I use git to store all of my code, art assets, music, marketing material, and even these devlogs. If you aren't using git (or some other VCS), you need to start now. In particular, I write detailed commit messages about all of my changes (which you can see in the Raw Git Log section). Each Sunday, I pull up a list of the commits I made during the past week and paste them into a new devlog entry. I then prune any minor commits or other bits I don't feel like talking about, summarize the rest into bullet-points, and then organize those bullet-points into 4 categories: frontend, backend, scripting/modding, and writing/story. Finally, I put together an intro paragraph summarizing the largest bullet-points, translate each of the categories and their points into prose, and write a final paragraph about future plans. The final step before uploading to the 3 different fronts (personal blog, Steam, Itch) is coming up with a one-liner description of the devlog entry ("Chapter 3 progress and minor overhaul to word/letter banks" in this case). Condense and expand.
This Week's Post
This week was primarily focused on chapter 3, but with a few minor changes to code to make that writing easier.
Chapter 3 is coming along nicely, with both the intro (and its small side-story) and the first half of the chapter (the "encounter" with the aliens) almost complete. Next week will likely see chapter 3 to about 70-90% completion.
I also realized this week that I forgot to include a snippet from chapter 2. I had planned to include a passage from each finished chapter as I finished it, so here you go:
You enter Duuba's Necessities and glance around while you wait for the clerk to finish with her task. Setting her melter-pen down, she stands up and turns to you. You're not sure what you expected, but mouth agape in horror is probably not it. "You're filthy! Did you just pick a fight with a kroak?!" You shrink back at the overwhelming anger and disgust in her pheromones. Flashbacks to your days in basic training crowd your mind. "Out! Out, before you ruin my commissions! Vagabonds like you should at least have the decency to wash before barging in where you don't belong!" You're about to correct her that you're not a vagabond, but you're hit with another wave of anger and disgust. You emit complicity and bob your head as you blindly stumble backwards out the door and back into the street. She slams the door shut after you and glares through the porthole window.
In all your haste to get some respectable clothes, you forgot that you look absolutely horrible from the crash landing and day of trudging. You'll take her advice and go to the public wash before anything else.
To improve writing efficiency in later chapters, and to bring back the inter-chapter carryover of word/letter counts, I reworked both how they are stored and how they are checked. "words" and "letters" items continue to track how many of each have been collected, but there are now "story_words" and "story_letters" items which track the total of how many of each have been encountered so far in this playthrough, across all chapters. This allowed me to add a special case to ifreplace (and other conditional text commands) where the words and letters items can be compared to a percent instead of an absolute amount. So words>=80% will now only evaluate to true if you have typed 80% of the words you have encountered in the story. This gets rid of the combinatorial-explosion problem and makes it easier for me to see at a glance how difficult a condition is.
While I was adding the story counts, I decided to also remove the BPM counts, and instead move them into memory only. This means that WPM/LPM values are now reset whenever you close and re-open the game, but they now carry over between stories/chapters/menus. This is largely because I don't use BPM for any in-game checks anymore, but still want to keep it around for fun.
Chapter 3 has had several very violent passages added, so I don't think the story is very appropriate for younger children anymore, but I still want my niblings to be able to play through the first couple chapters. To encourage my sisters to allow that, I've added an option that disables clicking, which means that my niblings will have to type their way through the story, making it "educational."
Next week is mainly going to be about chapter 3 progress, though I have plans to add a high-scores page and some other conveniences. I'm also going to start prototyping my next project(s). I have a few ideas for that, so make sure to join the Discord server to give your opinions on the alphas once I start posting them.
Raw Git Log
- writing: suggestions from WiW
- expanded ifreplace to have multiple conditionals
- I frequently find myself with a need for an if-elseif-else conditional, so I have expanded the ifreplace command to accept an arbitrary number of arguments, rather than exactly 3 or 4; these new arguments behave similarly to ifreplacelist, but only the first true conditional is considered
- also changed the ifreplace to use the same param order as ifreplacelist and storereplace (i.e. first param is target string)
- rewrote all tiacs to use the new style
- rewrote the multi-ifreplace parts of ch2 and ch3 to use a single ifreplace instead (much cleaner)
- updated modding documentation with the new param details and also added some additional examples for ifreplace
- writing: forest entrance to hostile encounter
- writing: removed choice costs from crin-tale
- I had previously included a way to have certain choices cost words or letters; however, I never figured out a good way to signal this to the player, either before or after the choice was made; additionally, the original intent (removing resources via one optional choice to prevent future optional choices) just doesn't work with how the story is now structured
- removed the word/letter cost from the 4 places I had it in the crin-tale story
- the code that allows this cost will remain, but will also remain undocumented until I have a better way to signal to the player
- writing: first ambush SS setup and first result
- writing: fixed invalid commands
- added option to disable clicking
- default behavior is enabled, allowing clicking, but educators/parents might want to disable it to force a player to type the words (i.e. typing practice); the story isn't really appropriate for children, but that's not my call to make
- overhauled how words/letters are stored and checked
- removed BPM from persisted inventory and instead only calculate it on a per-session basis, but without resetting between stories
- reverted the "reset words/letters to 0 on chapter change" logic from a previous attempt at this
- added "story_words" and "story_letters" items which track the total number of words/letters encountered in the story so far
- added special logic to the inequality evaluator to look for quantities with a percent-sign at the end; if it's there and the item being compared is "words" or "letters", it calculates the quantity's percent of the total story words/letters so far and compares to that instead; e.g. "words>=50%" will evaluate to true if 50% of the total encountered words have been typed/collected so far
- this not only allows me to keep the word/letter count between chapters without combinatorial explosion, but also lets me gauge at a glance how difficult an ifreplace is
- fixed a bug in ifreplacelist that I somehow hadn't noticed yet, where it was building a double-size array
- reworked chapters 1-3 of the crin-tale to use the new percent-based word/letter inequalities
- updated the mod documentation accordingly
- writing: finished first ambush SS
- writing: added first two resolutions to second encounter SS
- unfortunately, also had to remove a big chunk of writing from the first encounter SS because it was technically impossible; Feeris can't both be in the party and not in the party at the same time
- writing: finished second encounter SS
- fixed minor issues found in QA
- if user manually changes from fullscreen to windowed or vice-versa (using window manager rather than game options), the value was not being remembered; fixed by adding some logic to _on_viewport_size_changed
- doc-key in sample mod's custom challenge definition was incorrectly placed in the actions dict, causing (inconsequential) errors each time it was loaded
- realized I referred to the pheromones as "psychic" in the first chapter, when later chapters make them physical, so removed the word "psychic"