Larcenist
REP: Respect, Envy, Prosperity?
- Reaction score
- 211
What's the most efficient way of passing data from an array to a lower array inside a loop, to recycle the variable?
Recycling this part of the code:
The whole code:
Recycling this part of the code:
JASS:
if data.currentfaderate > data.endfaderate then
call PauseTimer(Timer<i>)
call DestroyTimer(Timer<i>)
if data.turnback == true then
call SetUnitVertexColor(data.fadeunit, data.red, data.green, data.blue, 255)
endif
call data.destroy()
set Timer<i> = null
set Timer<i> = Timer[Counter] //This line
set Data<i> = Data[Counter] //And this line
set Counter = Counter - 1
else</i></i></i></i></i>
The whole code:
JASS:
library FadeUnit
private struct SData
unit fadeunit
real currentfaderate
real endfaderate
real fadeamount
integer red
integer green
integer blue
boolean turnback
endstruct
globals
private timer array Timer
private SData array Data
private integer Counter = 0
private real TimerPeriod = 0.05
endglobals
private function FadeUnitTimedTimerCallback takes nothing returns nothing
local SData data
local integer i = Counter
local integer Alpha
loop
exitwhen i <= 0
if Timer<i> == GetExpiredTimer() then
set data = Data<i>
set data.currentfaderate = data.currentfaderate + data.fadeamount
if data.currentfaderate > data.endfaderate then
call PauseTimer(Timer<i>)
call DestroyTimer(Timer<i>)
if data.turnback == true then
call SetUnitVertexColor(data.fadeunit, data.red, data.green, data.blue, 255)
endif
call data.destroy()
set Timer<i> = null
set Timer<i> = Timer[Counter]
set Data<i> = Data[Counter]
set Counter = Counter - 1
else
set Alpha = R2I((100 - data.currentfaderate) * I2R(255) * 0.01)
if Alpha < 0 then
set Alpha = 0
elseif Alpha > 255 then
set Alpha = 255
endif
call SetUnitVertexColor(data.fadeunit, data.red, data.green, data.blue, Alpha)
endif
endif
set i = i - 1
endloop
endfunction
function FadeUnitTimed takes unit u, integer red, integer green, integer blue, real startfade, real endfade, real fadetime, boolean turnback returns nothing
local SData data
local integer Alpha
set Counter = Counter + 1
if Timer[Counter] == null then
set data = SData.create()
set Timer[Counter] = CreateTimer()
set Data[Counter] = data
set data.fadeunit = u
set data.endfaderate = endfade
set data.fadeamount = ((endfade - startfade) / fadetime) * TimerPeriod
set data.currentfaderate = data.fadeamount
set data.red = red
set data.green = green
set data.blue = blue
set data.turnback = turnback
set Alpha = R2I((100 - data.fadeamount) * I2R(255) * 0.01)
if Alpha < 0 then
set Alpha = 0
elseif Alpha > 255 then
set Alpha = 255
endif
call SetUnitVertexColor(u, red, green, blue, Alpha)
call TimerStart(Timer[Counter], TimerPeriod, true, function FadeUnitTimedTimerCallback)
else
call BJDebugMsg("Timer is not nulled or still in use")
endif
endfunction
endlibrary</i></i></i></i></i></i></i>