Since my last devlog I've been focusing on tuning the game mechanics to make it more challenging and give the player more things to focus on.
A couple weeks ago I introduced a new mechanic to the letsbuild community. I got some great feedback, especially on the shape :). If you want to see that post you can check out the link below:
For those of you who didn't see that post, this feature was a result of some player feedback with my last build regarding how easy it was to survive by just holding down the laser. To add an element of difficulty I added a temperature component for the player to watch out for. As you use your laser, the overall temperature of the ship increases. If you don't let the laser cool down you will eventually do damage to yourself. I was very surprised at how effective this mechanic is in later levels (7+).
I wanted to add a defensive powerup for the player have. For this I added a shield powerup that absorbs damage. Early iterations of this had the shield on a timer, but I found that this penalized the player for activating the shield towards the end of a level.
You can see an example of this early iteration in my previous post:
I eventually settled on adding a shield power bar that shows the player how much strength the shield has. Hits on the shield reduce the power. In theory the player can keep a shield up the whole time if they manage to avoid getting hit :)
I spent a considerable amount of time trying to get the shield working. The functional requirement for the shield is
1) Follow the ship
2) Collide with objects
3) Detect collisions and run code on collide
Long story short, I opted to use a RigidBody2D (static) for the shield so that it could 1) follow the ship and 2) collide with objects, however I ran into a problem with the 3rd functional requirement.
Apparently there is a limitation with Godot that prevents RigidBody2D (static) objects from referencing the objects they collide with. The official response I found from github was this was a design choice to optimize the game engine. In most cases static bodies represent the environment and there is little or no reason for Godot handle custom events for collisions. Simply having the objects collide is sufficient 99.9% of the time.
To solve the problem I ended up putting much of the collision logic for the shield into the asteroid which is a RigidBody2D (rigid).
Just like with the shield, I found myself reluctant to pick up an insta-kill power-up towards the later part of a level. I ended up removing the timer component for this power-up in favor of a fuel based system. The player can now see how much energy is remaining for the insta-kill and preserve it between levels.
I found this also made me want to spam this power-up less in favor or burst firing.
I felt like the music might be too much for some players, so I added a key binding (M) to enable/disable music along with a visual indicator to the UI showing if music is enabled.
I still have a few bugs to work out with the laser. Sometimes it focuses on multiple targets (see video for example). Also, I want to add a title & controls screen. I am also considering adding a new type of asteroid that can hurt the ship if it's too close on explosion.
You can download my game via itchio.