Overview
Rage in Rome is a cooperative roguelike where two players work together to defend objectives against waves of enemies. Players can fight enemies, purchase upgrades and choose how much they want to challange themselves as the game becomes progressively more difficult.


Goal
The goal was to create a cooperative wave-based survival experience where two players had to work together to defend different objectives. The challenge was to create enemy and wave systems that could provide increasing difficulty while keeping the gameplay manageable for two players.
My contribution
I worked as a gameplay programmer mainly focusing on the systems that control the enemies and the progression of each wave.
My work included:
* Wave system
* Objective system
* Enemy AI and targeting
* Multiple enemy types
* Enemy spawning
* Empowered waves
* Wave and objective UI
Wave System
The wave system controls the progression of enemies throughout the game. Each wave spawns enemies through portals in a selected area of the map. Once all enemies in the wave have been defeated, the game enters a short preparation period before the next wave begins.
The number of enemies increases as the waves progress, making each wave more challenging. The system also allows players to activate an empowered wave, increasing the difficulty of the next wave in exchange for greater rewards.
Wave progression
Each wave has a specific number of enemies that are spawned through portals in the current objectives area. When all enemies have been defeated, the wave ends and the players get a short break before the next wave starts.
The system keeps track of the current wave and increases the difficulty as the game progresses. This allows the game to gradually become more challenging without requiring every wave to be manually configured.


Empowered Waves
Players can choose to activate a lever before a wave starts, empowering the next wave. An empowered wave spawns double the amount of enemies than normal, increasing the risk for the players but also giving them greater rewards.
Enemy AI
The enemy AI is responsible for deciding what the enemies should target and how they should behave during a wave. Enemies normally move towards the active objective, but can switch their target to a nearby player.

Targeting
Each enemy checks the distance to the players and compares it to a detection radius. If a player is close enough, the enemy switches its target to that player. Otherwise, it continues targeting the current objective.

Behavior Tree
The actual movement and attack behavior is handled through a simple Behavior Tree. The current target is stored in the Blackboard and used by the AI to decide where the enemy should move and when it should attack.
Objective System
The objective system keeps track of the four objectives that the players need to defend throughout the game. Each wave targets a specific objective, and the active objective changes as the players progress through the waves.
I implemented the system so that the Wave Manager communicates with the Objective Manager to switch the active objective between waves. This allows other systems, such as the enemy AI and UI, to know which objective is currently being attacked.
The system also handles when an objective is destroyed, which triggers the game over state.
The active objective changes between waves, giving enemies a new target and forcing players to reposition.

Objective switching
Enemy Types / Spawning
To add variety to the combat, I implemented different enemy types with different roles and behaviors.
The standard enemies focus on attacking the players and objectives while the objective focused enemies prioritize attacking the objectives. This creates different threats that the players need to react to during a wave.
I also worked with the enemy setup in Unreal Engine so that different enemy types could be spawned through the same portal system.
Standard Goblin
Changes its target based if the player(s) is present or not.

Objective Goblin
Does not react to the players presence. Only goal is to destroy the objective

What I learned & What I would improve
Through this project, I learned a lot about building systems in Unreal Engine and how different systems need to work together. I gained more experience working with enemy AI, wave systems, objectives and Blueprints together with C++.
One of the biggest things I learned was the importance of testing systems together. A system could work well on its own but still cause problems when combined with other parts of the game.
If I were to continue this project I would:
* Improve how to different gameplay systems communicate with each other
* Add more enemy types with different behaviors
* Improve the wave system with more variation between waves
* Make the enemy AI more varied and reactive
* Add an object pooler for the enemies