diff --git a/duke/TODO b/duke/TODO index 3fe5a33f..2e2061ee 100644 --- a/duke/TODO +++ b/duke/TODO @@ -6,11 +6,13 @@ fancier PC-style sounds movement: ~~~~~~~~~ -collision detection up (hit head on jump) +* collision detection up (hit head on jump) * when land from jump, stop walking -walking right into objects, stand back one more -can keep walking in collision, just don't move -enemies +walking right into objects, stand back one more (maybe and to mask?) +* can keep walking in collision, just don't move + +level1: +~~~~~~~ exit door, blue pillar, red key (all in basement?) diff --git a/duke/maps/level1_map.png b/duke/maps/level1_map.png index b1e3aab5..e5e10a8d 100644 Binary files a/duke/maps/level1_map.png and b/duke/maps/level1_map.png differ diff --git a/duke/move_duke.s b/duke/move_duke.s index aa1dfdde..4da6a378 100644 --- a/duke/move_duke.s +++ b/duke/move_duke.s @@ -3,11 +3,16 @@ DUKE_SPEED = $80 YDEFAULT = 20 +HARD_TILES = 32 ; start at 32 + ;========================= ; move duke ;========================= move_duke: + lda #0 + sta SUPPRESS_WALK + jsr duke_get_feet_location ; get location of feet jsr check_falling ; check for/handle falling @@ -19,6 +24,9 @@ move_duke: lda DUKE_WALKING beq done_move_duke + lda SUPPRESS_WALK + bne done_move_duke + lda DUKE_DIRECTION bmi move_left @@ -94,10 +102,38 @@ done_move_duke: ;========================= ; duke collide ;========================= - ; only check above head if jumping duke_collide: + ;=================== + ; collide with head + ;=================== + + ; only check above head if jumping + lda DUKE_JUMPING + beq collide_left_right + + lda DUKE_FOOT_OFFSET + sec + sbc #16 ; above head is -2 rows + tax + + lda TILEMAP,X + + ; if tile# < HARD_TILES then we are fine + cmp #HARD_TILES + bcc collide_left_right ; blt + + lda #0 + sta DUKE_JUMPING + lda #1 + sta DUKE_FALLING + +collide_left_right: + ;=================== + ; collide left/right + ;=================== + lda DUKE_DIRECTION beq done_duke_collide @@ -106,34 +142,34 @@ duke_collide: check_right_collide: lda DUKE_FOOT_OFFSET clc - adc #1 ; underfoot is on next row (+16) + adc #1 ; right is one to right tax lda TILEMAP,X - ; if tile# < 32 then we are fine - cmp #32 + ; if tile# < HARD_TILES then we are fine + cmp #HARD_TILES bcc done_duke_collide ; blt - lda #0 ; - sta DUKE_WALKING + lda #1 ; + sta SUPPRESS_WALK jmp done_duke_collide check_left_collide: lda DUKE_FOOT_OFFSET sec - sbc #1 ; underfoot is on next row (+16) + sbc #1 ; left is one to left tax lda TILEMAP,X - ; if tile# < 32 then we are fine - cmp #32 + ; if tile# < HARD_TILES then we are fine + cmp #HARD_TILES bcc done_duke_collide ; blt - lda #0 ; - sta DUKE_WALKING + lda #1 + sta SUPPRESS_WALK jmp done_duke_collide done_duke_collide: @@ -244,8 +280,8 @@ check_falling: tax lda TILEMAP,X - ; if tile# < 32 then we fall - cmp #32 + ; if tile# < HARD_TILES then we fall + cmp #HARD_TILES bcs feet_on_ground ; bge ;======================= diff --git a/duke/zp.inc b/duke/zp.inc index 8534f165..5335be76 100644 --- a/duke/zp.inc +++ b/duke/zp.inc @@ -110,6 +110,7 @@ UPDATE_STATUS = $94 DUKE_FALLING = $95 DUKE_SHOOTING = $96 KICK_UP_DUST = $97 +SUPPRESS_WALK = $98 ; done game puzzle state