Dungeons of Infinity is a roguelike bullethell dungeon crawler where your objective is to survive 30 stages and defeat all bosses. It was made in 2-3 months using MonoGame Engine and C# as an assignment for AUAS.
I was one of the lead developers and I had many responsibilities, including:
My first responsibility was to create a healthbar for the player, so that the players would know how much hp they have left. This healthbar also grows whenever the player defeats the boss and their max hp increases.
Within this healthbar, the sprite index of the hearts changed depending on the player's current hp. This initially resulted in a few bugs, but it was easy for me to fix them and ensure that the healthbar works properly. If you play the game, you'll see the results for yourself.
My next responsibility was to add new types of enemies to the game. This includes things such as assets, stats (like health or attack) and even animations.
Before I properly began to add new enemy types, I needed to create a few subclasses for the enemy class that was created by my teammate. Below is a UML-Diagram that explains exactly how all these classes inherit from each other. The new enemy types that I added are all subclasses of the Moving Enemy class.
Most of these new enemies differ only in having unique sprites and states, but some of them have unique attributes of their own, like: some enemies can only perform melee attacks, some shoot multiple projectiles at the same time, etc.
But by far one of the biggest of my responsibilities was to create bosses for our game. That includes gameplay design and programming.
You probably already noticed, but these bosses have healthbars of their own. Though they function differently compared to that of the player: instead of consisting of hearts, they look like a rectangle bar filled with red. Whenever the boss loses hp, the bar becomes emptier.
In the game itself, the bosses are just bigger enemies with a lot more health. Originally at least some of those bosses were supposed to have their own special attacks, but due to problems with the code and shortage of time these mechanics were never realised.
That job was something I decided to do myself. Since our game was a roguelike, the game needed to generate new rooms and the player needed to choose where they would like to go. Due to limitations of the MonoGame engine, we were unable to create a true roguelike experience with procedurally generated rooms, but we could give the players an illusion of one. With this room system, the amount and position of doors was different in each new room. This had two purposes: the first was to make every room feel unique and to make it look like the dungeon had an actual structure (as opposed to being one straight line of rooms), making the game more immersive as the result, and the second purpose was to give the player an illusion of choice.
I created a function that generates every door depending on a randomizer. I also needed to ensure that the position of the player and the doors in a new room reflect which door did the player use to enter a room.
While working on this project, I learned to solve problems in a creative way and to implement various design techniques when writing the code, such as Single Responsibility Principle or Dependency Inversion Principle. And while I feel that many things in the game can still be changed or expanded upon, I'm proud of what me and my team were able to achieve.