System Design Exercise: Designing and Balancing a class progression system for an ARPG
Premise
The objective of this System Design exercise is to create a simple skill tree, essentially a branching system, for an Action RPG game like Diablo 4, considering 3 classes of damage dealers, thus excluding a role-based system that includes the three classic roles of the Holy Trinity, namely damage dealer, tank, and support.

Visual representation of the holy trinity

Diablo IV skill tree
I am undertaking this exercise to demonstrate my ability in System Design on one hand, and my competence in balancing and using tools such as Excel or Google Sheets on the other.
The reason I will design three classes of damage dealers and not classes with different roles is that it would be very complex to balance different roles using only numerical data and a spreadsheet. The best way to balance a class system with different roles is indeed to playtest with groups of players using different classes in various game situations, collect feedback and objective data, and draw conclusions from these.
Of course, creating a skill tree in the class progression system of an Action RPG, with the goal of being balanced, cannot take into account the real-time component and the complications that arise from it, including the player's positioning relative to enemies at any given moment, the positioning of enemies relative to other enemies, etc.
For this reason, I will not consider defense skills, mobility skills, or crowd control skills.
That said, the exercise will be divided into 3 phases.
In the first phase, I will create a system of classes that are different from each other, with strengths and weaknesses based on the number of enemies present in a given scenario. I will take the skill tree of the classes from the video game Diablo 4, produced and developed by Blizzard, as an example because I think it is well-organized and easy to understand, whereas my version will surely be simplified with a smaller number of abilities and at the same time a smaller number of passive abilities (or improvements) that enhance or modify the abilities of each class.
Once I am satisfied with the work of creating classes and abilities within the hypothetical game, the second phase will begin, in which I will identify the damage formulas for the various abilities. This will allow me to later establish numerical values to assign to each enhancement in the skill tree and finally arrive at a DPS value for each branch. The initial assignment of these values will be done "by feel," without considering a balance between the various classes and abilities. At the end of this second phase, I expect the classes and abilities presented by the classes to be unbalanced with respect to each other.
This, in fact, is the goal of the third phase of the exercise, namely the creation and use of a spreadsheet on Google Sheets aimed at calculating the DPS of each individual ability and the subsequent balancing of the classes.
As I mentioned earlier, the goal is not to have identical or nearly identical DPS values between the various abilities and classes, as if this were the case and the classes performed exactly the same in all game situations, it would not make sense at this point to have different classes. The goal is indeed to have classes that perform well in most game situations, thus avoiding dominant or dominated classes, but, at the same time, ensuring there is at least one game situation for each class where there is an evident winner in terms of DPS.
The 3 classes will be: wizard, warrior, and rogue.
-
Wizard: will excel in crowd control, that is, in our case, in dealing damage to large groups of enemies, will do reasonably well against smaller groups of enemies, and will struggle when facing a single target like a boss.
-
Warrior: will excel in dealing damage to smaller groups of enemies, will do reasonably well against large groups of enemies or a single target.
-
Rogue: will excel against a single target, will do well in dealing damage to smaller groups of enemies, and will struggle against large groups of enemies.
To avoid making the balancing too complex, I have decided to simplify the choice of abilities and enhancements by using a fixed branch system where the player must choose a complete branch, without the possibility of mixing enhancements from different branches.
Classes skill tree
When designing the skill tree for each class, I decided to include only two branches for each subclass: the Direct Damage (DD) branch and the Damage Over Time (DoT) branch. The DD branch mainly includes enhancements directly related to damage, maximum number of enemies hit, and ability cooldowns, while the DoT branch includes improvements that apply debilitating statuses to enemies such as on Fire, bleeding, poison, etc.
Wizard
.png)
Warrior

Rogue

The branches are to be considered in their entirety; for simplicity of balancing, it is not possible to mix enhancements from two branches even if they refer to different abilities. This means that choosing the DD branch will not grant access to any enhancement contained in the DoT branch and vice versa.
Before proceeding to the actual balancing of the branches, abilities, and therefore the classes, I have established constraints for various enhancements. These constraints must be respected regardless of the changes made during the balancing phase.
For example, the enhancement of the wizard's firebolt ability in the DD branch, namely “Piercing Firebolt”, has the constraint, established by the enhancement design, of hitting more targets than the base version of the firebolt ability. This is because the design of piercing firebolt states that firebolt now penetrates targets and hits enemies in sequence. How many enemies it hits will be determined during the balancing phase.
Not all enhancements have constraints, and in this case, the only implicit constraint to be respected is that the DPS of the enhanced ability must be greater than the DPS of the base abilities.
All abilities description can be found on the spreadsheet.
Abiities modeling and parameterization
Before balancing the classes and branches, it's necessary to identify the formulas to calculate the DPS, and consequently, it's necessary to model the abilities using parameters.
The parameters I have chosen to model each ability are:
-
Base Damage (Bd): the base damage of a single instance of damage of the base branch version of the ability.
-
Fire Rate (Fr): the maximum firing rate (#ability activations / 1 second) of the ability, meaning how many times the player can use it in 1 second (it is an alternative to cooldown for abilities that don’t have a cooldown).
-
Cooldown Duration (Cd): the time the player must wait to use an ability again (alternative to fire rate).
-
Max Enemies Hit (Mh): the maximum number of enemies that an ability can hit in a single activation (I chose to use this parameter because the range alone was not sufficient to define the limit of an ability as the number of enemies increases).
-
Duration (Dr): the duration (in seconds) of an ability that extends over time (abilities that resolve instantaneously do not have a duration).
In addition to these parameters, which are sufficient to model each designed ability, I used status effects, specifically:
-
On fire: the enemy is burning, suffering X% (relative to Bd) damage per second for Y seconds;
-
Bleeding: the enemy has wounds that bleed, suffering X% (relative to Bd) damage per second for Y seconds.
-
Poisoned: the enemy is poisoned, suffering X% (relative to Bd) damage per second for Y seconds.
-
Stunned: the enemy is stunned for Y seconds, each instance of damage that hits it inflicts double damage.
Once I modeled and parameterized the abilities, I assigned a value to each ability's parameters that I felt was correct "by feel," and I constructed formulas for calculating the damage of each ability as the number of enemies varied.
This allowed me to plot the DPS trend on a scatter graph, which I used to evaluate the current (un)balance and determine what needed to be changed and how to achieve proper balance.

Wizard abilities' parameters

Pre-tuning classes' average DPS
Balancing Considerations (Pre-Tuning)
If we compare the graph showing the ideal trend of DPS for the various classes as the number of enemies varies with the current trend, we can notice some differences. The first difference is that the Rogue has the highest DPS until 8-9 enemies, which is at the expense of the Warrior, who should be the strongest class from 4 up to 14-15 enemies (numbers established by our initial design idea). Secondly, the Warrior remains the dominant class from 10 enemies onwards, to the detriment of the Wizard, who should have the highest DPS after 15 enemies, but instead appears too weak, with no situation where it's the best class for DPS.

Ideal classes' average DPS
If we then analyze the pie charts of the various classes, we also notice other errors, particularly for the Wizard. We note that more than 75% of the total DPS of the base branch comes from only two abilities, namely fireball and nova. This is at the expense of the other two abilities, which consequently appear weaker and less useful to players.
Similar situations are found in the Warrior and Rogue classes. Therefore, a more balanced distribution of the total DPS among the various abilities for each class is necessary.

Pre-tuning DoT Wizard abilities' pie chart
In light of this, the objectives of the tuning phase are 3:
-
To work on the parameters values of the abilities so that the DPS trend graph resembles the ideal one created in the design phase, based on the idea that the Rogue class should have the highest DPS in boss fights, thus from 1 to 3 enemies; the Warrior class should then be the dominant class from 4 enemies to 14; and finally, the Wizard class should take over and become the dominant class when the number of enemies is higher, from 15 onwards.
-
To redistribute the DPS of each class more evenly among the various abilities to avoid dependence on a single ability, as seen in the case of the Rogue's direct damage branch, where almost 67% of the total damage comes from a single ability. This must be done while keeping in mind that the enhancements of each class branch may have constraints defined during the design phase that must be respected. This naturally places constraints on some parameters that cannot be completely free in the tuning phase.
-
To make the choice between the two branches interesting, ensuring that the two trends intersect at least at one point on the graph. This implies that there are intervals where one branch is preferable to the other and vice versa. For example, the Warrior's direct damage branch is preferable to the Warrior's DoT branch when the number of enemies is between 1 and 10, while in the remaining interval, from 11 onwards, the DoT branch is preferable.
.png)
Pre-tuning 6 branches' DPS
This objective aims to avoid the presence of dominant branches within the same class and therefore to guarantee the player a choice not forced by a wrong balance.
Results
Starting from the distribution of DPS among abilities, as we can see from the final pie charts, the situation has definitely improved, although some branches still exhibit an imbalance, which, however, can be maintained to make a branch "unique" or modified through a second tuning phase.
.png)
Final DoT Wizard abilities' pie chart
As for the choice between the branches of each class, we can see from the graph depicting the trends of all six branches of the three classes that both branches of each class intersect at least once, creating the conditions for a choice that the player must make based on their preferences and preferred gameplay situations.
.png)
Final 6 branches' DPS
For example, we notice that the DoT branch of the warrior is superior to its DD counterpart in the range from 1 to 11 enemies; conversely, from the 12th enemy onwards, the DD branch proves to be better. This means that a player who chooses the warrior class and then selects the DoT branch will have an easier time when facing from 1 to 11 enemies compared to a player who instead chooses a warrior DD. The situation is reversed from 12 enemies onwards.
The last point, and the most important one, is that the average DPS graph of the three classes should resemble the ideal trend graph. Comparing the two graphs, both in their complete version and in the restricted one (up to 20 enemies), we can obviously notice that the shape is slightly different since the ideal graph was created ad hoc without considering the real damage calculation formulas, instead it was made simply by tracing straight line segments that roughly described the scenario towards which to tend in the balancing work.
.png)
Zoomed ideal classes' average DPS
.png)
Zoomed final classes' average DPS
The actual graph, instead, shows trends more akin to curves, but despite this, we can notice that the "shape" of the trends and the intersection points between them are very similar, so even in this case, we can say that the objective has been achieved.
In other words, the balancing we aimed to achieve among the various classes was obtained starting from an initial imbalance situation, while maintaining those constraints on the abilities that had been established during the design phase, namely avoiding completely redesigning a branch upgrade just to achieve class balancing.