'===========================================================================
' 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 "    <SPACE> 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: <SPACE>........................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
