Rolling HP meter
A battle system in which damage sets where a character's HP is headed and the meter counts down to it over time, so the character falls only when the meter reaches 0.
On this page
With a rolling HP meter, a hit doesn’t take a character’s HP away at once. It sets a target, and the meter counts down to it over time. In EarthBound the party’s meters move 1.0625 to 1.125 HP per update, and a character is knocked out only when the meter reaches 0; when the last enemy falls, meters still rolling stop where they are1. Its predecessor, EarthBound Beginnings, takes damage off HP in one subtraction2.
- At onceEarthBound Beginnings (1989). Damage comes off HP at once.2
- RollingEarthBound (1994). A party member's HP counts down to the damage at about 1 HP per update, and only the rolled value knocks them out.1
Games
| Game | Year | How | Note |
|---|---|---|---|
| EarthBound | 1994 | Rolling | a party member's HP counts down to the damage at about 1 HP per update, and only the rolled value knocks them out |
Every claim about this mechanic, by game (2)
References
- ^ abIn EarthBound (US release), damage to a party member sets a target HP, and the HP shown counts toward it over time: each call moves one party slot (picked by the frame counter's low two bits) by 1.125, 1.094, or 1.0625 HP by the text speed setting. Healing rolls at 6.25 HP per update when a fastest flag or the flip-out mode is set; damage rolls at 6.25 only in the flip-out mode. A character falls only when that rolling HP reaches 0. When the last enemy falls, each meter still rolling down stops where it is, so mortal damage that hasn't finished rolling doesn't knock anyone out. Enemies and guest characters take damage at once.CodeHerringway/ebsrc · “EarthBound (USA)”revised
How we know
23 LDA a:battler::ally_or_enemy,X 24 AND #$00FF 25 BNE @UNKNOWN2 26 LDA a:battler::npc_id,X 27 AND #$00FF 28 BNE @UNKNOWN1 29 TYA 30 STA a:battler::hp_target,X ⋮ 32 AND #$00FF ⋮ 37 TYA 38 STA PARTY_CHARACTERS+char_struct::current_hp_target,X 39 BRA @UNKNOWN3 ⋮
src/battle/set_hp.asm lines 23–64 at 68aec5c · upstream ↗ 12 LDA FRAME_COUNTER 13 AND #$00FF 14 AND #$0003 ⋮ 22 LDA GAME_STATE + game_state::party_members,X
src/misc/hp_pp_roller.asm lines 12–22 at 68aec5c · upstream ↗ 64 LDA FASTEST_HPPP_METER_SPEED 65 AND #$00FF 66 BNE @UNKNOWN5 67 LDA HPPP_METER_FLIPOUT_MODE 68 BEQ @UNKNOWN6 69@UNKNOWN5: 70 MOVE_INT_CONSTANT $00064000, @VIRTUAL06 71 BRA @UNKNOWN7 72@UNKNOWN6: 73 JSR UNKNOWN_C20F58 ⋮ 79 ADD_INT_ASSIGN @VIRTUAL06, @VIRTUAL0A
src/misc/hp_pp_roller.asm lines 64–80 at 68aec5c · upstream ↗ 109@UNKNOWN10: ⋮ 116 LDA HPPP_METER_FLIPOUT_MODE 117 BEQ @UNKNOWN11 118 MOVE_INT_CONSTANT $00064000, @VIRTUAL06 119 BRA @UNKNOWN12 120@UNKNOWN11: 121 JSR UNKNOWN_C20F58 ⋮ 127 SUB_INT_ASSIGN @VIRTUAL06, @VIRTUAL0A
src/misc/hp_pp_roller.asm lines 109–127 at 68aec5c · upstream ↗ 2HP_METER_SPEEDS: 3 .WORD $2000, 1 ;1 + 4/32 4 .WORD $1800, 1 ;1 + 3/32 5 .WORD $1000, 1 ;1 + 2/32
src/data/hp_meter_speeds.asm lines 2–5 at 68aec5c · upstream ↗ In the cartridge (“EarthBound (USA)”): $C3:FB1F, the three 32-bit rates as the ROM has them. We don't reproduce the bytes.
665 LDA GAME_STATE+game_state::text_speed ⋮ 670 LOADPTR HP_METER_SPEEDS, @VIRTUAL0A ⋮ 678 MOVE_INT @VIRTUAL06, HP_METER_SPEED
src/intro/file_select_menu_loop.asm lines 665–678 at 68aec5c · upstream ↗ 43 LDA a:char_struct::current_hp,X 44 LDX @LOCAL01 45 STA __BSS_START__,X ⋮ 49 LDX @LOCAL01 50 LDA __BSS_START__,X 51 BNE @UNKNOWN4 ⋮ 62 LDA #STATUS_0::UNCONSCIOUS 63 STA a:battler::afflictions + STATUS_GROUP::PERSISTENT_EASYHEAL,X
src/battle/check_dead_players.asm lines 43–63 at 68aec5c · upstream ↗ 3051@ALLIES_ARE_ALIVE: 3052 LDA #1 3053 JSL COUNT_CHARS 3054 CMP #0 3055 BNEL @UNKNOWN234 3056@ENEMIES_ARE_DEAD: 3057 STZ @LOCAL03 3058 JSL RESET_HPPP_ROLLING
src/battle/main_battle_routine.asm lines 3051–3058 at 68aec5c · upstream ↗ 37 LDA a:char_struct::current_hp_fraction,Y 38 BEQ @UNKNOWN2 39 LDA a:char_struct::current_hp,Y 40 STA @LOCAL00 ⋮ 43 ADC #char_struct::current_hp_target ⋮ 47 LDA @LOCAL00 48 CMP @VIRTUAL04 49 BLTEQ @UNKNOWN2 50 STA __BSS_START__,X
src/misc/reset_hppp_rolling.asm lines 37–50 at 68aec5c · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abIn EarthBound Beginnings (English build), damage comes off the target's HP in one subtraction, and the target falls when it reaches 0 or below: there is no rolling meter.CodeNathan-R-Og/mother
How we know
4635; @UpdateHP Effect 4636 ldy target_offset 4637 sec 4638 lda BATTLER_CURR_HP, y 4639 sbc battle_wordvar60 4640 sta BATTLER_CURR_HP, y 4641 lda BATTLER_CURR_HP+1, y 4642 sbc battle_wordvar60+1 4643 sta BATTLER_CURR_HP+1, y 4644 bcc @DeathEffect 4645 ora BATTLER_CURR_HP, y 4646 beq @DeathEffect
src/global/prg/battle.asm lines 4635–4646 at e0b3e3f · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
Sources
Code
- Herringway. 2026. “ebsrc: Source code recreation for the game Earthbound.” Commit 68aec5c. Herringway/ebsrc @ 68aec5c · licence, all uses
- n.d. “EarthBound (USA).” · licence, all uses
- Nathan-R-Og. 2026. “mother: Disassembly of Mother/Earthbound Zero/Earthbound Beginnings for the NES.” Commit e0b3e3f. Nathan-R-Og/mother @ e0b3e3f · licence, all uses