'=========================================================================== ' Subject: SPACE VIPER V1.0 Date: 05-16-99 (10:12) ' Author: Dominick Aguilar Code: QB, QBasic, PDS ' Origin: www.qbasicfiles.8m.com Packet: GAMES.ABC '=========================================================================== DECLARE SUB MouseStatus (lb%, rb%, xMouse%, yMouse%) DECLARE SUB MouseHide () DECLARE SUB MouseDriver (ax%, bx%, cx%, dx%) DECLARE SUB MouseShow () DECLARE FUNCTION mouseInit% () DIM SHARED Mouse$ Mouse$ = SPACE$(57) FOR I% = 1 TO 57 READ a$ H$ = CHR$(VAL("&H" + a$)) MID$(Mouse$, I%, 1) = H$ NEXT I% DATA 55,89,E5,8B,5E,0C,8B,07,50,8B,5E,0A,8B,07,50,8B DATA 5E,08,8B,0F,8B,5E,06,8B,17,5B,58,1E,07,CD,33,53 DATA 8B,5E,0C,89,07,58,8B,5E,0A,89,07,8B,5E,08,89,0F DATA 8B,5E,06,89,17,5D,CA,08,00 CLS ms% = mouseInit% IF NOT ms% THEN PRINT "Mouse not found" END END IF hiscr = 0 SCREEN 12 GOSUB 1200 5 CLS COLOR 1 mtr = 0 x = 300 y = 200 zm = 2 pi = 3.14159 a = pi / 2 v = 9 mv = 1 time = 100 shield = 100.1 score = 0 ships = 3 GOSUB 100 10 REM -------------- MAIN LOOP ---------------- FOR d = 1 TO 90 a$ = INKEY$ IF a$ <> "" THEN 15 NEXT d 15 REM ---------------------------- time = time - .1 IF time <= 0 THEN GOSUB 1000 IF x < 25 THEN v = 0: x = 25.1 IF x > 500 THEN v = 0: x = 499.9 IF x > 25 AND x < 600 THEN v = 9 IF y < 25 THEN v = 0: y = 25.1 IF y > 450 THEN v = 0: y = 449.9 IF y > 25 AND y < 450 THEN v = 9 GOSUB 900 REM --------- do a$ thing -------- IF a$ = " " THEN GOSUB 1300 IF a$ = "q" THEN GOSUB 1400 MouseStatus lb%, rb%, x%, y% IF lb% = -1 AND x% < 200 THEN a = a + (pi / 90): IF a > (2 * pi) THEN a = 0 IF lb% = -1 AND x% > 300 THEN a = a - (pi / 90): IF a < 0 THEN a = (2 * pi) IF lb% = -1 AND x% < 1 THEN a = a + (pi / 45): IF a > (2 * pi) THEN a = 0 IF lb% = -1 AND x% > 599 THEN a = a - (pi / 45): IF a < 0 THEN a = (2 * pi) IF lb% = -1 THEN v = 9 IF lb% = 0 THEN v = 4 x = x + v / zm * COS(a): y = y + v / zm * SIN(a) IF rb% = -1 AND msl = 0 THEN SOUND 5000, 1: GOSUB 500 IF msl = 1 THEN GOSUB 500 mtrr = INT(RND(1) * 5) + 1 IF mtrr > 1 AND mtr = 0 THEN mtr = 2: GOSUB 600 IF mtr = 1 THEN GOSUB 600 GOSUB 200 GOTO 10 100 REM -------- Update Ship ---------- cpx = x + 5 / zm * COS(a) cpy = y + 5 / zm * SIN(a) cpr = 5 / zm nx = x + 30 / zm * COS(a) ny = y + 30 / zm * SIN(a) rbfx = x + 10 / zm * COS(a - (pi / 4)) rbfy = y + 10 / zm * SIN(a - (pi / 4)) rwfx = x + 20 / zm * COS(a - (3 * pi / 8)) rwfy = y + 20 / zm * SIN(a - (3 * pi / 8)) rwrx = x + 25 / zm * COS(a - (5 * pi / 8)) rwry = y + 25 / zm * SIN(a - (5 * pi / 8)) rbrx = x + 10 / zm * COS(a - (3 * pi / 4)) rbry = y + 10 / zm * SIN(a - (3 * pi / 4)) rtx = x + 12 / zm * COS(a - (7 * pi / 8)) rty = y + 12 / zm * SIN(a - (7 * pi / 8)) lbfx = x + 10 / zm * COS(a + (pi / 4)) lbfy = y + 10 / zm * SIN(a + (pi / 4)) lwfx = x + 20 / zm * COS(a + (3 * pi / 8)) lwfy = y + 20 / zm * SIN(a + (3 * pi / 8)) lwrx = x + 25 / zm * COS(a + (5 * pi / 8)) lwry = y + 25 / zm * SIN(a + (5 * pi / 8)) lbrx = x + 10 / zm * COS(a + (3 * pi / 4)) lbry = y + 10 / zm * SIN(a + (3 * pi / 4)) ltx = x + 12 / zm * COS(a + (7 * pi / 8)) lty = y + 12 / zm * SIN(a + (7 * pi / 8)) COLOR 1 LINE (nx, ny)-(rbfx, rbfy) LINE (rbfx, rbfy)-(rwfx, rwfy) LINE (rwfx, rwfy)-(rwrx, rwry) LINE (rwrx, rwry)-(rbrx, rbry) LINE (rbrx, rbry)-(rtx, rty) IF v > 4 THEN COLOR 4: SOUND 14985, 1 LINE (rtx, rty)-(ltx, lty) COLOR 1 LINE (ltx, lty)-(lbrx, lbry) LINE (lbrx, lbry)-(lwrx, lwry) LINE (lwrx, lwry)-(lwfx, lwfy) LINE (lwfx, lwfy)-(lbfx, lbfy) LINE (lbfx, lbfy)-(nx, ny) COLOR 9 CIRCLE (cpx, cpy), (cpr) RETURN 200 REM -------- Clear Old Ship Position ------- COLOR 0 LINE (nx, ny)-(rbfx, rbfy) LINE (rbfx, rbfy)-(rwfx, rwfy) LINE (rwfx, rwfy)-(rwrx, rwry) LINE (rwrx, rwry)-(rbrx, rbry) LINE (rbrx, rbry)-(rtx, rty) LINE (rtx, rty)-(ltx, lty) LINE (ltx, lty)-(lbrx, lbry) LINE (lbrx, lbry)-(lwrx, lwry) LINE (lwrx, lwry)-(lwfx, lwfy) LINE (lwfx, lwfy)-(lbfx, lbfy) LINE (lbfx, lbfy)-(nx, ny) CIRCLE (cpx, cpy), (cpr) GOTO 100 500 REM ----------------- missle ------------------- IF msl = 0 THEN msl = 1: msla = a: mslx = nx: msly = ny COLOR 0 CIRCLE (mslx, msly), (2 / zm) mslx = mslx + 10 * COS(msla) msly = msly + 10 * SIN(msla) COLOR 14 CIRCLE (mslx, msly), (2 / zm) IF ABS(mslx - mtrx) < 15 / zm AND ABS(msly - mtry) < 15 / zm THEN 700 IF mslx < -10 THEN msl = 0 IF msly < -10 THEN msl = 0 IF mslx > 650 THEN msl = 0 IF msly > 500 THEN msl = 0 RETURN 600 REM -------------- Meteor ----------------- IF mtr = 2 THEN mtr = 1: mtrx = 0: mtry = 0 COLOR 0 CIRCLE (mtrx, mtry), 10 / zm, 0, 0, 2 * pi, vm IF mtrx > cpx THEN mtrx = mtrx - mv / zm IF mtrx < cpx THEN mtrx = mtrx + mv / zm IF mtry > cpy THEN mtry = mtry - mv / zm IF mtry < cpy THEN mtry = mtry + mv / zm vm = vm + vmc IF vm >= 3 THEN vmc = -.1 IF vm <= .1 THEN vmc = .1 COLOR 15 CIRCLE (mtrx, mtry), 10 / zm, 7, 0, 2 * pi, vm IF ABS(mtrx - cpx) < 10 / zm AND ABS(mtry - cpy) < 10 / zm THEN GOSUB 800 RETURN 700 REM ---------------- HIT ---------------- COLOR 3 FOR d = 1 TO 30 CIRCLE (mtrx, mtry), d SOUND 9000 + 10 * d, .1 NEXT d COLOR 0 FOR d = 1 TO 30 CIRCLE (mtrx, mtry), d SOUND 9000 - 10 * d, .1 NEXT d mtr = 0: msl = 0: mslx = nx: msly = ny CLS : score = score + 1 IF score = 10 THEN ships = ships + 1: SOUND 5000, 1 IF score = 20 THEN ships = ships + 1: SOUND 6000, 1 IF score > hiscr THEN hiscr = score time = 100: mv = mv + .1 zm = zm - .1: IF zm < .5 THEN zm = 2.5 RETURN 800 REM -------- Collision ----------- SOUND 1000, .4 shield = shield - 1 IF shield <= 0 THEN GOSUB 1100 RETURN 900 REM ------------- UPDATE INFO ----------- COLOR 9: LINE (510, 0)-(510, 500) LOCATE 2, 67: PRINT "Score:"; score LOCATE 4, 67: PRINT "Time:"; INT(time) LOCATE 20, 67: PRINT "Shield" COLOR 0: LINE (550, 300)-(550, 200) COLOR 7: LOCATE 22, 67: PRINT "Ships: "; ships COLOR 2 IF shield < 50 THEN COLOR 14 IF shield < 25 THEN COLOR 4 LINE (550, 300)-(550, 300 - shield) LOCATE 6, 66 COLOR 8 IF x% < 1 THEN COLOR 15 PRINT "< "; COLOR 8 IF x% < 200 THEN COLOR 15 PRINT "< "; COLOR 8 IF x% > 200 AND x% < 300 THEN COLOR 15 PRINT "0 "; COLOR 8 IF x% > 300 THEN COLOR 15 PRINT "> "; COLOR 8 IF x% > 599 THEN COLOR 15 PRINT ">" RETURN 1000 REM -------------- OUT OF TIME ----------- IF ships = -1 THEN 1200 time = 100: shield = 100 msl = 0: mtr = 0 SOUND 10000, 1 FOR d = 1 TO 700 STEP 10 COLOR 7: CIRCLE (mtrx, mtry), d COLOR 0: CIRCLE (mtrx, mtry), d NEXT d CLS GOSUB 1100 RETURN 1100 REM -------------- SHIP EXPLODES ---------- ships = ships - 1 IF ships = -1 THEN 1200 time = 100: shield = 100 msl = 0: mtr = 0 x = 300: y = 200 COLOR 6 FOR d = 1 TO 60 CIRCLE (cpx, cpy), d SOUND 1000 + 5 * d, .07 NEXT d COLOR 7 FOR d = 1 TO 60 CIRCLE (cpx, cpy), d COLOR 8 NEXT d FOR d = 1 TO 60 CIRCLE (cpy, cpy), d NEXT d CLS RETURN 1200 REM ------- Title Screen -------- CLS 1205 a$ = INKEY$ c = INT(RND(1) * 10) + 1 LOCATE 10, 25 COLOR c PRINT "SPACE VIPER........v1.0" LOCATE 12, 25 COLOR c + 1 PRINT " By" LOCATE 14, 25 COLOR c + 2 PRINT " Dominick Aguilar " LOCATE 16, 25 COLOR c + 3 PRINT " 'h' for Instructions" LOCATE 18, 25 COLOR c + 4 PRINT " to PLAY " LOCATE 20, 25 COLOR c + 5 PRINT "HIGH SCORE.......... "; hiscr IF a$ = "h" THEN 1210 IF a$ = " " THEN 5 GOTO 1205 1210 CLS PRINT : PRINT COLOR 3 PRINT , " ---------------- SPACE VIPER v1.0 -----------------" PRINT , "FREEware Copy-it-Right November 17, 1996 freeWARE" COLOR 14 PRINT PRINT , "MOUSE: Click Right Button................Fire Missle" PRINT , " Hold Down Left Button.............Thruster" PRINT , " Left/Right........................Turn" PRINT , " Far Left/Far Right................Sharp Turn" PRINT : COLOR 15 PRINT , "Keyboard: ........................PAUSE GAME" PRINT , " 'Q'............................Quit Game" PRINT : COLOR 2 PRINT , " Contact Me: BCase10582@aol.com" PRINT : COLOR 6 PRINT , " Press ANY KEY to Continue" 1215 a$ = INKEY$ IF a$ = "" THEN 1215 GOTO 1200 1300 REM ------- PAUSE -------- a$ = INKEY$ c = INT(RND(1) * 15) + 1 COLOR c LOCATE 10, 25 PRINT "{GAME PAUSED}" IF a$ <> "" THEN LOCATE 10, 25: PRINT " ": RETURN GOTO 1300 1400 REM ---------- QUIT -------- LOCATE 10, 25 COLOR 15 PRINT " Quit Y/N ?" 1405 a$ = INKEY$ IF a$ = "n" THEN RETURN IF a$ = "y" THEN 1200 GOTO 1405 SUB MouseDriver (ax%, bx%, cx%, dx%) DEF SEG = VARSEG(Mouse$) Mouse% = SADD(Mouse$) CALL Absolute(ax%, bx%, cx%, dx%, Mouse%) END SUB SUB MouseHide ax% = 2 MouseDriver ax%, 0, 0, 0 END SUB FUNCTION mouseInit% ax% = 0 MouseDriver ax%, 0, 0, 0 mouseInit% = ax% END FUNCTION SUB MouseShow ax% = 1 MouseDriver ax%, 0, 0, 0 END SUB SUB MouseStatus (lb%, rb%, xMouse%, yMouse%) ax% = 3 MouseDriver ax%, bx%, cx%, dx% lb% = ((bx% AND 1) <> 0) rb% = ((bx% AND 2) <> 0) xMouse% = cx% yMouse% = dx% END SUB