mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-03-03 12:31:32 +00:00
tfv: make hit points 16-bits
huge pain, especially compare. Probably some lurking mistakes
This commit is contained in:
parent
09ad61c229
commit
6a771b66bd
@ -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
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user