From 70cc523b7bc74f5acf4190bdd4a54550c3d6a658 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 22 Oct 2025 22:03:20 -0400 Subject: [PATCH] Decomped GetTreatmentBetweenMonstersIgnoreStatus --- ...9_023018AC.inc => overlay_29_02301940.inc} | 1 - asm/include/overlay_29_02311C28.inc | 2 +- asm/include/overlay_29_02313CE4.inc | 2 +- ...ay_29_023018AC.s => overlay_29_02301940.s} | 50 +------------------ asm/overlay_29_02311C28.s | 6 +-- asm/overlay_29_02313CE4.s | 2 +- include/overlay_29_023018AC.h | 9 ++++ main.lsf | 3 +- src/overlay_29_022FA430.c | 10 ++-- src/overlay_29_023018AC.c | 42 ++++++++++++++++ .../sync_pmdsky_debug/sync_to_pmdsky_debug.py | 2 + 11 files changed, 69 insertions(+), 60 deletions(-) rename asm/include/{overlay_29_023018AC.inc => overlay_29_02301940.inc} (86%) rename asm/{overlay_29_023018AC.s => overlay_29_02301940.s} (60%) create mode 100644 include/overlay_29_023018AC.h create mode 100644 src/overlay_29_023018AC.c diff --git a/asm/include/overlay_29_023018AC.inc b/asm/include/overlay_29_02301940.inc similarity index 86% rename from asm/include/overlay_29_023018AC.inc rename to asm/include/overlay_29_02301940.inc index 1943e4de..c870c709 100644 --- a/asm/include/overlay_29_023018AC.inc +++ b/asm/include/overlay_29_02301940.inc @@ -1,6 +1,5 @@ #pragma once .public DefenderAbilityIsActive__02301A0C .public GetApparentWeather -.public IsExperienceLocked .public LogMessageByIdWithPopupCheckUserTarget .public SubstitutePlaceholderStringTags diff --git a/asm/include/overlay_29_02311C28.inc b/asm/include/overlay_29_02311C28.inc index 49bd7769..21fa9403 100644 --- a/asm/include/overlay_29_02311C28.inc +++ b/asm/include/overlay_29_02311C28.inc @@ -49,7 +49,7 @@ .public ov29_022E4E74 .public ov29_022E4F1C .public ov29_022E53EC -.public ov29_023018AC +.public GetTreatmentBetweenMonstersIgnoreStatus .public ov29_02304A48 .public ov29_02304A84 .public SafeguardIsActive diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index 1dad3206..97f24280 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -26,7 +26,7 @@ .public ov29_022E51B0 .public ov29_022E5258 .public ov29_022E52F8 -.public ov29_023018AC +.public GetTreatmentBetweenMonstersIgnoreStatus .public PlayExclamationPointEffect__022E5D4C .public PrepareItemForPrinting__02345728 .public SafeguardIsActive diff --git a/asm/overlay_29_023018AC.s b/asm/overlay_29_02301940.s similarity index 60% rename from asm/overlay_29_023018AC.s rename to asm/overlay_29_02301940.s index 9729a2ac..e27077c6 100644 --- a/asm/overlay_29_023018AC.s +++ b/asm/overlay_29_02301940.s @@ -1,56 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_023018AC.inc" + .include "overlay_29_02301940.inc" .text - arm_func_start ov29_023018AC -ov29_023018AC: ; 0x023018AC - stmdb sp!, {r3, r4, r5, lr} - ldr r4, [r0, #0xb4] - ldr r5, [r1, #0xb4] - ldrb r0, [r4, #0xbc] - cmp r0, #7 - moveq r0, #2 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl IsExperienceLocked - cmp r0, #0 - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #9] - cmp r0, #0 -#ifndef JAPAN - cmpne r0, #3 -#endif - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r5, #0xbc] - cmp r0, #7 - moveq r0, #2 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl IsExperienceLocked - cmp r0, #0 - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r0, [r5, #9] - cmp r0, #0 -#ifndef JAPAN - cmpne r0, #3 -#endif - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} - ldrb r1, [r4, #6] - ldrb r0, [r5, #6] - cmp r1, r0 - movne r0, #1 - moveq r0, #0 -#ifdef JAPAN - and r0, r0, #0xff -#endif - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_023018AC - arm_func_start SafeguardIsActive SafeguardIsActive: ; 0x02301940 stmdb sp!, {r3, r4, r5, lr} diff --git a/asm/overlay_29_02311C28.s b/asm/overlay_29_02311C28.s index fe2b654e..0bdcb544 100644 --- a/asm/overlay_29_02311C28.s +++ b/asm/overlay_29_02311C28.s @@ -749,7 +749,7 @@ _02312534: _023125AC: mov r0, sb mov r1, r6 - bl ov29_023018AC + bl GetTreatmentBetweenMonstersIgnoreStatus cmp r0, #1 bne _023125DC mov r2, #0 @@ -995,7 +995,7 @@ _02312868: _023128E0: mov r0, sb mov r1, r6 - bl ov29_023018AC + bl GetTreatmentBetweenMonstersIgnoreStatus cmp r0, #1 bne _02312908 mov r0, sl @@ -1195,7 +1195,7 @@ _02312B24: _02312B9C: mov r0, sb mov r1, r6 - bl ov29_023018AC + bl GetTreatmentBetweenMonstersIgnoreStatus cmp r0, #1 bne _02312BC4 mov r0, sl diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s index 15d7130a..6f927cb5 100644 --- a/asm/overlay_29_02313CE4.s +++ b/asm/overlay_29_02313CE4.s @@ -803,7 +803,7 @@ _02314718: _02314790: mov r0, sb mov r1, r6 - bl ov29_023018AC + bl GetTreatmentBetweenMonstersIgnoreStatus cmp r0, #1 bne _023147B8 mov r0, sl diff --git a/include/overlay_29_023018AC.h b/include/overlay_29_023018AC.h new file mode 100644 index 00000000..6467a3ec --- /dev/null +++ b/include/overlay_29_023018AC.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_OVERLAY_29_023018AC_H +#define PMDSKY_OVERLAY_29_023018AC_H + +#include "dungeon_mode.h" +#include "targeting.h" + +enum monster_treatment GetTreatmentBetweenMonstersIgnoreStatus(struct entity *entity1, struct entity *entity2); + +#endif //PMDSKY_OVERLAY_29_023018AC_H diff --git a/main.lsf b/main.lsf index b89e085e..37d2a294 100644 --- a/main.lsf +++ b/main.lsf @@ -466,7 +466,8 @@ Overlay OVY_29 Object asm/overlay_29_023016D8.o Object src/dungeon_ai_targeting_1.o Object asm/overlay_29_rodata_023527C0.o - Object asm/overlay_29_023018AC.o + Object src/overlay_29_023018AC.o + Object asm/overlay_29_02301940.o Object src/overlay_29_02301A60.o Object asm/overlay_29_02301A84.o Object src/dungeon_pokemon_attributes.o diff --git a/src/overlay_29_022FA430.c b/src/overlay_29_022FA430.c index 9135a104..3b07a1bc 100644 --- a/src/overlay_29_022FA430.c +++ b/src/overlay_29_022FA430.c @@ -3,22 +3,26 @@ #include "dungeon_map_access.h" #include "math.h" #include "overlay_29_022F7364.h" +#include "overlay_29_023018AC.h" #include "overlay_29_02336428.h" extern s32 GetChebyshevDistance(struct position *position_a, struct position *position_b); -extern s32 ov29_023018AC(struct entity*, struct entity*); bool8 ShouldMonsterHeadToStairs(struct entity *entity) { u8 stairs_room = GetStairsRoom(); - if (stairs_room == GetTile(entity->pos.x, entity->pos.y)->room) { + if (stairs_room == GetTile(entity->pos.x, entity->pos.y)->room) + { s32 stairs_distance = GetChebyshevDistance(&entity->pos, &DUNGEON_PTR[0]->gen_info.stairs_pos); s32 min_stairs_distance = INFINITY_3; for (s32 i = 0; i < DUNGEON_MAX_POKEMON; i++) { struct entity *other_monster = DUNGEON_PTR[0]->active_monster_ptrs[i]; - if (EntityIsValid__022F7364(other_monster) && ov29_023018AC(entity, other_monster) == 1 && stairs_room == GetTile(other_monster->pos.x, other_monster->pos.y)->room) { + if (EntityIsValid__022F7364(other_monster) && + GetTreatmentBetweenMonstersIgnoreStatus(entity, other_monster) == TREATMENT_TREAT_AS_ENEMY && + stairs_room == GetTile(other_monster->pos.x, other_monster->pos.y)->room) + { s32 other_stairs_distance = GetChebyshevDistance(&other_monster->pos, &DUNGEON_PTR[0]->gen_info.stairs_pos); if (other_stairs_distance < min_stairs_distance) min_stairs_distance = other_stairs_distance; diff --git a/src/overlay_29_023018AC.c b/src/overlay_29_023018AC.c new file mode 100644 index 00000000..7f455f22 --- /dev/null +++ b/src/overlay_29_023018AC.c @@ -0,0 +1,42 @@ +#include "overlay_29_023018AC.h" +#include "dungeon_util_static.h" +#include "joined_at_checks.h" + +enum monster_treatment GetTreatmentBetweenMonstersIgnoreStatus(struct entity *entity1, struct entity *entity2) +{ + struct monster* monster1 = GetEntInfo(entity1); + struct monster* monster2 = GetEntInfo(entity2); + if (monster1->monster_behavior == BEHAVIOR_RESCUE_TARGET) + return TREATMENT_IGNORE; + + if (IsExperienceLocked(monster1)) + return TREATMENT_IGNORE; + + #ifdef JAPAN + if (monster1->shopkeeper != SHOPKEEPER_MODE_NORMAL) + #else + if (monster1->shopkeeper != SHOPKEEPER_MODE_NORMAL && monster1->shopkeeper != SHOPKEEPER_MODE_ATTACK_TEAM) + #endif + return TREATMENT_IGNORE; + + if (monster2->monster_behavior == BEHAVIOR_RESCUE_TARGET) + return TREATMENT_IGNORE; + + if (IsExperienceLocked(monster2)) + return TREATMENT_IGNORE; + + #ifdef JAPAN + if (monster2->shopkeeper != SHOPKEEPER_MODE_NORMAL) + #else + if (monster2->shopkeeper != SHOPKEEPER_MODE_NORMAL && monster2->shopkeeper != SHOPKEEPER_MODE_ATTACK_TEAM) + #endif + return TREATMENT_IGNORE; + + #ifdef JAPAN + return (enum monster_treatment) (monster1->is_not_team_member != monster2->is_not_team_member); + #else + if (monster1->is_not_team_member != monster2->is_not_team_member) + return TREATMENT_TREAT_AS_ENEMY; + return TREATMENT_TREAT_AS_ALLY; + #endif +} diff --git a/tools/sync_pmdsky_debug/sync_to_pmdsky_debug.py b/tools/sync_pmdsky_debug/sync_to_pmdsky_debug.py index 466d8272..24c94605 100644 --- a/tools/sync_pmdsky_debug/sync_to_pmdsky_debug.py +++ b/tools/sync_pmdsky_debug/sync_to_pmdsky_debug.py @@ -281,6 +281,8 @@ def sync_xmap_symbol(address: int, symbol: SymbolDetails, language: str, section symbol_header = symbol_header.replace('s32', 'int') symbol_header = symbol_header.replace('s16', 'int16_t') symbol_header = symbol_header.replace('s8', 'int8_t') + symbol_header = symbol_header.replace('bool8', 'bool') + symbol_header = symbol_header.replace(' *', '* ') else: symbol_header = f'void {base_symbol_name}(void);\n'