'$DYNAMIC DEFINT A-Z DECLARE FUNCTION onedee (xyang!, zang!, xyrot!, zrot!, speed%, back%) DECLARE FUNCTION small! (n1!, n2!) DECLARE FUNCTION large! (n1!, n2!) ' DECLARE SUB putpixel (BYVAL x, BYVAL y, BYVAL c, BYVAL p) DECLARE SUB setmodex () DECLARE SUB setvispage (BYVAL page) DECLARE SUB fadeto (palbuff(), BYVAL red, BYVAL green, BYVAL blue) DECLARE SUB fadetopal (pal(), palbuff()) DECLARE SUB setpal (pal()) DECLARE SUB copypage (BYVAL s, BYVAL d) DECLARE SUB clearpage (BYVAL page) DECLARE SUB setkeys () DECLARE SUB setfont (f()) DECLARE SUB printstr (s$, BYVAL x, BYVAL y, BYVAL p) DECLARE SUB textcolor (BYVAL f, BYVAL b) DECLARE SUB setitup (fil$, buff(), tbuff(), BYVAL p) DECLARE SUB resetdsp DECLARE SUB savesnd (fil$, BYVAL i) DECLARE SUB playsnd (BYVAL n, BYVAL f) DECLARE SUB closefile DECLARE SUB rectangle (BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL c, BYVAL p) DECLARE SUB setwait (b(), BYVAL t) DECLARE SUB dowait () DECLARE SUB setupmusic (b()) DECLARE SUB closemusic () DECLARE SUB loadsong (f$) DECLARE SUB stopsong () DECLARE SUB resumesong () DECLARE SUB resetfm () DECLARE FUNCTION getfmvol () DECLARE SUB setfmvol (BYVAL vol) DECLARE FUNCTION getdacvol () DECLARE SUB setdacvol (BYVAL vol) DECLARE SUB fademusic (BYVAL vol) DECLARE FUNCTION Keyseg () DECLARE FUNCTION keyoff () DECLARE FUNCTION keyval (BYVAL a) DECLARE FUNCTION getkey () TYPE Regtype ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER ds AS INTEGER es AS INTEGER END TYPE DIM SHARED regs AS Regtype regs.ax = &H3509: CALL interruptx(&H21, regs, regs) off9 = regs.bx: seg9 = regs.es DIM font(1024), master(767), noise(16384), buffer(16384), fade(1536), timing(4), menu$(10, 10), last(10), music(5000) RANDOMIZE TIMER 'SHELL "dir /b *.voc >noise.txt" setitup "noise.cbv" + CHR$(0), noise(), buffer(), 2 resetdsp setupmusic music() oldvol = getdacvol oldfm = getfmvol setdacvol 8 setfmvol 0 loadsong "serenade.bam" + CHR$(0) setmodex GOSUB switchon setpal master(): DEF SEG = VARSEG(master(0)): BLOAD "master.pal", VARPTR(master(0)) DEF SEG = VARSEG(font(0)): BLOAD "one.fnt", VARPTR(font(0)): setfont font() textcolor 15, 0 rate = 211: vpage = 0: dpage = 1: time = 100: rota$ = "OFF": angle$ = "WIDE": back = 1 n(0) = 7: n(1) = 8: n(2) = 6 spd = 40 GOSUB strings printstr CHR$(127) + "", 132, 96, 0 fadetopal master(), fade() playsnd 1, rate t# = TIMER: WHILE t# + 1.2 > TIMER: WEND FOR i = 5 TO 2 STEP -1 playsnd i, rate delay! = .4 t# = TIMER: WHILE t# + delay! > TIMER: WEND NEXT i fadeto fade(), 0, 0, 0 clearpage 0 FOR i = 0 TO 1200 rectangle INT(RND * (320 - w)), INT(RND * (200 - w)), 10, 10, 17 + INT(RND * 4), 2 NEXT i rectangle 115, 6, 88, 30, 16, 2 printstr "*", 104, 191, 2 printstr "", 114, 192, 2 copypage 2, 1 GOSUB title GOSUB drawmenu copypage 1, 0 needf = 2 fademusic 15 setkeys DO: setwait timing(), time setkeys IF keyval(1) > 1 THEN GOTO finis IF keyval(72) > 1 THEN ptr = ptr - 1: playsnd n(0), rate: IF ptr < 0 THEN ptr = last(set) IF keyval(80) > 1 THEN ptr = ptr + 1: playsnd n(0), rate: IF ptr > last(set) THEN ptr = 0 GOSUB title tog = tog + 1: IF tog > 14 THEN tog = 0 GOSUB drawmenu ON set + 1 GOSUB main, options, advanced, advanced SWAP dpage, vpage setvispage vpage copypage 2, dpage IF needf = 2 THEN fadetopal master(), fade(): needf = 0 IF needf = 1 THEN needf = 2 WHILE timing(0) = 0: WEND LOOP main: IF keyval(57) > 1 OR keyval(28) > 1 THEN IF ptr = 2 THEN GOTO finis playsnd n(1), rate IF ptr = 0 THEN IF angle$ = "WIDE" THEN xl! = 1.57: zl! = 0 IF angle$ = "HIGH" THEN xl! = 1.57: zl! = 1.57 IF angle$ = "DEEP" THEN xl! = 0: zl! = 1.57 IF angle$ = "CUSTOM" THEN xl! = orient!(1): zl! = orient!(2) IF rota$ = "OFF" THEN xr! = 0: zr! = 0 IF rota$ = "SLOW" THEN xr! = .01: zr! = .005 IF angle$ = "WIDE" THEN xr! = 0: zr! = .01 IF angle$ = "HIGH" THEN xr! = .01: zr! = 0 IF angle$ = "DEEP" THEN xr! = .005: zr! = .005 END IF IF rota$ = "FAST" THEN xr! = .05: zr! = .05 IF angle$ = "WIDE" THEN xr! = 0: zr! = .05 IF angle$ = "HIGH" THEN xr! = .05: zr! = 0 IF angle$ = "DEEP" THEN xr! = .03: zr! = .03 END IF IF rota$ = "CUSTOM" THEN xr! = orient!(3): zr! = orient!(4) needf = onedee(xl!, zl!, xr!, zr!, spd, back) IF needf = 1 THEN fadeto fade(), 63, 0, 0: setkeys loadsong "serenade.bam" + CHR$(0) END IF IF ptr = 1 THEN ptr = 0: set = 1: setkeys END IF RETURN loadmenu: IF keyval(57) > 1 OR keyval(28) > 1 THEN playsnd n(1), rate IF ptr = 3 THEN ptr = 0: set = 0: setkeys END IF RETURN options: IF ptr = 8 AND keyval(75) > 0 THEN spd = large!(spd - 1, 20): playsnd n(2), rate IF ptr = 8 AND keyval(77) > 0 THEN spd = small!(spd + 1, 60): playsnd n(2), rate IF keyval(57) > 1 OR keyval(28) > 1 THEN playsnd n(1), rate IF ptr = 7 THEN back = back XOR 1 IF back = 0 THEN menu$(7, set) = "Background OFF" IF back = 1 THEN menu$(7, set) = "Background ON" END IF IF ptr = 1 THEN angle$ = "WIDE": menu$(1, 1) = "-Width Mode-": menu$(2, 1) = "Height Mode": menu$(3, 1) = "Depth Mode" IF ptr = 2 THEN angle$ = "HIGH": menu$(1, 1) = "Width Mode": menu$(2, 1) = "-Height Mode-": menu$(3, 1) = "Depth Mode" IF ptr = 3 THEN angle$ = "DEEP": menu$(1, 1) = "Width Mode": menu$(2, 1) = "Height Mode": menu$(3, 1) = "-Depth Mode-" IF ptr = 4 THEN rota$ = "OFF": menu$(4, 1) = "-Rotation Off-": menu$(5, 1) = "Rotation Slow": menu$(6, 1) = "Rotation Fast" IF ptr = 5 THEN rota$ = "SLOW": menu$(4, 1) = "Rotation Off": menu$(5, 1) = "-Rotation Slow-": menu$(6, 1) = "Rotation Fast" IF ptr = 6 THEN rota$ = "FAST": menu$(4, 1) = "Rotation Off": menu$(5, 1) = "Rotation Slow": menu$(6, 1) = "-Rotation Fast-" IF ptr = 0 THEN ptr = 1: set = 0: setkeys IF ptr = 9 THEN ptr = 0: set = 2: setkeys END IF rectangle 80, 160, 160, 20, 16, dpage textcolor 47, 0 printstr "Angle Mode:" + angle$, 160 - (LEN("Angle Mode:" + angle$) * 4), 162, dpage printstr "Rotation:" + rota$, 160 - (LEN("Rotation:" + rota$) * 4), 170, dpage textcolor 15, 0 RETURN advanced: IF (keyval(57) > 1 OR keyval(28) > 1) AND ptr = 0 THEN set = 1: playsnd n(1), rate IF keyval(77) > 1 THEN playsnd n(2), rate IF ptr = 1 OR ptr = 2 THEN orient!(ptr) = orient!(ptr) + .15: IF orient!(ptr) > 3.1 THEN orient!(ptr) = -3.1 angle$ = "CUSTOM": menu$(1, 1) = "Width Mode": menu$(2, 1) = "Height Mode": menu$(3, 1) = "Depth Mode" END IF IF ptr = 3 OR ptr = 4 THEN orient!(ptr) = small!(orient!(ptr) + .01, .2): rota$ = "CUSTOM": menu$(4, 1) = "Rotation Off": menu$(5, 1) = "Rotation Slow": menu$(6, 1) = "Rotation Fast" END IF IF keyval(75) > 1 THEN playsnd n(2), rate IF ptr = 1 OR ptr = 2 THEN orient!(ptr) = orient!(ptr) - .15: IF orient!(ptr) < -3.1 THEN orient!(ptr) = 3.1 angle$ = "CUSTOM": menu$(1, 1) = "Width Mode": menu$(2, 1) = "Height Mode": menu$(3, 1) = "Depth Mode" END IF IF ptr = 3 OR ptr = 4 THEN orient!(ptr) = large!(orient!(ptr) - .01, -.2): rota$ = "CUSTOM": menu$(4, 1) = "Rotation Off": menu$(5, 1) = "Rotation Slow": menu$(6, 1) = "Rotation Fast" END IF FOR i = 1 TO 4 menu$(i, 2) = menu$(i, 3) + STR$(INT(orient!(i) * 100) / 100) NEXT i rectangle 80, 160, 160, 20, 16, dpage textcolor 47, 0 printstr "Angle Mode:" + angle$, 160 - (LEN("Angle Mode:" + angle$) * 4), 162, dpage printstr "Rotation:" + rota$, 160 - (LEN("Rotation:" + rota$) * 4), 170, dpage textcolor 15, 0 RETURN drawmenu: FOR i = 0 TO last(set) textcolor 15, 0 IF ptr = i THEN textcolor 160 + tog, 0 printstr menu$(i, set), 160 - (LEN(menu$(i, set)) * 4), 50 + (i * 10), dpage NEXT i textcolor 15, 0 IF set = 1 THEN rectangle 200, 130, spd - 20, 8, 7, dpage RETURN title: FOR o = 0 TO 8 textcolor 250 + ABS(col), 0 col = col + 1: IF col > 5 THEN col = -5 FOR i = 0 TO 2 printstr CHR$((134 + o) + 40 * i), 124 + (8 * o), 10 + (8 * i), dpage NEXT i: NEXT o textcolor 15, 0 RETURN strings: FOR o = 0 TO 4 READ last(o) FOR i = 0 TO last(o) READ menu$(i, o) NEXT i NEXT o RETURN DATA 2,Play Lineality,Options Menu,Exit Program DATA 9,Return to Main Menu,-Width Mode-,Height Mode,Depth Mode,-Rotation Off-,Rotation Slow,Rotation Fast,Background ON,Game Speed ,Advanced Options DATA 4,Return to Options Menu,X-Angle 0,YZ Plane 0,Pitch Speed 0,Yaw Speed 0 DATA 4,Return to Options Menu,XY Plane,Z Angle,Pitch Speed,Yaw Speed DATA 3,Load Game 1,Load Game 2,Load Game 3,Cancel Load finis: playsnd 36, 180 fademusic 0 fadeto fade(), 0, 0, 0 closemusic setdacvol oldvol setfmvol oldfm GOSUB shutoff closefile SCREEN 13: SYSTEM switchon: regs.ax = &H2509: regs.ds = Keyseg: regs.dx = keyoff CALL interruptx(&H21, regs, regs) RETURN shutoff: regs.ax = &H2509: regs.ds = seg9: regs.dx = off9 CALL interruptx(&H21, regs, regs) RETURN REM $STATIC FUNCTION large! (n1!, n2!) large! = n1! IF n2! > n1! THEN large! = n2! END FUNCTION FUNCTION onedee (xyang!, zang!, xyrot!, zrot!, speed%, back%) DIM menu$(4), bx(5), bp(5), bc(5), ex(30), eo(30), el(30), ep(30), ed(30), es(30), et(30), st(30), sx(30), sp(30), sd(30), time(1), it(-10 TO 190), stime(4) loadsong "riff.bam" + CHR$(0) onedee = 0 life = 30 rate = 211 shot = 1 yousay = 32 yousayw! = TIMER + 5 + INT(RND(1) * 10) theysay = 30 theysayw! = TIMER + .5 + INT(RND(1) * 19) vt = 1: vx = 4 stime(1) = 10: stime(2) = 18: stime(3) = 5: stime(4) = 25 menu$(1) = "Save Game": menu$(2) = "Load Game": menu$(3) = "Continue": menu$(4) = "Quit Game" vpage = 0: dpage = 1 ux = 90 delay = 0 dir = 1 nspeed = speed freq = 40 bonus = 2 textcolor 15, 0 setkeys WHILE life > 0 setkeys IF keyval(1) > 0 THEN GOSUB menu IF keyval(59) > 1 THEN GOSUB save IF keyval(60) > 1 THEN GOSUB load speed = nspeed IF speed > 0 THEN setwait time(), speed hfac! = COS(zang!) vfac! = SIN(zang!) * SIN(xyang!) zfac! = SIN(zang!) * COS(xyang!) IF keyval(2) > 1 THEN xyrot! = xyrot! + .002 IF keyval(3) > 1 THEN xyrot! = xyrot! - .002 IF keyval(4) > 1 THEN zrot! = zrot! + .002 IF keyval(5) > 1 THEN zrot! = zrot! - .002 IF keyval(13) > 1 OR keyval(78) > 1 THEN nspeed = speed - 5: IF nspeed < 0 THEN nspeed = 0 IF keyval(12) > 1 OR keyval(74) > 1 THEN nspeed = speed + 5: IF nspeed > 100 THEN nspeed = 100 IF keyval(60) > 1 THEN sgame = 1: GOSUB save IF keyval(61) > 1 THEN sgame = 1: GOSUB load xyang! = xyang! + xyrot! zang! = zang! + zrot! xstart = 160 - hfac! * 90 ystart = 110 - vfac! * 90 FOR i = 1 TO 180 it(i) = 0 NEXT i shift = 0 IF keyval(72) > 1 THEN IF vt > 0 AND ABS(vx - ux) < 2 AND vehicle = 0 THEN vehicle = 1 ELSE vehicle = 0 IF keyval(75) > 0 THEN dir = -1: IF ux > 50 THEN ux = ux - 1 ELSE shift = 1 IF keyval(77) > 0 THEN dir = 1: IF ux < 130 THEN ux = ux + 1 ELSE shift = -1 IF delay > 0 THEN delay = delay - 1 IF keyval(57) > 0 AND delay < 1 THEN tmp = 0 DO tmp = tmp + 1 LOOP UNTIL st(tmp) = 0 OR tmp = 31 IF tmp < 31 THEN IF shot = 5 THEN tmp2 = INT(RND(1) * 4) + 1 ELSE IF vehicle = 1 THEN tmp2 = 4 ELSE tmp2 = shot sp(tmp) = 0 st(tmp) = tmp2: delay = stime(tmp2) playsnd 19 + tmp2, rate sx(tmp) = ux + dir sd(tmp) = dir * 2 END IF END IF 'enemies FOR i = 1 TO 30 IF et(i) > 0 THEN ep(i) = ep(i) + es(i) tmp = ed(i) * FIX(ep(i) / 4) + shift eo(i) = ex(i) ex(i) = ex(i) + tmp IF eo(i) < ex(i) THEN tmp = eo(i): tmp2 = ex(i) ELSE tmp = ex(i): tmp2 = eo(i) ep(i) = ep(i) AND 3 IF ux + vehicle >= tmp AND ux - vehicle <= tmp2 THEN et(i) = 0: life = life - 1 + vehicle: IF vehicle THEN playsnd 25 + INT(RND(1) * 5), rate ELSE playsnd 14 + INT(RND(1) * 3), rate IF ex(i) > 180 OR ex(i) < 1 OR et(i) = 0 THEN et(i) = 0 ELSE it(ex(i)) = 13 END IF NEXT i 'shots FOR i = 1 TO 30 SELECT CASE st(i) 'normal gun CASE 1 tmp = sx(i) sx(i) = sx(i) + sd(i) + shift IF tmp < sx(i) THEN tmp2 = sx(i) ELSE tmp2 = tmp: tmp = sx(i) FOR j = 1 TO 30 IF et(j) > 0 THEN IF ex(j) < eo(j) THEN tmp3 = ex(j): tmp4 = eo(j) ELSE tmp3 = eo(j): tmp4 = ex(j) IF tmp <= tmp4 AND tmp2 >= tmp3 THEN st(i) = 0: it(sx(i)) = 4: el(j) = el(j) - 1: IF el(j) < 1 THEN et(j) = 0: it(ex(j)) = 4: playsnd 9 + INT(RND(1) * 11), rate: IF INT(RND(1) * bonus) = 0 AND bx(nextb) = 0 THEN bx(nextb) = ex(j) END IF NEXT j IF st(i) = 0 OR sx(i) > 180 OR sx(i) < 1 THEN st(i) = 0 ELSE it(sx(i)) = 11 'laser gun CASE 2 tmp = sx(i) sx(i) = sx(i) + sd(i) + shift IF tmp < sx(i) THEN tmp2 = sx(i) ELSE tmp2 = tmp: tmp = sx(i) IF st(i) = 0 OR sx(i) > 180 OR sx(i) < 1 THEN st(i) = 0 ELSE it(sx(i)) = 9: it(sx(i) + sd(i) / 2) = 9 FOR j = 1 TO 30 IF et(j) > 0 THEN IF ex(j) < eo(j) THEN tmp3 = ex(j): tmp4 = eo(j) ELSE tmp3 = eo(j): tmp4 = ex(j) IF tmp <= tmp4 AND tmp2 >= tmp3 THEN it(ex(j)) = 4: el(j) = el(j) - 1: IF el(j) < 1 THEN et(j) = 0: playsnd 9 + INT(RND(1) * 11), rate: IF INT(RND(1) * bonus) = 0 AND bx(nextb) = 0 THEN bx(nextb) = ex(j) END IF NEXT j 'machine gun CASE 3 tmp = sx(i) sx(i) = sx(i) + sd(i) + shift sp(i) = sp(i) + 1: IF sp(i) > 20 THEN st(i) = 0 IF tmp < sx(i) THEN tmp2 = sx(i) ELSE tmp2 = tmp: tmp = sx(i) FOR j = 1 TO 30 IF et(j) > 0 THEN IF ex(j) < eo(j) THEN tmp3 = ex(j): tmp4 = eo(j) ELSE tmp3 = eo(j): tmp4 = ex(j) IF tmp <= tmp4 AND tmp2 >= tmp3 THEN st(i) = 0: it(sx(i)) = 4: el(j) = el(j) - INT(RND(1) + .8): IF el(j) < 1 THEN et(j) = 0: it(ex(j)) = 4: playsnd 9 + INT(RND(1) * 11), rate: IF INT(RND(1) * bonus) = 0 AND bx(nextb) = 0 THEN bx(nextb) = ex(j) END IF NEXT j IF st(i) = 0 OR sx(i) > 180 OR sx(i) < 1 THEN st(i) = 0 ELSE it(sx(i)) = 11 'explosive gun CASE 4 sp(i) = sp(i) + 1: IF sp(i) = 40 THEN st(i) = 5: sp(i) = 0: playsnd 24, rate tmp = sx(i) sx(i) = sx(i) + sd(i) / 2 + shift IF tmp < sx(i) THEN tmp2 = sx(i) ELSE tmp2 = tmp: tmp = sx(i) IF st(i) = 0 OR sx(i) > 180 OR sx(i) < 1 THEN st(i) = 0 ELSE it(sx(i)) = 11 FOR j = 1 TO 30 IF et(j) > 0 THEN IF ex(j) < eo(j) THEN tmp3 = ex(j): tmp4 = eo(j) ELSE tmp3 = eo(j): tmp4 = ex(j) IF tmp <= tmp4 AND tmp2 >= tmp3 THEN st(i) = 5: playsnd 24, rate: sp(i) = 0: et(j) = 0: it(ex(j)) = 4: playsnd 9 + INT(RND(1) * 11), rate: IF INT(RND(1) * bonus) = 0 AND bx(nextb) = 0 THEN bx(nextb) = ex(j) END IF NEXT j 'explosion CASE 5 sp(i) = sp(i) + 1 tmp3 = 5 - ABS(sp(i) - 5) sx(i) = sx(i) + shift tmp = sx(i) - tmp3: tmp2 = sx(i) + tmp3 IF tmp < 0 THEN tmp = 0 IF tmp2 > 180 THEN tmp2 = 180 FOR j = tmp TO tmp2: it(j) = 12: NEXT j IF ux >= tmp AND ux <= tmp2 THEN life = life - 1 IF vt > 0 AND vx >= tmp AND vx <= tmp2 THEN vt = 0: vehicle = 0 FOR j = 1 TO 30 IF et(j) > 0 THEN IF ex(j) < eo(j) THEN tmp3 = ex(j): tmp4 = eo(j) ELSE tmp3 = eo(j): tmp4 = ex(j) IF tmp <= tmp4 AND tmp2 >= tmp3 THEN et(j) = 0: it(ex(j)) = 4: playsnd 9 + INT(RND(1) * 11), rate: IF INT(RND(1) * bonus) = 0 AND bx(nextb) = 0 THEN bx(nextb) = ex(j) END IF NEXT j IF sp(i) = 10 THEN st(i) = 0 END SELECT NEXT i 'bonus items FOR i = 1 TO 5 IF bx(i) > 0 THEN bp(i) = bp(i) + 1 bc(i) = bc(i) + INT(bp(i) / 8): IF bc(i) > 14 THEN bc(i) = 0 bp(i) = bp(i) AND 7 bx(i) = bx(i) + shift IF bx(i) = ux AND vehicle = 0 THEN SELECT CASE bc(i) CASE 0 TO 2, 13, 14 IF shot = 2 THEN shot = 1: playsnd 37, rate ELSE shot = 2: playsnd 38, rate CASE 3 TO 7 IF shot = 3 THEN shot = 1: playsnd 37, rate ELSE shot = 3: playsnd 39, rate CASE 8 TO 12 playsnd 40, rate life = life + 3 - ABS(bc(i) - 10) IF life > 200 THEN life = 200 END SELECT bx(i) = 0 END IF IF bx(i) > 0 AND bx(i) < 181 THEN it(bx(i)) = bc(i) + 160 ELSE nextb = i END IF NEXT i 'enemy spawner IF theysayw! < TIMER THEN playsnd theysay, rate: theysayw! = TIMER + .5 + INT(RND(1) * 19): theysay = 30 + INT(RND(1) * 2) IF INT(RND(1) * chance) = 0 THEN chance = freq tmp = 0 DO tmp = tmp + 1 LOOP UNTIL et(tmp) = 0 OR tmp = 30 el(tmp) = INT(RND(1) * 3) + 2 et(tmp) = 1 es(tmp) = INT(RND(1) * 3) + 2 SELECT CASE shift CASE 1 ex(tmp) = 1 ed(tmp) = 1 CASE -1 ex(tmp) = 180 ed(tmp) = -1 CASE ELSE tmp2 = INT(RND(1) * 2) IF tmp2 = 0 THEN ex(tmp) = 1: ed(tmp) = 1 IF tmp2 = 1 THEN ex(tmp) = 180: ed(tmp) = -1 END SELECT ELSE chance = chance - 1 END IF 'you and vehicle IF yousayw! < TIMER THEN playsnd yousay, rate: yousayw! = TIMER + 5 + INT(RND(1) * 10): yousay = 32 + INT(RND(1) * 4) it(ux) = 14 IF vt > 0 THEN IF vehicle = 1 THEN vx = ux ELSE vx = vx + shift IF vx < 0 OR vx > 181 THEN vt = 0 it(vx - 1) = 2: it(vx) = 2: it(vx + 1) = 2 ELSE IF shift <> 0 AND INT(RND(1) * 100) = 99 THEN vt = 1: vehicle = 0: vx = 90 - 89 * shift END IF 'draw everything clearpage dpage x! = 0: y! = 0 IF back = 1 THEN FOR i = 1 TO 180 putpixel xstart + x!, ystart + y!, 151.5 + zfac! * (i - 90) / 90 * 7.5, dpage x! = x! + hfac!: y! = y! + vfac! NEXT i END IF x! = 0: y! = 0 FOR i = 1 TO 180 IF it(i) > 0 THEN putpixel xstart + x!, ystart + y!, it(i), dpage x! = x! + hfac!: y! = y! + vfac! NEXT i printstr "LIFE-", 0, 0, dpage IF life > 0 THEN rectangle 40, 0, life * 2, 8, 33, dpage SWAP vpage, dpage setvispage vpage IF speed > 0 THEN dowait WEND IF life <> -37 THEN playsnd 33, rate: onedee = 1 GOTO done save: OPEN "lineal.sav" FOR BINARY AS #1 PUT #1, 1, life PUT #1, 3, shot PUT #1, 5, freq PUT #1, 7, bonus PUT #1, 9, ux PUT #1, 11, vehicle PUT #1, 13, vt PUT #1, 15, vx FOR i = 0 TO 30 PUT #1, 17 + 22 * i, ex(i) PUT #1, 19 + 22 * i, eo(i) PUT #1, 21 + 22 * i, el(i) PUT #1, 23 + 22 * i, ep(i) PUT #1, 25 + 22 * i, ed(i) PUT #1, 27 + 22 * i, es(i) PUT #1, 29 + 22 * i, et(i) PUT #1, 31 + 22 * i, st(i) PUT #1, 33 + 22 * i, sx(i) PUT #1, 35 + 22 * i, sp(i) PUT #1, 37 + 22 * i, sd(i) NEXT i FOR i = 0 TO 5 PUT #1, 683 + i * 6, bx(i) PUT #1, 685 + i * 6, bp(i) PUT #1, 687 + i * 6, bc(i) NEXT i CLOSE #1 RETURN menu: ptr = 1 resolve = 0 colorx! = 0 setkeys WHILE resolve = 0 setkeys setwait time(), speed clearpage dpage IF (keyval(28) > 1) OR (keyval(57) > 1) THEN resolve = 1: playsnd 8, rate IF keyval(1) > 1 THEN resolve = 1: ptr = 4 IF keyval(72) > 1 AND ptr > 1 THEN ptr = ptr - 1: playsnd 7, rate IF keyval(80) > 1 AND ptr < 4 THEN ptr = ptr + 1: playsnd 7, rate IF colorx! < 6.28 THEN colorx! = colorx! + .08 ELSE colorx! = 0 IF colorx! < 3.14 THEN FOR i = 1 TO 4 tmp = SIN(colorx!) * ((i - 2.5) * 3) tmp2 = COS(colorx!) * ((i - 2.5) * 10) IF ptr = i THEN textcolor 87.5 + tmp, 0 ELSE textcolor 151.5 + tmp, 0 printstr menu$(i), 160 - LEN(menu$(i)) * 4, 100 + tmp2, dpage NEXT i ELSE FOR i = 4 TO 1 STEP -1 tmp = SIN(colorx!) * ((i - 2.5) * 3) tmp2 = COS(colorx!) * ((i - 2.5) * 10) IF ptr = i THEN textcolor 87.5 + tmp, 0 ELSE textcolor 151.5 + tmp, 0 printstr menu$(i), 160 - LEN(menu$(i)) * 4, 100 + tmp2, dpage NEXT i END IF SWAP vpage, dpage setvispage vpage dowait WEND IF ptr = 1 THEN GOSUB save IF ptr = 2 THEN GOSUB load IF ptr = 4 THEN life = -37 RETURN load: OPEN "lineal.sav" FOR BINARY AS #1 GET #1, 1, life GET #1, 3, shot GET #1, 5, freq GET #1, 7, bonus GET #1, 9, ux GET #1, 11, vehicle GET #1, 13, vt GET #1, 15, vx FOR i = 0 TO 30 GET #1, 17 + 22 * i, ex(i) GET #1, 19 + 22 * i, eo(i) GET #1, 21 + 22 * i, el(i) GET #1, 23 + 22 * i, ep(i) GET #1, 25 + 22 * i, ed(i) GET #1, 27 + 22 * i, es(i) GET #1, 29 + 22 * i, et(i) GET #1, 31 + 22 * i, st(i) GET #1, 33 + 22 * i, sx(i) GET #1, 35 + 22 * i, sp(i) GET #1, 37 + 22 * i, sd(i) NEXT i FOR i = 0 TO 5 GET #1, 683 + i * 6, bx(i) GET #1, 685 + i * 6, bp(i) GET #1, 687 + i * 6, bc(i) NEXT i CLOSE #1 RETURN done: END FUNCTION FUNCTION small! (n1!, n2!) small! = n1! IF n2! < n1! THEN small! = n2! END FUNCTION