• 🏆 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!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece!🔗 Click here to enter!

[WIP] Priority Trigger

Status
Not open for further replies.
Level 31
Joined
Jul 10, 2007
Messages
6,306
I'm going to bed for now. I figured I'd post this up so that everyone could see this awesomeness =).

JASS:
library PriorityTrigger /* v1.0.0.0
************************************************************************************
*
*   */ uses /*
*   
*       */ Trigger              /*          hiveworkshop.com/forums/submissions-414/snippet-error-message-239210/
*       */ AVL                  /*          hiveworkshop.com/forums/jass-resources-412/snippet-avl-tree-203168/
*
************************************************************************************
*
*   struct PriorityTrigger extends array
*           
*       Fields
*       -------------------------
*
*           readonly trigger trigger
*               -   use to register events, nothing else
*               -   keep in mind that triggers referencing this trigger won't fire when events fire
*               -   this trigger will fire when triggers referencing this trigger are fired
*
*           boolean enabled
*
*       Methods
*       -------------------------
*
*           static method create takes nothing returns Trigger
*           method destroy takes nothing returns nothing
*
*           method register takes boolexpr expression, integer priority returns PriorityTriggerCondition
*
*           method reference takes Trigger trig, integer priority returns PriorityTriggerReference
*               -   a referenced trigger will run before this trigger
*               -   referenced triggers run in order of reference
*
*           method fire takes nothing returns nothing
*
*           method clear takes nothing returns nothing
*               -   clears expressions
*           method clearReferences takes nothing returns nothing
*               -   clears trigger references
*           method clearBackReferences takes nothing returns nothing
*               -   removes references for all triggers referencing this trigger
*           method clearEvents takes nothing returns nothing
*               -   clears events
*
*           debug static method calculateMemoryUsage takes nothing returns integer
*           debug static method getAllocatedMemoryAsString takes nothing returns string
*
************************************************************************************
*
*   struct PriorityTriggerReference extends array
*           
*       Methods
*       -------------------------
*
*           method destroy takes nothing returns nothing
*
************************************************************************************
*
*   struct PriorityTriggerCondition extends array
*
*       Methods
*       -------------------------
*
*           method destroy takes nothing returns nothing
*
************************************************************************************/
    /*
    *   Stores Trigger Reference
    *
    *   Stores list of trigger references between two priority triggers
    */
    private struct RefListData extends array
        implement UniqueList
    endstruct

    private struct TriggerTreeData extends array
        private method lessThan takes thistype val returns boolean
            return integer(this)<integer(val)
        endmethod
        private method greaterThan takes thistype val returns boolean
            return integer(this)>integer(val)
        endmethod
        
        Trigger triggerLeft
        Trigger triggerRight
        Trigger trigger
        TriggerReference link
        
        
        /*
        *   Node Left                                   Node Right
        *       Trigger Link                                Trigger Link
        *           right                ->                     right
        *           trigger                                     trigger
        *               triggers                                    triggers
        *               expressions                                 expressions
        */
    
        implement AVL
    endstruct
    
    /*
    *   TriggerTreeData
    *
    *   Stores referenced priority triggers
    */
    private keyword BackRefListData
    private keyword TriggerTree
    private struct ForwardRefListData extends array
        implement NxList
    
        RefListData refList             //list of trigger references
        TriggerTree triggerTree         //the referenced priority trigger
        BackRefListData backRefList     //the back ref node containing this list
    endstruct
    
    /*
    *   TriggerTreeData
    *
    *   Stores priority triggers referencing this priority trigger
    */
    private struct BackRefListData extends array
        implement NxList
    
        TriggerTree triggerTree         //the priority trigger referencing this
        ForwardRefListData forwardList  //the forward ref node containing this list
    endstruct
    
    struct RefList extends array
        method operator reference takes nothing returns TriggerReference
            return this
        endmethod
        
        method enqueue takes TriggerReference ref returns nothing
            call RefListData(this).enqueue(ref)
        endmethod
        
        method operator next takes nothing returns thistype
            return RefListData(this).next
        endmethod
        
        method remove takes nothing returns nothing
            call TriggerReference(this).destroy()
            call RefListData(this).remove()
        endmethod
        
        static method create takes nothing returns thistype
            return RefListData.create()
        endmethod
        
        method destroy takes nothing returns nothing
            local RefListData node = RefListData(this).first
            
            loop
                exitwhen node == 0
                
                call TriggerReference(node).destroy()
                
                set node = node.next
            endloop
            
            call RefListData(this).destroy()
        endmethod
    endstruct
    
    private struct TriggerTree extends array
        method operator trigger takes nothing returns trigger
            return TriggerTreeData(this).next.triggerLeft.trigger
        endmethod
    
        private method operator prev takes nothing returns TriggerTreeData
            return TriggerTreeData(this).prev
        endmethod
        private method operator next takes nothing returns TriggerTreeData
            return TriggerTreeData(this).next
        endmethod
    
        static method create takes nothing returns thistype
            return TriggerTreeData.create()
        endmethod
        
        private method setRef takes nothing returns nothing
            local TriggerTreeData node = this
            
            if (not node.prev.head) then
                if (node.prev.link == 0) then
                    set node.prev.link = node.prev.triggerRight.reference(node.triggerLeft)
                else
                    call node.prev.link.replace(node.triggerLeft)
                endif
            endif
            if (not node.next.head) then
                set node.link = node.triggerRight.reference(node.next.triggerLeft)
            endif
        endmethod
        
        method insert takes boolexpr expression, integer priority returns TriggerCondition
            local TriggerTreeData node = TriggerTreeData(this).add(priority)
            local thistype expr
            
            if (node.trigger == 0) then
                set node.triggerLeft = Trigger.create()
                set node.triggerRight = Trigger.create()
                set node.trigger = Trigger.create()
                
                call node.triggerLeft.reference(node.triggerRight)
                call node.triggerLeft.reference(node.trigger)
                
                set expr = node.trigger.register(expression)
                
                call thistype(node).setRef()
            else
                set expr = node.trigger.register(expression)
            endif
            
            return expr
        endmethod
        
        method reference takes Trigger trig, integer priority returns TriggerReference
            local TriggerTreeData node = TriggerTreeData(this).add(priority)
            local TriggerReference ref
            
            if (node.trigger == 0) then
                set node.triggerLeft = Trigger.create()
                set node.triggerRight = Trigger.create()
                set node.trigger = Trigger.create()
                
                call node.triggerLeft.reference(node.triggerRight)
                call node.triggerLeft.reference(node.trigger)
                
                set ref = node.trigger.reference(trig)
                
                call thistype(node).setRef()
            else
                set ref = node.trigger.reference(trig)
            endif
            
            return ref
        endmethod
        
        method referenceTree takes TriggerTreeData triggerTree returns RefList
            local RefList refList = RefList.create()
            local TriggerTreeData targetNode
            
            set targetNode = triggerTree.next
            loop
                exitwhen targetNode.head
                
                call refList.enqueue(reference(targetNode.trigger, targetNode.value))
                
                set targetNode = targetNode.next
            endloop
            
            return refList
        endmethod
        
        method clear takes nothing returns nothing
            local TriggerTreeData node = next
            
            loop
                exitwhen node.head
                
                call node.triggerLeft.destroy()
                call node.triggerRight.destroy()
                call node.trigger.destroy()
                
                set node.triggerLeft = 0
                set node.triggerRight = 0
                set node.trigger = 0
                
                set node.link = 0
                
                set node = node.next
            endloop
            
            call TriggerTreeData(this).clear()
        endmethod
        
        method destroy takes nothing returns nothing
            call clear()
            
            call TriggerTreeData(this).destroy()
        endmethod
    endstruct

    private struct BackRefList extends array
        method init takes nothing returns nothing
        endmethod
        
        method clear takes nothing returns nothing
        endmethod
    
        method destroy takes nothing returns nothing
        endmethod
    
        method reference takes nothing returns RefListData
            return 0
        endmethod
        
        /*
        *   this == RefListData
        */
        method dereference takes nothing returns nothing
        endmethod
    endstruct
    
    private struct ForwardRefList extends array
        method init takes nothing returns nothing
        endmethod
        
        method clear takes nothing returns nothing
        endmethod
    
        method destroy takes nothing returns nothing
        endmethod
    
        method reference takes nothing returns RefListData
            return 0
        endmethod
        
        /*
        *   this == RefListData
        */
        method dereference takes nothing returns nothing
        endmethod
    endstruct
    
    //! runtextmacro optional TEST()
endlibrary

And here's some test code (not that the API isn't even there yet, I'm still working on the internals)

JASS:
//! textmacro TEST
    private struct Tester extends array
        implement TestFunctions
        
        static method init takes nothing returns nothing
            implement TestLocals
            
            local TriggerTree tree1 = TriggerTree.create()
            local TriggerTree tree2 = TriggerTree.create()
            local TriggerTree tree3 = TriggerTree.create()
            local TriggerTree tree4 = TriggerTree.create()
            local TriggerTree tree5 = TriggerTree.create()
            local TriggerTree tree6 = TriggerTree.create()
            local TriggerTree tree7 = TriggerTree.create()
            local TriggerTree tree8 = TriggerTree.create()
            local TriggerTree tree9 = TriggerTree.create()
            
            implement TestInit
            
            call tree1.insert(Condition(function thistype.run1), 1)
            call tree1.reference(t3, 3)
            
            call tree2.insert(Condition(function thistype.run2), 2)
            call tree2.reference(t4, 4)
            
            call tree3.insert(Condition(function thistype.run5), 5)
            call tree3.reference(t7, 7)
            
            call tree4.insert(Condition(function thistype.run6), 6)
            call tree4.reference(t8, 8)
            
            call TriggerSleepAction(0)
            
            call tree1.referenceTree(tree2)
            call TriggerSleepAction(0)
            call tree1.referenceTree(tree3)
            call TriggerSleepAction(0)
            call tree1.referenceTree(tree4)
            
            call TriggerEvaluate(tree1.trigger)
        endmethod
        
        implement Init
    endstruct
//! endtextmacro

Keep in mind that I'm using TriggerSleepAction because the thread is crashing in debug mode.

TriggerTrees don't support trailing refs, only direct refs.

tree1.referenceTree(tree2)
tree2.referenceTree(tree3)

call TriggerEvaluate(tree1.triggerLeft)

that will only fire tree1 and tree2, not tree3. The ref lists are used to support trailing refs. I'm coding the ref lists next.


The code there will display
8
7
6
5
4
3
2
1

So yea, we can mix triggers now... yea


I know that there's not much code atm, I spent the majority of the day debugging BooleanExpression and Trigger. I had redone some things in them to improve performance a lot. Those changes broke everything, haha.
 

Attachments

  • PriorityTrigger.w3m
    94.7 KB · Views: 59
Level 31
Joined
Jul 10, 2007
Messages
6,306
Ok, update from last night

API is now complete, I'm still working the reference lists. This may or may not have bugs in it.

Have fun! ;D

Yes, this is now usable. If you find any bugs, please let me know, you'll save me some time.

JASS:
library PriorityTrigger /* v1.0.0.0
************************************************************************************
*
*   */ uses /*
*   
*       */ Trigger              /*          hiveworkshop.com/forums/submissions-414/snippet-error-message-239210/
*       */ AVL                  /*          hiveworkshop.com/forums/jass-resources-412/snippet-avl-tree-203168/
*       */ UniqueNxList         /*          hiveworkshop.com/forums/submissions-414/snippet-uniquenxlist-239356/
*
************************************************************************************
*
*   struct PriorityTrigger extends array
*           
*       Fields
*       -------------------------
*
*           readonly trigger trigger
*               -   use to register events, nothing else
*               -   keep in mind that triggers referencing this trigger won't fire when events fire
*               -   this trigger will fire when triggers referencing this trigger are fired
*
*           boolean enabled
*
*       Methods
*       -------------------------
*
*           static method create takes nothing returns PriorityTrigger
*           method destroy takes nothing returns nothing
*
*           method register takes boolexpr expression, integer priority returns TriggerCondition
*
*           method reference takes Trigger trig, integer priority returns TriggerReference
*           method referencePriorityTrigger takes PriorityTrigger trig returns PriorityTriggerReference
*
*           method fire takes nothing returns nothing
*
*           method clear takes nothing returns nothing
*               -   clears expressions and referenced *Triggers*
*           method clearReferences takes nothing returns nothing
*               -   clears priority trigger references
*           method clearBackReferences takes nothing returns nothing
*               -   removes priority trigger references for all priority triggers referencing this priority trigger
*           method clearEvents takes nothing returns nothing
*               -   clears events
*
************************************************************************************
*
*   struct PriorityTriggerReference extends array
*           
*       Methods
*       -------------------------
*
*           method destroy takes nothing returns nothing
*
************************************************************************************/
    /*
    *   Stores Trigger Reference
    *
    *   Stores list of trigger references between two priority triggers
    */
    private struct RefListData extends array
        implement UniqueList
    endstruct

    private struct TriggerTreeData extends array
        private method lessThan takes thistype val returns boolean
            return integer(this)<integer(val)
        endmethod
        private method greaterThan takes thistype val returns boolean
            return integer(this)>integer(val)
        endmethod
        
        Trigger mainTrigger
        Trigger mainTriggerTarget
        TriggerReference mainTriggerReference
        
        Trigger triggerLeft
        Trigger triggerRight
        Trigger trigger
        TriggerReference link
        
        method updateTrigger takes nothing returns nothing
            if (mainTriggerTarget != next.triggerLeft) then
                if (mainTriggerReference != 0) then
                    call mainTriggerReference.destroy()
                endif
                
                set mainTriggerTarget = next.triggerLeft
                set mainTriggerReference = mainTrigger.reference(mainTriggerTarget)
            endif
        endmethod
        
        
        /*
        *   Node Left                                   Node Right
        *       Trigger Link                                Trigger Link
        *           right                ->                     right
        *           trigger                                     trigger
        *               triggers                                    triggers
        *               expressions                                 expressions
        */
    
        implement AVL
    endstruct
    
    /*
    *   TriggerTreeData
    *
    *   Stores referenced priority triggers
    */
    private keyword BackRefListData
    private keyword TriggerTree
    private struct ForwardRefListData extends array
        implement NxList
    
        RefListData refList             //list of trigger references
        BackRefListData backRef         //the back ref node containing this node
    endstruct
    
    /*
    *   TriggerTreeData
    *
    *   Stores priority triggers referencing this priority trigger
    */
    private struct BackRefListData extends array
        implement NxList
    
        ForwardRefListData forwardRef   //the forward ref node containing this node
    endstruct
    
    private struct RefList extends array
        method operator reference takes nothing returns TriggerReference
            return this
        endmethod
        
        method enqueue takes TriggerReference ref returns nothing
            call RefListData(this).enqueue(ref)
        endmethod
        
        method operator next takes nothing returns thistype
            return RefListData(this).next
        endmethod
        
        method remove takes nothing returns nothing
            call TriggerReference(this).destroy()
            call RefListData(this).remove()
        endmethod
        
        static method create takes nothing returns thistype
            return RefListData.create()
        endmethod
        
        method destroy takes nothing returns nothing
            local RefListData node = RefListData(this).first
            
            loop
                exitwhen node == 0
                
                call TriggerReference(node).destroy()
                
                set node = node.next
            endloop
            
            call RefListData(this).destroy()
        endmethod
    endstruct
    
    private struct TriggerRefListData extends array
        implement UniqueNxList
    endstruct
    private struct TriggerTree extends array
        method operator trigger takes nothing returns Trigger
            return TriggerTreeData(this).mainTrigger
        endmethod
    
        private method operator prev takes nothing returns TriggerTreeData
            return TriggerTreeData(this).prev
        endmethod
        private method operator next takes nothing returns TriggerTreeData
            return TriggerTreeData(this).next
        endmethod
    
        static method create takes nothing returns thistype
            local thistype this = TriggerTreeData.create()
            
            set TriggerTreeData(this).mainTrigger = Trigger.create()
            
            call TriggerRefListData(this).clear()
            
            return this
        endmethod
        
        private method setRef takes nothing returns nothing
            local TriggerTreeData node = this
            
            if (not node.prev.head) then
                if (node.prev.link == 0) then
                    set node.prev.link = node.prev.triggerRight.reference(node.triggerLeft)
                else
                    call node.prev.link.replace(node.triggerLeft)
                endif
            endif
            if (not node.next.head) then
                set node.link = node.triggerRight.reference(node.next.triggerLeft)
            endif
        endmethod
        
        method insert takes boolexpr expression, integer priority returns TriggerCondition
            local TriggerTreeData node = TriggerTreeData(this).add(priority)
            local thistype expr
            
            if (node.trigger == 0) then
                set node.triggerLeft = Trigger.create()
                set node.triggerRight = Trigger.create()
                set node.trigger = Trigger.create()
                
                call node.triggerLeft.reference(node.triggerRight)
                call node.triggerLeft.reference(node.trigger)
                
                set expr = node.trigger.register(expression)
                
                call thistype(node).setRef()
            else
                set expr = node.trigger.register(expression)
            endif
            
            return expr
        endmethod
        
        method reference takes Trigger trig, integer priority returns TriggerReference
            local TriggerTreeData node = TriggerTreeData(this).add(priority)
            local TriggerReference ref
            
            if (node.trigger == 0) then
                set node.triggerLeft = Trigger.create()
                set node.triggerRight = Trigger.create()
                set node.trigger = Trigger.create()
                
                call node.triggerLeft.reference(node.triggerRight)
                call node.triggerLeft.reference(node.trigger)
                
                set ref = node.trigger.reference(trig)
                
                call thistype(node).setRef()
            else
                set ref = node.trigger.reference(trig)
            endif
            
            call TriggerRefListData(this).enqueue(ref)
            
            return ref
        endmethod
        
        method referenceTree takes TriggerTreeData triggerTree returns RefList
            local RefList refList = RefList.create()
            local TriggerTreeData targetNode
            
            set targetNode = triggerTree.next
            loop
                exitwhen targetNode.head
                
                call refList.enqueue(reference(targetNode.trigger, targetNode.value))
                
                set targetNode = targetNode.next
            endloop
            
            call TriggerTreeData(this).updateTrigger()
            
            return refList
        endmethod
        
        method referenceTreeUpdate takes TriggerTreeData triggerTree, RefList refList returns nothing
            local TriggerTreeData targetNode
            
            set targetNode = triggerTree.next
            loop
                exitwhen targetNode.head
                
                if (not TriggerTreeData(this).has(targetNode.value)) then
                    call refList.enqueue(reference(targetNode.trigger, targetNode.value))
                endif
                
                set targetNode = targetNode.next
            endloop
        endmethod
        
        method clear takes nothing returns nothing
            local TriggerTreeData node = next
            
            loop
                exitwhen node.head
                
                call node.trigger.clear()
                
                set node = node.next
            endloop
            
            set node = TriggerRefListData(this).first
            loop
                exitwhen node == 0
                
                call TriggerReference(node).destroy()
                
                set node = TriggerRefListData(node).next
            endloop
            
            call TriggerRefListData(this).clear()
        endmethod
        
        method destroy takes nothing returns nothing
            local TriggerTreeData node = next
            
            call TriggerTreeData(this).mainTrigger.destroy()
            set TriggerTreeData(this).mainTriggerTarget = 0
            set TriggerTreeData(this).mainTriggerReference = 0
            
            loop
                exitwhen node.head
                
                call node.triggerLeft.destroy()
                call node.triggerRight.destroy()
                call node.trigger.destroy()
                
                set node.triggerLeft = 0
                set node.triggerRight = 0
                set node.trigger = 0
                
                set node.link = 0
                
                set node = node.next
            endloop
            
            call TriggerRefListData(this).destroy()
            call TriggerTreeData(this).destroy()
        endmethod
    endstruct

    private struct BackRefList extends array
        method init takes nothing returns nothing
            call BackRefListData(this).clear()
        endmethod
    
        method enqueue takes ForwardRefListData forwardRef returns thistype
            local BackRefListData node = BackRefListData(this).enqueue()
            
            set node.forwardRef = forwardRef
            
            return node
        endmethod
    
        method clear takes nothing returns nothing
            local BackRefListData node = BackRefListData(this).first
            
            loop
                exitwhen node == 0
                
                call RefList(node.forwardRef.refList).destroy()
                call node.forwardRef.remove()
                
                set node = node.next
            endloop
            
            call BackRefListData(this).clear()
        endmethod
    
        method destroy takes nothing returns nothing
            call clear()
            
            call BackRefListData(this).destroy()
        endmethod
        
        method remove takes nothing returns nothing
            call BackRefListData(this).remove()
        endmethod
        
        method update takes nothing returns nothing
            local BackRefListData node = BackRefListData(this).first
            
            loop
                exitwhen node == 0
                
                call TriggerTree(node.forwardRef.list).referenceTreeUpdate(this, node.forwardRef.refList)
                call TriggerTreeData(node.forwardRef.list).updateTrigger()
                
                call BackRefList(node.forwardRef.list).update()
                
                set node = node.next
            endloop
        endmethod
    endstruct
    
    private struct ForwardRefList extends array
        method init takes nothing returns nothing
            call ForwardRefListData(this).clear()
        endmethod
        
        method enqueue takes TriggerTree triggerTree returns thistype
            local ForwardRefListData node = ForwardRefListData(this).enqueue()
            
            set node.backRef = BackRefList(triggerTree).enqueue(node)
            set node.refList = TriggerTree(this).referenceTree(triggerTree)
            
            return node
        endmethod
    
        method clear takes nothing returns nothing
            local ForwardRefListData node = ForwardRefListData(this).first
            
            loop
                exitwhen node == 0
                
                call node.backRef.remove()
                call RefList(node.refList).destroy()
                
                set node = node.next
            endloop
            
            call ForwardRefListData(this).clear()
        endmethod
    
        method destroy takes nothing returns nothing
            call clear()
            
            call ForwardRefListData(this).destroy()
        endmethod
        
        method remove takes nothing returns nothing
            call RefList(ForwardRefListData(this).refList).destroy()
            call ForwardRefListData(this).backRef.remove()
            call ForwardRefListData(this).remove()
        endmethod
    endstruct
    
    private struct PriorityTriggerReferenceData extends array
        debug private boolean isRef
    
        static method create takes TriggerTree origin, TriggerTree ref returns thistype
            local thistype this = ForwardRefList(origin).enqueue(ref)
            
            debug set isRef = true
            
            return this
        endmethod
        
        method destroy takes nothing returns nothing
            debug call ThrowError(this == 0,        "PriorityTrigger", "destroy", "PriorityTriggerReferenceData", this, "Attempted To Destroy Null PriorityTriggerReferenceData.")
            debug call ThrowError(not isRef,        "PriorityTrigger", "destroy", "PriorityTriggerReferenceData", this, "Attempted To Destroy Invalid PriorityTriggerReferenceData.")
            
            debug set isRef = false
            
            call ForwardRefList(this).remove()
            
            call BackRefList(this).update()
        endmethod
    endstruct
    
    struct PriorityTriggerReference extends array
        method destroy takes nothing returns nothing
            call PriorityTriggerReferenceData(this).destroy()
        endmethod
    endstruct
    
    struct PriorityTrigger extends array
        debug private boolean isPriorityTrigger
    
        static method create takes nothing returns thistype
            local thistype this = TriggerTree.create()
            
            debug set isPriorityTrigger = true
            
            call BackRefList(this).init()
            call ForwardRefList(this).init()
            
            return this
        endmethod
        
        method destroy takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "destroy", "PriorityTrigger", this, "Attempted To Destroy Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "destroy", "PriorityTrigger", this, "Attempted To Destroy Invalid PriorityTrigger.")
            
            debug set isPriorityTrigger = false
        
            call ForwardRefList(this).destroy()
            call TriggerTree(this).destroy()
        endmethod

        method register takes boolexpr expression, integer priority returns TriggerCondition
            local TriggerCondition triggerCondition
        
            debug call ThrowError(this == 0,                    "PriorityTrigger", "register", "PriorityTrigger", this, "Attempted To Register To Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,        "PriorityTrigger", "register", "PriorityTrigger", this, "Attempted To Register To Invalid PriorityTrigger.")
        
            /*
            *   Register the expression
            */
            set triggerCondition = TriggerTree(this).insert(expression, priority)
            
            call TriggerTreeData(this).updateTrigger()
            call BackRefList(this).update()
            
            return triggerCondition
        endmethod
        
        method clear takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "clear", "PriorityTrigger", this, "Attempted To Clear Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "clear", "PriorityTrigger", this, "Attempted To Clear Invalid PriorityTrigger.")
        
            call TriggerTree(this).clear()
        endmethod
        
        method clearReferences takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "clearReferences", "PriorityTrigger", this, "Attempted To Clear References Of Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "clearReferences", "PriorityTrigger", this, "Attempted To Clear References Of Invalid PriorityTrigger.")
            
            call ForwardRefList(this).clear()
        endmethod
        
        method clearBackReferences takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "clearReferences", "PriorityTrigger", this, "Attempted To Clear Back References Of Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "clearReferences", "PriorityTrigger", this, "Attempted To Clear Back References Of Invalid PriorityTrigger.")
            
            call BackRefList(this).clear()
        endmethod
        
        method reference takes Trigger trig, integer priority returns TriggerReference
            local TriggerReference triggerReference
        
            debug call ThrowError(this == 0,                "PriorityTrigger", "reference", "PriorityTrigger", this, "Attempted To Register To Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "reference", "PriorityTrigger", this, "Attempted To Register To Invalid PriorityTrigger.")
            
            set triggerReference = TriggerTree(this).reference(trig, priority)
            
            call TriggerTreeData(this).updateTrigger()
            call BackRefList(this).update()
            
            return triggerReference
        endmethod
        
        method referencePriorityTrigger takes PriorityTrigger trig returns PriorityTriggerReference
            local PriorityTriggerReference priorityTriggerReference
        
            debug call ThrowError(this == 0,                    "PriorityTrigger", "referencePriorityTrigger", "PriorityTrigger", this, "Attempted To Make Null PriorityTrigger Reference PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,        "PriorityTrigger", "referencePriorityTrigger", "PriorityTrigger", this, "Attempted To Make Invalid PriorityTrigger Reference PriorityTrigger.")
            debug call ThrowError(trig == 0,                    "PriorityTrigger", "referencePriorityTrigger", "PriorityTrigger", this, "Attempted To Reference Null PriorityTrigger (" + I2S(trig) + ").")
            debug call ThrowError(not trig.isPriorityTrigger,   "PriorityTrigger", "referencePriorityTrigger", "PriorityTrigger", this, "Attempted To Reference Invalid PriorityTrigger (" + I2S(trig) + ").")
            
            set priorityTriggerReference = PriorityTriggerReferenceData.create(this, trig)
            
            call TriggerTreeData(this).updateTrigger()
            call BackRefList(this).update()
            
            return priorityTriggerReference
        endmethod
        
        method clearEvents takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "clearEvents", "PriorityTrigger", this, "Attempted To Clear Events Of Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "clearEvents", "PriorityTrigger", this, "Attempted To Clear Events Of Invalid PriorityTrigger.")
        
            call TriggerTree(this).trigger.clearEvents()
        endmethod
        
        method fire takes nothing returns nothing
            debug call ThrowError(this == 0,                "PriorityTrigger", "fire", "PriorityTrigger", this, "Attempted To Fire Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "fire", "PriorityTrigger", this, "Attempted To Fire Invalid PriorityTrigger.")
        
            call TriggerTree(this).trigger.fire()
        endmethod
        
        method operator trigger takes nothing returns trigger
            debug call ThrowError(this == 0,                "PriorityTrigger", "trigger", "PriorityTrigger", this, "Attempted To Read Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "trigger", "PriorityTrigger", this, "Attempted To Read Invalid PriorityTrigger.")
        
            return TriggerTree(this).trigger.trigger
        endmethod
        
        method operator enabled takes nothing returns boolean
            debug call ThrowError(this == 0,                "PriorityTrigger", "enabled", "PriorityTrigger", this, "Attempted To Read Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,    "PriorityTrigger", "enabled", "PriorityTrigger", this, "Attempted To Read Invalid PriorityTrigger.")
            
            return TriggerTree(this).trigger.enabled
        endmethod
        
        method operator enabled= takes boolean enable returns nothing
            debug call ThrowError(this == 0,                                            "PriorityTrigger", "enabled=", "PriorityTrigger", this, "Attempted To Set Null PriorityTrigger.")
            debug call ThrowError(not isPriorityTrigger,                                "PriorityTrigger", "enabled=", "PriorityTrigger", this, "Attempted To Set Invalid PriorityTrigger.")
            debug call ThrowWarning(TriggerTree(this).trigger.enabled == enable,        "PriorityTrigger", "enabled=", "PriorityTrigger", this, "Setting Enabled To Its Value.")
        
            set TriggerTree(this).trigger.enabled = enable
        endmethod
    endstruct
endlibrary


And the test code (TriggerSleepAction to stop the thread from crashing on debug mode)

JASS:
struct Tester extends array
    implement TestFunctions
    
    static method init takes nothing returns nothing
        implement TestLocals
        implement PriorityTriggerLocals
        
        /*
        *   Locals
        */
        
        
        implement TestInit
        
        /*
        *   Code
        */
        call pt1.reference(t1, 1)
        call TriggerSleepAction(0)
        call pt1.reference(t3, 3)
        call TriggerSleepAction(0)
        call pt2.reference(t2, 2)
        call TriggerSleepAction(0)
        call pt2.reference(t4, 4)
        call TriggerSleepAction(0)
        call pt3.reference(t5, 5)
        call TriggerSleepAction(0)
        call pt3.reference(t7, 7)
        call TriggerSleepAction(0)
        call pt4.reference(t6, 6)
        call TriggerSleepAction(0)
        call pt4.reference(t8, 8)
        set pf1 = pt5.referencePriorityTrigger(pt6)
        call pt6.reference(t9, 9)
        call TriggerSleepAction(0)
        
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 1 {3,1}")
        call pt1.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 2 {4, 2}")
        call pt2.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 3 {7, 5}")
        call pt3.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 4 {8, 6}")
        call pt4.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 5 {9}")
        call pt5.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 6 {9}")
        call pt6.fire()
        
        call pf1.destroy()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 5 {}")
        call pt5.fire()
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60000,"Firing 6 {9}")
        call pt6.fire()
    endmethod
    
    implement Init
endstruct

That correctly displays everything

I just need to go through everything and make sure I'm calling the right destructors and so on (typecasting stuffs).
 

Attachments

  • PriorityTrigger.w3m
    104.9 KB · Views: 68
Level 31
Joined
Jul 10, 2007
Messages
6,306
Add a description of what this is/does/is supposed to do/ why we need it/why it is useless.

Planning some demos after it's finished


Came up with some pretty damn cool things, plus a new API addition to allow for some more cool things ^)^

edit
Actually, I see a big problem with this

If this were to be used the way I intended to use it, you could only have ~31 units on your map. This uses LOTS and LOTS of memory :\, hm....

Actually, I just forgot that it wraps a lot of that stuff up to minimize memory as much as it can... we'll see, hm... I'm hoping that the limit is around 600 units, that seems ok. Can't hope for more than that, I'm hoping that it doesn't go down to 250. I'll have to do the calculations.

edit
I'm debating the usefulness of Priority Trigger now. We'll see.
 
Last edited:
Level 31
Joined
Jul 10, 2007
Messages
6,306
How about you do what he asks for?

no, the name of the resource explains itself

if you know what a trigger and a priority queue are (one a standard wc3 term and the other a standard data structure), then you know what this is (or can at least make a very good guess as to what this is). It's used for similar things to Trigger, so now you have use cases. I'm only making demos to show what this can do that Trigger can't do, that is, mixing global and local events.
 
Status
Not open for further replies.
Top