Game Progress Report and Making a Monster in Godot Engine
EDITOR’S NOTE – 7.22.23: There is no AI art or AI assets being used in the game! This is an old article where I talked about using AI generated assets in an earlier version of the game for 3 of the boss fights. I’ve since changed my mind on AI art due to concerns with data privacy and I have removed all AI assets from the game – more can be read about it in these blog posts HERE, HERE and HERE . I’m still leaving this article up as I want to be transparent and I think it’s interesting to have a record of the evolution of my thoughts and process I went through while making the game.
12.4.2022
Happy holidays everyone! I’m back with a new developers blog post for the upcoming Lair of the Insect God video game. This month I’m going to be talking about a new boss fight I recently finished (for now I’m just calling it “Bat Boss”) and then I’m going to go a bit into how I go about creating boss fights.
What is This Bat Boss You Speak Of?
SPOILER ALERT – I’m going to go into the ins and outs of this boss fight including how to defeat the boss – skip ahead to where it says “END OF SPOILERS” if you don’t want to know.
How I come up with ideas for enemy types and boss fights is kind of random to be honest, ultimately it just boils down to “something popped in my head so I tried to make it.” For this specific boss fight I had an idea that popped in my head of having a scene where the player was constantly sliding down a wall and had to keep jumping off the wall to attack a flying enemy. This idea was largely inspired by a Dungeons and Dragons game that my wife Josie once ran where she had us do an entire fight scene while free falling off a cliff.
I like boss fights where there’s a bit of a gimmick to it and I am trying to structure most boss fights so that the player is doing some kind of non-standard action or having to take a special tactic in order to most efficiently dispatch the boss. This idea seemed to fit the bill.
Why a bat? I don’t know – cause they fly? And are scary looking I guess? The script to the game hasn’t been written yet, I’m working on it! Anyway, the basic structure of the fight is that you start by jumping down a long corridor where you infinitely fall/wall slide. As you wall slide/fall the Bat Boss appears and starts shooting different types of projectiles at you. The Bat Boss also has several glowing orbs that encircle it. For the fight, the player will have to jump back and forth between the walls of the corridor while striking the orbs. Once all the orbs are destroyed the player will then be able to attack the Bat Boss directly, killing it after doing enough damage. Once the Bat Boss is defeated, the infinite falling will stop and the player will drop out onto the ground where a new corridor will lead him out of the scene.
Each boss fight in the game will either unlock an ability or do something to progress the story of the game. In this instance, the Bat Boss will unlock the ability for the player to do a “Fire Slide” – which does an aggressive slide attack and ignites a trail of fire behind the player that does additional damage to whoever steps in it.
How Was Bat Boss Constructed?
Up until a few months ago most animations, bosses, characters, environments, etc. that I’ve made for the game where made with a combination of videos/photographs I took and public domain/stock photos I’d find on sites like Unsplash.
The stock images/photos/videos is still how most things are being made in the game, but for this one I started playing around with the DALLE-2 AI image generator.
For the Bat Bass I entered multiple queries into DALLE-2 asking for photographs of “monster bats” or “screaming bat faces” or “monster bat wings.” I then took those images and photo-shopped together the final monster with bits and pieces from each image. I then took the final monster photo I had and animated it in After Effects.
Making the Bat Boss in the Godot Engine
Once I had all the animations exported and plugged into Godot, the big challenge appeared – making the whole boss fight function in the game. Luckily, I had already implemented everything I would need on the player character a while ago (jumping, wall sliding, attacking in air, taking hits, etc.), so the only real concern here was the Bat Boss character and the level the player will fight the Bat Boss in (both of these things are called “Scenes” in Godot – this can get very confusing, as everything in Godot is basically called a “Scene”).
Getting Mr. Bat to fly around, shoot at the player and take hits wasn’t too difficult for me. At this point I’ve made 8 boss battles and 7 standard enemies, so I’m relatively comfortable at coding out and setting up the fights – even when it’s a flying enemy, which does add some layers of confusion (luckily the Bat Boss doesn’t fly around any objects in the fight which is a NIGHTMARE to do – maybe more on that in a future blog post).
The really difficult thing to figure out was how to keep the player “falling” the entire time. Have the wall keep auto-generating? Build a really giant level where you drop for like 5 minutes? All these seemed to be less than ideal scenarios due to both trying to figure out how to build it and also over concerns about how much Memory/Ram would be used up.
So ultimately I decided the best approach was to not have the player fall at all.
In Godot there is a type of object (they call them “nodes”) called a Position2D, which is basically just a cross hair and will mark its position on the X/Y axis’ wherever it is placed. So I built an actually somewhat small corridor to fall down and put a Position2D smack in the middle of it. I then coded out in the battle stage scene script that if the player is wall sliding down the corridor and the Bat Boss is still alive, they will stay in place on the Y axis relative to the placement of the Position2D. Once the Bat Boss is dead, the script shuts itself off and the Player falls the rest of the way down to the ground.
To give the “illusion” of constantly falling I went into my old friend After Effects and just whipped up a short animation loop of the wall zooming past. So when the player drops into the “float zone” (as I’m calling it) the animation starts and the script fires telling to keep the player in position on the Y axis. Once the Enemy dies, everything shuts off. The scene script is able to identify when the Player has dropped into the float zone with another type of node called an “Area2D” – which basically just identifies when things have entered or left a certain area in a scene.
There’s also what I’m calling a “damage bumper” at the bottom of the screen during the fight which will bounce the player back up if they mess up while jumping in between the two walls while wall sliding – however it causes a little bit of damage to the player. The idea here being that I want the player to try and keep wall sliding and jumping back and forth between the walls during the fight. The script for keeping the player in place only fires when the player is wall sliding as well, as it made the fight too easy if the player just floated next to the Bat Boss and spam mashed the attack button.
And that’s the fight!
END OF SPOILERS
Making Monsters
Boss fights can be a lot of fun to make, but they take a LOOONG time compared to standard enemy fights – usually it takes me about a month to a month-and-a-half depending on how complicated things are. A lot of this is due to the fact that in a lot of boss fights I have to design and code out the level that the boss fight is taking place in (particularly if there is something special going on with the level while the fight is happening like there is in this fight). Another reason is that the bosses I’m making tend to have multiple “stages”, which means they’ll change their tactics and attacks the more damage they take.
My intention currently is to have 16 total boss fights in the game – a combination of both mandatory boss fights (which the player will have to do to progress the game) and optional boss fights (which can be skipped, but give special abilities and boosts). The optional boss fights will typically be hidden throughout the levels of the game and the Player will have to find them by exploring. I’m doing this as well with the puzzles that will be in the game (also a combo of mandatory and optional puzzles).
Right now I’m done with 8 boss fights and have started work on the 9th. I have ideas for the rest of the boss fights except for 1 or 2 of them. I’m reserving the right to call it if I can’t think of anything interesting with the last 2 boss fights and just maybe make the player fight a bunch of standard enemies or bring an already defeated boss back for a second appearance. I’d rather not do this (and right now I’m confident enough to think I’ll be able to make the full 16), but if I can’t think of anything interesting to do for a new boss fight, I’d rather just cut it.
Next up is robo-boss which is underway!
If you want to see the Bat Boss fight in full check out my personal Instagram or TikTok where I posted the video of it! (@dasegad)
See you guys next time!
-Charles