From 39c9c38bbffd6e4cd08086bed31e4e2ae7bd8949 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 27 Dec 2021 01:19:48 -0500 Subject: [PATCH] peasant: start moving to new background drawing code might be workable, makes animations much easier --- games/peasant/hgr_partial_save.s | 11 ++++- games/peasant/hgr_save_restore.s | 2 + games/peasant/intro_cottage.s | 5 +++ games/peasant/intro_knight.s | 2 + games/peasant/intro_lake_e.s | 2 + games/peasant/intro_lake_w.s | 2 + games/peasant/kerrek_actions.s | 77 +++++++++++++++++++++----------- games/peasant/parse_input.s | 4 ++ games/peasant/peasant1.s | 38 +++++++++------- games/peasant/qload.inc | 48 ++++++++++---------- games/peasant/trogdor_actions.s | 2 + games/peasant/zp.inc | 2 + 12 files changed, 128 insertions(+), 67 deletions(-) diff --git a/games/peasant/hgr_partial_save.s b/games/peasant/hgr_partial_save.s index 56de052a..1a50662d 100644 --- a/games/peasant/hgr_partial_save.s +++ b/games/peasant/hgr_partial_save.s @@ -13,6 +13,7 @@ hgr_partial_save: ldx BOX_Y2 stx SAVED_Y2 +.if 0 partial_save_yloop: lda hposn_low,X @@ -37,7 +38,7 @@ psx_smc2: dex cpx BOX_Y1 bcs partial_save_yloop - +.endif rts @@ -48,7 +49,12 @@ psx_smc2: ; loads from $20 ; save to $40 + ; restores from X = A<=to<=X + ; Y = SAVED_Y1 to SAVED_Y2 + hgr_partial_restore: + sta partial_restore_x1_smc+1 + stx partial_restore_x2_smc+1 ldx SAVED_Y2 @@ -64,6 +70,7 @@ partial_restore_yloop: sbc #$20 sta prx_smc1+2 +partial_restore_x2_smc: ldy #$27 partial_restore_xloop: prx_smc1: @@ -71,6 +78,8 @@ prx_smc1: prx_smc2: sta $d000,Y dey +partial_restore_x1_smc: + cpy #$00 bpl partial_restore_xloop dex diff --git a/games/peasant/hgr_save_restore.s b/games/peasant/hgr_save_restore.s index 799a089a..b2aaefe2 100644 --- a/games/peasant/hgr_save_restore.s +++ b/games/peasant/hgr_save_restore.s @@ -1,3 +1,4 @@ +.if 0 ;======================= ; HGR Save ;======================= @@ -231,3 +232,4 @@ hgr_restore_loop: hgr_restore_done: rts +.endif diff --git a/games/peasant/intro_cottage.s b/games/peasant/intro_cottage.s index b9249ec8..5ab3e527 100644 --- a/games/peasant/intro_cottage.s +++ b/games/peasant/intro_cottage.s @@ -123,6 +123,9 @@ check_cottage_action1: check_cottage_action2: cmp #1 bne check_cottage_action3 + + lda #0 + ldx #39 jsr hgr_partial_restore ; display cottage text 2 @@ -136,6 +139,8 @@ check_cottage_action2: check_cottage_action3: cmp #13 bne done_cottage_action + lda #0 + ldx #39 jsr hgr_partial_restore ; display cottage text 3 diff --git a/games/peasant/intro_knight.s b/games/peasant/intro_knight.s index 44fd8cbe..2e7f6152 100644 --- a/games/peasant/intro_knight.s +++ b/games/peasant/intro_knight.s @@ -116,6 +116,8 @@ check_knight_action1: check_knight_action2: cmp #8 bne check_knight_action3 + lda #0 + ldx #39 jsr hgr_partial_restore jmp done_knight_action diff --git a/games/peasant/intro_lake_e.s b/games/peasant/intro_lake_e.s index ece464b9..005bfa1d 100644 --- a/games/peasant/intro_lake_e.s +++ b/games/peasant/intro_lake_e.s @@ -111,6 +111,8 @@ check_lake_e_action1: check_lake_e_action2: cmp #28 bne done_lake_e_action + lda #0 + ldx #39 jsr hgr_partial_restore lda #PEASANT_DIR_UP sta PEASANT_DIR diff --git a/games/peasant/intro_lake_w.s b/games/peasant/intro_lake_w.s index 53fa0f6e..5e7bf036 100644 --- a/games/peasant/intro_lake_w.s +++ b/games/peasant/intro_lake_w.s @@ -115,6 +115,8 @@ check_lake_w_action1: check_lake_w_action2: cmp #20 bne done_lake_w_action + lda #0 + ldx #39 jsr hgr_partial_restore jsr display_lake_w_text1 diff --git a/games/peasant/kerrek_actions.s b/games/peasant/kerrek_actions.s index 0476db85..0b8cec9a 100644 --- a/games/peasant/kerrek_actions.s +++ b/games/peasant/kerrek_actions.s @@ -30,6 +30,23 @@ kerrek_no_draw: kerrek_actually_draw: + ;================= + ; erase old kerrek + ;================= + + lda PREV_Y + sta SAVED_Y1 + clc + adc #51 + sta SAVED_Y2 + + lda PREV_X + tax + inx + inx + jsr hgr_partial_restore + + ;================= ; draw kerrek body ;================= @@ -38,7 +55,8 @@ kerrek_actually_draw: beq kerrek_draw_body_left kerrek_draw_body_right: - lda KERREK_X + ldx KERREK_X + txa and #1 beq kerrek_draw_body_right_even @@ -58,26 +76,28 @@ kerrek_draw_body_right_even: kerrek_draw_body_left: + ldx KERREK_X + inx + lda KERREK_X and #1 beq kerrek_draw_body_left_even kerrek_draw_body_left_odd: - lda #kerrek_l2_sprite - jmp kerrek_draw_body_common - -kerrek_draw_body_left_even: lda #kerrek_l1_sprite + jmp kerrek_draw_body_common + +kerrek_draw_body_left_even: + lda #kerrek_l2_sprite kerrek_draw_body_common: sta INH - lda KERREK_X - sta CURSOR_X + stx CURSOR_X lda KERREK_Y sta CURSOR_Y @@ -132,22 +152,21 @@ kerrek_draw_head_left: kerrek_draw_head_left_odd: - lda #kerrek_l2_head_sprite + lda #>kerrek_l1_head_sprite jmp kerrek_draw_head_left_common kerrek_draw_head_left_even: - lda #kerrek_l1_head_sprite + lda #>kerrek_l2_head_sprite kerrek_draw_head_left_common: sta INH ldx KERREK_X - dex kerrek_draw_head_common: stx CURSOR_X @@ -182,8 +201,10 @@ kerrek_alive_out: lda #22 sta KERREK_X + sta PREV_X lda #76 sta KERREK_Y + sta PREV_Y lda #1 ; right sta KERREK_DIRECTION lda #1 @@ -301,6 +322,12 @@ kerrek_move: and #$1 bne kerrek_move_done + ; save old values + lda KERREK_X + sta PREV_X + lda KERREK_Y + sta PREV_Y + ; if kerrek_x > peasant_x, kerrek_x-- ; if kerrek_x < peasant_x, kerrek_x++ @@ -349,20 +376,18 @@ kerrek_check_collision: ; first check X - ; if (peasant_x >= kerrek_x-1) && (peasant_x<=kerrek_x+2) - ; this is roughly equivelant to |kerrek_x-peasant_x| < 2 + ; if (peasant_x >= kerrek_x) && (peasant_x<=kerrek_x+2) + + lda PEASANT_X + cmp KERREK_X + bcc kerrek_no_collision - lda KERREK_X - sec - sbc PEASANT_X - bpl kerrek_x_distance_good -kerrek_x_distance_negate: - eor #$FF clc - adc #1 -kerrek_x_distance_good: - cmp #2 - bcs kerrek_no_collision + lda KERREK_X + adc #2 + cmp PEASANT_X + bcc kerrek_no_collision + ; next check Y diff --git a/games/peasant/parse_input.s b/games/peasant/parse_input.s index 8bf78fcd..e8e7975b 100644 --- a/games/peasant/parse_input.s +++ b/games/peasant/parse_input.s @@ -717,6 +717,8 @@ finish_parse_message: restore_parse_message: + lda #0 + ldx #39 jsr hgr_partial_restore @@ -1223,6 +1225,8 @@ partial_message_step: sty OUTH jsr print_text_message jsr wait_until_keypress + lda #0 + ldx #39 jsr hgr_partial_restore rts diff --git a/games/peasant/peasant1.s b/games/peasant/peasant1.s index 328b89a4..f2a02fee 100644 --- a/games/peasant/peasant1.s +++ b/games/peasant/peasant1.s @@ -71,22 +71,7 @@ new_location: jsr load_custom_verb_table - ;===================== - ; load bg - - ; we are PEASANT1 so locations 0...4 map to 0...4, no change - - ldx MAP_LOCATION - - lda map_backgrounds_low,X - sta getsrc_smc+1 - lda map_backgrounds_hi,X - sta getsrc_smc+2 - - lda #$40 - - jsr decompress_lzsa2_fast - + ;=========================== ; load priority to $400 ; indirectly as we can't trash screen holes @@ -107,6 +92,25 @@ new_location: jsr gr_copy_to_page1 + ;===================== + ; load bg + + ; we are PEASANT1 so locations 0...4 map to 0...4, no change + + ldx MAP_LOCATION + + lda map_backgrounds_low,X + sta getsrc_smc+1 + lda map_backgrounds_hi,X + sta getsrc_smc+2 + + lda #$20 + + jsr decompress_lzsa2_fast + + ; copy to $4000 + + jsr hgr_copy ; put peasant text @@ -172,6 +176,7 @@ game_loop: jsr check_keyboard ; FIXME: draw kerrek before peasant if behind him + jsr kerrek_draw jsr kerrek_move_and_check_collision @@ -269,6 +274,7 @@ game_over: ;.include "hgr_hgr2.s" ;.include "wait_keypress.s" ;.include "loadsave_menu.s" +.include "hgr_copy.s" ;.include "text/peasant1.inc" diff --git a/games/peasant/qload.inc b/games/peasant/qload.inc index 44909bdf..f4452a93 100644 --- a/games/peasant/qload.inc +++ b/games/peasant/qload.inc @@ -3,39 +3,39 @@ sector_write =$0c63 requested_sector =$0d17 decompress_lzsa2_fast =$0de6 getsrc_smc =$0edc -hgr2 =$1861 -hgr_make_tables =$15da +hgr2 =$1844 +hgr_make_tables =$15bd hgr_put_string =$0ee9 save_bg_1x28 =$1421 restore_bg_1x28 =$1442 hgr_draw_sprite_1x28 =$13ba -input_buffer =$15b2 -hgr_text_box =$1650 -hgr_text_box_nosave =$16e2 -hgr_partial_restore =$1530 -clear_bottom =$1836 -hgr_input =$1558 +input_buffer =$1595 +hgr_text_box =$1633 +hgr_text_box_nosave =$16c5 +hgr_partial_restore =$150b +clear_bottom =$1819 +hgr_input =$153b hgr_partial_save =$1501 draw_box =$126b -disp_put_string =$1686 -disp_one_line =$169a +disp_put_string =$1669 +disp_one_line =$167d invert_smc1 =$0f61 -disp_put_string_cursor =$1696 +disp_put_string_cursor =$1679 hgr_put_char_cursor =$0f15 vgi_simple_rectangle =$12ec -peasant_text =$1f94 -save_menu =$1914 -load_menu =$1909 -location_names_l =$1c40 -location_names_h =$1c5f -wait_until_keypress =$1e7f -random16 =$1e88 -score_points =$1f0d -print_score =$1ebd -update_score =$1ec8 -speaker_beep =$1f7b -speaker_duration =$1f92 -speaker_frequency =$1f93 +peasant_text =$1f77 +save_menu =$18f7 +load_menu =$18ec +location_names_l =$1c23 +location_names_h =$1c42 +wait_until_keypress =$1e62 +random16 =$1e6b +score_points =$1ef0 +print_score =$1ea0 +update_score =$1eab +speaker_beep =$1f5e +speaker_duration =$1f75 +speaker_frequency =$1f76 hposn_high = $BA00 hposn_low = $BB00 driveoff = $A22 diff --git a/games/peasant/trogdor_actions.s b/games/peasant/trogdor_actions.s index 05948197..03d57618 100644 --- a/games/peasant/trogdor_actions.s +++ b/games/peasant/trogdor_actions.s @@ -487,6 +487,8 @@ skip_speech: jsr wait_until_keypress done_speech: + lda #0 + ldx #39 jsr hgr_partial_restore rts diff --git a/games/peasant/zp.inc b/games/peasant/zp.inc index 1ff3d6de..ec3c87c5 100644 --- a/games/peasant/zp.inc +++ b/games/peasant/zp.inc @@ -238,6 +238,8 @@ SAVED_Y2 = $C8 ; temp for animations, etc BABY_COUNT = $C9 +PREV_X = $CA +PREV_Y = $CB ; D0-D? used by HGR?