scope ArmorAltering
globals
constant integer HEALTH_BONUS = 'A001'
constant real TEST_DAMAGE = 50000.00
constant real ARMOR_COEFICIENT = 0.06
endglobals
private struct DamageAndArmor
real damage
real armor
static method create takes unit u, real init_dam returns DamageAndArmor
local DamageAndArmor DnA = DamageAndArmor.allocate()
local real health = GetWidgetLife(u)
local real max_hp
local real armor_rating
call UnitAddAbility(u, HEALTH_BONUS)
set max_hp = GetUnitState(u, UNIT_STATE_MAX_LIFE)
call SetWidgetLife(u, max_hp)
call DisableTrigger(udg_DamageEventTrigger)
call UnitDamageTarget( udg_DamageEventSource, u, TEST_DAMAGE, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
call EnableTrigger(udg_DamageEventTrigger)
set armor_rating = TEST_DAMAGE/(max_hp - GetWidgetLife(u))
set DnA.damage = init_dam*armor_rating
set DnA.armor = (armor_rating-1)/ARMOR_COEFICIENT
call SetWidgetLife( u , max_hp )
call UnitRemoveAbility( u , HEALTH_BONUS )
call SetWidgetLife( u , health )
return DnA
endmethod
endstruct
private function Armor_altering takes nothing returns boolean
local DamageAndArmor Base = DamageAndArmor.create(udg_DamageEventTarget, udg_DamageEventAmount)
debug call BJDebugMsg("armor = "+R2S(Base.armor)+", base damage = "+R2S(Base.damage))
set udg_DamageEventAmount = Base.damage - Base.armor
set udg_DamageEventType = udg_DamageTypeReduced
call DamageAndArmor.destroy(Base)
return false
endfunction
//===========================================================================
function InitTrig_Armor_altering takes nothing returns nothing
set gg_trg_Armor_altering = CreateTrigger( )
call TriggerRegisterVariableEvent( gg_trg_Armor_altering, "udg_DamageModifierEvent", EQUAL, 1.00 )
call TriggerAddCondition( gg_trg_Armor_altering, Condition(function Armor_altering) )
endfunction
endscope