Armor System

This applies only to AP weapons against armored targets, and of course it ignores a lot of things (e.g., facing, damage dropoff with range), but here’s a quick estimation:

AP hit points = hp * e^(0.0275 * armor / 100)
AP damage = damage * e^(0.0275 * damage / 100)
AP Efficiency = sqrt(AP hit points * AP damage / reload time) / cost. You can also try capping the damage to simulate the effects of overkill.

Usually armor = hp; the only exception AFAIK is the Marder.

From here, we have the following:

Most powerful AP shells (armored units only):

  1. German 88mm KwK 43 L/71 (Tiger II): 10.8 million
  2. Russian D-10/D-10S 100mm (SU-100): 244 thousand
  3. British 17-Pounder (Firefly, Achilles): 241 thousand
  4. German 75mm KwK 40 L/71 (Panther, Jagdpanzer IV): 194 thousand
  5. American 76mm M7: 55.5 thousand
  6. British 75mm Q.F. Mk.V L / 36.5 75mm, German 50mm KwK 39 L/60, American 75mm M3 (Cromwell, Churchill, Panzer III, M4A4, M4 Jumbo): 23.0 thousand
  7. British Q.F. 2 Pounder Mk.X L / 50 (Daimler): 7.27 thousand

Toughest armor (AP-armed units only):

  1. Tiger II: 900 thousand
  2. M4 Jumbo: 676 thousand
  3. IS-2: 482 thousand
  4. Churchill: 341 thousand
  5. T-34/76: 50.2 thousand
  6. T-60: 6.52 thousand

Moved this to the General forum.

Some notes about the armor system:

  • As far as AP weapons go, there is no such thing as a AP weapon being better against heavy armor than light armor (except for overkill). If one weapon deals twice as much damage as another against a Greyhound, it will do twice as much as the other against a Tiger II. You can also look at it from the armor’s perspective.
  • Flanking bonuses have a very nonlinear effect on actual damage. Against front armor, it matters less what weapon you use because the damage reduction decreases the exponential effect. Likewise, against rear armor, it matters more (although often you deal enough to kill the unit no matter what tank you use).
  • Same thing goes for damage dropoff with range.
  • The heavier the tank, the more effective non-AP weapons are against it. The most striking example is the PTRD: useless against light vehicles, but two squads will take down a Tiger II from the front.

More notes:

In terms of pure AP versus armor combat, using the efficiency calculation above (which does ignore a lot of things), the best vehicles are:

  1. Tiger II
  2. Jagdpanzer IV
  3. SU-100
  4. Panther
  5. ISU-152
  6. IS-2
  7. Firefly
  8. Achilles
  9. M4 Jumbo
  10. M10
  11. Marder
  12. SU-85
  13. T-34/85
  14. StuG III
  15. M4A3 (76)
  16. Churchill
  17. SU-76
  18. M4A4
  19. T-34/76
  20. Tiger
  21. Panzer IV
  22. AEC Mk II
  23. Panzer III
  24. Cromwell
  25. T-60
  26. T-70
  27. M5
  28. Sdkfz 250
  29. M8 Greyhound
  30. Daimler

If we cap AP damage at 90 thousand (roughly the upper end of medium tanks at 0 XP):

  1. Jagdpanzer IV
  2. ISU-152
  3. M4 Jumbo
  4. Panther
  5. IS-2
  6. SU-100
  7. M10
  8. Marder
  9. SU-85
  10. T-34/85

If we cap AP damage at 50 thousand (roughly the middle of medium tanks at 0 XP):

  1. Jagdpanzer IV
  2. M4 Jumbo
  3. M10
  4. Churchill
  5. Marder
  6. SU-76
  7. ISU-152
  8. SU-85
  9. M4A3-76
  10. T-34/85

Of course there are caveats; for example the Jagdpanzer IV has no turret and no side or rear armor, and first shot and xp effects can really skew things. Still, I think this can be useful for analyzing trends.

Some notes on engine handling of damage, in the event we want to implement a different armor system:

The current armor system is handled entirely through COB (in particular HitByWeaponID).

There is a Lua option, namely the UnitDamaged callin plus AddUnitDamage (this can take an attacker ID; the attacker gains experience as appropriate). I have not tested this though.

COB advantages:

  • It’s already implemented, and it would take some effort to un-implement it.
  • It does what it was intended to do (in the strict sense).

Lua advantages:

  • Ease of maintenance and testing. Changing anything in COB requires recompiling all affected unit scripts, whereas in Lua there is no manual compilation involved.
  • Generally better access to variables (especially customParams).
  • Better language (IMO).


  • Performance. I assume Lua has the advantage of a more sophisticated interpreter than COB, and usually it lends itself better to algorithmic improvements; however, the Lua route has the overhead of an extra unit->doDamage call; it may also require DelayCall (in the Delay API) to be a “safe” action (if we really screw up we could end up with an infinite loop).
  • Propensity to desync.

Lua way with full access to customParams seems better to me. An armor system needs to know which weapon hits which unit from which side (direction relative to the target unit heading) and which distance, maybe also who fired the weapon, that’s all. The rest can be figured out of customParams. Currently I’m not sure how to get the hit direction and the distance projectile traveled, all the rest are easy to get.
If all of that info is gettable, then we can move to a different armor system - where each unit has an armor thickness for 6 major directions (front, rear, left, right, up, down) and each weapon has a penetration value (separate and independent from damage). Then it will be simpler to calculate effectiveness.

Armor penetration curve, in graphical form:

Assuming Lua functions/callins do what they appear to do, all of these things are possible (although it may require some Lua calculations, e.g. getting the separation of the attacker and the target). The callin looks like this:

UnitDamaged(unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam)

Some thoughts on the current armor system:

In practice the majority of shots will fall either into the constant (i.e. overkill) area, or the linear times exponential area. The only time a shot falls into the linear region is when the target’s current HP is above their base XP, namely when the target has some XP, has gained more HP from that XP than it has taken in damage, and is saved solely by that extra XP.

The equations in the first post transform the graph such that the linear times exponential area becomes linear. In this case you can do the standard hp after = hp before - damage taken calculation.

I’m not sure the current system is as “interesting” as it could be. At current, costs scale far less than linear times exponentially with raw damage. This means that low raw damage weapons are really hosed in AP combat–the lower cost of these weapons is not enough to offset the reduced effectiveness of these weapons. This is fine, except it is not mirrored on the high-damage side. Since often there is no linear region, or only a small one, the optimum weapon is one that does just enough to kill its target in one shot. However, again since costs scale far less than linear times exponentially with raw damage, (indeed, they don’t even seem to scale exponentially), you don’t pay much of a penalty for overkill. Result: savvy players gravitate toward one-hit-kill AP weapons. (Note: Modifying QUALITY by any non-game-breaking amount will not appreciably change this fact.)

A graph roughly illustrating optimum weapon choice (ignoring shot quantization except for one-hit-kills; in reality not doing quite enough to kill the target is not so good). Including these would introduce a “sawtooth” pattern to the left of the peak. However, random changes in target HP due to HE weapons flying around, XP gain, etc. would tend to smooth these bumps out.

Now for some opinion:

I’m not sure I like the favoring (and relative ease of getting) one-hit kills. While it might be realistic (so far as I am aware), I do think it is a major factor in the current rush toward heavier and heavier tanks whenever one has the resources to tech. Furthermore, I feel it favors defensive use of tanks a bit much; the lethality of tank guns means that the advantage lies with the defender, who is better able to make their first shot count due to the decreased accuracy on the move. Then again, it may simply be that conservative tank use is a result more of psychology than of actual effectiveness. I’m not the most experienced player so other opinions on this would be helpful.

In any case, if we don’t want one-hit kill to be the goal, we could take the following strategies under the current armor model:

  • Steeper cost scaling with AP shell power. This will penalize overkills more.
  • Increase penetration compared to damage, or decrease armor compared to hit points. This will expand the linear region in the penetration curve, which provides less incentive to pay the cost of a more powerful shell compared to the linear times exponential region.

We could also experiment with having armor and penetration as entirely different stats from hit points and damage, and with different penetration curves. For example, we could use a logistic penetration curve, i.e., having a damage multiplier of 1 / (1 + e^(-k (penetration - armor)).

IMO we should separate armor from hitpoints. Armor is just that, how thick a unit’s armor plates are. HP, on the other hand, represents a unit’s ability to function even when damaged.
So for example BA-64 may have the same armor thickness as the SdKfz251, but the 251 is considerably larger. If BA-64 is hit and armor is penetrated, chances are high that the shot had killed the driver or destroyed the engine (since it’s a small vehicle and most any hit will damage something important), but if 251 is shot with the same ammo, chances of driver injury are lower (it’s a large vehicle, most probably the shot will pass through some empty internal space). As a result the 251 should have way more HP.
That means larger units tend to have more HP regardless of armor thickness. Most extreme example would be ships - destroyers are nearly completely unarmored, yet 88mm gun that 1-shots medium tanks can do little damage to them because they are so huge and hitting anything vital is very unprobable.

+1 to yuri

I think that’s a good idea too.

Also, sorry for wall-of-text; I think I got a bit carried away :stuck_out_tongue:

Proposal for new armor system (I apologize for more wall-of-text):

As per yuritch’s suggestion, have armor/penetration separate from hp/damage.

Penetration against armor will take the form of a multiplier to the damage dealt. It’s very simple:

Damage multiplier = penetration / (penetration + armor)

Cost multiplier = sqrt(penetration or armor)

Attack Efficiency = sqrt(armor / penetration) * penetration / (penetration + armor)

(We, of course, are not bound by the cost multiplier; it is just there to provide a reasonable estimate of how much penetration/armor is worth.)

I won’t bore you with lengthy calculations (unless you want me to), but let us examine what this model means:

  • If penetration is much less than the target’s armor, the damage multiplier goes linearly with penetration. However, the cost only increases as the square root of the penetration. This penalizes weapons whose penetration is weaker than the armor. In other words, although weaker penetration is cheaper, you can’t buy enough more of them to make up for the reduced penetration.
  • If penetration is much more than the target’s armor, the damage multiplier is constant (it levels out to 1). However, the cost keeps increasing as the square root of the penetration. This penalizes weapons whose penetration is greater than the armor. In other words, once you penetrate the armor most of the time, better penetration won’t help you deal damage, but costs more.
  • The best weapon is one whose penetration is equal to the target’s armor.

This is all well and good, but how do we relate this to the physical reality? Isn’t this a bit too linear; are we to believe that a shot that is 50% effective against 50 mm of armor is still 33% percent effective against 100 mm? While the above equation is good in terms of computation (one addition and one division), I don’t suggest that we relate armor and penetration to physical thicknesses (which are the most convenient statistics we have to go on) directly. Instead, I propose an exponential transformation:

armor or penetration = exp(2k * thickness)

where k is a quality factor similar to that in the old system. Now our equations look like this:

Damage multiplier = exp(2k * penetration thickness) / (exp(2k * penetration thickness) + exp(2k * armor thickness))
= 1 / (1 + exp(-2k * (penetration thickness - armor thickness)))

Cost multiplier = exp(k * penetration or armor thickness)

Attack Efficiency = exp(-k (penetration thickness - armor thickness)) / (1 + exp(-2k * (penetration thickness - armor thickness)))
= 1 / (exp(k (penetration thickness - armor thickness)) + exp(-k (penetration thickness - armor thickness)))

Zounds! The damage multiplier turned into a logistic curve! Interestingly, the efficiency is now symmetric with penetration thickness about the point where the penetration thickness is the same as the armor thickness. We might use different values of k for armor and penetration, add offsets, etc., although the principle should still work the same.

Interestingly enough, I was writing my own proposal for armor system at about the same time… (I got distracted a few times while writing it at work, so it ended up an hour later).

I notice the cromwell is very near the bottom of the heap: below the pz iii infact

good ol british armour

I’m curious: how well does the list match up with actual game experience? (Again, obviously the calculation that generated the list does ignore a lot of things.)

Also regarding the Cromwell: it gets placed near the bottom of the list because:

  • Most expensive normal medium tank.
  • Not particularly well armored.
  • AP shell base damage is no better than Panzer III’s, and takes longer to reload (it does have a bit more range and less dropoff with distance, but the list doesn’t take this into account).

On a side note, it’s not even particularly fast; wasn’t it supposed to be known for its speed in real life? Hell, even the Panzer III moves faster than it in S44.

It was probably quite fast compared to other British tanks - Matilda II, Valentine and Churchill are all considerably slower.

Cromwell: 52km/h Road, 29km/h Off-Road
Panzer IV H: 38, 16
Sherman M4A3: 42, 26
T-34/76: 55, 25

According to which has been one of our primary resources. Also note, Cromwell has same gun as Sherman, which is better than T-34/76 gun, and similar armour level to Sherman.

Hmm, interesting. By the way, model scale seems to be 8 elmos = 1 meter; assuming realtime, at this scale 1 speed = 13.5 kph. This seems roughly in line with road speeds at current stats. Were the stats based on road speeds, offroad speeds, both, or something else?