diff --git a/games/peasant_mini/cliff/Makefile b/games/peasant_mini/cliff/Makefile index 1258c0a6..c48ea89d 100644 --- a/games/peasant_mini/cliff/Makefile +++ b/games/peasant_mini/cliff/Makefile @@ -47,10 +47,16 @@ CLIMB: climb.o climb.o: climb.s zx02_optim.s \ move_peasant_climb.s draw_peasant_climb.s \ + keyboard_climb.s \ hgr_copy.s hgr_partial_restore.s \ hgr_sprite.s hgr_sprite_bg_mask.s \ random16.s \ cliff_graphics/cliff_base.hgr.zx02 \ + cliff_graphics/cliff2.hgr.zx02 \ + cliff_graphics/cliff3.hgr.zx02 \ + cliff_graphics/cliff_base_priority.zx02 \ + cliff_graphics/cliff2_priority.zx02 \ + cliff_graphics/cliff3_priority.zx02 \ sprites/enemy_sprites.inc \ zp.inc hardware.inc \ climbing_sprites.zx02 diff --git a/games/peasant_mini/cliff/climb.s b/games/peasant_mini/cliff/climb.s index 90d49c05..a9f261a5 100644 --- a/games/peasant_mini/cliff/climb.s +++ b/games/peasant_mini/cliff/climb.s @@ -37,6 +37,7 @@ cliff_climb: sta ERASE_SPRITE_COUNT sta PEASANT_STEPS sta FLAME_COUNT + sta CLIMB_COUNT lda #10 sta PEASANT_X @@ -411,7 +412,7 @@ done_cliff: .include "zx02_optim.s" - .include "keyboard.s" + .include "keyboard_climb.s" .include "draw_peasant_climb.s" @@ -426,11 +427,17 @@ done_cliff: .include "random16.s" + .include "gr_offsets.s" + bg_data: .incbin "cliff_graphics/cliff_base.hgr.zx02" + .incbin "cliff_graphics/cliff2.hgr.zx02" + .incbin "cliff_graphics/cliff3.hgr.zx02" priority_data: .incbin "cliff_graphics/cliff_base_priority.zx02" + .incbin "cliff_graphics/cliff2_priority.zx02" + .incbin "cliff_graphics/cliff3_priority.zx02" sprites: .include "sprites/enemy_sprites.inc" diff --git a/games/peasant_mini/cliff/draw_peasant_climb.s b/games/peasant_mini/cliff/draw_peasant_climb.s index 77794c70..8f0b83e6 100644 --- a/games/peasant_mini/cliff/draw_peasant_climb.s +++ b/games/peasant_mini/cliff/draw_peasant_climb.s @@ -20,7 +20,7 @@ draw_peasant_climb: ldx PEASANT_DIR lda peasant_climb_offsets,X clc - adc PEASANT_STEPS + adc CLIMB_COUNT tax ldy #4 ; reserved for peasant diff --git a/games/peasant_mini/cliff/keyboard_climb.s b/games/peasant_mini/cliff/keyboard_climb.s new file mode 100644 index 00000000..d45ee70d --- /dev/null +++ b/games/peasant_mini/cliff/keyboard_climb.s @@ -0,0 +1,118 @@ + + ;========================== + ; check keyboard + ; for climbig part + ;========================== + + ; note, this is different from the rest of the game + + ; pushing l/r/u/d only does one 5-frame animation of movement + ; + ; pressing another key while movement underway does not + ; cancel/override + ; + ; holding down key just restarts from scratch + +check_keyboard: + + lda KEYPRESS + bmi key_was_pressed + rts + +key_was_pressed: + inc SEEDL ; ???? + + and #$5f ; strip off high bit and make uppercase + + ;=========================== + ; check moving + ;=========================== + ; only start moving if currently not +check_moving: + ldx CLIMB_COUNT + beq check_left + +done_check_moving: + jmp done_check_keyboard + + + ;========================== + ; Left + ;========================== +check_left: + cmp #$8 + beq left_pressed + cmp #'A' + bne check_right +left_pressed: + + lda #PEASANT_DIR_LEFT + sta PEASANT_DIR + lda #$FF + sta PEASANT_XADD + bne done_keyboard_reset ; bra + +check_right: + cmp #$15 + beq right_pressed + cmp #'D' + bne check_up +right_pressed: + + lda #PEASANT_DIR_RIGHT + sta PEASANT_DIR + lda #$1 + sta PEASANT_XADD + + bne done_keyboard_reset ; bra + +check_up: + cmp #'W' + beq up_pressed + cmp #$0B + bne check_down + +up_pressed: + + lda #PEASANT_DIR_UP + sta PEASANT_DIR + lda #$FC + sta PEASANT_YADD + + bne done_keyboard_reset ; bra + +check_down: + cmp #'S' + beq down_pressed + cmp #$0A + bne check_enter + +down_pressed: + + lda #PEASANT_DIR_DOWN + sta PEASANT_DIR + lda #$4 + sta PEASANT_YADD + + bne done_keyboard_reset ; bra + +check_enter: + cmp #13 + beq enter_pressed + cmp #' ' + bne done_check_keyboard +enter_pressed: + + +done_keyboard_reset: + lda #4 + sta CLIMB_COUNT ; start climbing + + bit KEYRESET + +done_check_keyboard: + +; bit KEYRESET ; should we? + + rts + diff --git a/games/peasant_mini/cliff/move_peasant.s b/games/peasant_mini/cliff/move_peasant.s index e79eb103..a98f7226 100644 --- a/games/peasant_mini/cliff/move_peasant.s +++ b/games/peasant_mini/cliff/move_peasant.s @@ -5,7 +5,7 @@ move_peasant: ; redraw peasant if moved lda PEASANT_XADD - ora PEASANT_YADD + ora PEASANT_YADD ; sneaky way to see if both nonzero bne really_move_peasant jmp peasant_the_same diff --git a/games/peasant_mini/cliff/move_peasant_climb.s b/games/peasant_mini/cliff/move_peasant_climb.s index a6c028ed..0f0bea6f 100644 --- a/games/peasant_mini/cliff/move_peasant_climb.s +++ b/games/peasant_mini/cliff/move_peasant_climb.s @@ -4,20 +4,22 @@ move_peasant: ; redraw peasant if moved - lda PEASANT_XADD - ora PEASANT_YADD + lda CLIMB_COUNT bne really_move_peasant jmp peasant_the_same really_move_peasant: - ; increment step count, wrapping at 4 + ; decrement climb count - inc PEASANT_STEPS - lda PEASANT_STEPS - and #3 - sta PEASANT_STEPS + dec CLIMB_COUNT + bne climb_continue +climb_stop: + + jsr stop_peasant + +climb_continue: ; restore bg behind peasant @@ -37,10 +39,12 @@ really_move_peasant: lda PEASANT_X adc PEASANT_XADD ; A = new X - bmi peasant_x_negative ; if newx <0, handle + ; in theory this can't happen when climbing - cmp #40 - bcs peasant_x_toobig ; if newx>=40, hanfle (bge) +; bmi peasant_x_negative ; if newx <0, handle + +; cmp #40 +; bcs peasant_x_toobig ; if newx>=40, handle (bge) ;====================================== @@ -68,28 +72,28 @@ really_move_peasant: jmp do_move_peasant_y ;============================ -peasant_x_toobig: +;peasant_x_toobig: - jsr move_map_east +; jsr move_map_east - lda #0 ; new X location +; lda #0 ; new X location - jmp done_movex +; jmp done_movex ;============================ -peasant_x_negative: +;peasant_x_negative: - jsr move_map_west +; jsr move_map_west - lda #39 ; new X location +; lda #39 ; new X location - jmp done_movex +; jmp done_movex ; check edge of screen -done_movex: +;done_movex: ; if we get here we changed screens - sta PEASANT_X ; update new location - jmp peasant_the_same ; skip checking for Y collision +; sta PEASANT_X ; update new location +; jmp peasant_the_same ; skip checking for Y collision @@ -100,9 +104,12 @@ do_move_peasant_y: lda PEASANT_Y adc PEASANT_YADD ; newy in A - cmp #45 ; if <45 then off screen + cmp #12 ; if <12 then off screen bcc peasant_y_negative ; blt + + ; FIXME: in theory can never go down + cmp #160 ; if >=150 then off screen bcs peasant_y_toobig ; bge @@ -130,7 +137,7 @@ peasant_y_toobig: jsr move_map_south - lda #45 ; new X location + lda #12 ; new Y location jmp done_movey @@ -140,7 +147,7 @@ peasant_y_negative: jsr move_map_north - lda #160 ; new X location + lda #160 ; new Y location jmp done_movey @@ -254,5 +261,9 @@ move_map_south: rts -.include "gr_offsets.s" - +stop_peasant: + lda #0 + sta PEASANT_XADD + sta PEASANT_YADD + sta PEASANT_DIR ; PEASANT_UP is 0 + rts diff --git a/games/peasant_mini/cliff/zp.inc b/games/peasant_mini/cliff/zp.inc index 3684f6a6..050d19f2 100644 --- a/games/peasant_mini/cliff/zp.inc +++ b/games/peasant_mini/cliff/zp.inc @@ -271,6 +271,7 @@ CURRENT_DISK = $DC HGR_COLOR = $E4 HGR_PAGE = $E6 +CLIMB_COUNT = $ED FLAME_COUNT = $EE CURRENT_ROCK = $EF ERASE_SPRITE_COUNT = $F0