'===========================================================================
' Subject: GOLD MINE (SHOOTER)                Date: 06-23-00 (09:21)       
'  Author: John Wantland                      Code: MINE.BAS               
'  Origin: geekerman@hotmail.com            Packet: GAMES.ABC
'===========================================================================
' Gold Mine
' by John Wantland
' 06/22/2000
'
' This is a simple and very fun arcade game.
' As with most of my programs, the code is
' extremely sloppy and completely undocumented.
' I'm very sorry for this.  I would like to
' thank Merlin N. Null for his SQUAWK program
' whose sound effects I stole(borrowed) for this
' game.

RANDOMIZE TIMER
SCREEN 7, , 1, 0: CLS
DEFINT A-Y
px = 155
py = 100
d = 1
num = 29
level = 5
par = 50
tim = 0
life = 3
score = 0
money = 50

DIM eh(num)
DIM es(num)
DIM ea(num)
DIM ef(num)
DIM ebx(num)
DIM pax(par)
DIM pay(par)
DIM pxs(par)
DIM pys(par)
DIM pa(par)
DIM co(par)
DIM coinx(money)
DIM coiny(money)
DIM coins(money)
DIM gun(1 TO 22)
DIM gun2(1 TO 22)
DIM egun(1 TO 22)
DIM eleft(1 TO 22)
DIM eright(1 TO 22)
DIM coin(1 TO 18)

FOR y = 1 TO 5
FOR x = 1 TO 9
READ n: PSET (x, y), n
NEXT x
NEXT y
GET (1, 1)-(9, 5), gun
CLS
GET (1, 1)-(9, 5), egun

FOR y = 1 TO 5
FOR x = 1 TO 9
READ n: PSET (x, y), n
NEXT x
NEXT y
GET (1, 1)-(9, 5), gun2
CLS

FOR y = 1 TO 5
FOR x = 1 TO 9
READ n: PSET (x, y), n
NEXT x
NEXT y
GET (1, 1)-(9, 5), eright
CLS

FOR y = 1 TO 5
FOR x = 1 TO 9
READ n: PSET (x, y), n
NEXT x
NEXT y
GET (1, 1)-(9, 5), eleft
CLS

FOR y = 1 TO 8
FOR x = 1 TO 6
READ n: PSET (x, y), n
NEXT x
NEXT y
GET (1, 1)-(6, 8), coin
CLS

DO
LOCATE 9, 17: PRINT "Gold Mine"
LOCATE 12, 13: PRINT "Enter: Start game"
LOCATE 14, 18: PRINT "H: Help"
PCOPY 1, 0
a$ = INKEY$
IF LCASE$(a$) = "h" THEN GOSUB help
LOOP UNTIL a$ = CHR$(13)

GOSUB new:

FOR i = 0 TO par
pa(i) = 0
NEXT

DO
LOCATE 1, 1: PRINT "Lives:"; life
LOCATE 1, 29: PRINT "Score:"; score
LOCATE 1, 16: PRINT "Level"; level - 4
z = TIMER
DEF SEG = 0: POKE &H41A, PEEK(&H41C)
PUT (px, py), egun, PSET
FOR i = 0 TO level - 1
IF ef(i) = 1 THEN PSET (ebx(i), eh(i) + 2), 0
IF es(i) = 1 AND ea(i) = 1 THEN PUT (0, eh(i)), egun, PSET
IF es(i) = 2 AND ea(i) = 1 THEN PUT (311, eh(i)), egun, PSET
IF INT(RND * 100 + 1) = 50 AND ef(i) = 0 AND ea(i) = 1 THEN ef(i) = 1: GOSUB shoot
IF ef(i) = 1 THEN GOSUB efire:
IF fx <= 16 AND fy >= eh(i) - 1 AND fy <= eh(i) + 6 AND es(i) = 1 AND ea(i) = 1 THEN ea(i) = 0: left = left - 1: score = score + 10: GOSUB explode
IF fx >= 303 AND fy >= eh(i) - 1 AND fy <= eh(i) + 6 AND es(i) = 2 AND ea(i) = 1 THEN ea(i) = 0: left = left - 1: score = score + 10: GOSUB explode
IF es(i) = 1 AND ea(i) = 1 THEN PUT (0, eh(i)), eleft, PSET
IF es(i) = 2 AND ea(i) = 1 THEN PUT (311, eh(i)), eright, PSET
IF ef(i) = 1 THEN PSET (ebx(i), eh(i) + 2), 4
NEXT
a = INP(&H60)
IF a = 72 AND py > 5 THEN py = py - 5
IF a = 80 AND py < 185 THEN py = py + 5
IF a = 75 THEN d = 1: px = 155
IF a = 77 THEN d = 2: px = 159
IF a = 57 AND fire <> 1 THEN fire = 1: fx = px: fy = py + 2: fd = d: IF PLAY(0) = 0 THEN PLAY "MBT255L64MLO4BAGFEDC<BAGFEDEC<BAGFEDC<BAGFEDC<BAGFEDC"
IF a = 1 THEN GOTO gameover
IF fire = 1 THEN GOSUB bullet
IF d = 1 THEN PUT (px, py), gun, PSET ELSE PUT (px, py), gun2, PSET
LINE (161, 0)-(161, py - 1), 6
IF tim > 0 THEN GOSUB particle
PCOPY 1, 0
GOSUB delay
IF left = 0 THEN level = level + 1: GOSUB new
LOOP

bullet:
PSET (fx, fy), 0
IF fd = 1 AND fx > 1 THEN fx = fx - 8
IF fd = 2 AND fx < 318 THEN fx = fx + 8
IF fx <= 5 OR fx >= 315 THEN fx = 0: fy = 0: fire = 0: RETURN
PSET (fx, fy), 4
RETURN

efire:
IF es(i) = 1 THEN ebx(i) = ebx(i) + 8 ELSE ebx(i) = ebx(i) - 8
IF ebx(i) <= 157 AND ebx(i) >= 153 AND eh(i) + 2 >= py AND eh(i) + 2 <= py + 5 THEN GOSUB hit:
IF ebx(i) <= 0 OR ebx(i) >= 319 THEN ef(i) = 0
RETURN

hit:
CLS
FOR t = 0 TO level - 1
ef(t) = 0
NEXT t
fire = 0
GOSUB explode2:
py = 100
life = life - 1: IF life <= 0 THEN GOTO gameover
RETURN

explode:
IF score MOD 500 = 0 THEN life = life + 1
IF PLAY(0) = 0 THEN PLAY "MBT255L64O4CDEFGABO3CDEFGABO2CDEFGAB"
tim = 10
FOR pp = 0 TO par
IF es(i) = 1 THEN pax(pp) = 3 ELSE pax(pp) = 317
pay(pp) = eh(i)
pxs(pp) = INT(RND * 10) - 5
pys(pp) = INT(RND * 10) - 5
co(pp) = INT(RND * 15) + 1
pa(pp) = 1
NEXT pp
RETURN

explode2:
IF score MOD 500 = 0 THEN life = life + 1
IF PLAY(0) = 0 THEN PLAY "MBT255L64O4CDEFGABO3CDEFGABO2CDEFGAB"
tim = 10
FOR pp = 0 TO par
pax(pp) = px + 3
pay(pp) = py + 3
pxs(pp) = INT(RND * 10) - 5
pys(pp) = INT(RND * 10) - 5
co(pp) = INT(RND * 15) + 1
pa(pp) = 1
NEXT pp
RETURN

particle:
tim = tim - 1
IF tim = 0 THEN GOSUB clea:
FOR pp = 0 TO par
IF pa(pp) = 0 THEN GOTO skippar:
PSET (pax(pp), pay(pp)), 0
pax(pp) = pax(pp) + pxs(pp)
pay(pp) = pay(pp) + pys(pp)
IF pax(pp) > 319 OR pax(pp) < 0 OR pay(pp) > 199 OR pay(pp) < 0 THEN pa(pp) = 0
IF pa(pp) = 1 THEN PSET (pax(pp), pay(pp)), co(pp)
skippar:
NEXT pp
RETURN

clea:
FOR pp = 0 TO par
IF pa(pp) = 1 THEN PSET (pax(pp), pay(pp)), 0
pa(pp) = 0
NEXT pp
RETURN

new:
IF level > num THEN GOTO win
left = level
FOR i = 0 TO level - 1
taken: eh(i) = INT(RND * 175) + 10
es(i) = INT(RND * 2) + 1
take = 0
FOR q = 0 TO i
IF es(i) = es(q) AND ((eh(i) + 6 >= eh(q) - 1 AND eh(i) + 6 <= eh(q) + 6) OR (eh(i) - 1 <= eh(q) + 6 AND eh(i) - 1 >= eh(q) - 1)) AND i <> q THEN take = 1
NEXT q
IF take = 1 THEN GOTO taken:
ea(i) = 1
ef(i) = 0
NEXT
CLS
LOCATE 10, 17: PRINT "Level"; level - 4
LOCATE 12, 8: PRINT "Press Enter to continue..."
PCOPY 1, 0
1 IF INKEY$ <> CHR$(13) THEN GOTO 1
tim = 0
py = 100
fx = 0
fy = 0
fire = 0
CLS
RETURN

shoot:
IF es(i) = 1 THEN
ebx(i) = 5: IF PLAY(0) = 0 THEN PLAY "MBT255L64MLO4BAGFEDC<BAGFEDEC<BAGFEDC<BAGFEDC<BAGFEDC"
ELSE ebx(i) = 315: IF PLAY(0) = 0 THEN PLAY "MBT255L64MLO4BAGFEDC<BAGFEDEC<BAGFEDC<BAGFEDC<BAGFEDC"
END IF
RETURN

delay:
DO: LOOP UNTIL TIMER >= z + .005 OR TIMER < z
RETURN

win:
CLS
PRINT "     Congratulations!!!  You have saved"
PRINT "the gold mine from the terrorists!  Now"
PRINT "you can go to claim your reward money."
PRINT "Don't forget to donate some to charity."
PRINT
PRINT "Final score:"; score
PRINT
PRINT "Press Enter to claim reward..."
PCOPY 1, 0
DO
a$ = INKEY$
LOOP UNTIL a$ = CHR$(13)
GOSUB reward
CLS : SCREEN 0: WIDTH 80: END

gameover:
CLS
PRINT "     Too bad!!!  Not only have you lost"
PRINT "the gold mine, but you have cost the"
PRINT "company several VERY expensive guns.  I"
PRINT "really hope that you can afford to pay"
PRINT "for all of that."
PRINT
PRINT "Final score:"; score
PRINT
PRINT "Press Enter to end..."
PCOPY 1, 0
DO
a$ = INKEY$
LOOP UNTIL a$ = CHR$(13)
CLS : SCREEN 0: WIDTH 80: END

reward:
FOR i = 0 TO money - 1
coinx(i) = INT(RND * 312)
coiny(i) = INT(RND * 194)
coins(i) = INT(RND * 5) + 1
NEXT i
DO
z = TIMER
CLS
LOCATE 23, 20: PRINT "Press Enter to end..."
FOR i = 0 TO money - 1
coiny(i) = coiny(i) + coins(i)
IF coiny(i) >= 193 THEN coiny(i) = 0: coinx(i) = INT(RND * 312): coins(i) = INT(RND * 5) + 1
PUT (coinx(i), coiny(i)), coin, OR
NEXT i
PCOPY 1, 0
GOSUB delay:
a$ = INKEY$
LOOP UNTIL a$ = CHR$(13)
RETURN

help:
CLS
PRINT "     You work for a company that has"
PRINT "found a huge gold mine.  Unfortunately,"
PRINT "a group of terrorists has taken the"
PRINT "mine and hopes to use it to fund their"
PRINT "activities.  They have lined the mine"
PRINT "with automatic gun turrets that will"
PRINT "shoot anything that moves.  You have"
PRINT "a gun of your own, which you must lower"
PRINT "into the mine and destroy all the"
PRINT "turrets.  The guns are very expensive,"
PRINT "and you only get three.  You can earn"
PRINT "extra guns for every 500 point that you"
PRINT "get.  There are 25 levels in all.  If"
PRINT "you succeed, you will get 10% of the"
PRINT "gold, but if you fail, you will have"
PRINT "to pay to replace the company's gold."
PRINT
PRINT "UP:  Move gun up"
PRINT "DOWN:  Move gun down"
PRINT "LEFT:  Aim left"
PRINT "RIGHT:  Aim right"
PRINT "SPACE:  Fire"
PRINT "ESC:  Quit"
LOCATE 23, 27: PRINT "Press Enter..."
PCOPY 1, 0

DO
a$ = INKEY$
LOOP UNTIL a$ = CHR$(13)
a$ = ""
CLS
RETURN

DATA 0,0,0,0,0,7,7,7,0
DATA 0,0,0,7,7,7,7,7,7
DATA 7,7,7,7,7,7,7,7,7
DATA 0,0,0,7,7,7,7,7,7
DATA 0,0,0,0,0,7,7,7,0

DATA 0,7,7,7,0,0,0,0,0
DATA 7,7,7,7,7,7,0,0,0
DATA 7,7,7,7,7,7,7,7,7
DATA 7,7,7,7,7,7,0,0,0
DATA 0,7,7,7,0,0,0,0,0

DATA 0,0,0,0,0,7,7,7,7
DATA 0,0,0,7,7,7,7,7,7
DATA 7,7,7,7,7,7,7,7,7
DATA 0,0,0,7,7,7,7,7,7
DATA 0,0,0,0,0,7,7,7,7

DATA 7,7,7,7,0,0,0,0,0
DATA 7,7,7,7,7,7,0,0,0
DATA 7,7,7,7,7,7,7,7,7
DATA 7,7,7,7,7,7,0,0,0
DATA 7,7,7,7,0,0,0,0,0

DATA 0,0,14,14,0,0
DATA 0,14,14,14,14,0
DATA 14,14,14,14,14,14
DATA 14,14,14,14,14,14
DATA 14,14,14,14,14,14
DATA 14,14,14,14,14,14
DATA 0,14,14,14,14,0
DATA 0,0,14,14,0,0
