1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. The mythological era has spawned some interesting characters around. Check them out and be sure to vote for them in the 30th Poll of the Texturing Contest.
    Dismiss Notice
  3. The 20th iteration of the Terraining Contest is upon us! Join and create exquisite Water Structures for it.
    Dismiss Notice
  4. Hivers united and created a bunch of 2v2 melee maps. Vote for the best in our Melee Mapping Contest #4 - Poll!
    Dismiss Notice
  5. Check out the Staff job openings thread.
    Dismiss Notice

Fear System v3

Submitted by Malhorne
This bundle is marked as approved. It works and satisfies the submission rules.
Hi everyone,
Here is my first submission there.
It is a fear system.
What is a fear ? It is a crowd control that makes the target to move randomly while being unable to attack or get orders from the owner of the unit.

Here is the code (and the doc at the beggining) with Vex's Table or Bribe's Table.
Vexorian version :
Code (vJASS):
library FearSystem /* v3
************************************************************************************
*
*   */
uses /*
*  
*       */
Table /*       http://www.wc3c.net/showthread.php?t=101246
*        //By Vexorian
*
************************************************************************************
*
*   struct Fear extends array
*
*       Description
*       -------------------------
*
*           This is a fear system; use it to remove player
*           control from a unit temporarily. Units affected
*           will also be unable to attack.
*
*       Fields
*       -------------------------
*
*           unit targ -> The unit you want to apply the fear.
*
*           string path -> The path of the sfx you want to add to the unit.
*
*           string attach -> The attachment string you want the sfx to be on the unit
*
*           readonly effect e -> The effect currently applied to the unit.
*           Initializes to null
*
*       Methods
*       -------------------------
*
*           static method create takes nothing returns thistype
*           method destroy takes nothing returns nothing
*
*           method start takes nothing returns nothing
*           When you have set every parameters you start your fear instance.
*
*           method changeEffect takes string path, string attach returns nothing
*           If you already have set the effect of your instance and it is running
*           and you want to change it use this.
*
*           static method isFeared takes unit u returns boolean
*           static method get takes unit u returns thistype
*          
*       Operators
*       -------------------------
*
*           method operator time= takes real t returns nothing
*           method operator time takes nothing returns real
*
*       Credits
*       -------------------------
*
*           - Vexorian for vJASS and Table
*           - Maker for the DisableUnit function
*           - Bribe for Table
*           - Chobibo for the addition in the DisableUnit function/
*
************************************************************************************/

    native UnitAlive takes unit u returns boolean
   
    globals
        //There will be check every FPS second.
        private constant real FPS = 0.31250000
        //Feared units will change direction every EACH_CHANGE FPS.
        private constant integer EACH_CHANGE = 3
        //Feared units will go maximum in a circle of 150 around them each time they change direction.
        private constant real AROUND = 150.
        //The rawcode of the attack disable. Be sure it is the same in the Object Editor.
        private constant integer DISABLE_ATTACK = 'W000'
        //The rawcode of the morph. Be sure it is the same in the Object Editor.
        private constant integer MORPH_ID = 'Z001'
        //The rawcode of the bear form. Be sure it is the same in the Object Editor.
        private constant integer BEAR_ID = 'Z000'
    endglobals
   
    //The Table for Vexorian version
    globals
        private HandleTable tab
    endglobals

   
    private function round takes real r returns integer
        return R2I(r+0.5)
    endfunction
   
    private function modulo takes integer a, integer b returns integer
        return a - (a/b)*b
    endfunction
   
    //Credits to Maker for this awesum func <3
    private function DisableControl takes unit u returns nothing
        local boolean b
        call UnitAddAbility(u, 'Aloc')
        call UnitRemoveAbility(u, 'Aloc')
        if IsUnitType(u, UNIT_TYPE_HERO) then
            call UnitAddAbility(u,MORPH_ID)
            call IssueImmediateOrder(u, "metamorphosis")
            call UnitRemoveAbility(u,MORPH_ID)
        else
            call UnitAddAbility(u, BEAR_ID)
            call IssueImmediateOrder(u, "bearform")
            call UnitRemoveAbility(u, BEAR_ID)    
        endif
        //Thanks to chobibo for this idea
        if GetLocalPlayer() != GetOwningPlayer(u) then
            set b = not IsUnitHidden(u)
            call ShowUnit(u,false)
            call ShowUnit(u,b)
        endif
        //I added this line to disable their attack too.
        call UnitAddAbility(u,DISABLE_ATTACK)
    endfunction
   
    private function EnableControl takes unit u returns nothing
        local boolean backup = not IsUnitHidden(u)
        call ShowUnit(u,false)
        //I added this line to enable their attack.
        call UnitRemoveAbility(u,DISABLE_ATTACK)
        call ShowUnit(u,backup)
    endfunction
   
    struct Fear extends array
        unit targ
        string path
        string attach
        readonly effect e
        readonly boolean b
        private integer steps
        private integer startat
        private static timer period
        private static integer dindex
        private static thistype array data
        private static integer instanceCount
        private static thistype recycle
        private thistype recycleNext
       
        private static method periodic takes nothing returns nothing
            local thistype this
            local real x
            local real y
            local integer i = 0
            loop
                exitwhen i > dindex
                set this = data[i]
                if modulo(this.steps,EACH_CHANGE) == this.startat then
                    set x = GetUnitX(this.targ)
                    set y = GetUnitY(this.targ)
                    call IssuePointOrder(this.targ, "move", GetRandomReal(x-AROUND,x+AROUND), GetRandomReal(y-AROUND, x+AROUND) )
                endif
                set this.steps = this.steps - 1
                if this.steps == 0 or not(UnitAlive(this.targ)) then
                    set data[i] = data[dindex]
                    set i = i - 1
                    set dindex = dindex - 1
                    if this.e != null then
                        call DestroyEffect(this.e)
                        set this.e = null
                    endif
                    call IssueImmediateOrder(this.targ,"stop")
                    call EnableControl(this.targ)
                    call tab.flush(this.targ)
                    if this.b then
                        set this.targ = null
                        set recycleNext = recycle
                        set recycle = this
                    endif
                endif
                if dindex == -1 then
                    call PauseTimer(period)
                endif
                set i = i + 1
            endloop
        endmethod
       
        static method isFeared takes unit u returns boolean
            return tab.exists(u)
        endmethod
       
        method operator time= takes real t returns nothing
            set this.steps = round(t/FPS)
        endmethod
       
        method operator time takes nothing returns real
            return this.steps*FPS
        endmethod
       
        method changeEffect takes string path, string attach returns nothing
            call DestroyEffect(this.e)
            set this.e = null
            set this.e = AddSpecialEffectTarget(path,this.targ,attach)
        endmethod
       
        static method get takes unit u returns thistype
            if isFeared(u) then
                return tab[u]
            else
                debug call BJDebugMsg("Tryng to get wrong instance")
                return 0
            endif
        endmethod
       
        method start takes nothing returns nothing
            debug if this.targ==null or this.steps==0 then
                debug call BJDebugMsg("You're instanciating badly ....")
                debug return
            debug endif
            set dindex = dindex + 1
            set data[dindex] = this
            set this.startat = modulo(this.steps,EACH_CHANGE)
            call DisableControl(this.targ)
            if this.path != "" and this.attach != ""  then
                set this.e = AddSpecialEffectTarget(this.path, this.targ, this.attach)
            endif
            set tab[this.targ] = this
            if dindex == 0 then
                call TimerStart(period, FPS, true, function thistype.periodic)
            endif
        endmethod
       
        static method create takes nothing returns thistype
            local thistype this
            if recycle == 0 then
                set instanceCount = instanceCount + 1
                set this = instanceCount
            else
                set this = recycle
                set recycle = recycle.recycleNext
            endif
            set this.path = ""
            set this.attach = ""
            set this.e = null
            set this.b = false
            return this
        endmethod
       
        method destroy takes nothing returns nothing
            set this.b = true
        endmethod
       
        private static method onInit takes nothing returns nothing
            set tab = HandleTable.create()
            set dindex = - 1
            set instanceCount = 0
            set recycle = 0
            set period = CreateTimer()
        endmethod
    endstruct
endlibrary


The Bribe version :
Code (vJASS):
library FearSystem /* v3
************************************************************************************
*
*   */
uses /*
*  
*       */
Table /*        http://www.hiveworkshop.com/forums/jass-resources-412/snippet-new-table-188084/
*        //By Bribe
*
************************************************************************************
*
*   struct Fear extends array
*
*       Description
*       -------------------------
*
*           This is a fear system; use it to remove player
*           control from a unit temporarily. Units affected
*           will also be unable to attack.
*
*       Fields
*       -------------------------
*
*           unit targ -> The unit you want to apply the fear.
*
*           string path -> The path of the sfx you want to add to the unit.
*
*           string attach -> The attachment string you want the sfx to be on the unit
*
*           readonly effect e -> The effect currently applied to the unit.
*           Initializes to null
*
*       Methods
*       -------------------------
*
*           static method create takes nothing returns thistype
*           method destroy takes nothing returns nothing
*
*           method start takes nothing returns nothing
*           When you have set every parameters you start your fear instance.
*
*           method changeEffect takes string path, string attach returns nothing
*           If you already have set the effect of your instance and it is running
*           and you want to change it use this.
*
*           static method isFeared takes unit u returns boolean
*           static method get takes unit u returns thistype
*          
*       Operators
*       -------------------------
*
*           method operator time= takes real t returns nothing
*           method operator time takes nothing returns real
*
*       Credits
*       -------------------------
*
*           - Vexorian for vJASS and Table
*           - Maker for the DisableUnit function
*           - Bribe for Table
*           - Chobibo for the addition in the DisableUnit function/
*
************************************************************************************/

    native UnitAlive takes unit u returns boolean
   
    globals
        //There will be check every FPS second.
        private constant real FPS = 0.31250000
        //Feared units will change direction every EACH_CHANGE FPS.
        private constant integer EACH_CHANGE = 3
        //Feared units will go maximum in a circle of 150 around them each time they change direction.
        private constant real AROUND = 150.
        //The rawcode of the attack disable. Be sure it is the same in the Object Editor.
        private constant integer DISABLE_ATTACK = 'W000'
        //The rawcode of the morph. Be sure it is the same in the Object Editor.
        private constant integer MORPH_ID = 'Z001'
        //The rawcode of the bear form. Be sure it is the same in the Object Editor.
        private constant integer BEAR_ID = 'Z000'
    endglobals
   
    globals
        private Table tb
    endglobals
   
    private function round takes real r returns integer
        return R2I(r+0.5)
    endfunction
   
    private function modulo takes integer a, integer b returns integer
        return a - (a/b)*b
    endfunction
   
    //Credits to Maker for this awesum func <3
    private function DisableControl takes unit u returns nothing
        local boolean b
        call UnitAddAbility(u, 'Aloc')
        call UnitRemoveAbility(u, 'Aloc')
        if IsUnitType(u, UNIT_TYPE_HERO) then
            call UnitAddAbility(u,MORPH_ID)
            call IssueImmediateOrder(u, "metamorphosis")
            call UnitRemoveAbility(u,MORPH_ID)
        else
            call UnitAddAbility(u, BEAR_ID)
            call IssueImmediateOrder(u, "bearform")
            call UnitRemoveAbility(u, BEAR_ID)    
        endif
        //Thanks to chobibo for this idea
        if GetLocalPlayer() != GetOwningPlayer(u) then
            set b = not IsUnitHidden(u)
            call ShowUnit(u,false)
            call ShowUnit(u,b)
        endif
        //I added this line to disable their attack too.
        call UnitAddAbility(u,DISABLE_ATTACK)
    endfunction
   
    private function EnableControl takes unit u returns nothing
        local boolean backup = not IsUnitHidden(u)
        call ShowUnit(u,false)
        //I added this line to enable their attack.
        call UnitRemoveAbility(u,DISABLE_ATTACK)
        call ShowUnit(u,backup)
    endfunction
   
    struct Fear extends array
        unit targ
        string path
        string attach
        readonly effect e
        readonly boolean b
        private integer steps
        private integer startat
        private static timer period
        private static integer dindex
        private static thistype array data
        private static integer instanceCount
        private static thistype recycle
        private thistype recycleNext
       
        private static method periodic takes nothing returns nothing
            local thistype this
            local real x
            local real y
            local integer i = 0
            loop
                exitwhen i > dindex
                set this = data[i]
                if modulo(this.steps,EACH_CHANGE) == this.startat then
                    set x = GetUnitX(this.targ)
                    set y = GetUnitY(this.targ)
                    call IssuePointOrder(this.targ, "move", GetRandomReal(x-AROUND,x+AROUND), GetRandomReal(y-AROUND, x+AROUND) )
                endif
                set this.steps = this.steps - 1
                if this.steps == 0 or not(UnitAlive(this.targ)) then
                    set data[i] = data[dindex]
                    set i = i - 1
                    set dindex = dindex - 1
                    if this.e != null then
                        call DestroyEffect(this.e)
                        set this.e = null
                    endif
                    call IssueImmediateOrder(this.targ,"stop")
                    call EnableControl(this.targ)
                    call tb.remove(GetHandleId(this.targ))
                    if this.b then
                        set this.targ = null
                        set recycleNext = recycle
                        set recycle = this
                    endif
                endif
                if dindex == -1 then
                    call PauseTimer(period)
                endif
                set i = i + 1
            endloop
        endmethod
       
        static method isFeared takes unit u returns boolean
            return tb.has(GetHandleId(u))
        endmethod
       
        method operator time= takes real t returns nothing
            set this.steps = round(t/FPS)
        endmethod
       
        method operator time takes nothing returns real
            return this.steps*FPS
        endmethod
       
        method changeEffect takes string path, string attach returns nothing
            call DestroyEffect(this.e)
            set this.e = null
            set this.e = AddSpecialEffectTarget(path,this.targ,attach)
        endmethod
       
        static method get takes unit u returns thistype
            local thistype this
            if isFeared(u) then
                return tb[GetHandleId(u)]
            else
                debug call BJDebugMsg("Tryng to get wrong instance")
                return 0
            endif
        endmethod
       
        method start takes nothing returns nothing
            debug if this.targ==null or this.steps==0 then
                debug call BJDebugMsg("You're instanciating badly ....")
                debug return
            debug endif
            set dindex = dindex + 1
            set data[dindex] = this
            set this.startat = modulo(this.steps,EACH_CHANGE)
            call DisableControl(this.targ)
            if this.path != "" and this.attach != ""  then
                set this.e = AddSpecialEffectTarget(this.path, this.targ, this.attach)
            endif
            set tb[GetHandleId(this.targ)] = this
            if dindex == 0 then
                call TimerStart(period, FPS, true, function thistype.periodic)
            endif
        endmethod
       
        static method create takes nothing returns thistype
            local thistype this
            if recycle == 0 then
                set instanceCount = instanceCount + 1
                set this = instanceCount
            else
                set this = recycle
                set recycle = recycle.recycleNext
            endif
            set this.path = ""
            set this.attach = ""
            set this.e = null
            set this.b = false
            return this
        endmethod
       
        method destroy takes nothing returns nothing
            set this.b = true
        endmethod
       
        private static method onInit takes nothing returns nothing
            set tb = Table.create()
            set dindex = - 1
            set instanceCount = 0
            set recycle = 0
            set period = CreateTimer()
        endmethod
    endstruct
endlibrary


Credits :
- Vexorian for Table Library and vJASS.
- Maker for the help in the disable function.
- Bribe for Table Library (Yes there is two :D ).
- Chobibo for addition in the disable function.

Changelog
v1.0:
- Initial Release

v1.1 :
- Trigger Optimization.
- Added a version with Table by Bribe.

v1.2 :
- Added 'Avul' during the unfeared phase.

v1.3 :
- Only one trigger for both Table Libraries.

v2.0 :
- Added a GUI/JASS version.

v2.1 :
- Fix a bug with hashtable.

v2.2 :
- Fix some issues.
- Fix this box ^^.

v2.3 :
- Change the code
- Delete the JASS version for the moment.

v2.4 :
- Fix bugs.

v2.5 :
- Thanks to chobibo you can target feared units if you're not the owner of those.

v2.6 :
- Fix a bug with the indexing.
- Fix a bug with a static integer which should have been thistype instead;
- Optimize some triggers with the backup boolean.
- Optimize round functions.
- Now properly works.

v2.7 :
- Bug corrected.

v3 :
- Separated Bribe and Vexorian codes for the sake of statif if bugs.


Give credits to me and the four above if you use it :)
Malhorne

Keywords:
Fear System, Fear, System, vJASS, JESP, Malhorne, Status Effect, Status, Status Alteration, Corwd, Control, Crowd Control
Contents

Just another Warcraft III map (Map)

Reviews
Moderator
Fear System v2.7 | Reviewed by Maker | 25th November 2013 Concept[/COLOR]] [IMG] It is a unique system that has not been done before. Status effect systems are a welcome addition to out spell database Triggers[/COLOR]] [IMG] Leakless...
  1. Fear System v2.7 | Reviewed by Maker | 25th November 2013
    • Concept[/COLOR]]
      [​IMG]
      • It is a unique system that has not been done before.
        Status effect systems are a welcome addition to out spell database
    • Triggers[/COLOR]]
      [​IMG]
      • Leakless and MUI
    • Objects[/COLOR]]
      [​IMG]
      • No unneeded objects and the system works with the current settings
    • Rating[/COLOR]]
      CONCEPT TRIGGERS OBJECTS RATING STATUS
      [​IMG] [​IMG] [​IMG] [​IMG] APPROVED


    Old reviews

    Fear System v2.5 | Reviewed by Maker | 17th November 2013
    • Concept[/COLOR]]
      [​IMG]
      • It is a unique system that has not been done before.
        Status effect systems are a welcome addition to out spell database
    • Triggers[/COLOR]]
      [​IMG]
      • Leakless and MUI
      [​IMG]
      • Your index recycling is not working, instance count increases
        with each target affected
      [​IMG]
      • You could merge
        start
        and
        create
        . Then that combined method
        could take unit, the strings and time as parameters
    • Objects[/COLOR]]
      [​IMG]
      • No unneeded objects and the system works with the current settings
    • Rating[/COLOR]]
      CONCEPT TRIGGERS OBJECTS RATING STATUS
      [​IMG] [​IMG] [​IMG] [​IMG] NEEDS FIX

     
  2. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Reserved~
     
  3. Dark_Axl

    Dark_Axl

    Joined:
    Dec 12, 2007
    Messages:
    471
    Resources:
    2
    Maps:
    1
    Spells:
    1
    Resources:
    2
    you should fix your documentation.
     
  4. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Oh yes sorry zzz
    I added the effect thingy after the doc ^^'
    I'm gonna edit it right now thanks :)

    EDIT : Updated
     
  5. Dark_Axl

    Dark_Axl

    Joined:
    Dec 12, 2007
    Messages:
    471
    Resources:
    2
    Maps:
    1
    Spells:
    1
    Resources:
    2
    I still don't understand this part in your documentation,
    I don't see any part of your script which capable of changing movement speed throught any means, although it will be a nice built in feature, although I prefer faster movement. you didn't slow down when under fear, you run like hell out of it.

    I don't remember API can be flexible :)

    anyway, to the code,
    I can't find any flaws within the code other than within the documentation.
    nice resource.
     
  6. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Oh oups xD
    I'm the API flexible creator xD
    Sorry I'll read again this and I hope I'll have the time to fix it within 2m or it will be tomorrow :/

    EDIT : I think it is good now. Till you find another error ^^
     
  7. BPower

    BPower

    Joined:
    Mar 18, 2012
    Messages:
    1,745
    Resources:
    21
    Spells:
    15
    Tutorials:
    1
    JASS:
    5
    Resources:
    21
    this.targ
    and
    this.e
    should be nulled in the end.
    Note: I just read the code you posted here, so it might be fixed already.

    Apart from that I didn't see anything wrong.

    Thats not a good idea in my mind, since Bribes Table is nowadays used by most resources and not Vexorians at least on THW.

    static if LIBRARY_Table then
    This will throw an error, if the user has NewTable, since it is named Table aswell. But I'm sure you are aware of that.

    Edit: I think this resource is very usefull and would love to see it beeing compatible with Bribe's Table.
     
  8. Maker

    Maker

    Joined:
    Mar 6, 2006
    Messages:
    9,193
    Resources:
    17
    Maps:
    2
    Spells:
    14
    Tutorials:
    1
    Resources:
    17
    What is wrong with
    ModuloInteger
    ?
     
  9. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Don't know I hate red words xD !
    Oh wait I can do it in one line because it will never be negative in my usage xD !

    Yes I might do another version for table by Bribe :)


    EDIT : I'll see further for modulo thingy.
    A new version with Table by Bribe will be uploaded too.
    And this new version will be in an unable trigger in the test map :)
    So I'll add Bribe to the credits too :)
    I'll do it tomorrow :)
    Thanks for every reply !
     
    Last edited: Oct 31, 2013
  10. Nestharus

    Nestharus

    Joined:
    Jul 10, 2007
    Messages:
    6,149
    Resources:
    8
    Spells:
    3
    Tutorials:
    4
    JASS:
    1
    Resources:
    8
    Your documentation is like a wall of text :\
     
  11. chobibo

    chobibo

    Joined:
    Sep 24, 2005
    Messages:
    2,692
    Resources:
    0
    Resources:
    0
    Maker is right, just use the ModuloInt BJ dude, your modulo function is redundant. I suggest using the IssuePointOrderById and IssueImmediateOrderById, to use less strings. There's an orderId list available here.
     
  12. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Ah yes I did by string because I don't remember the id of those orders :/

    For the doc yes it is bad :/
    I'm so bad to explain something xD
    I'll try to rewrite it after I'll update the globals leak, a second version with Table by Bribe and a better how to import.

    Updated !
    Changelog
    V1.0:
    - Initial Release

    V1.1 :
    - Trigger Optimization.
    - Added a version with Table by Bribe.
     
    Last edited: Nov 1, 2013
  13. T. D. W.

    T. D. W.

    Joined:
    Jul 31, 2012
    Messages:
    1,505
    Resources:
    5
    Spells:
    5
    Resources:
    5
    Works well, i just found one bug.. it is related to the disablement i suppose, if i attack the feared unit and the projectile hits him after the the fear ended, the damage does not occur, i guess that also applies to many spells and such :/
     
  14. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Ah :/
    I don't really know if I can fix it :/
    Because if it comes from the disable I can't really do it :(
     
  15. T. D. W.

    T. D. W.

    Joined:
    Jul 31, 2012
    Messages:
    1,505
    Resources:
    5
    Spells:
    5
    Resources:
    5
    yes i know, it's from Hide/Show unit thing, the unit goes and returns instantly disturbing the projectile

    "maybe" Trigger based projectiles don't have this issue, still to test
     
  16. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    I don't think they will have this issue but it needs a test anyway ^^
     
  17. T. D. W.

    T. D. W.

    Joined:
    Jul 31, 2012
    Messages:
    1,505
    Resources:
    5
    Spells:
    5
    Resources:
    5
    Tested with KB3D, Fully functional, :thumbs_up:
     
  18. chobibo

    chobibo

    Joined:
    Sep 24, 2005
    Messages:
    2,692
    Resources:
    0
    Resources:
    0
    Add invulnerability during the transition from feared to unfeared to disable any attempt to attack the unit. Invulnerable units can't be targeted with both spells and 'Aatk'.
     
  19. Malhorne

    Malhorne

    Joined:
    Sep 14, 2012
    Messages:
    2,336
    Resources:
    6
    Spells:
    4
    Tutorials:
    1
    JASS:
    1
    Resources:
    6
    Yes it could reduce some bugs ^^
    Glad to here this ;)

    EDIT : Updated.
    Changelog
    V1.0:
    - Initial Release

    V1.1 :
    - Trigger Optimization.
    - Added a version with Table by Bribe.

    V1.2 :
    - Added 'Avul' during the unfeared phase.
     
    Last edited: Nov 3, 2013