(version 2)
(include "sci.sh")
(use "Main")
(use "Class_255_0")
(use "Sound")
(use "SysWindow")
(use "Cycle")
(use "InvI")
(use "User")
(use "Obj")
(script 994)



(procedure (localproc_0c30 param1)
    (var temp0, temp1[40], temp41[40], temp81[40])
    = temp0 1
    DeviceInfo(0 global30 @temp1)
    DeviceInfo(1 @temp41)
    (if (DeviceInfo(2 @temp1 @temp41) and DeviceInfo(3 @temp41))
        Format(@temp81 994 6 
            (if (param1)
                "SAVE GAME"
            )(else
                "GAME"
            )
 @temp41)
        DeviceInfo(4)
        = temp0 
            (if (param1)
                proc255_0(@temp81 33 0 81 "OK" 1 81 "Cancel" 0 81 "Change Directory" 2)
            )(else
                proc255_0(@temp81 33 0 81 "OK" 1)
            )
        (if (== temp0 2)
            = temp0 proc990_0(global30)
        )
    )
    return temp0
)


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

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

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

    (method (doit)
        AddToPic(elements)
    )

)
(instance controls of Controls
    (properties)
)
(instance timers of Set
    (properties)
)
(class Game of Obj
    (properties
        script 0
        parseLang 1
        printLang 1
        subtitleLang 0
    )

    (method (init)
        (var theMotion)
        = theMotion Motion
        = theMotion Sound
        = theMotion 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())
        = global29 locales
        (send global29:add())
        = gAddToPics addToPics
        (send gAddToPics:add())
        = gTimers timers
        (send gTimers:add())
        = global30 GetSaveDir()
        (Inv:init())
        (User:init())
    )


    (method (doit)
        (send gSounds:eachElementDo(#check))
        (send gTimers:eachElementDo(#doit))
        (if (gTheNewDialog)
            (send gTheNewDialog:check())
        )
        Animate((send gCast:elements) 1)
        (if (global58)
            = global58 0
            (send gCast:eachElementDo(#motionCue))
        )
        (if (script)
            (send script:doit())
        )
        (send gRegions:eachElementDo(#doit))
        (if (== gNewRoomNumber gNumber)
            (User:doit())
        )
        (if (<> gNewRoomNumber gNumber)
            (self:newRoom(gNewRoomNumber))
        )
        (send gTimers:eachElementDo(#delete))
        GameIsRestarting(0)
    )


    (method (showSelf)
        (send gRegions:showSelf())
    )


    (method (play)
        = gGame self
        = global30 GetSaveDir()
        (if (not GameIsRestarting())
            GetCWD(global30)
        )
        (self:setCursor(global21 1))
        (self:init())
        (self:setCursor(gGCursorNumber HaveMouse()))
        (while (not global4)
            (self:doit())
            = global18 Wait(gNewSpeed)
        )
    )


    (method (replay)
        (if (gPEvent)
            (send gPEvent:dispose())
        )
        (send gSFeatures:release())
        (if (gTheNewDialog)
            (send gTheNewDialog:dispose())
        )
        (send gCast:eachElementDo(#perform RU))
        (send gGame:setCursor(global21 1))
        DrawPic((send global2:curPic) 100 dpCLEAR global61)
        (if (<> gPicNumber -1)
            DrawPic(gPicNumber 100 dpNO_CLEAR global61)
        )
        (if ((send global2:controls))
            (send ((send global2:controls)):draw())
        )
        (send gAddToPics:doit())
        (send gGame:setCursor(gGCursorNumber HaveMouse()))
        (SL:doit())
        DoSound(sndRESUME)
        (Sound:pause(0))
        (while (not global4)
            (self:doit())
            = global18 Wait(gNewSpeed)
        )
    )


    (method (newRoom newRoomNumber)
        (var temp0[4], temp4, temp5)
        (send gAddToPics:dispose())
        (send gFeatures:
            eachElementDo(#dispose)
            release()
        )
        (send gCast:
            eachElementDo(#dispose)
            eachElementDo(#delete)
        )
        (send gTimers:eachElementDo(#delete))
        (send gRegions:
            eachElementDo(#perform DNKR)
            release()
        )
        (send global29:
            eachElementDo(#dispose)
            release()
        )
        Animate(0)
        = gGNumber gNumber
        = gNumber newRoomNumber
        = gNewRoomNumber newRoomNumber
        FlushResources(newRoomNumber)
        = temp4 (self:setCursor(global21 1))
        (self:
            startRoom(gNumber)
            checkAni()
            setCursor(temp4 HaveMouse())
        )
        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())
        (if (global55)
            (send global2:setRegions(975))
        )
    )


    (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(gGCursorNumber))
        = temp22 (Sound:pause(1))
        (if (localproc_0c30(1))
            (if (gTheNewDialog)
                (send gTheNewDialog:dispose())
            )
            = temp20 (Restore:doit(rest param1))
            (if (<> temp20 -1)
                (self:setCursor(global21 1))
                (if (CheckSaveGame(name temp20 global28))
                    RestoreGame(name temp20 global28)
                )(else
                    proc255_0(994 1 33 0 81 "OK" 1)
                    (self:setCursor(temp21 HaveMouse()))
                    = parseLang theParseLang
                )
            )(else
                = parseLang theParseLang
            )
            localproc_0c30(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(gGCursorNumber))
        = temp22 (Sound:pause(1))
        (if (localproc_0c30(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 global28))
                    proc255_0(994 0 33 0 81 "OK" 1)
                )
                (self:setCursor(temp21 HaveMouse()))
            )
            localproc_0c30(0)
        )
        (Sound:pause(temp22))
        = parseLang theParseLang
    )


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


    (method (handleEvent pEvent)
        (if (global54)
            == (send pEvent:type) 128
        )
        (if ((not not (== (send pEvent:type) 128) or not ((send gRegions:handleEvent(pEvent)) or (send global29:handleEvent(pEvent)))) and script)
            (send script:handleEvent(pEvent))
        )
        (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 newSpeed)
        (var theGNewSpeed)
        = theGNewSpeed gNewSpeed
        = gNewSpeed newSpeed
        return theGNewSpeed
    )


    (method (setCursor cursorNumber param2)
        (var theGCursorNumber)
        = theGCursorNumber gCursorNumber
        = gCursorNumber cursorNumber
        SetCursor(cursorNumber rest param2)
        return theGCursorNumber
    )


    (method (checkAni)
        (var temp0)
        Animate((send gCast:elements) 0)
        Wait(0)
        Animate((send gCast:elements) 0)
        (while (not (> Wait(0) global50) or (== (= temp0 (send gCast:firstTrue(#isExtra))) 0))
        )
    )


    (method (notify)
    )


    (method (setScript theScript sendParams)
        (if (script)
            (send script:dispose())
        )
        (if (theScript)
            (send theScript:init(self rest sendParams))
        )
    )


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


    (method (wordFail param1)
        (var temp0[100])
        proc255_4(994 2 param1)
        return 0
    )


    (method (syntaxFail)
        proc255_0(994 3)
    )


    (method (semanticFail)
        proc255_0(994 4)
    )


    (method (pragmaFail)
        proc255_0(994 5)
    )

)
(class Rgn of Obj
    (properties
        script 0
        number 0
        timer 0
        keep 0
        initialized 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(#clean self))
        DisposeScript(number)
    )


    (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))
        )
    )


    (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
        picture 0
        style $ffff
        horizon 0
        controls 0
        north 0
        east 0
        south 0
        west 0
        curPic 0
        picAngle 0
        vanishingX 160
        vanishingY -30000
    )

    (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)
            (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())
        )
        (super:dispose())
    )


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


    (method (newRoom newRoomNumber)
        (send gRegions:
            delete(self)
            eachElementDo(#newRoom newRoomNumber)
            addToFront(self)
        )
        = gNewRoomNumber newRoomNumber
        (super:newRoom(newRoomNumber))
    )


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


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


    (method (setLocales scriptNumbers)
        (var temp0, theScriptNumbers, temp2)
        = temp0 0
        (while (< temp0 paramTotal)
            = theScriptNumbers scriptNumbers[temp0]
            = temp2 ScriptID(theScriptNumbers)
            (send temp2:number(temp2))
            (send global29:add(temp2))
            (send temp2:init())
            ++temp0
        )
    )


    (method (drawPic picNumber picAnimation)
        (if (gAddToPics)
            (send gAddToPics:dispose())
        )
        = curPic picNumber
        = gPicNumber -1
        DrawPic(picNumber 
            (if (== paramTotal 2)
                picAnimation
            )(else
                (if (<> style -1)
                    style
                )(else
                    global17
                )
            )
 dpCLEAR global61)
    )


    (method (overlay picNumber picAnimation)
        = gPicNumber picNumber
        DrawPic(picNumber 
            (if (== paramTotal 2)
                picAnimation
            )(else
                (if (<> style -1)
                    style
                )(else
                    global17
                )
            )
 dpNO_CLEAR global61)
    )

)
(class Locale of Obj
    (properties
        number 0
    )

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


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

)
(class SL of Obj
    (properties
        state $0000
        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())
        )
    )

)
