Combat in Tales of Zalanthas will be familiar to people who played Armageddon, but does have enough new features to it so that it feels fresh and exciting. While the details are still being worked on, the basic system is this: Each person rolls a d20, adds a bunch of modifiers, and if the attacker's final value is equal to or higher then the defender's, they hit. After that the defender gets a parry and/or shield-block chance.
Adding to this are something new called Stances. Someone can enter an Offensive Stance, Defensive Stance, Riposte Stance, or Neutral (default) Stance. And we may add additional Stances as development progresses. The Stances will give bonuses and penalties, and in the case of Riposte add special actions. Here is the helpfile (note, we'll be using a d20 based system instead of d100):
------------------------------------------------------------
Help for stance
Combat stances let you trade offense and defense bonuses while fighting.
You can only change stance while in combat. When combat ends, you return
to the neutral stance automatically.
Usage:
stance <offensive | defensive | neutral | none | riposte>
Stances:
- Neutral: no bonuses or penalties (default).
- Offensive: +1 offense, -1 defense, skill-check vs Offense for additional +1 damage.
- Defensive: +1 defense, -1 offense, skill-check vs Defense for reduction of 1 damage.
- Riposte: +1 parry, chance of a riposte counter-attack on a successful parry.
Requirements:
- Offensive stance: Offense skill.
- Defensive stance: Defense skill.
- Riposte stance: Riposte skill.
- Neutral/none stance: no skill required.
--------------------------------------------------------------Additionally, there will be multiple special attacks, based on what weapons and fighting styles you're using. Axes will give you a special 'cleave' command, while dual-wield will give you a 'flurry' attack.
Each 'round' of combat will cost combatants stamina, how much is determined by which fighting style they use. When someone runs out of stamina in combat they suffer severe penalties, so managing stamina during a fight will become very important.
The hard part is balancing it so that each fighting style is roughly equal. There are five fighting styles: dual-wield, two-handed, shield+weapon, single-weapon, and natural weapons. What is still being worked on are the exact details of all the modifiers each style has. We've written something called "simcombat", which will use the game engine and code to run mock combat between two combatants. With command-line switches we can customize each combatant to use the various fighting style. The command looks something like this:
simcombat --fights 100 --until-death --no-delay \
--combatant_one=dual_wield,low_skill,low_armor \
--combatant_two=shield_use,low_skill,low_armorWe can specify which fighting style, how much armor, whether they have high or low strength, high or low agility, and a few other parameters. We then run about 100 fights for each match-up, and go through most all of the permutations of fighting styles and skill level. This means that each test-suite of combat is about 8000 fights, and takes about 10 minutes to run through.
The results are saved to a JSON file that we can then use and analyze. It gives the results of the fights, what setup they were using (weapons, armor, etc), and how many rounds of combat each fight took.
Here's a summary of running the test above:
Summary: combatant_one=23, combatant_two=77, timeout=0, draw=0, stopped=0,
avg_rounds=85.86, duration_s=158.62
Settings: combatant_one=dual_wield,low_skill,low_armor,low_str,low_agil
combatant_two=shield_use,low_skill,low_armor,low_str,low_agilOr a very long JSON file where each fight is detailed:
{
"fight_index": 1,
"outcome": "SimCombatantTwo",
"winner": "SimCombatantTwo",
"loser": "SimCombatantOne",
"rounds": 77,
"attacks": 154,
"combatant_one_start_hps": 100,
"combatant_one_end_hps": 0,
"combatant_two_start_hps": 100,
"combatant_two_end_hps": 53,
"combatant_one_start_stam": 100,
"combatant_one_end_stam": 0,
"combatant_two_start_stam": 100,
"combatant_two_end_stam": 0,
"combatant_one_blocks": 0,
"combatant_two_blocks": 15,
"combatant_one_parries": 17,
"combatant_two_parries": 8
},The goal is to get a 60-40 balance between each combination (the tests above were before balancing). That means no combatant can win more than 60% of the matches, or lose more than 40% of the matches. We run the test-suite, tweak modifiers, and rerun until we get within that range.
Each time a new combat feature or modification is made, we rerun these tests to keep everything somewhat balanced. Ultimately it's going to take actual human play-testers to really get a good balance in combat. These sorts of tests don't include skills like kick or bash, nor do they take into consideration how unpredictable humans are. But, with this testing system we can at least come into the play-testing phase feeling confident that no one fighting style dominates the others.
As it stands now, there's a slight rock-paper-scissors balance: dual-wield has a slight edge over two-handed, two-handed has a slight edge over shield-use, and shield-use has a slight edge over dual-wield. One-handed and natural attacks are competitive, but tend to be not quite as effective as the other three.
In the future, once combat is more solidified, we'll have another devblog about it to go over more details.