.meta hide_from_patches_menu .meta name="DMC" .meta description="Mitigates effects\nof enemy health\ndesync" .versions 3OJ2 3OJ3 3OJ4 3OJ5 3OE0 3OE1 3OE2 3OP0 entry_ptr: reloc0: .offsetof start start: .include WriteCodeBlocksGC .label TObjectV8047c128_add_hp, .label TObjectV8047c128_subtract_hp, .label get_enemy_entity, .label send_60, .label send_and_handle_60, # Change class_flags check to read only low 16 bits .data .data 4 lhz r0, [r28 + 0x2E6] # Replace 6x09 with 6xE4 in subcommand handler table .data .data 8 .data 0x00E40006 # subcommand=0xE4, flags=6 .data 0x800041C0 # on_6xE4 # Hooks in 6x0A handler .data .data 4 .address bl on_handle_6x0A_set_total_damage .data .data 4 .address bl on_handle_6x0A_call_object_update_handler # add_hp callsite in TObjectV8047c128_v17_accept_hit .data .data 4 .address bl on_TObjectV8047c128_add_hp # subtract_hp callsites in TObjectV8047c128_subtract_hp_if_in_state_2 .data .data 4 .address bl on_TObjectV8047c128_subtract_hp # subtract_hp callsites in TObjectV8047c128_v18_handle_hit_special_effects .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp # subtract_hp callsites in TObjectV8047c128_v17_accept_hit .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp .data .data 4 .address bl on_TObjectV8047c128_subtract_hp # subtract_hp callsites in TObjectV8047c128_v16 .data .data 4 .address bl on_TObjectV8047c128_subtract_hp # subtract_hp callsites in TObjectV8047c128_v23_give_poison_damage .data .data 4 .address bl on_TObjectV8047c128_subtract_hp_without_sync .data 0x800041C0 .deltaof code_start, code_end .address 0x800041C0 code_start: on_6xE4: # (G_6xE4* cmd @ r3) -> void mflr r0 stw [r1 + 4], r0 stwu [r1 - 0x20], r1 stw [r1 + 8], r3 li r4, 2 lhbrx r3, [r3 + r4] bl get_enemy_entity cmplwi r3, 0 beq on_6xE4_skip lwz r4, [r1 + 8] li r5, 4 lhbrx r6, [r4 + r5] extsh r6, r6 lhz r7, [r3 + 0x2E4] add r6, r6, r7 lhz r7, [r3 + 0x2B8] cmp r6, r7 bgt on_6xE4_use_r7 li r7, 0 cmp r6, r7 blt on_6xE4_use_r7 sth [r3 + 0x2E4], r6 b on_6xE4_skip on_6xE4_use_r7: sth [r3 + 0x2E4], r7 on_6xE4_skip: addi r1, r1, 0x20 lwz r0, [r1 + 4] mtlr r0 blr on_handle_6x0A_set_total_damage: # (G_6x0A* cmd @ r30) -> int16_t @ r3 # Nonstandard convention (patched callsite is not a call or return); must # save and restore r0 mflr r4 stw [r1 + 0x04], r4 stwu [r1 - 0x20], r1 stw [r1 + 0x08], r0 lhz r3, [r30 + 2] bl get_enemy_entity cmplwi r3, 0 beq on_handle_6x0A_set_total_damage_not_loaded lhz r4, [r3 + 0x2E4] lhz r5, [r3 + 0x2B8] lhz r3, [r30 + 6] cmp r3, r5 bgt on_handle_6x0A_set_total_damage_use_r5 cmp r3, r4 blt on_handle_6x0A_set_total_damage_use_r4 b on_handle_6x0A_set_total_damage_return on_handle_6x0A_set_total_damage_use_r4: mr r3, r4 b on_handle_6x0A_set_total_damage_return on_handle_6x0A_set_total_damage_use_r5: mr r3, r5 b on_handle_6x0A_set_total_damage_return on_handle_6x0A_set_total_damage_not_loaded: lhz r3, [r30 + 6] on_handle_6x0A_set_total_damage_return: lwz r0, [r1 + 0x08] addi r1, r1, 0x20 lwz r4, [r1 + 4] mtlr r4 blr on_handle_6x0A_call_object_update_handler: # (TObjectV8047c128* this @ r3, EnemyState* ene_st @ r4, void (*vfn)(TObjectV8047c128* this @ r3, EnemyState* ene_st @ r4) @ r12) -> void mflr r0 stw [r1 + 4], r0 stwu [r1 - 0x20], r1 stw [r1 + 0x08], r3 stw [r1 + 0x0C], r4 stw [r1 + 0x10], r12 lwz r5, [r3 + 0x30] lwz r7, [r4] or r5, r5, r7 andi. r5, r5, 0x0800 bne on_handle_6x0A_call_object_update_handler_return lhz r5, [r4 + 6] lhz r6, [r3 + 0x2B8] cmp r5, r6 blt on_handle_6x0A_call_object_update_handler_return ori r7, r7, 0x0800 stw [r4], r7 lwz r11, [r13 - ] cmplwi r11, 0 beq on_handle_6x0A_call_object_update_handler_return addi r10, r1, 0x14 li r9, 0x1C lhbrx r5, [r3 + r9] oris r5, r5, 0x0A03 stw [r10], r5 lhz r5, [r3 + 0x2C] li r9, 4 sthbrx [r10 + r9], r5 lhz r5, [r4 + 6] li r9, 6 sthbrx [r10 + r9], r5 lwz r5, [r4] stw [r10 + 8], r5 mr r3, r11 mr r4, r10 li r5, 0x0C bl send_60 on_handle_6x0A_call_object_update_handler_return: lwz r3, [r1 + 0x08] lwz r4, [r1 + 0x0C] lwz r12, [r1 + 0x10] mtctr r12 addi r1, r1, 0x20 lwz r0, [r1 + 4] mtlr r0 bctr on_TObjectV8047c128_subtract_hp_without_sync: # (TObjectV8047c128* this @ r3, int16_t amount @ r4) li r5, 2 b on_TObjectV8047c128_hp_change on_TObjectV8047c128_add_hp: # (TObjectV8047c128* this @ r3, int16_t amount @ r4) li r5, 1 b on_TObjectV8047c128_hp_change on_TObjectV8047c128_subtract_hp: # (TObjectV8047c128* this @ r3, int16_t amount @ r4) li r5, 0 on_TObjectV8047c128_hp_change: # (TObjectV8047c128* this @ r3, int16_t amount @ r4, uint8_t flags @ r5) lhz r7, [r3 + 0x1C] cmplwi r7, 0x1000 blt on_TObjectV8047c128_hp_change_skip_send cmplwi r7, 0x4000 bge on_TObjectV8047c128_hp_change_skip_send mflr r0 stw [r1 + 4], r0 stwu [r1 - 0x20], r1 stw [r1 + 0x08], r3 stw [r1 + 0x0C], r4 stw [r1 + 0x10], r5 mr r7, r3 addi r3, r1, 0x10 li r8, 0x1C lhbrx r6, [r7 + r8] oris r6, r6, 0xE403 stw [r3], r6 # cmd.header andi. r0, r5, 1 beq on_TObjectV8047c128_hp_change_skip_negate neg r4, r4 on_TObjectV8047c128_hp_change_skip_negate: li r8, 4 sthbrx [r3 + r8], r4 # cmd.hit_amount lhz r4, [r7 + 0x2E4] li r8, 6 sthbrx [r3 + r8], r4 # cmd.total_damage_before_hit lhz r4, [r7 + 0x32C] li r8, 8 sthbrx [r3 + r8], r4 # cmd.current_hp_before_hit lhz r4, [r7 + 0x2B8] li r8, 0x0A sthbrx [r3 + r8], r4 # cmd.max_hp andi. r0, r5, 2 bne on_TObjectV8047c128_hp_change_local_only bl send_and_handle_60 b on_TObjectV8047c128_hp_change_send_done on_TObjectV8047c128_hp_change_local_only: bl on_6xE4 on_TObjectV8047c128_hp_change_send_done: lwz r3, [r1 + 0x08] lwz r4, [r1 + 0x0C] lwz r5, [r1 + 0x10] addi r1, r1, 0x20 lwz r0, [r1 + 4] mtlr r0 on_TObjectV8047c128_hp_change_skip_send: andi. r0, r5, 1 bne on_TObjectV8047c128_hp_change_b_to_add b TObjectV8047c128_subtract_hp on_TObjectV8047c128_hp_change_b_to_add: b TObjectV8047c128_add_hp code_end: .data 0x00000000 .data 0x00000000