diff --git a/ootw/keyboard.s b/ootw/keyboard.s index 71cfb187..9710a955 100644 --- a/ootw/keyboard.s +++ b/ootw/keyboard.s @@ -5,8 +5,8 @@ ; A or <- : start moving left ; D or -> : start moving right -; W or up : jump -; S or down : crouch or pickup +; W or up : jump or elevator/transporter up +; S or down : crouch or pickup or elevator/transporter down ; space : action ; escape : quit @@ -205,9 +205,21 @@ check_up: bne check_down up: ;======================== - ; Jump -- Up Pressed + ; UP -- Jump ;======================== + lda ON_ELEVATOR + beq up_not_elevator + +up_on_elevator: + lda #P_ELEVATING_UP + sta PHYSICIST_STATE + lda #0 + sta GAIT + jmp done_keypress + +up_not_elevator: + lda #P_JUMPING sta PHYSICIST_STATE lda #0 @@ -222,9 +234,21 @@ check_down: bne check_space ;====================== - ; Crouch + ; DOWN -- Crouch ;====================== down: + + lda ON_ELEVATOR + beq down_not_elevator + +down_on_elevator: + lda #P_ELEVATING_DOWN + sta PHYSICIST_STATE + lda #0 + sta GAIT + jmp done_keypress + +down_not_elevator: lda #P_CROUCHING sta PHYSICIST_STATE lda #0 diff --git a/ootw/ootw_c2_elevator.s b/ootw/ootw_c2_elevator.s index f85c9a96..62efd29c 100644 --- a/ootw/ootw_c2_elevator.s +++ b/ootw/ootw_c2_elevator.s @@ -45,6 +45,15 @@ elevator4: lda #3 sta eel_smc+1 + ; set up exit + lda #7 + sta going_up_smc+1 + + ; set down exit + lda #5 + sta going_down_smc+1 + + jmp elevator_setup_done elevator5: @@ -53,10 +62,60 @@ elevator5: lda #(-4+128) sta LEFT_LIMIT + lda #(21+128) + sta RIGHT_LIMIT + + ; set left exit + lda #9 + sta eel_smc+1 + + ; set up exit + lda #4 + sta going_up_smc+1 + + ; set down exit + lda #6 + sta going_down_smc+1 + + jmp elevator_setup_done + + +elevator6: + cmp #6 + bne elevator7 + + lda #(-4+128) + sta LEFT_LIMIT + lda #(21+128) + sta RIGHT_LIMIT + + ; set left exit + lda #8 + sta eel_smc+1 + + ; set up exit + lda #5 + sta going_up_smc+1 + + ; no down exit + + jmp elevator_setup_done + +elevator7: + + lda #(10+128) + sta LEFT_LIMIT lda #(30+128) sta RIGHT_LIMIT -elevator6: + ; set up exit + ; no up exit + + ; set down exit + lda #4 + sta going_down_smc+1 + + ; fallthrough elevator_setup_done: @@ -153,7 +212,66 @@ draw_elevator: elevator_frame_no_oflo: - ; check if done this level + + ;========================== + ; handle elevator + ;========================== + + lda PHYSICIST_X + cmp #17 + bcc not_on_elevator ; blt + lda #1 + bne update_elevator ; balways + +not_on_elevator: + lda #0 +update_elevator: + sta ON_ELEVATOR + + + ;========================== + ; handle elevating + ;========================== + lda PHYSICIST_STATE + +elevator_check_up: + cmp #P_ELEVATING_UP + bne elevator_check_down + +going_up: +going_up_smc: + lda #7 + sta WHICH_JAIL + + lda #0 + sta PHYSICIST_STATE + + jmp done_elevator + +elevator_check_down: + cmp #P_ELEVATING_DOWN + bne going_nowhere + +going_down: +going_down_smc: + lda #4 + sta WHICH_JAIL + + lda #0 + sta PHYSICIST_STATE + + jmp done_elevator + + + +going_nowhere: + + + + + ;========================== + ; check if done this room + ;========================== lda GAME_OVER beq still_in_elevator diff --git a/ootw/physicist.s b/ootw/physicist.s index 066995f1..c71ca2d6 100644 --- a/ootw/physicist.s +++ b/ootw/physicist.s @@ -70,6 +70,10 @@ pstate_table_lo: .byte physicist_standing .byte >physicist_walking @@ -79,6 +83,9 @@ pstate_table_hi: .byte >physicist_jumping .byte >physicist_collapsing .byte >physicist_falling + .byte >physicist_standing ; 08 swinging + .byte >physicist_standing ; 09 elevator up + .byte >physicist_standing ; 0A elevator down ; Urgh, make sure this doesn't end up at $FF or you hit the ; NMOS 6502 bug diff --git a/ootw/zp.inc b/ootw/zp.inc index cacac0b3..23b6479b 100644 --- a/ootw/zp.inc +++ b/ootw/zp.inc @@ -147,16 +147,17 @@ BOULDER_X = $E8 ; C1 BOULDER_Y = $E9 ; C1 PHYSICIST_STATE = $EA - P_STANDING = $00 - P_WALKING = $01 - P_RUNNING = $02 - P_CROUCHING = $03 - P_KICKING = $04 - P_JUMPING = $05 ; no keypress - P_COLLAPSING = $06 ; no keypress - P_FALLING = $07 ; no keypress - P_SWINGING = $08 ; no keypress - + P_STANDING = $00 + P_WALKING = $01 + P_RUNNING = $02 + P_CROUCHING = $03 + P_KICKING = $04 + P_JUMPING = $05 ; no keypress + P_COLLAPSING = $06 ; no keypress + P_FALLING = $07 ; no keypress + P_SWINGING = $08 ; no keypress + P_ELEVATING_UP = $09 + P_ELEVATING_DOWN = $0A BEFORE_SWING = $EB CUTFRAME = $EC