Kernel Panic Tower Defence
- 7 Devlogs
- 33 Total hours
A tower defence game/prototype inspired by some combination of The Matrix and 90s UNIX systems. The demo may not work on mobile due to low specs
A tower defence game/prototype inspired by some combination of The Matrix and 90s UNIX systems. The demo may not work on mobile due to low specs
Alright, this is a big one
Additions:
Changes:
I added an indicator to show the player’s progress through the level. It also adds a tiny bit of story - you have to hold off malware until a firewall is constructed, and that bar shows you the progress. And I didn’t even build it from scratch - I’m just using the health bar from the enemies! 🤫
Next - a zip bomb enemy that, as the name suggests, spawns a burst of child enemies when killed. It moves very slowly, but has high health - this makes it a great target for the SIGTERM sniper tower, which was previously useless not always the best choice.
Cloaking was my way of trying to spice up the types of enemies the player would have to deal with. Some enemies in a level will now be cloaked, which means they cannot be attacked until they have their cloaking removed by the new ‘defragmenter’ tower.
I wanted a way for players to easily compare the stats of the various towers and enemies, and I also needed something else to add to my pause menu. I decided to kill two pieces of malware with one antivirus quarantine, by adding a compendium. This currently has two tabs, for towers and enemies, each showing you the stats of a tower / enemy when it’s selected. Please don’t ask me how long this took. I don’t want to talk about it.
I also rebuilt the tutorial because it
So I completely scrapped the old system and built a new one
Any suggestions, please let me know in the comments below.
Changes:
Additions:
Plus (as always) quite a few bug fixes
So what is the key feature for any 90s UNIX Linux system? A terminal, of course! And what is a UNIX-themed game without a terminal? So I added a system where game events, such as waves starting, or enemies being killed, are logged to a terminal window at the bottom of the screen. This window can be opened and closed, and has a little coloured pulse around it whenever a new log is entered. The coloured pulse is synced to the type of event (red for ‘errors’, yellow for ‘warnings’ white for everything else) as well. Each message contains some details about the event and a timestamp on the left. This feature was my first time using the richTextLabel, which allowed me to colour the text.
The towerblocker is simple - it’s an invisible tile that can only be placed when the levels are being designed in order to add difficulty or avoid placing of towers offscreen
Any suggestions, please let me know in the comments.
Changes:
Additions:
Plus quite a few bug fixes
The first change in this devlog is the game over screen, which used to look like a boring window with a restart button, but now looks like a crash screen [Image below] that uses the actual system data to display its message, via a template string and an 8 line formatting statement. I am quite proud of this one
Adding mouse support to the menu was, in a word, painful. Because I’d built my own menu system using labels instead of buttons, I had to almost completely rewrite the code to allow for conversion of a Label reference (from one of Godot’s built-in functions) to a child id (which my functions were expecting). And then I had to add some overrides to that so some labels that were not part of the menu system wouldn’t break everything.
The spray of particles from enemies when they die is one of my personal favourite effects in this game, mostly because of what I’ve learnt from it. I made the particles be text based by using a subviewport, which basically is a viewport that doesn’t display anything and can then be attached to a texture to show its contents, in this case, on the particles as they are emitted. I also made the text randomise to a 2 digit hexadecimal value - that felt suitably ‘techy’
One of the smaller features in this devlog is the font change. Instead of using Godot’s default font, I found the font used in the actual GRUB and used that instead. Where did I find this font, you ask? It came directly from my PC - I copied the file straight out of /usr/share/fonts.
And now we come to chromatic aberration which, as it turns out, is easy to implement for the whole screen, but slightly harder to make work for only a single sprite without discolouring the background. After messing around with shaders for a bit, I gave up and just made 2 versions of my enemy sprite (in red and blue) and just physically offset them in code. And it works. And, if I dare to blow my own trumpet for just a second, it looks great!
So, I realised that I’d called this game ‘Kernel Panic’, a very techy name, and yet done little to lean into the aesthetic that evoked. I decided to fix that.
Changes:
This was my first time using config files, so I also got to learn something; Godot’s user:// directory is not the same as res://. A file created in the user:// directory cannot be seen in the res:// directory. From my uneducated perspective, it seemed as if this file (which I couldn’t find in the editor, since that only shows res://) was persisting across runtimes - something non-existent files famously don’t do.
I saw someone else do a ‘quote of the update’, but I was unable to find their username to credit them, so please tell me if you know who they are:
Next plan is to overhaul the game over screen so it better fits with the aesthetic
Made a dictionary of wave information resources in the level.
I exported a dictionary of custom WaveInfo resources in my level scene, and went to add a new resource to the dictionary. I typed in the key, added a new WaveInfo, and clicked Ctrl+s.
My new key-value pair promptly vanished without a trace
And so began the hour of removing variables, re-adding variables, trawling through the Godot forums and generally wanting to set fire to my computer to try to find the problem. The urge that was not improved by the discovery that I’d forgotten to press the button to actually add the key-value pair, and the error firmly existed between chair and keyboard.
Added a resource to allow upgrades to towers.
For those who haven’t used Godot, a resource is a fancy name for a data container that counts the number of other objects referencing it and automatically frees itself when it is no longer needed. According to a quick glance at the Godot docs, creating a custom Resource is as simple as creating a new script that extends Resource and adding a couple of @export variables.
I failed at step one, used the default ‘extend Node’ instead of ‘extend Resource’, and then spent over half an hour trying to work out why it didn’t show up in the inspector.
Lesson learned then?
Not really, because I did the exact same thing again the next day.
First devlog for Kernel Panic, a tower defence game built in Godot.
Here is my progress so far:
Next step - building a tutorial level that explains the key mechanics of the game.