(version 2)
(include "sci.sh")
(use "Main")
(use "Class_255_0")
(use "n984")
(use "Sound")
(use "Cycle")
(use "MenuBar")
(use "PicView")
(use "Obj")
(script 996)


(local
    local0[23]
    local23

)
(instance uEvt of Event
    (properties)
)
(class User of Obj
    (properties
        alterEgo 0
        input 0
        controls 0
        echo 32
        prevDir 0
        prompt 1603
        inputLineAddr 0
        x -1
        y -1
        blocks 1
        mapKeyToDir 1
        curEvent 0
        verbMessager 0
    )

    (method (init param1 param2)
        = inputLineAddr 
            (if (paramTotal)
                param1
            )(else
                @local0
            )
        = local23 
            (if (== paramTotal 2)
                param2
            )(else
                45
            )
        = curEvent uEvt
        (if (not verbMessager)
            = verbMessager VerbMessager
        )
    )


    (method (doit)
        (if (== 0 global55)
            (send curEvent:
                type(0)
                message(0)
                modifiers(0)
                y(0)
                x(0)
                claimed(0)
            )
            GetEvent(32767 curEvent)
            (self:handleEvent(curEvent))
        )
    )


    (method (canControl theControls)
        (if (paramTotal)
            = controls theControls
            = prevDir 0
        )
        return controls
    )


    (method (getInput param1)
        (var temp0, temp1)
        (if (<> (send param1:type) 4)
            = local0 0
        )
        (if (<> (send param1:message) echo)
            Format(@local0 996 0 (send param1:message))
        )
        = temp0 (Sound:pause(blocks))
        = temp1 proc255_2(@local0 local23 prompt 67 x y)
        (Sound:pause(temp0))
        return temp1
    )


    (method (said param1)
        (var temp0)
        (send param1:message(
            (if (verbMessager)
                (send verbMessager:doit())
            )(else
                0
            )
))
        (if (global54)
            proc984_0(alterEgo gSFeatures gCast gFeatures)
        )(else
            (send gSFeatures:add(gCast gFeatures))
        )
        (if (MenuBar)
            (send gSFeatures:addToFront(MenuBar))
        )
        (send gSFeatures:
            addToEnd(gGame)
            handleEvent(param1)
            release()
        )
        (if ((== (send param1:type) 128) and not (send param1:claimed))
            (send gGame:pragmaFail(@local0))
        )
    )


    (method (handleEvent pEvent)
        (var pEventType, temp1)
        (if ((send pEvent:type))
            = gPEvent pEvent
            = pEventType (send pEvent:type)
            (if (mapKeyToDir)
                MapKeyToDir(pEvent)
            )
            (if (MenuBar)
                (MenuBar:handleEvent(pEvent pEventType))
            )
            GlobalToLocal(pEvent)
            (if (not (send pEvent:claimed))
                (send gGame:handleEvent(pEvent pEventType))
            )
            (if ((controls and not (send pEvent:claimed)) and (send gCast:contains(alterEgo)))
                (send alterEgo:handleEvent(pEvent))
            )
            (if (((((input and not (send pEvent:claimed)) and (== (send pEvent:type) 4)) and ((== (send pEvent:message) echo) or ((<= 32 (send pEvent:message)) and (<= (send pEvent:message) 255)))) and (self:getInput(pEvent))) and Parse(@local0 pEvent))
                (send pEvent:type(128))
                (self:said(pEvent))
            )
        )
        = gPEvent 0
    )


    (method (canInput theInput)
        (if (paramTotal)
            = input theInput
        )
        return input
    )

)
(class Ego of Actor
    (properties
        x 0
        y 0
        z 0
        heading 0
        noun 0
        nsTop 0
        nsLeft 0
        nsBottom 0
        nsRight 0
        description 0
        sightAngle 90
        closeRangeDist 50
        longRangeDist 100
        shiftClick -32767
        contClick 7
        actions 0
        control 0
        verbChecks1 -17483
        verbChecks2 -17477
        verbChecks3 -17477
        yStep 2
        view 0
        loop 0
        cel 0
        priority 0
        underBits 0
        signal $2000
        lsTop 0
        lsLeft 0
        lsBottom 0
        lsRight 0
        brTop 0
        brLeft 0
        brBottom 0
        brRight 0
        palette 0
        cycleSpeed 0
        script 0
        cycler 0
        timer 0
        illegalBits $8000
        xLast 0
        yLast 0
        xStep 3
        moveSpeed 0
        blocks 0
        baseSetter 0
        mover 0
        looper 0
        viewer 0
        avoider 0
        code 0
        edgeHit 0
    )

    (method (init)
        (super:init())
        (if (not cycler)
            (self:setCycle(Walk))
        )
    )


    (method (doit)
        (super:doit())
        = edgeHit 
            (if (<= x 0)
                4
            )(else
                (if (>= x 319)
                    2
                )(else
                    (if (>= y 189)
                        3
                    )(else
                        (if (<= y (send global2:horizon))
                            1
                        )(else
                            0
                        )
                    )
                )
            )
    )


    (method (handleEvent pEvent)
        (var pEventMessage)
        (if (script)
            (send script:handleEvent(pEvent))
        )
        (if (not (send pEvent:claimed))
            (switch ((send pEvent:type))
                (case 1
                    (if ((User:controls) and not (send pEvent:modifiers))
                        (self:setMotion(MoveTo (send pEvent:x) (send pEvent:y)))
                        (User:prevDir(0))
                        (send pEvent:claimed(1))
                    )
                )
                (case 64
                    = pEventMessage (send pEvent:message)
                    (if ((== pEventMessage (User:prevDir)) and IsObject(mover))
                        = pEventMessage 0
                    )
                    (User:prevDir(pEventMessage))
                    (self:setDirection(pEventMessage))
                    (send pEvent:claimed(1))
                )
            )
        )
        (send pEvent:claimed)
    )


    (method (get param1)
        (var temp0)
        = temp0 0
        (while (< temp0 paramTotal)
            (send ((send gInv:at(param1[temp0]))):moveTo(self))
            ++temp0
        )
    )


    (method (put param1 param2)
        (if ((self:has(param1)))
            (send ((send gInv:at(param1))):moveTo(
                (if (== paramTotal 1)
                    -1
                )(else
                    param2
                )
))
        )
    )


    (method (has param1)
        (var temp0)
        = temp0 (send gInv:at(param1))
        (if (temp0)
            (send (= temp0 (send gInv:at(param1))):ownedBy(self))
        )
    )

)
(class VerbMessager of Code
    (properties)

    (method (doit)
        return 
            (if (Said('look>'))
                1
            )(else
                (if (Said('open>'))
                    2
                )(else
                    (if (Said('close>'))
                        3
                    )(else
                        (if (Said('smell>'))
                            4
                        )(else
                            (if (Said('move>'))
                                5
                            )(else
                                (if (Said('eat>'))
                                    6
                                )(else
                                    (if (Said('get>'))
                                        7
                                    )(else
                                        (if (Said('climb>'))
                                            8
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
    )

)
