'===========================================================================
' Subject: QBASIC SPACE INVADERS              Date: 12-16-98 (23:38)       
'  Author: mr whisper                         Code: QB, QBasic, PDS        
'  Origin: mrwhisper@odos.freeserve.co.uk   Packet: GAMES.ABC
'===========================================================================
'
'                 Q B a s i c   S p a c e  I n v a d e r s
'
'                       Copyright (C) mr whisper 1992
'    
'
' (1997 version with improved keyborad control (from ABC snippets)
' thanks to marky boy for getting them for me...)
'
' "o" and "p" for left and right (or "q" and "w"), space to fire......
'
'
' Flippin' Heck Tucker!! A QBASIC version of the fantastic arcade game
' Space Invaders...only 10p a go...if ye dinny ken how tae play this yin
' ye must be a dafty....
'
' To run this game, press Shift+F5.
'
' To exit QBasic, press Alt, F, X.
'

'Set default data type to integer for faster game play
DEFINT A-Z

'User-defined TYPEs

'Sub Declarations
DECLARE FUNCTION StillWantsToPlay ()

'Constants
CONST TRUE = -1

DECLARE SUB Delay (Value#)
DECLARE SUB CalculateDelay ()

DIM SHARED MilliDelay AS DOUBLE:       ' Delay value for 1 millisecond

CONST FALSE = NOT TRUE
CONST STARTOVER = 1             ' Parameters to 'Level' SUB
CONST SAMELEVEL = 2
CONST NEXTLEVEL = 3

'Graphix Variables

DIM SHARED Vader1&(63)
DIM SHARED Vader2&(63)
DIM SHARED Vader3&(63)
DIM SHARED Vader4&(63)
DIM SHARED Vader5&(63)
DIM SHARED Vader6&(63)
DIM SHARED Man&(63)
DIM SHARED Barrier&(100)
DIM SHARED Ufo1&(70)
DIM SHARED Ufo2&(70)
DIM SHARED Explosion&(60)
DIM SHARED Bullet1&(40)
DIM SHARED Bullet2&(40)
DIM SHARED Blank&(66)

DIM SHARED Bullets&(20, 3)
DIM SHARED Vaders&(100, 2)

'keyboard stuff - dont ask me
DIM KS(255), SC(255), DU(255)
FOR E = 0 TO 127      ' Setup key data table KSC()
SC(E) = E: DU(E) = 1
NEXT
FOR E = 128 TO 255
SC(E) = E - 128: DU(E) = 0
NEXT

'initialise delay
CALL CalculateDelay

'Do ra Bizzo

   RANDOMIZE TIMER
   GOSUB ClearKeyLocks
   GOSUB SetColors
   GOSUB getgraphics

'main gameplay loop
   stillplay = 1

   DO WHILE stillplay = 1

'intro
    GOSUB initvars
    GOSUB intro

    GOSUB setupscreen
    GOSUB govaders

    DO WHILE lives > 0
	 GOSUB playinvaders
	 IF deadind = 0 THEN
	   GOSUB setupscreen
	   GOSUB govaders
	 END IF
    LOOP
    
    IF StillWantsToPlay THEN
	 stillplay = 1
    ELSE
	 stillplay = 0
    END IF

   LOOP

   GOSUB RestoreKeyLocks
   COLOR 15, 0
   CLS

END

ClearKeyLocks:
    DEF SEG = 0                     ' Turn off CapLock, NumLock and ScrollLock
    KeyFlags = PEEK(1047)
    POKE 1047, &H0
    DEF SEG
    RETURN

RestoreKeyLocks:
    DEF SEG = 0                     ' Restore CapLock, NumLock and ScrollLock states
    POKE 1047, KeyFlags
    DEF SEG
    RETURN

SetColors:

    COLOR 0, 15
    SCREEN 7
'    SCREEN 12
    CLS

RETURN

initvars:

    deadind = 0
    vaderdead = 0
    lives = 3
    level = 1
    score = 0

RETURN

getgraphics:

' Draw Billet

   PSET (0, 0), 15
   PSET (1, 1), 15
   PSET (2, 2), 15
   PSET (1, 3), 15
   PSET (0, 4), 15
   PSET (1, 5), 15
   PSET (2, 6), 15
   PSET (1, 7), 15

   GET (0, 0)-(2, 7), Bullet1&

   CLS 0

   GET (0, 0)-(13, 11), Blank&

   ' Draw Billet

   LINE (1, 0)-(1, 7), 15
   PSET (0, 2), 15
   PSET (2, 2), 15
  
   GET (0, 0)-(2, 7), Bullet2&

   CLS 0

 
'Draw Vaders

   LINE (4, 0)-(6, 0), 15
   LINE (3, 1)-(7, 1), 15
   LINE (2, 2)-(8, 2), 15
   LINE (2, 3)-(8, 3), 15
   LINE (1, 4)-(9, 4), 15
   LINE (1, 5)-(9, 5), 15
   LINE (1, 6)-(9, 6), 15
   LINE (2, 7)-(8, 7), 15
   PSET (4, 3), 0
   PSET (6, 3), 0
   PSET (4, 5), 0
   PSET (5, 5), 0
   PSET (6, 5), 0
   PSET (2, 8), 15
   PSET (4, 8), 15
   PSET (5, 8), 15
   PSET (7, 8), 15
   PSET (1, 9), 15
   PSET (3, 9), 15
   PSET (6, 9), 15
   PSET (8, 9), 15
   PSET (0, 10), 15
   PSET (4, 10), 15
   PSET (5, 10), 15
   PSET (9, 10), 15

   GET (0, 0)-(9, 10), Vader1&

   LINE (0, 10)-(9, 10), 0

   PSET (2, 10), 15
   PSET (7, 10), 15

   GET (0, 0)-(9, 10), Vader2&
      
   CLS 0

   LINE (2, 0)-(3, 0), 15
   PSET (4, 1), 15
   PSET (7, 1), 15
   PSET (8, 0), 15
   PSET (9, 0), 15
   LINE (2, 2)-(9, 6), 15, BF
   LINE (0, 3)-(0, 5), 15
   PSET (1, 3), 15
   LINE (11, 3)-(11, 5), 15
   PSET (10, 3), 15
   PSET (4, 3), 0
   PSET (7, 3), 0

   PSET (3, 7), 15
   PSET (5, 7), 15
   PSET (6, 7), 15
   PSET (8, 7), 15
   PSET (2, 8), 15
   PSET (4, 8), 15
   PSET (7, 8), 15
   PSET (9, 8), 15
   PSET (1, 9), 15
   PSET (5, 9), 15
   PSET (6, 9), 15
   PSET (10, 9), 15

   GET (0, 0)-(11, 10), Vader3&

   LINE (0, 10)-(9, 10), 0
   LINE (0, 0)-(1, 8), 0, BF
   LINE (10, 0)-(11, 8), 0, BF

   LINE (0, 9)-(11, 9), 0
   PSET (3, 9), 15
   PSET (8, 9), 15
   LINE (0, 2)-(0, 4), 15
   LINE (11, 2)-(11, 4), 15
   PSET (1, 4), 15
   PSET (10, 4), 15

   
   GET (0, 0)-(11, 10), Vader4&
      
   CLS 0

   LINE (2, 1)-(9, 1), 15
   LINE (0, 2)-(11, 5), 15, BF
   LINE (2, 6)-(9, 6), 15, BF
   PSET (4, 3), 0
   PSET (7, 3), 0

   PSET (3, 7), 15
   PSET (5, 7), 15
   PSET (6, 7), 15
   PSET (8, 7), 15
   PSET (2, 8), 15
   PSET (4, 8), 15
   PSET (7, 8), 15
   PSET (9, 8), 15
   PSET (1, 9), 15
   PSET (5, 9), 15
   PSET (6, 9), 15
   PSET (10, 9), 15

   GET (0, 0)-(11, 9), Vader5&

   LINE (0, 9)-(11, 9), 0

   PSET (3, 9), 15
   PSET (8, 9), 15
   
   GET (0, 0)-(11, 9), Vader6&
      
   CLS 0

'Draw yerweeman

   LINE (0, 5)-(8, 9), 14, BF
   PSET (0, 5), 0
   PSET (1, 5), 0
   PSET (0, 6), 0
   PSET (8, 5), 0
   PSET (7, 5), 0
   PSET (8, 6), 0
'   PSET (3, 4), 14
   PSET (4, 4), 14
'   PSET (5, 4), 14
'   PSET (4, 3), 14
   PSET (2, 5), 0
   PSET (6, 5), 0

   GET (0, 0)-(8, 9), Man&

   CLS 0

'Draw UFO

   LINE (6, 0)-(11, 0), 2
   LINE (4, 1)-(13, 1), 2
   LINE (4, 2)-(13, 2), 2
   LINE (2, 3)-(15, 3), 2
   LINE (2, 4)-(15, 4), 2
   LINE (1, 5)-(16, 5), 2
   LINE (1, 6)-(16, 6), 2
   LINE (2, 7)-(15, 7), 2
   LINE (2, 8)-(15, 8), 2
   PSET (4, 9), 2
   PSET (5, 9), 2
   PSET (8, 9), 2
   PSET (9, 9), 2
   PSET (12, 9), 2
   PSET (13, 9), 2
   PSET (2, 5), 0
   PSET (4, 5), 0
   PSET (6, 5), 0
   PSET (8, 5), 0
   PSET (10, 5), 0
   PSET (12, 5), 0
   PSET (14, 5), 0
   PSET (2, 6), 0
   PSET (4, 6), 0
   PSET (6, 6), 0
   PSET (8, 6), 0
   PSET (10, 6), 0
   PSET (12, 6), 0
   PSET (14, 6), 0


   GET (0, 0)-(16, 9), Ufo1&

   LINE (2, 5)-(14, 6), 2, BF
   PSET (3, 5), 0
   PSET (5, 5), 0
   PSET (7, 5), 0
   PSET (9, 5), 0
   PSET (11, 5), 0
   PSET (13, 5), 0
   PSET (15, 5), 0
   PSET (3, 6), 0
   PSET (5, 6), 0
   PSET (7, 6), 0
   PSET (9, 6), 0
   PSET (11, 6), 0
   PSET (13, 6), 0
   PSET (15, 6), 0

   GET (0, 0)-(16, 9), Ufo2&

   CLS 0

'Draw xplode

   PSET (0, 0), 15
   PSET (1, 1), 15
   PSET (3, 3), 15
   PSET (3, 0), 15
   PSET (3, 1), 15
   PSET (5, 1), 15
   PSET (6, 1), 15
   PSET (0, 3), 15
   PSET (1, 3), 15
   PSET (4, 3), 15
   PSET (6, 3), 15
   PSET (3, 4), 15
   PSET (1, 5), 15
   PSET (3, 5), 15
   PSET (5, 5), 15
   PSET (0, 6), 15
   PSET (4, 6), 15

   GET (0, 0)-(6, 6), Explosion&

   CLS 0
 
'Draw Barrier

   LINE (0, 0)-(26, 15), 10, BF
   LINE (10, 13)-(16, 15), 0, BF
   
   PSET (0, 0), 0
   PSET (1, 0), 0
   PSET (0, 1), 0
   PSET (2, 0), 0
   PSET (1, 1), 0
   PSET (0, 2), 0

   PSET (26, 0), 0
   PSET (25, 0), 0
   PSET (24, 0), 0
   PSET (26, 1), 0
   PSET (25, 1), 0
   PSET (26, 2), 0

   GET (0, 0)-(26, 15), Barrier&

   CLS 0
   
RETURN

playinvaders:

  
   GOSUB resetscreen
   vadertog = vaderspeed - 1
   GOSUB movevaders

  DO UNTIL vaderno <= vaderdead OR deadind = 1

'   move$ = INKEY$

   GOSUB moveman
   IF laserongo THEN
       GOSUB killvaders
   END IF
   GOSUB moveufo
   GOSUB movevaders
   GOSUB vaderbullets
   GOSUB checkdead
   LOCATE 1, 7
   IF score > hiscore THEN
      hiscore = score
   END IF
   PRINT "LEVEL"; level; "  HI "; hiscore; "  SCORE 1UP"; score;
   IF explodey = 1 THEN
	LINE (xplode, yplode)-(xplode + xfactor, yplode + yfactor), 0, BF
	explodey = 0
   END IF

  LOOP

  CALL Delay(MilliDelay * 2000)

  IF deadind = 1 THEN
       lives = lives - 1
  ELSE
       level = level + 1
       vaderdead = 0
       score = score + (level * 10)
  END IF

  IF level = 5 THEN
      lives = lives + 1
  END IF
 
RETURN

resetscreen:

  CLS 0
  move$ = INKEY$
  move$ = INKEY$
  deadind = 0
  direction = 0
  xman = 10
  yman = 180

  IF lives > 1 THEN
       PUT (0, 0), Man&, OR
  END IF
  IF lives > 2 THEN
       PUT (15, 0), Man&, OR
  END IF
  IF lives > 3 THEN
       PUT (30, 0), Man&, OR
  END IF

  PUT (xman, yman), Man&, OR
  PUT (40, 160), Barrier&, OR
  PUT (115, 160), Barrier&, OR
  PUT (190, 160), Barrier&, OR
  PUT (265, 160), Barrier&, OR

  FOR setup = 1 TO 20
     Bullets&(setup, 0) = 0
     Bullets&(setup, 1) = 0
     Bullets&(setup, 2) = 0
     Bullets&(setup, 3) = 0
  NEXT setup

 
   LOCATE 1, 7
   PRINT "LEVEL"; level; "  HI "; hiscore; "  SCORE 1UP"; score;
 
RETURN

setupscreen:

  CLS 0
  move$ = INKEY$
  move$ = INKEY$
  deadind = 0
  direction = 0
  xman = 10
  yman = 180
  vaderspeed = 60 - (level * 2)
  vaderdead = 0
  vaderno = 60
  vaderfire = 140 - (level * 15)
  IF vaderfire < 10 THEN
       vaderfire = 10
  END IF

  IF lives > 1 THEN
       PUT (0, 0), Man&, OR
  END IF
  IF lives > 2 THEN
       PUT (15, 0), Man&, OR
  END IF
  IF lives > 3 THEN
       PUT (30, 0), Man&, OR
  END IF

  PUT (xman, yman), Man&, OR
  PUT (40, 160), Barrier&, OR
  PUT (115, 160), Barrier&, OR
  PUT (190, 160), Barrier&, OR
  PUT (265, 160), Barrier&, OR

  FOR crapname = 1 TO 20
     Bullets&(crapname, 0) = 0
     Bullets&(crapname, 1) = 0
     Bullets&(crapname, 2) = 0
     Bullets&(crapname, 3) = 0
  NEXT crapname
 
   LOCATE 1, 7
   PRINT "LEVEL"; level; "  HI "; hiscore; "  SCORE 1UP"; score;
 
RETURN


govaders:

   xvader = 84
   yvader = 8 + (level * 5)

   FOR doity = 1 TO 5

     yvader = yvader + 16
	  
     FOR doitx = 1 TO 12

       xvader = xvader + 16
       doit = doit + 1

       IF doit < 13 THEN
	    PUT (xvader, yvader), Vader1&, OR
       ELSEIF doit < 37 THEN
	    PUT (xvader, yvader), Vader3&, OR
       ELSE
	    PUT (xvader, yvader), Vader5&, OR
       END IF
       Vaders&(doit, 0) = xvader
       Vaders&(doit, 1) = yvader

     NEXT doitx

     xvader = 84

   NEXT doity
   doit = 0

RETURN

moveman:

    IF laserongo = 1 THEN
	 GOSUB movelaser
    END IF

    GOSUB getkeys
  
    IF KS(25) = 1 OR KS(17) = 1 THEN
	 PUT (xman, yman), Blank&, AND
	 xman = xman + 2
	 PUT (xman, yman), Man&, OR
    ELSEIF KS(24) = 1 OR KS(16) = 1 THEN
	 PUT (xman, yman), Blank&, AND
	 xman = xman - 2
	 IF xman < 2 THEN
	   xman = 2
	 END IF
	 PUT (xman, yman), Man&, OR
    END IF
    
    IF KS(57) = 1 AND laserongo = 0 THEN
	 GOSUB blastem
    END IF

    IF xman < 2 THEN
	  xman = 2
    ELSEIF xman > 305 THEN
	  xman = 305
    END IF
  
RETURN

blastem:

	 laserongo = 1
	 xlaser = xman + 5
	 ylaser = yman - 3
	 LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 14

RETURN


movelaser:

     LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 0
     ylaser = ylaser - 4
     barriercheck = POINT(xlaser, ylaser)
     IF barriercheck = 10 THEN
	   PSET (xlaser, ylaser - 2), 0
	   blankx = (RND * 3)
	   blanky = (RND * 3)
	   PSET (xlaser + blankx, ylaser - blanky), 0
	   blankx = (RND * 3)
	   blanky = (RND * 3)
	   PSET (xlaser - blankx, ylaser - blanky), 0
	   blankx = (RND * 3)
	   blanky = (RND * 3)
	   PSET (xlaser + blankx, ylaser - blanky), 0
	   PSET (xlaser - blankx, ylaser - blanky), 0
	   blankx = (RND * 3)
	   blanky = (RND * 3)
	   PSET (xlaser - blankx, ylaser - blanky), 0
	   blankx = (RND * 3)
	   blanky = (RND * 3)
	   PSET (xlaser + blankx, ylaser - blanky), 0
	   
	   laserongo = 0
     ELSE
	   LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 14
     END IF
     IF ylaser < 6 THEN
	  LINE (xlaser, ylaser)-(xlaser, ylaser - 3), 0
	  laserongo = 0
     END IF

RETURN

moveufo:

    IF ufoongo = 1 THEN
	IF xlaser >= xufo AND xlaser <= xufo + 16 AND ylaser >= yufo AND ylaser <= yufo + 9 THEN
	     LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF
	     PUT (xufo, yufo), Explosion&, OR
	     score = score + ufoscore
	     ufoongo = 0
	     laserongo = 0
	     explodey = 1
	     xplode = xufo
	     yplode = yufo
	     xfaxtor = 16
	     yfactor = 9
	END IF
	IF ufotog > ufospeed THEN
	   LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF
	  xufo = xufo - ufomove
	  IF ufokoff = 1 THEN
	      PUT (xufo, yufo), Ufo1&, OR
	      ufokoff = 0
	  ELSE
	      PUT (xufo, yufo), Ufo2&, OR
	      ufokoff = 1
	  END IF
	  IF xufo < 5 OR xufo > 300 THEN
		 ufoongo = 0
		 LINE (xufo, yufo)-(xufo + 16, yufo + 9), 0, BF
	  END IF
	  ufotog = 0
	ELSE
	  ufotog = ufotog + 1
	END IF
    ELSE
	ufogo = (RND * 1000)
	IF ufogo = 69 THEN
	      ufoongo = 1
	      ufospeed = 3 + (RND * 10)
	      ufoscore = 10 * (RND * 7)
	      coin = (RND * 2)
	      IF coin = 1 THEN
		   ufomove = -2
		   xufo = 5
		   yufo = 10
	      ELSE
		   ufomove = 2
		   xufo = 300
		   yufo = 10
	      END IF
	END IF
    END IF

RETURN


killvaders:

   FOR checkdead = 0 TO 72

	IF Vaders&(checkdead, 0) > 0 THEN
	    xvader = Vaders&(checkdead, 0)
	    yvader = Vaders&(checkdead, 1)
	       IF (xlaser >= xvader AND xlaser <= xvader + 10) AND (ylaser >= yvader AND ylaser < yvader + 8) THEN
		    LINE (xvader, yvader)-(xvader + 11, yvader + 10), 0, BF
		    PUT (xvader + 1, yvader + 1), Explosion&, OR
		    explodey = 1
		    xplode = xvader
		    yplode = yvader
		    xfactor = 9
		    yfactor = 10
		    laserongo = 0
		    LINE (xlaser, ylaser)-(xlaser, ylaser - 4), 0
		    Vaders&(checkdead, 0) = 0
		    Vaders&(checkdead, 1) = 0
		    vaderdead = vaderdead + 1
		    score = score + 10
		    IF vaderspeed > 1 THEN
			vaderspeed = vaderspeed - 1
		    END IF
		    IF vaderfire > 4 THEN
			vaderfire = vaderfire - 1
		    END IF
	      END IF
	END IF

    NEXT checkdead

RETURN

     
movevaders:

' move all living vaders..

    lowestvade = 0
    dropvaders = 0
    vadertog = vadertog + 1
    IF vadertog > vaderspeed THEN

     FOR boogie = 0 TO 72
	    IF Vaders&(boogie, 0) < 10 AND Vaders&(boogie, 0) > 0 AND vaderdirection = 0 THEN
		  dropvaders = 1
		  vaderdirection = 1
	    ELSEIF Vaders&(boogie, 0) > 280 AND vaderdirection = 1 THEN
		  dropvaders = 1
		  vaderdirection = 0
	    END IF
	    IF Vaders&(boogie, 1) > lowestvade THEN
		 lowestvade = Vaders&(boogie, 1)
	    END IF
     NEXT boogie
		  
     FOR movevade = 0 TO 72

	  xvader = Vaders&(movevade, 0)
	  yvader = Vaders&(movevade, 1)
	  IF xvader > 0 AND yvader > 0 THEN
	    PUT (xvader, yvader), Blank&, AND
	    IF dropvaders = 1 THEN
		 yvader = yvader + 8
	    ELSEIF vaderdirection = 0 THEN
		     xvader = xvader - 4
	    ELSEIF vaderdirection = 1 THEN
		     xvader = xvader + 4
	    END IF
	    IF yvader > 180 THEN
		deadind = 1
	    END IF
	    IF Vaders&(movevade, 2) = 1 THEN
		  IF movevade < 13 THEN
		       PUT (xvader, yvader), Vader1&, OR
		       Vaders&(movevade, 2) = 0
		  ELSEIF movevade < 37 THEN
		       PUT (xvader, yvader), Vader3&, OR
		       Vaders&(movevade, 2) = 0
		  ELSE
		       PUT (xvader, yvader), Vader5&, OR
		       Vaders&(movevade, 2) = 0
		  END IF
	    ELSE
		  IF movevade < 13 THEN
		       PUT (xvader, yvader), Vader2&, OR
		       Vaders&(movevade, 2) = 1
		  ELSEIF movevade < 37 THEN
		       PUT (xvader, yvader), Vader4&, OR
		       Vaders&(movevade, 2) = 1
		  ELSE
		       PUT (xvader, yvader), Vader6&, OR
		       Vaders&(movevade, 2) = 1
		  END IF
	    END IF
	    Vaders&(movevade, 1) = yvader
	    Vaders&(movevade, 0) = xvader
	    IF yvader >= lowestvade - 17 THEN
		 GOSUB firevader
	    END IF
	  END IF
   
     NEXT movevade

     vadertog = 0
    ELSE
' if we aren't moving the invaders, do a wee delay thingy
    CALL Delay(MilliDelay * 10)

    END IF

RETURN


firevader:

    bullgo = 1
    mibby = (RND * vaderfire)
    IF mibby = 5 THEN
	DO UNTIL Bullets&(bullgo, 0) = 0 OR bullgo > 19
	     bullgo = bullgo + 1
	LOOP
	IF bullgo < 20 THEN
	     Bullets&(bullgo, 0) = xvader + 4
	     Bullets&(bullgo, 1) = yvader + 8
	     Bullets&(bullgo, 2) = 10 + (RND * 20) - (level * 3)
	     Bullets&(bullgo, 3) = 0
	END IF
    END IF

RETURN

vaderbullets:

    FOR ploppy = 1 TO 20
	  xbullet = Bullets&(ploppy, 0)
	  ybullet = Bullets&(ploppy, 1)
	  thisbullspeed = Bullets&(ploppy, 2)
	  thisbulltog = Bullets&(ploppy, 3)
	  IF xbullet > 0 THEN
	       
	    IF thisbulltog > thisbullspeed THEN

	      LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 6), 0, BF
	      ybullet = ybullet + 4
	      IF thisbullspeed < 20 THEN
		   PUT (xbullet, ybullet), Bullet1&, OR
	      ELSE
		   PUT (xbullet, ybullet), Bullet2&, OR
	      END IF
	      IF xbullet + 2 >= xman AND xbullet <= xman + 8 AND ybullet + 8 >= yman THEN
		    deadind = 1
	      ELSEIF ybullet > 188 THEN
		   LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 7), 0, BF
		   xbullet = 0
		   ybullet = 0
	      ELSEIF POINT(xbullet + 1, ybullet + 9) = 10 THEN
		   PSET (xbullet, ybullet), 0
		   blankx = (RND * 3)
		   blanky = (RND * 3)
		   PSET (xbullet + blankx, ybullet + 9 + blanky), 0
		   blankx = (RND * 3)
		   blanky = (RND * 3)
		   PSET (xbullet - blankx, (ybullet + 9) - blanky), 0
		   blankx = (RND * 3)
		   blanky = (RND * 3)
		   PSET (xbullet + blankx, ybullet + 9 + blanky), 0
		   PSET (xbullet - blankx, ybullet + 9 + blanky), 0
		   blankx = (RND * 3)
		   blanky = (RND * 3)
		   PSET (xbullet - blankx, (ybullet + 9) - blanky), 0
		   blankx = (RND * 3)
		   blanky = (RND * 3)
		   PSET (xbullet + blankx, ybullet + 9 + blanky), 0
		   LINE (xbullet, ybullet)-(xbullet + 3, ybullet + 9), 0, BF
		   xbullet = 0
		   ybullet = 0
	      END IF
	      Bullets&(ploppy, 0) = xbullet
	      Bullets&(ploppy, 1) = ybullet
	      Bullets&(ploppy, 3) = 0
	   ELSE
	      Bullets&(ploppy, 3) = thisbulltog + 1
	      IF xbullet + 2 >= xman AND xbullet <= xman + 8 AND ybullet + 8 >= yman THEN
		    deadind = 1
	      END IF
	   END IF
	 END IF
    NEXT ploppy

RETURN


checkdead:

    IF deadind = 1 THEN
       FOR x = 1 TO 30
	    CALL Delay(MilliDelay)
	    LINE (xman, yman + 8)-(xman + 9, yman + 8), 14
	    FOR z = 1 TO 10
		 PSET (xman + xrandy1, yman + yrandy1), 0
		 PSET (xman + xrandy2, yman + yrandy2), 0
		 PSET (xman + xrandy3, yman + yrandy3), 0
		 PSET (xman + xrandy4, yman + yrandy4), 0
		 xrandy1 = (RND * 9)
		 yrandy1 = (RND * 8)
		 xrandy2 = (RND * 9)
		 yrandy2 = (RND * 8)
		 xrandy3 = (RND * 9)
		 yrandy3 = (RND * 8)
		 xrandy4 = (RND * 9)
		 yrandy5 = (RND * 8)
		 PSET (xman + xrandy1, yman + yrandy1), 14
		 PSET (xman + xrandy2, yman + yrandy2), 14
		 PSET (xman + xrandy3, yman + yrandy3), 14
		 PSET (xman + xrandy4, yman + yrandy4), 14
	    NEXT z
	    CALL Delay(MilliDelay * 100)
       NEXT x
    END IF

RETURN

getkeys:
 I$ = INKEY$       ' So the keyb buffer doesn't get full
 I = INP(&H60)     ' Get keyboard scan code from port 60h
 OUT &H61, INP(&H61) OR &H82: OUT &H20, &H20       '
 KS(SC(I)) = DU(I) ' This says what keys are pressed

RETURN

intro:

   GOSUB setupscreen
   GOSUB govaders
   throw$ = INKEY$
   throw$ = INKEY$
   LOCATE 8, 10
   PRINT " PRESS ANY KEY TO START ";

   DO UNTIL throw$ <> ""

   throw$ = INKEY$


   LOOP

RETURN

SUB CalculateDelay
   Test# = 5000     ' Test variable to pass number to Subrountine
   StartTimer# = TIMER
   CALL Delay(Test#)
   StopTimer# = TIMER
   Difference# = StopTimer# - StartTimer#
   SecondDelay# = Test# / Difference#
   MilliDelay = SecondDelay# / 1000
END SUB

SUB Delay (Value#)
  FOR A# = 1 TO Value#
  NEXT A#
END SUB

'StillWantsToPlay:
'  Determines if users want to play game again.
FUNCTION StillWantsToPlay

    LOCATE 6, 12
    PRINT "G A M E   O V E R"
    LOCATE 8, 11
    PRINT "Play Again?   (Y/N)"
 
    WHILE INKEY$ <> "": WEND
    DO
	kbd$ = UCASE$(INKEY$)
    LOOP UNTIL kbd$ = "Y" OR kbd$ = "N"

    IF kbd$ = "Y" THEN
	StillWantsToPlay = TRUE
    ELSE
	StillWantsToPlay = FALSE
    END IF

END FUNCTION
