//Life Event by ZibiTheWand3r3r
//requires Unit Event by Bribe
globals
constant integer HP_CHANGE_STEP=50 // at least 50hp change will trigger an event
constant integer HP_PERCENT_CHANGE_STEP=2 // at least 2% change will trigger an event
trigger array g_trgLifeTrack
integer array g_hpForUp
integer array g_hpForDown
integer array g_prevHP
integer array g_prevEventHP
integer array g_hpPercentForUp
integer array g_hpPercentForDown
integer array g_prevHPPercent
integer array g_prevEventHPPercent
endglobals
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
function R2IEx takes real r returns integer //rounded
return R2I(r+0.5)
endfunction
function GetDisplayedHP takes real life returns integer// displayed on UI
local integer hp=R2I(life)//cuts decimals
if life - (I2R(hp)) > 0.00 then
return (hp+1)
endif
return hp
endfunction
/*
function GetUnitSpeedChange takes integer percentLife returns real//1..100
if percentLife>90 then
return 0.00
endif
return I2R(percentLife-90)
//local real oldMove=GetUnitSpeedChange(g_prevLifePercent[id])
//local real newMove=GetUnitSpeedChange(lifePercent)
endfunction
*/
function RunUnitLifeEvent takes unit u, integer currentLife, integer prevLife returns nothing
set udg_UnitLife_Unit=u
set udg_UnitLife_Current=currentLife
set udg_UnitLife_Prev=prevLife
set udg_UnitLife_Event=0.00
set udg_UnitLife_Event=1.00
set udg_UnitLife_Event=0.00
endfunction
function RunUnitLifePercentEvent takes unit u, integer currentLife, integer prevLife returns nothing
set udg_UnitLifePercent_Unit=u
set udg_UnitLifePercent_Current=currentLife
set udg_UnitLifePercent_Prev=prevLife
set udg_UnitLifePercent_Event=0.00
set udg_UnitLifePercent_Event=1.00
set udg_UnitLifePercent_Event=0.00
endfunction
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
function Trig_HP_Changed takes nothing returns boolean
local unit u=GetTriggerUnit()
local integer id=GetUnitUserData(u)
local real life=GetWidgetLife(u)
local integer ui_life = GetDisplayedHP(life)
local integer lifePercent=R2IEx((ui_life/GetUnitState(u, UNIT_STATE_MAX_LIFE))*100)// 1..100
local boolean currentChangeUp = (ui_life>g_prevHP[id])
//by value
if ui_life <= g_hpForDown[id] then
call RunUnitLifeEvent(u, ui_life, g_prevEventHP[id])
set g_hpForUp[id]=ui_life+HP_CHANGE_STEP
set g_hpForDown[id]=ui_life-HP_CHANGE_STEP
set g_prevEventHP[id]=ui_life
elseif ui_life >= g_hpForUp[id] then
call RunUnitLifeEvent(u, ui_life, g_prevEventHP[id])
set g_hpForUp[id]=ui_life+HP_CHANGE_STEP
set g_hpForDown[id]=ui_life-HP_CHANGE_STEP
set g_prevEventHP[id]=ui_life
endif
if currentChangeUp then
if ui_life-HP_CHANGE_STEP > g_hpForDown[id] then//if new down-level is greater then old one
set g_hpForDown[id]=ui_life-HP_CHANGE_STEP //change down-level
//call Msg("Down level: "+I2S(g_hpForDown[id]))
endif
else
if ui_life+HP_CHANGE_STEP < g_hpForUp[id] then
set g_hpForUp[id]=ui_life+HP_CHANGE_STEP
//call Msg("UP level: "+I2S(g_hpForUp[id]))
endif
endif
//percent:---------------------------------------------------------------------------------
//call Msg(I2S(lifePercent)+" / "+I2S(g_prevEventHPPercent[id]))
if lifePercent <= g_hpPercentForDown[id] then
//call BJDebugMsg("maxhp:" +I2S(BlzGetUnitMaxHP(u))+", life:"+I2S(ui_life))
call RunUnitLifePercentEvent(u, lifePercent, g_prevEventHPPercent[id])
set g_hpPercentForUp[id]=lifePercent+HP_PERCENT_CHANGE_STEP
set g_hpPercentForDown[id]=lifePercent-HP_PERCENT_CHANGE_STEP
set g_prevEventHPPercent[id]=lifePercent
elseif lifePercent >= g_hpPercentForUp[id] then
//call BJDebugMsg("maxhp:" +I2S(BlzGetUnitMaxHP(u))+", life:"+I2S(ui_life))
call RunUnitLifePercentEvent(u, lifePercent, g_prevEventHPPercent[id])
set g_hpPercentForUp[id]=lifePercent+HP_PERCENT_CHANGE_STEP
set g_hpPercentForDown[id]=lifePercent-HP_PERCENT_CHANGE_STEP
set g_prevEventHPPercent[id]=lifePercent
endif
if currentChangeUp then
if lifePercent-HP_PERCENT_CHANGE_STEP > g_hpPercentForDown[id] then//if new down-level is greater then old one
set g_hpPercentForDown[id]=lifePercent-HP_PERCENT_CHANGE_STEP //change down-level
//call Msg("Down level: "+I2S(g_hpPercentForDown[id])+"%")
endif
else
if lifePercent+HP_PERCENT_CHANGE_STEP < g_hpPercentForUp[id] then
set g_hpPercentForUp[id]=lifePercent+HP_PERCENT_CHANGE_STEP
//call Msg("UP level: "+I2S(g_hpPercentForUp[id])+"%")
endif
endif
//recreate trigger each time unit's life changed
set g_prevHPPercent[id]=lifePercent
set g_prevHP[id]=ui_life
call DestroyTrigger(g_trgLifeTrack[id])
set g_trgLifeTrack[id]=CreateTrigger()
call TriggerRegisterUnitStateEvent(g_trgLifeTrack[id], u, UNIT_STATE_LIFE, LESS_THAN, life-1)
call TriggerRegisterUnitStateEvent(g_trgLifeTrack[id], u, UNIT_STATE_LIFE, GREATER_THAN, life+1)
call TriggerAddCondition(g_trgLifeTrack[id], Condition(function Trig_HP_Changed))
//---
set u=null
return false
endfunction
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
function Trig_LifeEventEnters takes nothing returns nothing
local integer id=udg_UDex
local unit u=udg_UDexUnits[udg_UDex]
local real life=GetWidgetLife(u)
local integer ui_life = GetDisplayedHP(GetWidgetLife(u))
set g_prevHP[id]=ui_life
set g_hpForUp[id]=ui_life+HP_CHANGE_STEP
set g_hpForDown[id]=ui_life-HP_CHANGE_STEP
set g_prevEventHP[id]=ui_life
set g_prevHPPercent[id]=R2IEx((ui_life/GetUnitState(u, UNIT_STATE_MAX_LIFE))*100)
set g_hpPercentForUp[id]=g_prevHPPercent[id] + HP_PERCENT_CHANGE_STEP
set g_hpPercentForDown[id]=g_prevHPPercent[id] - HP_PERCENT_CHANGE_STEP
set g_prevEventHPPercent[id]=g_prevHPPercent[id]
set g_trgLifeTrack[id]=CreateTrigger()
call TriggerRegisterUnitStateEvent(g_trgLifeTrack[id], u, UNIT_STATE_LIFE, LESS_THAN, life-1)
call TriggerRegisterUnitStateEvent(g_trgLifeTrack[id], u, UNIT_STATE_LIFE, GREATER_THAN, life+1)
call TriggerAddCondition(g_trgLifeTrack[id], Condition(function Trig_HP_Changed))
set u=null
endfunction
function Trig_LifeEventRemoved takes nothing returns nothing
local integer id=udg_UDex
call DestroyTrigger(g_trgLifeTrack[id])
set g_trgLifeTrack[id]=null
endfunction
//==============================================================
function InitTrig_LifeEvent takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerRegisterVariableEvent(t, "udg_UnitIndexEvent", EQUAL, 1.00)
call TriggerAddAction(t, function Trig_LifeEventEnters)
set t=CreateTrigger()
call TriggerRegisterVariableEvent(t, "udg_UnitIndexEvent", EQUAL, 2.00)
call TriggerAddAction(t, function Trig_LifeEventRemoved)
endfunction