Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Four-Room Maze Puzzle Game
#1
This a puzzle-solving game, and consists of four rooms to be passed through.  You will need to read the User Manual to see how to play.

   

Unzip the file and extract the folder into your PEQB64 directory.  In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.

.zip   Four-Room Maze.zip (Size: 3.29 MB / Downloads: 15)

I have some affection for this project as this was one of the first QB64 programs which Fellippe used when he first appeared at QB64, before his rise to great eminence.


You should be able to get through the maze without further assistance, but there is a walkthrough cheat which I could place here if necessary.  I'd rather not.  I notice that some the sounds do not play in PE when they play perfectly well in v2.  The programming world remains a complete mystery to me.  I have recently taken up knitting.  Perhaps that's where my meagre talents should be solely directed!


.pdf   Four-Room Maze User Manual.pdf (Size: 1.25 MB / Downloads: 16)

A short excerpt of the running program.




Code: (Select All)
' Maze Graphics Game by Magdha 2025-12-27 ex Qwerkey
'
' Sound Effects from freesfx.co.uk
' Clipart from openclipart.org
' Maze Generator from David H. Ahl

CONST False = 0, True = NOT False
CONST XGrid%% = 24, YGrid%% = 16, BlockSize%% = 51, MidExit%% = XGrid%% \ 2 'Size of grid
CONST NoBaddies%% = 10, XMaze%% = 11, YMaze%% = 7, TouchLim%% = 14, Reactions%% = 40
DIM RoomData%%(5, XGrid%% + 2, YGrid%% + 2), Background&(5), Directions%%(1, 4), EntryExit%%(1, 1)
DIM BaddieProperty%%(NoBaddies%%, 4), BaddieImg&(NoBaddies%%)
DIM Alphabet&(2, 17, 11), TutBoolean%%(17, 11), TutChars$(17, 11), TutCode%%(16, 1)
DIM StopGo%%(6, 2), Room3Img&(6, 2), HeartsPosn1%%(4, 2), HeartsPosn4%%(4, 2)
DIM NosPosn%%(7, 2), NumbersImg&(7), CratesPosn%%(6, 1)

_TITLE "Four-Room Maze"
$EXEICON:'.\Maze.ico'
RANDOMIZE (TIMER)
IF _FILEEXISTS("RoomNo.dat") THEN
    OPEN "RoomNo.dat" FOR INPUT AS #1
    INPUT #1, RoomNo%%
    CLOSE #1
ELSE
    RoomNo%% = 1
END IF

' Define direction behaviour
DATA 0,1,0,-1,0,0,0,-1,0,1
FOR N%% = 0 TO 1
    FOR M%% = 0 TO 4
        READ Directions%%(N%%, M%%)
    NEXT M%%
NEXT N%%

'Define Grids

'Room 1
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
DATA 1,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1
DATA 0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1
DATA 1,0,1,1,1,1,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,1,0,1
DATA 1,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1
DATA 1,0,1,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,1
DATA 1,0,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1
DATA 1,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1
DATA 1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1
DATA 1,0,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1
DATA 1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1
DATA 1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1
DATA 1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1
DATA 1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0
DATA 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1
FOR J%% = 2 TO YGrid%% + 1
    FOR I%% = 2 TO XGrid%% + 1
        READ K%%
        IF K%% <> 0 THEN
            RoomData%%(1, I%%, J%%) = K%%
            RoomData%%(5, I%%, J%%) = K%%
        END IF
    NEXT I%%
NEXT J%%
' Define Stop-Go positions
DATA 2,7
DATA 1,1
DATA 3,1
DATA 10,1
DATA 6,7
DATA 5,11
FOR N%% = 1 TO 6
    FOR M%% = 0 TO 1
        READ StopGo%%(N%%, M%%)
    NEXT M%%
NEXT N%%
StopGo%%(2, 1) = YGrid%% - 2
StopGo%%(3, 1) = YGrid%% - 2
StopGo%%(4, 1) = YGrid%% - 2
'Define Hearts positions
DATA 3,3
DATA 3,11
DATA 12,5
DATA 16,3
DATA 20,14
FOR N%% = 0 TO 4
    FOR M%% = 1 TO 2
        READ HeartsPosn1%%(N%%, M%%)
    NEXT M%%
NEXT N%%

'Room 2
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DATA 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1
DATA 1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,9,9,9,9,9,9,9,9,9,9,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,0,0,0,0,0,0,0,0,0,0,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,9,9,9,9,9,9,9,9,9,9,9,9,0,1,0,1,0,1
DATA 1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1
DATA 1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1
DATA 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1
FOR J%% = 2 TO YGrid%% + 1
    FOR I%% = 2 TO XGrid%% + 1
        READ K%%
        IF K%% <> 0 THEN
            RoomData%%(2, I%%, J%%) = K%%
        END IF
    NEXT I%%
NEXT J%%
' Define Tutankhamun Code array positions
DATA 16,11
DATA 17,10
DATA 17,8
DATA 17,5
DATA 15,3
DATA 13,3
DATA 12,3
DATA 9,3
DATA 7,3
DATA 6,5
DATA 6,7
DATA 6,9
DATA 7,11
DATA 8,11
DATA 11,11
DATA 12,11
DATA 13,11
FOR N%% = 0 TO 16
    FOR M%% = 0 TO 1
        READ TutCode%%(N%%, M%%)
    NEXT M%%
NEXT N%%
' Define Tutankhamun character array
DATA M,L,A,P,J,H,K,I,N,G
DATA S,T,E,Y,O,M,B,T,U,T
DATA F,U,G,N,L,X,F
DATA Y,A,Z,O,T,H,U
FOR N%% = 7 TO 16
    READ TutChars$(N%%, 3)
NEXT N%%
FOR N%% = 7 TO 16
    READ TutChars$(N%%, 11)
NEXT N%%
FOR N%% = 4 TO 10
    READ TutChars$(6, N%%)
NEXT N%%
FOR N%% = 4 TO 10
    READ TutChars$(17, N%%)
NEXT N%%
TutChars$(6, 9) = CHR$(39)

'Room 3
'Define random grid from Maze Generator
EntryExit%%(0, 0) = XGrid%% - 3: EntryExit%%(0, 1) = 1
EntryExit%%(1, 0) = 1: EntryExit%%(1, 1) = 5

'Room 4
DATA 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1
DATA 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,1
DATA 1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,0,1,0,1,0,0
DATA 1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1
DATA 1,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,0,1,1,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1
DATA 1,0,0,0,0,0,1,1,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,1
DATA 1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0,1
DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
FOR J%% = 2 TO YGrid%% + 1
    FOR I%% = 2 TO XGrid%% + 1
        READ K%%
        IF K%% <> 0 THEN
            RoomData%%(4, I%%, J%%) = K%%
        END IF
    NEXT I%%
NEXT J%%
'Define Hearts Positions
DATA 11,14
DATA 6,12
DATA 15,10
DATA 16,3
DATA 19,14
FOR N%% = 0 TO 4
    FOR M%% = 1 TO 2
        READ HeartsPosn4%%(N%%, M%%)
    NEXT M%%
NEXT N%%
'Define Numbers Positions
DATA 8,4
DATA 6,5
DATA 5,10
DATA 4,6
DATA 4,12
DATA 5,7
DATA 7,12
FOR N%% = 1 TO 7
    READ NosPosn%%(N%%, 0)
    READ NosPosn%%(N%%, 1)
NEXT N%%
'Define Crate Positions
DATA 4,5
DATA 4,7
DATA 7,5
DATA 8,6
DATA 7,8
DATA 7,10
DATA 4,13
FOR N%% = 0 TO 6
    READ CratesPosn%%(N%%, 0)
    READ CratesPosn%%(N%%, 1)
NEXT N%%

'Block out-of-view grid cells
FOR K%% = 1 TO 5
    FOR I%% = 1 TO XGrid%% + 2
        RoomData%%(K%%, I%%, 1) = 1
        RoomData%%(K%%, I%%, YGrid%% + 2) = 1
    NEXT I%%
    FOR J%% = 1 TO YGrid%% + 2
        RoomData%%(K%%, 1, J%%) = 1
        RoomData%%(K%%, XGrid%% + 2, J%%) = 1
    NEXT J%%
NEXT K%%

'Make hardware images of Smiler, exits et al
Smiler& = ToHardware&("Smiley.png", BlockSize%%, BlockSize%%)
Brick& = ToHardware&("Brick.png", BlockSize%%, BlockSize%%)
Fence& = ToHardware&("Fence.png", BlockSize%%, BlockSize%%)
TempImg& = _NEWIMAGE(BlockSize%%, BlockSize%%, 32)
Temp1Img& = _LOADIMAGE("Fence.png", 32)
_PUTIMAGE (0, CINT(BlockSize%% / 3))-(BlockSize%% - 1, BlockSize%% - 1), Temp1Img&, TempImg&
_FREEIMAGE Temp1Img&
Temp1Img& = _LOADIMAGE("Jump Arrow.png", 32)
_PUTIMAGE (5, 0)-(BlockSize%% - 6, CINT(BlockSize%% / 2) + 10), Temp1Img&, TempImg&
LowFence& = MakeHardware&(TempImg&)
_FREEIMAGE Temp1Img&
Exit4Img& = ToHardware&("Exit4.png", BlockSize%%, BlockSize%%)
Exit3Img& = ToHardware&("Exit3.png", BlockSize%%, BlockSize%%)
Exit2Img& = ToHardware&("Exit2.png", BlockSize%%, BlockSize%%)
Exit1Img& = ToHardware&("Exit1.png", BlockSize%%, BlockSize%%)
Valhalla& = _LOADIMAGE("Dead.png", 33)
AllDone& = _LOADIMAGE("WellDone.png", 33)
DoEscape& = _LOADIMAGE("Escape.png", 33)

SCREEN _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
_SCREENMOVE 50, 13
_DEST 0
_DISPLAYORDER _HARDWARE
BeAmazed%% = True
ChangeRoom%% = True
DoAnimation%% = False
IsComplete%% = False
ThatsAllFolks%% = False
ImgFree%% = False
AnimCount% = 0
DoneCount% = 0

WHILE BeAmazed%%
    _LIMIT 120 'Game Frames/Second Rate
    IF DoAnimation%% THEN
        'Animate Between Rooms
        IF ImgFree%% THEN
            ImgFree%% = False
            _FREEIMAGE Background&(RoomNo%%)
            NewPage& = ToHardware&("Page" + LTRIM$(STR$(RoomNo%% + 1)) + ".png", BlockSize%% * XGrid%%, BlockSize%% * YGrid%%)
            PageEnd& = _LOADIMAGE("Page" + LTRIM$(STR$(RoomNo%%)) + "End.png", 33)
            SELECT CASE RoomNo%%
                CASE 1
                    _FREEIMAGE BaddieImg&(0)
                    _FREEIMAGE BaddieImg&(1)
                    _FREEIMAGE BaddieImg&(2)
                    _FREEIMAGE StopGo&
                    _FREEIMAGE GoStop&
                    _FREEIMAGE HeartImg&
                    _FREEIMAGE KeyImg&
                    _FREEIMAGE BlueButton&
                    _FREEIMAGE RunStart&
                    _FREEIMAGE LowFence&
                CASE 2
                    _FREEIMAGE KeyImg&
                    _FREEIMAGE TutTomb&
                    _FREEIMAGE KingTut&
                    _FREEIMAGE KeyholeImg&
                    _FREEIMAGE LetterKey&
                    _FREEIMAGE LetterBlank&
                    FOR N%% = 7 TO 16
                        _FREEIMAGE Alphabet&(1, N%%, 3)
                        _FREEIMAGE Alphabet&(2, N%%, 3)
                        _FREEIMAGE Alphabet&(1, N%%, 11)
                        _FREEIMAGE Alphabet&(2, N%%, 11)
                    NEXT N%%
                    FOR N%% = 4 TO 10
                        _FREEIMAGE Alphabet&(1, 6, N%%)
                        _FREEIMAGE Alphabet&(2, 6, N%%)
                        _FREEIMAGE Alphabet&(1, 17, N%%)
                        _FREEIMAGE Alphabet&(2, 17, N%%)
                    NEXT N%%
                CASE 3
                    FOR N%% = 1 TO 2
                        FOR M%% = 0 TO 2
                            _FREEIMAGE Room3Img&(N%%, M%%)
                        NEXT M%%
                    NEXT N%%
                CASE 4
                    _FREEIMAGE HeartImg&
                    _FREEIMAGE CrateImg&
                    _FREEIMAGE BlueButton&
                    FOR N%% = 1 TO 7
                        _FREEIMAGE NumbersImg&(N%%)
                    NEXT N%%
                    FOR N%% = 3 TO 10
                        _FREEIMAGE BaddieImg&(N%%)
                    NEXT N%%
            END SELECT
        END IF
        XAnim% = (XGrid%% - 1) * BlockSize%% - AnimCount%
        YAnim% = (YGrid%% - 1) * BlockSize%% - AnimCount%
        _PUTIMAGE (-AnimCount% * Directions%%(0, RoomNo%%), AnimCount% * Directions%%(1, RoomNo%%)), PageEnd&
        _PUTIMAGE (XAnim% * Directions%%(0, RoomNo%%), -YAnim% * Directions%%(1, RoomNo%%)), NewPage&
        AnimCount% = AnimCount% + 3
        IF XAnim% < 0 OR (YAnim% < 0 AND (RoomNo%% = 2 OR RoomNo%% = 4)) THEN
            DoAnimation%% = False
            ChangeRoom%% = True
            RoomNo%% = RoomNo%% + 1
            _FREEIMAGE NewPage&
            _FREEIMAGE PageEnd&
            WHILE INKEY$ <> "": WEND 'Use up key presses  - does _KEYCLEAR do this?
        END IF
    ELSE
        IF ChangeRoom%% THEN
            'Set Initial Conditions
            ChangeRoom%% = False
            HasTouched%% = False
            KWaits%% = 0
            AnimCount% = 0
            IsDead%% = False
            FirstDead%% = True
            SELECT CASE (RoomNo%%)
                CASE 1, 5
                    HeartImg& = ToHardware&("Heart.png", BlockSize%%, BlockSize%%)
                    KeyImg& = ToHardware&("Key1.png", BlockSize%%, BlockSize%%)
                    StopGo& = ToHardware&("Red Dot.png", BlockSize%%, BlockSize%%)
                    GoStop& = ToHardware&("Green Dot.png", BlockSize%%, BlockSize%%)
                    BlueButton& = ToHardware&("Blue-Go.png", BlockSize%%, BlockSize%%)
                    RunStart& = ToHardware&("Double Arrow.png", BlockSize%%, BlockSize%%)
                    'Seeker baddie (0)
                    BaddieImg&(0) = ToHardware&("Evil-Smiley-Blue.png", BlockSize%%, BlockSize%%)
                    'Cycler baddie (2)
                    BaddieImg&(2) = ToHardware&("Evil-Smiley-Magenta.png", BlockSize%%, BlockSize%%)
                    FOR N%% = 1 TO 6
                        StopGo%%(N%%, 2) = False
                    NEXT N%%
                    CALL Jumble(StopGo%%())
                    Sstops%% = 0
                    Leave5%% = False
                    GotKey%% = False
                    IF RoomNo%% = 1 THEN
                        TempImg& = _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
                        FOR N%% = 2 TO XGrid%% + 1
                            FOR M%% = 2 TO YGrid%% + 1
                                IF RoomData%%(RoomNo%%, N%%, M%%) = 1 THEN
                                    Temp1mg& = _LOADIMAGE("Brick.png", 32)
                                    _PUTIMAGE (BlockSize%% * (N%% - 2), BlockSize%% * (M%% - 2))-(BlockSize%% * (N%% - 1) - 1, BlockSize%% * (M%% - 1) - 1), Temp1mg&, TempImg&
                                    _FREEIMAGE Temp1mg&
                                ELSE
                                    RoomData%%(RoomNo%%, N%%, M%%) = 0
                                END IF
                            NEXT M%%
                        NEXT N%%
                        Temp1mg& = _LOADIMAGE("Page1Header.png", 32)
                        _PUTIMAGE (300, 0), Temp1mg&, TempImg&
                        _FREEIMAGE Temp1mg&
                        Background&(RoomNo%%) = MakeHardware&(TempImg&)
                        FOR N%% = 0 TO 4
                            HeartsPosn1%%(N%%, 0) = True
                        NEXT N%%
                        HeartCount%% = 0
                        OpenFence%% = False
                        FirstMove%% = False
                        HighJump%% = False
                        CanJump%% = False
                        REDIM EnnisHill%%(12)
                        Seeker0%% = False
                        XPos%% = 0: YPos%% = 1
                        RoomData%%(RoomNo%%, 6, 4) = 2
                        RoomData%%(RoomNo%%, 15, 5) = 2
                        RoomData%%(RoomNo%%, 8, 4) = 2
                        RoomData%%(RoomNo%%, 22, 7) = 2
                        RoomData%%(RoomNo%%, 22, 13) = 2
                        'Cycler baddie (2)
                        BaddieProperty%%(2, 0) = 0
                        BaddieProperty%%(2, 1) = 13
                        BaddieProperty%%(2, 2) = 18
                        BaddieProperty%%(2, 3) = YGrid%% - 3
                        BaddieProperty%%(2, 4) = 2
                        'Starter baddie (1)
                        BaddieProperty%%(1, 0) = 0
                        BaddieProperty%%(1, 1) = 20
                        BaddieProperty%%(1, 2) = XGrid%% - 4
                        BaddieProperty%%(1, 3) = 4
                        BaddieProperty%%(1, 4) = 0
                        BaddieImg&(1) = ToHardware&("Grim-Reaper.png", BlockSize%%, BlockSize%%)
                        'Seeker baddie (0)
                        BaddieProperty%%(0, 0) = 0
                        BaddieProperty%%(0, 1) = 10
                        BaddieProperty%%(0, 2) = XGrid%% - 2
                        BaddieProperty%%(0, 3) = YGrid%% - 2
                        BaddieProperty%%(0, 4) = 0
                    ELSE
                        TempImg& = _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
                        FOR N%% = 2 TO XGrid%% + 1
                            FOR M%% = 2 TO YGrid%% + 1
                                IF RoomData%%(RoomNo%%, N%%, M%%) = 1 THEN
                                    Temp1mg& = _LOADIMAGE("Brick.png", 32)
                                    _PUTIMAGE (BlockSize%% * (N%% - 2), BlockSize%% * (M%% - 2))-(BlockSize%% * (N%% - 1) - 1, BlockSize%% * (M%% - 1) - 1), Temp1mg&, TempImg&
                                    _FREEIMAGE Temp1mg&
                                ELSE
                                    RoomData%%(RoomNo%%, N%%, M%%) = 0
                                END IF
                            NEXT M%%
                        NEXT N%%
                        Temp1mg& = _LOADIMAGE("Page5Header.png", 32)
                        _PUTIMAGE (300, 0), Temp1mg&, TempImg&
                        _FREEIMAGE Temp1mg&
                        Background&(RoomNo%%) = MakeHardware&(TempImg&)
                        HeartCount%% = 5
                        OpenFence%% = True
                        FirstMove%% = True
                        Seeker0%% = True
                        XPos%% = MidExit%%: YPos%% = YGrid%% - 1
                        FOR N%% = 0 TO 4
                            HeartsPosn1%%(N%%, 0) = False
                        NEXT N%%
                        'Cycler baddie (2)
                        BaddieProperty%%(2, 0) = 0
                        BaddieProperty%%(2, 1) = 13
                        BaddieProperty%%(2, 2) = 18
                        BaddieProperty%%(2, 3) = YGrid%% - 3
                        BaddieProperty%%(2, 4) = 2
                        'Starter baddie (1)
                        BaddieProperty%%(1, 0) = 0
                        BaddieProperty%%(1, 1) = 20
                        BaddieProperty%%(1, 2) = XGrid%% - 5
                        BaddieProperty%%(1, 3) = 1
                        BaddieProperty%%(1, 4) = 3
                        BaddieImg&(1) = ToHardware&("Grim-Reaper-Love1.png", BlockSize%%, BlockSize%%)
                        'Seeker baddie (0)
                        BaddieProperty%%(0, 0) = 0
                        BaddieProperty%%(0, 1) = 14
                        BaddieProperty%%(0, 2) = 12
                        BaddieProperty%%(0, 3) = 6
                        BaddieProperty%%(0, 4) = 0
                    END IF
                    FOR N%% = 0 TO 2
                        RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = 10 + N%%
                    NEXT N%%
                    RoomData%%(RoomNo%%, 2, 3) = 2
                    RoomData%%(RoomNo%%, 3, 5) = 2
                CASE 2
                    TempImg& = _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
                    FOR N%% = 2 TO XGrid%% + 1
                        FOR M%% = 2 TO YGrid%% + 1
                            IF RoomData%%(RoomNo%%, N%%, M%%) = 1 OR RoomData%%(RoomNo%%, N%%, M%%) = 9 THEN
                                Temp1mg& = _LOADIMAGE("Brick.png", 32)
                                _PUTIMAGE (BlockSize%% * (N%% - 2), BlockSize%% * (M%% - 2))-(BlockSize%% * (N%% - 1) - 1, BlockSize%% * (M%% - 1) - 1), Temp1mg&, TempImg&
                                _FREEIMAGE Temp1mg&
                            ELSE
                                RoomData%%(RoomNo%%, N%%, M%%) = 0
                            END IF
                        NEXT M%%
                    NEXT N%%
                    Temp1mg& = _LOADIMAGE("Page2Header.png", 32)
                    _PUTIMAGE (357, 5), Temp1mg&, TempImg&
                    _FREEIMAGE Temp1mg&
                    Background&(RoomNo%%) = MakeHardware&(TempImg&)
                    KeyImg& = ToHardware&("Key1.png", BlockSize%%, BlockSize%%)
                    TempImg& = _NEWIMAGE(BlockSize%%, BlockSize%%, 32)
                    Temp1mg& = _LOADIMAGE("LetterBackground.png", 32)
                    _PUTIMAGE (3, 3)-(BlockSize%% - 4, BlockSize%% - 4), Temp1mg&, TempImg&
                    _FREEIMAGE Temp1mg&
                    LetterBlank& = _COPYIMAGE(TempImg&, 33)
                    Temp1mg& = _LOADIMAGE("Key1.png", 32)
                    _PUTIMAGE (3, 3)-(BlockSize%% - 4, BlockSize%% - 4), Temp1mg&, TempImg&
                    _FREEIMAGE Temp1mg&
                    LetterKey& = MakeHardware&(TempImg&)
                    KeyholeImg& = ToHardware&("Keyhole.png", BlockSize%%, BlockSize%%)
                    KingTut& = ToHardware&("Tutankhamun.png", BlockSize%% * 5, BlockSize%% * 7 - 10)
                    TutTomb& = ToHardware&("TutTomb.png", BlockSize%% * 10, BlockSize%% * 7 - 18)
                    FOR N%% = 7 TO 16
                        IDFile$ = "Letter" + TutChars$(N%%, 3) + ".png"
                        Alphabet&(1, N%%, 3) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "H" + TutChars$(N%%, 3) + ".png"
                        Alphabet&(2, N%%, 3) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "Letter" + TutChars$(N%%, 11) + ".png"
                        Alphabet&(1, N%%, 11) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "H" + TutChars$(N%%, 11) + ".png"
                        Alphabet&(2, N%%, 11) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                    NEXT N%%
                    FOR N%% = 4 TO 10
                        IDFile$ = "Letter" + TutChars$(6, N%%) + ".png"
                        Alphabet&(1, 6, N%%) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "H" + TutChars$(6, N%%) + ".png"
                        Alphabet&(2, 6, N%%) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "Letter" + TutChars$(17, N%%) + ".png"
                        Alphabet&(1, 17, N%%) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                        IDFile$ = "H" + TutChars$(17, N%%) + ".png"
                        Alphabet&(2, 17, N%%) = ToEgyptian&(IDFile$, BlockSize%%, BlockSize%%)
                    NEXT N%%
                    GotKey%% = True
                    Unlocked%% = False
                    FirstUnlock%% = True
                    Leave2%% = False
                    TombCount% = 382
                    RoomData%%(RoomNo%%, XGrid%% - 1, YGrid%%) = 2
                    XPos%% = 0: YPos%% = YGrid%% - 2
                    FOR N%% = 6 TO 17
                        TutBoolean%%(N%%, 3) = False
                        TutBoolean%%(N%%, 8) = False
                    NEXT N%%
                    FOR M%% = 3 TO 11 STEP 8
                        TutBoolean%%(6, M%%) = False
                        TutBoolean%%(17, M%%) = False
                    NEXT M%%
                    FOR N%% = 13 TO 16
                        TutBoolean%%(N%%, 3) = True
                    NEXT N%%
                    FOR N%% = 14 TO 16
                        TutBoolean%%(N%%, 11) = True
                    NEXT N%%
                    TutTot%% = 5
                CASE 3
                    FOR N%% = 2 TO XGrid%% + 1
                        FOR M%% = 2 TO YGrid%% + 1
                            RoomData%%(RoomNo%%, N%%, M%%) = 0
                        NEXT M%%
                    NEXT N%%
                    XPos%% = XGrid%% - 4: YPos%% = 0
                    Leave3%% = False
                    GotKey%% = False
                    'Reload maze here
                    REDIM AMaze%%(2 * YMaze%% + 1, 2 * XMaze%% + 1), Collie%%(6, 2)
                    CALL CreatMaze(AMaze%%(), EntryExit%%(), Collie%%())
                    TempImg& = _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
                    FOR J%% = 1 TO 2 * YMaze%% + 1
                        FOR I%% = 1 TO 2 * XMaze%% + 1
                            IF AMaze%%(J%%, I%%) THEN
                                IF (I%% = 1 OR I%% = 2 * XMaze%% + 1) OR (J%% = 1 OR J%% = 2 * YMaze%% + 1) THEN
                                    Temp1mg& = _LOADIMAGE("Brick.png", 32)
                                    _PUTIMAGE (BlockSize%% * (I%% + 1 - 2), BlockSize%% * (J%% + 1 - 2))-(BlockSize%% * (I%% + 1 - 1) - 1, BlockSize%% * (J%% + 1 - 1) - 1), Temp1mg&, TempImg&
                                    _FREEIMAGE Temp1mg&
                                END IF
                                RoomData%%(3, I%% + 1, J%% + 1) = 1
                            END IF
                        NEXT I%%
                    NEXT J%%
                    'Add Borders
                    FOR I%% = 1 TO XGrid%% + 2
                        RoomData%%(3, I%%, YGrid%% + 1) = 1
                        Temp1mg& = _LOADIMAGE("Brick.png", 32)
                        _PUTIMAGE (BlockSize%% * (I%% + 1 - 2), BlockSize%% * (YGrid%% + 1 - 2))-(BlockSize%% * (I%% + 1 - 1) - 1, BlockSize%% * (YGrid%% + 1 - 1) - 1), Temp1mg&, TempImg&
                        _FREEIMAGE Temp1mg&
                    NEXT I%%
                    FOR J%% = 1 TO YGrid%% + 2
                        RoomData%%(3, XGrid%% + 1, J%%) = 1
                        Temp1mg& = _LOADIMAGE("Brick.png", 32)
                        _PUTIMAGE (BlockSize%% * (XGrid%% + 1 - 2), BlockSize%% * (J%% + 1 - 2))-(BlockSize%% * (XGrid%% + 1 - 1) - 1, BlockSize%% * (J%% + 1 - 1) - 1), Temp1mg&, TempImg&
                        _FREEIMAGE Temp1mg&
                    NEXT J%%
                    Temp1mg& = _LOADIMAGE("Page3Header.png", 32)
                    _PUTIMAGE (230, BlockSize%% * (YGrid%% - 2) + 5), Temp1mg&, TempImg&
                    _FREEIMAGE Temp1mg&
                    Background&(RoomNo%%) = MakeHardware&(TempImg&)
                    Room3Img&(1, 0) = ToHardware&("Flowers.png", BlockSize%%, BlockSize%%)
                    Room3Img&(1, 1) = ToHardware&("Vase.png", BlockSize%%, BlockSize%%)
                    Room3Img&(1, 2) = ToHardware&("Vase-Flowers.png", BlockSize%%, BlockSize%%)
                    Room3Img&(2, 0) = ToHardware&("Coins.png", BlockSize%%, BlockSize%%)
                    Room3Img&(2, 1) = ToHardware&("Piggybank.png", BlockSize%%, BlockSize%%)
                    Room3Img&(2, 2) = ToHardware&("Piggybank-Coins.png", BlockSize%%, BlockSize%%)
                    Room3Img&(3, 0) = ToHardware&("Goldfish.png", BlockSize%%, BlockSize%%)
                    Room3Img&(3, 1) = ToHardware&("Bowl.png", BlockSize%%, BlockSize%%)
                    Room3Img&(3, 2) = ToHardware&("Bowl-Goldfish.png", BlockSize%%, BlockSize%%)
                CASE 4
                    TempImg& = _NEWIMAGE(BlockSize%% * XGrid%%, BlockSize%% * YGrid%%, 32)
                    FOR N%% = 2 TO XGrid%% + 1
                        FOR M%% = 2 TO YGrid%% + 1
                            IF RoomData%%(RoomNo%%, N%%, M%%) = 1 THEN
                                Temp1mg& = _LOADIMAGE("Brick.png", 32)
                                _PUTIMAGE (BlockSize%% * (N%% - 2), BlockSize%% * (M%% - 2))-(BlockSize%% * (N%% - 1) - 1, BlockSize%% * (M%% - 1) - 1), Temp1mg&, TempImg&
                                _FREEIMAGE Temp1mg&
                            ELSE
                                RoomData%%(RoomNo%%, N%%, M%%) = 0
                            END IF
                        NEXT M%%
                    NEXT N%%
                    Temp1mg& = _LOADIMAGE("Page4Header.png", 32)
                    _PUTIMAGE (220, BlockSize%% * (YGrid%% - 1) + 2), Temp1mg&, TempImg&
                    _FREEIMAGE Temp1mg&
                    Background&(RoomNo%%) = MakeHardware&(TempImg&)
                    HeartImg& = ToHardware&("Heart.png", BlockSize%%, BlockSize%%)
                    CrateImg& = ToHardware&("Crate.png", BlockSize%%, BlockSize%%)
                    BlueButton& = ToHardware&("Blue-Go.png", BlockSize%%, BlockSize%%)
                    FOR N%% = 1 TO 7
                        NumbersImg&(N%%) = ToHardware&(LTRIM$(STR$(N%%)) + ".png", BlockSize%%, BlockSize%%)
                    NEXT N%%
                    'Dart-up baddie (3)
                    BaddieImg&(3) = ToHardware&("DartUp.png", BlockSize%%, BlockSize%%)
                    UpStartX%% = XGrid%% - 4
                    UpStartY%% = YGrid%% - 3
                    'Dart-down baddie (4)
                    BaddieImg&(4) = ToHardware&("DartDown.png", BlockSize%%, BlockSize%%)
                    DownStartX%% = XGrid%% - 2
                    DownStartY%% = 1
                    'Seeker-stopper baddie (5)
                    BaddieImg&(5) = ToHardware&("Evil-Smiley-Yellow.png", BlockSize%%, BlockSize%%)
                    AtHome5X%% = XGrid%% - 6
                    AtHome5Y%% = YGrid%% - 2
                    'Marbles (6-9)
                    BaddieImg&(6) = ToHardware&("Marble.png", BlockSize%%, BlockSize%%)
                    BaddieImg&(7) = ToHardware&("Marble.png", BlockSize%%, BlockSize%%)
                    BaddieImg&(8) = ToHardware&("Marble.png", BlockSize%%, BlockSize%%)
                    BaddieImg&(9) = ToHardware&("Marble.png", BlockSize%%, BlockSize%%)
                    'Right cycler baddie (10)
                    BaddieImg&(10) = ToHardware&("Evil-Smiley-Cyan.png", BlockSize%%, BlockSize%%)
                    XPos%% = XGrid%% - 1: YPos%% = 4
                    Marbles%% = False
                    MarbleX%% = 13
                    MarbleY%% = YGrid%% - 1
                    Leave4%% = False
                    CountHearts%% = 0
                    Rounders%% = 0
                    ResetRound%% = False
                    RoomData%%(RoomNo%%, 4, YGrid%% - 1) = 2
                    GotKey%% = False
                    'Set Hearts Start Conditions
                    FOR N%% = 0 TO 4
                        HeartsPosn4%%(N%%, 0) = True
                    NEXT N%%
                    'Set Crates Start Positions
                    FOR N%% = 0 TO 6
                        RoomData%%(RoomNo%%, CratesPosn%%(N%%, 0) + 2, CratesPosn%%(N%%, 1) + 2) = 8
                    NEXT N%%
                    ' Initialise numbers
                    FOR N%% = 0 TO 7
                        NosPosn%%(N%%, 2) = False
                    NEXT N%%
                    'Dart-up baddie (3)
                    BaddieProperty%%(3, 0) = 0
                    BaddieProperty%%(3, 1) = 14
                    BaddieProperty%%(3, 2) = UpStartX%%
                    BaddieProperty%%(3, 3) = 7
                    BaddieProperty%%(3, 4) = 2
                    'Dart-down baddie (4)
                    BaddieProperty%%(4, 0) = 0
                    BaddieProperty%%(4, 1) = 15
                    BaddieProperty%%(4, 2) = DownStartX%%
                    BaddieProperty%%(4, 3) = 8
                    BaddieProperty%%(4, 4) = 4
                    'Seeker-stopper baddie (5)
                    BaddieProperty%%(5, 0) = 0
                    BaddieProperty%%(5, 1) = 30
                    BaddieProperty%%(5, 2) = AtHome5X%%
                    BaddieProperty%%(5, 3) = 1
                    BaddieProperty%%(5, 4) = 4
                    SeekEnd%% = True
                    'Marble baddie (6)
                    BaddieProperty%%(6, 0) = 0
                    BaddieProperty%%(6, 1) = 47
                    BaddieProperty%%(6, 2) = 14
                    BaddieProperty%%(6, 3) = 5
                    BaddieProperty%%(6, 4) = 0
                    'Marble baddie (7)
                    BaddieProperty%%(7, 0) = 0
                    BaddieProperty%%(7, 1) = 48
                    BaddieProperty%%(7, 2) = 15
                    BaddieProperty%%(7, 3) = 5
                    BaddieProperty%%(7, 4) = 0
                    'Marble baddie (8)
                    BaddieProperty%%(8, 0) = 0
                    BaddieProperty%%(8, 1) = 46
                    BaddieProperty%%(8, 2) = 15
                    BaddieProperty%%(8, 3) = 6
                    BaddieProperty%%(8, 4) = 0
                    'Marble baddie (9)
                    BaddieProperty%%(9, 0) = 0
                    BaddieProperty%%(9, 1) = 45
                    BaddieProperty%%(9, 2) = 14
                    BaddieProperty%%(9, 3) = 6
                    BaddieProperty%%(9, 4) = 0
                    'Right cycler baddie (10)
                    BaddieProperty%%(10, 0) = 0
                    BaddieProperty%%(10, 1) = 62
                    BaddieProperty%%(10, 2) = 3
                    BaddieProperty%%(10, 3) = 14
                    BaddieProperty%%(10, 4) = 2
                    FOR N%% = 3 TO 10
                        RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = 10 + N%%
                    NEXT N%%
            END SELECT
        END IF
        'Display Background
        _PUTIMAGE , Background&(RoomNo%%)
        'Calculate Positions and Display
        SELECT CASE (RoomNo%%)
            CASE 1, 5
                _PUTIMAGE (BlockSize%% * 0, BlockSize%% * 3), Exit4Img&
                _PUTIMAGE (BlockSize%% * (XGrid%% - 1), BlockSize%% * (YGrid%% - 2)), Exit2Img&
                _PUTIMAGE (BlockSize%% * (MidExit%%), BlockSize%% * (YGrid%% - 1)), Exit1Img&
                FOR N%% = 1 TO 6
                    IF N%% > Sstops%% THEN
                        _PUTIMAGE (BlockSize%% * StopGo%%(N%%, 0), BlockSize%% * StopGo%%(N%%, 1)), StopGo&
                    ELSE
                        _PUTIMAGE (BlockSize%% * StopGo%%(N%%, 0), BlockSize%% * StopGo%%(N%%, 1)), GoStop&
                    END IF
                NEXT N%%
                FOR N%% = 0 TO 4
                    IF HeartsPosn1%%(N%%, 0) THEN _PUTIMAGE (BlockSize%% * HeartsPosn1%%(N%%, 1), BlockSize%% * HeartsPosn1%%(N%%, 2)), HeartImg&
                NEXT N%%
                IF HeartCount%% < 4 THEN
                    _PUTIMAGE (BlockSize%% * 6, BlockSize%% * 2), Fence&
                    IF HeartCount%% < 2 THEN
                        _PUTIMAGE (BlockSize%% * 13, BlockSize%% * 3), Fence&
                        IF HeartCount%% < 1 THEN
                            _PUTIMAGE (BlockSize%% * 20, BlockSize%% * 5), Fence&
                        END IF
                    END IF
                END IF
                IF RoomData%%(RoomNo%%, 22, 13) <> 0 THEN _PUTIMAGE (BlockSize%% * 20, BlockSize%% * 11), LowFence&
                IF HighJump%% THEN
                    N%% = 1
                    WHILE EnnisHill%%(N%%) AND N%% <= 11
                        IF EnnisHill%%(N%%) THEN _PUTIMAGE (BlockSize%% * 20, BlockSize%% * N%%), RunStart&
                        N%% = N%% + 1
                    WEND
                ELSEIF HeartCount%% = 1 AND RoomData%%(RoomNo%%, 22, 13) <> 0 THEN 'When 1 heart picked up & fence not jumped
                    _PUTIMAGE (BlockSize%% * 20, BlockSize%%), RunStart&
                END IF
                IF NOT OpenFence%% THEN _PUTIMAGE (BlockSize%% * 4, BlockSize%% * 2), Fence&
                IF Sstops%% < 6 THEN _PUTIMAGE (BlockSize%% * 1, BlockSize%% * 3), Fence&
                IF NOT GotKey%% AND RoomNo%% = 1 THEN _PUTIMAGE (BlockSize%% * 22, BlockSize%% * 3), KeyImg&
                IF NOT Seeker0%% THEN _PUTIMAGE (BlockSize%% * 21, BlockSize%% * 1), BlueButton&
                '0 Seek Smiler - Move Horizonyally First
                IF Seeker0%% THEN
                    IF BaddieProperty%%(0, 2) + Directions%%(0, BaddieProperty%%(0, 4)) = XPos%% AND BaddieProperty%%(0, 3) + Directions%%(1, BaddieProperty%%(0, 4)) = YPos%% THEN
                        'Kill Smiler
                    ELSEIF BaddieProperty%%(0, 2) < XPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(0, 2) + 1 + 2, BaddieProperty%%(0, 3) + 2) = 0 THEN
                        BaddieProperty%%(0, 4) = 1
                    ELSEIF BaddieProperty%%(0, 2) > XPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(0, 2) - 1 + 2, BaddieProperty%%(0, 3) + 2) = 0 THEN
                        BaddieProperty%%(0, 4) = 3
                    ELSEIF BaddieProperty%%(0, 3) > YPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(0, 2) + 2, BaddieProperty%%(0, 3) - 1 + 2) = 0 THEN
                        BaddieProperty%%(0, 4) = 2
                    ELSEIF BaddieProperty%%(0, 3) < YPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(0, 2) + 2, BaddieProperty%%(0, 3) + 1 + 2) = 0 THEN
                        BaddieProperty%%(0, 4) = 4
                    ELSE
                        BaddieProperty%%(0, 4) = 0
                    END IF
                END IF
                '1 Starter badddie try to turn left first - kill power can be eliminated
                IF FirstMove%% THEN
                    _PUTIMAGE (BlockSize%% * 0, BlockSize%% * 1), Brick&
                    NoNext%% = BaddieProperty%%(1, 4) + 1
                    IF NoNext%% > 4 THEN NoNext%% = 1
                    IF RoomData%%(RoomNo%%, BaddieProperty%%(1, 2) + Directions%%(0, BaddieProperty%%(1, 4)) + 2, BaddieProperty%%(1, 3) + Directions%%(1, BaddieProperty%%(1, 4)) + 2) = 0 THEN
                        'IF NOT CanKill%% AND (BaddieProperty%%(1, 2) + Directions%%(0, BaddieProperty%%(1, 4)) = XPos%%) AND (BaddieProperty%%(1, 3) + Directions%%(1, BaddieProperty%%(1, 4)) = YPos%%) THEN
                        IF HeartCount%% >= 3 AND (BaddieProperty%%(1, 2) + Directions%%(0, BaddieProperty%%(1, 4)) = XPos%%) AND (BaddieProperty%%(1, 3) + Directions%%(1, BaddieProperty%%(1, 4)) = YPos%%) THEN
                            'Bounce off Smiler
                            M%% = 1 + INT(4 * RND)
                            'IF BreakFence%% AND (BaddieProperty%%(1, 2) + Directions%%(0, M%%) = 4) AND (BaddieProperty%%(1, 3) + Directions%%(1, M%%) = 2) THEN
                            IF HeartCount%% >= 3 AND (BaddieProperty%%(1, 2) + Directions%%(0, M%%) = 4) AND (BaddieProperty%%(1, 3) + Directions%%(1, M%%) = 2) THEN
                                'Break through fence
                                IF NOT OpenFence%% THEN _SNDPLAYFILE "Fence.mp3", , 1
                                BaddieProperty%%(1, 4) = M%%
                                OpenFence%% = True
                                RoomData%%(RoomNo%%, 6, 4) = 0 'This extra line is required
                            ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(1, 2) + Directions%%(0, M%%) + 2, BaddieProperty%%(1, 3) + Directions%%(1, M%%) + 2) = 0 THEN
                                IF BaddieProperty%%(1, 4) <> M%% THEN BaddieProperty%%(1, 4) = M%%
                                'Can move
                            ELSE
                                BaddieProperty%%(1, 4) = 0
                            END IF
                        END IF
                    ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(1, 2) + Directions%%(0, NoNext%%) + 2, BaddieProperty%%(1, 3) + Directions%%(1, NoNext%%) + 2) = 0 THEN
                        'Can move
                        BaddieProperty%%(1, 4) = NoNext%%
                    ELSE
                        M%% = 1 + INT(4 * RND)
                        IF RoomData%%(RoomNo%%, BaddieProperty%%(1, 2) + Directions%%(0, M%%) + 2, BaddieProperty%%(1, 3) + Directions%%(1, M%%) + 2) = 0 THEN
                            'Can move
                            BaddieProperty%%(1, 4) = M%%
                        ELSE
                            BaddieProperty%%(1, 4) = 0
                        END IF
                    END IF
                END IF
                '2 End Cycler badddie - try to turn left first
                GoRight%% = BaddieProperty%%(2, 4) - 1
                IF GoRight%% < 1 THEN GoRight%% = 4
                GoLeft%% = BaddieProperty%%(2, 4) + 1
                IF GoLeft%% > 4 THEN GoLeft%% = 1
                IF BaddieProperty%%(2, 2) + Directions%%(0, BaddieProperty%%(2, 4)) = XPos%% AND BaddieProperty%%(2, 3) + Directions%%(1, BaddieProperty%%(2, 4)) = YPos%% THEN
                    ' Kill Smiler
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(2, 2) + Directions%%(0, BaddieProperty%%(2, 4)) + 2, BaddieProperty%%(2, 3) + Directions%%(1, BaddieProperty%%(2, 4)) + 2) = 0 THEN
                    'Can move
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(2, 2) + Directions%%(0, GoLeft%%) + 2, BaddieProperty%%(2, 3) + Directions%%(1, GoLeft%%) + 2) = 0 THEN
                    'Can turn Left
                    BaddieProperty%%(2, 4) = GoLeft%%
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(2, 2) + Directions%%(0, GoRight%%) + 2, BaddieProperty%%(2, 3) + Directions%%(1, GoRight%%) + 2) = 0 THEN
                    'Can turn Right
                    BaddieProperty%%(2, 4) = GoRight%%
                ELSE
                    BaddieProperty%%(2, 4) = 0
                END IF
                FOR N%% = 0 TO 2
                    IF BaddieProperty%%(N%%, 4) <> 0 AND NOT IsDead%% THEN
                        BaddieProperty%%(N%%, 0) = BaddieProperty%%(N%%, 0) + 1
                        IF BaddieProperty%%(N%%, 0) = BaddieProperty%%(N%%, 1) THEN
                            BaddieProperty%%(N%%, 0) = 0
                            RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = 0
                            BaddieProperty%%(N%%, 2) = BaddieProperty%%(N%%, 2) + Directions%%(0, BaddieProperty%%(N%%, 4))
                            BaddieProperty%%(N%%, 3) = BaddieProperty%%(N%%, 3) + Directions%%(1, BaddieProperty%%(N%%, 4))
                            RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = N%% + 10
                            IF BaddieProperty%%(N%%, 2) = XPos%% AND BaddieProperty%%(N%%, 3) = YPos%% THEN
                                'IF N%% <> 1 OR CanKill%% THEN IsDead%% = True
                                IF N%% <> 1 OR HeartCount%% <= 2 THEN IsDead%% = True
                            END IF
                        END IF
                    ELSE
                        BaddieProperty%%(N%%, 0) = 0
                    END IF
                    _PUTIMAGE (BlockSize%% * BaddieProperty%%(N%%, 2), BlockSize%% * BaddieProperty%%(N%%, 3)), BaddieImg&(N%%)
                NEXT N%%
            CASE 2
                _PUTIMAGE (BlockSize%% * 0, BlockSize%% * (YGrid%% - 2)), Exit2Img&
                _PUTIMAGE (BlockSize%% * (XGrid%% - 4), BlockSize%% * (YGrid%% - 1)), Exit3Img&
                IF Leave2%% THEN
                    'Animated tomb change
                    IF TombCount% < 0 THEN
                        _PUTIMAGE (BlockSize%% * 7, BlockSize%% * 4 + 9), TutTomb&
                    ELSE
                        IF TombCount% > 255 THEN
                            _PUTIMAGE (BlockSize%% * 9.5 + 382 - TombCount%, BlockSize%% * 4)-(BlockSize%% * 14.5 - 382 + TombCount%, BlockSize%% * 11), KingTut&
                        ELSE
                            _PUTIMAGE (BlockSize%% * 7 + TombCount%, BlockSize%% * 4 + 9)-(BlockSize%% * 17 - TombCount%, BlockSize%% * 11 - 9), TutTomb&
                        END IF
                        TombCount% = TombCount% - 1
                    END IF
                ELSE
                    _PUTIMAGE (BlockSize%% * 9.5, BlockSize%% * 4), KingTut&
                END IF
                FOR N%% = 7 TO 16
                    FOR M%% = 3 TO 11 STEP 8
                        IF TutBoolean%%(N%%, M%%) THEN
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), Alphabet&(1, N%%, M%%)
                        ELSE
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), Alphabet&(2, N%%, M%%)
                        END IF
                    NEXT M%%
                NEXT N%%
                FOR N%% = 6 TO 17 STEP 11
                    FOR M%% = 4 TO 10
                        IF TutBoolean%%(N%%, M%%) THEN
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), Alphabet&(1, N%%, M%%)
                        ELSE
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), Alphabet&(2, N%%, M%%)
                        END IF
                    NEXT M%%
                    FOR M%% = 3 TO 11 STEP 8
                        IF TutBoolean%%(N%%, M%%) THEN
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), LetterKey&
                        ELSE
                            _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), LetterBlank&
                        END IF
                    NEXT M%%
                NEXT N%%
                IF NOT Unlocked%% THEN _PUTIMAGE (BlockSize%% * (XGrid%% - 2), BlockSize%% * (YGrid%% - 2)), KeyholeImg&
                IF NOT Leave2%% THEN _PUTIMAGE (BlockSize%% * (XGrid%% - 3), BlockSize%% * (YGrid%% - 2)), Fence&
            CASE 3
                IF Leave3%% THEN _PUTIMAGE (BlockSize%% * 0, BlockSize%% * 4), Exit4Img&
                _PUTIMAGE (BlockSize%% * (XGrid%% - 4), BlockSize%% * 0), Exit3Img&
                FOR N%% = -3 TO 3
                    FOR M%% = -3 TO 3
                        IF M%% = 0 AND N%% = 0 THEN
                            'Do nothing
                        ELSE
                            I1%% = XPos%% + N%%
                            J1%% = YPos%% + M%%
                            IF I1%% >= 1 AND I1%% <= XGrid%% - 3 AND J1%% >= 1 AND J1%% <= YGrid%% - 3 THEN
                                IF RoomData%%(RoomNo%%, I1%% + 2, J1%% + 2) <> 0 THEN _PUTIMAGE (BlockSize%% * I1%%, BlockSize%% * J1%%), Brick&
                            END IF
                        END IF
                    NEXT M%%
                NEXT N%%
                FOR K%% = 1 TO 3
                    IF Collie%%(K%%, 1) - 1 >= XPos%% - 3 AND Collie%%(K%%, 1) - 1 <= XPos%% + 3 THEN
                        IF Collie%%(K%%, 2) - 1 >= YPos%% - 3 AND Collie%%(K%%, 2) - 1 <= YPos%% + 3 THEN
                            IF NOT Collie%%(K%%, 0) THEN _PUTIMAGE (BlockSize%% * (Collie%%(K%%, 1) - 1), BlockSize%% * (Collie%%(K%%, 2) - 1)), Room3Img&(K%%, 0)
                        END IF
                    END IF
                NEXT K%%
                FOR K%% = 4 TO 6
                    IF Collie%%(K%%, 1) - 1 >= XPos%% - 3 AND Collie%%(K%%, 1) - 1 <= XPos%% + 3 THEN
                        IF Collie%%(K%%, 2) - 1 >= YPos%% - 3 AND Collie%%(K%%, 2) - 1 <= YPos%% + 3 THEN
                            IF NOT Collie%%(K%%, 0) THEN
                                _PUTIMAGE (BlockSize%% * (Collie%%(K%%, 1) - 1), BlockSize%% * (Collie%%(K%%, 2) - 1)), Room3Img&(K%% - 3, 1)
                            ELSE
                                _PUTIMAGE (BlockSize%% * (Collie%%(K%%, 1) - 1), BlockSize%% * (Collie%%(K%%, 2) - 1)), Room3Img&(K%% - 3, 2)
                            END IF
                        END IF
                    END IF
                NEXT K%%
            CASE 4
                _PUTIMAGE (BlockSize%% * (XGrid%% - 1), BlockSize%% * 4), Exit4Img&
                _PUTIMAGE (BlockSize%% * (MidExit%%), BlockSize%% * 0), Exit1Img&
                IF NOT Marbles%% THEN _PUTIMAGE (BlockSize%% * 13, BlockSize%% * 5), BlueButton&
                IF NOT Leave4%% THEN _PUTIMAGE (BlockSize%% * 2, BlockSize%% * (YGrid%% - 3)), Fence&
                FOR N%% = 0 TO 4
                    IF HeartsPosn4%%(N%%, 0) THEN _PUTIMAGE (BlockSize%% * HeartsPosn4%%(N%%, 1), BlockSize%% * HeartsPosn4%%(N%%, 2)), HeartImg&
                NEXT N%%
                FOR N%% = 3 TO 10 'RHS openings included
                    FOR M%% = 3 TO 14
                        IF RoomData%%(RoomNo%%, N%% + 2, M%% + 2) = 8 THEN _PUTIMAGE (BlockSize%% * N%%, BlockSize%% * M%%), CrateImg&
                    NEXT M%%
                NEXT N%%
                FOR N%% = 1 TO 7
                    _PUTIMAGE (BlockSize%% * NosPosn%%(N%%, 0), BlockSize%% * NosPosn%%(N%%, 1)), NumbersImg&(N%%)
                NEXT N%%
                '3 Dart-up badddie
                BaddieProperty%%(3, 4) = 2
                IF BaddieProperty%%(3, 2) + Directions%%(0, BaddieProperty%%(3, 4)) = XPos%% AND BaddieProperty%%(3, 3) + Directions%%(1, BaddieProperty%%(3, 4)) = YPos%% THEN
                    'Kill Smiler
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(3, 2) + Directions%%(0, BaddieProperty%%(3, 4)) + 2, BaddieProperty%%(3, 3) + Directions%%(1, BaddieProperty%%(3, 4)) + 2) = 0 THEN
                    'Can move
                ELSEIF RoomData%%(RoomNo%%, UpStartX%% + 2, UpStartY%% + 2) = 0 THEN
                    'Can move to start
                    RoomData%%(RoomNo%%, BaddieProperty%%(3, 2) + 2, BaddieProperty%%(3, 3) + 2) = 0
                    BaddieProperty%%(3, 0) = 0
                    BaddieProperty%%(3, 2) = UpStartX%%
                    BaddieProperty%%(3, 3) = UpStartY%%
                ELSE
                    BaddieProperty%%(3, 4) = 0
                END IF
                '4 Dart-down badddie
                BaddieProperty%%(4, 4) = 4
                IF BaddieProperty%%(4, 2) + Directions%%(0, BaddieProperty%%(4, 4)) = XPos%% AND BaddieProperty%%(4, 3) + Directions%%(1, BaddieProperty%%(4, 4)) = YPos%% THEN 'AND BaddieProperty%%(1, 0) = BaddieProperty%%(1, 1) THEN
                    'Kill Smiler
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(4, 2) + Directions%%(0, BaddieProperty%%(4, 4)) + 2, BaddieProperty%%(4, 3) + Directions%%(1, BaddieProperty%%(4, 4)) + 2) = 0 THEN
                    'Can move
                ELSEIF RoomData%%(RoomNo%%, DownStartX%% + 2, DownStartY%% + 2) = 0 THEN
                    'Can move to start
                    RoomData%%(RoomNo%%, BaddieProperty%%(4, 2) + 2, BaddieProperty%%(4, 3) + 2) = 0
                    BaddieProperty%%(4, 0) = 0
                    BaddieProperty%%(4, 2) = DownStartX%%
                    BaddieProperty%%(4, 3) = DownStartY%%
                ELSE
                    BaddieProperty%%(4, 4) = 0
                END IF
                '5 End seeker / Smiler seeker
                IF SeekEnd%% THEN
                    IF (BaddieProperty%%(5, 2) <> AtHome5X%% OR BaddieProperty%%(5, 3) <> AtHome5Y%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 2, BaddieProperty%%(5, 3) + 1 + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 4
                    ELSEIF (BaddieProperty%%(5, 2) <> AtHome5X%% AND BaddieProperty%%(5, 3) = AtHome5Y%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 1 + 2, BaddieProperty%%(5, 3) + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 1
                    ELSEIF (BaddieProperty%%(5, 2) <> AtHome5X%% OR BaddieProperty%%(5, 3) <> AtHome5Y%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) - 1 + 2, BaddieProperty%%(5, 3) + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 3
                    ELSEIF (BaddieProperty%%(5, 2) <> AtHome5X%% OR BaddieProperty%%(5, 3) <> AtHome5Y%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 1 + 2, BaddieProperty%%(5, 3) + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 1
                    ELSE
                        BaddieProperty%%(5, 4) = 0
                    END IF
                ELSE
                    'Seek Smiler
                    IF BaddieProperty%%(5, 2) + Directions%%(0, BaddieProperty%%(5, 4)) = XPos%% AND BaddieProperty%%(5, 3) + Directions%%(1, BaddieProperty%%(5, 4)) = YPos%% THEN
                        'Don't step on Smiler
                        BaddieProperty%%(5, 4) = 0
                    ELSEIF BaddieProperty%%(5, 2) < XPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 1 + 2, BaddieProperty%%(5, 3) + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 1
                    ELSEIF BaddieProperty%%(5, 2) > XPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) - 1 + 2, BaddieProperty%%(5, 3) + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 3
                    ELSEIF BaddieProperty%%(5, 3) > YPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 2, BaddieProperty%%(5, 3) - 1 + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 2
                    ELSEIF BaddieProperty%%(5, 3) < YPos%% AND RoomData%%(RoomNo%%, BaddieProperty%%(5, 2) + 2, BaddieProperty%%(5, 3) + 1 + 2) = 0 THEN
                        BaddieProperty%%(5, 4) = 4
                    ELSE
                        BaddieProperty%%(5, 4) = 0
                    END IF
                END IF
                '10 Round Cycler badddie try to turn right
                GoRight%% = BaddieProperty%%(10, 4) - 1
                IF GoRight%% < 1 THEN GoRight%% = 4
                IF RoomData%%(RoomNo%%, BaddieProperty%%(10, 2) + Directions%%(0, BaddieProperty%%(10, 4)) + 2, BaddieProperty%%(10, 3) + Directions%%(1, BaddieProperty%%(10, 4)) + 2) = 0 THEN
                    'Can move
                ELSEIF RoomData%%(RoomNo%%, BaddieProperty%%(10, 2) + Directions%%(0, GoRight%%) + 2, BaddieProperty%%(10, 3) + Directions%%(1, GoRight%%) + 2) = 0 THEN
                    'Can turn Right
                    BaddieProperty%%(10, 4) = GoRight%%
                ELSE
                    BaddieProperty%%(10, 4) = 0
                END IF
                'Marbles
                IF Marbles%% THEN
                    IF (BaddieProperty%%(6, 2) <> MarbleX%% OR BaddieProperty%%(6, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(6, 2) + 2, BaddieProperty%%(6, 3) + 1 + 2) = 0 THEN
                        IF BaddieProperty%%(6, 3) + 1 = YPos%% AND BaddieProperty%%(6, 2) = XPos%% THEN
                            BaddieProperty%%(6, 4) = 0
                        ELSE
                            BaddieProperty%%(6, 4) = 4
                        END IF
                    ELSEIF (BaddieProperty%%(6, 2) <> MarbleX%% OR BaddieProperty%%(6, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(6, 2) - 1 + 2, BaddieProperty%%(6, 3) + 2) = 0 THEN
                        IF BaddieProperty%%(6, 2) - 1 = XPos%% AND BaddieProperty%%(6, 3) = YPos%% THEN
                            BaddieProperty%%(6, 4) = 0
                        ELSE
                            BaddieProperty%%(6, 4) = 3
                        END IF
                    ELSE
                        BaddieProperty%%(6, 4) = 0
                    END IF
                    IF (BaddieProperty%%(7, 2) <> MarbleX%% OR BaddieProperty%%(7, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(7, 2) + 2, BaddieProperty%%(7, 3) + 1 + 2) = 0 THEN
                        IF BaddieProperty%%(7, 3) + 1 = YPos%% AND BaddieProperty%%(7, 2) = XPos%% THEN
                            BaddieProperty%%(7, 4) = 0
                        ELSE
                            BaddieProperty%%(7, 4) = 4
                        END IF
                    ELSEIF (BaddieProperty%%(7, 2) <> MarbleX%% OR BaddieProperty%%(7, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(7, 2) - 1 + 2, BaddieProperty%%(7, 3) + 2) = 0 THEN
                        IF BaddieProperty%%(7, 2) - 1 = XPos%% AND BaddieProperty%%(7, 3) = YPos%% THEN
                            BaddieProperty%%(7, 4) = 0
                        ELSE
                            BaddieProperty%%(7, 4) = 3
                        END IF
                    ELSE
                        BaddieProperty%%(7, 4) = 0
                    END IF
                    IF (BaddieProperty%%(8, 2) <> MarbleX%% OR BaddieProperty%%(8, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(8, 2) + 2, BaddieProperty%%(8, 3) + 1 + 2) = 0 THEN
                        IF BaddieProperty%%(8, 3) + 1 = YPos%% AND BaddieProperty%%(8, 2) = XPos%% THEN
                            BaddieProperty%%(8, 4) = 0
                        ELSE
                            BaddieProperty%%(8, 4) = 4
                        END IF
                    ELSEIF (BaddieProperty%%(8, 2) <> MarbleX%% OR BaddieProperty%%(8, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(8, 2) - 1 + 2, BaddieProperty%%(8, 3) + 2) = 0 THEN
                        IF BaddieProperty%%(8, 2) - 1 = XPos%% AND BaddieProperty%%(8, 3) = YPos%% THEN
                            BaddieProperty%%(8, 4) = 0
                        ELSE
                            BaddieProperty%%(8, 4) = 3
                        END IF
                    ELSE
                        BaddieProperty%%(8, 4) = 0
                    END IF
                    IF (BaddieProperty%%(9, 2) <> MarbleX%% OR BaddieProperty%%(9, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(9, 2) + 2, BaddieProperty%%(9, 3) + 1 + 2) = 0 THEN
                        IF BaddieProperty%%(9, 3) + 1 = YPos%% AND BaddieProperty%%(9, 2) = XPos%% THEN
                            BaddieProperty%%(9, 4) = 0
                        ELSE
                            BaddieProperty%%(9, 4) = 4
                        END IF
                    ELSEIF (BaddieProperty%%(9, 2) <> MarbleX%% OR BaddieProperty%%(9, 3) <> MarbleY%%) AND RoomData%%(RoomNo%%, BaddieProperty%%(9, 2) - 1 + 2, BaddieProperty%%(9, 3) + 2) = 0 THEN
                        IF BaddieProperty%%(9, 2) - 1 = XPos%% AND BaddieProperty%%(9, 3) = YPos%% THEN
                            BaddieProperty%%(9, 4) = 0
                        ELSE
                            BaddieProperty%%(9, 4) = 3
                        END IF
                    ELSE
                        BaddieProperty%%(9, 4) = 0
                    END IF
                END IF
                FOR N%% = 3 TO 10
                    IF BaddieProperty%%(N%%, 4) <> 0 AND (NOT IsDead%% OR N%% >= 5) THEN
                        BaddieProperty%%(N%%, 0) = BaddieProperty%%(N%%, 0) + 1
                        IF BaddieProperty%%(N%%, 0) = BaddieProperty%%(N%%, 1) THEN
                            BaddieProperty%%(N%%, 0) = 0
                            RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = 0
                            BaddieProperty%%(N%%, 2) = BaddieProperty%%(N%%, 2) + Directions%%(0, BaddieProperty%%(N%%, 4))
                            BaddieProperty%%(N%%, 3) = BaddieProperty%%(N%%, 3) + Directions%%(1, BaddieProperty%%(N%%, 4))
                            RoomData%%(RoomNo%%, BaddieProperty%%(N%%, 2) + 2, BaddieProperty%%(N%%, 3) + 2) = N%% + 10
                            IF N%% = 10 THEN
                                K%% = 1
                                WHILE NOT ResetRound%% AND K%% <= 7
                                    IF BaddieProperty%%(10, 2) = NosPosn%%(K%%, 0) AND BaddieProperty%%(10, 3) = NosPosn%%(K%%, 1) THEN
                                        IF K%% = Rounders%% THEN
                                            'You are allowed to pass the same number more than once
                                        ELSEIF K%% = Rounders%% + 1 AND NOT NosPosn%%(K%%, 2) THEN
                                            'You pass the next in order
                                            Rounders%% = Rounders%% + 1
                                            NosPosn%%(K%%, 2) = True
                                        ELSE
                                            ResetRound%% = True
                                        END IF
                                    END IF
                                    K%% = K%% + 1
                                WEND
                                IF ResetRound%% THEN
                                    _SNDPLAYFILE "Round.mp3", , 1
                                    FOR K%% = 1 TO 7
                                        NosPosn%%(K%%, 2) = False
                                    NEXT K%%
                                    Rounders%% = 0
                                    ResetRound%% = False
                                END IF
                            END IF
                        END IF
                    ELSE
                        BaddieProperty%%(N%%, 0) = 0
                    END IF
                    IF BaddieProperty%%(N%%, 2) = XPos%% AND BaddieProperty%%(N%%, 3) = YPos%% AND N%% < 5 THEN IsDead%% = True
                    _PUTIMAGE (BlockSize%% * BaddieProperty%%(N%%, 2), BlockSize%% * BaddieProperty%%(N%%, 3)), BaddieImg&(N%%)
                NEXT N%%
        END SELECT
        K$ = INKEY$ 'Check for keypresses
        IF HasTouched%% THEN 'Limit arrow key press frequency
            KWaits%% = KWaits%% + 1
            IF KWaits%% = TouchLim%% THEN
                KWaits%% = 0
                HasTouched%% = False
            END IF
        END IF
        IF K$ <> "" THEN
            SELECT CASE fkey%%(K$)
                CASE 14, 17, 19, 22
                    IF HasTouched%% THEN
                        WHILE INKEY$ <> "": WEND 'Use up key presses
                    ELSE
                        HasTouched%% = True
                        IF NOT IsDead%% AND NOT ThatsAllFolks%% THEN
                            SELECT CASE fkey%%(K$)
                                CASE 14 'Up
                                    HighJump%% = False
                                    Occ%% = RoomData%%(RoomNo%%, XPos%% + 2, YPos%% - 1 + 2)
                                    IF Occ%% >= 15 THEN
                                        'Don't move onto baddie 5-10
                                    ELSEIF Occ%% = 0 OR Occ%% >= 10 THEN
                                        'OK to move
                                        YPos%% = YPos%% - 1
                                    ELSEIF Occ%% = 8 THEN
                                        'For shifting crates
                                        IF YPos%% >= 5 AND RoomData%%(RoomNo%%, XPos%% + 2, YPos%% - 2 + 2) = 0 THEN
                                            _SNDPLAYFILE "Crate.mp3", , 1
                                            RoomData%%(RoomNo%%, XPos%% + 2, YPos%% - 2 + 2) = 8
                                            RoomData%%(RoomNo%%, XPos%% + 2, YPos%% - 1 + 2) = 0
                                            YPos%% = YPos%% - 1
                                        END IF
                                    ELSEIF Occ%% = 9 THEN
                                        'For Tut decode
                                        IF Unlocked%% THEN
                                            IF XPos%% = 6 OR XPos%% = 17 THEN
                                                IF NOT TutBoolean%%(XPos%%, YPos%% - 1) AND GotKey%% THEN
                                                    GotKey%% = False
                                                    TutBoolean%%(XPos%%, YPos%% - 1) = True
                                                ELSEIF TutBoolean%%(XPos%%, YPos%% - 1) AND NOT GotKey%% THEN
                                                    FOR N%% = 14 TO 15
                                                        TutBoolean%%(N%%, 11) = False
                                                    NEXT N%%
                                                    GotKey%% = True
                                                    TutBoolean%%(XPos%%, YPos%% - 1) = False
                                                END IF
                                            ELSEIF GotKey%% THEN
                                                GotKey%% = False
                                                FOR N%% = 6 TO 17 STEP 11
                                                    FOR M%% = 3 TO 11 STEP 8
                                                        TutBoolean%%(N%%, M%%) = True
                                                    NEXT M%%
                                                NEXT N%%
                                                IF XPos%% = 16 OR XPos%% <= 13 THEN 'Prevent access to "TU"
                                                    IF TutBoolean%%(XPos%%, YPos%% - 1) THEN
                                                        TutBoolean%%(XPos%%, YPos%% - 1) = False
                                                        TutTot%% = TutTot%% - 1
                                                    ELSEIF TutTot%% < 17 THEN
                                                        TutBoolean%%(XPos%%, YPos%% - 1) = True
                                                        TutTot%% = TutTot%% + 1
                                                    END IF
                                                END IF
                                            END IF
                                        END IF
                                    END IF
                                CASE 17 'Left
                                    HighJump%% = False
                                    Occ%% = RoomData%%(RoomNo%%, XPos%% - 1 + 2, YPos%% + 2)
                                    IF Occ%% >= 15 THEN
                                        'Don't move onto baddie 5-10
                                    ELSEIF Occ%% = 0 OR Occ%% >= 10 THEN
                                        XPos%% = XPos%% - 1
                                    ELSEIF Occ%% = 8 THEN
                                        IF XPos%% >= 5 AND RoomData%%(RoomNo%%, XPos%% - 2 + 2, YPos%% + 2) = 0 THEN
                                            _SNDPLAYFILE "Crate.mp3", , 1
                                            RoomData%%(RoomNo%%, XPos%% - 2 + 2, YPos%% + 2) = 8
                                            RoomData%%(RoomNo%%, XPos%% - 1 + 2, YPos%% + 2) = 0
                                            XPos%% = XPos%% - 1
                                        END IF
                                    ELSEIF Occ%% = 9 THEN
                                        IF Unlocked%% THEN
                                            IF YPos%% = 3 OR YPos%% = 11 THEN
                                                IF NOT TutBoolean%%(XPos%% - 1, YPos%%) AND GotKey%% THEN
                                                    GotKey%% = False
                                                    TutBoolean%%(XPos%% - 1, YPos%%) = True
                                                ELSEIF TutBoolean%%(XPos%% - 1, YPos%%) AND NOT GotKey%% THEN
                                                    FOR N%% = 14 TO 15
                                                        TutBoolean%%(N%%, 11) = False
                                                    NEXT N%%
                                                    GotKey%% = True
                                                    TutBoolean%%(XPos%% - 1, YPos%%) = False
                                                END IF
                                            ELSEIF GotKey%% THEN
                                                GotKey%% = False
                                                FOR N%% = 6 TO 17 STEP 11
                                                    FOR M%% = 3 TO 11 STEP 8
                                                        TutBoolean%%(N%%, M%%) = True
                                                    NEXT M%%
                                                NEXT N%%
                                                IF TutBoolean%%(XPos%% - 1, YPos%%) THEN
                                                    TutBoolean%%(XPos%% - 1, YPos%%) = False
                                                    TutTot%% = TutTot%% - 1
                                                ELSEIF TutTot%% < 17 THEN
                                                    TutBoolean%%(XPos%% - 1, YPos%%) = True
                                                    TutTot%% = TutTot%% + 1
                                                END IF
                                            END IF
                                        END IF
                                    END IF
                                CASE 22 'Down
                                    Occ%% = RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 1 + 2)
                                    IF Occ%% >= 15 THEN
                                        'Don't move onto baddie 5-10
                                    ELSEIF Occ%% = 0 OR Occ%% >= 10 OR HighJump%% THEN
                                        YPos%% = YPos%% + 1
                                        IF HighJump%% THEN
                                            IF CanJump%% AND ReactJump%% <= Reactions%% THEN
                                                CanJump%% = False
                                                JumpCount% = 0
                                                NextJump% = TouchLim%% + 36 + CINT(100 * (11 - YPos%%) / 11)
                                                IF YPos%% = 11 THEN
                                                    HighJump%% = False
                                                    RoomData%%(RoomNo%%, 22, 13) = 0
                                                END IF
                                            ELSEIF JumpCount% <= NextJump% THEN
                                                'Cancel jumping
                                                HighJump%% = False
                                            END IF
                                        END IF
                                    ELSEIF Occ%% = 8 THEN
                                        IF YPos%% <= 12 AND RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2 + 2) = 0 THEN
                                            _SNDPLAYFILE "Crate.mp3", , 1
                                            RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2 + 2) = 8
                                            RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 1 + 2) = 0
                                            YPos%% = YPos%% + 1
                                        END IF
                                    ELSEIF Occ%% = 9 THEN
                                        IF Unlocked%% THEN
                                            IF XPos%% = 6 OR XPos%% = 17 THEN
                                                IF NOT TutBoolean%%(XPos%%, YPos%% + 1) AND GotKey%% THEN
                                                    GotKey%% = False
                                                    TutBoolean%%(XPos%%, YPos%% + 1) = True
                                                ELSEIF TutBoolean%%(XPos%%, YPos%% + 1) AND NOT GotKey%% THEN
                                                    FOR N%% = 14 TO 15
                                                        TutBoolean%%(N%%, 11) = False
                                                    NEXT N%%
                                                    GotKey%% = True
                                                    TutBoolean%%(XPos%%, YPos%% + 1) = False
                                                END IF
                                            ELSEIF GotKey%% THEN
                                                GotKey%% = False
                                                FOR N%% = 6 TO 17 STEP 11
                                                    FOR M%% = 3 TO 11 STEP 8
                                                        TutBoolean%%(N%%, M%%) = True
                                                    NEXT M%%
                                                NEXT N%%
                                                IF TutBoolean%%(XPos%%, YPos%% + 1) THEN
                                                    TutBoolean%%(XPos%%, YPos%% + 1) = False
                                                    TutTot%% = TutTot%% - 1
                                                ELSEIF TutTot%% < 17 THEN
                                                    TutBoolean%%(XPos%%, YPos%% + 1) = True
                                                    TutTot%% = TutTot%% + 1
                                                END IF
                                            END IF
                                        END IF
                                    END IF
                                CASE 19 'Right
                                    HighJump%% = False
                                    Occ%% = RoomData%%(RoomNo%%, XPos%% + 1 + 2, YPos%% + 2)
                                    IF Occ%% >= 15 THEN
                                        'Don't move onto baddie 5-10
                                    ELSEIF Occ%% = 0 THEN
                                        IF NOT FirstMove%% AND RoomNo%% = 1 THEN
                                            FirstMove%% = True
                                            BaddieProperty%%(1, 4) = 2
                                        END IF
                                        XPos%% = XPos%% + 1
                                    ELSEIF Occ%% >= 10 THEN
                                        XPos%% = XPos%% + 1
                                    ELSEIF Occ%% = 8 THEN
                                        IF XPos%% <= 8 AND RoomData%%(RoomNo%%, XPos%% + 2 + 2, YPos%% + 2) = 0 THEN
                                            _SNDPLAYFILE "Crate.mp3", , 1
                                            RoomData%%(RoomNo%%, XPos%% + 2 + 2, YPos%% + 2) = 8
                                            RoomData%%(RoomNo%%, XPos%% + 1 + 2, YPos%% + 2) = 0
                                            XPos%% = XPos%% + 1
                                        END IF
                                    ELSEIF Occ%% = 9 THEN
                                        IF Unlocked%% THEN
                                            IF YPos%% = 3 OR YPos%% = 11 THEN
                                                IF NOT TutBoolean%%(XPos%% + 1, YPos%%) AND GotKey%% THEN
                                                    GotKey%% = False
                                                    TutBoolean%%(XPos%% + 1, YPos%%) = True
                                                ELSEIF TutBoolean%%(XPos%% + 1, YPos%%) AND NOT GotKey%% THEN
                                                    FOR N%% = 14 TO 15
                                                        TutBoolean%%(N%%, 11) = False
                                                    NEXT N%%
                                                    GotKey%% = True
                                                    TutBoolean%%(XPos%% + 1, YPos%%) = False
                                                END IF
                                            ELSEIF GotKey%% THEN
                                                GotKey%% = False
                                                FOR N%% = 6 TO 17 STEP 11
                                                    FOR M%% = 3 TO 11 STEP 8
                                                        TutBoolean%%(N%%, M%%) = True
                                                    NEXT M%%
                                                NEXT N%%
                                                IF TutBoolean%%(XPos%% + 1, YPos%%) THEN
                                                    TutBoolean%%(XPos%% + 1, YPos%%) = False
                                                    TutTot%% = TutTot%% - 1
                                                ELSEIF TutTot%% < 17 THEN
                                                    TutBoolean%%(XPos%% + 1, YPos%%) = True
                                                    TutTot%% = TutTot%% + 1
                                                END IF
                                            END IF
                                        END IF
                                    END IF
                            END SELECT
                            IF RoomNo%% = 1 AND RoomData%%(RoomNo%%, 22, 7) = 0 AND RoomData%%(RoomNo%%, 22, 13) <> 0 AND XPos%% = 20 AND YPos%% = 1 THEN
                                HighJump%% = True
                                JumpCount% = 0
                                ReactJump%% = 0
                                CanJump%% = False
                                REDIM EnnisHill%%(12)
                                EnnisHill%%(YPos%%) = True
                                NextJump% = TouchLim%% + 36 + CINT(100 * (11 - YPos%%) / 11)
                            END IF
                        END IF
                    END IF
                CASE 10
                    IF NOT IsDead%% AND NOT ThatsAllFolks%% THEN
                        ChangeRoom%% = True
                        RoomNo%% = 1
                    END IF
                CASE ELSE
                    SELECT CASE ASC(K$)
                        CASE 27 'Esc
                            ThatsAllFolks%% = True
                        CASE ELSE
                            IF IsDead%% THEN
                                'Dead yes/no
                                IF UCASE$(K$) = "Y" THEN
                                    ChangeRoom%% = True
                                ELSE
                                    BeAmazed%% = False
                                END IF
                            ELSEIF ThatsAllFolks%% THEN
                                'Escape yes/no
                                IF UCASE$(K$) = "Y" THEN
                                    BeAmazed%% = False
                                ELSE
                                    ChangeRoom%% = True
                                    ThatsAllFolks%% = False
                                END IF
                            END IF
                    END SELECT
            END SELECT
            K$ = ""
        END IF
        IF HighJump%% THEN
            IF CanJump%% THEN
                ReactJump%% = ReactJump%% + 1
                IF ReactJump%% > Reactions%% THEN HighJump%% = False
            ELSE
                JumpCount% = JumpCount% + 1
                IF JumpCount% = NextJump% THEN
                    EnnisHill%%(YPos%% + 1) = True
                    JumpCount% = 0
                    ReactJump%% = 0
                    CanJump%% = True
                END IF
            END IF
        END IF
        'Display Smiler
        _PUTIMAGE (BlockSize%% * XPos%%, BlockSize%% * YPos%%), Smiler&
        IF GotKey%% THEN _PUTIMAGE (BlockSize%% * XPos%% + 5, BlockSize%% * YPos%% + 5)-(BlockSize%% * (XPos%% + 1) - 5, BlockSize%% * (YPos%% + 1) - 5), KeyImg&
        'Determine Smiler Behaviour
        IF NOT IsDead%% AND NOT ThatsAllFolks%% THEN
            SELECT CASE (RoomNo%%)
                CASE 1, 5
                    IF RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2) >= 10 THEN 'Bump into monster
                        IF RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2) <> 11 THEN
                            'Dead (Doesn't move Smiler)
                            IsDead%% = True
                        ELSEIF HeartCount%% <= 2 THEN
                            'Dead
                            IsDead%% = True
                        END IF
                    END IF
                    IF NOT IsDead%% THEN
                        SELECT CASE (RoomNo%%)
                            CASE 1
                                IF XPos%% = XGrid%% - 1 AND YPos%% = YGrid%% - 2 AND GotKey%% THEN
                                    DoAnimation%% = True
                                    ImgFree%% = True
                                ELSE
                                    IF NOT Seeker0%% AND XPos%% = XGrid%% - 3 AND YPos%% = 1 THEN
                                        Seeker0%% = True
                                        _SNDPLAYFILE "Button.mp3", , 1
                                    END IF
                                    IF XPos%% = 22 AND YPos%% = 3 AND HeartCount%% = 5 AND NOT GotKey%% THEN
                                        GotKey%% = True
                                        _SNDPLAYFILE "Key.mp3", , 1
                                    END IF
                                    FOR N%% = 0 TO 4 'Adjust heart count apropriately
                                        IF XPos%% = HeartsPosn1%%(N%%, 1) AND YPos%% = HeartsPosn1%%(N%%, 2) AND HeartsPosn1%%(N%%, 0) THEN
                                            _SNDPLAYFILE "Hearts.mp3", , 1 'Some sounds do not play in PE???
                                            HeartCount%% = HeartCount%% + 1
                                            HeartsPosn1%%(N%%, 0) = False
                                            SELECT CASE HeartCount%%
                                                CASE 3
                                                    _FREEIMAGE BaddieImg&(1)
                                                    BaddieImg&(1) = ToHardware&("Grim-Reaper-Love1.png", BlockSize%%, BlockSize%%)
                                                CASE 2
                                                    RoomData%%(RoomNo%%, 15, 5) = 0
                                                CASE 1
                                                    RoomData%%(RoomNo%%, 22, 7) = 0
                                                CASE 4
                                                    RoomData%%(RoomNo%%, 8, 4) = 0
                                            END SELECT
                                        END IF
                                    NEXT N%%
                                END IF
                            CASE ELSE
                                IF XPos%% = 0 AND YPos%% = 3 AND Leave5%% THEN
                                    IsComplete%% = True 'For final exit
                                ELSE
                                    GoLevel%% = False
                                    N%% = 1
                                    WHILE NOT GoLevel%% AND N%% <= 6 'Get correct order of stop-go
                                        IF XPos%% = StopGo%%(N%%, 0) AND YPos%% = StopGo%%(N%%, 1) AND NOT StopGo%%(N%%, 2) THEN
                                            StopLevel%% = N%%
                                            GoLevel%% = True
                                            IF StopLevel%% = Sstops%% + 1 THEN
                                                Sstops%% = Sstops%% + 1
                                                StopGo%%(N%%, 2) = True
                                                _SNDPLAYFILE "Button.mp3", , 1
                                            ELSE
                                                Sstops%% = 0
                                                FOR M%% = 1 TO 6
                                                    StopGo%%(M%%, 2) = False
                                                NEXT M%%
                                            END IF
                                        END IF
                                        N%% = N%% + 1
                                    WEND
                                    IF Sstops%% = 6 AND NOT Leave5%% THEN
                                        _SNDPLAYFILE "Fence.mp3", , 1
                                        RoomData%%(RoomNo%%, 3, 5) = 0
                                        Leave5%% = True
                                    END IF
                                END IF
                        END SELECT
                    END IF
                CASE 2
                    IF Leave2%% AND NOT GotKey%% AND XPos%% = XGrid%% - 4 AND YPos%% = YGrid%% - 1 THEN
                        DoAnimation%% = True
                        ImgFree%% = True
                    ELSE
                        IF XPos%% = XGrid%% - 2 AND YPos%% = YGrid%% - 2 AND NOT Unlocked%% THEN
                            IF FirstUnlock%% THEN
                                _SNDPLAYFILE "Unlock.mp3", , 1
                                FirstUnlock%% = False
                            END IF
                            Unlocked%% = True
                            GotKey%% = False
                            FOR N%% = 6 TO 17 STEP 11
                                FOR M%% = 3 TO 11 STEP 8
                                    TutBoolean%%(N%%, M%%) = True
                                NEXT M%%
                            NEXT N%%
                        END IF
                        IF NOT Leave2%% THEN
                            'Check for Tut Decode
                            Leave2%% = True
                            N%% = 0
                            WHILE Leave2%% AND N%% <= 16
                                IF NOT TutBoolean%%(TutCode%%(N%%, 0), TutCode%%(N%%, 1)) THEN Leave2%% = False
                                N%% = N%% + 1
                            WEND
                            IF Leave2%% THEN
                                RoomData%%(RoomNo%%, XGrid%% - 1, YGrid%%) = 0
                                _SNDPLAYFILE "Fence.mp3", , 1
                            END IF
                        END IF
                    END IF
                CASE 3
                    IF XPos%% = 0 AND YPos%% = 4 AND Leave3%% THEN
                        DoAnimation%% = True
                        ImgFree%% = True
                    ELSE
                        FOR K%% = 1 TO 3
                            IF Collie%%(K%%, 1) - 1 = XPos%% AND Collie%%(K%%, 2) - 1 = YPos%% THEN
                                IF NOT Collie%%(K%%, 0) THEN
                                    NotColl%% = True
                                    K1%% = 1
                                    WHILE NotColl%% AND K1%% <= 3
                                        IF K1%% <> K%% THEN
                                            IF Collie%%(K1%%, 0) AND NOT Collie%%(K1%% + 3, 0) THEN NotColl%% = False
                                        END IF
                                        K1%% = K1%% + 1
                                    WEND
                                    IF NotColl%% THEN Collie%%(K%%, 0) = True
                                END IF
                            END IF
                            IF Collie%%(K%%, 0) AND NOT Collie%%(K%% + 3, 0) THEN _PUTIMAGE (BlockSize%% * XPos%% + 10, BlockSize%% * YPos%% + 10)-(BlockSize%% * (XPos%% + 1) - 11, BlockSize%% * (YPos%% + 1) - 11), Room3Img&(K%%, 0) 'Display Smiler carrying item
                        NEXT K%%
                        IF Collie%%(4, 0) AND Collie%%(5, 0) AND Collie%%(6, 0) THEN
                            Leave3%% = True
                        ELSE
                            FOR K%% = 4 TO 6
                                IF Collie%%(K%%, 1) - 1 = XPos%% AND Collie%%(K%%, 2) - 1 = YPos%% THEN
                                    IF Collie%%(K%% - 3, 0) THEN Collie%%(K%%, 0) = True
                                END IF
                            NEXT K%%
                        END IF
                    END IF
                CASE 4
                    IF XPos%% = MidExit%% AND YPos%% = 0 THEN
                        DoAnimation%% = True
                        ImgFree%% = True
                    ELSE
                        IF RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2) >= 13 THEN 'Bump into monster
                            IF RoomData%%(RoomNo%%, XPos%% + 2, YPos%% + 2) <= 14 THEN IsDead%% = True 'Dead
                        END IF
                        IF NOT IsDead%% THEN
                            FOR N%% = 0 TO 4 'Hearts
                                IF XPos%% = HeartsPosn4%%(N%%, 1) AND YPos%% = HeartsPosn4%%(N%%, 2) AND HeartsPosn4%%(N%%, 0) THEN
                                    _SNDPLAYFILE "Hearts.mp3", , 1
                                    CountHearts%% = CountHearts%% + 1
                                    HeartsPosn4%%(N%%, 0) = False
                                END IF
                            NEXT N%%
                            IF XPos%% <= XGrid%% - 6 AND YPos%% >= 7 THEN
                                SeekEnd%% = False
                            ELSE
                                SeekEnd%% = True
                            END IF
                            IF XPos%% = 13 AND YPos%% = 5 AND NOT Marbles%% THEN
                                Marbles%% = True
                                _SNDPLAYFILE "Button.mp3", , 1
                            END IF
                            IF Rounders%% = 7 AND CountHearts%% = 5 AND NOT Leave4%% THEN
                                _SNDPLAYFILE "Fence.mp3", , 1
                                Leave4%% = True
                                RoomData%%(RoomNo%%, 4, YGrid%% - 1) = 0
                            END IF
                        END IF
                    END IF
            END SELECT
        END IF
    END IF
    IF IsDead%% THEN
        'Dead
        _PUTIMAGE (350, 250), Valhalla&
        IF FirstDead%% THEN
            _SNDPLAYFILE "Grunt.mp3", , 1
            FirstDead%% = False
        END IF
    ELSEIF IsComplete%% THEN
        _PUTIMAGE (350, 250), AllDone&
        DoneCount% = DoneCount% + 1
        IF DoneCount% = 480 THEN BeAmazed%% = False
    ELSEIF ThatsAllFolks%% THEN
        _PUTIMAGE (350, 250), DoEscape&
    END IF
    _DISPLAY
WEND

_FREEIMAGE Background&(RoomNo%%)
_FREEIMAGE DoEscape&
_FREEIMAGE AllDone&
_FREEIMAGE Valhalla&
_FREEIMAGE Exit1Img&
_FREEIMAGE Exit2Img&
_FREEIMAGE Exit3Img&
_FREEIMAGE Exit4Img&
_FREEIMAGE Fence&
_FREEIMAGE Brick&
_FREEIMAGE Smiler&

SELECT CASE RoomNo%%
    CASE 1
        _FREEIMAGE BaddieImg&(0)
        _FREEIMAGE BaddieImg&(1)
        _FREEIMAGE BaddieImg&(2)
        _FREEIMAGE StopGo&
        _FREEIMAGE GoStop&
        _FREEIMAGE HeartImg&
        _FREEIMAGE KeyImg&
        _FREEIMAGE BlueButton&
        _FREEIMAGE RunStart&
        _FREEIMAGE LowFence&
    CASE 2
        _FREEIMAGE KeyImg&
        _FREEIMAGE TutTomb&
        _FREEIMAGE KingTut&
        _FREEIMAGE KeyholeImg&
        _FREEIMAGE LetterKey&
        _FREEIMAGE LetterBlank&
        FOR N%% = 7 TO 16
            _FREEIMAGE Alphabet&(1, N%%, 3)
            _FREEIMAGE Alphabet&(2, N%%, 3)
            _FREEIMAGE Alphabet&(1, N%%, 11)
            _FREEIMAGE Alphabet&(2, N%%, 11)
        NEXT N%%
        FOR N%% = 4 TO 10
            _FREEIMAGE Alphabet&(1, 6, N%%)
            _FREEIMAGE Alphabet&(2, 6, N%%)
            _FREEIMAGE Alphabet&(1, 17, N%%)
            _FREEIMAGE Alphabet&(2, 17, N%%)
        NEXT N%%
    CASE 3
        FOR N%% = 1 TO 2
            FOR M%% = 0 TO 2
                _FREEIMAGE Room3Img&(N%%, M%%)
            NEXT M%%
        NEXT N%%
    CASE 4
        _FREEIMAGE HeartImg&
        _FREEIMAGE CrateImg&
        _FREEIMAGE BlueButton&
        FOR N%% = 1 TO 7
            _FREEIMAGE NumbersImg&(N%%)
        NEXT N%%
        FOR N%% = 3 TO 10
            _FREEIMAGE BaddieImg&(N%%)
        NEXT N%%
    CASE 5
        _FREEIMAGE BaddieImg&(1)
        _FREEIMAGE BaddieImg&(0)
        _FREEIMAGE BaddieImg&(2)
        _FREEIMAGE StopGo&
        _FREEIMAGE GoStop&
        _FREEIMAGE HeartImg&
        _FREEIMAGE KeyImg&
        _FREEIMAGE BlueButton&
        _FREEIMAGE RunStart&
END SELECT

IF IsComplete%% THEN RoomNo%% = 1
OPEN "RoomNo.dat" FOR OUTPUT AS #1
PRINT #1, RoomNo%%
CLOSE #1
SYSTEM

FUNCTION fkey%% (Key$)
    IF ASC(Key$) <> 0 THEN
        fkey%% = 0
    ELSE
        fkey%% = ASC(RIGHT$(Key$, 1)) - 58
    END IF
END FUNCTION

FUNCTION MakeHardware& (TempImg&)
    MakeHardware& = _COPYIMAGE(TempImg&, 33)
    _FREEIMAGE TempImg&
END FUNCTION

FUNCTION ToHardware& (ImgName$, X1%, Y1%)
    TempImg& = _NEWIMAGE(X1%, Y1%, 32)
    Temp2mg& = _LOADIMAGE(ImgName$, 32)
    _PUTIMAGE (0, 0)-(X1% - 1, Y1% - 1), Temp2mg&, TempImg&
    ToHardware& = _COPYIMAGE(TempImg&, 33)
    _FREEIMAGE Temp2mg&
    _FREEIMAGE TempImg&
END FUNCTION

FUNCTION ToEgyptian& (ImgName$, X1%, Y1%)
    TempImg& = _NEWIMAGE(X1%, Y1%, 32)
    Temp2mg& = _LOADIMAGE(ImgName$, 32)
    _PUTIMAGE (3, 3)-(X1% - 4, Y1% - 4), Temp2mg&, TempImg&
    ToEgyptian& = _COPYIMAGE(TempImg&, 33)
    _FREEIMAGE Temp2mg&
    _FREEIMAGE TempImg&
END FUNCTION

SUB CreatMaze (Maze%%(), Portals%%(), WhichPlaces%%())
    'Creates maze from David H. Ahl, via eoredson.
    'Magdha does not understand a word of this routine
    GoodMaze%% = False
    WHILE NOT GoodMaze%%
        'Declares variable storage for maze
        REDIM LevelData%(1 TO 2 * YMaze%% + 2, 1 TO 3 * XMaze%% + 2)
        REDIM Maze1%(XMaze%%, YMaze%%), Maze2%(XMaze%%, YMaze%%)
        RANDOMIZE (TIMER) 'Seed random number generator
        Q% = 0
        Z2% = 1
        X2% = INT(RND * XMaze%% + 1)
        C2% = 1
        Maze2%(X2%, 1) = C2%
        C2% = C2% + 1
        R2% = X2%
        S2% = 1
        'The following source code makes a maze in Maze1%, and Maze2%..
        GOTO 2540
        2440 IF R2% <> XMaze%% THEN 2520
        IF S2% <> YMaze%% THEN 2490
        R2% = 1
        S2% = 1
        GOTO 2530
        2490 R2% = 1
        S2% = S2% + 1
        GOTO 2530
        2520 R2% = R2% + 1
        2530 IF Maze2%(R2%, S2%) = 0 THEN 2440
        2540 IF R2% - 1 = 0 THEN 2830
        IF Maze2%(R2% - 1, S2%) THEN 2830
        IF S2% - 1 = 0 THEN 2680
        IF Maze2%(R2%, S2% - 1) THEN 2680
        IF R2% = XMaze%% THEN 2610
        IF Maze2%(R2% + 1, S2%) THEN 2610
        X2% = INT(RND * 3 + 1): ON X2% GOTO 3140, 3210, 3280
        2610 IF S2% <> YMaze%% THEN 2650
        IF Z2% = 1 THEN 2670
        Q% = 1
        GOTO 2660
        2650 IF Maze2%(R2%, S2% + 1) THEN 2670
        2660 X2% = INT(RND * 3 + 1): ON X2% GOTO 3140, 3210, 3370
        2670 X2% = INT(RND * 2 + 1): ON X2% GOTO 3140, 3210
        2680 IF R2% = XMaze%% THEN 2770
        IF Maze2%(R2% + 1, S2%) THEN 2770
        IF S2% <> YMaze%% THEN 2740
        IF Z2% = 1 THEN 2760
        Q% = 1
        GOTO 2750
        2740 IF Maze2%(R2%, S2% + 1) THEN 2760
        2750 X2% = INT(RND * 3 + 1): ON X2% GOTO 3140, 3280, 3370
        2760 X2% = INT(RND * 2 + 1): ON X2% GOTO 3140, 3280
        2770 IF S2% <> YMaze%% THEN 2810
        IF Z2% = 1 THEN 3140
        Q% = 1
        GOTO 2820
        2810 IF Maze2%(R2%, S2% + 1) THEN 3140
        2820 X2% = INT(RND * 2 + 1): ON X2% GOTO 3140, 3370
        2830 IF S2% - 1 = 0 THEN 3000
        IF Maze2%(R2%, S2% - 1) THEN 3000
        IF R2% = XMaze%% THEN 2940
        IF Maze2%(R2% + 1, S2%) THEN 2940
        IF S2% <> YMaze%% THEN 2910
        IF Z2% = 1 THEN 2930
        Q% = 1
        GOTO 2920
        2910 IF Maze2%(R2%, S2% + 1) THEN 2930
        2920 X2% = INT(RND * 3 + 1): ON X2% GOTO 3210, 3280, 3370
        2930 X2% = INT(RND * 2 + 1): ON X2% GOTO 3210, 3280
        2940 IF S2% <> YMaze%% THEN 2980
        IF Z2% = 1 THEN 3210
        Q% = 1
        GOTO 2990
        2980 IF Maze2%(R2%, S2% + 1) THEN 3210
        2990 X2% = INT(RND * 2 + 1): ON X2% GOTO 3210, 3370
        3000 IF R2% = XMaze%% THEN 3080
        IF Maze2%(R2% + 1, S2%) THEN 3080
        IF S2% <> YMaze%% THEN 3060
        IF Z2% = 1 THEN 3280
        Q% = 1
        GOTO 3220
        3060 IF Maze2%(R2%, S2% + 1) THEN 3280
        X2% = INT(RND * 2 + 1): ON X2% GOTO 3280, 3370
        3080 IF S2% <> YMaze%% THEN 3120
        IF Z2% = 1 THEN 2440
        Q% = 1
        GOTO 3370
        3120 IF Maze2%(R2%, S2% + 1) THEN 2440
        GOTO 3370
        3140 Maze2%(R2% - 1, S2%) = C2%
        C2% = C2% + 1
        Maze1%(R2% - 1, S2%) = 2
        R2% = R2% - 1
        IF C2% > XMaze%% * YMaze%% THEN 3570
        Q% = 0
        GOTO 2540
        3210 Maze2%(R2%, S2% - 1) = C2%
        3220 C2% = C2% + 1
        Maze1%(R2%, S2% - 1) = 1
        S2% = S2% - 1
        IF C2% > XMaze%% * YMaze%% THEN 3570
        Q% = 0
        GOTO 2540
        3280 Maze2%(R2% + 1, S2%) = C2%
        C2% = C2% + 1
        IF Maze1%(R2%, S2%) = 0 THEN 3330
        Maze1%(R2%, S2%) = 3
        GOTO 3340
        3330 Maze1%(R2%, S2%) = 2
        3340 R2% = R2% + 1
        IF C2% > XMaze%% * YMaze%% THEN 3570
        GOTO 2830
        3370 IF Q% = 1 THEN 3470
        Maze2%(R2%, S2% + 1) = C2%
        C2% = C2% + 1
        IF Maze1%(R2%, S2%) = 0 THEN 3430
        Maze1%(R2%, S2%) = 3
        GOTO 3440
        3430 Maze1%(R2%, S2%) = 1
        3440 S2% = S2% + 1
        IF C2% > XMaze%% * YMaze%% THEN 3570
        GOTO 2540
        3470 Z2% = 1
        IF Maze1%(R2%, S2%) = 0 THEN 3520
        Maze1%(R2%, S2%) = 3
        Q% = 0
        GOTO 2440
        3520 Maze1%(R2%, S2%) = 1
        Q% = 0
        R2% = 1
        S2% = 1
        GOTO 2530
        3570
        FOR I%% = 1 TO 2 * YMaze%% + 2 'Clear maze array
            FOR J%% = 1 TO 3 * XMaze%% + 2
                LevelData%(I%%, J%%) = 46 'With dots
            NEXT J%%
        NEXT I%%
        FOR I%% = 1 TO XMaze%% 'Convert array to maze
            FOR J%% = 1 TO YMaze%%
                SELECT CASE Maze1%(I%%, J%%)
                    CASE 0
                        LevelData%(J%% * 2, I%% * 3 + 1) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3 - 2) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3 - 1) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3) = 176
                    CASE 1
                        LevelData%(J%% * 2, I%% * 3 + 1) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3 - 2) = 176
                    CASE 2
                        LevelData%(J%% * 2 + 1, I%% * 3 - 2) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3 - 1) = 176
                        LevelData%(J%% * 2 + 1, I%% * 3) = 176
                    CASE 3
                        LevelData%(J%% * 2 + 1, I%% * 3 - 2) = 176
                END SELECT
            NEXT J%%
        NEXT I%%
        FOR I%% = 1 TO 3 * XMaze%% + 2 'Border
            LevelData%(1, I%%) = 176
            LevelData%(2 * YMaze%% + 1, I%%) = 176
        NEXT I%%
        FOR I%% = 1 TO 2 * YMaze%% + 2 'Border
            LevelData%(I%%, 1) = 176
            LevelData%(I%%, 3 * XMaze%% + 1) = 176
        NEXT
        'Remove 'double-wdth' track and create maze for game
        REDIM Maze%%(2 * YMaze%% + 1, 2 * XMaze%% + 1)
        FOR I%% = 1 TO 2 * YMaze%% + 1 'Rows by
            K%% = 0
            FOR J%% = 1 TO 3 * XMaze%% + 1 'Columns
                IF (J%% + 1) MOD 3 <> 0 THEN
                    K%% = K%% + 1
                    IF LevelData%(I%%, J%%) <> 46 THEN
                        Maze%%(I%%, K%%) = True
                    ELSE
                    END IF
                END IF
            NEXT
        NEXT I%%
        'Check Maze Compatibility
        Maze%%(Portals%%(0, 1), Portals%%(0, 0)) = False
        Maze%%(Portals%%(1, 1), Portals%%(1, 0)) = False
        GoodMaze%% = True 'Check for proper maze connectivity
        NoSealed%% = 0
        I%% = 2: J%% = 2 '  I%% Y (vert): J%% X (horiz)
        WHILE GoodMaze%% AND I%% <= 2 * YMaze%% AND J%% <= 2 * XMaze%%
            IF Maze%%(I%%, J%%) THEN
                IF Maze%%(I%% + 1, J%%) AND Maze%%(I%%, J%% + 1) AND Maze%%(I%% + 1, J%% + 1) THEN 'Check no block 2x2 wall
                    GoodMaze%% = False
                END IF
            ELSE
                Surround%% = 0
                IF Maze%%(I%% - 1, J%%) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%%, J%% - 1) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%% + 1, J%%) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%%, J%% + 1) THEN Surround%% = Surround%% + 1
                IF Surround%% = 4 THEN 'Check that eack cell has at least one connection path
                    GoodMaze%% = False
                ELSEIF Surround%% = 3 THEN 'Check for  number of blocked exits - entry & exit added - see below
                    NoSealed%% = NoSealed%% + 1
                END IF
                IF NOT Maze%%(I%% + 1, J%%) AND NOT Maze%%(I%%, J%% + 1) AND NOT Maze%%(I%% + 1, J%% + 1) THEN 'Check no block 2x2 path
                    GoodMaze%% = False
                END IF
            END IF
            J%% = J%% + 1
            IF J%% > 2 * XMaze%% THEN
                J%% = 2
                I%% = I%% + 1
            END IF
        WEND
        IF NoSealed%% < 9 OR NoSealed%% > 13 THEN GoodMaze%% = False
        IF Maze%%(Portals%%(0, 1) + 1, Portals%%(0, 0)) THEN GoodMaze%% = False
        IF Maze%%(Portals%%(1, 1), Portals%%(1, 0) + 1) THEN GoodMaze%% = False
    WEND
    'Find Blocked Exits in Good Maze
    REDIM CuldeSac%%(NoSealed%%, 1)
    NoSeal%% = 0
    I%% = 2: J%% = 2
    FOR I%% = 2 TO 2 * YMaze%%
        FOR J%% = 2 TO 2 * XMaze%%
            'And check for  number of blocked exits
            IF NOT Maze%%(I%%, J%%) THEN
                Surround%% = 0
                IF Maze%%(I%% - 1, J%%) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%%, J%% - 1) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%% + 1, J%%) THEN Surround%% = Surround%% + 1
                IF Maze%%(I%%, J%% + 1) THEN Surround%% = Surround%% + 1
                IF Surround%% = 3 THEN 'Checking after Entry & Exit are placed
                    NoSeal%% = NoSeal%% + 1
                    CuldeSac%%(NoSeal%%, 0) = J%%
                    CuldeSac%%(NoSeal%%, 1) = I%%
                END IF
            END IF
        NEXT J%%
    NEXT I%%
    CALL Jumble(CuldeSac%%())
    FOR N%% = 1 TO 6
        WhichPlaces%%(N%%, 1) = CuldeSac%%(N%%, 0)
        WhichPlaces%%(N%%, 2) = CuldeSac%%(N%%, 1)
    NEXT N%%
END SUB

SUB Jumble (Jumbly%%())
    FOR N%% = 1 TO 10
        First%% = 1 + INT(UBOUND(Jumbly%%, 1) * RND)
        IsEqual%% = True
        WHILE IsEqual%%
            Second%% = 1 + INT(UBOUND(Jumbly%%, 1) * RND)
            IF Second%% <> First%% THEN IsEqual%% = False
        WEND
        SWAP Jumbly%%(First%%, 0), Jumbly%%(Second%%, 0)
        SWAP Jumbly%%(First%%, 1), Jumbly%%(Second%%, 1)
    NEXT N%%
END SUB
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Trackword Puzzle Solver InForm Program Magdha 17 799 01-26-2026, 09:16 PM
Last Post: bplus
  Interlocking Jigsaw Puzzle Magdha 4 439 12-04-2025, 05:22 PM
Last Post: Magdha
  Sliding Block Picture Puzzle Magdha 0 222 11-29-2025, 10:14 AM
Last Post: Magdha

Forum Jump:


Users browsing this thread: 1 Guest(s)