(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)
    = param1 (- param1 (* param2 (/ param1 param2)))
    (if (< param1 0)
        = param1 (+ param1 param2)
    )
    return param1
)


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


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


(procedure public (proc999_4 param1 param2 param3 param4 param5 param6)
    (asm
        lsp     param1
        lsp     paramTotal
        ldi     6
        lt?     
        bnt     code_00b1
        pushi   #x
        pushi   0
        lap     param5
        send    4
        jmp     code_00b3
code_00b1:lap     param5
code_00b3:le?     
        bnt     code_00dc
        pprev   
        lap     param3
        le?     
        bnt     code_00dc
        lsp     param2
        lsp     paramTotal
        ldi     6
        lt?     
        bnt     code_00d2
        pushi   #y
        pushi   0
        lap     param5
        send    4
        jmp     code_00d4
code_00d2:lap     param6
code_00d4:le?     
        bnt     code_00dc
        pprev   
        lap     param4
        le?     
code_00dc:ret     
    )
)


(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)
            = temp2 NodeValue(temp0)
            (if (not IsObject(temp2))
                return 
            )
            (send temp2:param1(rest param2))
            = temp0 temp1
        )
    )


    (method (firstTrue param1 param2)
        (var temp0, temp1, temp2)
        = temp0 FirstNode(elements)
        (while (temp0)
            = temp1 NextNode(temp0)
            = temp2 NodeValue(temp0)
            (if ((send temp2: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)
            = temp2 NodeValue(temp0)
            (if (not (send temp2: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)
        = temp2 FindKey(elements param1)
        (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)
        (if (not elements)
            = elements NewList()
        )
        = temp1 0
        (while (< temp1 paramTotal)
            = temp2 param1[temp1]
            (if (not (self:contains(temp2)))
                AddToEnd(elements NewNode(temp2 temp2))
                ++size
            )
            ++temp1
        )
    )

)
(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))
            = temp0 
                (if (IsObject(next))
                    next
                )(else
                    (if (next)
                        ScriptID(next)
                    )
                )
            (send client:script(temp0))
            (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)
            = temp0 GetPort()
            (if (== port temp0)
                LocalToGlobal(self)
            )(else
                (if (port)
                    SetPort(port)
                    LocalToGlobal(self)
                    SetPort(temp0)
                )
            )
            = port 0
        )
        return self
    )

)
