Boolean Compile Error

D

Dino.pl

Guest
You must specify a name for your function
It is: function
And it should be: function XXX takes YYY returns ZZZ
 
D

dArKzEr0

Guest
> ...should work aswell. then you will only need one function.
You're right, it works in one function.

>You must specify a name for your function
Isn't the name of the function: "IsEnemyAndAlive" ?

Code:
function [B]IsEnemyAndAlive [/B]takes nothing returns boolean
   local unit casterUnit = GetSpellAbilityUnit()
   return GetBooleanAnd( (IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true), (IsUnitAliveBJ(GetFilterUnit())==true))
endfunction

-darkz
 
D

Dino.pl

Guest
Code:
function
   ...
   local unit casterUnit
   ...
No, it isn't ^^

And maybe replace
Code:
function IsEnemy takes unit casterUnit returns boolean
   return ( IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true)
endfunction

function IsAlive takes nothing returns boolean
   return ( IsUnitAliveBJ(GetFilterUnit())==true )
endfunction

function IsEnemyAndAlive takes unit casterUnit returns boolean
   return GetBooleanAnd(IsEnemy(casterUnit), IsAlive())
endfunction
with
Code:
function IsEnemyAndAlive takes unit casterUnit returns boolean
   return (GetUnitState(casterUnit, UNIT_STATE_LIFE) > 0 and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true)
endfunction
 
D

dArKzEr0

Guest
Dino.pl said:
Code:
function
   ...
   local unit casterUnit
   ...
No, it isn't ^^

Yes, my main function has a name, I just didn't include it to save space and reading time:

Code:
function Trig_Channel_Actions takes nothing returns nothing
   local unit casterUnit = GetSpellAbilityUnit()
   local location casterPoint = GetUnitLoc(casterUnit)
   ...
   ...
   ...
[B]   call ForGroupBJ(GetUnitsInRangeOfLocMatching( 600, casterPoint, Condition(function IsEnemyAndAlive) ))[/B]
   ...
   ...
endfunction

There's a lot more code in between, but the compile error is at the bold line.

-darkz

Edit://
I had already changed IsEnemyAndAlive() to be self inclusive as per SFilip's reccomendation, but I changed it to what you said anyway. IsEnemyAndAlive() compiles fine, but I'm still getting the invalid number of arguments error.
 
D

dArKzEr0

Guest
Code:
function Trig_Channel_Conditions takes nothing returns boolean
   return (GetSpellAbilityId()=='A000')
endfunction

//function IsEnemy takes nothing returns boolean
//   local unit casterUnit = GetSpellAbilityUnit()
//   return ( IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true)
//endfunction
//
//function IsAlive takes nothing returns boolean
//   return ( IsUnitAliveBJ(GetFilterUnit())==true )
//endfunction
//
//function IsEnemyAndAlive takes nothing returns boolean
//   return GetBooleanAnd(IsEnemy(), IsAlive())
//endfunction
//
//function IsEnemyAndAlive takes nothing returns boolean
//   local unit casterUnit = GetSpellAbilityUnit()
//   return GetBooleanAnd( (IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true), (IsUnitAliveBJ(GetFilterUnit())==true))
//endfunction

[U]function IsEnemyAndAlive takes nothing returns boolean
   local unit casterUnit = GetSpellAbilityUnit()
   return GetBooleanAnd( (IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true), GetUnitState(casterUnit, UNIT_STATE_LIFE) > 0)
endfunction[/U]

function Trig_Channel_Actions takes nothing returns nothing
   local unit casterUnit = GetSpellAbilityUnit()
   local location casterPoint = GetUnitLoc(casterUnit)
   local unit array graveUnit
   local location array gravePoint
   local lightning array lightningEffect
   local effect array darkPortalEffect
   local effect array graveEffect
   local integer i = 0
   local integer a
   local integer b

   loop
      exitwhen i>4
      call CreateNUnitsAtLocFacingLocBJ( 1, 'h000', GetOwningPlayer(casterUnit), casterPoint, GetUnitLoc(casterUnit) )
      set graveUnit[i] = GetLastCreatedUnit()
      set gravePoint[i] = PolarProjectionBJ(casterPoint, 300.00, (-90.00 + (72.00*I2R(i))) )
      call SetUnitPositionLocFacingLocBJ(graveUnit[i], gravePoint[i], casterPoint )
      call UnitApplyTimedLifeBJ( 11.50, 'BTLF', graveUnit[i] )
      set i=i+1
   endloop

   call CreateNUnitsAtLocFacingLocBJ(1, 'h001', GetOwningPlayer(casterUnit), casterPoint, GetUnitLoc(casterUnit) )
   set graveUnit[5] = GetLastCreatedUnit()
   call UnitApplyTimedLifeBJ( 11.50, 'BTLF', graveUnit[5] )

   set a=0
   loop
      exitwhen a>3
      set b=0
      loop
         exitwhen b>4
         if ( GetBooleanOr( IAbsBJ( b-a ) == 1, IAbsBJ( b-a ) == 4 )) then
            call AddLightningLoc( "SPLK", gravePoint[a], gravePoint[b])
            set lightningEffect[((4*a)+b)] = GetLastCreatedLightningBJ()
         else
            call AddLightningLoc( "AFOD", gravePoint[a], gravePoint[b] )
            set lightningEffect[((4*a)+b)] = GetLastCreatedLightningBJ()
         endif
         set b=b+1
      endloop
      set a=a+1
   endloop

   set a=1
   loop
      exitwhen a>10
      [U]call ForGroupBJ(GetUnitsInRangeOfLocMatching( ( 840.00 - ( I2R(a) * 30.00 ) ), casterPoint, Condition(function IsEnemyAndAlive) ))[/U]
//call ForGroupBJ( GetUnitsInRangeOfLocMatching(( 840.00 - ( I2R(a) * 30.00 ) ), casterPoint, Condition(GetBooleanAnd( (IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))) , (IsUnitAliveBJ(GetFilterUnit())))) ))
      set b=1
      loop
         exitwhen b>18
         call AddSpecialEffectLocBJ( PolarProjectionBJ(casterPoint, (840.00 - ( I2R(a) * 30.00) ), (I2R(b) * 20.00)), "Abilities\\Spells\\Demon\\DarkPortal\\DarkPortalTarget.mdl" )
         set darkPortalEffect[b] = GetLastCreatedEffectBJ()
         set b=b+1
      endloop

      set b=0
      loop
         exitwhen b>4
         call AddSpecialEffectLocBJ( gravePoint[b], "Abilities\\Spells\\Orc\\EtherealForm\\SpiritWalkerChange.mdl" )
         set graveEffect[b] = GetLastCreatedEffectBJ()
         call AddSpecialEffectLocBJ( gravePoint[b], "Abilities\\Spells\\Orc\\AncestralSpirit\\AncestralSpiritCaster.mdl" )
         set graveEffect[(b+5)] = GetLastCreatedEffectBJ()
         set b=b+1
      endloop

      call TriggerSleepAction( 1.00 )

      set b=0
      loop
         exitwhen b>18
         call DestroyEffectBJ( graveEffect[b] )
         call DestroyEffectBJ( darkPortalEffect[b] )
         set b=b+1
      endloop

      set a=a+1
   endloop

   set i=1
   loop
      exitwhen i>20
      call DestroyLightningBJ( lightningEffect[i])
      set i=i+1
   endloop
endfunction

//===========================================================================
function InitTrig_Channel takes nothing returns nothing
    set gg_trg_Channel = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Channel, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Channel, Condition( function Trig_Channel_Conditions ) )
    call TriggerAddAction( gg_trg_Channel, function Trig_Channel_Actions )
endfunction

Note: I'm aware of unpatched memory leaks.
Disclaimer: This is a remake of Simeon's spell found in Pentagram Ability It was originally buggy and poorly written, I'm trying to optimize it as practice with JASS.

-darkz
 
D

Dino.pl

Guest
Ok, LOL, the error is on this line, you're right.

It should be:
call ForGroupBJ(GetUnitsInRangeOfLocMatching( 600, casterPoint, Condition(function IsEnemyAndAlive) ), WHAT_TO_DO_WITH_PICKED_UNITS)

EDIT:
And why do you use
Code:
function IsEnemyAndAlive takes nothing returns boolean
   local unit casterUnit = GetSpellAbilityUnit()
   return GetBooleanAnd( (IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(casterUnit))==true), GetUnitState(casterUnit, UNIT_STATE_LIFE) > 0)
endfunction
instead of the Super Duper code I posted? :/

EDIT2:
You can use
Code:
         if ( IAbsBJ( b-a ) == 1 or IAbsBJ( b-a ) == 4 ) then
            set lightningEffect[((4*a)+b)] = AddLightningLoc( "SPLK", gravePoint[a], gravePoint[b])
         else
instead of
Code:
         if ( GetBooleanOr( IAbsBJ( b-a ) == 1, IAbsBJ( b-a ) == 4 )) then
            call AddLightningLoc( "SPLK", gravePoint[a], gravePoint[b])
            set lightningEffect[((4*a)+b)] = GetLastCreatedLightningBJ()
         else
EDIT3:
You can use
Code:
   set graveUnit[5] = CreateNUnitsAtLocFacingLocBJ(1, 'h001', GetOwningPlayer(casterUnit), casterPoint, GetUnitLoc(casterUnit) )
instead of
Code:
   call CreateNUnitsAtLocFacingLocBJ(1, 'h001', GetOwningPlayer(casterUnit), casterPoint, GetUnitLoc(casterUnit) )
   set graveUnit[5] = GetLastCreatedUnit()
EDIT4: In the end get rid of all BJ's, Swap's, ForPlayer's and so on.
 
D

dArKzEr0

Guest
Wow.

::walks away shame-faced::

You know, it was there originally... I must've deleted it somewhere along the way trying to get the boolexpr to work or something.

Thanks for your help, and thanks for the optimized 'Super Duper' code.

-darkz

Edit://
Code:
set graveUnit[5] = CreateNUnitsAtLocFacingLocBJ(1, 'h001', GetOwningPlayer(casterUnit), casterPoint, GetUnitLoc(casterUnit) )
Yields an error: "Type mismatch in assignment"
 
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