Dev Log 7: New Armor Mechanics
It's that time of the year again. All the stars and planets are in the right position and it's time for an Infusion dev log.
We already showed you the extent to which we upgraded the visual aspects of the engine, but the mechanical changes that I've done so far and am yet to do are just as extensive, and perhaps more radical. I'm going to talk about them one by one, in separate dev logs, as I continue to test, tweak, and refine them.
Our immediate goal with the engine and the game is to (re-)implement a number of items and mechanics, get a few areas together, and get the game in a state where it can be played for real, so to speak. Mainly so I can better asses how all these changes work in practice, but also so we can produce a short demo video and show you the game in action for the first time.
So, anyway, let's get to the changes to the armor mechanics and damage resistance in general.
In Underrail, the damage resistance was divided into percentual resistance and flat threshold. Incoming damage would be reduced either percentually or by flat amount, whichever would reduce more damage in any given case. This caused a lot of balancing problems. Threshold was generally either useless or overpowered (especially when stacked in early game), while resistance was hard to progress with armor quality, as its percentual nature made it already scale innately.
All these problems really came to forefront when I was implementing different types of shotgun shells in Expedition. Balancing usefulness of different shells in this system was just impossible and it took a lot of tweaking to make it even remotely decent with liberal use of seemingly arbitrary threshold and resistance ignore factors. At one point I was tempted to just implement a completely different interaction for the shells specifically, but decided against it for the sake of consistency.
Another problem with the old model was that all resistances stacked globally. Meaning: resistances from boots and helmets were equally effective as body armor and they all aggregated when it came to interacting with incoming damage. This made me really hesitant to put a lot of resistances on helmets and boots because, on one hand, I didn't want them to make the high resistance armors completely broken by just maxing (or near maxing) out all the resistances and, on the other hand, I didn't want these items, because of their high resistances, becoming mandatory for characters that use ligher armor in the body slot.
There are other problems too, but these are the main issues, I think.
So how does the Infusion's new system differ from the old one?
In Infusion we're going to have a lot more gear slots, mainly from separating body armor and helmets into multiple component slots. This will provide the player with a lot more damage resistance sources. But unlike in the old system, these resistances will not stack. Instead, they will all interact with any given attack separately. So whenever you're struck somewhere on the body, the game will check what armor covers that spot, and it will interact with that armor piece. If there are multiple pieces, it will go through each of them separately, from the outer toward the inner. E.g. you might have some minor resistances on the overcoat that will interact with an incoming bullet or a stab before your torso armor.
For now, I have no intention to allow the player to choose which part of the target's body they're attacking (Fallout style), but there will be different special attacks / stances that will influence this (e.g. decapitate). Also, elevation and size of attacker and the target will also play a role here. So, for example, attacking someone from an elevated position will give you a better chance to hit them in the head and worse (if any) chance to hit their feet.
Different types of creatures will have different body part arrangements. For humans it is as follows: Head (5%), Torso (55%), Arms (10%), Legs (including the pelvis) (25%), Feet (5%). The number in brackets is the current working chance to hit distribution for a generic ranged attack. These numbers will vary for different attacks and situations, but it should give you some general idea what areas are going to be most important to cover with armor in most situations.
Depending on the armor design itself, it may end up covering one or more body parts. In the example of an armored rig/vest, which is the only crafted armor at the moment that's implemented, in addition to covering the torso, it can also provide some additional protection to arms and legs.
Let's go through the examples above. The armor on the left only provides cover to 80% of the torso part. Like the icon indicates, it does not cover the stomach all the way down. We'll talk about the intricacies of coverage later.
The armor in the middle, however, also sports sleeves and a groin guard. The groin guard covers the rest of the belly in the torso part and also covers the groin area, of course, which falls under the legs part. The sleeves cover the shoulders area of the arms part.
The armor on the right has sleeves, but no groin guard.
Regarding coverage, the way we're going to determine at which point an attack lands in a given body part, and so if it interacts with an armor segment that provides partial coverage, is still under consideration. The tooltip here provides just the coverage percentage, but the icon itself is trying to further illustrate what area of the part is covered. Having 20% coverage in arms at the top (shoulders) is not the same as at the bottom (hands) as both of these can be layered over. It doesn't make much sense that, if you are wearing gloves and shoulder pads, a bullet attack can go through both of these.
The way I treat the coverage number, which is esentially a floating point pair (e.g. 0.8-1.0 for shoulders, 0.0-0.2 for hands), is that 0 is the lowest point of the body part and 1 is the top point of the body part and 0.5 is the middle.
Now, if you are an RPG mechanics connoisseur, as you surely must be if you made it this far into the dev log, you might be looking at that armor at the left and thinking how fun it's going to be to get hit by stray bullet to the torso right below your endgame crafting-maxxed armored vest and instakilled 20 hours into your ironman DOMINATING run. And I share your enthusiasm for suffering. However, as this kind of experience might not be pleasurable for most players, there are some additional considerations that I'm going to have to give to this.
One of the mechanics that are in place right now is that there is such a thing as grazing shots, which are basically hits that deal about half as much damage. They occur when the attack roll is within the graze part of the hit chance, the size of which is determined by attack-to-defense ratio. I don't want to get into too much details regarding this right now, as the topic is extensive and this dev log is already too long (it warrants its own). What is relevant for the example above is that the farther you are into the graze area of the roll, the farther the hit lands from the center of the body part.
So, basically, the lethal bullet hit described above would deal half the damage, giving you a better chance to survive. Whether this will be enough to make these situations acceptable, remains to be seen through testing. Just know that I am aware of this potential problem with the system.
So what about other body parts? Are we going to have to cover every bit of our body with heavy armor to avoid the similar scenario? What about getting hit with a plasma gun critical to the pinky toe while wearing tabis? Well, first of all, the chance to get hit in the feet is quite low, outside insects biting you or stepping on caltrops or acid.
Additionally, each body part has its innate damage taken modifier and they are currently set to these values: head - 150%, torso - 100%, arms - 40%, legs - 60%, feet - 25%. So the armor value of your footwear is not nearly as important as your body armor, while if you don't wear a helmet to a gun fight, you're taking quite a risk.
All these numbers are subject to change, of course.
The last point I want to cover are the armor values themselves. As you might have noticed, the old format of percentage resistance / flat threshold is gone. What we have now is resistance / soak / material type.
Firstly, ignore these particular numbers, they are just random placeholders. I haven't gotten to writing real component specs yet. That said, let's go through all these values.
Resistance is the first line of defense, so to speak. It is checked against the incoming damage in order to determine what percentage of it will go through the armor. The formula goes something like this (there's also armor penetration, armor bypass and other mods, but for simplicity's sake, we're going to ignore those for now):
damage_done = incoming_damage * (incoming_damage / (incoming_damage + resistance))2
So if the resistance and damage values are the same, the incoming damage is multiplied by 0.25. That is, quarter of it goes through. If the incoming damage is twice the resistance, it's multiplied by 0.43, and for the other way around it's 0.1.
This formula is subject to change, of course, pending testing. But the general idea is that the ratio between damage and resistance is what determines the percentage reduction instead of it being fixed on the item. This makes the resistance much easier to scale/progress.
After the formula above is applied, soak value is deducted:
final_damage_done = damage_done - soak
So, unlike threshold, soak will now be an important stat throughout the playthrough as it is always applied at the very end, reducing already percentually reduced value.
The final property of damage resistance is the material type. I haven't started implementing this yet, but the idea is that this will modify the inputs to the formulas above, and maybe even formula itself, depending on the type of the attack and the type of material. For example, kevlar is going to be really good against bullet attacks, but not that good against other attacks.
That's it for now. There are a lot more mechanical changes that are either implemented or are being implemented, so expect more dev logs in the near future. But then again, I always say that and then skip nearly a whole year without posting.
Also, follow me on Twitter, where I post smaller tidbits occasionally.