Encouraging Active Play
We wanted the player to feel agile and highly involved in combat. To achieve this, we tuned the player's abilities to favor dodging and multi-hit combos. We discovered through playtesting that players were afraid to engage in combat at low health, only attacking enemies once or twice before running away. This resulted in a "death spiral" where players stopped attacking enemies in response to taking damage.
Our first solution to this problem was to enable damage mitigation at low health. This helped testers get through combat, but it didn't encourage the active playstyle we were looking for. For our second solution, we added a feature that allowed players to recover one point of health with every successful melee attack, regardless of damage. This not only encouraged players to attack more, but also created a new dynamic where players could choose to defeat enemies with weaker attacks in order to gain extra health, even if it meant risking more damage in the process.
We rebalanced the game around this change because it made the gameplay more interesting in the short term, compensating for the small number of rooms. It also made the game more easily accessible to new players at live demos.
AI units were designed to complement each other's abilities and cover each other's weaknesses, e.g:
> Ghosts have a long windup time before firing a slow-moving fireball. They retreat from the player.
> Spiders have a short windup time before performing a quick dash attack. They chase the player.
By designing enemies with "orthogonal" attack patterns, we can create interesting combat dynamics with simple state machine AI (e.g. Spiders chase the player into a Ghost charging its projectile). We designed our AI units to encourage the player to constantly track the state of multiple enemies and prioritize targets.
A common challenge when designing action games is deciding whether to make an action:
a) automatic, to favor the player's intent
b) demanding, to drive engagement
An example of this can be found in Hades with the dash through walls mechanic: If the player's dash ends inside a wall, the dash distance is extended up to a certain length so that it ends on a walkable surface.
The designers choose to favor the player in this situation because they want the player to focus on enemies rather than level geometry. This is a small but crucial detail to capturing the dynamics of the game's dodge-heavy combat.
To recreate this behavior, I wrote a top-down movement component using Unity's NavMesh system. Like in Hades, the player's dash is adjusted so that it always ends on a walkable surface. This component includes dash parameters for both designers and programmers, including max extension distance, wall avoidance radius, and a dash curve to modify speed over time.