What Is It?
Pyromaniac is a top down 2D Adventure game. In this game you play as a character who wields fire to solve puzzles and defeat enemies. Can you catch the chicken that stole your underwear? Will you make new friends, or burn all who stand in your path? The choice is yours.
What I Did:
I worked to create this game using Unity with a 4 person cross disciplinary team for the Game Design Practices course at UF in Fall 2019. I was the only programmer in my team, so I created every mechanic, system, and scripted event using C#. I worked on the Player Movement, Combat System, Actor AI, Dialogue System and more.
Challenges and Solutions:Since I was the only programmer on the team, I needed to create complex systems while making them as organized as possible to allow further iteration and isolate bugs as I continued development.
Player Controller
I decided early on for the player controller, to utilize animation blending alongside a state machine to encapsulate behavior. Instead of having a separate state for each walking direction, I had a Movement and an Attack State.
The Movement state would read Controller Inputs as a 2D vector while keeping track of the previous input (for idle and attacking directions) and would blend animations using these values. The attack state would handle attacking, and would retain momentum, but disable new movement until the attack animation would stop playing and would support multiple attacks. Facilitating Combat
As the player progressed, they would unlock new attacks to use that would correspond to different buttons. Each attack would have a specified speed and damage. There were two main types of attacks, melee and projectile.
A melee attack would have an area of effect, while a projectile attack would emit a projectile. Projectiles would have their own data for animations, behavior, damage triggers, and would be able to be fired in the proper rotation relative to the player's previous input. Actor AI
I created a simple state machine for Enemy AI along with a simple patrolling system. I made it so each enemy would have a set patrol path set by points that designers could easily modify graphically. I also added a simple field of view which when the player would enter would lead the enemy to start chasing the player with a delay for attacking. To account for a player who would run from enemies, I made enemies teleport back to their patrol path once the player had become sufficiently out of range and the enemies were no longer visible.
Dialogue System
I also wanted to add other features such as having dialogue that we could write in .txt files. To accomplish this I had a Dialogue Trigger and Dialogue Manager class that would parse data from a text file. I wanted to be able to store the names of who was talking as well, so I created my own markdown system where a designer could specify [NAME=Michael] to change the name display in the dialogue box to Michael.
|
Other Features
To add variety to the game, I implemented puzzles in the game such as needing to light torches or hit switches to progress and navigating an ice cube through a group of enemies where the player would have to try not to melt it with their attacks.
I also implemented a rage (blue flame) state for the player where the player would deal more damage, but could hurt friendly NPCs. We used this system to allow for multiple forms of progression where a player could complete a challenge, or burn the gatekeeper to a crisp. I also utilized one main scene for our game world to reduce loading and created portals paired with a fade effect to facilitate doors and multiple locations. What's Missing / Lessons Learned
I had some issues getting everything to work properly, as we only had 10 weeks of active production time. I thought that our game would feel better with unrestricted movement, yet collisions were rectangular and were handled with Unity's default physics system e.g. walking into walls would feel too bouncy. We also never really decided how burning objects should, the discussion kept getting pushed back and as such we never had time to implement it.
Despite these hurdles, we were pretty organized. Several unexpected personal events happened throughout development, yet we were always able to communicate with each-other and reduce scope when necessary. We were able to produce a fun game which allowed us to improve our skills and stay true to our vision of having deep systems, original art, and multiple ways of progression. |