#### Dirac

##### 22710180

JASS:

```
library Armor /* v1.0.0
*/uses/*
*/ Damage /* thehelper.net/forums/showthread.php/168144-Damage-Struct
Useful tool for unit armor reduction and armor amount calculation
**********************************************************************/
globals
//*********************************************************************
// The gameplay constant that sets how much damage the armor reduces.
private constant real ARMOR_REDUCTION = 0.06
//*********************************************************************
// The gameplay constant for ethereal damage modification
private constant real ETHEREAL_ARMOR_REDUCTION = 1.66
endglobals
/**********************************************************************
*
* function GetUnitDamageReduction takes unit whichUnit, attacktype attackType, damagetype damageType returns real
* - If returns 1.00 means it takes 100% damage.
* function GetUnitArmor takes unit whichUnit returns real
* - Calculates the unit's armor, as accurate as it gets.
*
**********************************************************************/
private function Ln takes real a returns real
local real sum = 0.0
loop
exitwhen a < bj_E
set a = a/bj_E
set sum = sum + 1.
endloop
return sum + (a-1.)*(1. + 9./(2.+a) + 9./(1.+a*2.) + 1/a)/8.
endfunction
function GetUnitDamageReduction takes unit whichUnit, attacktype attackType, damagetype damageType returns real
local real result
local real prevLife=GetWidgetLife(whichUnit)
//*********************************************************************
// Deals 100 damage that ignores armor type to the unit, and from the
// unit's remaining life we know how much damage was reduced.
// To prevent the unit from dying from damage dealt this way the life
// bonus ability is added
call UnitAddAbility(whichUnit,ABILITY_LIFE_BONUS)
set Damage.enabled=false
set result=GetWidgetLife(whichUnit)
call UnitDamageTarget(whichUnit,whichUnit,100,true,false,attackType,damageType,null)
set Damage.enabled=true
set result=result-GetWidgetLife(whichUnit)
call UnitRemoveAbility(whichUnit,ABILITY_LIFE_BONUS)
call SetWidgetLife(whichUnit,prevLife)
return result/100
endfunction
function GetUnitArmor takes unit whichUnit returns real
local real reduction=GetUnitDamageReduction(whichUnit,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL)
//*********************************************************************
// (armor)*0.06/(1+armor*0.06) = reduction
if 0==reduction then
set reduction=GetUnitDamageReduction(whichUnit,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_NORMAL)
return ((1-reduction)/(ARMOR_REDUCTION*(reduction)))/ETHEREAL_ARMOR_REDUCTION
endif
if reduction<=1 then
return (1-reduction)/(ARMOR_REDUCTION*(reduction))
endif
//*********************************************************************
// Ln of 0.94, w3's magic number for negative armor.
return -(Ln(2-reduction)/-0.061875)
endfunction
endlibrary
```