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.
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!
Four-Room Maze User Manual.pdf (Size: 1.25 MB / Downloads: 16)
A short excerpt of the running program.
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.
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!
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

