1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-08 06:45:16 +00:00
qb64/programs/samples/pete/mooncr/mooncr.bas

2182 lines
66 KiB
QBasic
Raw Blame History

REM - written for QBasic / QuickBasic (freeware) -
REM - V.26
REM - by Daniel Kupfer
REM - for more info look at the end / press f1 in title
REM - any problems / questions ? mail: dk1000000@aol.com
SCREEN 7
DEFINT A-Z
scx = 159: scy = 99
xp = scx: yp = 172: vp = 6: vsh = 6
xpmin = 0: xpmax = 319: shmax = 15: emax = 7: esmax = 3: fmax = 15
stmax = 31: exmax = 7
SND = 1: bonplay& = 20000
pi! = 3.14158: pi2! = pi! / 2: pi4! = pi! / 4
cts1 = 0: cts2 = 4: cts3 = 10
DIM tae(201), tne(201): n = shmax
DIM xsh(n), ysh(n): n = stmax
DIM xst(n), yst(n), xst!(n), yst!(n), cst(n), vst(n): n = emax
DIM xe!(n), ye!(n), ae(n), dae(n), ne(n), ce(n), ste(n)
DIM ze(n), zze(n), tpe(n), tce(n): n = exmax
DIM xex(n), yex(n), stex(n), zex(n), tex(n): n = esmax
DIM xes!(n), yes!(n), dxes!(n), dyes!(n), stes(n), tes(n)
DIM aes(n), des(n): n = fmax
DIM fx!(n), fy!(n), dfx!(n), dfy!(n), fc(n), ft(n): n = 11
DIM ptse(n), dble(n), anie(n), adde(n), zoome(n)
DIM table(n), c1e(n), c2e(n), expe(n), c1ee(2, n), c2ee(2, n): n = 7
DIM tce0(n), xec(n), yec(n), aec(n): n = 12
DIM xc!(n), yc!(n), zc!(n), cc(n), ac(n), nc(n)
DIM ENEMY$(20, 3), CRASH$(4), bin(4), CH$(42): n = 7
DIM vbos(n), vsbos(n), tsbos(n), fsbos(n), ptsbos(n), hrbos(n)
DIM BOSS$(n), STAGE$(n)
DIM cp(95), SFINAL$(2, 9), CREDIT$(50)
A5$ = STRING$(4, CHR$(170)) + STRING$(4, CHR$(85))
FOR e = 1 TO 11: READ p, d, m, a, z, T, ex
ptse(e) = p: dble(e) = d: anie(e) = m: adde(e) = a: zoome(e) = z
table(e) = T: expe(e) = ex: NEXT e
DATA 10,0,0,0,64,1,1, 20,0,0,0,64,2,1, 25,0,0,0,64,2,1
DATA 40,0,0,0,64,5,1, 50,0,0,0,64,4,1, 200,0,0,0,64,6,1
DATA 250,0,0,0,64,7,1, 100,1,0,1,64,2,1, 120,0,0,0,64,3,1
DATA 120,1,3,1,64,2,1, 160,0,2,0,48,3,1
FOR s = 0 TO 2
FOR e = 1 TO 11: READ c1, c2: c1ee(s, e) = c1: c2ee(s, e) = c2: NEXT e: NEXT s
DATA 7,13, 6,14, 5,15, 5,11, 3,15, 2,10, 2,10, 4,12, 1,14, 2,14, 9,15
DATA 4,13, 2,10, 1,4, 7,15, 4,14, 3,11, 3,11, 5,13, 2,15, 2,14, 9,15
DATA 5,14, 3,11, 2,14, 12,14, 14,4, 4,12, 4,12, 6,14, 3,15, 6,14, 4,12
REM - - - - BOSS SETUP - - - - - -
FOR n = 1 TO 7: READ a$, s$: BOSS$(n) = a$: STAGE$(n) = s$: NEXT n
DATA "MYKOR MASTER","VEGA SYSTEM","PHOENIX","ALPHA CENTAURI"
DATA "EVIL BATSY","DARK PLANET","QUARRIOR","AQUARUIS"
DATA "MC FISHKING","NEPTUN","BEEBOP QUEEN","MOONBASE"
DATA "MOTHERSHIP","EARTH"
FOR n = 1 TO 7: READ v, ts, f, p, r: vbos(n) = v: tsbos(n) = ts
fsbos(n) = f: ptsbos(n) = p: hrbos(n) = r: NEXT n
DATA 1,1,4,1000,20, 1,4,6,2500,20, 2,1,8,4000,20, 1,5,10,7500,20
DATA 1,3,100,10000,24, 2,2,10,16000,20, 1,0,0,25000,40
FOR n = 0 TO 3: READ c: csb(n) = c: NEXT n
DATA 4,12,14,10
REM - - - - ESHOT SETUP - - - -
FOR n = 1 TO 5: READ v, d: ves(n) = v: ses(n) = d: NEXT n
DATA 5,2, 4,2, 2,4, 3,2, 3,2
n = 1
DO: READ a, T: tae(n) = a: tne(n) = T: n = n + 1
LOOP UNTIL a = -1 AND T = -1
nte = n - 1
PATTERN1:
DATA 0,100, -900,1, 0,32, -900,1, 0,50, -900,1, 0,8, -900,1
DATA 0,70, 900,1, 0,10, 900,1, 0,50, -900,1, 30,60 ,0,90
DATA 30,30, 0,50, 900,1, 0,14, 900,1, 0,20, 900,1, 0,16
DATA 900,1, 0,20, 900,1, 0,14, 900,1, 0,20, 900,1, 0,16
DATA 900,1, 0,20, 900,1, 0,14, 900,1, 0,40, 900,2, 0,0
PATTERN2:
DATA -30,30, 30,75, 0,34, -30,95, 0,34, 30,95, 0,34, -30,95
DATA 0,34, 30,95, 0,34, -30,95, 0,34, 30,50, 0,25, 30,30
DATA 0,60, 60,30, 0,110, -60,31, 0,90, 60,31, 0,60, -60,32
DATA 0,30, 60,32, 30,28, 0,20, 0,0, 0,0, 0,0, 0,0
PATTERN3:
DATA -90,20, 90,30, -90,30, 90,20, -90,20, 90,40, 90,10, -90,20
DATA 90,20, -90,30, 90,20, -90,20, 90,20, -90,21, 0,20, 0,0
DATA 90,20, -90,30, 90,30, -90,20, 90,20, -90,40, -90,10, 90,20
DATA -90,20, 90,30, -90,20, 90,20, -90,20, 90,21, 0,20, 0,0
PATTERN4:
DATA 30,60, -30,-30, 30,60, 0,40, 30,20, 0,30, 30,90, -30,90
DATA -30,90, 30,45, 0,20, -30,15, 0,10, 30,15, -30,15, 30,15
DATA 0,80, 30,5, 0,40, 30,5, 0,40, 30,5, 0,40, 30,5
DATA 0,40, 30,180, 0,120, 0,0, 0,0, 0,0, 0,0, 0,0
PATTERN5:
DATA 0,130, 30,60, 0,105, 90,20, 0,60, -90,20, 0,20, 90,20
DATA 0,60, 90,10, 0,80, 90,20, 0,80, -90,20, 0,80, 90,20
DATA 0,60, 30,270, 0,50, 0,0, 0,0, 0,0, 0,0, 0,0
PATTERN6:
DATA -30,85, 0,50, 30,0, -30,80, 0,60, 30,80, 0,60, -30,80
DATA 0,60, 30,80, 0,60, -30,80, 0,60, 30,50, 0,25, 30,30
DATA 0,60, 60,30, 0,110, -60,31, 0,90, 60,31, 0,60, -60,32
DATA 0,30, 60,32, 30,28, 0,20, 0,0, 0,0, 0,0, 0,0
PATTERN7:
DATA -30,60, 0,80, 0,0, 0,0, 30,60, 0,80, 0,0, 0,0
DATA -1,-1
FOR n = 1 TO 7: READ T, x, y, a, v, c: tce0(n) = T: xec(n) = x: yec(n) = y
aec(n) = a: vec(n) = v: crec(n) = c: NEXT n
DATA 0,0,20,0,4,7, 40,159,119,900,4,7
DATA 72,159,119,900,4,7, 104,149,109,900,4,7
DATA 136,320,20,1800,4,7
DATA 160,159,50,900,4,7, 192,159,50,900,4,7
FOR n = 0 TO 9: READ x, y: pcx(n) = x: pcy(n) = y: NEXT n
DATA 0,-2, -10,-2, 10,-2, -10,3, 10,3
DATA 0,-5, -14,-4, 14,-4, -14,3, 14,3
RANDOMIZE TIMER
GOSUB LOAD.SPRITES
GOSUB LOAD.SOUNDS
GOSUB LOAD.CHARSET
FOR n = 0 TO shmax: ysh(n) = -1: NEXT n
FOR n = 0 TO stmax: GOSUB CREATE.STAR: NEXT n
FOR n = 0 TO emax: ste(n) = -1: ce(n) = 2: NEXT n
FOR n = 0 TO esmax: stes(n) = -1: NEXT n
REM - - - - - - - - TITLE SCREEN - - - - - - - -
x = -40: zmax = 40
FOR n = 0 TO 7: READ nc, cc
xc!(n) = x: yc!(n) = 26: zc!(n) = 200: nc(n) = nc: cc(n) = cc
x = x + 7: NEXT n
FOR n = 8 TO 9: READ nc, cc
xc!(n) = x + 55: yc!(n) = yc!(1) + 30: zc!(n) = zmax: nc(n) = nc: cc(n) = cc
x = x + 7: NEXT n
DATA 29,15, 31,15, 31,15, 30,15, 19,15, 34,15, 17,15, 32,15, 9,15, 9,15
REM - - - LEVEL SETUP - - -
FOR n = 1 TO 9: READ T, r, s, h
ltpe(n) = T: lrad(n) = r: lsum(n) = s: lhit(n) = h: NEXT n
DATA 1,14,1,1, 1,14,2,1, 2,12,2,1, 3,12,2,1
DATA 4,12,2,1, 5,14,2,1, 8,16,1,3, 10,14,1,3
DATA 6,12,4,1
RESTORE CREDITS
FOR n = 1 TO 34: READ a$: CREDIT$(n) = a$: NEXT n
x = 100: y = 100: c1 = 6: c2 = 14: a = 0: z = 4
e = 6: f = 0: GOSUB DRAW.ESPRITE
REM END
GOSUB WAITKEY0: GOSUB TITLE
STAGE = 1: LEVEL = 1: stbos = -1: tbos = 1
GOSUB LOAD.LEVEL
REM ---> player setup
ssec(1) = 1: ssec(2) = 0: ssec(3) = 0: GOSUB SETUP.SHIP
stp = 0: REM status player
score& = 0
GOSUB DRAW.PLAYER1
n = INT(2 * RND)
IF n = 0 AND SND = 1 THEN PLAY SLAUNCH$
IF n = 1 AND SND = 1 THEN PLAY SNEWPL1$
GOSUB WAITFIRE: REM GOTO GAME.FINISH
GOSUB ENTER.STAGE
MAIN:
k0 = k: k = INP(96): k$ = INKEY$
IF k = 1 THEN END
IF k = 31 THEN SND = 1 - SND: GOSUB WAITKEY0
IF k = 25 THEN GOSUB PAUSE.MODE
IF k = 29 AND k0 <> 29 THEN GOSUB FIRE.SHOT
GOSUB KEYS
GOSUB MOVE.PLAYER
GOSUB MOVE.SHOT
GOSUB MOVE.ENEMY
GOSUB MOVE.BOSS
GOSUB MOVE.ESHOT
GOSUB REFR.SCREEN
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
GOSUB DRAW.ESHOT
GOSUB DRAW.ENEMY
GOSUB DRAW.BOSS
GOSUB TEST.HIT.SHOT
GOSUB TEST.HIT.PLAYER
GOSUB DRAW.SHOT
GOSUB DRAW.EVENT
GOSUB DRAW.PLAYER
GOSUB DRAW.EXP
GOSUB DRAW.STAR
LOCATE 1, 30: PRINT score&
GOSUB CREATE.ESHOT
crec1 = crec1 - 1: IF crec1 = 0 THEN crec1 = crec0: GOSUB CREATE.ENEMY
cnt1 = (cnt1 + 1) AND 255
GOSUB BINARY.CNT
GOSUB TEST.LEVELEND
REM GOSUB DOCKING
GOTO MAIN
MOVE.BOSS:
IF stbos < 0 THEN RETURN
xbos! = xbos! + dxbos!: ybos! = ybos! + dybos!
IF hbos = 1 AND ybos! > 10 AND tbos < 7 THEN ybos! = ybos! - 3
IF xbos! < 10 THEN dxbos! = 1
IF xbos! > 309 THEN dxbos! = -1
IF ybos! < 10 THEN dybos! = 1
IF ybos! > 99 THEN dybos! = -1
GOSUB SHOT.BOSS
IF INT(100 * RND) < 1 THEN GOSUB ACTIV.BOSS
RETURN
SHOT.BOSS:
IF tbos = 7 THEN GOTO SHOT.SUPERBOSS
r = fsbos(tbos) * STAGE
IF INT(1000 * RND) > r THEN RETURN
x = xbos!: y = ybos!: T = tsbos(tbos): s = ses(T)
IF T = 3 THEN s = 2 + INT(5 * RND)
GOSUB FIRE.ESHOT
RETURN
SHOT.SUPERBOSS:
GOSUB CREATE.SUPERENEMY
RETURN
CREATE.SUPERENEMY:
IF INT(8 * RND) > 0 THEN RETURN
n = (eptr + 1) AND emax: IF ste(n) <> -1 THEN RETURN
T = tpe + 1: mt = table(T)
ye!(n) = ybos!: ae(n) = 900 + 180 * RND - 90
xe!(n) = xbos!
ze(n) = 64: zze(n) = zoome(T)
ste(n) = 0: tpe(n) = T
tce(n) = tce0(mt) + INT(2 * RND) * 4
GOSUB LOADPTR.ENEMY
RETURN
ACTIV.BOSS:
a! = INT(8 * RND) * pi4!
dxbos! = COS(a!) * vbos(tbos): dybos! = SIN(a!) * vbos(tbos)
IF tbos = 7 THEN dybos! = 0
RETURN
DRAW.BOSS:
IF stbos = -1 THEN RETURN
IF stbos < 0 THEN GOTO DRAW.BOSS1
x = xbos!: y = ybos!
ON tbos GOSUB DBOSS1, DBOSS2, DBOSS3, DBOSS4, DBOSS5, DBOSS6, DBOSS7
IF bin(1) = 0 THEN hbos = 0
RETURN
DRAW.BOSS1:
stbos = stbos + 1: GOSUB DRAW.BDOTS
IF stbos < -100 AND SND = 1 THEN SOUND 37 + 120 * RND, .4
IF stbos = -90 THEN GOTO DRAW.BOSS2
IF stbos > -96 AND stbos < -48 AND PLAY(0) = 0 AND SND = 1 THEN PLAY SBOSPTS$
RETURN
DRAW.BOSS2:
FOR e = 0 TO emax: ste(e) = -1: NEXT e: cresum = 0
pts& = ptsbos(tbos): GOSUB LOAD.SCORE
evcnt = 50: evpts = pts&: evtpe = 1
RETURN
DRAW.BDOTS:
FOR m = 0 TO fmax
x = fx!(m): y = fy!(m)
LINE (x, y)-(x + 1, y + 1), fc(m), BF
fx!(m) = fx!(m) + dfx!(m): fy!(m) = fy!(m) + dfy!(m)
NEXT m
RETURN
DRAW.EVENT:
IF evcnt <= 0 THEN RETURN
evcnt = evcnt - 1: yc! = 70: ac = 0: sc = 4: T$ = evtxt$
IF evtpe = 1 THEN xc! = 160: i = evpts: cc = 15 * RND: GOSUB DRAW.INTF
IF evtpe = 2 THEN xc! = 159 - LEN(T$) * 4: cc = 15: GOSUB DRAW.TXTZ
RETURN
BINARY.CNT:
bin(1) = 1 - bin(1): b2 = bin(2): b3 = bin(3)
IF bin(1) = 0 THEN bin(2) = 1 - bin(2)
IF bin(2) < b2 THEN bin(3) = 1 - bin(3)
IF bin(3) < b3 THEN bin(4) = 1 - bin(4)
RETURN
TEST.LEVELEND:
IF emovcnt > 0 OR expcnt > 0 OR stbos <> -1 THEN etimer = 0: RETURN
etimer = etimer + 1: IF etimer < 25 THEN RETURN
etimer = 0
IF (LEVEL AND 7) = 5 THEN GOSUB DOCKING: REM level 3 + 7
GOSUB ADVANCE.LEVEL
GOTO MAIN
PAUSE:
DO: WAIT &H3DA, 8: WAIT &H3DA, 8, 8: c = c - 1: LOOP UNTIL c = 0
RETURN
WAITFIRE:
GOSUB WAITKEY0
t0! = TIMER
DO
k = INP(96): k$ = INKEY$
t1! = TIMER - t0!
LOOP UNTIL k = 29 OR t1! > 4
GOSUB WAITKEY0
RETURN
KEYS:
REM IF k0 = 75 OR k0 = 77 THEN RETURN
IF k = 75 THEN dxp = -vp: k1 = 203
IF k = 77 THEN dxp = vp: k1 = 205
IF k = k1 THEN dxp = 0
RETURN
MOVE.PLAYER:
IF stp < 0 THEN GOTO CREATE.PLAYER
xp = xp + dxp
IF xp > xpmax THEN xp = xpmax
IF xp < xpmin THEN xp = xpmin
RETURN
CREATE.PLAYER:
IF stp < -1 THEN RETURN
stp = 0: f = 0
FOR q = 1 TO 3
IF ssec(q) > -1 THEN f = 1
IF ssec(q) = 0 THEN ssec(q) = 1: f = 1: EXIT FOR
NEXT q
IF f = 0 THEN stp = 1
IF f = 1 AND SND = 1 THEN PLAY SNEWPL2$
GOSUB SETUP.SHIP
RETURN
SETUP.SHIP:
sss0 = 0: sss1 = 0: s = 0
IF ssec(1) = 1 THEN s = s OR 1
IF ssec(2) = 1 THEN s = s OR 2
IF ssec(3) = 1 THEN s = s OR 2
IF s = 3 THEN sss0 = 1
IF s = 2 THEN sss1 = 1
RETURN
FIRE.SHOT:
IF stp > 0 THEN RETURN
IF sss0 = 1 THEN sss1 = 1 - sss1
IF sss1 = 0 AND ssec(1) = 1 THEN GOSUB FIRE.SHOT1: s = 1
IF sss1 = 1 AND ssec(2) = 1 THEN GOSUB FIRE.SHOT2: s = 2
IF sss1 = 1 AND ssec(3) = 1 THEN GOSUB FIRE.SHOT3: s = 2
RETURN
FIRE.SHOT1:
IF ysh(cts1) > 0 THEN RETURN
xsh(cts1) = xp: ysh(cts1) = yp - 4
cts1 = cts1 + 1: IF cts1 = 4 THEN cts1 = 0
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SLASER1$
RETURN
FIRE.SHOT2:
IF ysh(cts2) > 0 OR ysh(cts2 + 1) > 0 THEN RETURN
xsh(cts2) = xp - 9: ysh(cts2) = yp + 3
xsh(cts2 + 1) = xp + 9: ysh(cts2 + 1) = yp + 3
cts2 = cts2 + 2: IF cts2 = 10 THEN cts2 = 4
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SLASER2$
RETURN
FIRE.SHOT3:
IF ysh(cts3) > 0 OR ysh(cts3 + 1) > 0 THEN RETURN
xsh(cts3) = xp - 14: ysh(cts3) = yp + 10
xsh(cts3 + 1) = xp + 14: ysh(cts3 + 1) = yp + 10
cts3 = cts3 + 2: IF cts3 = 16 THEN cts3 = 10
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SLASER2$
RETURN
REFR.SCREEN:
WAIT &H3DA, 8, 8: WAIT &H3DA, 8
scr = 1 - scr: SCREEN 7, 0, 1 - scr, scr: CLS
RETURN
REFR.DOCKSCREEN:
WAIT &H3DA, 8, 8: WAIT &H3DA, 8
scr = 1 - scr: SCREEN 7, 0, 1 - scr, scr
VIEW (1, 25)-(318, 198), 0, 0: VIEW
RETURN
MOVE.SHOT:
FOR n = 0 TO shmax: ys = ysh(n)
IF ys < 0 THEN GOTO MOVE.SHOT1
ys = ys - vsh: ysh(n) = ys
MOVE.SHOT1:
NEXT n
MOVE.ENEMY:
emovcnt = 0
FOR n = 0 TO emax
IF ste(n) < 0 THEN GOTO MOVE.ENEMY1
ne(n) = ne(n) - 1: IF ne(n) <= 0 THEN GOSUB LOADPTR.ENEMY
a! = ae(n) * (pi! / 1800): emovcnt = emovcnt + 1
dx! = COS(a!) * vec: dy! = -SIN(a!) * vec
xe!(n) = xe!(n) + dx! / 2: ye!(n) = ye!(n) + dy! / 2
ae(n) = (ae(n) + dae(n)) MOD 3600
IF ze(n) < zze(n) THEN ze(n) = ze(n) + 1
IF ABS(xe!(n) - scx) > 180 OR ABS(ye!(n) - scy) > 120 THEN GOSUB RESET.ENEMY
MOVE.ENEMY1:
NEXT n
RETURN
MOVE.ESHOT:
FOR n = 0 TO esmax
IF stes(n) < 0 THEN GOTO MOVE.ESHOT1
xes!(n) = xes!(n) + dxes!(n): yes!(n) = yes!(n) + dyes!(n)
aes(n) = aes(n) + 1
IF ABS(xes!(n) - scx) > 160 OR ABS(yes!(n) - scy) > 100 THEN stes(n) = -1
MOVE.ESHOT1:
NEXT n
RETURN
DRAW.ESHOT:
FOR n = 0 TO esmax
IF stes(n) < 0 THEN GOTO DRAW.ESHOT1
x = xes!(n): y = yes!(n): a = aes(n): d = des(n)
T = tes(n)
ON T GOSUB DESHOT1, DESHOT2, DESHOT3, DESHOT4, DESHOT5
DRAW.ESHOT1:
NEXT n
RETURN
DESHOT1:
c = 1
LINE (x - 1, y - 2)-(x + 1, y + 2), c, B
LINE (x, y - 3)-(x, y + 3), c
LINE (x, y - 2)-(x, y + 2), 15
RETURN
DESHOT2:
CIRCLE (x, y), d, 4: PAINT (x, y), 10, 4
RETURN
DESHOT3:
f! = 1 + SIN(a / 4) * .4: f2! = d * .7
CIRCLE (x, y), d + .5, 7, , , f!
CIRCLE (x, y), d, 15, , , f!
LINE (x - d * .1 / f! - 1, y - d * .3 * f!)-(x - 1, y), 7, B
RETURN
DESHOT4:
a = (a * 30) MOD 360: z = 4: c = 15: e = 1: GOSUB DRAW.SSPRITE
RETURN
DESHOT5:
a = (a * 9) MOD 360: z = 4: c = 15: e = 2: GOSUB DRAW.SSPRITE
RETURN
CREATE.ESHOT:
IF STAGE <= 1 THEN RETURN
r = (20 / STAGE) * RND: IF r > 0 THEN RETURN
e = INT((emax + 1) * RND)
IF ye!(e) > 80 OR ste(e) < 0 THEN RETURN
x = xe!(e): y = ye!(e)
T = 1 - (tpe = 10): s = ses(T): GOSUB FIRE.ESHOT
RETURN
FIRE.ESHOT:
escnt = (escnt + 1) AND esmax: n = escnt
IF stes(n) > -1 THEN RETURN
xes!(n) = x: yes!(n) = y: v = ves(T)
a! = pi2! - (pi! / 8) * RND + pi4!: dx! = COS(a!) * v: dy! = SIN(a!) * v
IF SGN(xp - x) <> SGN(dx!) THEN dx! = -dx!
dxes!(n) = dx!: dyes!(n) = dy!
stes(n) = 0: tes(n) = T: aes(n) = 0: des(n) = s
IF PLAY(0) > 0 OR SND = 0 THEN RETURN
ON T GOSUB SESHOT1, SESHOT2, SESHOT3, SESHOT3, SESHOT3
RETURN
SESHOT1:
PLAY SSHOOT2$: RETURN
SESHOT2:
PLAY SSHOOT2$: RETURN
SESHOT3:
PLAY SSHOOT3$: RETURN
RESET.STAR:
xst(n) = 320 * RND: yst(n) = 0 * RND: cst(n) = INT(15 * RND) + 1
RETURN
CREATE.STAR:
xst(n) = 320 * RND: yst(n) = 200 * RND: cst(n) = INT(8 * RND)
RETURN
RESET.ENEMY:
IF tbos = 7 THEN GOSUB RESET.SUPERENEMY
mt = table(tpe)
xe!(n) = xec(mt): ye!(n) = yec(mt): ze(n) = 9
RETURN
RESET.SUPERENEMY:
IF (n AND 1) = 1 THEN ste(n) = -1
RETURN
CREATE.ENEMY:
n = eptr: eptr = (eptr + 2) AND emax
IF ste(n) <> -1 THEN RETURN
crecnt = crecnt + 1: IF crecnt > cresum THEN RETURN
T = tpe: mt = table(T)
xe!(n) = xec(mt): ye!(n) = yec(mt): ae(n) = aec(mt)
ze(n) = 9: zze(n) = zoome(T)
ste(n) = 0: tpe(n) = T: tce(n) = tce0(mt)
GOSUB LOADPTR.ENEMY
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SNEW1$
RETURN
LOADPTR.ENEMY:
c = tce(n): dae(n) = tae(c): ne(n) = tne(c)
c = c + 1: IF tae(c) = 0 AND tne(c) = 0 THEN c = tce0(mt)
tce(n) = c
RETURN
DRAW.STAR:
dy = (cnt1 AND 1)
FOR n = 0 TO stmax
x = xst(n): y = yst(n): c = cst(n): y = y + dy
IF POINT(x, y) = 0 THEN PSET (x, y), c
yst(n) = y: IF y > 200 THEN GOSUB RESET.STAR
NEXT n
stcnt = (stcnt + 1) AND stmax: n = stcnt
IF INT(2 * RND) = 0 THEN n = stmax * RND: GOSUB CREATE.STAR
RETURN
DRAW.PLAYER:
IF stp > 0 THEN GOTO DRAW.GAMEOVER
IF stp < 0 THEN GOTO DRAW.SHIPEXPLODE
IF ssec(1) = 1 THEN x = xp: y = yp + 0: c = 4: GOSUB DRAW.SHIP1
IF ssec(2) = 1 THEN x = xp: y = yp + 6: c = 9: GOSUB DRAW.SHIP2
IF ssec(3) = 1 THEN x = xp: y = yp + 15: c = 5: GOSUB DRAW.SHIP3
RETURN
DRAW.ESTAR:
FOR n = 0 TO stmax
x = xst(n): y = yst(n): c = cst(n)
x = x + 1: IF x > 320 THEN x = 0: yst(n) = 10 + 180 * RND
PSET (x, y), c: xst(n) = x
NEXT n
c = 12 + INT(4 * RND): IF c = 13 OR c < 12 THEN c = 0
n = stmax * RND: cst(n) = c
RETURN
DRAW.SHIPEXPLODE:
stp = stp + 1: IF stp > -10 THEN RETURN
x0 = xp: y0 = yp + 6
IF SND = 1 THEN SOUND 37 + f1! * RND, .5
f1! = f1! * .85
FOR n = 1 TO 5
x = fx!(n): y = fy!(n): a = ft(n): c = fc(n): z = dfx!(n)
e$ = CRASH$(1): GOSUB DRAW.SPRITE
NEXT n
IF bin(2) = 1 THEN GOSUB CREATE.SHIPEXPLODE
RETURN
CREATE.SHIPEXPLODE:
FOR n = 1 TO 5
fx!(n) = x0 + 24 * RND - 12: fy!(n) = y0 + 14 * RND - 7
ft(n) = 360 * RND: c = 12 + INT(4 * RND): IF c = 13 THEN c = 15
fc(n) = c: dfx!(n) = INT(3 * RND) + 2
NEXT n
RETURN
DRAW.SHIP1:
LINE (x, y - 3)-(x - 6, y + 3), c
LINE (x, y - 3)-(x + 6, y + 3), c
LINE (x - 6, y + 4)-(x + 6, y + 4), c
PAINT (x, y), c, c
REM c = SGN(cnt1 AND 8) * 14
LINE (x, y + 0)-(x, y + 2), 14
LINE (x - 5, y + 5)-(x - 5, y + 5), c
LINE (x + 5, y + 5)-(x + 5, y + 5), c
RETURN
DRAW.SHIP2:
LINE (x - 4, y - 1)-(x + 4, y + 4), c, BF
LINE (x - 10, y - 2)-(x - 9, y + 3), c, B
LINE (x + 9, y - 2)-(x + 10, y + 3), c, B
LINE (x - 9, y + 4)-(x + 9, y + 4), c
LINE (x - 1, y + 0)-(x - 1, y + 2), 14
LINE (x + 1, y + 0)-(x + 1, y + 2), 14
RETURN
DRAW.SHIP3:
LINE (x - 8, y)-(x - 4, y - 4), c
LINE (x - 4, y - 4)-(x + 4, y - 4), c
LINE (x + 4, y - 4)-(x + 8, y), c
LINE (x - 8, y)-(x - 4, y + 4), c
LINE (x - 4, y + 4)-(x + 4, y + 4), c
LINE (x + 4, y + 4)-(x + 8, y), c
PAINT (x, y), c, c
LINE (x - 13, y)-(x + 13, y), c
LINE (x - 14, y - 4)-(x - 13, y + 3), c, B
LINE (x + 13, y - 4)-(x + 14, y + 3), c, B
PSET (x - 13, y + 3), 0: PSET (x + 13, y + 3), 0
LINE (x - 2, y - 1)-(x - 2, y + 1), 14
LINE (x, y - 1)-(x, y + 1), 14
LINE (x + 2, y - 1)-(x + 2, y + 1), 14
RETURN
DRAW.SHOT:
FOR n = 0 TO shmax: xs = xsh(n): ys = ysh(n)
IF ys < 0 THEN GOTO DRAW.SHOT1
LINE (xs, ys)-(xs, ys + 3), 14
DRAW.SHOT1:
NEXT n
RETURN
DRAW.EXP:
expcnt = 0
FOR n = 0 TO exmax
IF stex(n) = 0 THEN GOTO DRAW.EXP1
T = tex(n): c = 12 + (cnt1 AND 1) * 4: a = ae(n) / 10
x = xex(n): y = yex(n): z = zex(n) / 16
e$ = CRASH$(T): GOSUB DRAW.SPRITE
ae(n) = (ae(n) + 0) MOD 3600: stex(n) = stex(n) - 1
expcnt = expcnt + 1
DRAW.EXP1:
NEXT n
RETURN
DRAW.ENEMY:
FOR n = 0 TO emax
s = ste(n): IF s < 0 THEN GOTO DRAW.ENEMY1
a = ae(n) / 10: z = ze(n) / 16
x = xe!(n): y = ye!(n)
e = tpe(n): f = bin(anie(e)) * 2
c1 = c1e(e): c2 = c2e(e): GOSUB DRAW.ESPRITE
DRAW.ENEMY1:
NEXT n
RETURN
DRAW.GAMEOVER:
stp = stp + 1
IF k = 29 AND stp > 50 THEN GOTO GAME.OVER
IF stp > 400 THEN GOTO GAME.OVER
ac = 0: sc = 4: cc = 15
yc! = 90
xc! = 120: T$ = "GAME": GOSUB DRAW.TXTF
xc! = 168: T$ = "OVER": GOSUB DRAW.TXTF
RETURN
GAME.OVER:
IF SND = 1 THEN PLAY SEND$
GOSUB WAITKEY0
sc = 8: ac = 0
DO
k = INP(96): k$ = INKEY$
GOSUB DRAW.ESTAR
cc = 16 * RND
T$ = "WELL DONE": xc! = 80: yc! = 60: GOSUB DRAW.TXTZ
LOCATE 14, 11
PRINT "SCORE: "; score&; "PTS"
GOSUB REFR.SCREEN
LOOP UNTIL k = 29
RUN
DRAW.SPRITE:
x$ = LTRIM$(STR$(x)): y$ = LTRIM$(STR$(y))
a$ = LTRIM$(STR$(a)): c$ = LTRIM$(STR$(c))
z$ = LTRIM$(STR$(z))
s$ = "S" + z$ + "TA" + a$ + "C" + c$ + "bm" + x$ + "," + y$ + e$
IF z > 1 THEN s$ = s$ + "P" + c$ + "," + c$
DRAW s$
RETURN
DRAW.SSPRITE:
x$ = LTRIM$(STR$(x)): y$ = LTRIM$(STR$(y))
a$ = LTRIM$(STR$(a)): c$ = LTRIM$(STR$(c)): z$ = LTRIM$(STR$(z))
s$ = "S" + z$ + "TA" + a$ + "C" + c$ + "bm" + x$ + "," + y$ + SHOT$(e)
DRAW s$
RETURN
DRAW.ESPRITE:
x$ = LTRIM$(STR$(x)): y$ = LTRIM$(STR$(y))
a$ = LTRIM$(STR$(a)): c1$ = LTRIM$(STR$(c1)): c2$ = LTRIM$(STR$(c2))
z$ = LTRIM$(STR$(z))
e1$ = ENEMY$(e, f): e2$ = ENEMY$(e, f + 1)
s$ = "S" + z$ + "TA" + a$ + "C" + c1$ + "bm" + x$ + "," + y$ + e1$
IF z > 1 THEN s$ = s$ + "P" + c1$ + "," + c1$
s$ = s$ + "C" + c2$ + e2$
IF z > 1 THEN s$ = s$ + "P" + c2$ + "," + c2$
DRAW s$
RETURN
DRAW.PLAYER1:
SCREEN 7, 0, 0, 0: CLS
cc = 15: yc! = 90
xc! = 120: T$ = "PLAYER": GOSUB DRAW.TXT
xc! = 182: i = 1: GOSUB DRAW.INTF
RETURN
TEST.HIT.SHOT:
FOR n = 0 TO shmax: xs = xsh(n): ys = ysh(n)
IF ys < 0 THEN GOTO TEST.HIT.SHOT1
c = POINT(xs, ys) + POINT(xs, ys + 1) + POINT(xs, ys + 2)
IF c > 0 THEN GOSUB HIT.SHOT
TEST.HIT.SHOT1:
NEXT n
RETURN
TEST.HIT.PLAYER:
IF stp <> 0 THEN RETURN
c = POINT(xp, yp - 3) + POINT(xp, yp + 2) + POINT(xp - 3, yp) + POINT(xp + 3, yp)
IF c <= 0 THEN RETURN
c1 = POINT(319, 199) * 4
c2 = POINT(0, 0) + POINT(319, 0) + POINT(0, 199) + POINT(319, 199)
IF c1 = c2 AND c1 > 0 THEN RETURN
GOSUB HIT.PLAYER
RETURN
HIT.SHOT:
x! = xs: y! = ys: r1! = hitrad
FOR e = 0 TO emax
IF ste(e) <> 0 THEN GOTO HIT.SHOT1
dx! = xe!(e) - x!: dy! = ye!(e) - y!
r! = SQR(dx! * dx! + dy! * dy!)
IF r! < r1! THEN ysh(n) = -1: GOSUB HIT.ENEMY: EXIT FOR
HIT.SHOT1:
NEXT e
IF stbos < 0 THEN RETURN
dx! = xbos! - x!: dy! = ybos! - y!
rr! = SQR(dx! * dx! + dy! * dy!)
IF rr! < hrbos(tbos) THEN ysh(n) = -1: GOSUB HIT.BOSS
RETURN
HIT.BOSS:
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SHITBOS1$
IF stbos < 0 THEN RETURN
IF stbos = 0 THEN GOTO EXP.BOSS
stbos = stbos - 1: hbos = 1
xex(0) = x!: yex(0) = y!: stex(0) = 12
zex(0) = 32: tex(0) = 2
GOSUB ACTIV.BOSS
RETURN
EXP.BOSS:
stbos = -160: dx = 48: d = 2
IF tbos = 7 THEN dx = 120: d = 4
FOR m = 0 TO exmax
xex(m) = xbos! + dx * RND - dx * .5: yex(m) = ybos! + 32 * RND - 16
stex(m) = 30 + 30 * RND
zex(m) = (3 + INT(d * RND)) * 16: tex(m) = 1
NEXT m
FOR m = 0 TO fmax
fx!(m) = xbos!: fy!(m) = ybos!: a! = pi! * 2 * RND
dfx!(m) = COS(a!) * 4: dfy!(m) = SIN(a!) * 4
fc(m) = 15
NEXT m
RETURN
PLAY.ENEMY.CRASH:
IF T = 1 THEN PLAY SETYPE1$
IF T = 2 THEN PLAY SETYPE2$
IF T = 3 THEN PLAY SETYPE3$
IF T = 4 THEN PLAY SETYPE4$
IF T = 5 THEN PLAY SETYPE1$
IF T = 6 THEN PLAY SETYPE1$
IF T = 7 THEN PLAY SETYPE1$
IF T = 8 THEN PLAY SETYPE8$
IF T = 9 THEN PLAY SETYPE9$
IF T = 10 THEN PLAY SETYPE10$
IF T = 11 THEN PLAY SETYPE11$
RETURN
HIT.ENEMY:
IF PLAY(0) = 0 AND SND = 1 THEN T = tpe(e): GOSUB PLAY.ENEMY.CRASH
ste(e) = -1: GOSUB CREATE.EXP
hitcnt = hitcnt + 1: pts& = ptse(tpe(e)) * STAGE: GOSUB LOAD.SCORE
T = tpe(e)
IF dble(T) = 0 THEN RETURN ' unteilbar/teilbar
SPLIT.ENEMY:
f = e + 1
ste(e) = 0: ae(e) = 900: ze(e) = zoome(T + 1): zze(e) = ze(e)
ste(f) = 0: ae(f) = 900: ze(f) = zoome(T + 1): zze(f) = ze(f)
tpe(e) = T + 1: tpe(f) = T + 1
mt1 = table(T + 1): mt2 = table(T + 1)
tce(e) = tce0(mt1): tce(f) = tce0(mt2): tce(e) = 72: tce(f) = 88
dae(e) = tae(tce(e)): ne(e) = tne(tce(e))
dae(f) = tae(tce(f)): ne(f) = tne(tce(f))
xe!(f) = xe!(e): ye!(f) = ye!(e)
IF PLAY(0) = 0 AND SND = 1 THEN PLAY SSPLIT$
RETURN
HIT.PLAYER:
REM LOCATE 2, 1: PRINT "HIT ON PLAYER!"
stp = -35: f1! = 600
FOR q = 1 TO 3
IF ssec(q) = 1 THEN ssec(q) = -1: EXIT FOR
NEXT q
GOSUB SETUP.SHIP
x0 = xp: y0 = yp + 6: GOSUB CREATE.SHIPEXPLODE
RETURN
CREATE.EXP:
exptr = (exptr + 1) AND exmax
IF stex(exptr) > 0 THEN RETURN
xex(e) = xe!(e): yex(e) = ye!(e): stex(e) = 30
zex(e) = ze(e): tex(e) = 1
RETURN
LOAD.SCORE:
B& = bonplay&
s& = score&: score& = score& + pts&
IF (score& MOD B&) > (s& MOD B&) THEN RETURN
SCREEN 7, 0, scr, scr
FOR q = 1 TO 3: IF ssec(q) = -1 THEN ssec(q) = 0: EXIT FOR
NEXT q
x = 160: y = 20: c = 4
ON q GOSUB DRAW.SHIP1, DRAW.SHIP2, DRAW.SHIP3
sc = 4: ac = 0: cc = 15
T$ = "BONUS PLAYER": xc! = 178: yc! = 17: GOSUB DRAW.TXTZ
IF ssec(1) = 0 THEN ssec(1) = 1: ssec(2) = 0: ssec(3) = 0: GOSUB SETUP.SHIP
IF SND = 1 THEN PLAY SBONPLAY$
c = 50: GOSUB PAUSE: SCREEN 7, 0, 1 - scr, scr
RETURN
REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DOCKING:
REM REM PLAY SDOCK1$: DO: LOOP UNTIL PLAY(0) = 0
ss1 = 0: ss2 = 0
IF ssec(1) = 1 THEN ss1 = ss1 OR 1
IF ssec(2) = 1 THEN ss1 = ss1 OR 2
IF ssec(3) = 1 THEN GOTO DOCK.END
IF ssec(3) = 0 THEN ss2 = 4: dp = 5
IF ssec(2) = 0 THEN ss2 = 2: dp = 0
IF ss2 = 0 THEN GOTO DOCK.END
xb = scx: yb = 172
xp! = xb - 30 + 60 * RND: yp! = 100: vxp! = 0: vyp! = 0
dyp! = 0: IF ss1 = 3 THEN dyp! = 6
fcnt = 0: FOR n = 0 TO fmax: ft(n) = -1: NEXT n
grav! = .01 + ss1 * .006
dfuel = 1000: dtime! = 10
FOR n = 0 TO 1: SCREEN 7, 0, n, n: CLS
LOCATE 4, 9: PRINT "Time": LOCATE 4, 27: PRINT "Fuel"
GOSUB DRAW.VALUES: LOCATE 9, 12: PRINT "Docking Sequence"
NEXT n
GOSUB WAITFIRE: timer0! = TIMER + dtime!
DOCK.MAIN:
k0 = k: k = INP(96): k$ = INKEY$
IF k = 1 THEN END
IF k = 29 THEN GOSUB THRUST
IF k = 75 THEN vxp! = vxp! - .03
IF k = 77 THEN vxp! = vxp! + .03
vyp! = vyp! + grav!
GOSUB MOVE.SECTION
GOSUB MOVE.FIRE
GOSUB REFR.DOCKSCREEN
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
GOSUB DRAW.SECTION
GOTO TEST.HIT.BASE
DOCK.MAIN1:
dtime! = timer0! - TIMER
GOSUB DRAW.DSTAR
GOSUB DRAW.VALUES: GOSUB DRAW.FIRE
GOSUB DRAW.BASE: GOSUB DRAW.SECTION
cnt1 = (cnt1 + 1) AND 255
GOTO TEST.DOCK.OUT
GOTO DOCK.MAIN
THRUST:
IF dfuel = 0 THEN RETURN
vyp! = vyp! - .07: dfuel = dfuel - 8: IF dfuel < 0 THEN dfuel = 0
IF SND = 1 THEN SOUND 37 + 80 * RND, .3
GOSUB CREATE.FIRE
RETURN
DRAW.DSTAR:
FOR n = 0 TO stmax
x = xst(n): y = yst(n): c = cst(n)
IF POINT(x, y) = 0 THEN PSET (x, y), c
NEXT n
IF cnt1 = 0 THEN RETURN
n = stmax * RND: xst(n) = 300 * RND + 10: yst(n) = 180 * RND + 10
RETURN
TEST.DOCK.OUT:
IF xp! < 0 OR xp! > 319 OR yp! < 32 OR yp! > 199 THEN GOTO DOCK.OUT
IF dtime! < .1 THEN GOTO DOCK.OUT
GOTO DOCK.MAIN
DRAW.VALUES:
LOCATE 6, 8: PRINT INT(dtime! * 10) / 10
LOCATE 6, 26: PRINT INT(dfuel / 10)
RETURN
DOCK.END:
RETURN
MOVE.FIRE:
FOR n = 0 TO fmax: IF ft(n) < 0 THEN GOTO MOVE.FIRE1
fx!(n) = fx!(n) + dfx!(n): fy!(n) = fy!(n) + dfy!(n): ft(n) = ft(n) - 1
IF POINT(fx!(n), fy!(n)) = 9 THEN dfy!(n) = -dfy!(n) / 2
MOVE.FIRE1:
NEXT n
RETURN
CREATE.FIRE:
IF ft(fcnt) >= 0 THEN RETURN
a! = pi2! + 1 * RND - .5: dv! = ABS(pi2! - a!) * 2: v! = 2 - dv!
fx!(fcnt) = xp!: fy!(fcnt) = yp! + 4
dfx!(fcnt) = COS(a!) * v! + vxp!: dfy!(fcnt) = SIN(a!) * v! + vyp!
ft(fcnt) = 8: fc(fcnt) = 14 - INT(2 * RND) * 8
fcnt = (fcnt + 1) AND fmax
RETURN
DRAW.FIRE:
FOR n = 0 TO fmax: IF ft(n) < 0 THEN GOTO DRAW.FIRE1
x = fx!(n): y = fy!(n): PSET (x, y), fc(n)
DRAW.FIRE1:
NEXT n
MOVE.SECTION:
xp! = xp! + vxp!: yp! = yp! + vyp!
RETURN
DRAW.SECTION:
IF (ss1 AND 1) = 1 THEN x = xp!: y = yp! - dyp!: c = 4: GOSUB DRAW.SHIP1
IF (ss1 AND 2) = 2 THEN x = xp!: y = yp!: c = 9: GOSUB DRAW.SHIP2
RETURN
DRAW.BASE:
IF ss2 = 2 THEN x = xb: y = yb: c = 9: GOSUB DRAW.SHIP2
IF ss2 = 4 THEN x = xb: y = yb: c = 5: GOSUB DRAW.SHIP3
RETURN
TEST.HIT.BASE:
n = dp
x = xb + pcx(n): y = yb + pcy(n)
IF POINT(x, y) > 0 THEN GOTO TEST.DOCK.OK
c = 14: IF (cnt1 AND 16) = 0 THEN c = 0
PSET (x, y), c
FOR n = dp + 1 TO dp + 4
x = xb + pcx(n): y = yb + pcy(n)
IF POINT(x, y) > 0 THEN GOTO DOCK.CRASH
REM PSET (x, y), 14
NEXT n
GOTO DOCK.MAIN1
TEST.DOCK.OK:
IF ABS(xp! - xb) > 3 THEN GOTO DOCK.CRASH
IF vyp! > .8 THEN GOTO DOCK.CRASH
GOTO DOCK.OK
DOCK.OK:
xp! = xb: yp! = yb + pcy(db) - 4
IF (ss1 AND 2) = 2 THEN yp! = yp! - 3
GOSUB REFR.DOCKSCREEN: SCREEN 7, 0, scr, scr: CLS
GOSUB DRAW.VALUES
GOSUB DRAW.BASE: GOSUB DRAW.SECTION
LOCATE 9, 15: PRINT "Right On !"
IF ss2 = 2 THEN ssec(2) = 1: GOSUB SETUP.SHIP
IF ss2 = 4 THEN ssec(3) = 1: GOSUB SETUP.SHIP
IF SND = 1 THEN PLAY SDOCK2$
DO: LOOP WHILE PLAY(0) > 0: c = 20: GOSUB PAUSE
T = INT(dtime! * 10) / 10: f = dfuel / 10: s = 200 * T + 10 * f
LOCATE 13, 6: PRINT "Bonus = 200 x"; T
LOCATE 15, 6: PRINT " + 10 x"; f; " ="; s; "x"; STAGE
pts& = s * STAGE: GOSUB LOAD.SCORE
IF SND = 1 THEN PLAY SRGTON$
GOSUB WAITFIRE
RETURN
DOCK.OUT:
SCREEN 7, 0, scr, scr
LOCATE 9, 10: PRINT "Section Out of Range"
GOSUB WAITFIRE
RETURN
DOCK.CRASH:
s = 0: z1 = 4: f1! = 40
FOR n = 1 TO 200
a1 = 3600 * RND: c1 = (s AND 1) * 3 + 12
c2 = 15 - (s AND 1) * 3
IF s = 0 THEN z2 = 3 + 4 * RND: a2 = 3600 * RND: c2 = 15
GOSUB REFR.DOCKSCREEN: GOSUB DRAW.VALUES
LOCATE 9, 13: PRINT "Sorry, no Bonus"
x = xp!: y = yp!: a = a1 / 10: c = c1: z = z1
e$ = CRASH$(1): GOSUB DRAW.SPRITE
x = xb: y = yb: a = a2 / 10: c = c2: z = z2
e$ = CRASH$(1): GOSUB DRAW.SPRITE
s = (s + 1) AND 7
GOSUB DOCK.CRASH.SND
NEXT n
GOSUB WAITFIRE
RETURN
DOCK.CRASH.SND:
f2! = f1! * RND: f1! = f1! * .98
IF n < 150 AND SND = 1 THEN SOUND 37 + f2! * f2!, .3
RETURN
REM - - - - - - - - - - - - - - - - - - - - - - - -
ADVANCE.LEVEL:
LEVEL = LEVEL + 1
IF STAGE = 6 AND LEVEL = 10 THEN GOTO SUPER.LEVEL
IF LEVEL = 9 THEN GOTO BOSS.LEVEL
IF LEVEL = 10 THEN GOTO WARP.LEVEL
IF LEVEL = 11 THEN GOTO GAME.FINISH
GOSUB LOAD.LEVEL
RETURN
SUPER.LEVEL:
STAGE = 7: GOSUB ENTER.STAGE
tbos = tbos + 1: GOSUB BOSS.LEVEL
stbos = 50
LEVEL = 9: GOSUB LOAD.LEVEL
LEVEL = 10: cresum = 24: hitsum = 24
c1e(6) = 4: c2e(6) = 12
c1e(7) = 12: c2e(7) = 14
RETURN
BOSS.LEVEL:
evcnt = 70: evtpe = 2: evtxt$ = BOSS$(STAGE)
stbos = 8 + tbos * 4: abos = 0
xbos! = scx: ybos! = 50: dxbos! = 0: dybos! = 0
cresum = 0: crecnt = 0: hitcnt = 0: hitsum = 0
RETURN
LOAD.LEVEL:
n = LEVEL
hitrad = lrad(n): tpe = ltpe(n): mt = table(tpe)
vec = vec(mt)
cresum = lsum(n) + (STAGE - 1) * 2
crecnt = 0: hitcnt = 0: hitsum = cresum * lhit(n)
crec0 = crec(mt): crec1 = crec0
s = (STAGE - 1) MOD 3: REM LOAD COLOR TABLE
FOR e = 1 TO 11: c1e(e) = c1ee(s, e): c2e(e) = c2ee(s, e): NEXT e
RETURN
WARP.LEVEL:
dyp! = .5: dys! = .5: ypp = yp: yp! = yp
f1! = 0
GOSUB SAVE.PALETTE
FOR o = 1 TO 260
IF INP(96) = 1 THEN END
GOSUB DRAW.WARPSTAR
GOSUB DRAW.PLAYER
yp = yp!: yp! = yp! - dyp!: dyp! = dyp! * 1.01: dys! = dys! + .1
WAIT &H3DA, 8, 8: WAIT &H3DA, 8
SCREEN 7, 0, 1 - scr, scr: scr = 1 - scr: CLS
IF o > 30 AND o < 150 THEN LOCATE 10, 14: PRINT " WARP OUT ! "
IF o < 180 THEN f1! = f1! + 3
IF o = 180 THEN f1! = 5000
IF o > 60 THEN c1 = 1: c2 = 31: c3 = 2: GOSUB INC.PALETTE
IF o > 180 THEN c1 = 0: c2 = 0: c3 = 4: GOSUB INC.PALETTE: f1! = f1! * .92
IF SND = 1 THEN SOUND 37 + f1! * RND, .3
NEXT o
SCREEN 7, 0, scr, scr: CLS
c1 = 0: c2 = 0: c3 = 4
FOR o = 1 TO 16: WAIT &H3DA, 8: WAIT &H3DA, 8, 8: GOSUB DEC.PALETTE: NEXT o
GOSUB LOAD.PALETTE
yp = ypp
REM IF SND = 1 THEN PLAY SFAROUT2$: PLAY SFAROUT2$
REM c = 70: GOSUB PAUSE
REM DO: LOOP UNTIL PLAY(0) < 4
LEVEL = 2: STAGE = STAGE + 1
GOSUB LOAD.LEVEL
tbos = tbos + 1: IF tbos > 6 THEN tbos = 1
c = 20: GOSUB PAUSE
GOSUB ENTER.STAGE
RETURN
ENTER.STAGE:
evcnt = 70: evtpe = 2: evtxt$ = "STAGE " + LTRIM$(STR$(STAGE))
GOSUB LOAD.3DSTAR
SCREEN 7, 0, 2, 0: CLS
xs! = 159: ys! = 160: rs! = 20
ON STAGE GOSUB DSTG1, DSTG2, DSTG3, DSTG4, DSTG5, DSTG6, DSTG7
REM IF SND = 1 THEN PLAY SSTAGE1$
ENTER.STAGE1:
xs! = 159: ys! = 99: rs! = 8: rsmax! = 40: cnt = 0
u$ = "STAGE " + LTRIM$(STR$(STAGE)): tptr = 0: mode = 0
sss = -(STAGE > 2 AND STAGE < 7): fs! = 1.02: cnt1 = 10: cnt2 = 0
DO
k = INP(96): k$ = INKEY$
rs! = rs! * fs!: vs! = 1.08
IF rs! >= rsmax! AND mode = 0 THEN rs! = rsmax!: vs! = 1.02
GOSUB ENTER.STAGE2
IF cnt < 160 AND mode = 0 THEN GOSUB ENTER.STAGE3
IF (cnt AND 7) = 7 THEN GOSUB ENTER.STAGE5
cnt = cnt + 1: IF cnt > 300 THEN GOSUB ENTER.STAGE4
GOSUB REFR.SCREEN
IF mode = 1 AND sss = 1 AND SND = 1 THEN SOUND 37 + cnt1 * RND, 1: cnt1 = (cnt1 * 1.2) MOD 32000
IF cnt2 = 4 AND SND = 1 THEN PLAY SSTAGE2$
IF k = 29 AND rs! >= rsmax! THEN GOSUB ENTER.STAGE4
LOOP WHILE rs! < 200
RETURN
ENTER.STAGE2:
IF sss = 0 THEN PCOPY 2, 1 - scr: RETURN
GOSUB DRAW.3DSTAR
ON STAGE - 2 GOSUB DSTG3, DSTG4, DSTG5, DSTG6
RETURN
ENTER.STAGE3:
T$ = LEFT$(u$, tptr)
xc! = 136: yc! = 24: ac = 0: sc = 4: cc = 15
GOSUB DRAW.TXTZ
T$ = STAGE$(STAGE)
xc! = 159 - LEN(T$) * 4: yc! = 44: ac = 0: sc = 4: cc = 15
s = (cnt AND 8)
IF tptr <= 8 OR s > 0 AND cnt2 < 24 THEN RETURN
GOSUB DRAW.TXTZ: cnt2 = cnt2 + 1
RETURN
ENTER.STAGE4: REM launch
mode = 1: fs! = 1.04: RETURN
ENTER.STAGE5:
tptr = tptr + 1: IF tptr < 8 THEN SOUND 622, 1
RETURN
SAVE.PALETTE:
OUT &H3C7, 0
FOR c = 0 TO 95: cp(c) = INP(&H3C9): NEXT c
RETURN
LOAD.PALETTE:
OUT &H3C8, 0
FOR c = 0 TO 95: OUT &H3C9, cp(c): NEXT c
RETURN
INC.PALETTE:
FOR c = c1 TO c2: OUT &H3C7, c
a = INP(&H3C9): a = a + c3: IF a > 63 THEN a = 63
B = INP(&H3C9): B = B + c3: IF B > 63 THEN B = 63
d = INP(&H3C9): d = d + c3: IF d > 63 THEN d = 63
OUT &H3C8, c: OUT &H3C9, a: OUT &H3C9, B: OUT &H3C9, d
NEXT c
RETURN
DEC.PALETTE:
FOR c = c1 TO c2: OUT &H3C7, c
a = INP(&H3C9): a = a - c3: IF a < 0 THEN a = 0
B = INP(&H3C9): B = B - c3: IF B < 0 THEN B = 0
d = INP(&H3C9): d = d - c3: IF d < 0 THEN d = 0
OUT &H3C8, c: OUT &H3C9, a: OUT &H3C9, B: OUT &H3C9, d
NEXT c
RETURN
DRAW.WARPSTAR:
dys = dys!
FOR n = 0 TO stmax
x = xst(n): y = yst(n)
LINE (x, y)-(x, y + dys), cst(n)
y = y + dys: yst(n) = y: IF y > 200 THEN yst(n) = -20: xst(n) = 320 * RND
NEXT n
RETURN
REM - - - - - - - - - - - - - - - - - - - - -
REM - - - - - - CREDITS - - - - - - -
GAME.FINISH:
GOSUB WAITKEY0
sc = 8: ac = 0: s = 1: GOSUB LOAD.SONG: GOSUB LOAD.3DSTAR
tcnt = 24: tptr = 0: cnt1 = -100: dy = 24: vs! = 1.06: cnt2 = 120
DO
k = INP(96): k$ = INKEY$
GOSUB DRAW.3DSTAR
d = 2: cc = 13
IF cnt1 < 0 THEN cnt1 = cnt1 + 1: cc = 16 * RND: d = 0
IF tptr > 28 THEN d = 0: cnt2 = cnt2 - 1
IF cnt2 = 0 THEN s = 2: GOSUB LOAD.SONG
tcnt = tcnt - d
IF tcnt = 0 THEN tcnt = dy: tptr = tptr + 1
yc! = tcnt - dy
FOR n = 1 TO 11
T$ = CREDIT$(n + tptr)
xc! = 20: GOSUB DRAW.TXTZ
yc! = yc! + dy
NEXT n
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
GOSUB REFR.SCREEN: GOSUB PLAY.SONG
LOOP UNTIL (k = 29 AND cnt1 >= 0)
GOTO GAME.OVER
LOAD.SONG:
nsong = s: stsong = 1: tsong = 1: RETURN
PLAY.SONG:
IF stsong < 1 THEN RETURN
IF PLAY(0) > 0 THEN RETURN
PLAY SFINAL$(nsong, tsong)
tsong = tsong + 1: IF tsong > 7 THEN stsong = 0
RETURN
LOAD.3DSTAR:
FOR n = 0 TO stmax
x = 26 * RND - 13: y = 20 * RND - 10
xst!(n) = x * x * SGN(x): yst!(n) = y * y * SGN(y)
NEXT n
RETURN
DRAW.3DSTAR:
FOR n = 0 TO stmax
x! = xst!(n): y! = yst!(n): c = cst(n)
r! = SQR(x! * x! + y! * y!)
x! = x! * vs!: y! = y! * vs!
IF r! > 160 THEN r! = 2 + 6 * RND: a! = pi! * 2 * RND: x! = COS(a!) * r!: y! = SIN(a!) * r!
PSET (scx + x!, scy - y!), 15
xst!(n) = x!: yst!(n) = y!
NEXT n
RETURN
REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TITLE:
a = 0: CH = 0: mode1 = 1: mode2 = 6: cnt = 35
TITLE.MAIN:
k = INP(96): k$ = INKEY$: IF k = 1 THEN END
IF k = 29 THEN RETURN
IF k = 31 THEN SND = 1 - SND: GOSUB WAITKEY0
IF k = 59 THEN GOSUB TITLE.HELP
GOSUB CARE.TITLE
GOSUB CARE.MENU
GOTO TITLE.MAIN
CARE.TITLE:
GOSUB MOVE.TITLE: IF mode1 > 4 THEN RETURN
cc = 15: GOSUB DRAW.TITLE: GOSUB DRAW.YEAR
WAIT &H3DA, 8, 8: WAIT &H3DA, 8
GOSUB REFR.TITLE
RETURN
DRAW.TITLE:
FOR n = 0 TO 7
nc = nc(n): ac = 0
xc! = xc!(n): yc! = yc!(n): zc! = zc!(n)
GOSUB DRAW.CHAR3D
NEXT n
RETURN
DRAW.YEAR:
IF CH < 8 THEN RETURN
FOR n = 8 TO 9
nc = nc(n): ac = 0
xc! = xc!(n): yc! = yc!(n): zc! = zc!(n)
GOSUB DRAW.CHAR3D
NEXT n
RETURN
MOVE.TITLE:
ON mode1 GOTO MTIT1, MTIT2, MTIT3, MTIT4
RETURN
MTIT1:
zc!(CH) = zc!(CH) - 12: IF zc!(CH) <= zmax AND SND = 1 THEN PLAY SCRASH8$
IF zc!(CH) <= zmax THEN CH = CH + 1
IF CH > 7 THEN mode1 = mode1 + 1: cnt = 2000
RETURN
MTIT2:
xc!(8) = xc!(8) - 2: yc!(8) = yc!(8) - 1
xc!(9) = xc!(9) - 2: yc!(9) = yc!(9) - 1
SOUND cnt, .4: cnt = cnt - 44
IF yc!(8) <= yc!(7) + 8 THEN mode1 = mode1 + 1: cnt = 35
RETURN
MTIT3:
cnt = cnt - 1: IF cnt = 34 AND SND = 1 THEN PLAY SCRASH9$
IF cnt = 0 THEN cnt = 35: mode1 = mode1 + 1
RETURN
MTIT4:
SCREEN 7, 0, scr, scr
scx = scx - 1: cc = 14: GOSUB DRAW.TITLE
scx = scx + 2: cc = 14: GOSUB DRAW.TITLE: scx = scx - 1
scy = scy - 1: cc = 14: GOSUB DRAW.TITLE
scy = scy + 2: cc = 14: GOSUB DRAW.TITLE: scy = scy - 1
cc = 4: GOSUB DRAW.TITLE
mode1 = mode1 + 1: mode2 = 1
sss = scx
FOR scx = sss - 2 TO sss + 2: cc = 15: GOSUB DRAW.YEAR: NEXT scx
x = 214: y = 15
CIRCLE (x, y), 5, 15: PAINT (x, y), 15, 15
CIRCLE (x - 3, y - 1), 5, 1: PAINT (x - 3, y - 1), 1, 1
RETURN
REFR.TITLE:
SCREEN 7, 0, scr, 1 - scr: scr = 1 - scr
LINE (0, 0)-(319, 120), 0, BF
RETURN
CARE.MENU:
IF mode2 < 6 THEN GOTO DRAW.MENU
RETURN
DRAW.MENU:
WAIT &H3DA, 8, 8: WAIT &H3DA, 8
ON mode2 GOTO DMEN1, DMEN2, DMEN3, DMEN4, DMEN5
RETURN
DMEN1:
cnt = cnt - 1: IF cnt = 0 THEN cnt = 35: mode2 = mode2 + 1
RETURN
DMEN2:
SCREEN 7, 0, scr, scr
x = 40: y = 66: a = 90: c1 = 8: c2 = 15: f = 0: z = 4
FOR e = 1 TO 5: GOSUB DRAW.ESPRITE: REM PSET (x, y), 10
y = y + 18: NEXT e
mode2 = mode2 + 1: x = 58
RETURN
DMEN3:
IF (x AND 7) > 0 THEN GOTO DMEN31
y = 70: c1 = 15
FOR e = 1 TO 5
REM LINE (x, y)-(x + 1, y + 1), 7, BF
REM PSET (x, y + 1), 15: PSET (x + 1, y), 8
LINE (x, y)-(x + 1, y), 8
LINE (x, y + 1)-(x + 1, y + 1), 15
y = y + 18: NEXT e
DMEN31:
x = x + 1: IF x >= 208 THEN mode2 = mode2 + 1
RETURN
DMEN4:
ac = 0: sc = 4: cc = 15: yc! = 64
FOR e = 1 TO 5
i = ptse(e): xc! = 220: GOSUB DRAW.INTF
T$ = "PTS": xc! = 234: GOSUB DRAW.TXTF: yc! = yc! + 18
NEXT e
ac = 0: sc = 4: cc = 7
xc! = 54: yc! = 162: T$ = "PRESS F1 FOR BRIEFING": GOSUB DRAW.TXTZ
mode2 = mode2 + 1
RETURN
DMEN5:
ac = 0: sc = 4: cc = 16 * RND
xc! = 100: yc! = 180: T$ = "PRESS FIRE": GOSUB DRAW.TXTZ
RETURN
REM - - - - - - - - - - - - - - - - -
DRAW.CHAR3D:
zf! = 100 / zc!: sc = zf! * 4
xd = INT(scx + xc! * zf!): yd = INT(scy - yc! * zf!)
x$ = LTRIM$(STR$(xd)): y$ = LTRIM$(STR$(yd))
ta$ = LTRIM$(STR$(ac)): c$ = LTRIM$(STR$(cc))
zs$ = LTRIM$(STR$(sc))
s$ = "TA" + ta$ + "S" + zs$ + "C" + c$ + "bm" + x$ + "," + y$ + CH$(nc)
DRAW s$
RETURN
DRAW.CHAR:
xd = xc!: yd = yc!
x$ = LTRIM$(STR$(xd)): y$ = LTRIM$(STR$(yd))
ta$ = LTRIM$(STR$(ac)): c$ = LTRIM$(STR$(cc))
zs$ = LTRIM$(STR$(sc))
s$ = "TA" + ta$ + "S" + zs$ + "C" + c$ + "bm" + x$ + "," + y$ + CH$(nc)
DRAW s$
RETURN
DRAW.FCHAR:
xd = xc!: yd = yc!
x$ = LTRIM$(STR$(xd)): y$ = LTRIM$(STR$(yd))
ta$ = LTRIM$(STR$(ac)): c$ = LTRIM$(STR$(cc))
zs$ = LTRIM$(STR$(sc))
s$ = "TA" + ta$ + "S" + zs$ + "C" + c$ + "bm" + x$ + "," + y$ + CH$(nc)
DRAW s$: x$ = LTRIM$(STR$(xd - 1))
s$ = "TA" + ta$ + "S" + zs$ + "C" + c$ + "bm" + x$ + "," + y$ + CH$(nc)
DRAW s$: x$ = LTRIM$(STR$(xd + 1))
s$ = "TA" + ta$ + "S" + zs$ + "C" + c$ + "bm" + x$ + "," + y$ + CH$(nc)
DRAW s$
RETURN
DRAW.INTF:
sc = 4: x! = xc!: ac = 0: sc = 4
FOR m = 0 TO 5
nc = i MOD 10
GOSUB DRAW.FCHAR
xc! = xc! - 10: i = INT(i / 10): IF i = 0 THEN EXIT FOR
NEXT m: xc! = x!
RETURN
DRAW.TXTF:
sc = 4: l = LEN(T$)
FOR m = 1 TO l
nc = ASC(MID$(T$, m, 1)) - 48
GOSUB DRAW.FCHAR
xc! = xc! + 9
NEXT m
RETURN
DRAW.TXT:
sc = 4: l = LEN(T$)
FOR m = 1 TO l
nc = ASC(MID$(T$, m, 1)) - 48
GOSUB DRAW.CHAR
xc! = xc! + 9
NEXT m
RETURN
DRAW.TXTZ:
l = LEN(T$)
FOR m = 1 TO l: nc = ASC(MID$(T$, m, 1)) - 48
IF nc >= 0 THEN GOSUB DRAW.CHAR
xc! = xc! + sc * 2
NEXT m
RETURN
WAITKEY0:
DO: k = INP(96): k$ = INKEY$: LOOP WHILE k < 128
RETURN
PAUSE.MODE:
GOSUB WAITKEY0: SCREEN 7, 0, scr, scr
LOCATE 11, 16: COLOR 14: PRINT "- PAUSE -"
DO: k$ = INKEY$: k = INP(96): LOOP UNTIL k = 25
GOSUB WAITKEY0
RETURN
REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DBOSS1:
c1 = 13: c2 = 12: IF hbos = 1 THEN c1 = 15: c2 = 15
LINE (x - 10, y - 25)-(x, y - 32), 1
LINE (x, y - 32)-(x + 10, y - 25), 1
LINE (x - 10, y - 25)-(x + 10, y - 25), 1
PAINT (x, y - 30), c1, 1
LINE (x - 16, y)-(x, y + 16), 5
LINE (x, y + 16)-(x + 16, y), 5
LINE (x - 16, y)-(x + 16, y), 5
PAINT (x, y + 8), c1, 5
LINE (x, y + 15)-(x + 15, y), 5
LINE (x - 15, y)-(x, y + 15), 5
CIRCLE (x, y), 30, 5, -pi! * 2, -pi!, .85
PAINT (x, y - 10), c2, 5
CIRCLE (x - 11, y - 17), 4, 14: PAINT (x - 11, y - 17), 15, 14
CIRCLE (x + 10, y - 12), 8, 14: PAINT (x + 10, y - 12), 15, 14
CIRCLE (x - 15, y), 8, 14, -pi! * 2, -pi!, .85: PAINT (x - 15, y - 4), 15, 14
CIRCLE (x + 30, y), 8, 14, -pi! * .55, -pi!, .85: PAINT (x + 26, y - 3), 15, 14
s = SIN(cnt1 / 1) * 20 + 30
IF PLAY(0) = 0 AND s > 37 THEN SOUND s, .2
RETURN
DBOSS2:
c1 = 6: c2 = 14: IF hbos = 1 THEN c1 = 15
s = SGN(dybos!)
IF s > 0 THEN abos = abos + 2
IF s = 0 THEN abos = abos + 15
IF s < 0 THEN abos = abos + 30
dy1 = SIN(abos / 100) * 5: dy2 = SIN(abos / 100) * 10
LINE (x, y - 9)-(x + 20, y - 6 + dy1), c1
LINE (x + 20, y - 6 + dy1)-(x + 32, y - 1 + dy2), c1
LINE (x + 32, y - 1 + dy2)-(x + 32, y + 3 + dy2), c1
LINE (x + 32, y + 3 + dy2)-(x, y + 7), c1
LINE (x, y + 7)-(x - 32, y + 3 + dy2), c1
LINE (x - 32, y + 3 + dy2)-(x - 32, y - 1 + dy2), c1
LINE (x - 32, y - 1 + dy2)-(x - 20, y - 6 + dy1), c1
LINE (x - 20, y - 6 + dy1)-(x, y - 9), c1
PAINT (x, y), c1, c1
yy! = y + 4: dy! = dy2 / 7
FOR xx = 2 TO 32 STEP 4
x1 = x + xx: x2 = x - xx
LINE (x1, yy!)-(x1 + 1, yy! + 5), c1, B
LINE (x2 - 1, yy!)-(x2, yy! + 5), c1, B
yy! = yy! + dy!
NEXT xx
LINE (x, y - 9)-(x - 6, y - 3), c2
LINE (x - 6, y - 3)-(x, y + 12), c2
LINE (x, y + 12)-(x + 6, y - 3), c2
LINE (x + 6, y - 3)-(x, y - 9), c2
PAINT (x, y), c2, c2
CIRCLE (x, y - 13), 4, c1, , , 1: PAINT (x, y - 13), c2, c1
LINE (x, y + 11)-(x - 11, y + 23), c1
LINE (x - 11, y + 23)-(x, y + 19), c1
LINE (x, y + 19)-(x + 11, y + 23), c1
LINE (x + 11, y + 23)-(x, y + 11), c1
PAINT (x, y + 16), c2, c1
LINE (x - 1, y - 11)-(x + 1, y - 11), c1
PSET (x - 4, y - 17), c1
PSET (x + 4, y - 17), c1
LINE (x - 2, y - 14)-(x + 2, y - 14), c1
LINE (x - 2, y - 11)-(x - 2, y - 10), 0
LINE (x + 2, y - 11)-(x + 2, y - 10), 0
RETURN
DBOSS3:
c1 = 6: c2 = 14: IF hbos = 1 THEN c1 = 15: c2 = 15
c3 = 4: abos = abos + 1: d = abos AND 63
IF d < 4 THEN c3 = 15 - d / 2
LINE (x, y - 6)-(x + 7, y - 7), c1
LINE (x + 7, y - 7)-(x + 12, y - 10), c1
LINE (x + 12, y - 10)-(x + 20, y - 7), c1
LINE (x + 20, y - 7)-(x + 24, y + 1), c1
LINE (x + 24, y + 1)-(x + 25, y + 9), c1
LINE (x + 25, y + 9)-(x + 20, y + 16), c1
LINE (x + 19, y + 16)-(x + 15, y + 7), c1
LINE (x + 15, y + 7)-(x + 6, y + 2), c1
LINE (x + 6, y + 2)-(x, y + 6), c1
LINE (x, y - 6)-(x - 7, y - 7), c1
LINE (x - 7, y - 7)-(x - 12, y - 10), c1
LINE (x - 12, y - 10)-(x - 20, y - 7), c1
LINE (x - 20, y - 7)-(x - 24, y + 1), c1
LINE (x - 24, y + 1)-(x - 25, y + 9), c1
LINE (x - 25, y + 9)-(x - 20, y + 16), c1
LINE (x - 19, y + 16)-(x - 15, y + 7), c1
LINE (x - 15, y + 7)-(x - 6, y + 2), c1
LINE (x - 6, y + 2)-(x, y + 6), c1
LINE (x + 18, y + 11)-(x + 24, y + 9), c1
PAINT (x + 20, y + 13), c2, c1
LINE (x - 18, y + 11)-(x - 24, y + 9), c1
PAINT (x - 20, y + 13), c2, c1
PAINT (x, y), 2, c1
LINE (x + 3, y)-(x + 5, y - 2), c3
LINE (x - 3, y)-(x - 5, y - 2), c3
LINE (x + 6, y + 2)-(x, y + 6), 4
LINE (x - 6, y + 2)-(x, y + 6), 4
RETURN
DBOSS4:
c1 = 9: c2 = 11: c3 = 15: IF hbos = 1 THEN c1 = 15
CIRCLE (x, y), 30, c1, 0, pi!, .85
CIRCLE (x, y), 30, c1, pi!, pi! * 2, .1
PAINT (x, y - 10), 0, c1
abos = (abos + 1) AND 255
FOR xx = x - 24 TO x + 24 STEP 5
a1! = abos + xx + 1: r1! = SIN(a1! / 4.33)
a2! = abos + xx + 2: r2! = SIN(a2! / 3.97)
a3! = abos + xx + 3: r3! = SIN(a3! / 3.67)
yy = y - 4 - r2!: f1 = 40 - ABS(xx - x): f2 = f1 / 5
x1 = xx + f2 * r1!: x2 = xx + f2 * r2!: x3 = xx + f2 * r3!
LINE (xx, yy)-(x1, yy + 16), c2
LINE (x1, yy + 16)-(x2, yy + 30), c2
LINE (x2, yy + 30)-(x3, yy + 30 + f2 * 2), c2
NEXT xx
CIRCLE (x, y), 30, c3, 0, pi!, .1
RETURN
DBOSS5:
c1 = 9: dy = 0: abos = abos + 1
IF (abos AND 63) > 40 THEN dy = 1
IF hbos = 1 THEN c1 = 15: dy = -2
CIRCLE (x, y), 20, c1, , , .6
PAINT (x, y), c1, c1
LINE (x - 6, y - 12)-(x + 11, y - 24), c1
LINE (x + 11, y - 24)-(x + 8, y - 14), c1
LINE (x + 8, y - 14)-(x + 16, y - 8), c1
PAINT (x + 3, y - 16), c1, c1
LINE (x - 7, y + 12)-(x + 2, y + 20), c1
LINE (x + 2, y + 20)-(x + 7, y + 12), c1
PAINT (x, y + 16), c1, c1
LINE (x + 18, y)-(x + 40, y - 12), c1
LINE (x + 18, y)-(x + 40, y + 12), c1
LINE (x + 40, y - 12)-(x + 36, y), c1
LINE (x + 36, y)-(x + 40, y + 12), c1
PAINT (x + 24, y), c1, c1
CIRCLE (x - 7, y - 4), 5, 15, , , .9: PAINT (x - 7, y - 4), 15, 15
CIRCLE (x - 7, y - 4 + dy), 2, 0, , , .9: PAINT (x - 7, y - 4 + dy), 0, 0
RETURN
DBOSS6:
a = ((abos MOD 7) - 3) * 12: abos = abos + 1
c1 = 6: c2 = 14: c3 = 11: IF hbos = 1 THEN c1 = 15
a! = a * pi! / 180: r = 20: s = 1
FOR q = -2 TO 1
s = SGN(q + .5): a! = -a!
x1 = COS(a!) * r * s: y1 = SIN(a!) * r
CIRCLE (x + x1, y - y1), 8, c3: PAINT (x + x1, y - y1), c3, c3
x2 = COS(a! - .36) * r * s: y2 = SIN(a! - .36) * r
LINE (x, y)-(x + x2, y - y2), c3
x3 = COS(a! + .36) * r * s: y3 = SIN(a! + .36) * r
LINE (x, y)-(x + x3, y - y3), c3
PAINT (x + x1 * .4, y - y1 * .4), c3, c3
NEXT q
CIRCLE (x, y), 11, c1, , , 1.2: PAINT (x, y), c1, c1
CIRCLE (x, y - 12), 8, c1, -pi! * 1.9, -pi! * 1.1, .8
PAINT (x, y - 14), c1, c1
CIRCLE (x - 5, y - 14), 4, 7, , , .8
PAINT (x - 5, y - 14), A5$, 7
CIRCLE (x + 5, y - 14), 4, 7, , , .8
PAINT (x + 5, y - 14), A5$, 7
LINE (x - 8, y - 3)-(x + 8, y - 1), c2, BF
LINE (x - 7, y + 4)-(x + 7, y + 6), c2, BF
c = cnt1 AND 127
IF PLAY(0) = 0 AND SND = 1 AND c < 32 THEN SOUND 1600 + 200 * RND, .6
RETURN
DBOSS7:
c1 = 4: c2 = 12: abos = abos + 1: s = SGN(abos AND 16) * 10
c3 = 4: IF hbos = 1 THEN c3 = 15
IF stbos < 12 THEN c3 = 1
c4 = csb(stbos / 16)
CIRCLE (x - 32, y - 14), 4, 2, , , 1
CIRCLE (x, y - 12), 20, 15
CIRCLE (x + 32, y - 14), 4, 2, , , 1
CIRCLE (x, y - 13), 7, 15, -pi! * 2, -pi!
PAINT (x, y - 14), c4, 15
PAINT (x - 32, y - 15), s, 2
PAINT (x + 32, y - 15), 10 - s, 2
LINE (x - 50, y - 10)-(x + 50, y - 10), c1
LINE (x - 25, y + 10)-(x + 25, y + 10), c1
LINE (x - 50, y - 10)-(x - 80, y), c1
LINE (x - 80, y)-(x - 80, y + 4), c1
LINE (x - 80, y + 4)-(x - 25, y + 10), c1
LINE (x + 50, y - 10)-(x + 80, y), c1
LINE (x + 80, y)-(x + 80, y + 4), c1
LINE (x + 80, y + 4)-(x + 25, y + 10), c1
PAINT (x, y), c1, c1
PAINT (x - 40, y), c1, c1: PAINT (x + 40, y), c1, c1
LINE (x - 40, y - 13)-(x - 43, y - 11), c1
LINE (x - 40, y - 13)-(x + 40, y - 13), c1
LINE (x + 40, y - 13)-(x + 43, y - 11), c1
PAINT (x, y - 12), c2, c1
LINE (x - 80, y - 1)-(x + 80, y + 3), 14, BF
xx = x - 88 + (abos MOD 24)
FOR q = 1 TO 7
LINE (xx, y - 1)-(xx + 11, y + 3), 0, BF
xx = xx + 24
NEXT q
LINE (x - 80, y + 4)-(x - 25, y + 10), c3
LINE (x - 25, y + 10)-(x + 25, y + 10), c3
LINE (x + 80, y + 4)-(x + 25, y + 10), c3
RETURN
REM - - - - - - - - - - - - - - - - - - - - - - - - - - -
DSTG1:
a1! = pi! - .7
FOR n = 1 TO 21
r1 = 400 + 20 * RND
x1 = COS(a1!) * r1 + 300: y1 = 450 - SIN(a1!) * r1
FOR m = 1 TO 20
a2! = pi! * 2 * RND
r = 36 * RND: x2 = x1 + COS(a2!) * r: y2 = y1 + SIN(a2!) * r
PSET (x2, y2), 1
r = 28 * RND: x2 = x1 + COS(a2!) * r: y2 = y1 + SIN(a2!) * r
PSET (x2, y2), 9
r = 16 * RND: x2 = x1 + COS(a2!) * r: y2 = y1 + SIN(a2!) * r
PSET (x2, y2), 11
r = 12 * RND: x2 = x1 + COS(a2!) * r: y2 = y1 + SIN(a2!) * r
PSET (x2, y2), 15
NEXT m
a1! = a1! - .05
NEXT n
RETURN
DSTG2:
c1 = 11: c2 = 9: c3 = 1
FOR n = 1 TO 32
x = 320 * RND: y = 200 * RND
c = 12 + INT(4 * RND): IF c = 13 THEN c = 4
PSET (x, y), c
NEXT n
x = 169: y = 109
CIRCLE (x, y), 36, 9, , , 1
CIRCLE (x, y), 37, 1, , , .94
CIRCLE (x - 19, y - 16), 18, c1, pi2! * 3, pi2! * 4
CIRCLE (x + 19, y - 16), 18, c1, pi2! * 2, pi2! * 3
CIRCLE (x - 19, y + 16), 18, c1, pi2! * 0, pi2! * 1
CIRCLE (x + 19, y + 16), 18, c1, pi2! * 1, pi2! * 2
LINE (x, y - 17)-(x, y - 50), c1
LINE (x, y + 17)-(x, y + 42), c1
LINE (x - 20, y)-(x - 48, y), c1
LINE (x + 20, y)-(x + 44, y), c1
LINE (x, y - 40)-(x, y - 50), c2
LINE (x, y + 40)-(x, y + 45), c2
LINE (x - 34, y)-(x - 48, y), c2
LINE (x + 34, y)-(x + 44, y), c2
LINE (x, y - 50)-(x, y - 54), c3
LINE (x, y + 45)-(x, y + 50), c3
LINE (x - 48, y)-(x - 52, y), c3
LINE (x + 44, y)-(x + 48, y), c3
PAINT (x, y), 15, c1
RETURN
DSTG3:
x = xs!: y = ys!: r1 = rs!: rsmax! = 30
c1 = 4: c2 = 14: c3 = 4: a2! = 0
a2! = a2! + .03
r2 = 0: n = 0: a! = 0
FOR a! = 0 TO pi! * 2 STEP .2
x0 = x1: y0 = y1
f = (r1 / 6) * RND: a1! = a! + .1 * RND
r = r1 + r2 * f: r2 = 1 - r2
x1 = SIN(a1! + a2!) * r + x: y1 = COS(a1! + a2!) * r + y
IF n = 0 THEN x2 = x1: y2 = y1
IF n > 0 THEN LINE (x0, y0)-(x1, y1), c1
n = n + 1
NEXT a!
LINE (x1, y1)-(x2, y2), c1
PAINT (x, y), c2, c1
CIRCLE (x, y), r1 - 2, c3, , , 1
PAINT (x, y), 0, c3
RETURN
DSTG4:
x = xs!: y = ys!: r1 = rs!: rsmax! = 60
c1 = 1: c2 = 9: c3 = 11: c4 = 11
CIRCLE (x, y), r1, c1
CIRCLE (x, y), r1, c2, pi2! * 3, pi2!
CIRCLE (x, y), r1 * .84, c1, pi2!, pi2! * 3, 3
PAINT (x - r1 * .5, y), c1, c1
CIRCLE (x, y), r1 * .84, c2, pi2!, pi2! * 3, 3
PAINT (x + r1 * .5, y), c2, c2
x1 = x - r1 * .36: y1 = y - r1 * .16
CIRCLE (x1, y1), r1 * .16, c2, , , .7: PAINT (x1, y1), c2, c2
x1 = x - r1 * .8: y1 = y - r1 * .05
CIRCLE (x1, y1), r1 * .16, c2, , , 1.8: PAINT (x1, y1), c2, c2
x1 = x - r1 * .6: y1 = y + r1 * .05
CIRCLE (x1, y1), r1 * .2, c2, , , 1: PAINT (x1, y1), c2, c2
x1 = x - r1 * .3: y1 = y + r1 * .1
CIRCLE (x1, y1), r1 * .3, c2: PAINT (x1, y1), c2, c2
x1 = x - r1 * .3: y1 = y + r1 * .1
CIRCLE (x1, y1), r1 * .3, c3, -pi2! * 3.1, -pi2! * .95
PAINT (x1 + r1 * .1, y1), c3, c3
x1 = x + r1 * .24: y1 = y - r1 * .5
CIRCLE (x1, y1), r1 * .16, c3, , , .8: PAINT (x1, y1), c3, c3
x1 = x + r1 * .33: y1 = y - r1 * .3
CIRCLE (x1, y1), r1 * .2, c3, , , .9: PAINT (x1, y1), c3, c3
x1 = x + r1 * .46: y1 = y - r1 * .46
CIRCLE (x1, y1), r1 * .14, c3, , , .9: PAINT (x1, y1), c3, c3
x1 = x + r1 * .02: y1 = y + r1 * .75
CIRCLE (x1, y1), r1 * .12, c3, , , .4: PAINT (x1, y1), c3, c3
x1 = x + r1 * .07: y1 = y + r1 * .67
CIRCLE (x1, y1), r1 * .15, c3, , , .4: PAINT (x1, y1), c3, c3
x1 = x + r1 * .2: y1 = y + r1 * .6
CIRCLE (x1, y1), r1 * .15, c3, , , .66: PAINT (x1, y1), c3, c3
x1 = x + r1 * .9: y1 = y + r1 * .02
CIRCLE (x1, y1), r1 * .14, c3, , , 3: PAINT (x1, y1), c3, c3
x1 = x + r1 * .7: y1 = y + r1 * .13
CIRCLE (x1, y1), r1 * .17, c3, , , 1.2: PAINT (x1, y1), c3, c3
x1 = x - r1 * .01: y1 = y - r1 * .8
CIRCLE (x1, y1), r1 * .12, c3, -pi2! * 2.5, -pi2! * 1.3, .2: PAINT (x1 + r1 * .06, y1), c3, c3
x1 = x - r1 * .08: y1 = y - r1 * .8
CIRCLE (x1, y1), r1 * .12, c2, -pi2! * 1, -pi2! * 2.8, .2
PAINT (x1 - r1 * .04, y1), c2, c2
CIRCLE (x, y), r1, c4, pi2! * .28, pi2! * .7
RETURN
DSTG5:
x = xs!: y = ys!: r1 = rs!: rsmax! = 50
c1 = 6: c2 = 4: c3 = 12: c4 = 4
a1! = pi2! * 2: a2! = pi2! * 4: f! = .2
CIRCLE (x, y), r1, c2
PAINT (x, y), c1, c2
CIRCLE (x, y - r1 * .8), r1 * .2, c2, a1!, a2!, f!
CIRCLE (x, y - r1 * .7), r1 * .5, c2, a1!, a2!, f!
CIRCLE (x, y - r1 * .56), r1 * .74, c2, a1!, a2!, f!
CIRCLE (x, y - r1 * .4), r1 * .89, c2, a1!, a2!, f!
CIRCLE (x, y - r1 * .32), r1 * .93, c2, a1!, a2!, f!
CIRCLE (x, y - r1 * .16), r1 * .98, c2, a1!, a2!, f!
CIRCLE (x, y + r1 * .06), r1 * 1, c2, a1!, a2!, f!
CIRCLE (x, y + r1 * .29), r1 * .94, c2, a1!, a2!, f!
CIRCLE (x, y + r1 * .42), r1 * .87, c2, a1!, a2!, f!
CIRCLE (x, y + r1 * .6), r1 * .69, c2, a1!, a2!, f!
PAINT (x, y - r1 * .16), c2, c2
PAINT (x, y + r1 * .38), c2, c2
PAINT (x, y + r1 * .78), c2, c2
CIRCLE (x, y), r1, c3, pi2! * .2, pi2! * 1.4
a1! = pi2! * 1.5: a2! = pi2! * .5
CIRCLE (x, y + r1 * .04), r1 * 1.6, c4, pi2! * 1.42, pi2! * .58, f!
CIRCLE (x, y + r1 * .04), r1 * 1.76, c1, pi2! * 1.36, pi2! * .64, f!
CIRCLE (x, y + r1 * .04), r1 * 1.8, c4, pi2! * 1.36, pi2! * .64, f!
RETURN
DSTG6:
x = xs!: y = ys!: r1 = rs!: rsmax! = 60
c1 = 8: c2 = 7: c3 = 15: c4 = 8
a1! = -pi2! * 1.1: a2! = -pi2! * 3 * .9
CIRCLE (x, y), r1, c1
CIRCLE (x, y), r1, c2, pi2!, pi2! * 3
CIRCLE (x, y), r1 * .84, c2, pi2! * 3, pi2!, 1.6
PAINT (x - r1 * .5, y), c2, c2
CIRCLE (x, y), r1 * .84, c1, pi2! * 3, pi2!, 1.6
PAINT (x + r1 * .8, y), c1, c1
x1 = x - r1 * .25: y1 = y - r1 * .2
CIRCLE (x1, y1), r1 * .24, c1: PAINT (x1, y1), c1, c1
CIRCLE (x1, y1), r1 * .24, c3, a1!, a2!: PAINT (x1 - r1 * .05, y1), c3, c3
CIRCLE (x1 - r1 * .02, y1), r1 * .18, c2: PAINT (x1, y1), c2, c2
x1 = x - r1 * .8: y1 = y - r1 * .04
CIRCLE (x1, y1), r1 * .13, c1, , , 1.6: PAINT (x1, y1), c1, c1
CIRCLE (x1, y1), r1 * .13, c3, a1!, a2!, 1.6: PAINT (x1 - r1 * .05, y1), c3, c3
CIRCLE (x1 - r1 * .01, y1), r1 * .08, c2, , , 1.6: PAINT (x1, y1), c2, c2
x1 = x - r1 * .5: y1 = y + r1 * .3
CIRCLE (x1, y1), r1 * .1, c1, , , 1: PAINT (x1, y1), c1, c1
CIRCLE (x1, y1), r1 * .1, c3, -a1!, -a2!, 1
x1 = x + r1 * .14: y1 = y - r1 * .55
CIRCLE (x1, y1), r1 * .13, c1, , , .66: PAINT (x1, y1), c1, c1
x1 = x + r1 * .3: y1 = y + r1 * .1
CIRCLE (x1, y1), r1 * .2, c1, , , .9: PAINT (x1, y1), c1, c1
x1 = x + r1 * .02: y1 = y + r1 * .75
CIRCLE (x1, y1), r1 * .12, c1, , , .4: PAINT (x1, y1), c1, c1
x1 = x - r1 * .07: y1 = y + r1 * .5
CIRCLE (x1, y1), r1 * .15, c1, , , .8: PAINT (x1, y1), c1, c1
x1 = x - r1 * .01: y1 = y - r1 * .8
CIRCLE (x1, y1), r1 * .12, c1, , , .2: PAINT (x1 + r1 * .06, y1), c1, c1
CIRCLE (x1, y1), r1 * .12, c3, -a1!, -a2!, .2
x1 = x + r1 * .9: y1 = y + r1 * .05
CIRCLE (x1, y1), r1 * .1, c4, , , 3: PAINT (x1, y1), c4, c4
CIRCLE (x1, y1), r1 * .1, c2, -a1!, -a2!, 3
CIRCLE (x1 + r1 * .02, y1), r1 * .1, c2, -a1!, -a2!, 3
x1 = x + r1 * .7: y1 = y + r1 * .2
CIRCLE (x1, y1), r1 * .15, c4, , , 1.5: PAINT (x1, y1), c4, c4
CIRCLE (x1, y1), r1 * .15, c2, -a1!, -a2!, 1.5
CIRCLE (x1 + r1 * .02, y1), r1 * .15, c2, -a1!, -a2!, 1.5
x1 = x + r1 * .62: y1 = y - r1 * .35
CIRCLE (x1, y1), r1 * .05, c4, , , 1.2: PAINT (x1, y1), c4, c4
CIRCLE (x1, y1), r1 * .05, c2, -a1!, -a2!, 1.2
CIRCLE (x1 + r1 * .02, y1), r1 * .05, c2, -a1!, -a2!, 1.2
RETURN
DSTG7:
c1 = 1: c2 = 9: c3 = 11: c4 = 15: c5 = 2: c6 = 10
FOR n = 1 TO 32
x = 320 * RND: y = 200 * RND: c = 7 + INT(2 * RND) * 8
PSET (x, y), c
NEXT n
x = -20: y = 330: r1 = 300
CIRCLE (x, y), r1, c1: PAINT (0, 199), c1, c1
CIRCLE (x, y), r1 * .985, c2: PAINT (0, 199), c2, c2
CIRCLE (x, y), r1 * .97, c3: PAINT (0, 199), c3, c3
CIRCLE (x, y), r1 * .955, c4: PAINT (0, 199), c4, c4
CIRCLE (x, y), r1 * .94, c3: PAINT (0, 199), c3, c3
CIRCLE (x, y), r1 * .925, c2: PAINT (0, 199), c2, c2
CIRCLE (x, y), r1 * .91, c1: PAINT (0, 199), c1, c1
y1 = 0
RESTORE EARTH
DO
x0 = x1: y0 = y1: READ x1, y1
IF y0 > 0 AND y1 > 0 THEN LINE (x0, y0)-(x1, y1), c5
LOOP UNTIL x1 = -1 AND y1 = -1
PAINT (0, 199), c6, c5
PAINT (130, 199), c6, c5
RETURN
EARTH:
DATA 0,119, 24,121, 40,124, 70,134, 69,138, 62,140, 79,148, 73,148, 84,155
DATA 82,154, 86,157, 88,162, 80,161, 70,158, 73,164, 88,172, 70,182
DATA 52,180, 48,183, 52,187, 51,193, 46,193, 62,199, 0,0
DATA 108,199, 114,186, 124,177, 123,172, 131,172, 138,185, 144,186, 147,192
DATA 154,194, 161,195, 165,199
DATA -1,-1
REM - - - - - - - - - - - - - - - - - - - - - - - - - - -
LOAD.SPRITES:
ENEMY$(1, 0) = "br5h8d4g4f4d4e8bl5"
ENEMY$(1, 1) = "br4h5d3g2f2d3e5bl4"
ENEMY$(1, 2) = "br6h5l2d10r2e5bl2"
ENEMY$(1, 3) = "bl1h7d5g2f2d5e7bl3"
ENEMY$(2, 0) = "br4e2h8g6f4g4f6e8h2bl4"
ENEMY$(2, 1) = "bl4e4f4g4h4br4"
ENEMY$(3, 0) = "e7l14f3d8g3r14h7bl1"
ENEMY$(3, 1) = "br6bu5l10bd10r10"
ENEMY$(4, 0) = "bu3br5d6g6l6e6u6h6r6f6bd3bl3"
ENEMY$(4, 1) = "bl5d3g5r4e5u6h5l4f5d3br2"
ENEMY$(5, 0) = "br3f3g3h3g5h3e5h5e3f5e3f3g3bl2"
ENEMY$(5, 1) = "br2e3d6h3br1"
ENEMY$(6, 0) = "g9l5e3u3e3h3u3h3r5f9bl4"
ENEMY$(6, 1) = "bl7e2r8f2g2l8h2br7"
ENEMY$(7, 0) = "h5l5f5g5r5e5bl3"
ENEMY$(7, 1) = "bl4u2r16f1r4f1g1l4g1l16u2l3br8"
ENEMY$(8, 0) = "bu4br7d8g4l6h5u8e4r6 f5"
ENEMY$(8, 1) = "bl1bd1g5l8e5r8bl7bd3"
ENEMY$(9, 0) = "bd5br6g2l4h5u7e4r2 l1"
ENEMY$(9, 1) = "bd10bl4e3r5g4l4u1br3bu2"
ENEMY$(10, 0) = "br7g9l3h3u3e3h3u3e3r3f9bl7"
ENEMY$(10, 1) = "br7g3l6h3e3r6f3bl8"
ENEMY$(10, 2) = "br6g4l10h2u4e2r10f4bl6"
ENEMY$(10, 3) = "br7g3l6h3e3r6f3bl7"
ENEMY$(11, 0) = "br7g9l3h3u3e3h3u3e3r3f9bl7"
ENEMY$(11, 1) = "br7g3l6h3e3r6f3bl8"
ENEMY$(11, 2) = "br6g4l10h2u4e2r10f4bl6"
ENEMY$(11, 3) = "br7g3l6h3e3r6f3bl7"
CRASH$(1) = "br4bu4h8d8g8r8f8u8e8l8bd4"
CRASH$(2) = "br4f4l4d4h4g4u4l4e4h4r4u4f4e4d4r4g4bl4"
CRASH$(3) = "br4d8h4l8e4u8f4r8g4bl4"
SHOT$(1) = "bl2bu2r2d4r2"
SHOT$(2) = "bl2bu2r4d4l4u4"
RETURN
LOAD.CHARSET:
CH$(0) = "br1r3f2d4g1l3h2u4e1"
CH$(1) = "br3ng1d7nl2r2"
CH$(2) = "bd2u1e1r3f1d1g2l1g2d1r5"
CH$(3) = "r5g3r2f1d2g1l3h1"
CH$(4) = "br4bd7u7g4d1r5"
CH$(5) = "br5l5d2r4f1d3g1l3h1"
CH$(6) = "br5l2g3d2f2r3e1u1h2l3g1"
CH$(7) = "r5d1g3d3"
CH$(8) = "br2r2f1d1g1l3g1d2f1r4e1u1h2l2h2e1r1"
CH$(9) = "bd7br1r2e3u2h2l3g1d1f2r3e1"
CH$(17) = "bd7u3nr5u2e2r1f2d5"
CH$(18) = "nd7r3f1d1g1bl3r4f1d2g1l4"
CH$(19) = "br4l2g2d4f1r3e1"
CH$(20) = "bd7u7r4f1d4g2l3"
CH$(21) = "nr4d3nr3d3f1r4"
CH$(22) = "br5l4g1d2nr3d4"
CH$(23) = "br4l2g2d4f1r3e1u3l2"
CH$(24) = "d7bu4r5bu3d7"
CH$(25) = "br2r2bl1d7bl1r2"
CH$(26) = "br1r4d5g2l2u1"
CH$(27) = "d7bu4r1ne3nf4"
CH$(28) = "d7r5"
CH$(29) = "bd7u6e1f2e2f1d6"
CH$(30) = "bd7u7f5nd2u5"
CH$(31) = "br2r2f1d4g2l2h1u4e2"
CH$(32) = "bd7u7r4f1d2g1l4"
CH$(33) = "br1r2f2d4nh2nf1g1l2h2u4e1"
CH$(34) = "bd7u7r4f1d1g1l4br1f4"
CH$(35) = "br5l3g2f1r3f1d2g1l5"
CH$(36) = "r6bl3d7"
CH$(37) = "d5f2r3e1u6"
CH$(38) = "d6f1e4u3"
CH$(39) = "d6f1e2nu2f2e1u6"
CH$(40) = "r1f2d3f2r1bl6r1e2bu3e2r1"
CH$(41) = "d2f3nd2e3u2"
CH$(42) = "r6d1g6r6"
RETURN
LOAD.SOUNDS:
REM 2,7,10,13,15,19,22,25,27,31,34,39,43,46,58
SLASER1$ = "MBT255l64n58n57n56n55n54"
SLASER2$ = "MBT255l48n58n56n54n52n58n56n54n52"
SSHOOT1$ = "MBT255l64n63n61n58n55n58"
SSHOOT2$ = "MBT255l64n61n58n55"
SSHOOT3$ = "MBT255l48n7n10n7"
SETYPE1$ = "MBT255l32n39n34n31n27n25n22n19n15n13n10n7n2"
SETYPE2$ = "MBT255l40n60n59n58n57n19n13n10n7n2n7n5n1n3n1n2n1"
SETYPE3$ = "MBT255l32n36n24n1n17n2n19n0n11n1n15n3n17n2n9n1n6n2n4n1n3n1"
SETYPE4$ = "MBT255l64n50n48n45n41n36n50n47n43n37n33n26n19n12n1n9n1n7n1n5n1n3n1"
SETYPE6$ = "MBT255l40n39n31n25n19n13n7n2n7n10n7n13n15n19n15n22n25n27n25n31n34n39n34n43n46"
SETYPE8$ = "MBT255l32n2n7n10n13n15n19n22n25n27n31n34n39n43n46n58"
SETYPE9$ = "MBT255l40n58n46n43n39n34n31n27n25n22n19n15n13"
SETYPE10$ = "MBT255l32n56n55n53n50n45n43n41n40n41n43n45n50n53n55n56"
SETYPE11$ = "MBT255l64n70n69n68n67n66n65n64n63n62n61n60"
SCRASH8$ = "MBT255l64n58n25n19n13n10n7n2n7n5n1n3n1n2n1"
SCRASH9$ = "MBT255l32n30n1n23n2n19n3n14n2n15n1n11n1n7n1n4n1n5n1n3n1n2n1n0n1n3n1n2n1"
SNEW1$ = "MBT255l24n58n57n58n53n57n58"
SNEWPL1$ = "MBT255l3n25n32"
SNEWPL2$ = "MBT255l8n25n32"
SDOCK2$ = "MBT255l32n15n17n15n17n20n25n29n32n37"
SRGTON$ = "MBT80l24n27n0l24n27n29n34n31n34n31l12n29l24n29n32l6n36l24n38n34n31n38n34n31n38n34l12n39l24n38l8n39"
SLAUNCH$ = "MBT96l64n27l8n22l16n22l4n27n34l16n0n22MLl4n27n34MSl24n39n0n0l32n39n0l48n39n0l64n39n0n39n0l32n39n0n39n0l48n39n0n39n0l24n51MN"
SFAROUT1$ = "MBT80l8n22l12n22l8n26l12n26l8n29l12n29l8n34l12n34l8n22l12n22l8n26l12n26l8n29l12n29l8n34l12n34"
SFAROUT2$ = "MBT80l64n17l8n22l12n22l64n17l8n26l12n26l64n17l8n29l12n29l64n17l8n34l12n34"
SEND$ = "MBT96l6n22l16n27l2n25l16n27l8n25n27n29l16n25n27l48n25n27l12n29l32n27n29n27n29l4n34"
SBONPLAY$ = "MBT64l64n15n22n19n22n19n22n27l32n34"
SHITBOS1$ = "MBT255l64n63n62n61n60n50n40n30n20n13n10n8n7n5n4n3n2n1n1n1"
SBOSPTS$ = "MBT255l64n46n45n44n43n42n41n40n39n38n37n36n35n34"
SSTAGE1$ = "MBMST64l32n40n0n40n40n0n40n40n40n40n0n40n40n0n40n0n40n0n40n40n40n0n40n0MN"
SSTAGE2$ = "MBT255l32n19n22n25n27n31n34n39n43n46"
SFINAL$(1, 1) = "MBMNT64l4n25l24n18n18l4n25l24n18n18l24n25n0n30n0l4n25"
SFINAL$(1, 2) = "MBMNT64l24n18n18l24n25n0n30n0l3n32"
SFINAL$(1, 3) = "MBMNT64l24n23n23l24n28n0n30n0l8n32l24n34l4n35"
SFINAL$(1, 4) = "MBMNT64l6n37l6n34l8n30n28n32n35"
SFINAL$(1, 5) = "MBMLT64l8n39l6n37l6n34l8n30n28n32n35n39l6n42"
SFINAL$(1, 6) = "MBMLT64l64n37n42n49n37n42n49n37n42n49n37n42n49n37n42n49n37n42n49l16n42"
SFINAL$(1, 7) = "MBMLT64"
SFINAL$(2, 1) = "MBMNT64l6n13n15n18n20n25l24n23n22l12n20l6n23l24n22n20l12n18n22n18l6n20"
SFINAL$(2, 2) = "MBMLT64l64n25n30n37MNl16n0l24n13n13n18n0n18n18n20n0n20n20n25n0n25n25n23n22n20n0"
SFINAL$(2, 3) = "MBMNT64l24n23n0n23n23n22n20n18n0l12n22l24n23n0n18n0n22n0l4n20"
SFINAL$(2, 4) = "MBMNT64l16n8n8n8n0n8n0n8n0n8n8n8n0n8n0"
SFINAL$(2, 5) = "MBMNT48l64n20l4n32MLl12n32n30n29n27n25l4n30l24n32n34l4n32"
SFINAL$(2, 6) = "MBMNT48l12n8l4n32MLl12n32n30n29n27T64n25l4n35l24n37n39"
SFINAL$(2, 7) = "MBMLT64l64n25n37n25n37n25n37n25n37n25n37n25n37n25n37n25n37l8n37"
RETURN
CREDITS:
DATA " ", " ", " "
DATA " YOU SAVED", " THE GALAXY", " ", " ", " ", " "
DATA " CONGRATULATIONS", " ", " THE MISSION", "IS ACCOMPLISHED"
DATA " ", "THE ALIENS HAVE", " LEFT", " AND THE EARTH"
DATA " IS NOW FREE", " ", "YOU HAVE BROUGHT", " BACK PEACE TO"
DATA " OUR GALAXY", " ", "WE WILL THANK", " YOU FOREVER"
DATA " ", " THE FORCE", "WILL BE WITH YOU", " ALWAYS"
DATA " ", " ", " ", " ", " THE END"
TITLE.HELP:
RESTORE THELP.TEXT
SCREEN 7, 0, 2, 2: tcnt = 0: tpos = 0: sss = 0
CLS : COLOR 15, 1
THELP.MAIN:
k = INP(96): k$ = INKEY$: da = 0
IF k = 1 THEN COLOR 15, 0: SCREEN 7, 0, scr, scr: GOTO WAITKEY0
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF tcnt < 22 THEN GOSUB THELP.SOFT
IF k = 80 OR k = 77 OR tcnt < 22 THEN GOSUB THELP.SCROLL
IF k = 72 THEN RESTORE THELP.TEXT: CLS : tcnt = 0: tpos = 0: sss = 0
GOTO THELP.MAIN
THELP.SOFT:
a = 16024 + (tpos) * 80
OUT &H3D4, 12: OUT &H3D5, INT(a / 256)
OUT &H3D4, 13: OUT &H3D5, a AND 255
RETURN
THELP.SCROLL:
tpos = (tpos + 1) AND 3
IF tpos <> 2 OR sss > 0 THEN RETURN
LOCATE 24, 1: READ T$: PRINT T$: tcnt = tcnt + 1
IF T$ = "XXX" THEN sss = 1
IF SND = 1 THEN SOUND 600, .2
RETURN
THELP.TEXT:
DATA "- INCOMING MESSAGE -"
DATA ""
DATA " 16.Dec. 2011"
DATA ""
DATA "THE UNITED EARTH ADMINISTRATION"
DATA "- - - - - - - - - - - - - - - -"
DATA ""
DATA ""
DATA "ALIENS HAVE INVADED TO OUR GALAXY."
DATA "THEY BUILD BASES TO NEARBY STARS "
DATA "IN RANGE OF SEVERAL LIGHT YEARS."
DATA "BEFORE WE COULD START ANY COUNTER"
DATA "MEASURES TO PROTECT OURSELF,"
DATA "THEY NOTICED OUR TELEMITRY SIGNALS,"
DATA "SENT BETWEEN THE EARTH AND OUR"
DATA "SATELLITES "
DATA ""
DATA "THEY REACHED OUR SOLAY SYSTEM AND"
DATA "INSTANTLY OCCUPIED ONE PLANET"
DATA "AFTER ANOTHER, STARTING WITH PLUTO"
DATA "OVER TO NEPTUN, SATURN, JUPITER AND"
DATA "FINALLY THE EARTH MOON, WHERE THEY >>"
DATA "LOCATED THEIR GIANT NEXUS MOTHERSHIP"
DATA ""
DATA "WITH DESTROYING OUR SPACE STATION"
DATA "AND SEVERAL ORBIT SHUTTLES, COSTING"
DATA "OVER 10.000 HUMAN LIFES, THEY<45>VE"
DATA "DEMONSTRATED THEIR EXTREMELY AGRESSIVE
DATA "INTENTIONS"
DATA ""
DATA "ITS ASSUMED FOR CLEAR THAT THE"
DATA "MOTHERSHIP PREPARES FOR THE FINAL"
DATA "ATTACK ON THE EARTH"
DATA "AND IF THIS HAPPENS MANKIND CAN KISS"
DATA "THE DAY<41>S GOODBYE, THATS FOR SURE"
DATA ""
DATA "GOD, WE NEED SOMEONE WHO BLOWS THESE"
DATA "BASTARDS TO PIECES !"
DATA "WE NEED TO DESTROY ALL THEIR HOMEBASES"
DATA "TO BREAK UP THEIR SUPPLY LINE,"
DATA "STARTING AT THE VEGA CONSTELLATION"
DATA "37 LIGHTYEARS AWAY"
DATA ""
DATA ">> So, fine, but what has all this"
DATA "to do with me ? << YOU ASK
DATA ""
DATA "CAUSE ALL OUR ASTRONAUTS HAVE SUDDENLY"
DATA "GONE ON VACATION 3 DAYS AGO,"
DATA "WE ENGAGED YOU. YOU<4F>RE OUR LAST HOPE !"
DATA ""
DATA "ALTHOUGH YOURE NO ASTRONAUT, NOT EVEN
DATA "A PILOT, THAT DOESN<53>T REALLY MATTER."
DATA ""
DATA "WE<57>VE SIMPLIFIED THE SHIP<49>S CONTROLS SO"
DATA "THAT EVEN AN AVERAGE CLEVER SPACE-COW"
DATA "CAN FLY IT"
DATA "LOOK, ITS REALLY EASY:"
DATA "","",""
DATA "- - - - - - - - - - - - - - - - - - -"
DATA "Lunar Module Control Keys"
DATA "","",""
DATA "Arrow Left / Num 4 = Move Left "
DATA "Arrow Left / Num 6 = Move Right"
DATA "Left Strg = Fire / Thrust"
DATA "S = Sound On/Off"
DATA "P = Pause"
DATA "
DATA "Hint:"
DATA "Use the Num-Keys for better control"
DATA "","",""
DATA "Bonus Ship given every 20000 Pts"
DATA "Successful Docking increases Firepower"
DATA "Hitpoints increase every Stage"
DATA ""
DATA "- - - - - - - - - - - - - - - - - - -"
DATA "","","",""
DATA "YOU ARE SUPPLIED WITH 3 SEPERATE LUNAR"
DATA "MODULES, OUTFITTET WITH A STAR-DRIVE"
DATA "AND HIGH-VOLTAGE PLASMA LAUNCHERS"
DATA ""
DATA "THE MODULES CAN BE FLOWN SEPERATLY OR"
DATA "CONNECTED, WHICH GIVES AN EXTRA
DATA "FIRE-POWER."
DATA "HOWEVER, TO SAVE MODULES, THEY ARE"
DATA "DISCONNECTED AUTOMATICALLY WHEN POSSIBLE"
DATA "OR WHEN ONE OF THEM GETS DESTROYED."
DATA ""
DATA "IF THIS HAPPENS, YOU SHOULD BE EJECTED"
DATA "AND WHEN YOU<EFBFBD>VE BEEN EJECTED, YOU
DATA "SHOULD ENTER THE NEXT INTACT SECTION"
DATA "AUTOMATICALLY."
DATA ""
DATA "- Why SHOULD ?
DATA ""
DATA "THE SYSTEM<45>S NOT PERFECT YET, CAUSE"
DATA "THE SHIP<49>S COMPUTER CRASHES FROM"
DATA "TIME TO TIME. BUT DON<4F>T PANIC,"
DATA "OUR ENGINEERS WILL FIX THAT BY SENDING"
DATA "YOU UPDATE VERSIONS OF THE SHIP<49>S"
DATA "COMPUTER<45>S OPERATING SYSTEM"
DATA "(Windows 2011 v4.1.0.2.1-beta-beta)"
DATA ""
DATA ""
DATA "THE EARTH BASE WILL TRY TO SUPPLY YOU"
DATA "CONSTANTLY WITH NEW MODULES"
DATA ""
DATA "BUT PLEASE HANDLE WITH CARE,"
DATA "WE CAN<41>T BAKE THEM LIKE BREADS"
DATA ""
DATA "GOOD LUCK!"
DATA "","","","",""
DATA "END OF MESSAGE."
DATA "","","","","","","","","","","",""
DATA "GAME INFO"
DATA ""
DATA "This programm was intended as a tutorial"
DATA "for beginners who want to learn"
DATA "programming in Qbasic, demonstrating"
DATA "some of its capabillities for making"
DATA "sound and graphics."
DATA "It uses PLAY and SOUND for music and"
DATA "most of the Graphic functions,"
DATA "exspecially the DRAW Command for Sprites"
DATA "(which lets you rotate and scale)."
DATA "Even if some of the letters look like"
DATA "vectors, but they are all DRAW-Sprites"
DATA ""
DATA "The inspiration and ideas i lend
DATA "(took, stole) from following games:"
DATA "Mooncresta arcade game (1983)"
DATA "Galaga 88 arcade"
DATA "Space Pilot I-II (C64)"
DATA "(They belong to my all-time favorite
DATA "shoot-em-ups)"
DATA ""
DATA "In the beginning i just wanted to make"
DATA "a simple shooter (what it still is) but"
DATA "then those old shooting games came to"
DATA "mind, exspecially Mooncresta (obviously"
DATA "you can see where i got the title),"
DATA "which i played as a kid totally"
DATA "fascinated me."
DATA "Those games had great graphics and
DATA "sound (for this time) and where FUN"
DATA "to play."
DATA "So i also wanted to put in something of"
DATA "these games, and as the programm grew"
DATA "bigger and bigger, i decided to make a"
DATA "complete game of it, and here<72>s whats"
DATA "the result.
DATA "(hope you like this piece of <20>crap<61>)"
DATA "",""
DATA "Mooncr.99 made by Daniel Kupfer
DATA "in Nov.1999"
DATA "Mail me if U like"
DATA "EMail dk1000000@aol.com"
DATA " or dku1000000@cs.com"
DATA "","","",""
DATA "Machine Requirements:"
DATA "",""
DATA "Qbasic: Pentium 200"
DATA "Compiled: 486-66 / Pentium 66"
DATA ""
DATA "As its Qbasic you need decent computer"
DATA "power to run at full speed (35 frames)"
DATA "It works just fine on my P-II 233"
DATA "I<>ve never tried to compile this"
DATA "with Quick Basic"
DATA "<22>cause i don<6F>t own Quick Basic, but if"
DATA "it works, i guess its gonna be 5 times"
DATA "faster or so (however it never runs"
DATA "more than 35 frames)"
DATA "",""
DATA "Enjoy !"
DATA "If you liked it, ask for upcoming"
DATA "mooncr.2000"
DATA ""
DATA "SEE YA!"
DATA "","",""
DATA "PRESS ESC"
DATA "XXX"