(include "sci.sh")
(use "Main")
(use "Class_255_0")
(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_005b(rest))))
            param1
        )(else
            temp0
        )
)


(procedure public (proc999_3 param1 param2)
    (var temp0)
    return 
        (if ((== paramTotal 1) or (> param1 (= temp0 localproc_007c(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)
    return | StrAt(param1 (* 2 param2)) (<< StrAt(param1 (+ 1 (* 2 param2))) $0008)
)


(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[ffc8])
        Print((self:showStr(@temp0)))
    )


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


    (method (isKindOf param1)
        (var ObjSuperClass)
        = ObjSuperClass (self:superClass)
        (if (not (== species (send param1:species)) and IsObject(ObjSuperClass))
            (send ObjSuperClass:isKindOf(param1))
        )
    )


    (method (isMemberOf param1)
        return 
            (if ((& (send param1:{-info-}) $8000) and not (& {-info-} $8000))
                == species (send param1:species)
            )(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(60 rest param1))
    )


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


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


    (method (showSelf)
        (var temp0[40])
        Print((self:showStr(@temp0)))
        (self:eachElementDo(105))
    )


    (method (add param1)
        (var temp0, temp1, temp2)
        (if (not elements)
            = elements NewList()
        )
        = temp1 0
        (while (< temp1 paramTotal)
            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
        )
    )

)
(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)
            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)
            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)
                = 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 (add param1)
        (var temp0, temp1, temp2)
        (asm
            pToa    elements
            not     
            bnt     code_05c6
            pushi   0
            callk   NewList, 0
            aTop    elements
code_05c6:  ldi     0
            sat     temp1
code_05ca:  lst     temp1
            lap     paramTotal
            lt?     
            bnt     code_05f7
            lat     temp1
            lapi    param1
            sat     temp2
            pushi   #contains
            pushi   1
            push    
            self    6
            not     
            bnt     code_05f2
            pushi   2
            pTos    elements
            pushi   2
            lst     temp2
            dup     
            callk   NewNode, 4
            push    
            callk   AddToEnd, 4
            ipToa   size
code_05f2:  +at     temp1
            jmp     code_05ca
code_05f7:  ret     
        )
    )

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

    (method (handleEvent pEvent)
        (var temp0, temp1, temp2)
        (asm
            pushi   1
            pTos    elements
            callk   FirstNode, 2
            sat     temp0
code_0636:  lat     temp0
            bnt     code_066f
            pushi   #claimed
            pushi   0
            lap     pEvent
            send    4
            not     
            bnt     code_066f
            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_066f
            pushi   #handleEvent
            pushi   1
            lsp     pEvent
            lat     temp2
            send    6
            lat     temp1
            sat     temp0
            jmp     code_0636
code_066f:  pushi   #claimed
            pushi   0
            lap     pEvent
            send    4
            ret     
        )
    )

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

    (method (init theClient theCaller theRegister)
        (if (>= paramTotal 1)
            (send (= client theClient):script(self))
            (if (>= paramTotal 2)
                = caller theCaller
                (if (>= paramTotal 3)
                    = register theRegister
                )
            )
        )
        (self:changeState(start))
    )


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


    (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 (== gTheGNumber gNumber)
                    (send temp0:init(client))
                )(else
                    (send temp0:dispose())
                )
            )
        )
        (if (IsObject(caller) and (== gTheGNumber gNumber))
            (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 (<> type 16384)
            = 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 (<> type 16384)
            (if (== port (= temp0 GetPort()))
                LocalToGlobal(self)
            )(else
                (if (port)
                    SetPort(port)
                    LocalToGlobal(self)
                    SetPort(temp0)
                )
            )
            = port 0
        )
        return self
    )

)
