[vJass] Calling functions from a variable

Frozenhelfir

set Gwypaas = Guhveepaws
Reaction score
56
I was wondering if there is a variable (my thoughts are the code variable but I'm not certain) that points to a function. My intent with this is to call a different function based on a loop so I don't have a lot of triggers fire off of the same event, rather it'll just loop through an action that will call different functions based on logic comparison truths. Here is what I'm trying to do:

YELLOW is just a random variable with each containing a different spell ID. So if I have 20 spells that do something when they are cast, instead of having 20 triggers, I'm trying to just have one trigger that checks the conditions and then chooses the correct action(s). Just a side question, is this the best way to optimize code or would there be a better way that I am not aware of?


JASS:

private function Action0 takes nothing returns nothing
//does something fun and exciting which is so exciting you can't see it or you would die of excitement (actually not setup yet!)
endfunction

private function Action1 takes nothing returns nothing
//does whatever I want this one to do
endfunction

private function Action2 takes nothing returns nothing
//does whatever this one does
endfunction

private function Conditions takes nothing returns nothing
    set i = 0
    
    loop
        if GetSpellAbilityId() == YELLOW<i>[1] then
            call Action# //I want this line to call those two functions above based on the value of i when the if checks true
        endif
        exitwhen i &gt;=2
        set i = i+1
    endloop
endfunction</i>
 

Artificial

Without Intelligence
Reaction score
326
> instead of having 20 triggers, I'm trying to just have one trigger that checks the conditions and then chooses the correct action(s).
Wtf, why? Just to make it harder to read and code? :D

Anyway, this'd be one (IMO pretty stylish) way to do it:
JASS:
function interface InterfaceName takes nothing returns nothing //

private function Action0 takes nothing returns nothing
//does something fun and exciting which is so exciting you can&#039;t see it or you would die of excitement (actually not setup yet!)
endfunction

private function Action1 takes nothing returns nothing
//does whatever I want this one to do
endfunction

private function Action2 takes nothing returns nothing
//does whatever this one does
endfunction

private function Conditions takes nothing returns nothing
    local InterfaceName array funcs //
    set funcs[0] = InterfaceName.Action0 //
    set funcs[1] = InterfaceName.Action1 //
    set funcs[2] = InterfaceName.Action2 //

    set i = 0
    
    loop
        if GetSpellAbilityId() == YELLOW<i>[1] then
            call funcs<i>.execute() // 
        endif
        exitwhen i &gt;=2
        set i = i+1
    endloop
endfunction</i></i>
 

Frozenhelfir

set Gwypaas = Guhveepaws
Reaction score
56
@Joker(DiV): I read the text macros and I kind of see how I could use one, but I can't seem to pass a variable into them (or at least the syntax isn't what I think it'd be). Do you know if this is possible?

@Artificial: Hey, that's pretty cool! Didn't know those existed. To answer your question: Yes it may be a little harder to read (rather than having it spread out in other triggers) but from what I know it should make the processes more efficient and reduce lag. Reducing lag is my primary concern because right now the map can get laggy at times and this will hopefully dissapear as I convert more GUI into JASS and devise better systems such as the one you suggested as I become more skilled.

Also, do those "funcs" variables have to be set each time the trigger is run or can I just set them and forget them at initialization? And the interface is like a scope in respect that it can have private functions if I'm not mistaken?
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top