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 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 player1xplayer0x then player1x=player1x-1 if randomizecities(r)>3 then goto skipxx if player1yplayer0y 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 missile1xplayer0x then missile1x=missile1x-3 goto endothersidefix othersidefix rem left side if missile1x>player0x+3 then missile1x=missile1x-3 if missile1x3 then missile1x=missile1x+3 endothersidefix if missile1y4 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