• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[System]Charged Abilities

Status
Not open for further replies.
Level 33
Joined
Apr 24, 2012
Messages
5,113
JASS:
library ChargedAbility/*v1.0
*************************************************************************************
*
*   Charged Ability
*
*************************************************************************************
*
*   */uses/*
*
*       */Table/* hiveworkshop.com/forums/jass-functions-413/snippet-new-table-188084/
*
*************************************************************************************
*
*   API
*
*       static method create takes integer base returns thistype
*       method setState takes integer abil, integer charge returns nothing
*       method removeState takes integer charge returns nothing
*       method pushState takes integer abil returns nothing
*       method popState takes nothing returns nothing
*
*       method pushCharge takes unit u, integer level returns nothing
*       method popCharge takes unit u, integer level returns boolean
*       method setCharge takes unit u, integer charge, integer level returns nothing
*       method getCharge takes unit u returns integer
*       method isFull takes unit u returns boolean
*       method isEmpty takes unit u returns boolean
*
*************************************************************************************/

    struct ChargedAbility
        private Table t
        private integer charges
        
        method setState takes integer abil, integer charge returns nothing
            if charge > 0 then
                if charge > charges then
                    set charges = charges + 1
                    set charge = charges
                endif
                set t[charges] = abil
            endif
        endmethod
        
        method removeState takes integer abil, integer charge returns nothing
            if charges >= 1 and charge > 0 then
                loop
                    exitwhen charge < charges
                    set t[charge] = t[charge + 1]
                    set charge = charge + 1
                endloop
                set charges = charges - 1
            endif
        endmethod
        
        
        method pushState takes integer abil returns nothing
            call setState(abil, charges + 1)
        endmethod
        
        method popState takes integer abil returns nothing
            call removeState(t[charges], charges)
        endmethod
        
        static method create takes integer base returns thistype
            local thistype this = allocate()
            set t = Table.create()
            set charges = 0
            set t[0] = base
            return this
        endmethod
        
        method getCharge takes unit u returns integer
            local integer i
            if u != null then
                set i = charges
                loop
                    exitwhen i == -1
                    if GetUnitAbilityLevel(u, t[i]) > 0 then
                        return i
                    endif
                    set i = i - 1
                endloop
            endif
            return -1
        endmethod
        
        method isFull takes unit u returns boolean
            if u != null then
                return GetUnitAbilityLevel(u, t[charges]) > 0
            endif
            return false
        endmethod
        
        method isEmpty takes unit u returns boolean
            if u != null then
                return GetUnitAbilityLevel(u, t[0]) > 0
            endif
            return false
        endmethod
        
        method setCharge takes unit u, integer charge, integer level returns nothing
            local integer c
            if charge <= charges and charge >= 0 and u != null then
                set c = getCharge(u)
                if c > -1 then
                    call UnitRemoveAbility(u, t[c])
                    call UnitAddAbility(u, t[charge])
                    call SetUnitAbilityLevel(u, t[charge], level)
                endif
            endif
        endmethod
        
        method pushCharge takes unit u, integer level returns nothing
            call setCharge(u, getCharge(u) + 1, level)
        endmethod
        
        method popCharge takes unit u, integer level returns boolean
            local integer c = getCharge(u)
            if c < 0 then
                return false
            endif
            call setCharge(u, c - 1, level)
            return true
        endmethod
    endstruct
endlibrary

To add:
- charged ability but uses only one ability
- and a much better documentation!
 

Attachments

  • Charged Ability.w3x
    32.1 KB · Views: 76
Last edited:
Status
Not open for further replies.
Top