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 ; draw our hero
lda HERO_HP ; check if hero deal
beq battle_draw_hero_down 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 lda HERO_STATE
and #HERO_STATE_RUNNING and #HERO_STATE_RUNNING
bne battle_draw_hero_running bne battle_draw_hero_running
jmp battle_draw_normal_hero jmp battle_draw_normal_hero
battle_draw_hero_down: battle_draw_hero_down:
@ -194,7 +198,9 @@ battle_done_draw_enemy:
;======================================= ;=======================================
; handle if dead ; handle if dead
lda HERO_HP lda HERO_HP_HI
bne done_battle_handle_dead
lda HERO_HP_LO
bne done_battle_handle_dead bne done_battle_handle_dead
; pause for 1.5s ; pause for 1.5s
@ -296,7 +302,9 @@ done_battle_count:
;======================== ;========================
; check enemy defeated ; check enemy defeated
lda ENEMY_HP lda ENEMY_HP_HI
bne end_battle_loop
lda ENEMY_HP_LO
bne end_battle_loop bne end_battle_loop
jsr victory_dance jsr victory_dance
@ -324,33 +332,57 @@ battle_game_over:
;** ** ** ** ** ** ** ** ** ** ** ** ** ;** ** ** ** ** ** ** ** ** ** ** ** **
;****** ****** ****** **** ** **** ****** ** ****** ** ;****** ****** ****** **** ** **** ****** ** ****** **
gr_put_num_leading_zero: .byte $00
;=========================== ;===========================
; gr put num ; gr put num
;=========================== ;===========================
; damage in DAMAGE_VAL (BCD) ; damage in DAMAGE_VAL_LO/HI (BCD)
; location in XPOS,YPOS ; location in XPOS,YPOS
gr_put_num: 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)) { ; print two-digit BCD number in A
; grsim_put_sprite(numbers[digit],xt,yy); gr_put_num_byte:
; xt+=4; pha ; store on stack
; }
; hundreds=digit;
; left=number%100;
gr_put_num_tens: 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 ; print tens digit
lda DAMAGE_VAL
lsr lsr
lsr lsr
lsr lsr
lsr lsr
; leading zero suppression
beq gr_put_num_ones
asl asl
tay tay
@ -369,8 +401,8 @@ gr_put_num_tens:
gr_put_num_ones: gr_put_num_ones:
; print tens digit ; print ones digit
lda DAMAGE_VAL pla
and #$f and #$f
asl asl

View File

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

View File

@ -97,45 +97,67 @@ draw_hero_and_sword:
;=================== ;===================
; heal hero ; heal hero
;=================== ;===================
; heal amount in DAMAGE_VAL (yes, I know) ; heal amount in DAMAGE_VAL_LO/DAMAGE_VAL_HI (yes, I know)
heal_hero: heal_hero:
sed
clc 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 ; see if new HP is too high
bcc heal_self_max ; blt lda HERO_HP_HI
bcs heal_self_update 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: health_too_high:
lda HERO_HP_MAX lda HERO_LEVEL
sta HERO_HP_HI
heal_self_update: lda #0
sta HERO_HP sta HERO_HP_LO
health_is_good:
rts rts
;======================== ;========================
; damage hero ; damage hero
;======================== ;========================
; value in DAMAGE_VAL ; value in DAMAGE_VAL_LO/HI
damage_hero: damage_hero:
lda DAMAGE_VAL lda DAMAGE_VAL_HI ; compare high bytes
cmp HERO_HP cmp HERO_HP_HI
bcs damage_hero_too_much ; bge 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
sec lda DAMAGE_VAL_LO ; compare low bytes
lda HERO_HP cmp HERO_HP_LO
sbc DAMAGE_VAL bcc damage_hero_do_sub ; if damage_lo<hp_lo then damage<hp
jmp damage_hero_update
damage_hero_too_much: damage_hero_too_much:
lda #0 lda #0
sta HERO_HP_HI
sta HERO_HP_LO
beq damage_hero_done ; bra
damage_hero_update: damage_hero_do_sub:
sta HERO_HP 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 rts

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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