This is functionally exactly the same game as EigenBlitz but rewritten using NextBASIC, making use of new control structures and hardware sprites. It still runs on a Z80 at 3.5Mhz (apart from loading data) but is a lot quicker due to these BASIC and hardware improvements. I didn’t bother trying to make the sprites look any better than the ZX Spectrum version this was more an exercise in learning NextBASIC. I really like it so far and I feel like I’m only scratching the surface so I think I’m going to stick with it for a bit and see what else I can come up with.
Coming up with a name was tricky but I already had EigenBlitz and this is the “Next” version, with the next part of my chosen handle being “Grouse”. So there you go. Perhaps in future the ZX Spectrum versions will be “Eigen” and the Next versions “Grouse”, or maybe I’ll abandon that idea completely.
Download .tap file
I used https://github.com/remy/vscode-nextbasic to develop this in the comfort of VS Code which also means being able to do away with line numbers, although labels are now also a first-class construct in NextBASIC so that was more just about reducing noise.
The code is as follows, or the repository with all the other files used to develop is available here.
#autoline 10,10
#autostart 10
#program grouseblitz
RUN AT 3
REM load UDGs
RESTORE @udgData
LET %a= USR "a": LET %u=%a+119: FOR %i=%a TO %u: READ %y: POKE %i,%y: NEXT %i
REM load sprites
RESTORE @spriteData
FOR %i=0 TO 767
READ %y
BANK 16 POKE %i,%y
NEXT %i
SPRITE BANK 16,0,0,3
SPRITE CLEAR
SPRITE PRINT 1
RUN AT 0
%s,%b,%t=0
REPEAT
IF %s>t THEN %t=%s
GO SUB @startScreen
%s,%b,%l,%g=0
REM game loop
REPEAT
GO SUB @flyOff
PRINT #1; AT 1,0; INK 3;"BEST:";%t;#1; AT 1,22; INK 3;"SCORE:";%s
REM construct buildings from city data
RESTORE @gameData
REM skip previous levels
FOR %x=2 TO %l STEP 2: READ c$: FOR %y=4 TO 27: READ b$: READ r$: READ %h: NEXT %y: NEXT %x
REM load buildings
READ c$
PRINT #1; AT 1,9; INK 0;c$;" ";1940+(%g*10)+(%l)
FOR %y=4 TO 27
READ b$
READ r$
READ h
h=h+(%g*2)
FOR %x=21 TO 23-h STEP -1
PRINT AT %x,%y; INK 1;b$
BEEP 0.01,23-(%x)
NEXT %x
PRINT AT 22-h,%y; INK 1;r$
NEXT %y
REM bomber run
bx,by,bp=0
FOR x=0 TO 21
SPRITE 0,32,28+(8*x),0,1
SPRITE CONTINUE 0,32+(8*30) STEP 4 RUN,32+(8*x) STEP 4 RUN,0 TO 1
FOR y=0 TO 28
fx=50-x
SPRITE MOVE INT
SPRITE MOVE INT
REM clear bomb path
IF bp > 0 AND bx > x THEN PRINT AT bx,by;INK 0;" ";AT bx+1,by;" "
REM plane collision check
IF ATTR (x,y+3) > 56
BEEP 0.01,1: GO SUB @planeCrashes
REM mush be together to exit all levels
EXIT:EXIT:EXIT
ENDIF
REM bomb next line plus collision check
IF bp > 0
bx+=1
IF bx < 21 AND ATTR (bx+1,by) > 56
fx=23-bx:bp-=1:%s+=1
PRINT #1; AT 1,28; INK 3;%s
ENDIF
IF bp=1
PRINT AT bx+1,by; PAPER 2; INK 6; FLASH 1;"\A":%b+=1
PRINT AT bx-1,by; INK 0;" "; AT bx,by;" ":bp=0
SPRITE 1,0,0,1,0
ELSE IF bx=21
PRINT AT bx-1,by; INK 0;" "; AT bx,by;" ":bp=0
SPRITE 1,0,0,1,0
ENDIF
ELSE
REM waste some time
FOR %i=1 TO 9:NEXT %i
ENDIF
REM check for fire press
IF bp=0 AND x < 21 AND y > 1 AND y < 26 AND INKEY$ =" "
fx,bx,by,bp=1,x,y+2,7
SPRITE 1,32+(8*by),32+(8*bx),0,1
SPRITE CONTINUE 1,32+(8*by) RUN,32+(8*21) STEP 4 RUN,2
ENDIF
BEEP 0.01,fx
NEXT y
IF x < 21 THEN PRINT AT x,y;" "
NEXT x
GO SUB @manWaving
%l+=2
IF %l>8 THEN %l=0: %g+=1
CLS
REPEAT UNTIL 0
REPEAT UNTIL 0
@startScreen
CLS
PRINT AT 2,11; INK 2;"NEXT BLITZ"
PRINT AT 4,5; INK 3;"THE OBJECT OF THE GAME"
PRINT AT 5,5; INK 3;"IS TO FLATTEN THE CITY"
PRINT AT 6,5; INK 3;"SO THAT YOU CAN LAND"
PRINT AT 7,5; INK 3;"YOUR AEROPLANE ON THE"
PRINT AT 8,5; INK 3;"GROUND. YOU CONTROL"
PRINT AT 9,5; INK 3;"THE DROPPING OF BOMBS"
PRINT AT 10,5; INK 3;"BY PRESSING "; PAPER 0; INK 7;"SPACE"; PAPER 7; INK 3;"."
PRINT AT 12,5; PAPER 2; INK 7;"PRESS ANY KEY TO START"
PRINT AT 15,9;"BEST SCORE ";%t
PRINT AT 17,9; INK 1;"LAST SCORE ";%s-b
PRINT AT 18,9; INK 1;"PLUS BONUS ";%b
PRINT AT 19,14;"TOTAL ";%s
PAUSE 0
CLS
RETURN
@manWaving
SPRITE 0,32+(8*29),32+(8*21),0,1
FOR n=1 TO 5
PRINT AT 21,26; INK 0;"\L"
PAUSE 10
PRINT AT 21,26; INK 0;"\M"
PAUSE 10
PRINT AT 21,26; INK 0;"\N"
PAUSE 10
PRINT AT 21,26; INK 0;"\M"
PAUSE 10
NEXT n
SPRITE 0,0,0,0,0
RETURN
@flyOff
PRINT #1; AT 0,0; INK 4;"\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O\O"
SPRITE 0,32,32+(8*21),0,1
SPRITE CONTINUE 0,32+(8*30) STEP 4 RUN,32 STEP -4 RUN,0 TO 1
x=0
REPEAT
SPRITE MOVE INT
BEEP 0.01,x
x+=1
REPEAT UNTIL SPRITE AT (0,0)=32+(8*30)
SPRITE 0,0,0,0,0
RETURN
@planeCrashes
SPRITE 0,0,0,0,0
SPRITE 1,0,0,0,0
ax,bx=x
REPEAT
PRINT AT ax-1,y+1;" "; AT ax,y+1; INK 2;"\J"; AT bx-1,y+2;" "; AT bx,y+2;"\K"
x+=1
IF ATTR (ax+1,y+1)=56 THEN ax+=1
IF ATTR (bx+1,y+2)=56 THEN bx+=1
BEEP 0.01,50-x
REPEAT UNTIL x>ax AND x>bx
RETURN
@gameData
DATA "LONDON","\B","\G",9,"\C","\G",8,"\B","\H",7,"\B","\I",6,"\E","\F",5,"\D","\I",10,"\D","\G",9,"\C","\F",8,"\B","\F",7,"\E","\G",6,"\E","\H",8,"\D","\I",9,"\B","\G",4,"\E","\H",4,"\E","\I",6,"\C","\G",11,"\D","\G",9,"\B","\F",5,"\C","\H",4,"\E","\I",6,"\D","\I",6,"\C","\G",4,"\B","\F",6,"\D","\F",9
DATA "BRISTOL","\C","\G",4,"\B","\F",6,"\D","\F",9,"\D","\I",9,"\B","\F",5,"\C","\H",4,"\E","\I",6,"\B","\G",9,"\C","\G",8,"\B","\H",7,"\B","\I",6,"\E","\F",5,"\D","\I",10,"\D","\G",9,"\C","\F",8,"\B","\F",7,"\E","\G",6,"\E","\H",8,"\D","\I",6,"\B","\G",4,"\E","\H",4,"\E","\I",6,"\C","\G",11,"\D","\G",9
DATA "GLASGOW","\E","\I",6,"\C","\G",11,"\D","\G",9,"\B","\F",5,"\C","\H",4,"\E","\I",6,"\B","\G",9,"\C","\G",8,"\B","\H",7,"\B","\I",6,"\E","\F",5,"\D","\I",10,"\D","\G",9,"\C","\F",8,"\B","\F",7,"\E","\G",6,"\E","\H",8,"\D","\I",6,"\C","\G",4,"\B","\F",6,"\D","\F",9,"\D","\I",9,"\B","\G",4,"\E","\H",4
DATA "CARDIFF","\C","\G",4,"\B","\F",6,"\D","\F",9,"\D","\I",9,"\B","\G",4,"\E","\H",4,"\E","\I",6,"\C","\G",11,"\D","\G",9,"\B","\F",5,"\C","\H",4,"\E","\I",6,"\B","\G",9,"\C","\G",8,"\B","\H",7,"\B","\I",6,"\E","\F",5,"\D","\I",10,"\D","\G",9,"\C","\F",8,"\B","\F",7,"\E","\G",6,"\E","\H",8,"\D","\I",6
DATA "BELFAST","\D","\G",9,"\C","\F",8,"\B","\F",7,"\E","\G",6,"\E","\H",8,"\D","\I",6,"\B","\G",4,"\E","\H",4,"\E","\I",6,"\C","\G",11,"\D","\G",9,"\C","\G",4,"\B","\F",6,"\D","\F",9,"\D","\I",9,"\B","\F",5,"\C","\H",4,"\E","\I",6,"\B","\G",9,"\C","\G",8,"\B","\H",7,"\B","\I",6,"\E","\F",5,"\D","\I",10
@udgData
DATA 0, 0, 0, 130, 130, 214, 170, 254 :; A - top floor of bombed building
DATA 254, 214, 214, 254, 254, 214, 214, 254 :; B - building body type 1
DATA 146, 254, 146, 254, 146, 254, 146, 254 :;C - building body type 2
DATA 254, 170, 170, 254, 254, 170, 170, 254 :; D - building body type 3
DATA 170, 254, 170, 254, 170, 254, 170, 254 :; E - building body type 4
DATA 0, 0, 16, 16, 16, 56, 124, 254 :; F - building roof type 1
DATA 16, 124, 84, 84, 254, 214, 214, 254 :; G - building roof type 2
DATA 0, 0, 16, 16, 56, 56, 124, 254 :; H - building roof type 3
DATA 16,16,56,40,124,84,84,254: ; I - building roof type 4
DATA 28,126,254,252,120,61,94,255 :; J - plan crash lhs
DATA 32,16,24,28,186,121,254,254: ; K - plane crash rhs
DATA 0,24,24,60,90,90,36,102 :; L - man waving - frame 1
DATA 0,24,153,126,24,24,36,102 :; M - man waving - frames 2 and 4
DATA 0,90,90,60,24,24,36,102: ; N - man waving - frame 3
DATA 255,85,170,85,170,85,170,85: ; O - grass
@spriteData
REM sprite 0
DATA 227, 160, 160, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 160, 160, 160, 160, 227, 227, 227, 227, 160, 160, 160, 160, 160, 160, 160, 227
DATA 160, 160, 160, 160, 227, 227, 160, 227, 227, 227, 160, 227, 227, 160, 227, 227
DATA 160, 160, 160, 160, 227, 160, 160, 227, 227, 160, 227, 227, 160, 227, 227, 160
DATA 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 227, 160
DATA 227, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160
DATA 227, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 227, 160
DATA 227, 160, 160, 227, 227, 227, 227, 227, 227, 227, 160, 160, 227, 227, 227, 160
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
REM sprite 1
DATA 227, 160, 160, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 160, 160, 160, 160, 227, 227, 227, 227, 160, 160, 160, 160, 160, 160, 160, 227
DATA 160, 160, 160, 160, 227, 227, 160, 227, 227, 227, 160, 227, 227, 160, 227, 227
DATA 160, 160, 160, 160, 227, 160, 160, 227, 227, 160, 227, 227, 160, 227, 227, 227
DATA 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 227, 227
DATA 227, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160
DATA 227, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 227, 227
DATA 227, 160, 160, 227, 227, 227, 227, 227, 227, 227, 160, 160, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
REM sprite 2
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 0, 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 0, 0, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227
DATA 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227