BuGS/BuGS/level.s

505 lines
14 KiB
ArmAsm

;
; level.s
; BuGS
;
; Created by Jeremy Rand on 2020-10-12.
;Copyright © 2020 Jeremy Rand. All rights reserved.
;
case on
mcopy level.macros
keep level
level start
using globalData
using tileData
levelInit entry
stz gameLevel
stz gameLevel+2
stz nextGameLevel
stz nextGameLevel+2
stz centipedeLevelNum
stz centipedeLevelNum+2
stz colourLevelNum
stz colourLevelNum+2
lda #SEGMENT_SPEED_FAST
sta levelSpeed
sta levelSpeed+2
rtl
levelStart entry
ldx playerNum
lda colourLevelNum,x
jsl setColour
jsl startSegmentSound
ldy playerNum
lda nextGameLevel,y
sta gameLevel,y
ldx centipedeLevelNum,y
lda levelTable,x
tax
lda levelSpeed,y
sta |$2,x
lda |$0,x
sta centipedeNum
; We add centipedes in reverse order which means we need to load X up with the address
; of the last centipede. To do so, we:
; - subtract one from the number of centipedes
; - multiply by eight
; - add the starting location of the level information
; - add 2 to skip past the number of centipedes so we should now be
; at the start of the last centipede
; We do this because it is important that the single head segments are the ones which
; need to "avoid" the other segments and that happens when they are added first.
; See the update code in gameSegments.s to see why.
dec a
asl a
asl a
asl a
ldx centipedeLevelNum,y
clc
adc levelTable,x
tax
inx
inx
levelStart_loop anop
jsl addCentipede
dec centipedeNum
beq levelStart_done
txa
sec
sbc #8
tax
bra levelStart_loop
levelStart_done anop
rtl
levelNext entry
ldx playerNum
lda colourLevelNum,x
inc a
cmp #NUM_COLOUR_PALETTES
blt levelNext_skip
lda #0
levelNext_skip anop
sta colourLevelNum,x
ldx playerNum
inc nextGameLevel,x
lda scoreNum20000,x
cmp #2
bge levelNext_fastOnly
ldx playerNum
lda levelSpeed,x
cmp #SEGMENT_SPEED_FAST
beq levelNext_slowIncrement
lda #SEGMENT_SPEED_FAST
sta levelSpeed,x
rtl
levelNext_slowIncrement anop
lda #SEGMENT_SPEED_SLOW
sta levelSpeed,x
lda centipedeLevelNum,x
cmp #LEVEL_TABLE_LAST_OFFSET
bge levelNext_slowWrap
inc a
inc a
bra levelNext_slowNoWrap
levelNext_slowWrap anop
lda #0
levelNext_slowNoWrap anop
sta centipedeLevelNum,x
rtl
levelNext_fastOnly anop
ldx playerNum
lda #SEGMENT_SPEED_FAST
sta levelSpeed,x
lda centipedeLevelNum,x
cmp #LEVEL_TABLE_LAST_OFFSET
bge levelNext_fastWrap
inc a
inc a
bra levelNext_fastNoWrap
levelNext_fastWrap anop
lda #0
levelNext_fastNoWrap anop
sta centipedeLevelNum,x
rtl
centipedeNum dc i2'0'
levelSpeed dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_SPEED_FAST'
; The level structure looks like this:
; number of independent centipedes (2 bytes)
; { (for each independent centipede)
; segment speed (2 bytes)
; segment direction (2 bytes)
; tile offset where it appears (2 bytes)
; number of body segments (2 bytes)
; }
levelOne dc i2'1'
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'11' ; Number of body segments
levelTwo dc i2'2'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'10' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
levelThree dc i2'3'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'9' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
levelFour dc i2'4'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'8' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
levelFive dc i2'5'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'7' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelSix dc i2'6'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'6' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelSeven dc i2'7'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'5' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelEight dc i2'8'
dc i2'SEGMENT_SPEED_SLOW'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'4' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'2' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelNine dc i2'9'
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'3' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'2' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'42' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelTen dc i2'10'
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'2' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'2' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'10' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'42' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelEleven dc i2'11'
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'1' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'2' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'10' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'34' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'42' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
levelTwelve dc i2'12'
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'26' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'2' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'6' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'10' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'14' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'18' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_LEFT'
dc i2'22' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'30' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'34' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'38' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'42' ; Tile offset
dc i2'0' ; Number of body segments
dc i2'SEGMENT_SPEED_FAST'
dc i2'SEGMENT_DIR_RIGHT'
dc i2'46' ; Tile offset
dc i2'0' ; Number of body segments
; Once we reach level 26 of the centipede levels, we go back to level 15. This is because
; we only have fast speed centipedes, with one more head at the start and one less body
; segment until they are all head segments and then back to a single 12 segment centipede at
; fast speed. By looping back from 26th level to the 15th level, we do this.
LEVEL_TABLE_LAST_OFFSET gequ 11*2
levelTable dc i2'levelOne'
dc i2'levelTwo'
dc i2'levelThree'
dc i2'levelFour'
dc i2'levelFive'
dc i2'levelSix'
dc i2'levelSeven'
dc i2'levelEight'
dc i2'levelNine'
dc i2'levelTen'
dc i2'levelEleven'
dc i2'levelTwelve'
end