REM Adds multiple bullets
(5) max.
REM Adds firing delay
and ship turns red
while reloading.
REM Adds
3 progressive levels.
REM Adds aliens move all the way
to both sides.
REM Adds Aliens shoot back.
REM Adds alien bullets finish before moving
on to next level.
DECLARE SUB alienattack
(ialiencolstat
, ialiencol
) DECLARE SUB checkcollision
(ihitaliens
, ialiencol
, i4
, i
) DECLARE SUB marchdown
(ialiencol
, ialiencolstat
, imotion
, iresults
) DECLARE SUB movealiens
(ialiencol
, ialiencolstat
, iresults
) DECLARE SUB reprintaliens
(ialiencol
, ihitaliens
, iresults
, i4
, i
, imothership
)
DIM SHARED lmargin%
, rmargin%
, topmargin%
, screenwidth%
, level
, ibk
, ileadingrow
DIM SHARED irow
, icol
, inextrnd
, imaxalienmissiles
, alienforce%
, ileadingmax
, imaxalienforce
, ihits
imaxalienforce = 6
imaxalienmissiles = 3
lmargin% = 2
rmargin% = 79
topmargin% = 3
ialiencolstat = 6
iwin = 3
screenwidth% = rmargin% - lmargin% + 1
ibk = 1
a1$
= "-<" + CHR$(237) + ">- "a$ = a1$ + a1$ + a1$ + a1$ + a1$ + a1$ + a1$ + a1$ + a1$ + a1$
REDIM SHARED bullet%
(5), bulletcol%
(5), bulletdelay%
(5), iltalien
(imaxalienforce
) REDIM SHARED ia
(imaxalienmissiles
), iy
(imaxalienmissiles
), ix
(imaxalienmissiles
) alienforce% = imaxalienforce
level = .65
iround = iround + 1
level = level - iround / 15
inextrnd = -1
ialiencol = ialiencolstat
FOR i
= 1 TO imaxalienforce
IF i
= imaxalienforce
THEN ileadingrow
= CSRLIN: ileadingmax
= ileadingrow
a(i) = a$
ex%
= 1:
CALL mdriver
(ex%
, key$
, tankx%
) IF topmargin%
+ ileadingmax
- (imaxalienforce
* 2) >= topmargin%
+ 2 THEN CALL movealiens
(ialiencol
, ialiencolstat
, iresults
)
icolor = 7: reload = 0
CASE -1: bullet%
(i
) = tanky%
- 1: bulletcol%
(i
) = tankx%
IF bulletdelay%
(i
) = -1 OR bullet%
(i
) = tanky%
- 1 THEN CALL checkcollision
(ihitaliens
, ialiencol
, i4
, i
) z2bullet
= TIMER: bulletdelay%
(i
) = 0 LOCATE bullet%
(i
), bulletcol%
(i
) IF bullet%
(i
) = topmargin%
AND imothership
<> 0 THEN imothership = 0
IF ihitaliens
<> 0 THEN CALL reprintaliens
(ialiencol
, ihitaliens
, iresults
, i4
, i
, imothership
) IF bullet%
(i
) > topmargin%
THEN bullet%(i) = bullet%(i) - 1
IF z1
< z2bullet
THEN z2bullet
= z2bullet
- 86400 IF bullet%
(i2
) <> 0 THEN bulletdelay%
(i2
) = -1 IF alienforce%
= 0 OR iresults
= iwin
THEN FOR i
= 1 TO imaxalienmissiles
IF i
> imaxalienmissiles
THEN iwait
= -1 iwait = 1
ex%
= -1:
CALL mdriver
(ex%
, key$
, tankx%
) inextrnd = -1
erasebullet:
bullet%(i) = 0: bulletcol%(i) = 0: bulletdelay%(i) = 0
redraw:
DATA "Well, I better get busy and finish the compiler..." DATA "Or... I'll just do some more work on this IDE, instead..." DATA "Game Over. Thanks for playing..." DATA "Now finish the compiler!"
SUB alienattack
(ialiencolstat
, ialiencol
)
FOR i
= 1 TO imaxalienmissiles
i4
= INSTR(i3
* 7 + 1, a
(i2
), CHR$(237)) + ialiencol
ia(i) = (ileadingmax - (imaxalienforce - i2) * 2) * 80 + i4
SUB alienmissile
(iresults
) FOR i
= 1 TO imaxalienmissiles
iy
(i
) = ia
(i
) \
80: ix
(i
) = ia
(i
) MOD 80 IF ix
(i
) = 0 THEN ix
(i
) = screenwidth%
ia(i) = 0
ia(i) = 0
iy(i) = iy(i) + 1
SUB checkcollision
(ihitaliens
, ialiencol
, i4
, i
) ihitaliens = 0
i4 = imaxalienforce - (ileadingmax - bullet%(i)) \ 2
IF bullet%
(i
) <= ileadingrow
AND i4
> 0 AND i4
<= imaxalienforce
THEN ihitaliens = bulletcol%(i) - ialiencol + 1
i3
= ihitaliens
- 7 + 1:
IF i3
< 1 THEN i3
= 1:
REM count from the
"<" symbol.
i2
= INSTR(i3
+ 1, a
(i4
), "<") - 1 MID$(matrix
(i4
), (i2
+ 1) \
7 + 1, 1) = "0"
FOR i2
= 1 TO imaxalienmissiles
IF iy
(i2
) >= bullet%
(i
) AND ix
(i2
) = bulletcol%
(i
) THEN ihitaliens = -i2
'in$ = "EOF"
SUB marchdown
(ialiencol
, ialiencolstat
, imotion
, iresults
) ileadingrow = ileadingrow + 1
ileadingmax = ileadingmax + 1
FOR i
= 1 TO imaxalienforce
ialiencol = ialiencolstat + imotion
LOCATE ileadingmax
- (imaxalienforce
* 2) + i
* 2 - 1, lmargin%
level = level - .025
IF ileadingrow
= 22 THEN iresults
= -2
SUB mdriver
(ex%
, key$
, tankx%
)
Registers.AX
= 0:
GOSUB CALLI
MOUSEACT% = 1
Registers.AX = 4: Registers.DX = 184: Registers.CX = 304
Registers.AX = 8: Registers.DX = 184: Registers.CX = 184
Registers.AX
= 3:
GOSUB CALLI
DX = Registers.DX
CX = Registers.CX
y% = DX \ 8 + 1: x% = CX \ 8 + 1
RB%
= (Registers.BX
AND 2) \
2MB%
= (Registers.BX
AND 4) \
4
CALLI:
SUB movealiens
(ialiencol
, ialiencolstat
, iresults
) STATIC imotion
, imarch
, imotiondir
IF inextrnd
= -1 THEN inextrnd
= 0: imotion
= 0: imarch
= 0: imotiondir
= 0 IF imotiondir
= 0 THEN imotion
= imotion
- 1 ELSE imotion
= imotion
+ 1
i2 = i2 + 2
ialiencol = ialiencolstat + imotion
LOCATE ileadingmax
- (imaxalienforce
- i
) * 2, ialiencol
+ INSTR(a
(i
), "-")
IF imarch
= 1 THEN imotiondir
= 1:
CALL marchdown
(ialiencol
, ialiencolstat
, imotion
, iresults
) IF imarch
= -1 THEN imotiondir
= 0:
CALL marchdown
(ialiencol
, ialiencolstat
, imotion
, iresults
) firerate
= (INT(RND * 10) + 1) / 20 IF iwait
= 0 THEN CALL alienattack
(ialiencolstat
, ialiencol
) imarch = 0
STATIC x%
, mov%
, z4
, mothership$
imothership = 1
x% = lmargin%
mov% = 1
''IF ABS(TIMER - z2) > .2 THEN GOSUB bullets: z2 = TIMER
mothership:
IF x%
+ LEN(mothership$
) = screenwidth%
+ lmargin%
THEN mov%
= -1 ELSE IF x%
= lmargin%
THEN mov%
= 1 x% = x% + mov%
LOCATE 1, 1:
PRINT " File Edit View Search Run Debug Calls Options Help"
COLOR 0, 3:
LOCATE 25, 1:
PRINT " <Shift+F1=Help> <F6=Window> <F2=Subs> <F5=Run> <F8=Step> ";
SUB reprintaliens
(ialiencol
, ihitaliens
, iresults
, i4
, i
, imothership
) ihits = ihits + 1
IF (ihits
+ 15) MOD 20 = 0 AND imothership
= 0 THEN imothership
= -1
alienforce% = alienforce% - 1
IF alienforce%
= 0 THEN iresults
= iresults
+ 1 IF bullet%
(i
) = ileadingrow
THEN ileadingrow
= ileadingrow
- 2 ia(i2) = 0
ihitaliens = 0
bullet%(i) = -bullet%(i)