(include "sci.sh")
(use "Main")
(use "Class_255_0")
(use "Polygon")
(use "Sound")
(use "SRDialog")
(use "Cycle")
(use "InvI")
(use "User")
(use "Obj")
(script 994)



(procedure (localproc_0ddc param1)
    (var temp0, temp1[40], temp41[40], temp81[40])
    = temp0 1
    DeviceInfo(0 global29 @temp1)
    DeviceInfo(1 @temp41)
    (if (DeviceInfo(2 @temp1 @temp41) and DeviceInfo(3 @temp41))
        Format(@temp81 994 3 
            (if (param1)
                "SAVE GAME"
            )(else
                "GAME"
            )
 @temp41)
        DeviceInfo(4)
        = temp0 
            (if (param1)
                Print(@temp81 #font 0 #button "OK" 1 #button "Cancel" 0 #button "Change Directory" 2)
            )(else
                Print(@temp81 #font 0 #button "OK" 1)
            )
        (if (== temp0 2)
            = temp0 proc990_0(global29)
        )
    )
    return temp0
)


(instance cast of EventHandler
    (properties)
)
(instance features of EventHandler
    (properties)
)
(instance theDoits of EventHandler
    (properties)
)
(instance sFeatures of EventHandler
    (properties)

    (method (delete param1)
        (super:delete(param1))
        (if ((global34 and (send param1:isKindOf(Collect))) and not proc999_5(param1 gRegions global28))
            (send param1:
                release()
                dispose()
            )
        )
    )

)
(instance sounds of EventHandler
    (properties)

    (method (pause param1)
        (self:eachElementDo(99 mayPause 
            (if (paramTotal)
                param1
            )(else
                1
            )
))
    )

)
(instance mayPause of Code
    (properties)

    (method (doit param1 param2)
        (if (not & (send param1:flags) $0001)
            (send param1:pause(param2))
        )
    )

)
(instance regions of EventHandler
    (properties)
)
(instance locales of EventHandler
    (properties)
)
(instance addToPics of EventHandler
    (properties)

    (method (doit)
        (self:eachElementDo(99 aTOC))
        AddToPic(elements)
    )

)
(instance controls of Controls
    (properties)
)
(instance timers of Set
    (properties)
)
(instance aTOC of Code
    (properties)

    (method (doit param1)
        (var temp0, temp1)
        (if (not | (send param1:signal) $4000)
            = temp0 (+ (send gEgo:xStep) (/ CelWide((send gEgo:view) 2 0) 2))
            = temp1 (* (send gEgo:yStep) 2)
            (send global2:addObstacle((send ((Polygon:new())):
                    init((- (send param1:brLeft) temp0) (- CoordPri(1 CoordPri((send param1:y))) temp1) (+ (send param1:brRight) temp0) (- CoordPri(1 CoordPri((send param1:y))) temp1) (+ (send param1:brRight) temp0) (+ (send param1:y) temp1) (- (send param1:brLeft) temp0) (+ (send param1:y) temp1))
                    yourself()
                )
))
        )
    )

)
(class Game of Obj
    (properties
        script 0
        parseLang 1
        printLang 1
        subtitleLang 0
        detailLevel 3
        egoMoveSpeed 0
    )

    (method (init)
        Motion
        Sound
        Save
        = gCast cast
        (send gCast:add())
        = gFeatures features
        (send gFeatures:add())
        = gSFeatures sFeatures
        (send gSFeatures:add())
        = gSounds sounds
        (send gSounds:add())
        = gRegions regions
        (send gRegions:add())
        = global28 locales
        (send global28:add())
        = gAddToPics addToPics
        (send gAddToPics:add())
        = gTimers timers
        (send gTimers:add())
        = gTheDoits theDoits
        (send gTheDoits:add())
        = global29 GetSaveDir()
        (Inv:init())
        (User:init())
    )


    (method (doit)
        (send gSounds:eachElementDo(154))
        (send gTimers:eachElementDo(60))
        (if (gTheNewDialog)
            (send gTheNewDialog:check())
        )
        Animate((send gCast:elements) 1)
        (if (global37)
            = global37 0
            (send gCast:eachElementDo(207))
        )
        (if (script)
            (send script:doit())
        )
        (send gRegions:eachElementDo(60))
        (if (== gTheGNumber gNumber)
            (User:doit())
        )
        (send gTheDoits:doit())
        (if (<> gTheGNumber gNumber)
            (self:newRoom(gTheGNumber))
        )
        (send gTimers:eachElementDo(84))
        GameIsRestarting(0)
    )


    (method (play)
        = gGame self
        = global29 GetSaveDir()
        (if (not GameIsRestarting())
            GetCWD(global29)
        )
        (self:
            setCursor(global21 1)
            init()
            setCursor(global20 HaveMouse())
        )
        (while (not global4)
            (self:doit())
            = global18 Wait(global3)
        )
    )


    (method (replay)
        (if (gPEvent)
            (send gPEvent:dispose())
        )
        (send gSFeatures:release())
        (if (gTheNewDialog)
            (send gTheNewDialog:dispose())
        )
        (send gCast:eachElementDo(99 RU))
        (send gGame:setCursor(global21 1))
        DrawPic((send global2:curPic) 100 1 global40)
        (if (<> global36 -1)
            DrawPic(global36 100 0 global40)
        )
        (if ((send global2:controls))
            (send ((send global2:controls)):draw())
        )
        (send gAddToPics:doit())
        (send gGame:setCursor(global20 HaveMouse()))
        (SL:doit())
        DoSound(2)
        (Sound:pause(0))
        (while (not global4)
            (self:doit())
            = global18 Wait(global3)
        )
    )


    (method (newRoom theGNumber)
        (var temp0[5], temp5)
        (send gAddToPics:
            eachElementDo(103)
            release()
        )
        (send gFeatures:
            eachElementDo(99 fDC)
            release()
        )
        (send gCast:
            eachElementDo(103)
            eachElementDo(84)
        )
        (send gTimers:eachElementDo(84))
        (send gRegions:
            eachElementDo(99 DNKR)
            release()
        )
        (send global28:
            eachElementDo(103)
            release()
        )
        Animate(0)
        = gWest gNumber
        = gNumber theGNumber
        = gTheGNumber theGNumber
        FlushResources(theGNumber)
        (self:
            startRoom(gNumber)
            checkAni()
        )
        SetSynonyms(gRegions)
        (while ((send (= temp5 (Event:new(3))):type))
            (send temp5:dispose())
        )
        (send temp5:dispose())
    )


    (method (startRoom param1)
        (if (global14)
            SetDebug()
        )
        = global2 ScriptID(param1)
        (send gRegions:addToFront(global2))
        (send global2:init())
    )


    (method (restart)
        (if (gTheNewDialog)
            (send gTheNewDialog:dispose())
        )
        RestartGame()
    )


    (method (restore param1)
        (var temp0[20], temp20, temp21, temp22, theParseLang)
        = theParseLang parseLang
        = parseLang 1
        Load(rsFONT global23)
        Load(rsCURSOR global21)
        = temp21 (self:setCursor(global20))
        = temp22 (Sound:pause(1))
        (if (localproc_0ddc(1))
            (if (gTheNewDialog)
                (send gTheNewDialog:dispose())
            )
            = temp20 (Restore:doit(rest param1))
            (if (<> temp20 -1)
                (self:setCursor(global21 1))
                (if (CheckSaveGame(name temp20 gLOOKUP_ERROR))
                    RestoreGame(name temp20 gLOOKUP_ERROR)
                )(else
                    Print("That game was saved under a different interpreter. It cannot be restored.")
                    (self:setCursor(temp21 HaveMouse()))
                    = parseLang theParseLang
                )
            )(else
                = parseLang theParseLang
            )
            localproc_0ddc(0)
        )
        (Sound:pause(temp22))
    )


    (method (save)
        (var temp0[20], temp20, temp21, temp22, theParseLang)
        = theParseLang parseLang
        = parseLang 1
        Load(rsFONT global23)
        Load(rsCURSOR global21)
        = temp21 (self:setCursor(global20))
        = temp22 (Sound:pause(1))
        (if (localproc_0ddc(1))
            (if (gTheNewDialog)
                (send gTheNewDialog:dispose())
            )
            = temp20 (Save:doit(@temp0))
            (if (<> temp20 -1)
                = parseLang theParseLang
                = temp21 (self:setCursor(global21 1))
                (if (not SaveGame(name temp20 @temp0 gLOOKUP_ERROR))
                    Print("Your save game disk is full. You must either use another disk or save over an existing saved game.")
                )
                (self:setCursor(temp21 HaveMouse()))
            )
            localproc_0ddc(0)
        )
        (Sound:pause(temp22))
        = parseLang theParseLang
    )


    (method (changeScore param1)
        = global15 (+ global15 param1)
        (SL:doit())
    )


    (method (handleEvent pEvent)
        (if (script)
            (send script:handleEvent(pEvent))
        )
        (if (not (send pEvent:claimed) and (== (send pEvent:type) 16384))
            (self:pragmaFail())
        )
        (send pEvent:claimed)
    )


    (method (showMem)
        proc255_4("Free Heap: %u Bytes\nLargest ptr: %u Bytes\nFreeHunk: %u KBytes\nLargest hunk: %u Bytes" MemoryInfo(1) MemoryInfo(0) >> MemoryInfo(3) $0006 MemoryInfo(2))
    )


    (method (setSpeed param1)
        (var temp0)
        = temp0 global3
        = global3 param1
        return temp0
    )


    (method (setCursor param1 param2)
        (var temp0)
        = temp0 global19
        = global19 param1
        SetCursor(param1 rest param2)
        return temp0
    )


    (method (checkAni)
        (var temp0)
        Animate((send gCast:elements) 0)
        Wait(0)
        Animate((send gCast:elements) 0)
        (while (not (> Wait(0) global30) or (== (= temp0 (send gCast:firstTrue(265))) 0))
        )
    )


    (method (notify)
    )


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


    (method (cue)
        (if (script)
            (send script:cue())
        )
    )


    (method (quitGame param1)
        (if (not paramTotal or param1)
            = global4 1
        )
    )


    (method (masterVolume param1)
        (if (paramTotal)
            DoSound(0 param1)
        )(else
            DoSound(0)
        )
    )


    (method (pragmaFail)
    )

)
(class Rgn of Obj
    (properties
        script 0
        number 0
        timer 0
        keep 0
        initialized 0
        lookStr 0
    )

    (method (init)
        (if (not initialized)
            = initialized 1
            (if (not (send gRegions:contains(self)))
                (send gRegions:addToEnd(self))
            )
            (super:init())
        )
    )


    (method (doit)
        (if (script)
            (send script:doit())
        )
    )


    (method (dispose)
        (send gRegions:delete(self))
        (if (IsObject(script))
            (send script:dispose())
        )
        (if (IsObject(timer))
            (send timer:dispose())
        )
        (send gSounds:eachElementDo(155 self))
        DisposeScript(number)
    )


    (method (handleEvent pEvent)
        (if (script)
            (send script:handleEvent(pEvent))
        )
        (send pEvent:claimed((self:doVerb((send pEvent:message)))))
    )


    (method (doVerb param1)
        return 
            (if ((== param1 1) and lookStr)
                proc255_4(994 2 lookStr)
                return 1
            )(else
                return 0
            )
    )


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


    (method (cue)
        (if (script)
            (send script:cue())
        )
    )


    (method (newRoom)
    )


    (method (notify)
    )

)
(class Rm of Rgn
    (properties
        script 0
        number 0
        timer 0
        keep 0
        initialized 0
        lookStr 0
        picture 0
        style -1
        horizon 0
        controls 0
        north 0
        east 0
        south 0
        west 0
        curPic 0
        picAngle 0
        vanishingX 160
        vanishingY 35536
        obstacles 0
    )

    (method (init)
        (var temp0)
        = number gNumber
        = controls controls
        = gPicAngle picAngle
        (if (picture)
            (self:drawPic(picture))
        )
        (switch ((send ((User:alterEgo)):edgeHit))
            (case 1
                (send ((User:alterEgo)):y(188))
            )
            (case 4
                (send ((User:alterEgo)):x((- 319 (send ((User:alterEgo)):xStep))))
            )
            (case 3
                (send ((User:alterEgo)):y((+ horizon (send ((User:alterEgo)):yStep))))
            )
            (case 2
                (send ((User:alterEgo)):x(1))
            )
        )
        (send ((User:alterEgo)):edgeHit(0))
    )


    (method (doit)
        (var temp0)
        (if (script)
            (send script:doit())
        )
        = temp0 
            (switch ((send ((User:alterEgo)):edgeHit))
                (case 1
                    north
                )
                (case 2
                    east
                )
                (case 3
                    south
                )
                (case 4
                    west
                )
            )
        (if (= temp0 
            (switch ((send ((User:alterEgo)):edgeHit))
                (case 1
                    north
                )
                (case 2
                    east
                )
                (case 3
                    south
                )
                (case 4
                    west
                )
            )
)
            (self:newRoom((= temp0 
                    (switch ((send ((User:alterEgo)):edgeHit))
                        (case 1
                            north
                        )
                        (case 2
                            east
                        )
                        (case 3
                            south
                        )
                        (case 4
                            west
                        )
                    )
)))
        )
    )


    (method (dispose)
        (if (controls)
            (send controls:dispose())
        )
        (if (obstacles)
            (send obstacles:dispose())
        )
        (super:dispose())
    )


    (method (handleEvent pEvent)
        (if (not (super:handleEvent(pEvent)) and controls)
            (send controls:handleEvent(pEvent))
        )
        (send pEvent:claimed)
    )


    (method (newRoom theGTheGNumber)
        (send gRegions:
            delete(self)
            eachElementDo(342 theGTheGNumber)
            addToFront(self)
        )
        = gTheGNumber theGTheGNumber
        (super:newRoom(theGTheGNumber))
    )


    (method (setRegions param1)
        (var temp0, temp1, temp2)
        = temp0 0
        (while (< temp0 paramTotal)
            = temp1 param1[temp0]
            = temp2 ScriptID(temp1)
            (send temp2:number(temp1))
            (send gRegions:add(temp2))
            (if (not (send temp2:initialized))
                (send temp2:init())
            )
            ++temp0
        )
    )


    (method (setFeatures param1)
        (var temp0, temp1[2])
        = temp0 0
        (while (< temp0 paramTotal)
            (send gFeatures:add(param1[temp0]))
            ++temp0
        )
    )


    (method (setLocales param1)
        (var temp0, temp1, temp2)
        = temp0 0
        (while (< temp0 paramTotal)
            = temp1 param1[temp0]
            = temp2 ScriptID(temp1)
            (send temp2:number(temp2))
            (send global28:add(temp2))
            (send temp2:init())
            ++temp0
        )
    )


    (method (drawPic theCurPic param2)
        (if (gAddToPics)
            (send gAddToPics:
                eachElementDo(103)
                release()
            )
        )
        = curPic theCurPic
        = global36 -1
        DrawPic(theCurPic 
            (if (== paramTotal 2)
                param2
            )(else
                (if (<> style -1)
                    style
                )(else
                    global17
                )
            )
 1 global40)
    )


    (method (overlay param1 param2)
        = global36 param1
        DrawPic(param1 
            (if (== paramTotal 2)
                param2
            )(else
                (if (<> style -1)
                    style
                )(else
                    global17
                )
            )
 0 global40)
    )


    (method (addObstacle param1 param2)
        (if (not IsObject(obstacles))
            = obstacles (List:new())
        )
        (send obstacles:add(param1 rest param2))
    )

)
(class Locale of Obj
    (properties
        number 0
    )

    (method (dispose)
        (send global28:delete(self))
        DisposeScript(number)
    )


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

)
(class SL of Obj
    (properties
        state 0
        code 0
    )

    (method (doit)
        (var temp0[41])
        (if (code)
            (send code:doit(@temp0))
            DrawStatus(
                (if (state)
                    @temp0
                )(else
                    0
                )
)
        )
    )


    (method (enable)
        = state 1
        (self:doit())
    )


    (method (disable)
        = state 0
        (self:doit())
    )

)
(instance RU of Code
    (properties)

    (method (doit param1)
        (var temp0)
        (if ((send param1:underBits))
            = temp0 (send param1:signal)
            = temp0 (| temp0 $0001)
            = temp0 (& temp0 $fffb)
            (send param1:
                underBits(0)
                signal(temp0)
            )
        )
    )

)
(instance DNKR of Code
    (properties)

    (method (doit param1)
        (if (not (send param1:keep))
            (send param1:dispose())
        )
    )

)
(instance fDC of Code
    (properties)

    (method (doit param1)
        (if ((send param1:respondsTo(84)))
            (send param1:
                signal(& (send param1:signal) $ffdf)
                dispose()
                delete()
            )
        )(else
            (send param1:dispose())
        )
    )

)
