Today I wanted to go over the stats system I am using for the game I mentioned in the my last post, whose working title is Heroes' Journey until I can think of a better name.
I have played quite a few RPGs, both electronic and table top that use stat systems that are fairly complex to support the wide variety of actions a player can take. Some example video games would be any of the Elder Scrolls games, the Divinity series, Adventure Quest, just to name a few. For table top games, any of the D20 tabletop RPGs (D&D, Star Was) or Legend of the Five Rings (L5R). All of these games have very robust stat systems that allow for very diverse play. For Heroes' Journey I didn't think a large stat system was necessary so I went about creating a simpler stat system that was more focused on the gameplay elements the game would have. For instance, there is not going to be any non combat skills (Lock picking, diplomacy, crafting, etc) so I didn't need to have stats specifically to support those types of actions.
I also wanted to create a system that I hadn't seen very often. A lot of the systems take those stats and create a modifier from them to apply to other actions. With the D20 rule set you have an ability modifier that is derived from your overall ability score (a Dexterity of 18 would give you a +4 ability modifier). When you go to use a skill you apply the ability modifier that is associated with that skill (you would add your Dexterity modifier to a Move Silently skill roll). In the system I developed there are 4 Base Characteristics (BCs) and 6 Derived Characteristics (DCs). You apply points into the Base Characteristics and the Derived Characteristics are calculated from the Base, hence Derived. The Characteristics are:
Base:
- Agility
- Brawn
- Focus
- Fortitude
Derived:
- Action Points
- Defense
- Health
- Melee Attack
- Ranged Attack
- Resistance
Each Base Characteristic has one primary, and two secondary Derived Characteristics that they affect. The Primary Derived Characteristic receives 60% of the Base Value, and each Secondary Derived Characteristic receives 20%, both rounded down to the nearest whole number. They are divided out like this:
Base (Primary, Secondary, Secondary)
Agility (Defense, Melee, Ranged)
Brawn (Melee, Health, Resistance)
Focus (Ranged, Action Points, Defense)
Fortitude (Health, Action Points, Resistance)
Here is an example of an actual character:
Agility: 15
Brawn: 20
Focus: 12
Fortitude: 20
Action Points: (Focus * 0.2) + (Fortitude * 0.2) = 2 + 4 = 6
Defense: (Agility * 0.6) + (Focus * 0.2) = 9 + 2 = 11
Health: ((Fortitude * 0..6) + (Brawn * 0.2)) * HealthMod = (12 + 4) * HealthMod = 16 * HealthMod
Melee Attack: (Brawn * 0.6) + (Agility * 0.2) = 12 + 3 = 15
Ranged Attack: (Focus * 0.6) + (Agility * 0.2) = 7 + 3 = 10
Resistance: (Brawn * 0.2) + (Fortitude * 0.2) = 4 + 4 = 8
To clean up the above Derived Characteristics, they would have the final values of:
Action Points: 6
Defense: 11
Health: 16 * HealthMod
Melee Attack 15
Ranged Attack: 10
Resistance: 8
Here is the code I am using to do these calculations:
public void RefreshBase() { //Get the Derived Characteristics from the Base Characteristic set Derived = CalcDerived(Base); } private int healthModifier = 4; private double pMod = 0.6; //Primary Modifier private double sMod = 0.2; //Secondary Modifier private DerivedCharacteristics CalcDerived (BaseCharacteristics baseIn) { DerivedCharacteristics derived = new DerivedCharacteristics(); derived.MeleeAttackMod = FloorToInt(((double)baseIn.Brawn * pMod) + ((double)baseIn.Agility * sMod)); derived.RangedAttackMod = FloorToInt(((double)baseIn.Focus * pMod) + ((double)baseIn.Agility * sMod)); derived.Health = (FloorToInt(((double)baseIn.Fortitude * pMod) + ((double)baseIn.Brawn * sMod))) * healthMod; derived.ActionPoints = FloorToInt(((double)baseIn.Fortitude * sMod) + ((double)baseIn.Focus * sMod)); derived.Defense = FloorToInt(((double)baseIn.Agility * pMod) + ((double)baseIn.Focus * sMod)); derived.Resistance = FloorToInt(((double)baseIn.Brawn * sMod) + ((double)baseIn.Fortitude * sMod)); return derived; } private int FloorToInt(double value) { return (int)System.Math.Floor(value); }
That is the basis for the stat system in Heroes' Journey. I think it will lead to interesting game play, but I'm just not getting the game to a state where I can really start testing the mechanics and get a feel for if they will actually be usable. Since I have never developed my own stat system before I'm sure that while I'm testing that all of these values with be tweaked, or completely redone.
In the next post I'll probably go over what I am currently using for basic damage calculation (No Skill affects).
Till next time!