Devlog: Upgrade to Godot 4.4
Added 2025-11-30 05:03:29 +0000 UTCMy goodness, my job hasn't allowed me to work on the game for almost three months. If my country had decent freelance tax laws CowHammer would be finished by now! But whining solves nothing, I must work harder. Yesterday I got a few tasks done, some mayor, some trivial:
The code for the Sheerk Prairie level needed some proper documentation - and was way overdue for that. Never let your code sit undocumented for long, that entirely defeats its purpose.
There were a few calculations regarding the treetop village of Vecino Forest that I forgot to comment on the code. The numbers were already where they had to be, but the calculations themselves are important in case I ever need to adjust them.
I wanted to make checkpoints visible so the player can see where to go to activate them and where they'll respawn if they die. Diegetically, they shouldn't be visible at all, since respawning is explained in-game as related to time-travel shenanigans, but games are games, sometimes we have to do things for playability's sake.
So the friend who's helping me with design decisions proposed that we go ahead and make them æsthetic. Checkpoints will be marked by statues of Queen Cornia, changing colors when the player approaches to display whether they have been visited before and which one is the current respawn point:
Checkpoint statueAutomatic color change is already functional, but now I have to make each statue signal its position so it's stored as the current respawn point - more about that issue below. By the way, I made that whole thing in just a couple of hours. I do love 3D modeling.
I wanted to experiment with 2D animated cutscenes, so I can properly show off my artwork in-game, but I just can't get the hang of how Blender does it, it feels extremely unwieldy to me. I presume I could get used to it with enough practice, but that would just delay the final product.
And, honestly, I can make 3D animations work just fine, with the added benefit of them including whatever skins the player has chosen to wear. Wanna see the heartbreaking bad ending while Dame Ternera is wearing a clown outfit? With real-time-rendered cutscenes, you can!
And I finally upgraded to Godot 4.4. It wasn't that hard, I'll just have to adjust the font size of dialogues for some reason and now I can play animations starting at random frames. But I also found an issue that, while very minor and easy to fix, irks me quite a bit: Godot 4.4 now complains if signals are global - specifically, if they aren't used by the class that declares them.
This is objectively stupid. It entirely defeats the purpose of a messaging system whose entire point is decoupling code: if I need to know which specific object declared a signal before I emit it, then why would I need a signal at all? I can just call the object's response function. In most cases, I just added an "ignore warning" label.
My signals need to be global, there's just no way around it. It's the correct way to program. I teach that for a living, dammit.
And last, I've been debating my shaders over at the Discord server. Currently, both exit and entrance gates use vertex colors, but need different shaders since the former are white (additive) and the latter are black (multiplicative). I think it would be better to have a single shader handling everything, so each level structure has as few shaders in it as possible.
The easiest way to do this would be to add exit gates in one color channel and entrance gates in another (red and green, for instance), which would even free an extra channel or two (blue and alpha) for other effects, like mixing texture. However, mixing textures would require two separate sets of UV coordinates and I have no idea if that's even possible.
Technically, Godot allows meshes to have lots of auxiliary data channels, I could research that and even keep the original channels to add actual vertex colors (not alpha, I let textures handle that). That's my current plan: see what's possible to do with Blender about vertex data, otherwise assume that gates will only ever be black or white.
This is a classic design patterns issue: how recyclable do I want my code to be? Is it really worth the effort making it able to do everything at once? The answer is always no. We can have restrictive code when it helps us finish the work, rather than making it perfect while taking twice as long to build. Know your time limitations.