(version 2)
(include "sci.sh")
(exports
    0 proc999_0
    1 proc999_1
    2 proc999_2
    3 proc999_3
    4 proc999_4
    5 proc999_5
)
(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)
    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
)


(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[200])
        proc255_0((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 (dispose)
        (if (elements)
            (self:eachElementDo(#dispose))
            DisposeList(elements)
        )
        = size (= elements 0)
        (super:dispose())
    )


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


    (method (showSelf)
        (var temp0[40])
        proc255_0((self:showStr(@temp0)))
        (self:eachElementDo(#showSelf))
    )


    (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)
            --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)
        = temp0 FirstNode(elements)
        (while (temp0 and not (send pEvent:claimed))
            = temp1 NextNode(temp0)
            = temp2 NodeValue(temp0)
            (if (not IsObject(temp2))
                break
            )
            (send temp2:handleEvent(pEvent))
            = temp0 temp1
        )
        (send pEvent:claimed)
    )

)
(class Script of Obj
    (properties
        client 0
        state $ffff
        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 (== gNewRoomNumber gNumber)
                    (send temp0:init(client))
                )(else
                    (send temp0:dispose())
                )
            )
        )
        (if (IsObject(caller) and (== gNewRoomNumber 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 theScript sendParams)
        (if (IsObject(script))
            (send script:dispose())
        )
        (if (theScript)
            (send theScript:init(self rest sendParams))
        )
    )

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

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

)
