mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-28 07:37:47 +00:00
9ee89d6ff4
These tests use a variety of sample code (with some of the larger files removed, so they are not complete!) and verifies that they all compile successfully.
1902 lines
52 KiB
QBasic
1902 lines
52 KiB
QBasic
' ***************************************
|
|
' * *
|
|
' * CAVE RAIDER Version 1.4 *
|
|
' * =========== *
|
|
' * Copyright (c) 2004 by Paul Redling *
|
|
' * *
|
|
' ***************************************
|
|
|
|
DEFINT A-Z
|
|
|
|
DECLARE SUB TextBlink ()
|
|
DECLARE SUB Initialize ()
|
|
DECLARE SUB Story ()
|
|
DECLARE SUB Instructions ()
|
|
DECLARE SUB HallOfFame ()
|
|
DECLARE SUB Options ()
|
|
DECLARE SUB Game ()
|
|
DECLARE SUB NextCave ()
|
|
DECLARE SUB MoveCR ()
|
|
DECLARE SUB MoveLGM ()
|
|
DECLARE SUB MoveLRM ()
|
|
DECLARE SUB MoveBM ()
|
|
DECLARE SUB NewPositions ()
|
|
DECLARE SUB HitDetection ()
|
|
DECLARE SUB Explosion ()
|
|
DECLARE SUB SetTimers ()
|
|
DECLARE SUB QuickStop ()
|
|
DECLARE SUB TheEnd ()
|
|
DECLARE SUB EndScreen ()
|
|
DECLARE SUB Highscore ()
|
|
DECLARE SUB Pause ()
|
|
DECLARE SUB Grenade (direction)
|
|
DECLARE SUB Quicksand (fields)
|
|
DECLARE SUB SetSound (number)
|
|
DECLARE SUB PCSound (number)
|
|
DECLARE SUB Delay (seconds!)
|
|
DECLARE SUB Center (row, text$)
|
|
DECLARE FUNCTION MainMenu ()
|
|
DECLARE FUNCTION RandomInt (low, high)
|
|
|
|
DIM SHARED table, cr!(3), crname$(3), hscore!(3), cave!(3), hscore, nohscore
|
|
DIM SHARED cr, ds, speaker, fe, crname$, rq1, rq2, rq3, dy, dx, y, x, oldy
|
|
DIM SHARED oldx, sy, sx, fields, lgmonsters, lrmonsters, bmonsters, health
|
|
DIM SHARED score, hit, gy, gx, ftime, trigger, mcounter, explode, xcounter
|
|
DIM SHARED tlgm!, tlrm!, tbm!, ts!, tq!, te!, tb!, grenades, magic, stone
|
|
DIM SHARED treasure, pgold, gem, scroll, death, cave, newcave, dkey$
|
|
|
|
RANDOMIZE TIMER
|
|
SCREEN 13 'Fullscreen mode in Windows
|
|
SCREEN 0
|
|
WIDTH 40, 43
|
|
PALETTE 1, 56
|
|
PALETTE 9, 6
|
|
Initialize
|
|
|
|
DO
|
|
choice = MainMenu
|
|
IF choice = 1 THEN Game
|
|
IF choice = 2 THEN Story
|
|
IF choice = 3 THEN Instructions
|
|
IF choice = 4 THEN HallOfFame
|
|
IF choice = 5 THEN Options
|
|
IF choice = 6 THEN EXIT DO
|
|
LOOP
|
|
|
|
SCREEN 13
|
|
SCREEN 0
|
|
WIDTH 80, 25
|
|
COLOR 7, 0
|
|
END
|
|
|
|
FileError:
|
|
fe = 1
|
|
RESUME NEXT
|
|
|
|
SUB Center (row, text$)
|
|
|
|
LOCATE row, (40 - LEN(text$)) \ 2 + 1
|
|
PRINT text$;
|
|
|
|
END SUB
|
|
|
|
SUB Delay (seconds!)
|
|
|
|
'Delays the program or sleeps
|
|
' If seconds! > 0, then it delays the program
|
|
' If seconds! <= 0, then it sleeps
|
|
' Delay 0 = Sleep, Delay -1 = Sleep 1, Delay -1.5 = Sleep 1.5
|
|
' Unlike the SLEEP statement, the keyboard buffer is cleared after a key is
|
|
' pressed.
|
|
|
|
secs! = ABS(seconds!)
|
|
IF secs! = 0 THEN secs! = 86400
|
|
t! = TIMER
|
|
DO
|
|
IF seconds! > 0 THEN 'Delay
|
|
WHILE INKEY$ <> "": WEND 'Clear the keyboard buffer (no beeps!)
|
|
ELSE 'Sleep
|
|
dkey$ = INKEY$ 'To read a keystroke, make "dkey$" DIM
|
|
IF dkey$ <> "" THEN EXIT DO 'SHARED in the main module.
|
|
END IF
|
|
LOOP UNTIL ABS(TIMER - t!) >= secs! 'No endless loop at midnight!
|
|
|
|
END SUB
|
|
|
|
SUB EndScreen
|
|
|
|
COLOR 8, 0
|
|
FOR row = 1 TO 43: LOCATE row, 1: PRINT STRING$(40, 170); : NEXT row
|
|
FOR row = 10 TO 35: LOCATE row, 11: PRINT STRING$(20, 177): NEXT row
|
|
FOR row = 11 TO 34: LOCATE row, 12: PRINT SPACE$(18): NEXT row
|
|
|
|
PALETTE 5, 57
|
|
IF cave <> 7 THEN
|
|
COLOR 5
|
|
FOR row = 12 TO 19: LOCATE row, 13: PRINT STRING$(16, 219); : NEXT row
|
|
COLOR 0, 2
|
|
FOR row = 20 TO 21: LOCATE row, 13: PRINT STRING$(16, 177); : NEXT row
|
|
COLOR 0, 1
|
|
LOCATE 13, 18: PRINT STRING$(6, 176)
|
|
FOR row = 14 TO 20: LOCATE row, 17: PRINT STRING$(8, 176); : NEXT row
|
|
COLOR 1
|
|
FOR row = 15 TO 20: LOCATE row, 18: PRINT STRING$(6, 219); : NEXT row
|
|
COLOR 0
|
|
LOCATE 15, 19: PRINT "REST"
|
|
LOCATE 17, 20: PRINT "IN"
|
|
LOCATE 19, 19: PRINT "PEACE"
|
|
COLOR 15, 0: Center 23, "A Hero!"
|
|
COLOR 7
|
|
Center 25, "On " + DATE$ + ", "
|
|
Center 27, "at " + TIME$ + ", "
|
|
LOCATE 29, 13: PRINT crname$
|
|
LOCATE 29, 14 + LEN(RTRIM$(crname$)): PRINT "fell."
|
|
COLOR 3: Center 31, "Score:" + LTRIM$(STR$(score))
|
|
ELSE
|
|
COLOR 5
|
|
FOR row = 12 TO 19: LOCATE row, 13: PRINT STRING$(16, 219); : NEXT row
|
|
COLOR 0, 2
|
|
FOR row = 20 TO 21: LOCATE row, 13: PRINT STRING$(16, 177); : NEXT row
|
|
IF cr = 1 THEN COLOR 14 ELSE COLOR 13
|
|
LOCATE 13, 16: PRINT STRING$(6, 219)
|
|
FOR row = 14 TO 19: LOCATE row, 15: PRINT STRING$(8, 219); : NEXT row
|
|
LOCATE 20, 16: PRINT STRING$(6, 219)
|
|
COLOR 0, 0
|
|
LOCATE 15, 17: PRINT " ": LOCATE 15, 20: PRINT " "
|
|
LOCATE 17, 17: PRINT " "
|
|
LOCATE 18, 18: PRINT " "
|
|
COLOR 9, 5
|
|
LOCATE 18, 25: PRINT "$"
|
|
LOCATE 19, 24: PRINT "$$$"
|
|
COLOR 15, 0: Center 23, "A Legend!"
|
|
COLOR 7
|
|
Center 25, "On " + DATE$ + ", "
|
|
Center 27, "at " + TIME$ + ", "
|
|
LOCATE 29, 13: PRINT crname$
|
|
LOCATE 29, 14 + LEN(RTRIM$(crname$)): PRINT "escaped."
|
|
COLOR 3: Center 31, "Score:" + LTRIM$(STR$(score))
|
|
END IF
|
|
COLOR 8: Center 33, "Press any key"
|
|
LOCATE 33, 27: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
|
|
END SUB
|
|
|
|
SUB Explosion STATIC
|
|
|
|
IF firsttime = 0 THEN check = SCREEN(gy, gx): firsttime = 1
|
|
LOCATE gy, gx
|
|
IF RND > .5 THEN COLOR 14 ELSE COLOR 4
|
|
SELECT CASE check
|
|
CASE 249, 234, 36, 42, 254, 178, 176, 177: PRINT CHR$(15)
|
|
CASE ELSE
|
|
END SELECT
|
|
te! = TIMER
|
|
xcounter = xcounter + 1
|
|
|
|
IF xcounter = 10 THEN
|
|
explode = 0: xcounter = 0: firsttime = 0
|
|
LOCATE gy, gx: COLOR 7
|
|
SELECT CASE check
|
|
CASE 249: COLOR 7, 5: PRINT CHR$(42): COLOR 7, 1 'White star
|
|
CASE 234, 36, 42, 254: PRINT " "
|
|
CASE 178, 176: PRINT CHR$(176)
|
|
CASE 177: COLOR 15: PRINT CHR$(177)
|
|
CASE ELSE
|
|
END SELECT
|
|
IF check = 178 THEN
|
|
up = SCREEN(gy - 1, gx)
|
|
down = SCREEN(gy + 1, gx)
|
|
IF up <> 178 AND up <> 176 AND down <> 178 AND down <> 176 THEN LOCATE gy, gx: PRINT " "
|
|
END IF
|
|
gy = 1: gx = 1
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB Game
|
|
|
|
DO
|
|
|
|
SCREEN 0, , 0, 0
|
|
|
|
IF cave = 7 THEN 'You've escaped from the cave system
|
|
EndScreen
|
|
Highscore
|
|
cave = 1
|
|
EXIT SUB
|
|
END IF
|
|
|
|
NextCave
|
|
PALETTE 5, 25
|
|
|
|
cheat$ = "cave6"
|
|
|
|
newcave = 1
|
|
oldcave = cave
|
|
health = 100
|
|
treasure = 0
|
|
gem = 0
|
|
magic = 0
|
|
stone = 0
|
|
scroll = 0
|
|
Quicksand -1
|
|
SELECT CASE ds
|
|
CASE 1: grenades = 5 'Easy
|
|
CASE 2: grenades = 3 'Normal
|
|
CASE 3: grenades = 2 'Hard
|
|
END SELECT
|
|
IF cave = 1 THEN
|
|
PALETTE 12, 60
|
|
score = 0
|
|
pgold = 10
|
|
lgmonsters = 6
|
|
lrmonsters = 4
|
|
ELSEIF cave MOD 3 = 0 THEN
|
|
PALETTE 12, 0
|
|
pgold = 15
|
|
IF cave = 3 THEN bmonsters = 10
|
|
IF cave = 6 THEN bmonsters = 15
|
|
ELSE
|
|
PALETTE 12, 60
|
|
pgold = 10
|
|
IF lgmonsters <= 8 THEN lgmonsters = lgmonsters + 2
|
|
IF lrmonsters <= 8 THEN lrmonsters = lrmonsters + 2
|
|
END IF
|
|
|
|
'Build the screen
|
|
SCREEN 0, , 1, 0
|
|
COLOR 7, 0: CLS
|
|
COLOR 15, 1
|
|
FOR row = 1 TO 40: LOCATE row, 1: PRINT STRING$(40, 177); : NEXT row
|
|
FOR row = 2 TO 39: LOCATE row, 2: PRINT SPACE$(38); : NEXT row
|
|
COLOR 3, 0
|
|
LOCATE 41, 2: PRINT "Health:100"
|
|
LOCATE 41, 18: PRINT "Score:" + LTRIM$(STR$(score));
|
|
LOCATE 41, 34: PRINT "Cave:" + LTRIM$(STR$(cave));
|
|
LOCATE 42, 2: PRINT "Grenades:" + LTRIM$(STR$(grenades));
|
|
LOCATE 42, 15: PRINT "Gem:" + LTRIM$(STR$(gem));
|
|
LOCATE 42, 22: PRINT "Scroll:" + LTRIM$(STR$(scroll));
|
|
LOCATE 42, 33: PRINT "Magic:" + LTRIM$(STR$(magic));
|
|
|
|
'Starting positions
|
|
COLOR 11, 1
|
|
gmy = RandomInt(2, 39)
|
|
gmx = RandomInt(2, 39)
|
|
LOCATE gmy, gmx: PRINT CHR$(4) 'Magic gem
|
|
|
|
DO
|
|
sy = RandomInt(3, 38)
|
|
sx = RandomInt(3, 38)
|
|
IF sy > gmy + 15 OR sy < gmy - 15 THEN
|
|
IF SCREEN(sy, sx) = 32 THEN EXIT DO
|
|
END IF
|
|
LOOP
|
|
LOCATE sy, sx: PRINT CHR$(236) 'Magic scroll
|
|
|
|
COLOR 9
|
|
LOCATE sy - 1, sx - 1: PRINT STRING$(3, 250)
|
|
LOCATE sy, sx - 1: PRINT CHR$(250) 'Magic wall around scroll
|
|
LOCATE sy, sx + 1: PRINT CHR$(250)
|
|
LOCATE sy + 1, sx - 1: PRINT STRING$(3, 250)
|
|
|
|
rq1 = RandomInt(1, 4) 'Random quadrant of lgmonsters
|
|
rq2 = RandomInt(1, 4) 'Random quadrant of lrmonsters
|
|
rq3 = RandomInt(1, 4) 'Random quadrant of bmonsters
|
|
|
|
COLOR 15
|
|
DO
|
|
rq = RandomInt(1, 4) 'Random quadrant of magic door
|
|
IF cave MOD 3 <> 0 THEN
|
|
IF rq <> rq1 AND rq <> rq2 THEN EXIT DO
|
|
ELSE
|
|
IF rq <> rq3 THEN EXIT DO
|
|
END IF
|
|
LOOP
|
|
DO
|
|
SELECT CASE rq
|
|
CASE 1: dy = RandomInt(2, 20): dx = RandomInt(4, 20)
|
|
CASE 2: dy = RandomInt(21, 39): dx = RandomInt(4, 20)
|
|
CASE 3: dy = RandomInt(2, 20): dx = RandomInt(23, 39)
|
|
CASE 4: dy = RandomInt(21, 39): dx = RandomInt(23, 39)
|
|
END SELECT
|
|
IF SCREEN(dy, dx) = 32 AND SCREEN(dy, dx - 2) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE dy, dx: PRINT "X" 'Magic door
|
|
|
|
y = dy
|
|
x = dx - 2
|
|
IF cr = 1 THEN COLOR 14 'Male CR
|
|
IF cr = 2 THEN COLOR 13 'Female CR
|
|
LOCATE y, x: PRINT CHR$(2)
|
|
|
|
COLOR 7
|
|
FOR n = 1 TO 22 'Rock formations
|
|
DO
|
|
ry = RandomInt(2, 35)
|
|
rx = RandomInt(4, 36)
|
|
IF SCREEN(ry, rx) = 32 THEN
|
|
FOR rfx = rx - 3 TO rx + 3
|
|
FOR rfy = ry TO ry + 4
|
|
IF SCREEN(rfy, rfx) = 32 THEN counter = counter + 1
|
|
NEXT rfy
|
|
NEXT rfx
|
|
END IF
|
|
IF counter = 35 THEN EXIT DO
|
|
counter = 0
|
|
LOOP
|
|
LOCATE ry, rx: PRINT CHR$(178)
|
|
LOCATE ry + 1, rx - 1: PRINT STRING$(3, 178)
|
|
LOCATE ry + 2, rx - 2: PRINT STRING$(5, 178)
|
|
rn = RandomInt(1, 2)
|
|
IF rn = 2 THEN LOCATE ry + 3, rx - 3: PRINT STRING$(7, 178)
|
|
counter = 0
|
|
NEXT n
|
|
|
|
IF cave MOD 3 <> 0 THEN
|
|
COLOR 2
|
|
DO
|
|
cy = RandomInt(2, 39)
|
|
cx = RandomInt(2, 39)
|
|
IF SCREEN(cy, cx) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE cy, cx: PRINT CHR$(254) 'Chest of grenades
|
|
END IF
|
|
|
|
COLOR 9
|
|
FOR n = 1 TO pgold 'Pieces of gold
|
|
DO
|
|
pgy = RandomInt(2, 39)
|
|
pgx = RandomInt(2, 39)
|
|
IF SCREEN(pgy, pgx) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE pgy, pgx: PRINT "$"
|
|
NEXT n
|
|
|
|
IF cave MOD 3 <> 0 THEN
|
|
MoveLGM 'Monsters
|
|
MoveLRM
|
|
ELSE
|
|
MoveBM
|
|
END IF
|
|
|
|
gy = 1: gx = 1
|
|
hit = 1: mcounter = 0: ftime = 0
|
|
newcave = 0
|
|
|
|
PCOPY 1, 0
|
|
Pause
|
|
tq! = TIMER
|
|
|
|
'Main loop
|
|
DO
|
|
k$ = UCASE$(INKEY$)
|
|
IF k$ <> "" THEN
|
|
k = k + 1
|
|
IF MID$(cheat$, k, 1) = LCASE$(k$) THEN cheat = cheat + 1 ELSE k = 0: cheat = 0
|
|
IF cheat = 5 THEN cave = 6: score = 0: nohscore = 1: EXIT DO
|
|
END IF
|
|
oldy = y: oldx = x
|
|
COLOR 7, 1
|
|
SELECT CASE k$
|
|
CASE CHR$(0) + CHR$(75) 'Left
|
|
LOCATE y, x: PRINT " ": x = x - 1: MoveCR
|
|
CASE CHR$(0) + CHR$(77) 'Right
|
|
LOCATE y, x: PRINT " ": x = x + 1: MoveCR
|
|
CASE CHR$(0) + CHR$(72) 'Up
|
|
LOCATE y, x: PRINT " ": y = y - 1: MoveCR
|
|
CASE CHR$(0) + CHR$(80) 'Down
|
|
LOCATE y, x: PRINT " ": y = y + 1: MoveCR
|
|
CASE CHR$(32) 'Spacebar
|
|
IF hit = 0 THEN
|
|
trigger = 1: Grenade (direction)
|
|
ELSEIF hit = 1 THEN
|
|
IF grenades > 0 THEN
|
|
hit = 0
|
|
COLOR 2, 0
|
|
LOCATE 43, 1: PRINT SPACE$(40);
|
|
Center 43, "Which direction?"
|
|
COLOR 2, 1
|
|
PCOPY 1, 0
|
|
DO
|
|
d$ = UCASE$(INKEY$)
|
|
IF d$ = CHR$(0) + CHR$(72) THEN direction = 1: EXIT DO
|
|
IF d$ = CHR$(0) + CHR$(80) THEN direction = 2: EXIT DO
|
|
IF d$ = CHR$(0) + CHR$(75) THEN direction = 3: EXIT DO
|
|
IF d$ = CHR$(0) + CHR$(77) THEN direction = 4: EXIT DO
|
|
IF explode = 1 AND ABS(TIMER - te!) >= .01 AND xcounter < 10 THEN Explosion
|
|
NewPositions
|
|
PCOPY 1, 0
|
|
IF d$ = CHR$(32) THEN hit = 1: EXIT DO
|
|
IF death = 1 THEN death = 0: EXIT SUB
|
|
LOOP
|
|
IF explode = 1 THEN xcounter = 9: Explosion
|
|
IF d$ <> CHR$(32) THEN
|
|
PCSound 7
|
|
Grenade (direction)
|
|
IF grenades > 0 THEN grenades = grenades - 1
|
|
COLOR 3, 0
|
|
LOCATE 42, 2: PRINT "Grenades:" + LTRIM$(STR$(grenades)) + " ";
|
|
tg! = TIMER
|
|
END IF
|
|
SetSound 1
|
|
ELSE
|
|
COLOR 3, 7: LOCATE 42, 11: PRINT "0";
|
|
PCOPY 1, 0
|
|
Delay .1
|
|
COLOR 3, 0: LOCATE 42, 11: PRINT "0";
|
|
COLOR 3, 1
|
|
END IF
|
|
END IF
|
|
CASE "M" 'Magic
|
|
IF magic > 0 THEN
|
|
PCSound 9
|
|
magic = magic - 1
|
|
ts! = TIMER
|
|
stone = 1
|
|
COLOR 3, 0
|
|
LOCATE 42, 33: PRINT "Magic:" + LTRIM$(STR$(magic));
|
|
COLOR 3, 1
|
|
PALETTE 1, 7: Delay .1: PALETTE 1, 56
|
|
PALETTE 12, 7
|
|
ELSE
|
|
COLOR 3, 7
|
|
LOCATE 42, 39: PRINT "0";
|
|
PCOPY 1, 0
|
|
Delay .1
|
|
COLOR 3, 0
|
|
LOCATE 42, 39: PRINT "0";
|
|
COLOR 3, 1
|
|
END IF
|
|
CASE "S" 'Sound on/off
|
|
SetSound 2
|
|
CASE "P" 'Pause
|
|
Pause
|
|
CASE "H" 'Help
|
|
QuickStop
|
|
PCOPY 1, 0
|
|
Instructions
|
|
PCOPY 0, 1
|
|
SCREEN 0, , 1, 0
|
|
PALETTE 5, 25
|
|
COLOR 7, 1
|
|
SetTimers
|
|
CASE "Q" 'Quit game
|
|
QuickStop
|
|
COLOR 7, 0
|
|
LOCATE 43, 1: PRINT SPACE$(40);
|
|
Center 43, "Do you really want to quit? (Y/N)"
|
|
LOCATE 43, 37: COLOR 23: PRINT "_";
|
|
PCOPY 1, 0
|
|
COLOR 7
|
|
DO
|
|
q$ = UCASE$(INKEY$)
|
|
IF q$ = "Y" THEN cave = 1: score = 0: nohscore = 0: EXIT SUB
|
|
IF q$ = "N" THEN SetSound 1: SetTimers: EXIT DO
|
|
LOOP
|
|
CASE ELSE
|
|
END SELECT
|
|
IF gy = y AND gx = x THEN TheEnd
|
|
IF death = 1 THEN death = 0: EXIT SUB
|
|
IF cave <> oldcave AND death = 0 THEN EXIT DO
|
|
IF hit = 0 AND ABS(TIMER - tg!) >= .01 THEN Grenade (direction): tg! = TIMER
|
|
IF explode = 1 AND ABS(TIMER - te!) >= .01 AND xcounter < 10 THEN Explosion
|
|
IF (TIMER AND 3) = 0 THEN LOCATE dy, dx: COLOR 0: PRINT "X" ELSE LOCATE dy, dx: COLOR 15: PRINT "X"
|
|
IF score <> oldscore THEN
|
|
LOCATE 41, 18: COLOR 3, 0: PRINT "Score:" + LTRIM$(STR$(score)); : COLOR 7, 1
|
|
oldscore = score
|
|
END IF
|
|
NewPositions
|
|
PCOPY 1, 0
|
|
LOOP
|
|
|
|
LOOP
|
|
|
|
END SUB
|
|
|
|
SUB Grenade (direction)
|
|
|
|
COLOR 2
|
|
|
|
'Manual explosion of grenade
|
|
IF trigger = 1 THEN
|
|
trigger = 0
|
|
IF SCREEN(gy, gx) = 32 THEN LOCATE gy, gx: PRINT CHR$(249)
|
|
HitDetection
|
|
EXIT SUB
|
|
END IF
|
|
|
|
'Move the grenade
|
|
mcounter = mcounter + 1
|
|
SELECT CASE direction
|
|
CASE 1
|
|
IF ftime = 0 THEN gy = y - 1: gx = x: ftime = 1
|
|
IF mcounter = 1 THEN
|
|
HitDetection
|
|
ELSE
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
gy = gy - 1
|
|
mcounter = 0
|
|
END IF
|
|
CASE 2
|
|
IF ftime = 0 THEN gy = y + 1: gx = x: ftime = 1
|
|
IF mcounter = 1 THEN
|
|
HitDetection
|
|
ELSE
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
gy = gy + 1
|
|
mcounter = 0
|
|
END IF
|
|
CASE 3
|
|
IF ftime = 0 THEN gy = y: gx = x - 1: ftime = 1
|
|
IF mcounter = 1 THEN
|
|
HitDetection
|
|
ELSE
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
gx = gx - 1
|
|
mcounter = 0
|
|
END IF
|
|
CASE 4
|
|
IF ftime = 0 THEN gy = y: gx = x + 1: ftime = 1
|
|
IF mcounter = 1 THEN
|
|
HitDetection
|
|
ELSE
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
gx = gx + 1
|
|
mcounter = 0
|
|
END IF
|
|
END SELECT
|
|
|
|
END SUB
|
|
|
|
SUB HallOfFame
|
|
|
|
DO
|
|
|
|
SCREEN 0, , 1, 0
|
|
|
|
'Title
|
|
PALETTE 6, 48
|
|
COLOR 15, 6
|
|
FOR row = 1 TO 14: LOCATE row, 1: PRINT STRING$(40, 177); : NEXT row
|
|
FOR row = 2 TO 13: LOCATE row, 2: PRINT SPACE$(38); : NEXT row
|
|
COLOR 7
|
|
Center 8, "H A L L O F F A M E"
|
|
|
|
'Dots
|
|
COLOR 15, 0
|
|
FOR row = 15 TO 43: LOCATE row, 1: PRINT STRING$(40, 176); : NEXT row
|
|
FOR row = 20 TO 34: LOCATE row, 1: PRINT SPACE$(40); : NEXT row
|
|
|
|
'Table
|
|
COLOR 7, 0
|
|
FOR i = 1 TO 3
|
|
IF i = 1 THEN yi = 22: ds$ = "Easy"
|
|
IF i = 2 THEN yi = 25: ds$ = "Normal"
|
|
IF i = 3 THEN yi = 28: ds$ = "Hard"
|
|
LOCATE yi, 2: IF cr!(i) = 1 THEN COLOR 14: PRINT CHR$(2) ELSE COLOR 13: PRINT CHR$(2)
|
|
COLOR 7
|
|
LOCATE yi, 4: PRINT crname$(i)
|
|
LOCATE yi, 14: PRINT "Score:" + LTRIM$(STR$(hscore!(i)))
|
|
IF cave!(i) <> 7 THEN
|
|
LOCATE yi, 26: PRINT "Cave:" + LTRIM$(STR$(cave!(i)))
|
|
ELSE
|
|
LOCATE yi, 26: PRINT "Cave:" + "X"
|
|
END IF
|
|
LOCATE yi, 34: PRINT ds$
|
|
NEXT i
|
|
|
|
SELECT CASE hscore
|
|
CASE 0
|
|
CASE 1: LOCATE 22, 1: COLOR 22: PRINT "V"
|
|
CASE 2: LOCATE 25, 1: COLOR 22: PRINT "V"
|
|
CASE 3: LOCATE 28, 1: COLOR 22: PRINT "V"
|
|
END SELECT
|
|
IF hscore <> 0 THEN
|
|
COLOR 6
|
|
Center 31, "CONGRATULATIONS,"
|
|
Center 32, "you're among the victors."
|
|
PCOPY 1, 0
|
|
hscore = 0
|
|
IF speaker = 0 THEN Delay -10
|
|
PCSound 13
|
|
SOUND 0, 0
|
|
LOCATE 22, 1: PRINT " "
|
|
LOCATE 25, 1: PRINT " "
|
|
LOCATE 28, 1: PRINT " "
|
|
LOCATE 31, 1: PRINT SPACE$(40)
|
|
LOCATE 32, 1: PRINT SPACE$(40)
|
|
END IF
|
|
|
|
COLOR 8
|
|
Center 31, "Press F1 to clear the table or any"
|
|
Center 32, "other key to return to the main menu"
|
|
LOCATE 32, 39: COLOR 24: PRINT "_"
|
|
PCOPY 1, 0
|
|
Delay 0
|
|
IF dkey$ = CHR$(0) + CHR$(59) THEN
|
|
fe = 1: table = 1: Initialize: table = 0
|
|
ELSE
|
|
EXIT DO
|
|
END IF
|
|
|
|
LOOP
|
|
|
|
PALETTE 6, 20
|
|
|
|
END SUB
|
|
|
|
SUB Highscore
|
|
|
|
'If a new highscore has been achieved, then save the HoF data
|
|
IF nohscore = 1 THEN score = 0: nohscore = 0
|
|
ON ERROR GOTO FileError
|
|
SELECT CASE ds
|
|
CASE 1
|
|
IF score > hscore!(1) THEN
|
|
cr!(1) = cr: crname$(1) = crname$
|
|
hscore!(1) = score: cave!(1) = cave: hscore = 1
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
SEEK #1, 15
|
|
PUT #1, , cr!(1)
|
|
FOR n = 1 TO 8
|
|
letter! = ASC(MID$(crname$(1), n, 1)) / 4
|
|
PUT #1, , letter!
|
|
NEXT n
|
|
PUT #1, , hscore!(1)
|
|
PUT #1, , cave!(1)
|
|
CLOSE #1
|
|
HallOfFame
|
|
END IF
|
|
CASE 2
|
|
IF score > hscore!(2) THEN
|
|
cr!(2) = cr: crname$(2) = crname$
|
|
hscore!(2) = score: cave!(2) = cave: hscore = 2
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
SEEK #1, 59
|
|
PUT #1, , cr!(2)
|
|
FOR n = 1 TO 8
|
|
letter! = ASC(MID$(crname$(2), n, 1)) / 4
|
|
PUT #1, , letter!
|
|
NEXT n
|
|
PUT #1, , hscore!(2)
|
|
PUT #1, , cave!(2)
|
|
CLOSE #1
|
|
HallOfFame
|
|
END IF
|
|
CASE 3
|
|
IF score > hscore!(3) THEN
|
|
cr!(3) = cr: crname$(3) = crname$
|
|
hscore!(3) = score: cave!(3) = cave: hscore = 3
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
SEEK #1, 103
|
|
PUT #1, , cr!(3)
|
|
FOR n = 1 TO 8
|
|
letter! = ASC(MID$(crname$(3), n, 1)) / 4
|
|
PUT #1, , letter!
|
|
NEXT n
|
|
PUT #1, , hscore!(3)
|
|
PUT #1, , cave!(3)
|
|
CLOSE #1
|
|
HallOfFame
|
|
END IF
|
|
END SELECT
|
|
ON ERROR GOTO 0
|
|
|
|
END SUB
|
|
|
|
SUB HitDetection
|
|
|
|
check = SCREEN(gy, gx)
|
|
IF check <> 32 THEN
|
|
hit = 1: mcounter = 0: ftime = 0
|
|
SELECT CASE check
|
|
CASE 234
|
|
IF cave MOD 3 <> 0 THEN
|
|
PCSound 8
|
|
check = SCREEN(gy, gx, 1)
|
|
IF check = 26 THEN
|
|
score = score + 60: MoveLGM
|
|
ELSE
|
|
score = score + 80: MoveLRM
|
|
END IF
|
|
END IF
|
|
CASE 249, 36, 42, 254, 178, 177, 176
|
|
PCSound 8
|
|
CASE ELSE
|
|
END SELECT
|
|
IF cave MOD 3 = 0 AND check = 234 THEN gy = 1: gx = 1 ELSE explode = 1
|
|
ELSE
|
|
LOCATE gy, gx: PRINT CHR$(249)
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB Initialize
|
|
|
|
ON ERROR GOTO FileError
|
|
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
GET #1, 1, check
|
|
IF check <> 1234 THEN fe = 1
|
|
GET #1, 5, cr
|
|
GET #1, 9, ds
|
|
GET #1, 13, speaker
|
|
FOR i = 1 TO 3
|
|
GET #1, , cr!(i)
|
|
FOR n = 1 TO 8
|
|
GET #1, , letter!
|
|
crname$(i) = crname$(i) + CHR$(letter! * 4)
|
|
NEXT n
|
|
GET #1, , hscore!(i)
|
|
GET #1, , cave!(i)
|
|
NEXT i
|
|
CLOSE #1
|
|
|
|
'If a file error has occurred, then use the standard settings
|
|
IF fe = 1 THEN
|
|
fe = 0
|
|
check = 1234
|
|
IF table = 0 THEN 'Not F1 from the HoF
|
|
cr = 1 'Male CR
|
|
ds = 2 'Normal
|
|
speaker = 1 'Sound on
|
|
END IF
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
PUT #1, 1, check
|
|
PUT #1, 5, cr
|
|
PUT #1, 9, ds
|
|
PUT #1, 13, speaker
|
|
FOR i = 1 TO 3
|
|
cr!(i) = 1
|
|
PUT #1, , cr!(i)
|
|
FOR n = 1 TO 8
|
|
crname$(i) = "........"
|
|
letter! = ASC(MID$(crname$(i), n, 1)) / 4
|
|
PUT #1, , letter!
|
|
NEXT n
|
|
hscore!(i) = 0
|
|
PUT #1, , hscore!(i)
|
|
cave!(i) = 0
|
|
PUT #1, , cave!(i)
|
|
NEXT i
|
|
CLOSE #1
|
|
END IF
|
|
|
|
ON ERROR GOTO 0
|
|
PLAY "mb"
|
|
cave = 1
|
|
|
|
END SUB
|
|
|
|
SUB Instructions
|
|
|
|
SCREEN 0, , 1, 1
|
|
COLOR 8, 0
|
|
FOR row = 1 TO 43: LOCATE row, 1: PRINT STRING$(40, 242); : NEXT row
|
|
FOR row = 3 TO 41: LOCATE row, 9: PRINT STRING$(24, 177): NEXT row
|
|
FOR row = 4 TO 40: LOCATE row, 10: PRINT SPACE$(22): NEXT row
|
|
COLOR 3
|
|
Center 5, "How to Play the Game"
|
|
Center 6, "--------------------"
|
|
|
|
COLOR 7
|
|
Center 8, "Objective: Get the "
|
|
Center 10, "magic gem, all the "
|
|
Center 12, "gold in the cave and"
|
|
Center 14, "finally the magic "
|
|
Center 16, "scroll. Then head "
|
|
Center 18, "for the magic door. "
|
|
Center 20, "Don't forget to pick"
|
|
Center 22, "up the green chest "
|
|
Center 24, "of grenades because "
|
|
Center 26, "you're not alone. "
|
|
Center 28, "Those cave monsters "
|
|
Center 30, "not only love their "
|
|
Center 32, "gold but also fresh "
|
|
Center 34, "meat. Therefore, be "
|
|
Center 36, "careful. "
|
|
LOCATE 8, 11: COLOR 15: PRINT "Objective:"
|
|
COLOR 8
|
|
Center 39, "Press any key (1/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
PALETTE 5, 5
|
|
COLOR 7
|
|
Center 8, "Keys: You move the "
|
|
Center 10, "cave raider with the"
|
|
Center 12, "arrow keys. If you "
|
|
Center 14, "press Spacebar, "
|
|
Center 16, "you'll be asked in "
|
|
Center 18, "which direction you "
|
|
Center 20, "want to launch a "
|
|
Center 22, "grenade. Press an "
|
|
Center 24, "arrow key to fire a "
|
|
Center 26, "grenade or Spacebar "
|
|
Center 28, "if you changed your "
|
|
Center 30, "mind. If you press "
|
|
Center 32, "Spacebar while a "
|
|
Center 34, "grenade is flying "
|
|
Center 36, "through the air, the"
|
|
LOCATE 8, 11: COLOR 15: PRINT "Keys:"
|
|
COLOR 5
|
|
LOCATE 12, 11: PRINT "arrow keys"
|
|
LOCATE 14, 17: PRINT "Spacebar"
|
|
COLOR 8
|
|
Center 39, "Press any key (2/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "grenade will explode"
|
|
Center 10, "immediately and "
|
|
Center 12, "leave a sign (a "
|
|
Center 14, "white star) on the "
|
|
Center 16, "ground. The magic "
|
|
Center 18, "gem gives you two "
|
|
Center 20, "spells. If you press"
|
|
Center 22, "M, the red monsters "
|
|
Center 24, "will temporarily "
|
|
Center 26, "turn into stone. "
|
|
Center 28, "The same is true for"
|
|
Center 30, "the black monsters "
|
|
Center 32, "that can't be killed"
|
|
Center 34, "by grenades due to "
|
|
Center 36, "their magic origin. "
|
|
LOCATE 22, 11: COLOR 5: PRINT "M"
|
|
COLOR 8
|
|
Center 39, "Press any key (3/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
PALETTE 5, 25
|
|
COLOR 7
|
|
Center 8, "ASCII characters: "
|
|
Center 10, " - Male CR "
|
|
Center 12, " - Female CR "
|
|
Center 14, " - Rock "
|
|
Center 16, " (-80 health) "
|
|
Center 18, " - Rock "
|
|
Center 20, " (-60 health) "
|
|
Center 22, " - Rock "
|
|
Center 24, " (-40 health) "
|
|
Center 26, " - Gold (50 points)"
|
|
Center 28, " - Chest of "
|
|
Center 30, " grenades "
|
|
Center 32, " - Grenade "
|
|
Center 34, " - Explosion "
|
|
Center 36, " - Sign "
|
|
LOCATE 8, 11: COLOR 15: PRINT "ASCII characters:"
|
|
LOCATE 10, 11: COLOR 14: PRINT CHR$(2)
|
|
LOCATE 12, 11: COLOR 13: PRINT CHR$(2)
|
|
LOCATE 14, 11: COLOR 15: PRINT CHR$(177)
|
|
LOCATE 18, 11: COLOR 7: PRINT CHR$(178)
|
|
LOCATE 22, 11: PRINT CHR$(176)
|
|
LOCATE 26, 11: COLOR 9: PRINT CHR$(36)
|
|
LOCATE 28, 11: COLOR 2: PRINT CHR$(254)
|
|
LOCATE 32, 11: PRINT CHR$(249)
|
|
LOCATE 34, 11: COLOR 4: PRINT CHR$(15)
|
|
LOCATE 36, 11: COLOR 7, 5: PRINT CHR$(42)
|
|
COLOR 8, 0
|
|
Center 39, "Press any key (4/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
PALETTE 5, 60
|
|
COLOR 7
|
|
Center 8, " - Magic gem "
|
|
Center 10, " (100 points) "
|
|
Center 12, " - Magic scroll "
|
|
Center 14, " (100 points) "
|
|
Center 16, " - Magic wall "
|
|
Center 18, " - Magic field of "
|
|
Center 20, " quicksand "
|
|
Center 22, " - Cave monster "
|
|
Center 24, " (60 points) "
|
|
Center 26, " - Cave monster "
|
|
Center 28, " (80 points) "
|
|
Center 30, " - Cave monster "
|
|
Center 32, " (100 points) "
|
|
Center 34, " - Magic door "
|
|
Center 36, " (200 points) "
|
|
LOCATE 8, 11: COLOR 11: PRINT CHR$(4)
|
|
LOCATE 12, 11: PRINT CHR$(236)
|
|
LOCATE 16, 11: COLOR 9: PRINT CHR$(250)
|
|
LOCATE 18, 11: COLOR 6: PRINT CHR$(247)
|
|
LOCATE 22, 11: COLOR 10, 1: PRINT CHR$(234)
|
|
LOCATE 26, 11: COLOR 5: PRINT CHR$(234)
|
|
LOCATE 30, 11: COLOR 0: PRINT CHR$(234)
|
|
LOCATE 34, 11: COLOR 15, 0: PRINT "X"
|
|
COLOR 8
|
|
Center 39, "Press any key (5/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "Hints: Analyze each "
|
|
Center 10, "cave before you "
|
|
Center 12, "begin. Remember that"
|
|
Center 14, "you can't leave a "
|
|
Center 16, "cave if there's a "
|
|
Center 18, "monster at the magic"
|
|
Center 20, "door. This is the "
|
|
Center 22, "aim of the green "
|
|
Center 24, "monsters. The others"
|
|
Center 26, "will hunt you. It "
|
|
Center 28, "can be a good idea "
|
|
Center 30, "to use one or two "
|
|
Center 32, "signs as barriers. "
|
|
Center 34, " "
|
|
Center 36, " Have fun!"
|
|
COLOR 15
|
|
LOCATE 8, 11: PRINT "Hints:"
|
|
LOCATE 36, 22: PRINT "Have fun!"
|
|
COLOR 8
|
|
Center 39, "Press any key (6/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
|
|
END SUB
|
|
|
|
FUNCTION MainMenu
|
|
|
|
SCREEN 0, , 0, 0
|
|
|
|
'Title
|
|
COLOR 15, 1
|
|
FOR row = 1 TO 21: LOCATE row, 1: PRINT STRING$(40, 177): NEXT row
|
|
FOR row = 2 TO 20: LOCATE row, 2: PRINT SPACE$(38): NEXT row
|
|
|
|
COLOR 7
|
|
Center 4, " @@@@ @@@ @ @ @@@@@"
|
|
Center 5, "@ @ @ @ @ @ "
|
|
Center 6, "@ @@@@@ @ @ @@@@ "
|
|
Center 7, "@ @ @ @ @ @ "
|
|
Center 8, " @@@@ @ @ @ @@@@@"
|
|
|
|
Center 11, "@@@@ @@@ @ @@@@ @@@@@ @@@@ "
|
|
Center 12, "@ @ @ @ @ @ @ @ @ @"
|
|
Center 13, "@@@@ @@@@@ @ @ @ @@@@ @@@@ "
|
|
Center 14, "@ @ @ @ @ @ @ @ @ @ "
|
|
Center 15, "@ @ @ @ @ @@@@ @@@@@ @ @"
|
|
|
|
COLOR 0
|
|
Center 18, "Copyright (c) 2004 by paul redling"
|
|
|
|
'Main menu
|
|
COLOR 8, 0
|
|
FOR row = 22 TO 43: LOCATE row, 1: PRINT STRING$(40, 242); : NEXT row
|
|
FOR row = 25 TO 39: LOCATE row, 13: PRINT STRING$(16, 177): NEXT row
|
|
FOR row = 26 TO 38: LOCATE row, 14: PRINT SPACE$(14): NEXT row
|
|
|
|
COLOR 9
|
|
LOCATE 29, 8: PRINT "$"
|
|
LOCATE 30, 7: PRINT "$$$$"
|
|
LOCATE 31, 6: PRINT "$"
|
|
LOCATE 31, 8: PRINT "$"
|
|
LOCATE 32, 7: PRINT "$$$"
|
|
LOCATE 33, 8: PRINT "$"
|
|
LOCATE 33, 10: PRINT "$"
|
|
LOCATE 34, 6: PRINT "$$$$"
|
|
LOCATE 35, 8: PRINT "$"
|
|
|
|
LOCATE 29, 33: PRINT "$"
|
|
LOCATE 30, 32: PRINT "$$$$"
|
|
LOCATE 31, 31: PRINT "$"
|
|
LOCATE 31, 33: PRINT "$"
|
|
LOCATE 32, 32: PRINT "$$$"
|
|
LOCATE 33, 33: PRINT "$"
|
|
LOCATE 33, 35: PRINT "$"
|
|
LOCATE 34, 31: PRINT "$$$$"
|
|
LOCATE 35, 33: PRINT "$"
|
|
|
|
COLOR 3
|
|
ty = 27
|
|
DO
|
|
IF ty = 27 THEN TextBlink: Center 27, "Play ": COLOR 3 ELSE Center 27, "Play "
|
|
IF ty = 29 THEN TextBlink: Center 29, "Story ": COLOR 3 ELSE Center 29, "Story "
|
|
IF ty = 31 THEN TextBlink: Center 31, "Instructions": COLOR 3 ELSE Center 31, "Instructions"
|
|
IF ty = 33 THEN TextBlink: Center 33, "Hall of Fame": COLOR 3 ELSE Center 33, "Hall of Fame"
|
|
IF ty = 35 THEN TextBlink: Center 35, "Options ": COLOR 3 ELSE Center 35, "Options "
|
|
IF ty = 37 THEN TextBlink: Center 37, "Quit ": COLOR 3 ELSE Center 37, "Quit "
|
|
IF k$ <> "" THEN Delay .1
|
|
k$ = INKEY$
|
|
IF k$ = CHR$(0) + CHR$(72) THEN ty = ty - 2 'Up
|
|
IF k$ = CHR$(0) + CHR$(80) THEN ty = ty + 2 'Down
|
|
IF k$ = CHR$(13) AND ty = 27 THEN MainMenu = 1: EXIT FUNCTION 'Play
|
|
IF k$ = CHR$(13) AND ty = 29 THEN MainMenu = 2: EXIT FUNCTION 'Story
|
|
IF k$ = CHR$(13) AND ty = 31 THEN MainMenu = 3: EXIT FUNCTION 'Instructions
|
|
IF k$ = CHR$(13) AND ty = 33 THEN MainMenu = 4: EXIT FUNCTION 'HallOfFame
|
|
IF k$ = CHR$(13) AND ty = 35 THEN MainMenu = 5: EXIT FUNCTION 'Options
|
|
IF k$ = CHR$(13) AND ty = 37 THEN MainMenu = 6: EXIT FUNCTION 'Quit
|
|
IF ty > 37 THEN ty = 27
|
|
IF ty < 27 THEN ty = 37
|
|
LOOP
|
|
|
|
END FUNCTION
|
|
|
|
SUB MoveBM STATIC
|
|
|
|
DIM y(15), x(15), oldy(15), oldx(15)
|
|
|
|
COLOR 12
|
|
IF newcave THEN
|
|
FOR i = 1 TO bmonsters 'The initial positions of the invincible black
|
|
DO 'monsters that hunt the cave raider.
|
|
SELECT CASE rq3
|
|
CASE 1: y(i) = RandomInt(2, 20): x(i) = RandomInt(2, 20)
|
|
CASE 2: y(i) = RandomInt(21, 39): x(i) = RandomInt(2, 20)
|
|
CASE 3: y(i) = RandomInt(2, 20): x(i) = RandomInt(21, 39)
|
|
CASE 4: y(i) = RandomInt(21, 39): x(i) = RandomInt(21, 39)
|
|
END SELECT
|
|
IF SCREEN(y(i), x(i)) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE y(i), x(i): PRINT CHR$(234)
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
NEXT i
|
|
EXIT SUB
|
|
END IF
|
|
|
|
IF scroll = 1 THEN 'If the scroll has been taken, the magic black
|
|
COLOR 0 'monsters will turn into gems.
|
|
FOR i = 1 TO bmonsters
|
|
LOCATE y(i), x(i): PRINT CHR$(4)
|
|
NEXT i
|
|
EXIT SUB
|
|
END IF
|
|
|
|
'The movements of the black monsters
|
|
FOR i = 1 TO bmonsters
|
|
left = SCREEN(y(i), x(i) - 1) 'Look for possible directions
|
|
right = SCREEN(y(i), x(i) + 1)
|
|
up = SCREEN(y(i) - 1, x(i))
|
|
down = SCREEN(y(i) + 1, x(i))
|
|
IF left = 32 OR left = 2 THEN left = 0
|
|
IF right = 32 OR right = 2 THEN right = 0
|
|
IF up = 32 OR up = 2 THEN up = 0
|
|
IF down = 32 OR down = 2 THEN down = 0
|
|
FOR try = 1 TO 2 'Try to pick a direction towards cave raider
|
|
IF y(i) < y OR y(i) > y THEN
|
|
IF RND > .7 THEN
|
|
IF left = 0 AND x(i) > x THEN x(i) = x(i) - 1: EXIT FOR
|
|
IF right = 0 AND x(i) < x THEN x(i) = x(i) + 1: EXIT FOR
|
|
ELSE
|
|
IF up = 0 AND y(i) > y THEN y(i) = y(i) - 1: EXIT FOR
|
|
IF down = 0 AND y(i) < y THEN y(i) = y(i) + 1: EXIT FOR
|
|
END IF
|
|
ELSE
|
|
IF left = 0 AND x(i) > x THEN x(i) = x(i) - 1: EXIT FOR
|
|
IF right = 0 AND x(i) < x THEN x(i) = x(i) + 1: EXIT FOR
|
|
END IF
|
|
NEXT try
|
|
IF y(i) = oldy(i) AND x(i) = oldx(i) THEN 'If you didn't pick a
|
|
FOR try = 1 TO 8 'direction already,
|
|
rn = RandomInt(1, 4) 'then try to pick a
|
|
IF rn = 1 AND left = 0 THEN x(i) = x(i) - 1: EXIT FOR 'random
|
|
IF rn = 2 AND right = 0 THEN x(i) = x(i) + 1: EXIT FOR 'direction.
|
|
IF rn = 3 AND up = 0 THEN y(i) = y(i) - 1: EXIT FOR
|
|
IF rn = 4 AND down = 0 THEN y(i) = y(i) + 1: EXIT FOR
|
|
NEXT try
|
|
END IF
|
|
IF y(i) <> oldy(i) OR x(i) <> oldx(i) THEN
|
|
LOCATE oldy(i), oldx(i): PRINT " " 'Erase old position
|
|
LOCATE y(i), x(i): PRINT CHR$(234) 'Move to new position
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
END IF
|
|
IF y(i) = y AND x(i) = x THEN TheEnd: EXIT SUB 'You got cave raider
|
|
NEXT i
|
|
|
|
tbm! = TIMER
|
|
|
|
END SUB
|
|
|
|
SUB MoveCR
|
|
|
|
check = SCREEN(y, x)
|
|
IF check = 234 THEN TheEnd 'Monster
|
|
IF check = 178 OR check = 177 OR check = 176 THEN 'Rock
|
|
SELECT CASE check
|
|
CASE 178: health = health - 60
|
|
CASE 177: health = health - 80
|
|
CASE 176: health = health - 40
|
|
END SELECT
|
|
IF health < 0 THEN health = 0
|
|
COLOR 3, 0
|
|
LOCATE 41, 2: PRINT "Health:" + LTRIM$(STR$(health)) + " ";
|
|
COLOR 3, 1
|
|
IF health > 0 THEN
|
|
PCSound 10
|
|
y = oldy: x = oldx
|
|
PCOPY 1, 0
|
|
Delay .5
|
|
ELSE
|
|
TheEnd
|
|
END IF
|
|
END IF
|
|
IF check = 247 THEN TheEnd 'Quicksand
|
|
IF check = 15 THEN xcounter = 9: Explosion: TheEnd 'Explosion
|
|
IF check = 88 THEN 'Magic door
|
|
IF SCREEN(y, x - 1) <> 234 AND SCREEN(y, x + 1) <> 234 AND SCREEN(y - 1, x) <> 234 AND SCREEN(y + 1, x) <> 234 AND gem = 1 AND scroll = 1 THEN
|
|
QuickStop
|
|
LOCATE dy, dx: COLOR 11: PRINT "X"
|
|
IF cave < 6 THEN PCSound 11 ELSE PCSound 12
|
|
IF cave < 6 THEN score = score + 200 ELSE score = score + 1000
|
|
LOCATE 41, 18: COLOR 3, 0: PRINT "Score:" + LTRIM$(STR$(score)); : COLOR 7, 1
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
PCOPY 1, 0
|
|
Delay 2
|
|
cave = cave + 1
|
|
EXIT SUB
|
|
ELSE
|
|
TheEnd
|
|
END IF
|
|
END IF
|
|
IF check = 36 THEN 'Piece of gold
|
|
PCSound 1
|
|
score = score + 50
|
|
treasure = treasure + 1
|
|
IF treasure = pgold THEN 'If all the gold has been collected,
|
|
LOCATE sy - 1, sx - 1: PRINT SPACE$(3) 'then erase the magic wall
|
|
LOCATE sy, sx - 1: PRINT " " 'around the scroll.
|
|
LOCATE sy, sx + 1: PRINT " "
|
|
LOCATE sy + 1, sx - 1: PRINT SPACE$(3)
|
|
PCSound 6
|
|
END IF
|
|
END IF
|
|
IF check = 254 THEN 'Chest of grenades
|
|
PCSound 2
|
|
SELECT CASE ds
|
|
CASE 1: grenades = grenades + 5
|
|
CASE 2: grenades = grenades + 3
|
|
CASE 3: grenades = grenades + 2
|
|
END SELECT
|
|
COLOR 3, 0
|
|
LOCATE 42, 2: PRINT "Grenades:" + LTRIM$(STR$(grenades));
|
|
COLOR 3, 1
|
|
END IF
|
|
IF check = 4 THEN 'Magic gem
|
|
PCSound 3
|
|
score = score + 100
|
|
check = SCREEN(y, x, 1)
|
|
IF check = 27 THEN gem = gem + 1: magic = 2
|
|
COLOR 3, 0
|
|
LOCATE 42, 15: PRINT "Gem:" + LTRIM$(STR$(gem));
|
|
LOCATE 42, 33: PRINT "Magic:" + LTRIM$(STR$(magic));
|
|
COLOR 3, 1
|
|
END IF
|
|
IF check = 236 THEN 'Magic scroll
|
|
PCSound 3
|
|
score = score + 100
|
|
scroll = 1
|
|
Quicksand 0
|
|
COLOR 3, 0
|
|
LOCATE 42, 22: PRINT "Scroll:" + LTRIM$(STR$(scroll));
|
|
COLOR 3, 1
|
|
IF cave MOD 3 = 0 THEN MoveBM
|
|
END IF
|
|
IF check = 250 THEN TheEnd 'Magic wall around scroll
|
|
|
|
IF death = 1 THEN EXIT SUB
|
|
IF cr = 1 THEN COLOR 14 ELSE COLOR 13
|
|
LOCATE y, x: PRINT CHR$(2)
|
|
IF stone = 0 AND cave MOD 3 <> 0 THEN MoveLRM
|
|
|
|
END SUB
|
|
|
|
SUB MoveLGM STATIC
|
|
|
|
DIM y(10), x(10), oldy(10), oldx(10), mdoor(10)
|
|
|
|
COLOR 10
|
|
IF newcave THEN
|
|
FOR i = 1 TO lgmonsters 'The initial positions of the light green
|
|
DO 'monsters that move towards the magic door.
|
|
SELECT CASE rq1
|
|
CASE 1: y(i) = RandomInt(2, 20): x(i) = RandomInt(2, 20)
|
|
CASE 2: y(i) = RandomInt(21, 39): x(i) = RandomInt(2, 20)
|
|
CASE 3: y(i) = RandomInt(2, 20): x(i) = RandomInt(21, 39)
|
|
CASE 4: y(i) = RandomInt(21, 39): x(i) = RandomInt(21, 39)
|
|
END SELECT
|
|
IF SCREEN(y(i), x(i)) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE y(i), x(i): PRINT CHR$(234)
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
mdoor(i) = 0
|
|
NEXT i
|
|
EXIT SUB
|
|
END IF
|
|
|
|
FOR i = 1 TO lgmonsters
|
|
IF y(i) = gy AND x(i) = gx THEN 'A grenade hit you
|
|
y(i) = 0: x(i) = 0
|
|
EXIT SUB
|
|
END IF
|
|
NEXT i
|
|
|
|
'The movements of the light green monsters
|
|
FOR i = 1 TO lgmonsters
|
|
IF y(i) <> 0 AND x(i) <> 0 THEN
|
|
left = SCREEN(y(i), x(i) - 1) 'Look for possible directions
|
|
right = SCREEN(y(i), x(i) + 1)
|
|
up = SCREEN(y(i) - 1, x(i))
|
|
down = SCREEN(y(i) + 1, x(i))
|
|
IF left = 88 OR right = 88 OR up = 88 OR down = 88 THEN mdoor(i) = 1
|
|
IF left = 32 OR left = 2 THEN left = 0
|
|
IF right = 32 OR right = 2 THEN right = 0
|
|
IF up = 32 OR up = 2 THEN up = 0
|
|
IF down = 32 OR down = 2 THEN down = 0
|
|
rn = RandomInt(1, 4) 'Try to pick a direction towards the magic door
|
|
IF rn = 1 AND left = 0 AND x(i) > dx THEN x(i) = x(i) - 1
|
|
IF rn = 2 AND right = 0 AND x(i) < dx THEN x(i) = x(i) + 1
|
|
IF rn = 3 AND up = 0 AND y(i) > dy THEN y(i) = y(i) - 1
|
|
IF rn = 4 AND down = 0 AND y(i) < dy THEN y(i) = y(i) + 1
|
|
IF y(i) = oldy(i) AND x(i) = oldx(i) AND mdoor(i) = 0 THEN 'If you
|
|
IF RND > .7 THEN 'didn't pick a
|
|
rn = RandomInt(1, 4) 'direction already
|
|
IF rn = 1 AND left = 0 THEN x(i) = x(i) - 1 'and you're not at
|
|
IF rn = 2 AND right = 0 THEN x(i) = x(i) + 1 'the magic door,
|
|
IF rn = 3 AND up = 0 THEN y(i) = y(i) - 1 'then pick a random
|
|
IF rn = 4 AND down = 0 THEN y(i) = y(i) + 1 'direction or no
|
|
END IF 'direction at all.
|
|
END IF
|
|
IF y(i) <> oldy(i) OR x(i) <> oldx(i) THEN
|
|
LOCATE oldy(i), oldx(i): PRINT " " 'Erase old position
|
|
LOCATE y(i), x(i): PRINT CHR$(234) 'Move to new position
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
END IF
|
|
IF y(i) = y AND x(i) = x THEN TheEnd: EXIT SUB 'You got cave raider
|
|
END IF
|
|
NEXT i
|
|
|
|
tlgm! = TIMER
|
|
|
|
END SUB
|
|
|
|
SUB MoveLRM STATIC
|
|
|
|
DIM y(10), x(10), oldy(10), oldx(10)
|
|
|
|
COLOR 12
|
|
IF newcave THEN
|
|
FOR i = 1 TO lrmonsters 'The initial positions of the light red
|
|
DO 'monsters that hunt the cave raider.
|
|
SELECT CASE rq2
|
|
CASE 1: y(i) = RandomInt(2, 20): x(i) = RandomInt(2, 20)
|
|
CASE 2: y(i) = RandomInt(21, 39): x(i) = RandomInt(2, 20)
|
|
CASE 3: y(i) = RandomInt(2, 20): x(i) = RandomInt(21, 39)
|
|
CASE 4: y(i) = RandomInt(21, 39): x(i) = RandomInt(21, 39)
|
|
END SELECT
|
|
IF SCREEN(y(i), x(i)) = 32 THEN EXIT DO
|
|
LOOP
|
|
LOCATE y(i), x(i): PRINT CHR$(234)
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
NEXT i
|
|
EXIT SUB
|
|
END IF
|
|
|
|
FOR i = 1 TO lrmonsters
|
|
IF y(i) = gy AND x(i) = gx THEN 'A grenade hit you
|
|
y(i) = 0: x(i) = 0
|
|
EXIT SUB
|
|
END IF
|
|
NEXT i
|
|
|
|
'The movements of the light red monsters
|
|
FOR i = 1 TO lrmonsters
|
|
IF y(i) <> 0 AND x(i) <> 0 THEN
|
|
left = SCREEN(y(i), x(i) - 1) 'Look for possible directions
|
|
right = SCREEN(y(i), x(i) + 1)
|
|
up = SCREEN(y(i) - 1, x(i))
|
|
down = SCREEN(y(i) + 1, x(i))
|
|
IF left = 32 OR left = 2 THEN left = 0
|
|
IF right = 32 OR right = 2 THEN right = 0
|
|
IF up = 32 OR up = 2 THEN up = 0
|
|
IF down = 32 OR down = 2 THEN down = 0
|
|
FOR try = 1 TO 2 'Try to pick a direction towards cave raider
|
|
IF y(i) < y OR y(i) > y THEN
|
|
IF RND > .7 THEN
|
|
IF left = 0 AND x(i) > x THEN x(i) = x(i) - 1: EXIT FOR
|
|
IF right = 0 AND x(i) < x THEN x(i) = x(i) + 1: EXIT FOR
|
|
ELSE
|
|
IF up = 0 AND y(i) > y THEN y(i) = y(i) - 1: EXIT FOR
|
|
IF down = 0 AND y(i) < y THEN y(i) = y(i) + 1: EXIT FOR
|
|
END IF
|
|
ELSE
|
|
IF left = 0 AND x(i) > x THEN x(i) = x(i) - 1: EXIT FOR
|
|
IF right = 0 AND x(i) < x THEN x(i) = x(i) + 1: EXIT FOR
|
|
END IF
|
|
NEXT try
|
|
IF y(i) = oldy(i) AND x(i) = oldx(i) THEN 'If you didn't pick a
|
|
FOR try = 1 TO 8 'direction already,
|
|
rn = RandomInt(1, 4) 'then try to pick a
|
|
IF rn = 1 AND left = 0 THEN x(i) = x(i) - 1: EXIT FOR 'random
|
|
IF rn = 2 AND right = 0 THEN x(i) = x(i) + 1: EXIT FOR 'direction.
|
|
IF rn = 3 AND up = 0 THEN y(i) = y(i) - 1: EXIT FOR
|
|
IF rn = 4 AND down = 0 THEN y(i) = y(i) + 1: EXIT FOR
|
|
NEXT try
|
|
END IF
|
|
IF y(i) <> oldy(i) OR x(i) <> oldx(i) THEN
|
|
LOCATE oldy(i), oldx(i): PRINT " " 'Erase old position
|
|
LOCATE y(i), x(i): PRINT CHR$(234) 'Move to new position
|
|
oldy(i) = y(i): oldx(i) = x(i)
|
|
END IF
|
|
IF y(i) = y AND x(i) = x THEN TheEnd: EXIT SUB 'You got cave raider
|
|
END IF
|
|
NEXT i
|
|
|
|
tlrm! = TIMER
|
|
|
|
END SUB
|
|
|
|
SUB NewPositions
|
|
|
|
'Checks the TIMER and calls "MoveLGM/MoveLRM/MoveBM" as well as "Quicksand"
|
|
IF cave MOD 3 <> 0 THEN
|
|
IF ABS(TIMER - tlgm!) >= .8 THEN MoveLGM
|
|
IF stone = 1 AND ABS(TIMER - ts!) >= 3 THEN PALETTE 12, 60: stone = 0
|
|
IF stone = 0 AND ABS(TIMER - tlrm!) >= 2 THEN MoveLRM
|
|
ELSEIF scroll = 0 THEN
|
|
IF stone = 1 AND ABS(TIMER - ts!) >= 3 THEN PALETTE 12, 0: stone = 0
|
|
IF stone = 0 AND ABS(TIMER - tbm!) >= .25 THEN MoveBM
|
|
END IF
|
|
IF scroll = 0 THEN
|
|
IF ABS(TIMER - tq!) >= 3 THEN LOCATE sy, sx: COLOR 27: PRINT CHR$(236)
|
|
IF ABS(TIMER - tq!) >= 4 THEN
|
|
Quicksand 20
|
|
tq! = TIMER
|
|
LOCATE sy, sx: COLOR 11: PRINT CHR$(236)
|
|
END IF
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB NextCave
|
|
|
|
COLOR 8, 0
|
|
IF cave = 1 THEN
|
|
FOR row = 1 TO 43: LOCATE row, 1: PRINT STRING$(40, 170); : NEXT row
|
|
FOR row = 10 TO 35: LOCATE row, 11: PRINT STRING$(20, 177): NEXT row
|
|
FOR row = 11 TO 34: LOCATE row, 12: PRINT SPACE$(18): NEXT row
|
|
COLOR 7
|
|
Center 12, "You are about to"
|
|
Center 14, "raid a dangerous"
|
|
Center 16, "cave system. "
|
|
Center 18, "Fame and riches "
|
|
Center 20, "lie before you. "
|
|
COLOR 3
|
|
Center 24, "What's your "
|
|
Center 26, "name? "
|
|
COLOR 7
|
|
LOCATE 26, 19: PRINT "........"
|
|
crname$ = "": column = 19
|
|
DO
|
|
name$ = INKEY$
|
|
IF name$ <> "" AND name$ <> CHR$(8) AND name$ <> CHR$(13) THEN
|
|
SELECT CASE ASC(name$)
|
|
CASE 32: letter = 1
|
|
CASE 65 TO 90: letter = 1
|
|
CASE 97 TO 122: letter = 1
|
|
CASE ELSE
|
|
END SELECT
|
|
IF letter = 1 THEN
|
|
LOCATE 26, column: COLOR 7: PRINT name$: column = column + 1
|
|
LOCATE 26, column: COLOR 23: PRINT "_"
|
|
crname$ = crname$ + name$
|
|
letter = 0
|
|
END IF
|
|
END IF
|
|
IF name$ = CHR$(8) THEN
|
|
IF column > 19 THEN
|
|
LOCATE 26, column: COLOR 7: PRINT "."
|
|
column = column - 1
|
|
LOCATE 26, column: COLOR 23: PRINT "_"
|
|
l = LEN(crname$) - 1
|
|
crname$ = MID$(crname$, 1, l)
|
|
END IF
|
|
END IF
|
|
IF name$ = CHR$(13) THEN
|
|
crname$ = crname$ + SPACE$(8 - LEN(crname$))
|
|
LOCATE 26, 19: COLOR 7: PRINT crname$
|
|
EXIT DO
|
|
END IF
|
|
IF LEN(crname$) = 8 THEN LOCATE 26, 27: PRINT " ": EXIT DO
|
|
LOOP
|
|
IF LEN(LTRIM$(crname$)) = 0 THEN crname$ = "........"
|
|
LOCATE 30, 14: COLOR 7: PRINT "Here's"
|
|
LOCATE 30, 21: COLOR 3: PRINT "Cave:1"
|
|
COLOR 15: Center 33, "Good luck!"
|
|
LOCATE 33, 25: COLOR 31: PRINT "!"
|
|
ELSE
|
|
FOR row = 1 TO 43: LOCATE row, 1: PRINT STRING$(40, 170); : NEXT row
|
|
FOR row = 10 TO 35: LOCATE row, 11: PRINT STRING$(20, 177): NEXT row
|
|
FOR row = 11 TO 34: LOCATE row, 12: PRINT SPACE$(18): NEXT row
|
|
COLOR 7
|
|
Center 12, "You're standing "
|
|
Center 14, "at the entrance "
|
|
Center 16, "of "
|
|
LOCATE 16, 16: COLOR 3: PRINT "Cave:" + LTRIM$(STR$(cave))
|
|
COLOR 7: Center 20, "Your current "
|
|
COLOR 3: Center 22, "Score:" + LTRIM$(STR$(score))
|
|
COLOR 7
|
|
Center 26, "You're ready to "
|
|
Center 28, "go on. "
|
|
COLOR 8: Center 33, "Press any key"
|
|
LOCATE 33, 27: COLOR 24: PRINT "_"
|
|
END IF
|
|
|
|
Delay 0
|
|
CLS
|
|
Delay .5
|
|
|
|
END SUB
|
|
|
|
SUB Options
|
|
|
|
PCOPY 0, 1
|
|
SCREEN 0, , 1, 1
|
|
COLOR 3, 0
|
|
FOR row = 26 TO 38: LOCATE row, 14: PRINT SPACE$(14): NEXT row
|
|
Center 27, "Options"
|
|
Center 28, "-------"
|
|
|
|
COLOR 7
|
|
IF cr = 1 THEN
|
|
Center 30, "1) CR:Male "
|
|
ELSE
|
|
Center 30, "1) CR:Female"
|
|
END IF
|
|
IF ds = 2 THEN
|
|
Center 32, "2) DS:Normal"
|
|
ELSEIF ds = 3 THEN
|
|
Center 32, "2) DS:Hard "
|
|
ELSEIF ds = 1 THEN
|
|
Center 32, "2) DS:Easy "
|
|
END IF
|
|
IF speaker = 1 THEN
|
|
Center 34, "3) Sound on "
|
|
ELSE
|
|
Center 34, "3) Sound off"
|
|
END IF
|
|
COLOR 8: Center 36, "Esc to quit "
|
|
LOCATE 36, 26: COLOR 24: PRINT "_"
|
|
|
|
COLOR 7
|
|
DO
|
|
o$ = INKEY$
|
|
SELECT CASE o$
|
|
CASE "1"
|
|
IF cr = 1 THEN
|
|
Center 30, "1) CR:Female"
|
|
cr = 2
|
|
ELSE
|
|
Center 30, "1) CR:Male "
|
|
cr = 1
|
|
END IF
|
|
change = 1
|
|
CASE "2"
|
|
IF ds = 2 THEN
|
|
Center 32, "2) DS:Hard "
|
|
ds = 3
|
|
ELSEIF ds = 3 THEN
|
|
Center 32, "2) DS:Easy "
|
|
ds = 1
|
|
ELSEIF ds = 1 THEN
|
|
Center 32, "2) DS:Normal"
|
|
ds = 2
|
|
END IF
|
|
change = 1
|
|
CASE "3"
|
|
IF speaker = 1 THEN
|
|
Center 34, "3) Sound off"
|
|
speaker = 0
|
|
ELSE
|
|
Center 34, "3) Sound on "
|
|
speaker = 1
|
|
END IF
|
|
change = 1
|
|
CASE CHR$(27)
|
|
IF change = 1 THEN
|
|
COLOR 8: Center 36, "Save (Y/N) "
|
|
LOCATE 36, 25: COLOR 24: PRINT "_"
|
|
DO
|
|
s$ = UCASE$(INKEY$)
|
|
IF s$ = "N" THEN EXIT DO
|
|
IF s$ = "Y" THEN
|
|
ON ERROR GOTO FileError
|
|
OPEN "cr.dat" FOR BINARY AS #1
|
|
PUT #1, 5, cr
|
|
PUT #1, 9, ds
|
|
PUT #1, 13, speaker
|
|
CLOSE #1
|
|
ON ERROR GOTO 0
|
|
EXIT DO
|
|
END IF
|
|
LOOP
|
|
END IF
|
|
EXIT DO
|
|
CASE ELSE
|
|
END SELECT
|
|
LOOP
|
|
|
|
END SUB
|
|
|
|
SUB Pause
|
|
|
|
QuickStop
|
|
IF cr = 1 THEN COLOR 30 ELSE COLOR 29
|
|
LOCATE y, x: PRINT CHR$(2)
|
|
COLOR 7, 0
|
|
LOCATE 43, 1: PRINT SPACE$(40);
|
|
Center 43, "The game is paused."
|
|
PCOPY 1, 0
|
|
SLEEP
|
|
SetTimers
|
|
SetSound 1
|
|
IF cr = 1 THEN COLOR 14 ELSE COLOR 13
|
|
LOCATE y, x: PRINT CHR$(2)
|
|
|
|
END SUB
|
|
|
|
SUB PCSound (number)
|
|
|
|
IF speaker = 0 THEN EXIT SUB
|
|
|
|
SELECT CASE number
|
|
CASE 1 'Treasure
|
|
PLAY "mlt80o4l64ce"
|
|
CASE 2 'Chest of grenades
|
|
PLAY "mst120o1l16cl8mlc"
|
|
CASE 3 'Gem/scroll
|
|
PLAY "mlt250o4l64agagag>egg>g"
|
|
CASE 4 'Male CR
|
|
FOR n! = 10.8 TO 8 STEP -.1: SOUND (TAN(n!) + 50) * 25, .5: NEXT n!
|
|
CASE 5 'Female CR
|
|
FOR n! = 10.8 TO 8 STEP -.1: SOUND (TAN(n!) + 50) * 28, .5: NEXT n!
|
|
CASE 6 'Magic wall
|
|
PLAY "mnt180o4l64ed<dc<c<l32f"
|
|
CASE 7 'Grenade launcher
|
|
PLAY "mnt255o1l32ccc"
|
|
CASE 8 'Explosion
|
|
PLAY "mlt255o0l32gbagbagbagbagbabg"
|
|
CASE 9 'Magic
|
|
PLAY "mst255o3l16cdcdg"
|
|
CASE 10 'Rock
|
|
PLAY "mlt255o0l32bagfedc"
|
|
CASE 11 'Exit cave 1-5
|
|
PLAY "mst100o3l16cdel8gp64l16el4mlg"
|
|
CASE 12 'Exit cave 6
|
|
PLAY "mst255o3l4dl8ddl4dl8ddl2mlg"
|
|
CASE 13 'Hall of Fame
|
|
FOR tune = 1 TO 1
|
|
PLAY "mnt190o2l2al4fgafgal2a#l4gaa#gaa#"
|
|
Delay -5: IF dkey$ <> "" THEN EXIT FOR
|
|
PLAY "l2>cl4d.l8<al4aa#fgl2al4gfl1>cl2<a"
|
|
Delay -5: IF dkey$ <> "" THEN EXIT FOR
|
|
PLAY "l4fgafgal2a#l4gaa#gaa#l2>cl4d.l8<a"
|
|
Delay -6: IF dkey$ <> "" THEN EXIT FOR
|
|
PLAY "l4aa#fga>c<a.l8gl1mlf"
|
|
Delay -5
|
|
NEXT tune
|
|
END SELECT
|
|
|
|
END SUB
|
|
|
|
SUB Quicksand (fields) STATIC
|
|
|
|
DIM fieldq(2 TO 39, 2 TO 39)
|
|
|
|
'Erase the magic fields of quicksand and reset the array,
|
|
'or simply reset the array.
|
|
FOR fqy = 2 TO 39
|
|
FOR fqx = 2 TO 39
|
|
IF fieldq(fqy, fqx) = 1 THEN
|
|
IF fields <> -1 THEN LOCATE fqy, fqx: COLOR 7, 1: PRINT " ";
|
|
fieldq(fqy, fqx) = 0
|
|
END IF
|
|
NEXT fqx
|
|
NEXT fqy
|
|
|
|
'Put new fields of quicksand randomly around the magic scroll
|
|
IF fields > 0 THEN
|
|
COLOR 6
|
|
FOR n = 1 TO fields
|
|
DO
|
|
fqx = RandomInt(sx - 5, sx + 5)
|
|
fqy = RandomInt(sy - 5, sy + 5)
|
|
IF fqx >= 2 AND fqx <= 39 AND fqy >= 2 AND fqy <= 39 THEN
|
|
IF SCREEN(fqy, fqx) = 32 THEN EXIT DO
|
|
counter = counter + 1
|
|
IF counter > 10 THEN EXIT DO
|
|
END IF
|
|
LOOP
|
|
IF counter <= 10 THEN
|
|
LOCATE fqy, fqx: PRINT CHR$(247)
|
|
fieldq(fqy, fqx) = 1
|
|
END IF
|
|
counter = 0
|
|
NEXT n
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB QuickStop
|
|
|
|
'If the scroll is blinking, stop it
|
|
IF scroll = 0 THEN LOCATE sy, sx: COLOR 11: PRINT CHR$(236)
|
|
|
|
'If there's an explosion, stop it
|
|
IF explode = 1 THEN xcounter = 9: Explosion
|
|
|
|
'Start the timer for the break
|
|
tb! = TIMER
|
|
|
|
END SUB
|
|
|
|
FUNCTION RandomInt (low, high)
|
|
|
|
RandomInt = INT(RND * (high - low + 1)) + low
|
|
|
|
END FUNCTION
|
|
|
|
SUB SetSound (number)
|
|
|
|
IF number = 1 THEN
|
|
COLOR 7, 0
|
|
LOCATE 43, 1: PRINT SPACE$(40);
|
|
IF speaker = 1 THEN
|
|
Center 43, "S)ound off P)ause H)elp Q)uit"
|
|
ELSE
|
|
Center 43, " S)ound on P)ause H)elp Q)uit"
|
|
END IF
|
|
COLOR 7, 1
|
|
PCOPY 1, 0
|
|
ELSE
|
|
COLOR 7, 0
|
|
IF speaker = 1 THEN
|
|
speaker = 0
|
|
Center 43, " S)ound on P)ause H)elp Q)uit"
|
|
ELSE
|
|
speaker = 1
|
|
Center 43, "S)ound off P)ause H)elp Q)uit"
|
|
END IF
|
|
COLOR 7, 1
|
|
PCOPY 1, 0
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB SetTimers
|
|
|
|
'Monsters
|
|
tlgm! = TIMER
|
|
tlrm! = TIMER
|
|
tbm! = TIMER
|
|
|
|
'Quicksand
|
|
tq! = tq! + ABS(TIMER - tb!)
|
|
|
|
'Magic
|
|
IF stone = 1 THEN ts! = ts! + ABS(TIMER - tb!)
|
|
|
|
END SUB
|
|
|
|
SUB Story
|
|
|
|
SCREEN 0, , 1, 1
|
|
COLOR 8, 0
|
|
FOR row = 1 TO 43: LOCATE row, 1: PRINT STRING$(40, 242); : NEXT row
|
|
FOR row = 3 TO 41: LOCATE row, 9: PRINT STRING$(24, 177): NEXT row
|
|
FOR row = 4 TO 40: LOCATE row, 10: PRINT SPACE$(22): NEXT row
|
|
COLOR 3
|
|
Center 5, "Cave Raider"
|
|
Center 6, "-----------"
|
|
|
|
COLOR 7
|
|
Center 8, "You are a young man "
|
|
Center 10, "( ) or his young "
|
|
Center 12, "girlfriend ( ). You "
|
|
Center 14, "both live in a small"
|
|
Center 16, "cave near the Rocky "
|
|
Center 18, "Mountains and don't "
|
|
Center 20, "mind that people "
|
|
Center 22, "think you are a "
|
|
Center 24, "little bit strange. "
|
|
Center 26, "You always tell "
|
|
Center 28, "visitors that you "
|
|
Center 30, "work for the state "
|
|
Center 32, "and explore caves. "
|
|
Center 34, "In reality, however,"
|
|
Center 36, "each of you is a "
|
|
LOCATE 10, 12: COLOR 14: PRINT CHR$(2)
|
|
LOCATE 12, 23: COLOR 13: PRINT CHR$(2)
|
|
COLOR 8
|
|
Center 39, "Press any key (1/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "skilled cave raider."
|
|
Center 10, "Your home is full of"
|
|
Center 12, "objects from various"
|
|
Center 14, "caves, but none of "
|
|
Center 16, "them is worth a lot "
|
|
Center 18, "of money. Therefore,"
|
|
Center 20, "you're both nearly "
|
|
Center 22, "broke. One morning, "
|
|
Center 24, "you read the "
|
|
Center 26, "following short "
|
|
Center 28, "article in the local"
|
|
Center 30, "newspaper: "
|
|
Center 32, " "
|
|
Center 34, "''Great Discovery in"
|
|
Center 36, "the Rocky Mountains!"
|
|
COLOR 8
|
|
Center 39, "Press any key (2/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "Yesterday, a film "
|
|
Center 10, "crew of 20 people "
|
|
Center 12, "found an underground"
|
|
Center 14, "cave system right "
|
|
Center 16, "next to the place "
|
|
Center 18, "where a small meteor"
|
|
Center 20, "allegedly hit the "
|
|
Center 22, "ground a few days "
|
|
Center 24, "ago. 15 people "
|
|
Center 26, "entered the cave "
|
|
Center 28, "system and never "
|
|
Center 30, "returned. The other "
|
|
Center 32, "5 people went back "
|
|
Center 34, "home, informed the "
|
|
Center 36, "police and showed "
|
|
COLOR 8
|
|
Center 39, "Press any key (3/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "some reporters the "
|
|
Center 10, "big piece of gold "
|
|
Center 12, "that lay in front of"
|
|
Center 14, "the cave system. Now"
|
|
Center 16, "the military is "
|
|
Center 18, "guarding the entire "
|
|
Center 20, "area and making "
|
|
Center 22, "investigations.'' "
|
|
Center 24, " "
|
|
Center 26, "Both of you are "
|
|
Center 28, "skeptical at first, "
|
|
Center 30, "but after you watch "
|
|
Center 32, "a report about this "
|
|
Center 34, "discovery on TV, all"
|
|
Center 36, "your doubts are "
|
|
COLOR 8
|
|
Center 39, "Press any key (4/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "gone. You're eager "
|
|
Center 10, "to raid these caves"
|
|
Center 12, "as soon as possible."
|
|
Center 14, "With the little "
|
|
Center 16, "money that is left, "
|
|
Center 18, "you drive to the "
|
|
Center 20, "city to buy some "
|
|
Center 22, "grenades for your "
|
|
Center 24, "grenade launcher. "
|
|
Center 26, "It's not only your "
|
|
Center 28, "favorite weapon but "
|
|
Center 30, "also very useful for"
|
|
Center 32, "blowing up big "
|
|
Center 34, "rocks. On your way "
|
|
Center 36, "home, you decide to "
|
|
COLOR 8
|
|
Center 39, "Press any key (5/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
IF dkey$ = CHR$(27) THEN EXIT SUB
|
|
|
|
COLOR 7
|
|
Center 8, "raid the cave system"
|
|
Center 10, "in the middle of the"
|
|
Center 12, "night to avoid any "
|
|
Center 14, "contact with the "
|
|
Center 16, "military. Secretly, "
|
|
Center 18, "however, both of you"
|
|
Center 20, "have made plans to "
|
|
Center 22, "try it on your own. "
|
|
Center 24, "At dusk, one of you "
|
|
Center 26, "grabs the grenade "
|
|
Center 28, "launcher and sets "
|
|
Center 30, "out. "
|
|
FOR row = 32 TO 36
|
|
LOCATE row, 11: PRINT SPACE$(20)
|
|
NEXT row
|
|
COLOR 8
|
|
Center 39, "Press any key (6/6)"
|
|
LOCATE 39, 24: COLOR 24: PRINT "_"
|
|
|
|
Delay 0
|
|
|
|
END SUB
|
|
|
|
SUB TextBlink
|
|
|
|
'MainMenu
|
|
IF (TIMER * 100) MOD 6 = 0 THEN COLOR 7 ELSE COLOR 15
|
|
|
|
END SUB
|
|
|
|
SUB TheEnd
|
|
|
|
QuickStop
|
|
COLOR 3, 0
|
|
LOCATE 41, 2: PRINT "Health:0 ";
|
|
COLOR 15, 1
|
|
LOCATE dy, dx: PRINT "X"
|
|
IF SCREEN(gy, gx) = 249 THEN LOCATE gy, gx: PRINT " "
|
|
|
|
check = SCREEN(y, x)
|
|
IF check <> 32 AND check <> 42 AND check <> 2 THEN IF cr = 1 THEN PCSound 4 ELSE PCSound 5
|
|
SELECT CASE check
|
|
CASE 234 'Monster
|
|
check = SCREEN(y, x, 1)
|
|
IF check = 26 THEN
|
|
COLOR 10, 4
|
|
ELSE
|
|
COLOR 12, 4
|
|
IF cave MOD 3 <> 0 THEN PALETTE 12, 60 ELSE PALETTE 12, 0
|
|
END IF
|
|
LOCATE y, x: PRINT CHR$(234)
|
|
CASE 247 'Quicksand
|
|
CASE 32, 42, 2 '"Explosion" or "grenade"
|
|
IF check = 2 THEN PCSound 8
|
|
LOCATE y, x: COLOR 14: PRINT CHR$(15): PCOPY 1, 0: Delay .2
|
|
LOCATE y, x: COLOR 4: PRINT CHR$(15): PCOPY 1, 0: Delay .2
|
|
LOCATE y, x: PRINT " "
|
|
CASE ELSE 'Rock, magic door or magic wall around scroll
|
|
PCOPY 1, 0
|
|
Delay .5
|
|
LOCATE oldy, oldx: COLOR 4: PRINT CHR$(2)
|
|
END SELECT
|
|
PCOPY 1, 0
|
|
|
|
Delay 2
|
|
SCREEN 0, , 0, 0
|
|
|
|
EndScreen
|
|
Highscore
|
|
|
|
SetTimers
|
|
cave = 1
|
|
oldcave = cave
|
|
score = 0
|
|
death = 1
|
|
|
|
END SUB
|
|
|