StarBlitz by Relational Framework [web]
rem -----------------------------------------
rem -- Tiny BASIC program StarBlitz v5C --
rem -----------------------------------------
rem -----------------------------------------
rem ---init section, runs once: -------------
rem -----------------------------------------
rem --- Defined array variables:
data mazecolors $64,$54,$b4,$a4,$32,$44,$24,$c4,$94,$f4,$54,$a4,$d4,$f4,$74,$16
data randomizecities 1,4,2,5,3,2,3,1,4,1,1,1,5,2,2,3,1,4,1,4,3,1,4,4,1,1,2,2,3,1,3
data randomize2 4,1,5,2,2,3,1,3,1,1,4,1,5,3,2,1,1,4,1,5,6,1,4,5,5,1,1,3,3,3,1
data getnumbersprites 48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,0,8,40,40,40
rem data getnumbersprites 128,128,128,128,128,128,96,104,112,120,128,136,144,152,160,168,176,0,8,40,40,40
data lives $54,$64,$74,$84,$c4,$a4,$b4,$78,$54
rem --- 29 predefined variables (e-z,var1,var2,px,py,bx,by,score)
BYTErowoffset=120:start near bottom of virtual world
rem BITIndex=20:rem start one TV screen in
rem add ability to turn back and forth DONE
rem add laser beams (4x missile extra wide)
rem add slowly falling commets to avoid/shoot b4 they destroy city, use random table
rem wierd bug - if meteor is not on screen it freezes! - fixed
rem --- variable map: -------------------------
rem f - framecounter (0-9)
rem r - randomizecities index (0-59) response seeded
rem n - init new cityscape (1) and game (2)
rem i,j,k,l - loop vars,temp vars
rem t - toggle var (0/1)
rem g - direction, 0 right, 1 left
rem o,p and u,v - x/y for tilemapped NPC's (u/v freed - comet2 is turned off)
rem z,m NPC sprite lookup and color index
rem h - smooth animation increment for NPC
rem score,var2,w,var1 - score/lives/level,cityhealth
rem player0x,player0y,player1y,missile0x, etc - sprite variables
rem q - Defender lander hit points
rem u - enemy torpedo active flag
loadplayer0(0): rem flyer - face right
COLUPF=$64:rem 3A
COLUP0=$54
rem var2=9: rem 9 lives
player0x=80:player0y=80
NUSIZ0=%00110000:rem normal player1, wide missile
rem ------------------------------------------------
rem end init section (implicit return)--------------
rem ------------------------------------------------
rem ------------------------------------------------
rem ---:the next comment line is used by the compiler
rem ---gameloop subroutine, runs every frame: ---
rem ------------------------------------------------
rem Tiny BASIC program StarBlitz
rem ------------------------------------------------
f=f+1:t=1-t:rem this expression toggles var t between 0 and 1
if f=10 then f=0: rem 10 frames
if r>59 then r=0: rem upper boundry of random variable array
rem Draw random city or seed random number generator
if n=0 and f=9 and joy0fire=1 then n=1 else r=r+1
rem --- player missile:
if joy0fire=1 and missile0x=0 then missile0x=player0x:AUDC0=6:AUDF0=missile0x:SUSTAINFORFRAMES=20
if missile0x=0 then goto donemissile
if g=0 then missile0x=missile0x+3 else missile0x=missile0x-3
missile0y=player0y-5
if missile0x>158 or missile0x<7 then missile0x=0:missile0y=0:rem COLUBK=10
rem -- fix hard to hit pod
if missile1y<missile0y+4 and missile1y>=missile0y then missile0y=missile1y
rem good AUDC0=7:AUDF0=missile0x:SUSTAINFORFRAMES=4
rem AUDC0=8:AUDF0=missile0x:SUSTAINFORFRAMES=4
rem UFO: AUDC0=5:AUDF0=missile0x:SUSTAINFORFRAMES=4
rem 8 17 12
donemissile
rem --- move player vertically
if joy0down=1 and player0y>8 then player0y=player0y-2
if joy0up=1 and player0y<96 then player0y=player0y+2
rem --- enemy torpedo --- Trixter's idea
if u=1 and t=0 then NUSIZ1=%00110000:AUDC1=7:AUDF1=missile1x:SUSTAINFORFRAMES=4:gosub share_for_enemy_torpedo
rem ---------Defender_Lander -------------------------- TJ's idea
if z<>8 then goto meteor
if player1y=0 then goto meteor
rem if t=1 then goto skipxx
if player1x<player0x then player1x=player1x+1
if player1x>player0x then player1x=player1x-1
if randomizecities(r)>3 then goto skipxx
if player1y<player0y then player1y=player1y+1
if player1y>player0y then player1y=player1y-1
if player1y=0 then o=0
rem : lander launches pod
if missile1y=0 and f<>8 then goto skipxx: rem -- lander needs some time to recover
if missile1y=0 then missile1y=player1y:missile1x=player1x
gosub share_for_enemy_torpedo
skipxx
goto donecomet1
meteor
rem init new comet?
rem incldue enemy torpedo for fragmented metor (24)
rem --- pick random spot to fall
if o=0 and g=0 then o=BITIndex+20:i=randomizecities(r)/2:o=o-i:gosub choosecomet
if o=0 and g=1 then o=BITIndex:o=randomizecities(r)+o:gosub choosecomet
loadplayer1(z): COLUP1=mazecolors(m)
if o<21 then o=randomizecities(r)+20: rem COLUPF=10 else COLUPF=64
if o>71 then o=randomizecities(r)+64:rem COLUPF=10 update
vwpixel(o,p,bindplayer1)
if vwpixel(o,p,poll)>0 then vwpixel(o,p,flip):AUDC1=3:AUDF1=p/3:SUSTAINFORFRAMES=7:var1=var1+1
if h=0 then goto skipthirdsteps
rem --- meteors freezing offscreen bug: if h>1 and player1y>h then player1y=player1y+h:h=h-3
rem --- no: if h>1 then player1y=player1y+h:h=h-3
if player1y>h then player1y=player1y+h
h=h-2:rem too fast withoutrandom delay h=h-3
goto donecomet1
skipthirdsteps
rem ---- KaeruYojimbo's idea for unifom falling rate on meteors; remove rnd third step delay:
rem if randomizecities(r)>1 then p=p+1:h=9 else h=0: rem h= do third steps
p=p+1:h=10: rem h=9
if p = 20 then o=0
donecomet1
rem -- comet2 removed from build
rem --- seed horizontal drift and direction panning the city
if joy0left=1 then g=1
if joy0right=1 then g=0
rem if t=1 then goto donego
rem --- pan the city and handle horizontal drift
if g=1 then goto goleft
goright
REFP0=0: rem face forwards
BITIndex=BITIndex+1
if BITIndex>71 then BITIndex=0
if player0x>22 then player0x=player0x-2
goto donego
goleft
REFP0=255: rem face backwards
BITIndex=BITIndex-1:rem boundry fix, Flyer escaping into memory...
if BITIndex=255 then BITIndex=71: rem wrap around
if player0x <142 then player0x=player0x+2
donego
rem --- check if player missile hit something:-------------------
if CXM0P<126 then goto skiphit
COLUBK=10
o=0:rem if t=1 then o=0 else u=0
missile0x=0:missile0y=0:AUDC0=7:AUDF0=12:SUSTAINFORFRAMES=16:CXCLR=0
score=score+1
rem -- player missile hit defender lander?===============
if z<>8 then goto skip_hitlander
if q<3 then q=q+1 else q=0: q=0:player1y=0:o=0:missile1y=0:missile1x=0:z=0:AUDF0=21
if q=2 then AUDF0=10
goto skiphit3
skip_hitlander rem -- missile hit meteor:
if score>8 then score=0:w=w+1:var1=0:COLUPF=mazecolors(m):n=1:MUSICINDEX=15
goto skiphit3
skiphit
COLUBK=0
rem --- check player hit by comet:
if CXPPMM <126 then goto skiphit2
CXCLR=0:o=0:player1x=0:player1y=0
rem debug next line
if z>48 then score=score+1:AUDC0=7:AUDF0=12:SUSTAINFORFRAMES=20:goto skiphit2
if z=8 then missile1y=0:missile1x=0:z=16
rem --- checking if $34 background for 2 frames rolls screen on Spice's monitor
COLUBK=$34:AUDC0=3:AUDF0=7:SUSTAINFORFRAMES=17:var2=var2+1
rem COLUBK=$70:AUDC0=3:AUDF0=7:SUSTAINFORFRAMES=17:var2=var2+1
if var2>8 then gosub end_game else COLUP0=lives(var2)
goto skiphit3
skiphit2
rem ---check player hit by missile
if CXM1P <126 then goto checkmm
rem --- checking if $36 background for 2 frames rolls screen too...
COLUBK=$36:AUDC0=3:AUDF0=11:SUSTAINFORFRAMES=7:var2=var2+1
rem COLUBK=$70:AUDC0=3:AUDF0=11:SUSTAINFORFRAMES=7:var2=var2+1
u=0:CXCLR=0:missile1x=0:missile1y=0:COLUBK=$44:rem fix
if var2>8 then gosub end_game else COLUP0=lives(var2)
goto skiphit3
checkmm
if CXPPMM<63 then goto skiphit3: rem --- missile missile
u=0:missile1x=0:missile1y=0:missile0x=0:missile0y=0:AUDC0=7:AUDF0=12:SUSTAINFORFRAMES=26:CXCLR=0
skiphit3
if MUSICINDEX>=90 then COLUBK=$70:rem $34 blanking on one Plasma display...
if var1>50 then COLUPF=7:City critical
if var1>70 then COLUPF=4
if var1>80 then gosub end_game
scrollvirtualworldtoggle=1:rem raise event to pan the camera
return
share_for_enemy_torpedo if g=0 then goto othersidefix
if missile1x<player0x+3 then missile1x=missile1x+3:goto endothersidefix
if missile1x>player0x then missile1x=missile1x-3
goto endothersidefix
othersidefix rem left side
if missile1x>player0x+3 then missile1x=missile1x-3
if missile1x<player0x-3 and player0x>3 then missile1x=missile1x+3
endothersidefix
if missile1y<player0y-4 and player0y>4 then missile1y=missile1y+2
if missile1y>player0y-4 and player0y>4 then missile1y=missile1y-2
rem if missile1y>player0y then missile1y=missile1y-2
rem ! bug - if showing enemy torpedo, goto meteor too...
return
rem -------------------------------------------------------------
rem end game loop (implicit return)-----------------
rem -------------------------------------------------------------
rem -------------------------------------------------------------
rem ---gameloop2 subroutine, runs every frame: --
rem ------------------------------------------------
return: rem ---done with gameloop, functions below:---
choosecomet
p=9
rem ------- cycle 20 sprites (sprite array) and 16 colors (mazecolors array)
m=m+1: rem z=z+8
rem if z>184 then z=16
if z=16 then z=24 else z=16
if randomizecities(r)=5 and score>0 then z=getnumbersprites(score)
if m>15 then m=0
rem --- set comet size
rem NUSIZ1=%00110000:normal player2, wide missile
NUSIZ1=%00010000:normal player2, medium missile
i=randomizecities(r)
if i=6 then NUSIZ1=%00111111:rem super wide player2, wide missile
if i=2 then NUSIZ1=%00111101:rem wide player2, wide missile
if f<6 then return
rem adjust if player is hiding
rem if g=0 and player0y<50 then o=o+12:o=o+i
rem if g=1 and player0y<50 then o=o-12:o=o-i
if g=0 then o=o+14:o=o+i
if g=1 then o=o-14:o=o-i
rem --- 20160131 ---adding descending ship with dot missile
if i=3 then z=8: rem --- load defender enemy ship looking like lunar lander!
rem z=8: rem .... only do this some of the time or f>7 logic is lost
if i=1 then u=1:missile1x=randomizecities(m)*20: rem --- launch enemy torpedo simultaneously with meteor
return
end_game
var1=0:var2=0:score=0:MUSICINDEX=90:n=5
rem -------------------------------------------------------------
rem end gameloop2 (implicit return)-----------------
rem ------------------------------------------------
rem -------------------------------------------------------------
rem ---KITCHENSINK subroutine, runs when scrollvirtualworldtoggle=1
rem -------------------------------------------------------------
if n<>1 then goto skip_Cityscape
if MUSICINDEX>=90 then n=0:goto skip_Cityscape: rem -- wait if end tune is playing
rem for n=1 to 2
rem ---clear the virtual world (1/2)
for j = 120 to 239:virtualworld(j)=0:next j
rem ---create a new City Scape
for j = 20 to 71
k=randomizecities(r)+14
for i = 19 to k step -1
vwpixel(j,i,on)
rem --- 20160215 Mirroring city in the blank space for continuous cityscape
if j<41 then n=j-20: vwpixel(n,i,on):n=52+j:vwpixel(n,i,on) : rem j+52
next i
r=r+1 :rem increment random index
if r>59 then r=0: rem boundry check for psuedo random number generator table
next j:rem ,n
v=0:COLUP0=$54:var1=w*4:var2=0:n=2 : rem done building cityscape, game in progress
skip_Cityscape
rem ---show title screen (copy from top 1/2 of virtual world)
if n<> 5 then goto skip_titlescreen
for j=120 to 239
i=j-120
virtualworld(j)=virtualworld(i)
next j
rem goto skipshowlevel
showlevel rem if MUSICINDEX<15 then goto skipshowlevel
j=getnumbersprites(w):k=121
for i=0 to 7
if MUSICINDEX<15 then l=0 else l=j+i:l=sprites(l): rem get row of level number
rem --Display level on virtual world only at beginning of each round and finale.
virtualworld(k)=l: k=k+12
next i
for i=4 to 11
for j = 10 to 17
if vwpixel(i,j,poll)>0 then k=i+72: vwpixel(k,j,on)
next j,i
skipshowlevel
n=0: game not started yet
skip_titlescreen
rem for x = 1 to 4
rem for y = 1 to 4
rem vwpixel(x,y,flip)
rem next y,x
if MUSICINDEX=115 then w=0: rem clear level indicator
rem end kitchensink events----------------------------------------------
virtualworld
...................xxxxxx.xxxxxx..xxxxx.xxxxx..xxxxx...x....x.xxxxx.xxxxx...................
...................x....x...xx....x...x.x...x..xx..x...x....x...xx..x..xx...................
...................x........xx....x...x.x...x..xx..x...x....x...xx.....xx...................
...................xxxxxx...xx...xxxxxx.xxxxxx.xxxxxx..x...xx...xx.....x....................
........................x...xx...xx...x.xx..xx.xx...x.xx...xx...xx....x.....................
...................xx...x...xx...xx...x.xx..xx.xx...x.xx...xx...xx...x.xx...................
...................xxxxxx.x.xx.x.xx...x.xx..xx.xxxxxx.xxxx.xx...xx..xxxxx...................
...........................x....x....x......x..........................x....................
x....................x.xx..xx...xx...x.x..x.xxx..x.xx..x.....x.x..xx..xxx...................
x...................xx.xx.xxx.x.xx.x.x.x.xx.xxx.xx.xx.xx.xx.xx.xx.xxx.xxx...................
............................................................................................
............................................................................................
...................xxxxxx.xxxxxx..xxxxx.xxxxx..xxxxx...x....x.xxxxx.xxxxx...................
...................x....x...xx....x...x.x...x..xx..x...x....x...xx..x..xx...................
...................x........xx....x...x.x...x..xx..x...x....x...xx.....xx...................
...................xxxxxx...xx...xxxxxx.xxxxxx.xxxxxx..x...xx...xx.....x....................
........................x...xx...xx...x.xx..xx.xx...x.xx...xx...xx....x.....................
...................xx...x...xx...xx...x.xx..xx.xx...x.xx...xx...xx...x.xx...................
...................xxxxxx...xx...xx...x.xx..xx.xxxxxx.xxxx.xx...xx..xxxxx...................
............................................................................................
sprites
0
........
X.......
XX......
XXXXXX..
XXX..XXX
.XXXXXXX
XXX.....
........
8
.x....x.
..xxxx..
.x.xx.x.
..xxxx..
...xx...
..xxxx..
.x.xx.x.
x..x...x
16
..xxxx..
.xXXXXx.
XXX.xxXX
XxXxx.XX
xXXXXX.x
XXX..XXX
XxxxxxxX
..xxxx..
24
x...xx..
...XXXX.
X....XXX
XXX.....
..X..XX.
X.X.XXXX
Xx...XX.
...x....
32
..xxxx..
.xXXXXx.
XXX.xxXX
XxXxx.XX
xXXXXX.x
XXX..XXX
XxxxxxxX
..xxxx..
40
..xxxx..
.xXXXXx.
XX.xx.XX
XxxxxxXX
x.XXXX.x
XX....XX
.xxxxxx.
..xxxx..
48
xxxxxxxx
xx....XX
Xx....XX
XX....xx
xxxx..xx
Xxxx..XX
Xxxx..xx
xxxxxxxx
56x
..xxx...
.xxxx...
..xxx...
..xxx...
..xxx...
.xxxxx..
.xxxxx..
.xxxxx..
64
........
xxxxxxxx
......xx
......xx
xxxxxxxx
xxxx....
xxxx....
xxxxxxxx
72
xxxxxxx.
......x.
......x.
......x.
xxxxxxxx
......xx
......xx
xxxxxxxx
80
xx......
xx......
xx......
xx...xx.
xxxxxxx.
.....xx.
.....xx.
.....xx.
88
........
xxxxxxxx
xx......
xx......
xxxxxxxx
....xxxx
....xxxx
xxxxxxxx
96
........
xxxxxxxx
xx....xx
xx......
xxxxxxxx
xx....xx
xxxx..xx
xxxxxxxx
104
xxxxxxxx
xxxxxxxx
xx...xxx
....xxx.
...xxx..
...xxx..
...xxx..
...xxx..
112
.xxxxxx.
.x....X.
.x....X.
XXxxxxxx
xx....xx
Xxxx..XX
Xxxx..xx
xxxxxxxx
120
xxxxxxxx
x.....xx
x....xxx
xxxxxxxx
......xx
......xx
......xx
......xx
128
xx.xxxxx
xx.xx..x
xx.xx..x
xx.xx..x
xx.xx..x
xx.xxx.x
xxx.xx.x
xxx.xxxx
136
.xx..xx.
xxx.xxx.
.xx..xx.
.xx..xx.
.xx..xx.
.xx..xx.
.xxx.xxx
.xxx.xxx
144
xx.xxxxx
xx.x..xx
xx....xx
xx.xxxxx
xx.xxxxx
xx.xx...
xxx.x...
xxx.xxxx
152
xx.xxxx.
xx....x.
xx....x.
xx....x.
xx.xxxxx
xx.....x
xxx....x
xxx.xxxx
160
xx.xx..x
xx.xx..x
xx.xx..x
xx.xxxxx
xx....xx
xx....xx
xxx...xx
xxx...xx
168
xx.xxxxx
xx.xx...
xx.xx...
xx.xx...
xx.xxxxx
xx....xx
xxx...xx
xxx.xxxx
176
xx.xxxxx
xx.xx...
xx.xx...
xx.xx...
xx.xxxxx
xx.xx.xx
xxx.x.xx
xxx.xxxx
184
.xx.....
x....x..
xxx.x.x.
..x.x.x.
xx..x.x.
...x.x.x
...x....
...xxxx.
chiptunes
0,0,0,0,0
0,0,0,0,0
6, 5, 4, 12, 5
6, 5, 4, 12, 12
6, 5, 4, 12, 5
12, 9, 12, 7, 4
6, 5, 4, 12, 5
6, 5, 4, 12, 12
6, 5, 4, 12, 12
12, 9, 12, 7, 4
0,0,0,0,0
6, 5, 4, 12, 20
6, 17, 4, 19, 20
6, 5, 4, 12, 20
6, 17, 4, 15, 35
0, 0, 0, 0, 255
29,23,5,10,0
27, 0, 0, 8, 15
24, 8, 0, 8, 17
27, 0, 0, 8, 15
24, 8, 0, 8, 17
27, 0, 0, 8, 15
24, 8, 0, 8, 17
24,24,24,24,0
[ back to the prod ]
