Adorabullet

Join Rae Stellaris in an epic quest through the cosmos in this cutesy, Game Boy-inspired bullet hell 

Contribution:
Movement - Combat - Enemy - UI - Systems

This game was created for the gameboy gamejam (GBjam 11).

I worked together with 5 friends to create a game that looks and feels like a gameboy game.

In this game you fight enemies in a bullet hell inspired by arcade games from the past and touhou.

Adorabullet was well received by players and although there weren't that many ratings, the comments and overall score are very positive.


Itch links:

Game page:
https://noonecrs.itch.io/adorabullet

GBJAM11 entry page:
https://itch.io/jam/gbjam-11/rate/2281015

Engine

Godot

This Game Jam took place right after Unity's 2023 statement about the new controversial costs per re-install policy they initiated for every Unity game that reaches $200,000 in annual revenue.

Due to this decision the community was in an uproar and although Unity is still viable, this action reminded me that companies for these engines have a lot of power over their costumers, which is why I thought it might be a good idea to get familiar with more engines and try new things.


Therefore, during this gamejam me and my team who I made the game with made the decision to use Godot for this project.

We went for the dotnet supported Godot, as we were most experienced with C# and this version allowed us to script in C#.
though, we also made use of Godot's GDScript and learned quite a lot from it.

Player (programming)

Shooting

Shooting and defeating enemies is one of the main mechanics needed for a bullet-hell arcade shooter.

Shooting for the player is quite simple, and to prevent the player from having to spam or hold a button to shoot, I thought it'd be better for the player to shoot automatically since this would be a task the player would have to do a lot, and it would save us a button for something else, like the use for bombs or powerups as a gameboy only has 2 face buttons (excluding the d-pad and start/select button)

Heatlh system

I created both the health system for the player and the enemies in the game.

The script for the player to take damage is quite simple, when the bullet collides with an object with the tag "player" it tells the player to take "1" damage, which then runs the takedamage function in the player node. it checks if the player isInvincible and returns if that is the case, if not, it runs the rest of the code, which subtracts the damage from the players health and updates it in the UI. If the player has no more health after this subtraction , it runs the PlayerDies function.

and at the end it runs an InvincibilityFrames function which prevents the player from taking damage right after the player has been hit.

The same kind of functionality exists for the enemy, the bullet of the player hits the enemy, the enemy runs the _take_damage function which checks if the enemy is spawning, if it is it shouldn't take any damage so it returns, otherwise it takes damage, and flashes white for half a second to indicate it took damage. and if the health is equal to or is below 0, it dies.

A team member created animations for the enemies exploding, which I added in as well.

Enemy wave system

I created and designed the 1st level, 2 bosses and the spawn system for the enemies

Level 1 (enemy waves)

First, I made it so that the enemies have specific types that shot different bullets instead with the use of enum and making it so it's all contained in 1 script, that we we can easily and dynamically change the enemy script using specific node.

I then added spawn points to the level, which I could then use to position where the enemies would spawn.

Lastly, i added the spawn points and the enemy packeges to the level script so that they can be called and used when neccesary

Spawning a new wave works as following,

On start-up the check current wave function runs and spawns the first wave as the int "currentWave" is 1 by default.

When the game cannot detect any enemies in the scene anymore, it adds 1 to the currentWave int and runs the function again.


In the spawn wave function it checks the integer given by the check current wave function and passes it through a switch case, which spawns a specific enemy at specific spawn point using the spawn enemy function I made, which has all the spawnpoints and enemies and then instantiates them.

My roles

During this project my roles were:

Tools used