Can custom function take boolean or code?

afisakov

You can change this now in User CP.
Reaction score
37
I have a trigger that is getting very repetitive in its steps, trying to make custom function to encompass most of these, to save space and make it easier to tweak. But game does not want to accept way I tried to trigger it.

Original trigger
Code:
function gen_enemy takes nothing returns boolean
   return GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0.405 and IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetAttacker()))
endfunction

function ice_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'Bfro')<1)
endfunction
function icemag_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'BHca')<1)
endfunction
function den1_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'B007')<1) and (GetUnitAbilityLevel(GetFilterUnit(),'B004')<1)
endfunction

function Trig_den_auto_Actions takes nothing returns nothing
local unit u=GetAttacker()
local location TempLoc
local group TempGroup
   if (GetUnitTypeId(u) == 'oC31') then
     call PolledWait(0.2)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(900, TempLoc, Condition(function den1_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     //call DisplayTextToPlayer(GetOwningPlayer(u),0,0,I2S(CountUnitsInGroup(TempGroup)))
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'o00A') then
     call PolledWait(0.12)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(1100, TempLoc, Condition(function den1_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'o00N') then
     call PolledWait(0.11)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(1050, TempLoc, Condition(function ice_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'oC85') then
     call PolledWait(0.2)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(850, TempLoc, Condition(function ice_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'hC13') then
     call PolledWait(1.0)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(600, TempLoc, Condition(function ice_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'h00F') then
     call PolledWait(0.5)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(800, TempLoc, Condition(function ice_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
   if (GetUnitTypeId(u) == 'hC05') then
     call PolledWait(0.9)
     set TempLoc=GetUnitLoc(u)
     set TempGroup = GetUnitsInRangeOfLocMatching(600, TempLoc, Condition(function icemag_enemy))
     call IssueTargetOrderBJ(u, "attack", FirstOfGroup(TempGroup) )
     call DestroyGroup(TempGroup)
     call RemoveLocation(TempLoc)
   endif
  set u=null
endfunction
You can see the same paragraph keep repeating itself with minor tweaks.

Attempt to fix, leaving out alot of the unneeded parts
Code:
function gen_enemy takes nothing returns boolean
   return GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0.405 and IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetAttacker()))
endfunction

function ice_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'Bfro')<1)
endfunction
function icemag_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'BHca')<1)
endfunction
function den1_enemy takes nothing returns boolean
   return gen_enemy() and (GetUnitAbilityLevel(GetFilterUnit(),'B007')<1) and (GetUnitAbilityLevel(GetFilterUnit(),'B004')<1)
endfunction

function retarget takes unit atk, real wt, real Range, code ab3 returns nothing
local location TempLoc
local group TempGroup
   call PolledWait(wt)
   set TempLoc=GetUnitLoc(atk)
   set TempGroup = GetUnitsInRangeOfLocMatching(Range, TempLoc, Condition(function ab3))
   call IssueTargetOrderBJ(atk, "attack", FirstOfGroup(TempGroup) )
   call DestroyGroup(TempGroup)
   call RemoveLocation(TempLoc)
endfunction

function Trig_den_auto_Actions takes nothing returns nothing
local unit u=GetAttacker()
   if (GetUnitTypeId(u) == 'oC31') then
     call retarget(u,0.3,900,den1_enemy)
   endif
   if (GetUnitTypeId(u) == 'o00A') then
     call retarget(u,0.12,1100,den1_enemy)
   endif
   if (GetUnitTypeId(u) == 'o00N') then
     call retarget(u,0.11,1050,ice_enemy)
   endif
...

The problem is the retarget function is not saving properly, the game keeps giving me a "expected a name" error message.
I have tried putting the condition functions (e.g. "den1_enemy") upwards as code or boolexpr with no success.
Please help! Explanation of why I am failing or advice on how to get it to work would be greatly appreciated.

P.S.
Leaving the conditions out of the retarget function would undo half of what I attempted to accomplish by reformatting this trigger.
 

jonas

You can change this now in User CP.
Reaction score
67
[/code]
function Trig_den_auto_Actions takes nothing returns nothing
local unit u=GetAttacker()
if (GetUnitTypeId(u) == 'oC31') then
call retarget(u,0.3,900,den1_enemy)
endif
if (GetUnitTypeId(u) == 'o00A') then
call retarget(u,0.12,1100,den1_enemy)
endif
if (GetUnitTypeId(u) == 'o00N') then
call retarget(u,0.11,1050,ice_enemy)
endif
...
[/code]

Have you tried putting "function" in front of the names, like this:

JASS:
call retarget(u, 0.11, 1050,  function ice_enemy)


Also, remove it from the other place:
JASS:


This is how I remember the syntax, but it has been years since I used it.
I'm only using zinc nowadays:

http://www.wc3c.net/vexorian/zincmanual.html#anonfunc

Also, if you have strange syntax errors and you can't really place them, I recommend delta debugging...
https://www.st.cs.uni-saarland.de/dd/
 

afisakov

You can change this now in User CP.
Reaction score
37
Have you tried putting "function" in front of the names, like this:

JASS:
call retarget(u, 0.11, 1050,  function ice_enemy)


Also, remove it from the other place:
JASS:


This is how I remember the syntax, but it has been years since I used it.
I'm only using zinc nowadays:

http://www.wc3c.net/vexorian/zincmanual.html#anonfunc

Also, if you have strange syntax errors and you can't really place them, I recommend delta debugging...
https://www.st.cs.uni-saarland.de/dd/

It now works.
I figured it probably had something to do with my syntax but did not know how to find the correct way to write it. Trial and error were not cooperating and WE does not give very good error messages.

Thank You!
 
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