From 75fcf81a919bff3102f3d338a8c985b8ef147115 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 14 Dec 2020 16:01:47 -0500 Subject: [PATCH] duke: redraw sprites, and more sprites a bit shorter which makes math easier --- duke/Makefile | 2 +- duke/draw_duke.s | 470 +++++++++++++++----------------------------- duke/duke.s | 14 ++ duke/handle_laser.s | 3 +- duke/keyboard.s | 5 +- duke/move_duke.s | 295 +++++++++++++++++++++++++++ duke/zp.inc | 1 + 7 files changed, 473 insertions(+), 317 deletions(-) create mode 100644 duke/move_duke.s diff --git a/duke/Makefile b/duke/Makefile index d7c53a3b..056e9819 100644 --- a/duke/Makefile +++ b/duke/Makefile @@ -45,7 +45,7 @@ duke.o: duke.s zp.inc hardware.inc duke.s \ print_help.s gr_fast_clear.s \ graphics/duke_graphics.inc \ maps/level1_map.lzsa \ - status_bar.s draw_duke.s gr_putsprite_crop.s \ + status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \ draw_tilemap.s \ sound_effects.s \ keyboard.s handle_laser.s diff --git a/duke/draw_duke.s b/duke/draw_duke.s index 123fc5fc..e6e44691 100644 --- a/duke/draw_duke.s +++ b/duke/draw_duke.s @@ -1,301 +1,4 @@ -DUKE_SPEED = $80 - - ;========================= - ; move duke - ;========================= -move_duke: - - jsr duke_get_feet_location ; get location of feet - - jsr check_falling ; check for/handle falling - - jsr duke_collide ; check for right/left collision - - jsr handle_jumping ; handle jumping - - lda DUKE_WALKING - beq done_move_duke - - lda DUKE_DIRECTION - bmi move_left - - lda DUKE_X - cmp #22 - bcc duke_walk_right - -duke_scroll_right: - - clc - lda DUKE_XL - adc #DUKE_SPEED - sta DUKE_XL - bcc skip_duke_scroll_right - - inc TILEMAP_X - - jsr copy_tilemap_subset - -skip_duke_scroll_right: - - jmp done_move_duke - -duke_walk_right: - lda DUKE_XL - clc - adc #DUKE_SPEED - sta DUKE_XL - bcc dwr_noflo - inc DUKE_X -dwr_noflo: - jmp done_move_duke - -move_left: - - lda DUKE_X - cmp #14 - bcs duke_walk_left - -duke_scroll_left: - - sec - lda DUKE_XL - sbc #DUKE_SPEED - sta DUKE_XL - bcs skip_duke_scroll_left - - dec TILEMAP_X - - jsr copy_tilemap_subset - -skip_duke_scroll_left: - - jmp done_move_duke - -duke_walk_left: - - lda DUKE_XL - sec - sbc #DUKE_SPEED - sta DUKE_XL - bcs dwl_noflo - dec DUKE_X -dwl_noflo: - jmp done_move_duke - -done_move_duke: - - rts - - - - ;========================= - ; duke collide - ;========================= - ; only check above head if jumping - -duke_collide: - - lda DUKE_DIRECTION - beq done_duke_collide - - bmi check_left_collide - -check_right_collide: - lda DUKE_FOOT_OFFSET - clc - adc #1 ; underfoot is on next row (+16) - - tax - lda TILEMAP,X - - ; if tile# < 32 then we are fine - cmp #32 - bcc done_duke_collide ; blt - - lda #0 ; - sta DUKE_WALKING - jmp done_duke_collide - -check_left_collide: - - lda DUKE_FOOT_OFFSET - sec - sbc #1 ; underfoot is on next row (+16) - - tax - lda TILEMAP,X - - ; if tile# < 32 then we are fine - cmp #32 - bcc done_duke_collide ; blt - - lda #0 ; - sta DUKE_WALKING - jmp done_duke_collide - -done_duke_collide: - rts - - - - ;========================= - ; check_jumping - ;========================= -handle_jumping: - - lda DUKE_JUMPING - beq done_handle_jumping - - dec DUKE_Y - dec DUKE_Y - dec DUKE_JUMPING - bne done_handle_jumping - lda #1 ; avoid gap before falling triggered - sta DUKE_FALLING - - -done_handle_jumping: - rts - - - - - ;======================= - ; duke_get_feet_location - ;======================= - - ; xx 0 - ; xx 1 - ; xx 0 xx 2 - ; xx 1 xx 3 - ;------ ----- - ; xx 2 xx 4 - ; xx 3 xx 5 - ; xx 4 xx 6 - ; xx 5 xx 7 - ;------ ------- - ; xx 6 xx 8 - ; xx 7 xx 9 - ; xx 8 - ; xx 9 - ;----------------------- -duke_get_feet_location: - - ; this is tricky as we are 10 tall but tiles are 4 tall - - ; + 1 is because sprite is 4 pixels wide? - - ; screen is 16 wide, but ofsset 4 in - - ; block index of foot is (feet approximately 8 lower than Y) - ; INT((y+8)/4)*16 + (x-4+1/2) - - ; if 18,18 -> INT(26/4)*16 = 96 + 7 = 103 = 6R7 - - ; 0 = 32 (2) - ; 1 = 32 (2) - ; 2 = 32 (2) - ; 3 = 32 (2) - ; 4 = 48 (3) - ; 5 = 48 (3) - ; 6 = 48 (3) - ; 7 = 48 (3) - - lda DUKE_Y - - clc - adc #6 ; +8 - - lsr ; / 4 (INT) - lsr - - asl ; *4 - asl - asl - asl - - sta DUKE_FOOT_OFFSET - - sec - lda DUKE_X - sbc #3 - lsr ; (x-3)/2 - - clc - adc DUKE_FOOT_OFFSET - sta DUKE_FOOT_OFFSET - - rts - - - ;========================= - ; check_falling - ;========================= -check_falling: - - lda DUKE_JUMPING - bne done_check_falling ; don't check falling if jumping - - lda DUKE_FOOT_OFFSET - clc - adc #16 ; underfoot is on next row (+16) - - tax - lda TILEMAP,X - - ; if tile# < 32 then we fall - cmp #32 - bcs feet_on_ground ; bge - - ;======================= - ; falling - - lda #1 - sta DUKE_FALLING - - ; scroll but only if Y>=18 - - lda DUKE_Y - cmp #18 - bcs scroll_fall ; bge - - inc DUKE_Y - inc DUKE_Y - jmp done_check_falling - - -scroll_fall: - inc TILEMAP_Y - - jsr copy_tilemap_subset - jmp done_check_falling - -feet_on_ground: - - ; clear falling - lda #0 - sta DUKE_FALLING - - ; check to see if Y still hi, if so scroll back down - - lda DUKE_Y - cmp #18 - bcs done_check_falling ; bge - - ; too high up on screen, adjust down and also adjust tilemap down - - inc DUKE_Y - inc DUKE_Y - dec TILEMAP_Y ; share w above? - jsr copy_tilemap_subset - -done_check_falling: - rts - - - - ;========================= ; draw duke ;========================= @@ -309,35 +12,176 @@ draw_duke: lda DUKE_DIRECTION bmi duke_facing_left - lda #duke_sprite_falling_right + jmp actually_draw_duke + +check_jumping_right: + lda DUKE_JUMPING + beq check_shooting_right +draw_jumping_right: + ldx #duke_sprite_jumping_right + jmp actually_draw_duke + +check_shooting_right: + lda DUKE_SHOOTING + beq check_walking_right +draw_shooting_right: + ldx #duke_sprite_shooting_right + jmp actually_draw_duke + +check_walking_right: + lda DUKE_WALKING + beq draw_standing_right +draw_walking_right: + lda FRAMEL + and #$02 + beq draw_standing_right + + ldx #duke_sprite_walking_right + jmp actually_draw_duke + +draw_standing_right: + ldx #duke_sprite_stand_right jmp actually_draw_duke + + + ;================== + ; facing left duke_facing_left: - lda #duke_sprite_falling_left + jmp actually_draw_duke + +check_jumping_left: + lda DUKE_JUMPING + beq check_shooting_left +draw_jumping_left: + ldx #duke_sprite_jumping_left + jmp actually_draw_duke + +check_shooting_left: + lda DUKE_SHOOTING + beq check_walking_left +draw_shooting_left: + ldx #duke_sprite_shooting_left + jmp actually_draw_duke + +check_walking_left: + lda DUKE_WALKING + beq draw_standing_left +draw_walking_left: + lda FRAMEL + and #$02 + beq draw_standing_left + + ldx #duke_sprite_walking_left + jmp actually_draw_duke + +draw_standing_left: + ldx #duke_sprite_stand_left + jmp actually_draw_duke + + + ;==================== + ; actually draw actually_draw_duke: + stx INL sta INH jsr put_sprite_crop rts duke_sprite_stand_right: - .byte 4,5 - .byte $AA,$dA,$dA,$AA - .byte $AA,$dd,$bb,$AA - .byte $AA,$b3,$7A,$7A - .byte $AA,$66,$6b,$AA - .byte $AA,$56,$65,$AA + .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,5 - .byte $AA,$dA,$dA,$AA - .byte $AA,$bb,$dd,$AA - .byte $7A,$7A,$b3,$AA - .byte $AA,$6b,$66,$AA - .byte $AA,$65,$56,$AA + .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,$d3,$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,$d3,$AA + .byte $AA,$A7,$b7,$AA + .byte $AA,$56,$56,$AA diff --git a/duke/duke.s b/duke/duke.s index 840b7402..bbafa9e8 100644 --- a/duke/duke.s +++ b/duke/duke.s @@ -42,6 +42,7 @@ duke_start: sta SCORE2 sta INVENTORY sta DUKE_FALLING + sta DUKE_SHOOTING lda #$10 sta SCORE0 @@ -136,6 +137,16 @@ duke_loop: jsr move_laser + + ;======================== + ; increment frame count + ;======================== + + inc FRAMEL + bne no_frame_oflo + inc FRAMEH +no_frame_oflo: + ;=========================== ; check end of level ;=========================== @@ -146,6 +157,8 @@ duke_loop: jmp done_with_duke + + do_duke_loop: ; delay @@ -181,6 +194,7 @@ done_with_duke: .include "print_help.s" .include "draw_duke.s" + .include "move_duke.s" .include "handle_laser.s" .include "draw_tilemap.s" diff --git a/duke/handle_laser.s b/duke/handle_laser.s index c10198ec..e92c2a5a 100644 --- a/duke/handle_laser.s +++ b/duke/handle_laser.s @@ -56,5 +56,6 @@ done_draw_laser: laser_sideways_sprite: .byte 4,1 - .byte $3A,$cA,$3A,$cA +; .byte $3A,$cA,$3A,$cA + .byte $A3,$Ac,$A3,$Ac diff --git a/duke/keyboard.s b/duke/keyboard.s index adf9aa11..a70a9310 100644 --- a/duke/keyboard.s +++ b/duke/keyboard.s @@ -1,3 +1,4 @@ +JUMP_HEIGHT = 9 ;============================== ; Handle Keypress @@ -195,7 +196,7 @@ space_pressed: lda DUKE_FALLING bne done_keypress ; don't jump if falling - lda #7 + lda #JUMP_HEIGHT sta DUKE_JUMPING jsr jump_noise @@ -226,7 +227,7 @@ laser_left: laser_right: lda DUKE_X clc - adc #3 + adc #2 laser_assign: sta LASER_X diff --git a/duke/move_duke.s b/duke/move_duke.s new file mode 100644 index 00000000..5307da31 --- /dev/null +++ b/duke/move_duke.s @@ -0,0 +1,295 @@ + +DUKE_SPEED = $80 + +YDEFAULT = 20 + + ;========================= + ; move duke + ;========================= +move_duke: + + jsr duke_get_feet_location ; get location of feet + + jsr check_falling ; check for/handle falling + + jsr duke_collide ; check for right/left collision + + jsr handle_jumping ; handle jumping + + lda DUKE_WALKING + beq done_move_duke + + lda DUKE_DIRECTION + bmi move_left + + lda DUKE_X + cmp #22 + bcc duke_walk_right + +duke_scroll_right: + + clc + lda DUKE_XL + adc #DUKE_SPEED + sta DUKE_XL + bcc skip_duke_scroll_right + + inc TILEMAP_X + + jsr copy_tilemap_subset + +skip_duke_scroll_right: + + jmp done_move_duke + +duke_walk_right: + lda DUKE_XL + clc + adc #DUKE_SPEED + sta DUKE_XL + bcc dwr_noflo + inc DUKE_X +dwr_noflo: + jmp done_move_duke + +move_left: + + lda DUKE_X + cmp #14 + bcs duke_walk_left + +duke_scroll_left: + + sec + lda DUKE_XL + sbc #DUKE_SPEED + sta DUKE_XL + bcs skip_duke_scroll_left + + dec TILEMAP_X + + jsr copy_tilemap_subset + +skip_duke_scroll_left: + + jmp done_move_duke + +duke_walk_left: + + lda DUKE_XL + sec + sbc #DUKE_SPEED + sta DUKE_XL + bcs dwl_noflo + dec DUKE_X +dwl_noflo: + jmp done_move_duke + +done_move_duke: + + rts + + + + ;========================= + ; duke collide + ;========================= + ; only check above head if jumping + +duke_collide: + + lda DUKE_DIRECTION + beq done_duke_collide + + bmi check_left_collide + +check_right_collide: + lda DUKE_FOOT_OFFSET + clc + adc #1 ; underfoot is on next row (+16) + + tax + lda TILEMAP,X + + ; if tile# < 32 then we are fine + cmp #32 + bcc done_duke_collide ; blt + + lda #0 ; + sta DUKE_WALKING + jmp done_duke_collide + +check_left_collide: + + lda DUKE_FOOT_OFFSET + sec + sbc #1 ; underfoot is on next row (+16) + + tax + lda TILEMAP,X + + ; if tile# < 32 then we are fine + cmp #32 + bcc done_duke_collide ; blt + + lda #0 ; + sta DUKE_WALKING + jmp done_duke_collide + +done_duke_collide: + rts + + + + ;========================= + ; check_jumping + ;========================= +handle_jumping: + + lda DUKE_JUMPING + beq done_handle_jumping + + dec DUKE_Y + dec DUKE_Y + dec DUKE_JUMPING + bne done_handle_jumping + lda #1 ; avoid gap before falling triggered + sta DUKE_FALLING + + +done_handle_jumping: + rts + + + + + ;======================= + ; duke_get_feet_location + ;======================= + + ; xx 0 + ; xx 1 + ;------ ----- + ; xx 0 xx 2 + ; xx 1 xx 3 + ; xx 2 xx 4 + ; xx 3 xx 5 + ;------ ------- + ; xx 4 xx 6 + ; xx 5 xx 7 + ; xx 6 + ; xx 7 + ;----------------------- +duke_get_feet_location: + + ; + 1 is because sprite is 4 pixels wide? + + ; screen is 16 wide, but ofsset 4 in + + ; block index of foot is (feet approximately 8 lower than Y) + ; INT((y+4)/4)*16 + (x-4+1/2) + + ; FIXME: if 18,18 -> INT(26/4)*16 = 96 + 7 = 103 = 6R7 + + ; 0 = 32 (2) + ; 1 = 32 (2) + ; 2 = 32 (2) + ; 3 = 32 (2) + ; 4 = 48 (3) + ; 5 = 48 (3) + ; 6 = 48 (3) + ; 7 = 48 (3) + + lda DUKE_Y + + clc + adc #6 ; +4 + + lsr ; / 4 (INT) + lsr + + asl ; *4 + asl + asl + asl + + sta DUKE_FOOT_OFFSET + + sec + lda DUKE_X + sbc #3 + lsr ; (x-3)/2 + + clc + adc DUKE_FOOT_OFFSET + sta DUKE_FOOT_OFFSET + + rts + + + ;========================= + ; check_falling + ;========================= +check_falling: + + lda DUKE_JUMPING + bne done_check_falling ; don't check falling if jumping + + lda DUKE_FOOT_OFFSET + clc + adc #16 ; underfoot is on next row (+16) + + tax + lda TILEMAP,X + + ; if tile# < 32 then we fall + cmp #32 + bcs feet_on_ground ; bge + + ;======================= + ; falling + + lda #1 + sta DUKE_FALLING + + ; scroll but only if Y>=20 (YDEFAULT) + + lda DUKE_Y + cmp #YDEFAULT + bcs scroll_fall ; bge + + inc DUKE_Y + inc DUKE_Y + jmp done_check_falling + + +scroll_fall: + inc TILEMAP_Y + + jsr copy_tilemap_subset + jmp done_check_falling + +feet_on_ground: + + ; clear falling + lda #0 + sta DUKE_FALLING + + ; check to see if Y still hi, if so scroll back down + + lda DUKE_Y + cmp #YDEFAULT + bcs done_check_falling ; bge + + ; too high up on screen, adjust down and also adjust tilemap down + + inc DUKE_Y + inc DUKE_Y + dec TILEMAP_Y ; share w above? + jsr copy_tilemap_subset + +done_check_falling: + rts + + + diff --git a/duke/zp.inc b/duke/zp.inc index 8f3d1dc9..82ae3f86 100644 --- a/duke/zp.inc +++ b/duke/zp.inc @@ -108,6 +108,7 @@ SCORE2 = $93 UPDATE_STATUS = $94 DUKE_FALLING = $95 +DUKE_SHOOTING = $96 ; done game puzzle state