2026-08-02 To Type a Tale devlog
Challenge rework complete
published: Sun 02 August 2026This week was all about implementing the other three challenge types that I had planned. Rather than hard-coding them, I decided to rework them to be more dynamic.
The biggest change is that challenge types are now defined using a JSON file (similar to stories, achievements, and music). The JSON specifies the color(s) of the capsule, its animations, and how it reacts to various player actions. This JSON specification is much more complex than the previous ones I put together, bordering on a scripting language, so the documentation was also similarly complex. However, I managed to add all of it to the modding documentation, so you can view it and create your own challenges!
To accommodate the new ways of defusing words, I added some logic to Words/LetterLabels to deform the letters of "trigger" words. I'm not sure I'm quite happy with how they turned out, but I'll wait for feedback before tinkering with them more. This deformation not only affects the trigger words of ghost challenges, but also spike challenges, which should hint to the player how to defuse ghost challenge words.
Unfortunately, I ran out of time to fully implement the shader effects for the other three challenge types. So while their logic is complete and they are playable in mods, they don't have any effects other than their base colors. I should be able to knock out the shader effects early next week.
Another new feature of the challenges that you can witness now is how penalties are handled. Previously, when you typed a spike word, a red overlay popped up with the text "-100 words" and that was it. Now, a bunch of words (either recently typed or randomly generated) will fly out of the bank and down off the bottom of the screen. The overlay will still pop up, but the text has been modified to be dynamic and to use the story-specific terminology (e.g. "-100 gaseous fuel"). I also added an outline to the text, to make it easier to read.
On the story side, I completed the negotiation side story for the linguist and I'm almost done with the administrator and engineer. Next week will likely see me starting chapter 3.
The only remaining major code task is implementing Steam achievements. I have a few other optional features I'm hoping to add before go-live, but they'll be put on the back-burner until the Steam achievement unlocking logic is complete.
Raw Git Log
-
writing: intros for remaining negotiation side-stories
-
writing: intro to Barrifon
-
writing: finished linguist and began administrators
-
challenge rework
- reimplemented challenges in a dynamic form
- challenges (including the keyword for placing them in tiacs) are now read from a json file that can specify appearance and their reactions to various actions on the player's part (details will be placed in mod documentation)
- note that the animations/additions for the non-spike/non-pulse challenges (and trigger words) are not implemented yet, so they just have their base colors
- ChallengeManager handles accepting actions from other parts of the code and passing them to the appropriate ChallengeCapsules
- main sets the active capsules based on which paragraphs are visible
- ChallengeManager also handles the timers for ChallengeCapsules
- Word has been reworked to initialize a ChallengeCapsule instead of a basic ColorRect, passing off most of the appearance code to that class
- ChallengeCapsule handles reacting to actions by performing the logic for each of the effects that the Challenge specifies
- several global signals (word defusion/activation, command word trigger, and penalty trigger) were added and handled by main
- re-added the trash logic to main and implemented having words/letters fly off to the trash, based on the penalty; letters are randomly generated, but words pull from the last 100 you've typed
- the error overlay now shows what was subtracted; unfortunately, this only works if a single penalty happens (SHADOW causes two penalties in a row, so only the latest shows)
-
also
- cleaned up capsule shader in preparation for adding the new features
- changed how challenge changes during the game affect the GeneratedParagraph output; should be more accurate now
- changed how Word/LetterLabel handle collection, so it is a bit more consistent (namely, Word no longer emits
collectedwhen settingalready_collected) - changed Word "dark background" to be dynamic based on Challenge's luminance
-
updated modding documentation for challenges
- add a sample custom challenge to the sample mod
- updated the sample mod's documentation for Word Commands (now called Challenge Words) to document the various actions/effects that are possible
-
implemented trigger word deformation
- trigger words now have a per-label deformation to indicate they are trigger words; this takes effect regardless of whether the trigger words are neighbors of the challenge word or a random other word in the paragraph, which will hopefully hint to new players about the nature of other challenge words
- possible deformations currently include: smaller font, larger font, faded color, RGB color, or outline
- if the word is short (4 or fewer characters), a more extreme version of the deformations is applied, to make it easier to spot
- trigger words now also revert to normal words when typed or when the challenge capsule is deleted
-
trigger limits now actually apply
- when attempting to generate trigger words, the range specified in params 2 and 3 now actually affect how many are generated and required (as specified in the documentation already)
- moved pre-collection call after the display action in main, so the trigger words can be generated before pre-collection (which would prevent any challenge capsules in completed paragraphs)
-
fixed minor issue with story completion
- markstorycomplete was being processed before the final paragraph object was generated, leading to the last paragraph being left off; fixed by moving the handler after the object generation