SCREEN 12: CLS DIM p%(20000) DEF SEG = VARSEG(p%(0)) BLOAD "yibble.pic", VARPTR(p%(0)) CLS r1 = 0 g1 = 31 b1 = 63 r2 = 63 g2 = 31 b2 = 0 r = r1 g = g1 b = b1 rs = (r2 - r1) / 16 gs = (g2 - g1) / 16 bs = (b2 - b1) / 16 FOR a = 0 TO 15 r = r + rs g = g + gs b = b + bs IF r < 0 THEN r = 0 IF r > 63 THEN r = 63 IF g < 0 THEN g = 0 IF g > 63 THEN g = 63 IF b < 0 THEN b = 0 IF b > 63 THEN b = 63 PALETTE a, FIX(r) + FIX(g) * 256 + FIX(b) * 65536 NEXT PALETTE 0, 0 PUT (195, 210), p%, PSET t = TIMER: a$ = "": WHILE TIMER < t + 10 AND a$ = "": a$ = INKEY$: WEND CLS : SCREEN 7 DEF SEG = VARSEG(p%(0)) BLOAD "sr.ttl", 0 PUT (0, 0), p%, PSET PCOPY 0, 5 t = TIMER: WHILE TIMER < t + 5: WEND CLS DIM mssub%(100), x(25), y(25), xd(25), yd(25), ty(25), md(25), dt1(25), dt2(25), dt3(25), hp(25), blk(25), bx(15), by(15), bdx(15), bdy(15), bl(15), nm$(21), pnt(50), tme(41), pn(41), pltt(15) DEF SEG = VARSEG(mssub%(0)) OPEN "usemouse.com" FOR BINARY AS #1 WHILE EOF(1) = 0 GET #1, flc% + 1, I% POKE flc%, I% AND 255 flc% = flc% + 1 WEND SCREEN 7 GOSUB dispmouse CLOSE #1 mxtm = 1 CHDIR "c:\miscgame" CLS : SCREEN 7 OPEN "top20.dat" FOR INPUT AS #1 FOR a = 1 TO 20 INPUT #1, nm$(a), pnt(a), tme(a) IF tme(a) > mxtm THEN mxtm = tme(a) NEXT: CLOSE FOR a = 1 TO 8: READ drx(a), dry(a): NEXT FOR a = 1 TO 11: READ pn(a): NEXT OPEN "enemys.pic" FOR BINARY AS #1 FOR n = 2 TO 26 FOR yy = 0 TO 15: FOR xx = 0 TO 15 fln% = fln% + 1 GET #1, fln%, c% PSET (yy, xx), c% NEXT: NEXT GOSUB getblk NEXT u$ = CHR$(0) + "H" d$ = CHR$(0) + "P" l$ = CHR$(0) + "K" r$ = CHR$(0) + "M" CLOSE #1 CLS n = 2: GOSUB putblk n = 1: GOSUB getblk title: SCREEN 7, 0, 0, 0 PCOPY 5, 0 DO SCREEN 7, 0, 0, 0 PCOPY 5, 0 a$ = "" t = TIMER: WHILE TIMER < t + 5 AND a$ = "" a$ = INKEY$ IF a$ = "S" OR a$ = "s" THEN GOTO start1 WEND CLS GOSUB top20lst a$ = "" t = TIMER: WHILE TIMER < t + 8 AND a$ = "" a$ = INKEY$: IF a$ = "S" OR a$ = "s" THEN GOTO start1 WEND CLS demo% = 1: GOTO start1 LOOP start1: SCREEN 7, 0, 4, 0: CLS GOSUB dispmouse FOR a = 1 TO 270: PSET (RND * 319, RND * 199), 5: NEXT FOR a = 1 TO 170: PSET (RND * 319, RND * 199), 1: NEXT hp = 5 sp = 2 pnt = 0 pntn = 10000 ttme = 0 begin: IF demo% = 0 THEN OPEN "levels.dat" FOR INPUT AS #1 IF demo% = 1 THEN OPEN "dlevels.dat" FOR INPUT AS #1 DO WHILE EOF(1) = 0 PCOPY 4, 0 nm = 0 INPUT #1, n$, pnts, time, cr, en: aen = en IF n$ = "end" THEN GOTO ywin FOR n = 1 TO en: INPUT #1, ty, x, y: nm = nm + 1 IF ty < 0 THEN GOSUB backp: aen = aen - 1: nm = nm - 1: GOTO next4 IF ty = 7 THEN cr = 1: hp(n) = 3: ben = 1: FOR a = 2 TO 20: ty(a) = 0: x(a) = 0: y(a) = 0: NEXT IF ty = 16 THEN cr = 3 IF ty = 11 THEN cr = cr + 1 x(nm) = x y(nm) = y ty(nm) = ty dt1(nm) = 0 dt2(nm) = 0 dt3(nm) = 0 next4: NEXT en = nm IF ben = 1 THEN ben = 0: en = 15 SCREEN 7, 0, 2, 2 CLS : LOCATE 12, 20 - (LEN(n$) / 2): PRINT n$ W = 1: GOSUB waiter SCREEN 7, 0, 0, 2 LOCATE 1: PRINT "points:"; pnt LOCATE 1, 20: PRINT "hp:"; hp LOCATE 2: PRINT STRING$(sp, "*") SCREEN 7, 0, 1, 2 sdx = 0: sdy = 0: sx = 0: sy = 0 tm = TIMER fc% = 1 top: WHILE a$ = "" IF ms% = 1 THEN GOSUB mousestats IF fc% = 1 THEN t = TIMER: WHILE TIMER < t + .04: WEND a$ = INKEY$: b$ = INKEY$ bsinv = bsinv - 1: IF bsinv < 0 THEN bsinv = 0 IF bsinv = 1 THEN PALETTE IF demo% = 1 THEN GOSUB demo PCOPY 0, 1 GOSUB enemys 'place enemys GOSUB bullets 'place bullets GOSUB ship 'place ship PCOPY 1, 2 IF RND * 100 > 99 THEN n = RND * 15 + 5: IF ty(n) = 0 THEN ty(n) = 2 IF cr = 0 THEN a$ = "‡" WEND IF a$ = "‡" THEN GOTO nextlevel GOSUB keypress GOTO top nextlevel: SCREEN 7, 0, 2, 2: CLS tme = FIX(TIMER - tm) PRINT "level bonus ("; pnts; ") + points ("; pnt; ") = " pnt = pnt + pnts: PRINT pnt: PRINT PRINT "limit ("; time; ") - time ("; tme; ") =" tm = time - tme: IF tm < 0 THEN tm = 0 PRINT tm: PRINT PRINT "time ("; tm; ") x 5 ="; tm * 5 pnt = pnt + tm * 5 PRINT : PRINT "total points:"; pnt FOR a = 1 TO 32: a$ = INKEY$: NEXT GOSUB nextlse IF demo% = 1 THEN t = TIMER: WHILE TIMER < t + 1: WEND: GOTO next9 a$ = INPUT$(1) next9: ttme = ttme + tme a$ = "" LOOP ywin: IF demo% = 1 THEN GOTO title GOSUB win GOSUB top20 a$ = "" GOTO title enemys: FOR a = 1 TO en ON ty(a) GOSUB crystal, booger, spikes, cruton, extlife, epoints, mirror, projectile, blob, mextlife, mcrystal, mspike, eyesock, mouth, ballst, eyeball, toungue, ballst, fball, wrmhe, blob, blower IF x(a) > 303 THEN x(a) = 303: xd(a) = -xd(a) IF x(a) < 0 THEN x(a) = 0: xd(a) = -xd(a) IF y(a) > 183 THEN y(a) = 183: yd(a) = -yd(a) IF y(a) < 0 THEN y(a) = 0: yd(a) = -yd(a) x = x(a): y = y(a): n = blk(a) IF ty(a) <> 0 THEN GOSUB putblk NEXT RETURN crystal: x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit: IF n = 1 THEN ty(a) = 0: blk(a) = 0: cr = cr - 1: GOSUB crystalse: RETURN blk(a) = 3 RETURN booger: GOSUB direction GOSUB stpdrctn x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit: IF n = 1 AND inv = 0 THEN GOSUB shiphit: GOSUB boogse blk(a) = 4 RETURN spikes: x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN sdx = -sdx: sdy = -sdy: bnc = 4: ty(a) = 0: x = x(a): y = y(a): n = 10: GOSUB putblk: GOSUB shiphit IF n = 1 AND inv > 0 AND bnc = 0 THEN sdx = -sdx: sdy = -sdy: bnc = 4 bnc = bnc - 1: IF bnc < 0 THEN bnc = 0 blk(a) = 6 RETURN cruton: IF sx < x(a) THEN xd(a) = -RND * 2 IF sx > x(a) THEN xd(a) = RND * 2 IF sy < y(a) THEN yd(a) = -RND * 2 IF sy > y(a) THEN yd(a) = RND * 2 x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) GOSUB stpdrctn x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit blk(a) = 5 RETURN extlife: x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN ty(a) = 0: blk(a) = 0: sp = sp + 1: GOSUB goodse: GOSUB infupdate: RETURN blk(a) = 7 RETURN epoints: x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN ty(a) = 0: blk(a) = 0: pnt = pnt + 500: GOSUB goodse: GOSUB infupdate: RETURN blk(a) = 8 RETURN mirror: xd(a) = -sdx / 2 yd(a) = -sdy / 2 x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) IF dt1(a) = 1 THEN dt1(a) = 0: hp(a) = hp(a) - 1 IF hp(a) <= 0 THEN cr = 0: mne = a: GOSUB explosion GOSUB stpdrctn IF RND * 150 > 149 THEN GOSUB rndenmy IF RND * 20 > 19 THEN GOSUB prjse: q = FIX(RND * 14 + 2): ty(q) = 8: xd(q) = (sx - x(a)) / 20: yd(q) = (sy - y(a)) / 20: x(q) = x(a): y(q) = y(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit blk(a) = 1 RETURN projectile: x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) IF x(a) < 0 THEN ty(a) = 0: LINE (x, y)-(x + 16, y + 16), 0, BF IF x(a) > 303 THEN ty(a) = 0: LINE (x, y)-(x + 16, y + 16), 0, BF IF y(a) < 0 THEN ty(a) = 0: LINE (x, y)-(x + 16, y + 16), 0, BF IF y(a) > 183 THEN ty(a) = 0: LINE (x, y)-(x + 16, y + 16), 0, BF x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit: ty(a) = 0 IF RND > .5 THEN blk(a) = 18 ELSE blk(a) = 22 RETURN blob: ON md(a) GOSUB blb1, blb2 GOSUB zap x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit blk(a) = 9 RETURN blb1: IF sx < x(a) THEN xd(a) = -RND * 3 IF sx > x(a) THEN xd(a) = RND * 3 IF sy < y(a) THEN yd(a) = -RND * 3 IF sy > y(a) THEN yd(a) = RND * 3 IF ty(a) = 21 AND sx > 250 AND sx > x(a) THEN xd(a) = 6 x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) dt3(a) = dt3(a) - 1: IF dt3(a) < 0 THEN dt3(a) = 0 GOSUB stpdrctn RETURN blb2: GOSUB direction IF ty(a) = 21 THEN xd(a) = (x(14) - sx) / 10: yd(a) = (y(14) - sy) / 10 GOSUB stpdrctn x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) dt3(a) = 10 RETURN zap: df = ABS(x(a) - sx) df = df + ABS(y(a) - sy) IF df < 40 + dt3(a) THEN SOUND 400, .08: LINE (sx + 8, sy + 8)-(x(a) + 8, y(a) + 8), 14: sdx = (sdx + xd(a) * 4) / 5: sdy = (sdy + yd(a) * 4) / 5: md(a) = 2 ELSE md(a) = 1 RETURN mextlife: GOSUB direction GOSUB stpdrctn x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN ty(a) = 0: blk(a) = 0: sp = sp + 1: GOSUB infupdate: GOSUB goodse: RETURN blk(a) = 7 RETURN mcrystal: GOSUB direction GOSUB stpdrctn x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN ty(a) = 0: blk(a) = 0: cr = cr - 1: GOSUB infupdate: GOSUB goodse: RETURN blk(a) = 3 RETURN mspike: IF dt1(a) <> 12 THEN dt1(a) = 12: yd(a) = 3 IF y(a) < 4 THEN yd(a) = 3 IF y(a) > 299 THEN yd(a) = -3 y(a) = y(a) + yd(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit: ty(a) = 0 RETURN eyesock: IF dt2(a) = 0 THEN dt2(a) = 1: xd(a) = x(a): yd(a) = y(a) dt1(a) = dt1(a) + .4 IF dt(a) > 6.2 THEN dt(a) = 0 x(a) = xd(a) + SIN(dt1(a)) * 4 y(a) = yd(a) + COS(dt1(a)) * 4 x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit: ty(a) = 0 blk(a) = 16 RETURN mouth: IF dt2(a) = 0 THEN dt2(a) = 1: dt1(a) = y(a) y(a) = y(a) + RND IF RND * 6 > 4 THEN y(a) = dt1(a) x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit: ty(a) = 0 blk(a) = 17 RETURN ballst: x(a) = x(a) + ((x(a - 1) - x(a)) + (x(a + 1) - x(a))) / 1.1 y(a) = y(a) + ((y(a - 1) - y(a)) + (y(a + 1) - y(a))) / 1.1 IF ty(a) = 18 AND FIX(x(a)) = FIX(x(a - 1)) AND FIX(y(a)) = FIX(y(a - 1)) THEN blk(a) = 0 x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 AND ty(a) = 18 THEN chs = 1 IF n = 1 AND inv = 0 THEN GOSUB shiphit IF ty(a) = 15 THEN blk(a) = 18 ELSE blk(a) = 21 RETURN eyeball: FOR q = 1 TO dt3(a): CIRCLE (RND * 16 + x(a), RND * 16 + y(a)), 1, 10: NEXT IF dt3(a) > 10 THEN PALETTE 12, 10: PALETTE 6, 2: PALETTE 4, 3: PALETTE 14, 11 IF dt3(a) > 20 THEN cr = 0: mne = a: GOSUB explosion: PALETTE IF dt1(a) = 0 THEN dt1(a) = 1: xd(a) = x(a): yd(a) = y(a) IF RND * 20 > 19 THEN md(a) = 1 IF RND * 30 > 29 THEN md(a) = 2 IF bsinv > 1 THEN md(a) = 4: PALETTE 4, 2: PALETTE 6, 2: PALETTE 12, 9: PALETTE 14, 11 ON md(a) GOSUB ey1, ey2, ey3, ey4 x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN GOSUB shiphit blk(a) = 20 RETURN ey1: x(a) = x(a) + (sx - x(a)) / 10 y(a) = y(a) + (sy - y(a)) / 10 IF ty(1) = 0 THEN GOSUB prjse: q = 1: ty(q) = 8: xd(q) = (sx - x(a)) / 20: yd(q) = (sy - y(a)) / 20: x(q) = x(a): y(q) = y(a) RETURN ey2: x(a) = x(a) + (xd(a) - x(a)) / 10 y(a) = y(a) + (yd(a) - y(a)) / 10 IF FIX(x(a)) = FIX(xd(a)) AND FIX(y(a)) = FIX(yd(a)) THEN md(a) = 3 IF ty(1) = 8 THEN ty(1) = 0: n = 10: x = x(1): y = y(1): GOSUB putblk: GOSUB expse RETURN ey3: x(a) = x(a) + RND * 10 - 5 y(a) = y(a) + RND * 10 - 5 RETURN ey4: x(a) = x(a) + RND * 30 - 15 y(a) = y(a) + RND * 20 - 10 RETURN toungue: IF dt3(a) > 0 THEN dt3(a) = 0: sx = x(a) - 20: sy = y(a) IF dt1(a) = 0 THEN dt1(a) = 1: xd(a) = x(a): yd(a) = y(a) dfb = ABS(x(a) - xd(a)) + ABS(y(a) - yd(a)) ON md(a) GOSUB to1, to2, to3 dt2(a) = dt2(a) + 1 IF dt2(a) > 30 THEN dt2(a) = 0: IF md(a) = 2 THEN md(a) = 1 ELSE md(a) = 2 IF chs = 1 THEN chs = 0: md(a) = 3 x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit IF n = 1 AND inv = 0 THEN md(a) = 3: GOSUB shiphit blk(a) = 19 RETURN to1: x(a) = x(a) + (sx - x(a)) / 6 y(a) = y(a) + (sy - y(a)) / 20 IF dfb > 90 THEN md(a) = 2 RETURN to2: x(a) = x(a) + (xd(a) - x(a)) / 15 y(a) = y(a) + (yd(a) - y(a)) / 15 RETURN to3: GOSUB to2 sx = x(a): sy = y(a) SOUND 300 + RND * 300, 1 RETURN fball: x(a) = x(a) + (x(a + 1) - x(a)) y(a) = y(a) + (y(a + 1) - y(a)) blk(a) = 22 RETURN wrmhe: dt1(a) = dt1(a) + RND * .4 - .2 IF dt1(a) > .4 THEN dt1(a) = .4 IF dt1(a) < -.4 THEN dt1(a) = -.4 dt2(a) = dt2(a) + dt1(a) IF dt2(a) < 0 THEN dt2(a) = 6.28 IF dt2(a) > 6.28 THEN dt2(a) = 0 x(a) = x(a) + SIN(dt2(a)) * 8 y(a) = y(a) + COS(dt2(a)) * 8 blk(a) = 23 RETURN blower: IF RND * 20 > 19 THEN md(a) = 1 ON md(a) GOSUB blw1, blw2, blw3 x1 = x(a): y1 = y(a) x2 = sx: y2 = sy GOSUB isithit: IF n = 1 AND inv = 0 THEN GOSUB shiphit: GOSUB boogse RETURN blw1: GOSUB direction GOSUB stpdrctn x(a) = x(a) + xd(a) y(a) = y(a) + yd(a) IF RND * 30 > 29 THEN IF RND > .5 THEN md(a) = 2 ELSE md(a) = 3 blk(a) = 24 RETURN blw2: sx = sx + (sx - x(a)) / 50 sy = sy + (sy - y(a)) / 50 FOR b = 1 TO 8 bx(b) = bx(b) + (bx(b) - x(a)) / (RND * 20 + 30) by(b) = by(b) + (by(b) - y(a)) / (RND * 20 + 30) NEXT IF RND * 30 > 29 THEN md(a) = 1 blk(a) = 25 RETURN blw3: sx = sx + (x(a) - sx) / 50 sy = sy + (y(a) - sy) / 50 FOR b = 1 TO 8 bx(b) = bx(b) + (x(a) - bx(b)) / (RND * 20 + 30) by(b) = by(b) + (y(a) - by(b)) / (RND * 20 + 30) NEXT IF RND * 30 > 29 THEN md(a) = 1 blk(a) = 26 RETURN bullets: FOR a = 1 TO 8 IF bl(a) = 0 THEN GOTO next1 bx(a) = bx(a) + bdx(a) by(a) = by(a) + bdy(a) IF bx(a) < 0 THEN IF bbnc = 0 THEN bl(a) = 0 ELSE bx(a) = 0: bdx(a) = -bdx(a) IF bx(a) > 319 THEN IF bbnc = 0 THEN bl(a) = 0 ELSE bx(a) = 319: bdx(a) = -bdx(a) IF by(a) < 0 THEN IF bbnc = 0 THEN bl(a) = 0 ELSE by(a) = 0: bdy(a) = -bdy(a) IF by(a) > 199 THEN IF bbnc = 0 THEN bl(a) = 0 ELSE by(a) = 199: bdy(a) = -bdy(a) IF POINT(bx(a), by(a)) <> 0 THEN GOSUB hit PSET (bx(a), by(a)), 15 next1: NEXT RETURN hit: FOR b = 1 TO en x1 = x(b): y1 = y(b) x2 = bx(a): y2 = by(a) GOSUB isblthit IF ty(b) = 16 AND n = 1 AND bsinv = 0 THEN bsinv = 20: dt3(b) = dt3(b) + 1: PALETTE 12, 15: PALETTE 0, 8: PALETTE IF ty(b) = 7 AND n = 1 THEN dt1(b) = 1 IF ty(b) <> 1 AND ty(b) <> 3 AND n = 1 AND ty(b) <> 7 AND ty(b) <> 11 AND ty(b) <> 13 AND ty(b) <> 14 AND ty(b) <> 15 AND ty(b) <> 16 AND ty(b) <> 17 AND ty(b) <> 18 AND ty(b) <> 21 THEN GOSUB points: ty(b) = 0: blk(b) = 0 IF ty(b) = 3 AND n = 1 THEN pnt = pnt - 10 NEXT pnt = pnt + 1 bl(a) = 0 SOUND 400, .5 RETURN ship: inv = inv - 1: IF inv < 0 THEN inv = 0: inv2 = 1 IF inv > 1 THEN inv2 = inv2 XOR 1 sx = sx + sdx sy = sy + sdy IF sx > 303 THEN sx = 303: sdx = (-sdx / 2) IF sx < 0 THEN sx = 0: sdx = (-sdx / 2) IF sy > 183 THEN sy = 183: sdy = (-sdy / 2) IF sy < 0 THEN sy = 0: sdy = (-sdy / 2) n = 1: x = sx: y = sy: IF inv2 = 1 THEN GOSUB putblk RETURN shiphit: x = 0: y = 0 GOSUB crash inv = 30 hp = hp - 1 SCREEN 7, 0, 0, 2 LOCATE 1, 20: PRINT "hp:"; hp SCREEN 7, 0, 1, 2 n = 1: GOSUB putblk FOR b = 1 TO 50: x = RND * 16: y = RND * 16 IF POINT(x, y) = 4 THEN PSET (x, y), 8 PSET (x, y), POINT(x, y) AND 4 NEXT: x = 0: y = 0 n = 1: GOSUB getblk LINE (0, 0)-(15, 15), 0, BF IF hp = 0 THEN GOSUB shdead RETURN direction: xd(a) = xd(a) + RND * 2 - 1 yd(a) = yd(a) + RND * 2 - 1 RETURN stpdrctn: IF xd(a) > 3 THEN xd(a) = 3 IF xd(a) < -3 THEN xd(a) = -3 IF yd(a) > 3 THEN yd(a) = 3 IF yd(a) < -3 THEN yd(a) = -3 RETURN keypress: IF a$ = u$ AND sdy > -3 THEN sdy = sdy - 1 IF a$ = d$ AND sdy < 3 THEN sdy = sdy + 1 IF a$ = l$ AND sdx > -3 THEN sdx = sdx - 1 IF a$ = r$ AND sdx < 3 THEN sdx = sdx + 1 IF a$ = " " THEN GOSUB shot IF a$ = "m" OR a$ = "M" THEN ms% = ms% XOR 1 IF a$ = "d" OR a$ = "D" THEN demo% = 1 IF a$ = "," OR a$ = "<" THEN GOSUB scatter IF a$ = "s" OR a$ = "S" THEN GOSUB scatter IF a$ = "w" OR a$ = "W" THEN sx = RND * 303: sy = RND * 183 IF a$ = "V" OR a$ = "v" THEN sdx = 0: sdy = 0 IF a$ = "B" OR a$ = "b" THEN bbnc = bbnc XOR 1 IF a$ = "Q" OR a$ = "q" THEN GOSUB quit a$ = "" RETURN mousestats: GOSUB mouseget sdx = (mmsx / 53.3) - 3 sdy = (mmsy / 33.3) - 3 IF mmsk = 1 THEN GOSUB shot RETURN shot: FOR b = 1 TO 8 IF bl(b) = 0 THEN bl(b) = 1: bdx(b) = sdx * 2: bdy(b) = sdy * 2: bx(b) = sx + 8: by(b) = sy + 8: GOTO next2 NEXT next2: SOUND 37, .5 RETURN quit: SCREEN 7, 0, 1, 1 LOCATE 1 PRINT "Are you sure ( Y/N )" a$ = INPUT$(1) IF a$ = "Y" THEN sp = 0: hp = 1 RETURN shdead: sp = sp - 1: IF sp = -1 THEN GOSUB gameover hp = 5 n = 2: GOSUB putblk n = 1: GOSUB getblk SCREEN 7, 0, 0, 2 LOCATE 2: PRINT STRING$(sp, "*"); " " SCREEN 7, 0, 1, 2 RETURN points: pnt = pnt + pn(ty(b)): SCREEN 7, 0, 0, 2 LOCATE FIX(y(b) / 8 + 1), FIX(x(b) / 8 + 1): PRINT pn(ty(b)) SCREEN 7, 0, 1, 2 IF pnt > pntn THEN sp = sp + 1: pntn = pntn + 10000 + (pntn / 8) GOSUB infupdate RETURN scatter: FOR b = 1 TO 8 bl(b) = 1 bx(b) = sx + drx(b) + 8: by(b) = sy + dry(b) + 8 bdx(b) = drx(b) * 3 bdy(b) = dry(b) * 3 NEXT RETURN win: FOR a = 1 TO 32: a$ = INKEY$: NEXT CLOSE OPEN "winning.txt" FOR INPUT AS #1 WHILE EOF(1) = 0 INPUT #1, c$ PRINT c$ IF CSRLIN = 20 THEN PRINT "press a key...": a$ = INPUT$(1) WEND PRINT "press a key...": a$ = INPUT$(1) CLS RETURN waiter: t = TIMER: WHILE TIMER < t + W: WEND RETURN crash: FOR a = 1 TO 10: SOUND RND * 150 + 37, .07: NEXT: a = 0 RETURN playout: PLAY "mb" + song$(snn, snl) snl = snl + 1: IF snl > sll(snn) THEN snl = 1 RETURN infupdate: SCREEN 7, 0, 0, 2 LOCATE 1: PRINT "points:"; pnt LOCATE 1, 20: PRINT "hp:"; hp LOCATE 2: PRINT STRING$(sp, "*") IF tr = 1 THEN COLOR 4 ELSE COLOR 15 LOCATE 1, 32: PRINT "TURBO" COLOR 15 SCREEN 7, 0, 1, 2 RETURN explosion: PCOPY 2, 0 FOR a = 1 TO 40 t = TIMER: WHILE TIMER < t + .05: WEND PCOPY 0, 1 FOR b = 16 TO 25 IF ty(b) = 0 THEN GOSUB newene n = (2 - dt1(b)) + 10 dt1(b) = dt1(b) - 1 IF dt1(b) <= 0 THEN dt1(b) = 0: ty(b) = 0 IF x(b) > 303 THEN x(b) = 303: xd(b) = -xd(b) IF x(b) < 0 THEN x(b) = 0: xd(b) = -xd(b) IF y(b) > 183 THEN y(b) = 183: yd(b) = -yd(b) IF y(b) < 0 THEN y(b) = 0: yd(b) = -yd(b) x = x(b): y = y(b) GOSUB putblk NEXT PCOPY 1, 2 NEXT FOR a = 1 TO en LINE (x(a), y(a))-(x(a) + 16, y(a) + 16), 0, BF NEXT RETURN newene: IF RND * 2 > 1 THEN q = RND * en + 1 ELSE q = mne ty(b) = RND * en + 1: md(b) = 2: x(b) = (RND * 16 - 8) + x(q): y(b) = (RND * 16 - 8) + y(q): dt1(b) = 2 RETURN getblk: IF n = 0 THEN RETURN GET (x, y)-(x + 16, y + 16), p%(n * 120) RETURN putblk: IF n = 0 THEN RETURN PUT (x, y), p%(n * 120), OR RETURN gameover: SCREEN 0: WIDTH 80 GOSUB top20 GOTO title top20: lvl = 0 CLOSE FOR a = 20 TO 1 STEP -1 IF tme(a) > mxtm THEN mxtm = tme(a) IF pnt >= pnt(a) THEN lvl = a NEXT IF lvl = 0 THEN GOTO next5 IF pnt < pnt(20) THEN lvl = 0 FOR a = 20 TO lvl + 1 STEP -1 nm$(a) = nm$(a - 1) pnt(a) = pnt(a - 1) tme(a) = tme(a - 1) NEXT INPUT "Enter your name"; n$ IF LEN(n$) > 9 THEN n$ = MID$(n$, 1, 9) nm$(lvl) = n$ pnt(lvl) = pnt tme(lvl) = ttme OPEN "top20.dat" FOR OUTPUT AS #1 FOR a = 1 TO 20 WRITE #1, nm$(a), pnt(a), tme(a) NEXT CLOSE next5: GOSUB top20lst RETURN top20lst: CLS SCREEN 7 PRINT "# name", "points" FOR a = 1 TO 20 PRINT a; nm$(a), pnt(a) LINE (0, (CSRLIN - 2) * 8 + 7)-((tme(a) / mxtm) * 320, (CSRLIN - 2) * 8 + 7), 4 NEXT CLOSE PRINT "longest time"; FIX(mxtm / 60); ":"; FIX(mxtm - ((FIX(mxtm) / 60) * 60)); "(M:S)" RETURN isblthit: tst = 0 IF x1 <= x2 AND x1 + 16 >= x2 THEN tst = tst + 1 IF y1 <= y2 AND y1 + 16 >= y2 THEN tst = tst + 1 IF tst = 2 THEN n = 1 ELSE n = 0 RETURN isithit: tst = 0 IF x1 - 16 <= x2 AND x1 + 16 >= x2 THEN tst = tst + 1 IF y1 - 16 <= y2 AND y1 + 16 >= y2 THEN tst = tst + 1 IF tst = 2 THEN n = 1 ELSE n = 0 RETURN rndenmy: q = FIX(RND * 15 + 1) n = n + 1: IF n > 5 THEN GOTO next3 IF ty(q) <> 0 THEN GOTO rndenmy next3: ty(q) = FIX(RND * 3 + 2) x(q) = x(a): y(q) = y(a) RETURN crystalse: SOUND 37, .5 SOUND 900, .1 FOR q = 100 TO 500 STEP 30: SOUND q, .1: NEXT RETURN boogse: FOR q = 100 TO 900 STEP 40: SOUND q, .1: SOUND 1000 - q, .1: NEXT RETURN nextlse: FOR q = 100 TO 900 STEP 20 SOUND q, .1 SOUND q / 2, .1 SOUND q * 2, .1 NEXT RETURN goodse: FOR q = 100 TO 800 STEP 50 SOUND q + ((q AND 2) * 10), .2 NEXT RETURN prjse: FOR q = 0 TO 6.28 STEP .1 SOUND 200 + ABS(SIN(q) * 200), .05 NEXT RETURN expse: FOR q = 1 TO 20 IF RND > .5 THEN SOUND 37, .05 ELSE SOUND 500, .05 NEXT RETURN backp: SCREEN 7, 0, 0, 2 nn = n n = ABS(ty) GOSUB putblk n = nn SCREEN 7, 0, 1, 2 RETURN demo: IF a$ <> "" AND a$ <> CHR$(135) THEN CLOSE #1: demo% = 0: demmsg% = 0: GOTO title IF demmsg% = 0 THEN demmsg% = 1: SCREEN 7, 0, 0, 2: LOCATE 3: PRINT "DEMO - Press a key": SCREEN 7, 0, 1, 2 IF shptsk% = 1 THEN IF NOT fen% = 1 AND shpmd% = 1 GOTO next7 enscn = enscn + 1: IF enscn > en THEN enscn = 1 IF ty(enscn) = 1 OR ty(enscn) = 11 OR ty(enscn) = 5 OR ty(enscn) = 10 THEN shpmd% = 1: enn% = enscn: shptsk% = 1 IF ty(enscn) > 1 AND ty(enscn) < 5 THEN shpmd% = 2: enn% = enscn: shptsk% = 1 IF ty(enscn) > 6 AND ty(enscn) < 10 THEN shpmd% = 2: enn% = enscn: shptsk% = 1 IF ty(enscn) > 11 AND ty(enscn) < 22 THEN shpmd% = 2: enn% = enscn: shptsk% = 1 IF shpmd% = 2 AND ty(enscn) = 3 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 13 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 14 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 15 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 17 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 18 THEN shptsk% = 0 IF shpmd% = 2 AND ty(enscn) = 21 THEN shptsk% = 0 next7: IF inv = 29 THEN a$ = "w": fen% = 1 ssx = sx: ssy = sy ON shpmd% GOSUB shmd1, shmd2 cl%(1) = POINT(sx - 8, sy - 8) cl%(2) = POINT(sx - 8, sy + 24) cl%(3) = POINT(sx + 24, sy - 8) cl%(4) = POINT(sx + 24, sy + 24) FOR q = 1 TO 4 IF cl%(q) = 5 OR cl%(q) = 6 OR cl%(q) = 7 OR cl%(q) = 8 OR cl%(q) = 12 OR cl%(q) = 14 OR cl%(q) = 15 THEN stp = 1 NEXT IF stp = 1 THEN stp = 0 RETURN shmd1: IF x(enscn) < sx THEN sdx = -(RND + 3) IF x(enscn) > sx THEN sdx = (RND + 3) IF y(enscn) < sy THEN sdy = -(RND + 3) IF y(enscn) > sy THEN sdy = (RND + 3) IF ty(enscn) = 0 THEN shptsk% = 0 RETURN shmd2: IF x(enscn) < sx THEN sdx = -(RND + 3) IF x(enscn) > sx THEN sdx = (RND + 3) IF y(enscn) < sy THEN sdy = -(RND + 3) IF y(enscn) > sy THEN sdy = (RND + 3) IF ty(enscn) = 0 THEN shptsk% = 0: fen% = 0 shot2 = shot2 + 1: IF shot2 > 5 THEN shot2 = 1: GOSUB shot2 RETURN shot2: b = RND * 8 + 1 bl(b) = 1: bdx(b) = (x(enscn) - sx) / 10: bdy(b) = (y(enscn) - sy) / 10: by(b) = sy + 8: bx(b) = sx + 8: GOTO next2 RETURN mouseget: DEF SEG = VARSEG(mssub%(0)) a% = 3: o& = 3: GOSUB pokeloc CALL absolute(0) a% = 3: GOSUB peekloc mmsx = o& / 2 a% = 5: GOSUB peekloc mmsy = o& a% = 7: GOSUB peekloc mmsk = o& RETURN pokeloc: POKE a%, o& AND 255 POKE a% + 1, (o& AND 65280) / 256 RETURN peekloc: o& = (PEEK(a%) AND 255) o& = o& + PEEK(a% + 1) * 256 RETURN dispmouse: DEF SEG = VARSEG(mssub%(0)) a% = 3: o& = 2: GOSUB pokeloc CALL absolute(0) RETURN DATA -.6,-.6,-1,0,-.6,.6,0,1,.6,.6,1,0,.6,-.6,0,-1 DATA 133,15,-5,25,100,500,5000,95,113,231,2032