(include "sci.sh")
(use "Main")
(use "Print")
(use "Obj")
(script 999)



(procedure public (proc999_0 param1)
    return 
        (if (< param1 0)
            -1
        )(else
            > param1 0
        )
)


(procedure public (proc999_1 param1 param2)
    (if (< (= param1 (- param1 (* param2 (/ param1 param2)))) 0)
        = param1 (+ param1 param2)
    )
    return param1
)


(procedure public (proc999_2 param1 param2)
    (var temp0)
    return 
        (if ((== paramTotal 1) or (< param1 (= temp0 localproc_031a(rest))))
            param1
        )(else
            temp0
        )
)


(procedure public (proc999_3 param1 param2)
    (var temp0)
    return 
        (if ((== paramTotal 1) or (> param1 (= temp0 localproc_0337(rest))))
            param1
        )(else
            temp0
        )
)


(procedure public (proc999_4 param1 param2 param3 param4 param5 param6)
    return 
        (if ((<= param1 
        (if (< paramTotal 6)
            (send param5:x)
        )(else
            param5
        )
) and (<= param5 param3))
            (if (<= param2 
            (if (< paramTotal 6)
                (send param5:y)
            )(else
                param6
            )
)
                <= param6 param4
            )
        )(else
            0
        )
)


(procedure public (proc999_5 param1 param2)
    (var temp0)
    = temp0 0
    (while (< temp0 (- paramTotal 1))
        (if (== param1 param2[temp0])
            return 
                (if (param1)
                )(else
                    1
                )
        )
        ++temp0
    )
    return 0
)


(procedure public (proc999_6 param1 param2)
    Memory(5 + param1 (* 2 param2))
)


(procedure public (proc999_7 param1 param2 param3)
    (send param1:param2(rest param3))
)


(class Obj
    (properties)

    (method (new)
        Clone(self)
    )


    (method (init)
    )


    (method (doit)
        return self
    )


    (method (dispose)
        DisposeClone(self)
    )


    (method (showStr param1)
        StrCpy(param1 name)
    )


    (method (showSelf)
        (var temp0[65480])
        proc921_0((self:showStr(@temp0)))
    )


    (method (perform param1 param2)
        (send param1:doit(self rest param2))
    )


    (method (isKindOf param1)
        (var Obj_super_)
        (if ((not ((== {-propDict-} (send param1:{-propDict-})) and (== {-classScript-} (send param1:{-classScript-}))) and (= Obj_super_ (self:{-super-}))) and IsObject((= Obj_super_ (self:{-super-}))))
            (send Obj_super_:isKindOf(param1))
        )
    )


    (method (isMemberOf param1)
        return 
            (if ((not (== param1 self) and (& (send param1:{-info-}) $8000)) and not (& {-info-} $8000))
                == {-propDict-} (send param1:{-propDict-})
            )(else
                0
            )
    )


    (method (respondsTo param1)
        RespondsTo(self param1)
    )


    (method (yourself)
        return self
    )

)
(class Code of Obj
    (properties)

    (method (doit)
    )

)
(class Collect of Obj
    (properties
        elements 0
        size 0
    )

    (method (doit param1)
        (self:eachElementDo(57 rest param1))
    )


    (method (dispose)
        (if (elements)
            (self:eachElementDo(111))
            DisposeList(elements)
        )
        = size (= elements 0)
        (super:dispose())
    )


    (method (showStr param1)
        Format(param1 999 0 name size)
    )


    (method (showSelf)
        (var temp0[40])
        proc921_0((self:showStr(@temp0)))
        (self:eachElementDo(113))
    )


    (method (add param1)
        (var temp0, temp1, temp2)
        (if (not elements)
            = elements NewList()
        )
        = temp1 0
        (while (< temp1 paramTotal)
            (if (not (self:isDuplicate(param1[temp1])))
                AddToEnd(elements NewNode(param1[temp1] param1[temp1]))
                ++size
            )
            ++temp1
        )
        return self
    )


    (method (delete param1)
        (var temp0)
        = temp0 0
        (while (< temp0 paramTotal)
            (if (DeleteKey(elements param1[temp0]))
                --size
            )
            ++temp0
        )
        return self
    )


    (method (eachElementDo param1 param2)
        (var temp0, temp1, temp2)
        = temp0 FirstNode(elements)
        (while (temp0)
            = temp1 NextNode(temp0)
            (if (not IsObject(= temp2 NodeValue(temp0)))
                return 
            )
            (send temp2:param1(rest param2))
            = temp0 temp1
        )
    )


    (method (firstTrue param1 param2)
        (var temp0, temp1, temp2)
        = temp0 FirstNode(elements)
        (while (temp0)
            = temp1 NextNode(temp0)
            (if ((send (= temp2 NodeValue(temp0)):param1(rest param2)))
                return temp2
            )
            = temp0 temp1
        )
        return 0
    )


    (method (allTrue param1 param2)
        (var temp0, temp1, temp2)
        = temp0 FirstNode(elements)
        (while (temp0)
            = temp1 NextNode(temp0)
            (if (not (send (= temp2 NodeValue(temp0)):param1(rest param2)))
                return 0
            )
            = temp0 temp1
        )
        return 1
    )


    (method (contains param1)
        FindKey(elements param1)
    )


    (method (isEmpty)
        (if (== elements 0)
        )(else
            EmptyList(elements)
        )
    )


    (method (first)
        FirstNode(elements)
    )


    (method (next param1)
        NextNode(param1)
    )


    (method (release)
        (var temp0, temp1)
        = temp0 FirstNode(elements)
        (while (temp0)
            = temp1 NextNode(temp0)
            (self:delete(NodeValue(temp0)))
            = temp0 temp1
        )
    )


    (method (isDuplicate)
        return 0
    )

)
(class List of Collect
    (properties
        elements 0
        size 0
    )

    (method (showStr param1)
        Format(param1 999 1 name size)
    )


    (method (at param1)
        (var temp0)
        = temp0 FirstNode(elements)
        (while (param1 and temp0)
            --param1
            = temp0 NextNode(temp0)
        )
        return 
            (if (temp0)
                NodeValue(temp0)
            )(else
                0
            )
    )


    (method (last)
        LastNode(elements)
    )


    (method (prev param1)
        PrevNode(param1)
    )


    (method (addToFront param1)
        (var temp0)
        (if (not elements)
            = elements NewList()
        )
        = temp0 (- paramTotal 1)
        (while (<= 0 temp0)
            (if (not (self:isDuplicate(param1[temp0])))
                AddToFront(elements NewNode(param1[temp0] param1[temp0]))
                ++size
            )
            --temp0
        )
        return self
    )


    (method (addToEnd param1)
        (var temp0)
        (if (not elements)
            = elements NewList()
        )
        = temp0 0
        (while (< temp0 paramTotal)
            (if (not (self:isDuplicate(param1[temp0])))
                AddToEnd(elements NewNode(param1[temp0] param1[temp0]))
                ++size
            )
            ++temp0
        )
        return self
    )


    (method (addAfter param1 param2)
        (var temp0, temp1, temp2)
        (if (= temp2 FindKey(elements param1))
            --paramTotal
            = temp0 0
            (while (< temp0 paramTotal)
                (if (not (self:isDuplicate(param2[temp0])))
                    = temp2 AddAfter(elements temp2 NewNode(param2[temp0] param2[temp0]))
                    ++size
                )
                ++temp0
            )
        )
        return self
    )


    (method (indexOf param1)
        (var temp0, temp1)
        = temp0 0
        = temp1 FirstNode(elements)
        (while (temp1)
            (if (== param1 NodeValue(temp1))
                return temp0
            )
            ++temp0
            = temp1 NextNode(temp1)
        )
        return -1
    )

)
(class Set of List
    (properties
        elements 0
        size 0
    )

    (method (showStr param1)
        Format(param1 999 2 name size)
    )


    (method (isDuplicate param1)
        (self:contains(param1))
    )

)
(class EventHandler of Set
    (properties
        elements 0
        size 0
    )

    (method (handleEvent pEvent)
        (var temp0, temp1, temp2, temp3, temp4)
        (asm
            pushi   1
            lsp     pEvent
            callk   Clone, 2
            sat     temp3
            pushi   1
            pTos    elements
            callk   FirstNode, 2
            sat     temp0
code_066d:  lat     temp0
            bnt     code_06a3
            pushi   #claimed
            pushi   0
            lat     temp3
            send    4
            not     
            bnt     code_06a3
            pushi   1
            lst     temp0
            callk   NextNode, 2
            sat     temp1
            pushi   1
            pushi   1
            lst     temp0
            callk   NodeValue, 2
            sat     temp2
            push    
            callk   IsObject, 2
            not     
            bt      code_06a3
            pushi   #handleEvent
            pushi   1
            lst     temp3
            lat     temp2
            send    6
            lat     temp1
            sat     temp0
            jmp     code_066d
code_06a3:  pushi   #claimed
            pushi   0
            lat     temp3
            send    4
            sat     temp4
            pushi   #dispose
            pushi   0
            lat     temp3
            send    4
            lat     temp4
            ret     
        )
    )

)
(class Script of Obj
    (properties
        client 0
        state -1
        start 0
        timer 0
        cycles 0
        seconds 0
        lastSeconds 0
        ticks 0
        lastTicks 0
        register 0
        script 0
        caller 0
        next 0
    )

    (method (init theClient theCaller theRegister)
        = lastTicks gCycleCnt
        (if (>= paramTotal 1)
            (send (= client theClient):script(self))
            (if (>= paramTotal 2)
                = caller theCaller
                (if (>= paramTotal 3)
                    = register theRegister
                )
            )
        )
        = state (- start 1)
        (self:cue())
    )


    (method (doit)
        (var theLastSeconds)
        (if (script)
            (send script:doit())
        )
        (if (cycles)
            (if (not --cycles)
                (self:cue())
            )
        )(else
            (if (seconds)
                (if (<> lastSeconds (= theLastSeconds GetTime(1)))
                    = lastSeconds theLastSeconds
                    (if (not --seconds)
                        (self:cue())
                    )
                )
            )(else
                (if (ticks and (<= (= ticks (- ticks Abs((- gCycleCnt lastTicks)))) 0))
                    = ticks 0
                    (self:cue())
                )
            )
        )
        = lastTicks gCycleCnt
    )


    (method (dispose)
        (var temp0)
        (if (IsObject(script))
            (send script:dispose())
        )
        (if (IsObject(timer))
            (send timer:dispose())
        )
        (if (IsObject(client))
            (send client:script((= temp0 
                    (if (IsObject(next))
                        next
                    )(else
                        (if (next)
                            ScriptID(next)
                        )
                    )
)))
            (if (not temp0)
                0
            )(else
                (if (== gTheGModNum gModNum)
                    (send temp0:init(client))
                )(else
                    (send temp0:dispose())
                )
            )
        )
        (if (IsObject(caller) and (== gTheGModNum gModNum))
            (send caller:cue(register))
        )
        = script (= timer (= client (= next (= caller 0))))
        (super:dispose())
    )


    (method (changeState newState)
        = state newState
    )


    (method (cue param1)
        (if (client)
            (self:changeState((+ state 1) rest param1))
        )
    )


    (method (handleEvent pEvent)
        (if (script)
            (send script:handleEvent(pEvent))
        )
        (send pEvent:claimed)
    )


    (method (setScript param1 param2)
        (if (IsObject(script))
            (send script:dispose())
        )
        (if (param1)
            (send param1:init(self rest param2))
        )
    )

)
(class Event of Obj
    (properties
        type 0
        message 0
        modifiers 0
        y 0
        x 0
        claimed 0
        port 0
    )

    (method (new param1)
        (var newSuper)
        = newSuper (super:new())
        GetEvent(
            (if (paramTotal)
                param1
            )(else
                32767
            )
 newSuper)
        return newSuper
    )


    (method (localize)
        (var thePort)
        (if (not & type $4000)
            = thePort GetPort()
            (if (not port)
                GlobalToLocal(self)
            )(else
                (if (<> port thePort)
                    SetPort(port)
                    LocalToGlobal(self)
                    SetPort(thePort)
                    GlobalToLocal(self)
                )
            )
            = port thePort
        )
        return self
    )


    (method (globalize)
        (var temp0)
        (if (not & type $4000)
            (if (== port (= temp0 GetPort()))
                LocalToGlobal(self)
            )(else
                (if (port)
                    SetPort(port)
                    LocalToGlobal(self)
                    SetPort(temp0)
                )
            )
            = port 0
        )
        return self
    )

)
(class Cursor of Obj
    (properties
        view 0
        loop 0
        cel 0
        x 0
        y 0
        hotSpotX 0
        hotSpotY 0
        hidden 0
    )

    (method (init)
        (if (hotSpotX or hotSpotY)
            SetCursor(view loop cel hotSpotX hotSpotY)
        )(else
            SetCursor(view loop cel)
        )
    )


    (method (posn param1 param2)
        SetCursor(param1 param2)
    )


    (method (posnHotSpot theHotSpotX theHotSpotY)
        = hotSpotX theHotSpotX
        = hotSpotY theHotSpotY
        (self:init())
    )


    (method (setLoop theLoop)
        = loop theLoop
        (self:init())
    )


    (method (setCel theCel)
        = cel theCel
        (self:init())
    )


    (method (showCursor param1)
        (if (paramTotal)
            SetCursor(param1)
        )
    )

)
