tfv: make hit points 16-bits

huge pain, especially compare.  Probably some lurking mistakes
This commit is contained in:
Vince Weaver 2021-01-17 23:43:56 -05:00
parent 09ad61c229
commit 6a771b66bd
10 changed files with 211 additions and 105 deletions

View File

@ -112,13 +112,17 @@ main_battle_loop:
;========================================
; draw our hero
lda HERO_HP
beq battle_draw_hero_down
; check if hero deal
lda HERO_HP_HI
bne hero_not_dead ; hitpoint hi not zero
lda HERO_HP_LO
beq battle_draw_hero_down ; hitpoint hi && lo zero
; not dead, so draw running or standing
hero_not_dead:
lda HERO_STATE
and #HERO_STATE_RUNNING
bne battle_draw_hero_running
jmp battle_draw_normal_hero
battle_draw_hero_down:
@ -194,7 +198,9 @@ battle_done_draw_enemy:
;=======================================
; handle if dead
lda HERO_HP
lda HERO_HP_HI
bne done_battle_handle_dead
lda HERO_HP_LO
bne done_battle_handle_dead
; pause for 1.5s
@ -296,7 +302,9 @@ done_battle_count:
;========================
; check enemy defeated
lda ENEMY_HP
lda ENEMY_HP_HI
bne end_battle_loop
lda ENEMY_HP_LO
bne end_battle_loop
jsr victory_dance
@ -324,33 +332,57 @@ battle_game_over:
;** ** ** ** ** ** ** ** ** ** ** ** **
;****** ****** ****** **** ** **** ****** ** ****** **
gr_put_num_leading_zero: .byte $00
;===========================
; gr put num
;===========================
; damage in DAMAGE_VAL (BCD)
; damage in DAMAGE_VAL_LO/HI (BCD)
; location in XPOS,YPOS
gr_put_num:
lda #1
sta gr_put_num_leading_zero
; put high digit first
lda DAMAGE_VAL_HI
beq gr_put_num_bottom_byte
jsr gr_put_num_byte
gr_put_num_bottom_byte:
lda DAMAGE_VAL_LO
; fallthrough
; digit=number/100;
; if ((digit) && (digit<10)) {
; grsim_put_sprite(numbers[digit],xt,yy);
; xt+=4;
; }
; hundreds=digit;
; left=number%100;
;=================================
; print two-digit BCD number in A
gr_put_num_byte:
pha ; store on stack
gr_put_num_tens:
and #$f0
bne gr_put_num_print_tens
; was zero, check if we should print
lda gr_put_num_leading_zero ; if 1, we skip
bne gr_put_num_ones
pla ; restore value
pha
gr_put_num_print_tens:
; we were non-zero, notify leading zero
ldy #0
sty gr_put_num_leading_zero
; print tens digit
lda DAMAGE_VAL
lsr
lsr
lsr
lsr
; leading zero suppression
beq gr_put_num_ones
asl
tay
@ -369,8 +401,8 @@ gr_put_num_tens:
gr_put_num_ones:
; print tens digit
lda DAMAGE_VAL
; print ones digit
pla
and #$f
asl

View File

@ -6,8 +6,11 @@ attack:
lda #34
sta HERO_X
lda #$00
sta DAMAGE_VAL_HI
lda #$10
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
attack_loop:

View File

@ -97,45 +97,67 @@ draw_hero_and_sword:
;===================
; heal hero
;===================
; heal amount in DAMAGE_VAL (yes, I know)
; heal amount in DAMAGE_VAL_LO/DAMAGE_VAL_HI (yes, I know)
heal_hero:
sed
clc
lda HERO_HP
adc DAMAGE_VAL
; check if HP went down, if so we wrapped
lda HERO_HP_LO
adc DAMAGE_VAL_LO
sta HERO_HP_LO
lda HERO_HP_HI
adc DAMAGE_VAL_HI
sta HERO_HP_HI
cld
cmp HERO_HP
bcc heal_self_max ; blt
bcs heal_self_update
; see if new HP is too high
lda HERO_HP_HI
cmp HERO_LEVEL
bcc health_is_good ; if hp_h < max_h then hp_total < max_total
bne health_too_high ; if hp_h <> max_h, then hp_total > max_total
lda HERO_HP_LO ; compare low bytes
cmp #0
bcc health_is_good ; if hp_l < max_l then hp_total < max_total
heal_self_max:
lda HERO_HP_MAX
heal_self_update:
sta HERO_HP
health_too_high:
lda HERO_LEVEL
sta HERO_HP_HI
lda #0
sta HERO_HP_LO
health_is_good:
rts
;========================
; damage hero
;========================
; value in DAMAGE_VAL
; value in DAMAGE_VAL_LO/HI
damage_hero:
lda DAMAGE_VAL
cmp HERO_HP
bcs damage_hero_too_much ; bge
sec
lda HERO_HP
sbc DAMAGE_VAL
jmp damage_hero_update
lda DAMAGE_VAL_HI ; compare high bytes
cmp HERO_HP_HI
bcc damage_hero_do_sub ; if damage_hi<hp_hi then subtract
bne damage_hero_too_much ; if damage_hi<>hp_hi then too hi
lda DAMAGE_VAL_LO ; compare low bytes
cmp HERO_HP_LO
bcc damage_hero_do_sub ; if damage_lo<hp_lo then damage<hp
damage_hero_too_much:
lda #0
sta HERO_HP_HI
sta HERO_HP_LO
beq damage_hero_done ; bra
damage_hero_update:
sta HERO_HP
damage_hero_do_sub:
sed
sec
lda HERO_HP_LO
sbc DAMAGE_VAL_LO
sta HERO_HP_LO
lda HERO_HP_HI
sbc DAMAGE_VAL_HI
sta HERO_HP_HI
cld
damage_hero_done:
rts

View File

@ -63,8 +63,13 @@ init_enemy:
sta ENEMY_TYPE
sta ENEMY_X
lda #$30 ; BCD
sta ENEMY_HP
lda #$50 ; BCD
sta ENEMY_HP_LO
lda #$00 ; BCD
sta ENEMY_HP_HI
lda #$1 ; max HP is 100
sta ENEMY_LEVEL
lda #30
sta ENEMY_COUNT
@ -165,28 +170,41 @@ init_enemy:
;=========================
; damage enemy
;=========================
; amount to damage in DAMAGE_VAL
; amount to damage in DAMAGE_VAL_LO/HI (BCD)
damage_enemy:
lda DAMAGE_VAL
cmp ENEMY_HP
bcs damage_enemy_too_much ; bge
; enemy hp is BCD
sed
; see if damage < enemy_hp, if so fine to subtract
; if not, set enemy_hp to zero
sec
lda ENEMY_HP
sbc DAMAGE_VAL
cld
jmp damage_enemy_update
; 16 bit unsigned compare
lda DAMAGE_VAL_HI ; compare high bytes
cmp ENEMY_HP_HI
bcc damage_enemy_subtract ; if damage_hi<hp_hi then less
bne damage_enemy_too_much ; if damage_hi<>hp_hi then bigger
lda DAMAGE_VAL_LO ; compare low bytes
cmp ENEMY_HP_LO
bcc damage_enemy_subtract ; then damage_hi<hp_hi
damage_enemy_too_much:
lda #0
sta ENEMY_HP_HI
sta ENEMY_HP_LO
jmp damage_enemy_done
damage_enemy_update:
sta ENEMY_HP
damage_enemy_subtract:
sed
sec
lda ENEMY_HP_LO
sbc DAMAGE_VAL_LO
sta ENEMY_HP_LO
lda ENEMY_HP_HI
sbc DAMAGE_VAL_HI
sta ENEMY_HP_HI
cld
damage_enemy_done:
rts

View File

@ -10,7 +10,9 @@
limit_break_drop:
lda #$99
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #$00
sta DAMAGE_VAL_HI
lda #34
sta HERO_X
@ -210,7 +212,9 @@ limit_break_slice:
sta HERO_Y
lda #5
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #0
sta DAMAGE_VAL_HI
slice_run_loop:
@ -342,7 +346,9 @@ limit_break_zap:
sta HERO_Y
lda #$55
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #$00
sta DAMAGE_VAL_HI
jsr gr_copy_to_current

View File

@ -10,7 +10,9 @@ magic_attack:
sta HERO_X
lda #$15
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #$00
sta DAMAGE_VAL_HI
lda MAGIC_TYPE
cmp #MENU_MAGIC_HEAL

View File

@ -532,20 +532,23 @@ finger_escape:
lda MENU_STATE
and #$7f
sta MENU_STATE
jsr menu_escape_noise
rts
finger_left:
jsr menu_move_noise
lda #1
sta FINGER_DIRECTION
rts
finger_right:
jsr menu_move_noise
lda #0h
sta FINGER_DIRECTION
rts
finger_action:
jsr menu_move_noise
lda MENU_SUBMENU
cmp #MENU_MAIN_ATTACK
@ -811,6 +814,9 @@ done_attack:
lda #MENU_NONE
sta MENU_STATE
lda #34
sta HERO_X
rts

View File

@ -6,7 +6,9 @@
summon_metrocat:
lda #$17
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #$00
sta DAMAGE_VAL_HI
lda #28
sta MAGIC_X
@ -199,7 +201,9 @@ metrocat_damage_loop:
summon_vortex_cannon:
lda #5
sta DAMAGE_VAL
sta DAMAGE_VAL_LO
lda #0
sta DAMAGE_VAL_HI
lda #20
sta MAGIC_X

View File

@ -125,12 +125,15 @@ title_new_game:
title_load_game:
; this should go in new game, not load
lda #200
sta HERO_HP_MAX
lda #200
sta HERO_HP
lda #100
lda #$02
sta HERO_LEVEL
lda #$01
sta HERO_HP_HI
lda #$50
sta HERO_HP_LO
sta HERO_MP
sta HERO_MP_MAX
lda #LOAD_FLYING
sta WHICH_LOAD

View File

@ -84,56 +84,65 @@ GROUND_COLOR = $86
;==================GLOBAL STATE, STORED IN SAVE GAME==========
WHICH_LOAD = $90 ; current level
HERO_HP = $91 ; hero's hit points
HERO_HP_MAX = $92 ; hero's max hit points
HERO_HP_LO = $91 ; hero's hit points (lo)
HERO_HP_HI = $92 ; hero's hit points (hi)
HERO_MP = $93 ; hero's magic points
HERO_LIMIT = $94 ; hero's limit break count
HERO_LEVEL = $95 ; hero's level
HERO_XP = $96 ; hero's experience points
HERO_MONEY = $97 ; hero's money
HERO_INVENTORY = $98 ; hero's inventory
HERO_MP_MAX = $94 ; heros' max magic points
HERO_LIMIT = $95 ; hero's limit break count
HERO_LEVEL = $96 ; hero's level, also high byte of max hp
HERO_XP = $97 ; hero's experience points
HERO_MONEY = $98 ; hero's money
HERO_INVENTORY = $99 ; hero's inventory
HERO_NAME = $9A ; 7 chars
HERO_NAME1 = $9B ; 7 chars
HERO_NAME2 = $9C ; 7 chars
HERO_NAME3 = $9D ; 7 chars
HERO_NAME4 = $9E ; 7 chars
HERO_NAME5 = $9F ; 7 chars
HERO_NAME6 = $A0 ; 7 chars
;==================GAME STATE (not in save game)==============
LEVEL_OVER = $A0
JOYSTICK_ENABLED= $A1
FRAMEL = $A2
FRAMEH = $A3
MENU_RESULT = $A5
SOUND_STATUS = $A6
LEVEL_OVER = $B0
JOYSTICK_ENABLED= $B1
FRAMEL = $B2
FRAMEH = $B3
MENU_RESULT = $B4
SOUND_STATUS = $B5
SOUND_DISABLED = $80
SOUND_IN_LC = $01 ; $01 sound effects in language card
SOUND_MOCKINGBOARD = $02 ; mockingboard detected
JS_BUTTON_STATE = $A7
ANIMATE_LOOP = $A8
JS_BUTTON_STATE = $B6
ANIMATE_LOOP = $B7
HERO_X = $B0 ; used in battle
HERO_Y = $B1 ; used in battle
HERO_STATE = $B2 ; used in battle
HERO_X = $C0 ; used in battle
HERO_Y = $C1 ; used in battle
HERO_STATE = $C2 ; used in battle
HERO_STATE_RUNNING = $01 ; running from battle
BATTLE_COUNT = $B3 ; battle counter
ENEMY_TYPE = $B4 ; used in battle
ENEMY_HP = $B5 ; enemy hitpoints
ENEMY_X = $B6 ; enemy X position
ENEMY_COUNT = $B7 ; enemy countdown to attack
MENU_POSITION = $B8
MENU_STATE = $B9 ; battle menu state
BATTLE_COUNT = $C3 ; battle counter
ENEMY_TYPE = $C4 ; used in battle
ENEMY_HP_LO = $C5 ; enemy hitpoints
ENEMY_HP_HI = $C6 ; enemy hitpoints
ENEMY_LEVEL = $C7 ; enemy level
ENEMY_X = $C8 ; enemy X position
ENEMY_COUNT = $C9 ; enemy countdown to attack
MENU_POSITION = $CA
MENU_STATE = $CB ; battle menu state
MENU_NONE = 0
MENU_MAIN = 1
MENU_MAGIC = 2
MENU_SUMMON = 3
MENU_LIMIT = 4
MENU_FINGER = $80
MENU_SUBMENU = $BA
MENU_SUBMENU = $CC
MENU_MAIN_ATTACK = 0
MENU_MAIN_SKIP = 1
MENU_MAIN_MAGIC = 2
MENU_MAIN_ESCAPE = 3
MENU_MAIN_SUMMON = 4
MENU_MAIN_LIMIT = 5
MAGIC_TYPE = $BB ; same as below
MENU_TYPE = $BB ; same as above
MAGIC_TYPE = $CD ; same as below
MENU_TYPE = $CD ; same as above
MENU_SUMMON_METROCAT = 0
MENU_SUMMON_VORTEX = 1
@ -147,11 +156,12 @@ MENU_TYPE = $BB ; same as above
MENU_LIMIT_ZAP = 1
MENU_LIMIT_DROP = 2
LAST_KEY = $BC
DAMAGE_VAL = $BD
MAGIC_X = $BE
MAGIC_Y = $BF
FINGER_DIRECTION= $C0
LAST_KEY = $CE
DAMAGE_VAL_HI = $CF
DAMAGE_VAL_LO = $D0
MAGIC_X = $D1
MAGIC_Y = $D2
FINGER_DIRECTION= $D3
COLOR1 = $E0
COLOR2 = $E1