'===========================================================================
' Subject: SPACE MAN FRED                     Date: 08-21-96 (14:55)       
'  Author: Ben Kington                        Code: QB, QBasic, PDS        
'  Origin: comp.lang.basic.misc             Packet: GAMES.ABC
'===========================================================================
'Space Man Fred v 1.1
'by Ben Kington

shphlth = 60
agn:
skipinto:
RANDOMIZE TIMER
'notes to my self:
'K=Left
'M=Right
'P=Down
'H = Up
cokcol = 1
SCREEN 13

a = 160  'Define some variables
mis = 3
en = 5
enm = 1
enspd = 1
timens = INT(TIMER + 120 - enspd)
enaway = 6
encol = 1
avt = 165
env = 10
shphlth = 60
starx1 = INT(RND * 319) + 1 'Make ten stars
stary1 = INT(RND * 199) + 1
starx2 = INT(RND * 319) + 1
stary2 = INT(RND * 199) + 1
starx3 = INT(RND * 319) + 1
stary3 = INT(RND * 199) + 1
starx4 = INT(RND * 319) + 1
stary4 = INT(RND * 199) + 1
starx5 = INT(RND * 319) + 1
stary5 = INT(RND * 199) + 1
starx6 = INT(RND * 199) + 1
stary6 = INT(RND * 319) + 1
starx7 = INT(RND * 199) + 1
stary7 = INT(RND * 319) + 1
starx8 = INT(RND * 199) + 1
stary8 = INT(RND * 319) + 1
starx9 = INT(RND * 199) + 1
stary9 = INT(RND * 319) + 1
starx10 = INT(RND * 199) + 1
stary10 = INT(RND * 319) + 1
PSET (starx1, stary1), 15
PSET (starx2, stary1), 15
PSET (starx3, stary3), 15
PSET (starx4, stary4), 15
PSET (starx5, stary5), 15
PSET (stary6, starx6), 15
PSET (stary7, starx7), 15
PSET (stary8, starx8), 15
PSET (stary9, starx9), 15
PSET (stary10, starx10), 15
planx = INT(RND * 290) + 30
plany = INT(RND * 170) + 30
pc = 1
rc = 4
DO
COLOR 0
LINE (planx - 30, plany - 30)-(planx + 30, plany + 30), , BF
COLOR 15
CIRCLE (planx, plany), 20, pc
PAINT (planx, plany - 15), pc
PAINT (planx, plany + 15), pc
CIRCLE (planx, plany), 30, rc, , , .1
LINE (planx - 17, plany - 3)-(planx + 17, plany - 3), pc
LINE (planx - 20, plany - 2)-(planx + 20, plany - 2), pc
plany = plany + 1
IF plany > 450 THEN
planx = INT(RND * 290) + 30
plany = 0
pc = INT(RND * 15) + 1
rc = INT(RND * 15) + 1
IF rc = pc THEN rc = INT(RND * 15) + 1
COLOR 0
LINE (planx - 25, plany - 25)-(planx + 25, plany + 25), , BF
COLOR 15
END IF

PSET (starx1, stary1), 0
PSET (starx2, stary1), 0
PSET (starx1, stary1), 0
PSET (starx3, stary3), 0
PSET (starx4, stary4), 0
PSET (starx5, stary5), 0
PSET (stary6, starx6), 0
PSET (stary7, starx7), 0
PSET (stary8, starx8), 0
PSET (stary9, starx9), 0
PSET (stary10, starx10), 0

stary1 = stary1 + 1
stary2 = stary2 + 2
stary3 = stary3 + 1
stary4 = stary4 + 1
stary5 = stary5 + 2
starx6 = starx6 + 1
starx7 = starx7 + 1
starx8 = starx8 + 2
starx9 = starx9 + 1
starx10 = starx10 + 2
IF stary1 > 200 THEN
stary1 = 0
starx1 = INT(RND * 320) + 1
END IF
IF stary2 > 200 THEN
stary2 = 0
starx2 = INT(RND * 320) + 1
END IF
IF stary3 > 200 THEN
stary3 = 0
starx3 = INT(RND * 320) + 1
END IF
IF stary4 > 200 THEN
stary4 = 0
starx4 = INT(RND * 320) + 1
END IF
IF stary5 > 200 THEN
stary5 = 0
starx5 = INT(RND * 320) + 1
END IF
IF starx6 > 200 THEN
starx6 = 0
stary6 = INT(RND * 320) + 1
END IF
IF starx7 > 200 THEN
starx7 = 0
stary7 = INT(RND * 320) + 1
END IF
IF starx8 > 200 THEN
starx8 = 0
stary8 = INT(RND * 320) + 1
END IF
IF starx9 > 200 THEN
starx9 = 0
stary9 = INT(RND * 320) + 1
END IF
IF starx10 > 200 THEN
starx10 = 0
stary10 = INT(RND * 320) + 1
END IF
PSET (starx2, stary1), 15
PSET (starx3, stary3), 15
PSET (starx4, stary4), 15
PSET (starx5, stary5), 15
PSET (stary6, starx6), 15
PSET (stary7, starx7), 15
PSET (stary8, starx8), 15
PSET (stary9, starx9), 15
PSET (stary10, starx10), 15

COLOR 15
LINE (4, 185)-(66, 190), , B

COLOR 1
LINE (5, 186)-(5 + shphlth, 189), , BF

timen = INT(timens - TIMER)
COLOR 15
LOCATE 1, 1
PRINT "Score: "; scr; " Timer:"; timen; " Missles:"; mis
en1 = en - 5
en2 = en + 5
COLOR 0
LINE (en1 - 1, env - 1)-(en2 + 1, env + 11), , BF
COLOR encol
LINE (en1, env)-(en2, env) 'DRAW THE ENEMY
LINE (en1, env)-(en1, env + 5)
LINE (en2, env)-(en2, env + 5)
LINE (en2, env + 5)-(en1, env + 5)
LINE (en, env + 5)-(en, env + 10)
PAINT (en, env + 1)

CHUNK$ = UCASE$(INKEY$)
b1 = a + 10
b2 = a - 10
c = b1 - 2
d = b2 + 2
avb = avt + 15
abh = avb - 2
SELECT CASE CHUNK$
CASE CHR$(0) + "M"
IF b1 <> 320 THEN a = a + 10
'SOUND 60, 1
CASE CHR$(0) + "K"
IF b2 <> 1 THEN a = a - 10
'SOUND 60, 1
CASE CHR$(0) + "P"
IF avt <> 190 THEN avt = avt + 5
CASE CHR$(0) + "H"
IF avt <> 10 THEN avt = avt - 5
CASE CHR$(32)


SOUND 1000, 1
'LINE (a, avt)-(a, env), 4
COLOR 15
LINE (a, avt)-(b1, avb) 'Draw the ship
LINE (a, avt)-(b2, avb)
LINE (c, abh)-(d, abh)
CIRCLE (a, avt + 5), 2, cokcol
PAINT (a, avt + 5), cokcol
shot = avt
DO
COLOR 15
LINE (a, avt)-(b1, avb) 'Draw the ship
LINE (a, avt)-(b2, avb)
LINE (c, abh)-(d, abh)
CIRCLE (a, avt + 5), 2, cokcol
PAINT (a, avt + 5), cokcol

CIRCLE (a, shot + 5), 2, 0
CIRCLE (a, shot + 5), 1, 0
PSET (a, shot + 5), 0
PSET (a, shot), 4
CIRCLE (a, shot), 1, 44
CIRCLE (a, shot), 2, 111
'PLAY "p64"
fdel = TIMER
del = TIMER + .004
DO: LOOP WHILE del > TIMER
shot = shot - 5
LOOP WHILE shot > env


CIRCLE (a, shot + 5), 2, 0
CIRCLE (a, shot + 5), 1, 0
PSET (a, shot + 5), 0

IF a > en1 - 3 AND a < en2 + 3 THEN ens = 2
CASE CHR$(48)
IF mis > 0 AND avt > env THEN
LINE (a, avt)-(en, env), 2
SOUND 1000, 1
goo = INT(TIMER)
gooer = goo + 1

DO
LOOP WHILE gooer <> INT(TIMER)
mis = mis - 1
ens = 2
LINE (a, avt)-(en, env), 0
END IF
END SELECT

COLOR 0
LINE (b1 + 15, avt - 16)-(b2 - 15, avb + 16), , BF
COLOR 15
LINE (a, avt)-(b1, avb) 'Draw the ship
LINE (a, avt)-(b2, avb)
LINE (c, abh)-(d, abh)
CIRCLE (a, avt + 5), 2, cokcol
PAINT (a, avt + 5), cokcol
en1 = en - 5
en2 = en + 5
COLOR encol

LINE (en1, env)-(en2, env) 'DRAW THE ENEMY
LINE (en1, env)-(en1, env + 5)
LINE (en2, env)-(en2, env + 5)
LINE (en2, env + 5)-(en1, env + 5)
LINE (en, env + 5)-(en, env + 10)
PAINT (en, env + 1)

emover = INT(RND * 100) + 1  'move the enemy
'                  ^^^  This number determines how often the enemy
'changes directions.
IF emover = 1 AND emove <> 2 THEN emove = 2
IF emover = 2 AND emove <> 1 THEN emove = 1
IF emover = 3 AND emovev <> 1 THEN emovev = 1
IF emover = 4 AND emovev <> 2 THEN emovev = 2
IF en = 5 THEN emove = 1
IF en > 315 THEN emove = 2
IF env = 2 THEN emovev = 1
IF env = 179 OR env > 179 THEN emovev = 2
IF emove = 1 THEN en = en + 1
IF emove = 2 THEN en = en - 1
IF emovev = 1 THEN env = env + 1
IF emovev = 2 THEN env = env - 1
IF en < b1 AND en > b2 AND env + 30 > avt AND env < avt THEN
LINE (en, env + 10)-(en, avt + 10), 14

shipst = 2


PLAY "<<<c"

gob = TIMER
gooober = gob + 1
DO WHILE gooober > gob
gob = TIMER
LOOP

COLOR 0
LINE (en1 - 1, env - 1)-(en2 + 1, env + 11), , BF
COLOR 15
en = 5
env = 10
END IF
IF shipst = 2 THEN
shphlth = shphlth - 10
COLOR 0
LINE (b1 + 15, avt - 16)-(b2 - 15, avb + 16), , BF
LINE (4, 185)-(66, 190), , BF
COLOR 15
shipst = 1
END IF

IF ens = 2 THEN 'Kill the enemy
'FOR exspld = 1 TO 10
'CIRCLE (en, env), exspld, 8
SOUND 100, 2
SOUND 130, 2
SOUND 90, 2
'NEXT exspld



COLOR 0
LINE (en1 - 1, env - 1)-(en2 + 1, env + 11), , BF

FOR firex = 1 TO 200

x = INT(RND * 15) + 1
xb = INT(RND * 15) + 1
yb = INT(RND * 15) + 1
y = INT(RND * 15) + 1
c = INT(RND * 10) + 1
IF c = 1 THEN f = 40
IF c = 2 THEN f = 116
IF c = 3 THEN f = 111
IF c = 4 THEN f = 44
IF c = 5 THEN f = 43
IF c = 6 THEN f = 42
IF c = 7 THEN f = 41
IF c = 8 THEN f = 184
IF c = 9 THEN f = 188
IF c = 10 THEN f = 184
x1 = en + x - xb
y1 = env + y - yb
PSET (x1, y1), f
NEXT firex
CLS
COLOR 0
LINE (en1 - 55, env - 55)-(en2 + 55, env + 51), , BF
COLOR 15

tbon = tbon + timen
IF enkill = 5 THEN enspd = enspd + 5: enkill = 0
enkill = enkill + 1
timens = INT(TIMER + 65 - enspd)
scr = scr + 100 * enspd
en = INT(RND * 315) + 5
ens = 1

encol = encol + 1
IF encol = 15 THEN encol = 1
COLOR 0
LINE (en1 - 15, env - 15)-(en2 + 15, env + 21), , BF
COLOR 15
timeen = timen / 8
IF shphlth + timeen < 60 OR shphlth + timeen = 60 THEN shphlth = shphlth +
timeen
COLOR 15

COLOR 15
END IF
LOOP WHILE INKEY$ <> CHR$(27) AND enspd < 115 AND timen > 0 AND shphlth >
0
COLOR encol

COLOR 15
PRINT "Score:"; scr
PRINT "Time bonus:"; tbon
PRINT "Final Score:"; scr + tbon
IF timen < 0 OR timen = 0 THEN
COLOR 14  'kill the earth
LINE (en, env + 16)-(1, 200)
LINE (en, env + 16)-(320, 200)
PAINT (en, env + 17)
LINE (b2, avt + 30)-(b1, avt - 30), , BF

gmovr:
LOCATE 13, 15
COLOR 4

PRINT "Game Over!"
SOUND 100, 2
SOUND 200, 2
SOUND 100, 2
shphlth = 1
END IF
IF shphlth < 0 OR shphlth = 0 THEN
FOR slip = 1 TO 30
CIRCLE (a, avt + 5), slip, 8
SOUND 100 + slip, 1
NEXT slip
GOSUB gmovr
END IF
IF enspd = 115 THEN
COLOR 15
PRINT "Thank you for saving the earth, here is a medal for your bravery:"
LINE (140, 50)-(180, 50), 4
LINE (140, 50)-(140, 90), 4
LINE (180, 50)-(180, 90), 4
LINE (180, 90)-(160, 110), 4
LINE (140, 90)-(160, 110), 4
PAINT (160, 105), 4
CIRCLE (160, 140), 30, 44
PAINT (160, 140), 44
END IF
INPUT "Would you like to play again?", agn$
IF agn$ = "y" OR agn$ = "Y" THEN GOSUB agn
SYSTEM

SUB earth
COLOR 14
LINE (en, 21)-(1, 200)
LINE (en, 21)-(320, 200)
PAINT (en, 32)
LINE (a, 165)-(b1, 180) 'kill the ship
LINE (a, 165)-(b2, 180)
LINE (c, 178)-(d, 178)
LOCATE 13, 15
COLOR 4
PRINT "Game Over!"

END SUB
