grow/shrink trigger not working

PrisonLove

Hard Realist
Reaction score
78
I'm using the vanilla editor (running on a mac) and I have a trigger that fires when a unit picks up a red mushroom (it's a mario map). As you know, when you get a red mushroom in mario your character grows, gets more health/damage/other stuff. That's what's happening here. Everything about this trigger works, except for the shrinking portion. The character grows, gets damage, range, etc, the range and damage go back to normal, but the character never gets smaller and I don't know why.

Here is the code:

JASS:
function RedMushroomConditions takes nothing returns boolean
    return GetItemTypeId(GetManipulatedItem()) == 'I003'
endfunction


function RedMushroomShrink takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit caster = LoadUnitHandle(udg_hash, id, 0)
    local real scaleAmnt = LoadReal(udg_hash, id, 1)
    local real scaleFactor = scaleAmnt - 5
    local real scale = 200 - scaleFactor
    local real scaleCap = 100.00

    if (scale > scaleCap) then
        call SetUnitScalePercent(caster, scale, scale, scale)
        set scaleAmnt = scaleFactor
        call SaveReal(udg_hash, id, 1, scaleAmnt)
    else
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(udg_hash, id)
    endif
    
    set t = null
    set caster = null
endfunction


function RedMushroomGrow takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit caster = LoadUnitHandle(udg_hash, id, 0)
    local real scaleAmnt = LoadReal(udg_hash, id, 1)
    local real scaleFactor = scaleAmnt + 5
    local real scale = 100.00 + scaleFactor
    local real scaleCap = 215.00

    if (scale < scaleCap) then
        call SetUnitScalePercent(caster, scale, scale, scale)
        set scaleAmnt = scaleFactor
        call SaveReal(udg_hash, id, 1, scaleAmnt)
    else
        call PauseTimer(t)
        call DestroyTimer(t)
    endif
    
    set t = null
    set caster = null
endfunction


function RedMushroomActions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local player p = GetOwningPlayer(caster)
    local integer i = GetPlayerId(p) + 1
    local timer t = CreateTimer()
    local timer t2 = CreateTimer()
    local integer id = GetHandleId(t)
    local real duration = 10
    local real scaleAmnt = 0

    set udg_damageAmount<i> = udg_damageAmount<i> + 40
    set udg_offsetRange<i> = udg_offsetRange<i> + 50
    set udg_attackRange<i> = udg_attackRange<i> + 50
    call UnitAddAbility(caster, &#039;A00B&#039;)

    call SaveUnitHandle(udg_hash, id, 0, caster)
    call SaveReal(udg_hash, id, 1, scaleAmnt)

    call TimerStart(t, .03, true, function RedMushroomGrow)

    call TriggerSleepAction(duration)

    set scaleAmnt = LoadReal(udg_hash, id, 1)
    set id = GetHandleId(t2)
    call SaveUnitHandle(udg_hash, id, 0, caster)
    call SaveReal(udg_hash, id, 1, scaleAmnt)
    call TimerStart(t2, .03, true, function RedMushroomShrink)

    call UnitRemoveAbility(caster, &#039;A00B&#039;)
    set udg_damageAmount<i> = udg_damageAmount<i> - 40
    set udg_offsetRange<i> = udg_offsetRange<i> - 50
    set udg_attackRange<i> = udg_attackRange<i> - 50

    set caster = null
    set p = null
    set t = null
    set t2 = null
endfunction

//===========================================================================
function InitTrig_RedMushroom takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddCondition( t, Condition( function RedMushroomConditions ) )
    call TriggerAddAction( t, function RedMushroomActions )
    set t = null
endfunction</i></i></i></i></i></i></i></i></i></i></i></i>
 

the Immortal

I know, I know...
Reaction score
51
Your calculations are wrong.

[ljass] local real scale = 200 - scaleFactor[/ljass]

this should be simply

[ljass] local real scale = 100.00 + scaleFactor[/ljass]


as it is in your other function. Or set scaleAmnt to 0 for the shrink function.
Also you can make the 2 functions one, saving whether you are increasing or decreasing in the hashtable. I'd trade these 2 function calls for some readability / less spaghettiness.


PS. Explanation: Growing stops at 215% scale, meaning [ljass]scaleAmnt = 115[/ljass]. You don't reset it first time you shrink, so it becomes 110, and then [ljass]scale = 200 - scaleFactor = 200 - 110 = 90 < 100[/ljass] which stops the timer, when it should actually be [ljass]100 + scaleFactor = 100 + 110 = 210[/ljass].

On the other hand, you can set [ljass]scaleAmnt = 0[/ljass], make it increase by 5 in the shrink function (not decrease) and then calculate size with [ljass]scale = 215 - scaleFactor = 215 - 5 = 210 //(205, 200, ...)[/ljass]

Hope it helps.
 

PrisonLove

Hard Realist
Reaction score
78
Yep, that did it, thanks a lot. I was trying to figure out how to put them both into one function, any ideas? I know they're far too similar not to be one function.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top