duke: more separation of levels

This commit is contained in:
Vince Weaver 2020-12-17 15:57:08 -05:00
parent 22c7937a21
commit 83895b6d6d
13 changed files with 632 additions and 88 deletions

View File

@ -27,7 +27,7 @@ HELLO: hello.bas
LOADER: loader.o
ld65 -o LOADER loader.o -C ../linker_scripts/apple2_1000.inc
loader.o: loader.s init_vars.s
loader.o: loader.s
ca65 -o loader.o loader.s -l loader.lst
####
@ -35,7 +35,7 @@ loader.o: loader.s init_vars.s
DUKE_TITLE: duke_title.o
ld65 -o DUKE_TITLE duke_title.o -C ../linker_scripts/apple2_4000.inc
duke_title.o: duke_title.s zp.inc hardware.inc
duke_title.o: duke_title.s zp.inc hardware.inc init_vars.s
ca65 -o duke_title.o duke_title.s -l duke_title.lst
####
@ -45,8 +45,8 @@ DUKE_LEVEL1: duke_level1.o
duke_level1.o: duke_level1.s zp.inc hardware.inc \
print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \
enemies.s actions.s \
graphics/duke_graphics.inc \
enemies_level1.s actions_level1.s \
graphics/duke_graphics.inc duke_sprites.inc \
maps/level1_map.lzsa \
status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \
draw_tilemap.s \
@ -61,8 +61,8 @@ DUKE_LEVEL2: duke_level2.o
duke_level2.o: duke_level2.s zp.inc hardware.inc \
print_help.s gr_fast_clear.s quit_yn.s text_drawbox.s level_end.s \
enemies.s actions.s \
graphics/duke_graphics.inc \
enemies_level2.s actions_level2.s \
graphics/duke_graphics.inc duke_sprites.inc \
maps/level2_map.lzsa \
status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \
draw_tilemap.s \

View File

@ -1,7 +1,5 @@
before release:
~~~~~~~~~~~~~~~
+ laser collision detection
+ enemies can be killed
+ pick up red key
+ fix collision when walking into things

204
duke/actions_level2.s Normal file
View File

@ -0,0 +1,204 @@
; someone pressed UP
up_action:
; set X and Y value
; convert tile values to X,Y
; X=((DUKE_X/2)-1)+TILEX
lda DUKE_X
lsr
sec
sbc #1
clc
adc TILEMAP_X
sta XPOS
; Y = (DUKEY/4)+TILEY
lda DUKE_Y
lsr
lsr
clc
adc TILEMAP_Y
sta YPOS
; $39,$22 = 57,34
; check if it's a key slot
check_red_keyhole:
; key slot is 280,148
; 280,148 (-80,-12) -> 200,136 -> (/4,/4) -> 50,34
lda XPOS
cmp #50
beq redkey_x
cmp #51
bne check_if_exit
redkey_x:
lda YPOS
cmp #34
bne check_if_exit
; check that we have the key
lda INVENTORY
and #INV_RED_KEY
bne open_the_wall
no_red_key:
jsr buzzer_noise
jmp done_up_action
; open the red wall
; there has to be a more efficient way of doing this
open_the_wall:
; reset smc
lda #>BIG_TILEMAP
sta rwr_smc1+2
sta rwr_smc2+2
remove_red_wall_outer:
ldx #0
remove_red_wall_loop:
rwr_smc1:
lda BIG_TILEMAP,X
cmp #49 ; red key tile
bne not_red_tile
lda #2 ; lblue bg tile
rwr_smc2:
sta BIG_TILEMAP,X
not_red_tile:
inx
bne remove_red_wall_loop
inc rwr_smc1+2
inc rwr_smc2+2
lda rwr_smc1+2
cmp #(>BIG_TILEMAP)+40
bne remove_red_wall_outer
; refresh local tilemap
jsr copy_tilemap_subset
jsr rumble_noise
jmp done_up_action
; check if it's the exit
check_if_exit:
; exit is 296,148
; 296,148 (-80,-12) -> 216,136 -> (/4,/4) -> 54,34
lda XPOS
cmp #54
beq exit_x
cmp #55
bne done_up_action
exit_x:
lda YPOS
cmp #34
bne done_up_action
; check that we have the key
lda INVENTORY
and #INV_RED_KEY
beq done_up_action
lda #1
sta DOOR_ACTIVATED
sta FRAMEL ; restart timer
done_up_action:
rts
;==========================
; open the door, end level
;==========================
check_open_door:
lda DOOR_ACTIVATED
beq done_open_door
asl
tay
lda door_opening,Y
sta INL
lda door_opening+1,Y
sta INH
; need to find actual door location
; it's at 54,34
; Y is going to be at 20 unless something weird is going on
; X is going to be ((54-TILE_X)+2)*2
lda #56
sec
sbc TILEMAP_X
asl
sta XPOS
lda #20
sta YPOS
jsr put_sprite_crop
lda FRAMEL
and #$7
bne done_open_door
; increment
inc DOOR_ACTIVATED
lda DOOR_ACTIVATED
cmp #6
bne done_open_door
jsr level_end
done_open_door:
rts
door_opening:
.word door_sprite0
.word door_sprite0
.word door_sprite1
.word door_sprite2
.word door_sprite1
.word door_sprite0
door_sprite0:
.byte 4,4
.byte $15,$55,$55,$f5
.byte $55,$f5,$5f,$55
.byte $25,$25,$25,$25
.byte $55,$55,$55,$55
door_sprite1:
.byte 4,4
.byte $51,$f5,$f5,$5f
.byte $55,$05,$05,$50
.byte $05,$50,$50,$55
.byte $52,$55,$55,$52
door_sprite2:
.byte 4,4
.byte $f5,$05,$05,$f0
.byte $55,$00,$00,$55
.byte $55,$00,$00,$55
.byte $05,$50,$50,$25

View File

@ -117,73 +117,4 @@ actually_draw_duke:
rts
duke_sprite_stand_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $AA,$56,$56,$AA
duke_sprite_stand_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $AA,$56,$56,$AA
duke_sprite_walking_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $56,$A6,$A6,$5A
duke_sprite_walking_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $5A,$A6,$A6,$56
duke_sprite_jumping_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $55,$A6,$AA,$AA
duke_sprite_jumping_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $AA,$AA,$A6,$55
duke_sprite_falling_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$67,$A7
.byte $5A,$A6,$56,$AA
duke_sprite_falling_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$67,$6b,$AA
.byte $AA,$56,$A6,$5A
duke_sprite_shooting_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$b7,$A7,$AA
.byte $AA,$56,$56,$AA
duke_sprite_shooting_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $AA,$A7,$b7,$AA
.byte $AA,$56,$56,$AA

View File

@ -220,11 +220,12 @@ done_with_duke:
.include "level_end.s"
.include "draw_duke.s"
.include "duke_sprites.inc"
.include "move_duke.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "enemies.s"
.include "actions.s"
.include "enemies_level1.s"
.include "actions_level1.s"
.include "sound_effects.s"
.include "speaker_tone.s"

View File

@ -73,7 +73,7 @@ duke_start:
jsr decompress_lzsa2_fast
;====================================
; load level1 tilemap
; load level2 tilemap
;====================================
lda #<level2_data_lzsa
@ -88,7 +88,7 @@ duke_start:
;====================================
lda #10
sta TILEMAP_X
lda #18
lda #8
sta TILEMAP_Y
jsr copy_tilemap_subset
@ -201,11 +201,12 @@ done_with_duke:
.include "level_end.s"
.include "draw_duke.s"
.include "duke_sprites.inc"
.include "move_duke.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "enemies.s"
.include "actions.s"
.include "enemies_level2.s"
.include "actions_level2.s"
.include "sound_effects.s"
.include "speaker_tone.s"

70
duke/duke_sprites.inc Normal file
View File

@ -0,0 +1,70 @@
duke_sprite_stand_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $AA,$56,$56,$AA
duke_sprite_stand_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $AA,$56,$56,$AA
duke_sprite_walking_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $56,$A6,$A6,$5A
duke_sprite_walking_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $5A,$A6,$A6,$56
duke_sprite_jumping_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$b7,$A7
.byte $55,$A6,$AA,$AA
duke_sprite_jumping_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$b7,$6b,$AA
.byte $AA,$AA,$A6,$55
duke_sprite_falling_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$6b,$67,$A7
.byte $5A,$A6,$56,$AA
duke_sprite_falling_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $A7,$67,$6b,$AA
.byte $AA,$56,$A6,$5A
duke_sprite_shooting_right:
.byte 4,4
.byte $AA,$dd,$bd,$AA
.byte $AA,$3d,$Ab,$AA
.byte $AA,$b7,$A7,$AA
.byte $AA,$56,$56,$AA
duke_sprite_shooting_left:
.byte 4,4
.byte $AA,$bd,$dd,$AA
.byte $AA,$Ab,$3d,$AA
.byte $AA,$A7,$b7,$AA
.byte $AA,$56,$56,$AA

View File

@ -179,12 +179,14 @@ done_intro:
;============================
; init vars
; jsr init_state
jsr init_vars
;============================
; set up initial location
lda #LOAD_DUKE1
lda #LOAD_DUKE2
sta WHICH_LOAD ; start at first level
rts
@ -204,7 +206,7 @@ done_intro:
.include "gr_fast_clear.s"
.include "text_print.s"
; .include "init_state.s"
.include "init_vars.s"
; .include "graphics_title/title_graphics.inc"
; .include "lc_detect.s"

339
duke/enemies_level2.s Normal file
View File

@ -0,0 +1,339 @@
NUM_ENEMIES = 4
;=======================
; laser enemies
;=======================
; see if laser hits any enemies
laser_enemies:
ldy #0
laser_enemies_loop:
; see if out
lda enemy_data+ENEMY_DATA_OUT,Y
beq done_laser_enemy
; get local tilemap co-ord
sec
lda enemy_data+ENEMY_DATA_TILEX,Y
sbc TILEMAP_X
sta TILE_TEMP
sec
lda enemy_data+ENEMY_DATA_TILEY,Y
sbc TILEMAP_Y
asl
asl
asl
asl
clc
adc TILE_TEMP
cmp LASER_TILE
bne done_laser_enemy
; hit something
hit_something:
lda #0
sta LASER_OUT
sta FRAMEL
; sta enemy_data+ENEMY_DATA_OUT,Y
lda #1
sta enemy_data+ENEMY_DATA_EXPLODING,Y
jsr enemy_noise
jsr inc_score_by_10
jmp exit_laser_enemy
done_laser_enemy:
tya
clc
adc #8
tay
cpy #(NUM_ENEMIES*8)
bne laser_enemies_loop
exit_laser_enemy:
rts
;=======================
; move enemy
;=======================
; which one is in Y
move_enemy:
lda enemy_data+ENEMY_DATA_TYPE,Y
and #$fc
cmp #ENEMY_CAMERA
beq aim_camera
; FIXME: actually move them
move_bot:
move_crawler:
lda FRAMEL
and #$f
bne done_move_enemy
lda enemy_data+ENEMY_DATA_TYPE,Y
eor #$2
sta enemy_data+ENEMY_DATA_TYPE,Y
jmp done_move_enemy
aim_camera:
lda DUKE_X
lsr
clc
adc TILEMAP_X
cmp enemy_data+ENEMY_DATA_TILEX,Y
bcc aim_camera_left
aim_camera_right:
lda #2
sta enemy_data+ENEMY_DATA_TYPE,Y
jmp done_move_enemy
aim_camera_left:
lda #0
sta enemy_data+ENEMY_DATA_TYPE,Y
done_move_enemy:
rts
;=======================
; draw and move enemies
;=======================
draw_enemies:
ldy #0
draw_enemies_loop:
; see if out
lda enemy_data+ENEMY_DATA_OUT,Y
beq done_draw_enemy
; check if on screen
lda TILEMAP_X
cmp enemy_data+ENEMY_DATA_TILEX,Y
bcs done_draw_enemy
clc
adc #14
cmp enemy_data+ENEMY_DATA_TILEX,Y
bcc done_draw_enemy
lda TILEMAP_Y
cmp enemy_data+ENEMY_DATA_TILEY,Y
bcs done_draw_enemy
clc
adc #10
cmp enemy_data+ENEMY_DATA_TILEY,Y
bcc done_draw_enemy
; set X and Y value
; convert tile values to X,Y
; X = (ENEMY_TILE_X-TILEX)*2 + 6
lda enemy_data+ENEMY_DATA_TILEX,Y
sec
sbc TILEMAP_X
asl
clc
adc #4
sta XPOS
; Y = (ENEMY_TILE_Y-TILEY)*4
lda enemy_data+ENEMY_DATA_TILEY,Y
sec
sbc TILEMAP_Y
asl
asl
sta YPOS
; see if exploding
lda enemy_data+ENEMY_DATA_EXPLODING,Y
beq draw_proper_enemy
draw_exploding_enemy:
asl
tax
lda enemy_explosion_sprites,X
sta INL
lda enemy_explosion_sprites+1,X
sta INH
lda FRAMEL
and #$3
bne done_exploding
; move to next frame
lda enemy_data+ENEMY_DATA_EXPLODING,Y
clc
adc #1
sta enemy_data+ENEMY_DATA_EXPLODING,Y
cmp #4
bne done_exploding
lda #0
sta enemy_data+ENEMY_DATA_OUT,Y
done_exploding:
jmp draw_enemy
; otherwise draw proper sprite
draw_proper_enemy:
lda enemy_data+ENEMY_DATA_TYPE,Y
tax
lda enemy_sprites,X
sta INL
lda enemy_sprites+1,X
sta INH
draw_enemy:
tya
pha
jsr put_sprite_crop
pla
tay
jsr move_enemy
done_draw_enemy:
tya
clc
adc #8
tay
cpy #(NUM_ENEMIES*8)
beq exit_draw_enemy
jmp draw_enemies_loop
exit_draw_enemy:
rts
enemy_sprites:
.word enemy_camera_sprite1
.word enemy_camera_sprite2
.word enemy_crawler_sprite1
.word enemy_crawler_sprite2
.word enemy_bot_sprite1
.word enemy_bot_sprite2
enemy_bot_sprite1:
.byte 2,2
.byte $Ae,$e3
.byte $6e,$0e
enemy_bot_sprite2:
.byte 2,2
.byte $e3,$Ae
.byte $0e,$6e
enemy_crawler_sprite1:
.byte 2,2
.byte $f5,$cA
.byte $f5,$Ac
enemy_crawler_sprite2:
.byte 2,2
.byte $5f,$cA
.byte $5f,$Ac
enemy_camera_sprite1:
.byte 2,2
.byte $AA,$76
.byte $f7,$A5
enemy_camera_sprite2:
.byte 2,2
.byte $76,$AA
.byte $A5,$f7
enemy_explosion_sprites:
.word enemy_explosion_sprite1
.word enemy_explosion_sprite1
.word enemy_explosion_sprite2
.word enemy_explosion_sprite3
enemy_explosion_sprite1:
.byte 2,2
.byte $d9,$d9
.byte $9d,$9d
enemy_explosion_sprite2:
.byte 2,2
.byte $9A,$9A
.byte $A9,$A9
enemy_explosion_sprite3:
.byte 2,2
.byte $7A,$5A
.byte $A5,$A7
ENEMY_CAMERA = 0
ENEMY_CRAWLER = 4
ENEMY_BOT = 8
ENEMY_DATA_OUT = 0
ENEMY_DATA_EXPLODING = 1
ENEMY_DATA_TYPE = 2
ENEMY_DATA_DIRECTION = 3
ENEMY_DATA_TILEX = 4
ENEMY_DATA_TILEY = 5
ENEMY_DATA_X = 6
ENEMY_DATA_Y = 7
enemy_data:
enemy0:
; 156,92 (-80,-12) -> 76,80 -> (/4,/4) -> 19,20
.byte 1 ; out
.byte 0 ; exploding
.byte ENEMY_CAMERA ; type
.byte $ff ; direction
.byte 19,20 ; tilex,tiley
.byte 0,0 ; x,y
enemy1:
; 272,92 (-80,-12) -> 192,80 -> (/4,/4) -> 48,20
.byte 1 ; out
.byte 0 ; exploding
.byte ENEMY_CAMERA ; type
.byte $ff ; direction
.byte 48,20 ; tilex,tiley
.byte 0,0 ; x,y
enemy2:
; 156,112 (-80,-12) -> 76,100 -> (/4,/4) -> 19,25
.byte 1 ; out
.byte 0 ; exploding
.byte ENEMY_CRAWLER ; type
.byte $ff ; direction
.byte 19,25 ; tilex,tiley
.byte 0,0 ; x,y
enemy3:
; 184,116 (-80,-12) -> 104,104 -> (/4,/4) -> 26,26
.byte 1 ; out
.byte 0 ; exploding
.byte ENEMY_BOT ; type
.byte $ff ; direction
.byte 26,26 ; tilex,tiley
.byte 0,0 ; x,y

View File

@ -54,8 +54,6 @@ loader_start:
jsr init ; unhook DOS, init nibble table
jsr init_vars
;===================================================
;===================================================
; SETUP THE FILENAME

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB