DECLARE SUB hit (zz!) DECLARE FUNCTION distbetween! (x!, y!, x1!, y1!) DECLARE SUB explode (zz!) DECLARE FUNCTION r! (x!) DECLARE SUB stars () DECLARE SUB titlescreen () DECLARE SUB centre (y!, a$) DECLARE SUB delay (x!) DECLARE SUB options () DECLARE FUNCTION onoff$ (x!) DECLARE SUB backup () DECLARE SUB writeshipinfo (zz!) DECLARE SUB readshipinfo (zz!) DECLARE SUB hyperspace (zz!, yy!) DECLARE SUB status (zz!, a$) DECLARE SUB info () DECLARE SUB display (zz!) DECLARE SUB dokeys () DECLARE SUB moveships () CONST numships = 3 CONST speed = .01 CONST conv = 3.1415927# / 180 CONST true = 1 CONST false = 0 CONST multimode = 0 CONST rev$ = "SPW beta build #11" COMMON SHARED trails, shotspd, accel, spdlim, turn, shipsize, shipmode COMMON SHARED quit, bounce, gamena$, shotsize, starmode, livesmode COMMON SHARED maxlives ON ERROR GOTO errorhandler turn = 10 shotspd = 100 accel = 10 spdlim = 250 shipmode = 1 shipsize = 5 shotsize = 2 starmode = true livesmode = false maxlives = 4 RANDOMIZE TIMER SCREEN 0 IF multimode = true THEN PRINT "Multi-SPW (c)1995 Adam Sampson" PRINT PRINT "Enter `0` for the shipcode." PRINT INPUT "shipcode> ", z INPUT "game name (8 chars, no spaces)> ", gamena$ END IF SCREEN 12 DIM SHARED shipx(numships), shipy(numships), ships(numships), shipa(numships) DIM SHARED score(numships), oldx(numships), oldy(numships), olda(numships) DIM SHARED cloak(numships), hyper(numships) FOR k = 0 TO numships score(k) = 0 NEXT k trails = false DO titlescreen CLS IF starmode = true THEN stars FOR k = 0 TO numships shipx(k) = 220 + ((k MOD 2) * 200) shipy(k) = 480 / 2 ships(k) = 0 shipa(k) = r(360) cloak(k) = 1 hyper(k) = maxlives NEXT k quit = 0 DO backup dokeys moveships IF multimode = true THEN writeshipinfo z writeshipinfo z + 2 readshipinfo 1 - z readshipinfo ((1 - z) + 2) END IF display 0 display 1 info LOOP UNTIL quit = 1 delay .5 COLOR 15: centre 20, "Press any key" DO: LOOP UNTIL INKEY$ = "" DO: LOOP UNTIL INKEY$ <> "" LOOP DO: LOOP UNTIL INKEY$ = "" END errorhandler: LOCATE 2, 1: PRINT "errorcode: "; ERR; " cont. " RESUME NEXT SUB backup FOR k = 0 TO numships oldx(k) = shipx(k) oldy(k) = shipy(k) olda(k) = shipa(k) NEXT k END SUB SUB centre (y, a$) LOCATE y, 40 - (LEN(a$) / 2): PRINT a$; END SUB SUB delay (x) t = TIMER + x: DO: LOOP UNTIL TIMER > t END SUB SUB display (zz) FOR k = 0 TO numships IF cloak(k) = 1 THEN IF k < 2 THEN IF zz = 0 THEN LINE (oldx(k), oldy(k))-(oldx(k) + shipsize * SIN(olda(k) * conv), oldy(k) + shipsize * COS(olda(k) * conv)), 0 IF shipmode = 1 THEN CIRCLE (oldx(k), oldy(k)), shipsize + 1, 0 ELSE LINE (shipx(k), shipy(k))-(shipx(k) + shipsize * SIN(shipa(k) * conv), shipy(k) + shipsize * COS(shipa(k) * conv)), 9 + k IF shipmode = 1 THEN CIRCLE (shipx(k), shipy(k)), shipsize + 1, 9 + k END IF IF trails = true THEN LINE (shipx(k), shipy(k))-(shipx(k), shipy(k)), 9 + k ELSE IF zz > 0 THEN CIRCLE (shipx(k), shipy(k)), shotsize, 9 + k ELSE CIRCLE (oldx(k), oldy(k)), shotsize, 0 END IF 'LINE (shipx(k), shipy(k))-(shipx(k), shipy(k)), zz * (9 + k) END IF END IF NEXT k END SUB FUNCTION distbetween (x, y, x1, y1) distbetween = SQR(((x1 - x) * (x1 - x)) + ((y1 - y) * (y1 - y))) END FUNCTION SUB dokeys SELECT CASE INKEY$ CASE CHR$(27) quit = 1 CASE "c" hyperspace 0, 0 CASE "v" hyperspace 0, 1 CASE "a" ships(0) = ships(0) + accel CASE "z" ships(0) = ships(0) - accel CASE "e" shipa(0) = shipa(0) - turn CASE "w" shipa(0) = shipa(0) + turn CASE "x" shipa(2) = shipa(0) ships(2) = shotspd + ships(0) shipx(2) = shipx(0) shipy(2) = shipy(0) CASE "*" hyperspace 1, 0 CASE "8" ships(1) = ships(1) + accel CASE "2" ships(1) = ships(1) - accel CASE "6" shipa(1) = shipa(1) - turn CASE "4" shipa(1) = shipa(1) + turn CASE "0" shipa(3) = shipa(1) ships(3) = shotspd + ships(1) shipx(3) = shipx(1) shipy(3) = shipy(1) CASE "+" hyperspace 1, 1 CASE "Q" quit = 1 CASE ELSE ' do nuffin END SELECT END SUB SUB explode (zz) rr = 300 x = shipx(zz) - rr / 2 y = shipy(zz) - rr / 2 FOR k = 0 TO 50 xx = x + r(rr) yy = y + r(rr) LINE (shipx(zz), shipy(zz))-(xx, yy), r(16) xx = x + r(rr) yy = y + r(rr) LINE (xx, yy)-(xx + r(6), yy + r(6)), r(16), BF FOR j = 1 TO 100: NEXT j NEXT k status zz, "DIED!" score(1 - zz) = score(1 - zz) + 1 END SUB SUB hit (zz) IF livesmode = true THEN status zz, "Hit you! (Bang!)" hyper(zz) = hyper(zz) - 1 IF hyper(zz) < 1 THEN explode zz quit = 1 ELSE shot = (1 - zz) + 2 ships(shot) = 0 shipx(shot) = shipx(1 - zz) shipy(shot) = shipy(1 - zz) END IF ELSE explode zz status 1 - zz, "*** You win! ***" quit = 1 END IF END SUB SUB hyperspace (zz, yy) hyper(zz) = hyper(zz) - 1 IF hyper(zz) = 0 THEN hyper(zz) = 1 status zz, "Out of hyperspace fuel." ELSE IF yy = 1 THEN ships(zz) = 10000 status zz, "Hyperjump! Fuel:" + STR$(hyper(zz)) ELSE shipx(zz) = r(640) - 1 shipy(zz) = r(480) - 1 status zz, "Hyperspace! Fuel:" + STR$(hyper(zz)) END IF END IF END SUB SUB info LOCATE 1, 35: PRINT "ATSoft SPW" LOCATE 1, 1 COLOR 9: PRINT "0s:"; INT(ships(0)); " f:"; hyper(0); " "; LOCATE 1, 50 COLOR 10: PRINT "1s:"; INT(ships(1)); " f:"; hyper(1); " "; END SUB SUB moveships FOR k = 0 TO numships ix = (SIN(shipa(k) * conv) * ships(k) * speed) iy = (COS(shipa(k) * conv) * ships(k) * speed) shipx(k) = shipx(k) + ix shipy(k) = shipy(k) + iy IF bounce = 0 THEN IF shipx(k) > 639 THEN shipx(k) = 0 IF shipx(k) < 0 THEN shipx(k) = 639 IF shipy(k) > 479 THEN shipy(k) = 0 IF shipy(k) < 0 THEN shipy(k) = 479 ELSE IF shipy(k) < 0 OR shipy(k) > 479 THEN END IF IF shipx(k) > 639 OR shipx(k) < 0 OR shipy(k) > 479 OR shipy(k) < 0 THEN shipa(k) = shipa(k) - 180 END IF END IF ships(k) = ABS(ships(k)) IF k < 2 THEN 'IF energy(k) <= 0 THEN explode k: quit = 1 IF ships(k) > spdlim THEN ships(k) = spdlim IF ships(k) > 0 THEN ships(k) = ships(k) - .05 END IF NEXT k IF distbetween(shipx(0), shipy(0), shipx(1), shipy(1)) < shipsize THEN explode 0 explode 1 quit = 1 END IF d = distbetween(shipx(0), shipy(0), shipx(3), shipy(3)) IF d < shipsize * 2 THEN 'explode 0 'status 1, "*** YOU WIN!! ***" 'quit = 1 hit 0 'energy(0) = energy(0) - (INT(d) * 10) END IF d = distbetween(shipx(1), shipy(1), shipx(2), shipy(2)) IF d < shipsize * 2 THEN 'explode 1 'status 0, "*** YOU WIN!! ***" 'quit = 1 hit 1 'energy(1) = energy(1) - (INT(d) * 10) END IF END SUB FUNCTION onoff$ (x) IF x = true THEN p$ = "on" ELSE p$ = "off" onoff$ = p$ END FUNCTION SUB options DO CLS : COLOR 12 PRINT "SPW Options" PRINT "-----------" COLOR 13 PRINT PRINT "1 -> zippy ships" PRINT "2 -> Morris Minor mode" PRINT "3 -> DeathStar(r) mode" PRINT "4 -> Ian Ships" PRINT PRINT "m -> ship mode"; TAB(40); shipmode PRINT "z -> ship size"; TAB(40); shipsize PRINT "h -> shot size"; TAB(40); shotsize PRINT "s -> shot speed"; TAB(40); shotspd PRINT "a -> accelaration"; TAB(40); accel PRINT "t -> turn speed"; TAB(40); turn PRINT "l -> speed limit"; TAB(40); spdlim PRINT "r -> trails"; TAB(40); onoff$(trails) PRINT "b -> ship bounce"; TAB(40); onoff$(bounce) PRINT "* -> stars"; TAB(40); onoff$(starmode) PRINT "i -> lives mode"; TAB(40); onoff$(livesmode) PRINT "I -> max lives"; TAB(40); maxlives PRINT PRINT "x -> exit" PRINT DO: LOOP UNTIL INKEY$ = "" DO: i$ = INKEY$: LOOP UNTIL i$ <> "" SELECT CASE i$ CASE "1" shotspd = 100 accel = 50 turn = 25 spdlim = 400 trails = true shipmode = 0 shipsize = 20 shotsize = 1 CASE "2" shotspd = 10 accel = 5 turn = 10 spdlim = 100 trails = true shipsize = 20 shipmode = 1 shotsize = 10 CASE "3" shotspd = 2000 accel = 3 turn = 2 spdlim = 50 trails = true shipsize = 70 shipmode = 1 shotsize = 40 CASE "4" shipsize = 2 shotsize = 1 shipmode = 0 CASE "m" INPUT "ship mode (0-1)? ", shipmode CASE "z" INPUT "ship size (2-10)? ", shipsize CASE "h" INPUT "shot size (2-10)? ", shotsize CASE "s" INPUT "shot speed? ", shotspd CASE "a" INPUT "accelaration? ", accel CASE "t" INPUT "turn speed? ", turn CASE "l" INPUT "speed limit? ", spdlim CASE "r" trails = 1 - trails CASE "b" bounce = 1 - bounce CASE "*" starmode = 1 - starmode CASE "i" livesmode = 1 - livesmode CASE "I" INPUT "number of lives? ", maxlives END SELECT LOOP UNTIL i$ = "x" END SUB FUNCTION r (x) r = INT(RND(1) * x) + 1 END FUNCTION SUB readshipinfo (zz) file = FREEFILE OPEN "s:\common\spw\" + gamena$ + ".sh" + RIGHT$(STR$(zz), 1) FOR INPUT SHARED AS file INPUT #file, shipx(zz), shipy(zz), shipa(zz), ships(zz) CLOSE file END SUB SUB snd (x) SELECT CASE x CASE 1 PLAY "<<>>" CASE 2 ' sound freq, dura SOUND 50, 3 END SELECT END SUB SUB stars FOR k = 0 TO 200 x = r(639) y = r(479) s = 1 SELECT CASE r(3) CASE 1 c = 14 - 8 CASE 2 c = 14 CASE 3 c = 15 END SELECT LINE (x, y)-(x + s, y + s), c, BF NEXT k END SUB SUB status (zz, a$) LOCATE 2, 1 + (39 * zz) COLOR 9 + zz PRINT STRING$(30, " "); LOCATE 2, 1 + (39 * zz) PRINT a$ END SUB SUB titlescreen DO CLS stars COLOR 15 IF multimode = true THEN centre 3, "** Multi-Mode Build **" ELSE centre 3, "** Single-Mode Build **" END IF COLOR 11 centre 5, " __ ____ _ _ _ " centre 6, "===> / |___) | | | <===" centre 7, " __\ | |_|_| " COLOR 13 centre 12, "(c)1995 Adam Sampson: ats@bob.soaks.kent.sch.uk" centre 13, rev$ centre 14, "NEW: *** HyperJump ***" COLOR 15 centre 16, "0: A X=fire 1: 8 0=fire " centre 17, " W-+-E C=hyper 4-+-6 *=hyper" centre 18, " Z V=jump 2 +=jump " COLOR 12 LOCATE 20, 20: PRINT "0: "; score(0); : LOCATE 20, 60: PRINT "1:"; score(1) COLOR 14 centre 25, "Press [SPACE] to start" centre 26, "Press [q] to quit" centre 27, "Press [o] for options" DO: LOOP UNTIL INKEY$ = "" DO: i$ = INKEY$: LOOP UNTIL i$ <> "" IF i$ = "q" THEN END IF i$ = "o" THEN options LOOP UNTIL i$ = " " END SUB SUB writeshipinfo (zz) file = FREEFILE OPEN "s:\common\spw\" + gamena$ + ".sh" + RIGHT$(STR$(zz), 1) FOR OUTPUT SHARED AS file PRINT #file, shipx(zz), shipy(zz), shipa(zz), ships(zz) CLOSE file END SUB