'****************
'* ------------ *
'* STAR BLASTER *
'* ------------ *
'*      BY      *
'*              *
'*  PAUL HILTS  *
'*              *
'* DATE:6/19/88 *
'*              *
'****************

START:
GOSUB INTRO
CLS

'* DRAW SPACESHIP *

LINE(109,74)-(211,126),3,B
LINE(0,0)-(109,74),3
LINE(319,0)-(211,74),3
LINE(0,199)-(109,126),3
LINE(319,199)-(211,126),3
LINE(134,147)-(185,198),3,B
LOCATE 13,28:PRINT"SCORE:"
LOCATE 18,18:PRINT"RADAR:"
LOCATE 12,1:PRINT"TIME LEFT:"
LOCATE 14,1:PRINT"SHIPS LEFT:"

'* INITIALIZE VARIABLES *

DEFINT A-Z
RANDOMIZE VAL(RIGHT$(TIME$,2))
SHIPX=500:SHIPY=500
SCORE=0
TIME=10000
SHIPS=3
STARTZ=1000
NUMAL=5
DIM ALX(NUMAL),ALY(NUMAL),ALZ(NUMAL),ALSHT(NUMAL),ALDONE(NUMAL),MISX(NUMAL),MISY(NUMAL),MISZ(NUMAL),MISFIRE(NUMAL),STX(10),STY(10)

FOR I=1 TO 10:STX(I)=500*RND:STY(I)=250*RND:NEXT I
FOR I=1 TO NUMAL:ALDONE(I)=1:NEXT I

'* MAIN LOOP *

MAINLOOP:

TIME=TIME-25
IF TIME<0 THEN GOTO GAMEEND
S$="":IF TIME<1000 THEN S$=" "
LOCATE 12,11:PRINT STR$(INT(TIME/100))+S$
LOCATE 14,12:PRINT STR$(SHIPS)
LOCATE 13,34:PRINT STR$(SCORE)

FOR I=1 TO 16
IK$=INKEY$
IF IK$=CHR$(27) THEN GOSUB ESC
IF IK$=CHR$(32) THEN SHT$="1"
M$=RIGHT$(IK$,1)
IF M$="H" THEN U$="1"
IF M$="K" THEN L$="1"
IF M$="M" THEN R$="1"
IF M$="P" THEN D$="1"
NEXT I

IF SHT$="1" THEN GOSUB SHOOT
IF U$="1" THEN GOSUB UP
IF L$="1" THEN GOSUB LEFT
IF R$="1" THEN GOSUB RIGHT
IF D$="1" THEN GOSUB DOWN
GOTO ALIENS

UP:
U$=""
IF SHIPY-50<0 THEN RETURN
SHIPY=SHIPY-50
FOR I=1 TO 10
STY(I)=STY(I)+10
IF STY(I)>250 THEN STY(I)=5
NEXT I
RETURN

LEFT:
L$=""
IF SHIPX-50<0 THEN RETURN
SHIPX=SHIPX-50
FOR I=1 TO 10
STX(I)=STX(I)+10
IF STX(I)>500 THEN STX(I)=5
NEXT I
RETURN

RIGHT:
R$=""
IF SHIPX+50>1000 THEN RETURN
SHIPX=SHIPX+50
FOR I=1 TO 10
STX(I)=STX(I)-10
IF STX(I)<0 THEN STX(I)=495
NEXT I
RETURN

DOWN:
D$=""
IF SHIPY+50>1000 THEN RETURN
SHIPY=SHIPY+50
FOR I=1 TO 10
STY(I)=STY(I)-10
IF STY(I)<0 THEN STY(I)=245
NEXT I
RETURN

SHOOT:
SHT$=""
VIEW(110,75)-(210,125),,3
WINDOW SCREEN(0,0)-(500,250)
FOR I=0 TO 125 STEP+10
PSET(I*2,I),2
PSET(I*2,250-I),2
PSET(500-I*2,I),2
PSET(500-I*2,250-I),2
SOUND I*2+50,.1
NEXT I
FOR I=1 TO NUMAL
IF ABS(SHIPX-ALX(I))<(STARTZ-ALZ(I))/10 AND ABS(SHIPY-ALY(I))<(STARTZ-ALZ(I))/10 THEN GOSUB ALIENHIT
NEXT I
RETURN

ALIENS:

'* CHECK FOR DESTROYED ALIENS *

FOR I=1 TO NUMAL
IF ALDONE(I)=1 AND TIME/100=INT(TIME/100) THEN GOSUB NEWALIEN
NEXT I

'* MOVE ALIENS *

FOR I=1 TO NUMAL:IF ALDONE(I)=1 THEN GOTO ENDALIENS
IF TIME/50=INT(TIME/50) THEN GOTO MOVEX ELSE GOTO MOVERAND

MOVEX:
SIGN1=1:IF MISFIRE(I)=1 THEN SIGN1=-1
SIGN2=1:IF I/2=INT(I/2) THEN SIGN2=-1
X=SGN(SHIPX+(100*SIGN2)-ALX(I))*SIGN1*20
IF NOT(ALX(I)+X<0 OR ALX(I)+X>1000) THEN ALX(I)=ALX(I)+X
MOVEY:
Y=SGN(SHIPY+(50*SIGN2)-ALY(I))*SIGN1*20
IF NOT(ALY(I)+Y<0 OR ALY(I)+Y>1000) THEN ALY(I)=ALY(I)+Y
MOVEZ:
ALZ(I)=ALZ(I)-10*RND:IF ALZ(I)<400 THEN ALDONE(I)=1
GOTO ALFIRE

MOVERAND:
X=30-(60*RND)
IF NOT(ALX(I)+X<0 OR ALX(I)+X>1000) THEN ALX(I)=ALX(I)+X
Y=30-(60*RND)
IF NOT(ALY(I)+Y<0 OR ALY(I)+Y>1000) THEN ALY(I)=ALY(I)+Y
GOTO MOVEZ

'* ALIENS FIRE *

ALFIRE:
IF ABS(SHIPX-ALX(I))<250 AND ABS(SHIPY-ALY(I))<125 AND ALZ(I)<850 AND MISFIRE(I)=0 THEN GOSUB FIREMISSLE

ENDALIENS:
NEXT I

'* MOVE AND CHECK MISSILES *

FOR I=1 TO NUMAL
IF MISFIRE(I)=1 THEN MISZ(I)=MISZ(I)-40
IF MISFIRE(I)=1 AND ABS(SHIPX-MISX(I))<250 AND ABS(SHIPY-MISY(I))<125 AND MISZ(I)<100 THEN GOSUB SHIPHIT
IF MISZ(I)<100 THEN MISFIRE(I)=0
NEXT I

GOTO DRAWSCREEN

DRAWSCREEN:
VIEW(110,75)-(210,125),,3
CLS
WINDOW SCREEN(0,0)-(500,250)

'* DRAW STARS AND SIGHT *

FOR I=1 TO 10:PSET(STX(I),STY(I)),3:NEXT
LINE(220,125)-(280,125),3:LINE(250,95)-(250,155),3

'* DRAW ALIENS *

WINDOW SCREEN(SHIPX-249,SHIPY-124)-(SHIPX+250,SHIPY+125)
FOR I=1 TO NUMAL
IF ALDONE(I)=1 THEN GOTO ENDDRAW
Z=(STARTZ-ALZ(I))/5
CIRCLE(ALX(I),ALY(I)),Z/2,2
IF MISFIRE(I)=0 THEN CIRCLE(ALX(I),ALY(I)),Z/4,3
LINE(ALX(I)-Z,ALY(I))-(ALX(I),ALY(I)-Z/2),1
LINE(ALX(I)-Z,ALY(I))-(ALX(I),ALY(I)+Z/2),1
LINE(ALX(I)+Z,ALY(I))-(ALX(I),ALY(I)-Z/2),1
LINE(ALX(I)+Z,ALY(I))-(ALX(I),ALY(I)+Z/2),1
ENDDRAW:
IF MISFIRE(I)=1 THEN CIRCLE(MISX(I),MISY(I)),(STARTZ-MISZ(I))/10,3
NEXT I

'* DRAW RADAR *

VIEW(135,148)-(184,197),,3
CLS
WINDOW SCREEN(0,0)-(1000,1000)
CIRCLE(SHIPX,SHIPY),50,3:PAINT(SHIPX,SHIPY),3,3
FOR I=1 TO NUMAL
IF ALDONE(I)=0 THEN CIRCLE(ALX(I),ALY(I)),(STARTZ-ALZ(I))/15,1:PAINT(ALX(I),ALY(I)),1,1
IF MISFIRE(I)=1 THEN CIRCLE(MISX(I),MISY(I)),(STARTZ-ALZ(I))/15,2:PAINT(MISX(I),MISY(I)),2,2
NEXT I

GOTO MAINLOOP

NEWALIEN:
ALZ(I)=STARTZ:ALX(I)=1000*RND:ALY(I)=1000*RND:ALDONE(I)=0
RETURN

ALIENHIT:
ALDONE(I)=1
VIEW(110,75)-(210,125),,3
WINDOW SCREEN(SHIPX-249,SHIPY-124)-(SHIPX+250,SHIPY+125)
FOR J=0 TO (STARTZ-ALZ(I))/5 STEP+20
X=ALX(I):Y=ALY(I)
IF J/40=INT(J/40) THEN C=2 ELSE C=3
PSET(X,Y-J),C
PSET(X+J,Y-J),C
PSET(X+J,Y),C
PSET(X+J,Y+J),C
PSET(X,Y+J),C
PSET(X-J,Y+J),C
PSET(X-J,Y),C
PSET(X-J,Y-J),C
SOUND J+200,.8
NEXT
SCORE=SCORE+INT((ALZ(I)-300)/10)*10
RETURN

FIREMISSLE:
MISFIRE(I)=1
MISX(I)=ALX(I):MISY(I)=ALY(I):MISZ(I)=ALZ(I)
SOUND 50,2
RETURN

SHIPHIT:
VIEW(0,0)-(319,199)
WINDOW SCREEN(0,0)-(319,199)
FOR J=1 TO 10
C=2:IF J/2=INT(J/2) THEN C=3
LINE(109,74)-(211,126),C,B
LINE(134,147)-(185,198),C,B
LINE(0,0)-(109,74),C
LINE(319,0)-(211,74),C
LINE(0,199)-(109,126),C
LINE(319,199)-(211,126),C
IF C=2 THEN SOUND 80,.8
NEXT
SHIPS=SHIPS-1:IF SHIPS=-1 THEN GOTO GAMEEND
RETURN

ESC:
IK$=INKEY$
IF IK$=CHR$(27) THEN RETURN ELSE GOTO ESC

INTRO:
SCREEN 1
COLOR 0,0
CLS
LOCATE 10,12:PRINT"* STAR  BLASTER *"
LOCATE 14,14:PRINT"BY PAUL HILTS"
LOCATE 20,11:PRINT"INSTRUCTIONS (Y/N)"
INKYBD:
IK$=INKEY$
IF IK$="N" OR IK$="n" THEN RETURN
IF IK$="Y" OR IK$="y" THEN GOTO INSTRUCTIONS
GOTO INKYBD

INSTRUCTIONS:
CLS
PRINT"YOUR OBJECTIVE: TO DESTROY AS MANY"
PRINT"                ALIEN SHIPS AS POSSIBLE"
PRINT
PRINT"FIGHTER"
PRINT"CONTROLS: <SPACE BAR> FIRES LASERS"
PRINT"          <ARROW KEYS> MOVE SHIP"
PRINT
PRINT"ON-BOARD"
PRINT"COMPUTER: USE RADAR TO TRACK TARGETS"
PRINT
PRINT"          YELLOW DOT: YOUR FIGHTER"
PRINT"          GREEN DOTS: ALIEN SHIPS"
PRINT"          RED DOTS: ENEMY MISSILES"
PRINT
PRINT"TO PAUSE GAME: PRESS <ESC>"
PRINT
PRINT
PRINT"ALIEN SHIP:
PRINT
PRINT"HIT INSIDE RED            YELLOW CIRCLE"
PRINT"CIRCLE TO DESTROY        IS ITS MISSILE"
PRINT
PRINT"** PRESS ANY KEY TO BEGIN GAME **"
CIRCLE(160,146),20,2:CIRCLE(160,146),10,3
LINE(160,126)-(120,146),1:LINE(160,126)-(200,146),1
LINE(160,166)-(120,146),1:LINE(160,166)-(200,146),1
KBD:
IF INKEY$="" THEN GOTO KBD ELSE RETURN

GAMEEND:
IF TIME<0 THEN GOTO TIMEUP
FOR J=1 TO 16
C=2:IF J/2=INT(J/2) THEN C=0
VIEW(110,75)-(210,125),C,3
SOUND (C+1)*200,2
NEXT J
LOCATE 12,17:PRINT"ALL SHIPS"
LOCATE 14,17:PRINT"DESTROYED"
GOTO ENDING

TIMEUP:
VIEW(110,75)-(210,125),0,3
LOCATE 13,17:PRINT"TIME'S UP"
GOTO ENDING

ENDING:
FOR J=1 TO 40
SOUND J*50,1
NEXT J
VIEW(0,0)-(319,199)
WINDOW SCREEN(0,0)-(319,199)
FOR I=0 TO 160
LINE(160-I,100-I)-(159+I,100+I),2,B
LINE(161-I,101-I)-(158+I,99+I),0,B
IF I>100 THEN LINE(160-I,0)-(159+I,0),2:LINE(160-I,199)-(159+I,199),2
SOUND 50,.3
NEXT I
LOCATE 12,2:PRINT"YOUR SCORE: ";SCORE
LOCATE 14,2:PRINT"PLAY AGAIN (Y/N): "
KYBD:
IK$=INKEY$
IF IK$="N" OR IK$="n" THEN END
IF IK$="Y" OR IK$="y" THEN CLEAR:GOTO START
GOTO KYBD
