mirror of https://github.com/jeremysrand/BuGS.git
505 lines
14 KiB
ArmAsm
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
|