From ed159ffd16eda921920bc42248d9ac1564a6f651 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Tue, 17 Jun 2025 19:18:00 -0500 Subject: [PATCH 1/4] Decomped CanMonsterMoveOrSwapWithAllyInDirection --- asm/include/overlay_29_022F05B4.inc | 2 +- asm/include/overlay_29_02300FCC.inc | 4 +- ...9_02301158.inc => overlay_29_02301234.inc} | 6 +- asm/include/overlay_29_rodata_02352780.inc | 1 + asm/overlay_29_022F05B4.s | 14 +-- asm/overlay_29_02300FCC.s | 8 +- ...ay_29_02301158.s => overlay_29_02301234.s} | 103 +----------------- asm/overlay_29_rodata_0235173C.s | 17 --- include/directional_bit_masks.h | 11 ++ include/overlay_29_02301118.h | 3 + main.lsf | 3 +- src/directional_bit_masks.c | 8 ++ src/dungeon_logic_3.c | 5 +- src/overlay_29_02301118.c | 64 ++++++++++- 14 files changed, 107 insertions(+), 142 deletions(-) rename asm/include/{overlay_29_02301158.inc => overlay_29_02301234.inc} (75%) create mode 100644 asm/include/overlay_29_rodata_02352780.inc rename asm/{overlay_29_02301158.s => overlay_29_02301234.s} (78%) create mode 100644 include/directional_bit_masks.h create mode 100644 src/directional_bit_masks.c diff --git a/asm/include/overlay_29_022F05B4.inc b/asm/include/overlay_29_022F05B4.inc index dcde4209..1d10d4ef 100644 --- a/asm/include/overlay_29_022F05B4.inc +++ b/asm/include/overlay_29_022F05B4.inc @@ -111,7 +111,7 @@ .public ov29_023009CC .public ov29_02300FCC .public ov29_0230105C -.public ov29_02301158 +.public CanMonsterMoveOrSwapWithAllyInDirection .public ov29_023055B0 .public ov29_02321164 .public ov29_02322DDC diff --git a/asm/include/overlay_29_02300FCC.inc b/asm/include/overlay_29_02300FCC.inc index 00690046..41d36e31 100644 --- a/asm/include/overlay_29_02300FCC.inc +++ b/asm/include/overlay_29_02300FCC.inc @@ -6,5 +6,5 @@ .public IqSkillIsEnabled .public IsCurrentTilesetBackground .public ItemIsActive__022FF898 -.public ov29_02352788 -.public ov29_02352790 +.public DIRECTIONAL_BIT_MASKS__02352788 +.public DIRECTIONAL_BIT_MASKS__02352790 diff --git a/asm/include/overlay_29_02301158.inc b/asm/include/overlay_29_02301234.inc similarity index 75% rename from asm/include/overlay_29_02301158.inc rename to asm/include/overlay_29_02301234.inc index c1ea79d5..38869820 100644 --- a/asm/include/overlay_29_02301158.inc +++ b/asm/include/overlay_29_02301234.inc @@ -5,12 +5,10 @@ .public GetDirectionalMobilityType .public GetMobilityTypeCheckSlipAndFloating .public GetTile -.public GetTreatmentBetweenMonsters .public IqSkillIsEnabled .public IsCurrentTilesetBackground .public IsTacticSet .public ItemIsActive__022FF898 .public SECONDARY_TERRAIN_TYPES -.public ov29_02352770 -.public ov29_02352778 -.public ov29_02352780 +.public DIRECTIONAL_BIT_MASKS__02352770 +.public DIRECTIONAL_BIT_MASKS__02352778 diff --git a/asm/include/overlay_29_rodata_02352780.inc b/asm/include/overlay_29_rodata_02352780.inc new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/asm/include/overlay_29_rodata_02352780.inc @@ -0,0 +1 @@ +#pragma once diff --git a/asm/overlay_29_022F05B4.s b/asm/overlay_29_022F05B4.s index 1f7684f4..74e10788 100644 --- a/asm/overlay_29_022F05B4.s +++ b/asm/overlay_29_022F05B4.s @@ -4229,7 +4229,7 @@ _022F4020: beq _022F4098 mov r0, r5 mov r1, r6 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 movne r0, r6 bne _022F40A4 @@ -4239,7 +4239,7 @@ _022F4020: sub r1, r6, #1 mov r0, r5 and r1, r1, #7 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 subne r0, r6, #1 andne r0, r0, #7 @@ -4247,7 +4247,7 @@ _022F4020: add r1, r6, #1 mov r0, r5 and r1, r1, #7 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 addne r0, r6, #1 andne r0, r0, #7 @@ -4290,7 +4290,7 @@ ov29_022F40B8: ; 0x022F40B8 mov r5, r0 mov r0, sl mov r1, r5 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 movne r0, r5 bne _022F425C @@ -4356,7 +4356,7 @@ _022F4198: bgt _022F4208 mov r0, sl mov r1, r8 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 movne r0, r8 bne _022F425C @@ -4370,7 +4370,7 @@ _022F4218: sub r1, r5, #1 mov r0, sl and r1, r1, #7 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 subne r0, r5, #1 andne r0, r0, #7 @@ -4378,7 +4378,7 @@ _022F4218: add r1, r5, #1 mov r0, sl and r1, r1, #7 - bl ov29_02301158 + bl CanMonsterMoveOrSwapWithAllyInDirection cmp r0, #0 addne r0, r5, #1 andne r0, r0, #7 diff --git a/asm/overlay_29_02300FCC.s b/asm/overlay_29_02300FCC.s index 64d95eba..0344614f 100644 --- a/asm/overlay_29_02300FCC.s +++ b/asm/overlay_29_02300FCC.s @@ -29,7 +29,7 @@ ov29_02300FCC: ; 0x02300FCC ldrsh r0, [r5, #4] ldrsh r1, [r5, #6] bl GetTile - ldr r1, _02301058 ; =ov29_02352790 + ldr r1, _02301058 ; =DIRECTIONAL_BIT_MASKS__02352790 and r2, r4, #7 ldrb r1, [r1, r2] ldrb r0, [r0, #8] @@ -41,7 +41,7 @@ ov29_02300FCC: ; 0x02300FCC .align 2, 0 _02301050: .word DIRECTIONS_XY _02301054: .word DIRECTIONS_XY + 2 -_02301058: .word ov29_02352790 +_02301058: .word DIRECTIONAL_BIT_MASKS__02352790 arm_func_end ov29_02300FCC arm_func_start ov29_0230105C @@ -114,7 +114,7 @@ _023024DC_JP: ldrsh r1, [r6, #6] bl GetTile add r0, r0, r4 - ldr r1, _02301114 ; =ov29_02352788 + ldr r1, _02301114 ; =DIRECTIONAL_BIT_MASKS__02352788 and r2, r5, #7 ldrb r1, [r1, r2] ldrb r0, [r0, #8] @@ -131,5 +131,5 @@ _023024DC_JP: .align 2, 0 _0230110C: .word DIRECTIONS_XY _02301110: .word DIRECTIONS_XY + 2 -_02301114: .word ov29_02352788 +_02301114: .word DIRECTIONAL_BIT_MASKS__02352788 arm_func_end ov29_0230105C diff --git a/asm/overlay_29_02301158.s b/asm/overlay_29_02301234.s similarity index 78% rename from asm/overlay_29_02301158.s rename to asm/overlay_29_02301234.s index ad9abea9..3c7786fd 100644 --- a/asm/overlay_29_02301158.s +++ b/asm/overlay_29_02301234.s @@ -1,101 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_02301158.inc" + .include "overlay_29_02301234.inc" .text - arm_func_start ov29_02301158 -ov29_02301158: ; 0x02301158 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - ldr r2, [r6, #0xb4] - mov r5, r1 - ldrsh r1, [r2, #2] - bl GetMobilityTypeCheckSlipAndFloating - ldr r2, _02301228 ; =DIRECTIONS_XY - mov ip, r5, lsl #2 - ldr r1, _0230122C ; =DIRECTIONS_XY + 2 - ldrsh r3, [r2, ip] - ldrsh lr, [r6, #4] - mov r4, r0 - ldrsh r2, [r6, #6] - ldrsh r1, [r1, ip] - add r0, lr, r3 - add r1, r2, r1 - bl GetTile - ldrh r1, [r0] - tst r1, #0x10 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, pc} - ldr r1, [r0, #0xc] - cmp r1, #0 - beq _023011E0 - ldr r0, [r1] - cmp r0, #1 - bne _023011E0 - mov r0, r6 - mov r2, #1 - mov r3, #0 - bl GetTreatmentBetweenMonsters - cmp r0, #1 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} -_023011E0: -#ifdef JAPAN - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _02302654 - ldr r0, [r6, #0xb4] - ldrb r0, [r0, #0xef] - cmp r0, #3 - moveq r4, #3 - beq _02302654 - mov r0, r6 - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r4, #3 - bne _02302654 - mov r0, r6 - mov r1, #0xc - bl IqSkillIsEnabled - cmp r0, #0 - movne r4, #2 - bne _02302654 - mov r0, r6 - mov r1, #0xd - bl IqSkillIsEnabled - cmp r0, #0 - beq _02302654 - tst r5, #1 - movne r4, #2 - moveq r4, #3 -_02302654: -#else - mov r0, r6 - mov r1, r4 - and r2, r5, #0xff - bl GetDirectionalMobilityType - mov r4, r0 -#endif - ldrsh r0, [r6, #4] - ldrsh r1, [r6, #6] - bl GetTile - add r0, r0, r4 - ldr r1, _02301230 ; =ov29_02352780 - and r2, r5, #7 - ldrb r1, [r1, r2] - ldrb r0, [r0, #8] - tst r1, r0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02301228: .word DIRECTIONS_XY -_0230122C: .word DIRECTIONS_XY + 2 -_02301230: .word ov29_02352780 - arm_func_end ov29_02301158 - arm_func_start CanAttackInDirection CanAttackInDirection: ; 0x02301234 stmdb sp!, {r4, r5, r6, lr} @@ -168,7 +75,7 @@ _02302778: ldrsh r1, [r6, #6] bl GetTile add r0, r0, r4 - ldr r1, _023012F4 ; =ov29_02352778 + ldr r1, _023012F4 ; =DIRECTIONAL_BIT_MASKS__02352778 and r2, r5, #7 ldrb r1, [r1, r2] ldrb r0, [r0, #8] @@ -185,7 +92,7 @@ _02302778: .align 2, 0 _023012EC: .word DIRECTIONS_XY _023012F0: .word DIRECTIONS_XY + 2 -_023012F4: .word ov29_02352778 +_023012F4: .word DIRECTIONAL_BIT_MASKS__02352778 arm_func_end CanAttackInDirection arm_func_start CanAiMonsterMoveInDirection @@ -316,7 +223,7 @@ _0230295C: ldrsh r1, [r8, #6] bl GetTile add r0, r0, r5 - ldr r1, _02301494 ; =ov29_02352770 + ldr r1, _02301494 ; =DIRECTIONAL_BIT_MASKS__02352770 and r2, r7, #7 ldrb r1, [r1, r2] ldrb r0, [r0, #8] @@ -334,7 +241,7 @@ _02301484: .word DIRECTIONS_XY _02301488: .word DIRECTIONS_XY + 2 _0230148C: .word DUNGEON_PTR _02301490: .word SECONDARY_TERRAIN_TYPES -_02301494: .word ov29_02352770 +_02301494: .word DIRECTIONAL_BIT_MASKS__02352770 arm_func_end CanAiMonsterMoveInDirection arm_func_start ov29_02301498 diff --git a/asm/overlay_29_rodata_0235173C.s b/asm/overlay_29_rodata_0235173C.s index a874bc7a..4a12a594 100644 --- a/asm/overlay_29_rodata_0235173C.s +++ b/asm/overlay_29_rodata_0235173C.s @@ -430,20 +430,3 @@ BELLY_DRAIN_IN_WALLS_INT: .global ov29_0235276C ov29_0235276C: .byte 0x00, 0x00, 0x00, 0x00 - .global ov29_02352770 -ov29_02352770: - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - .global ov29_02352778 -ov29_02352778: - .byte 0x01, 0x02, 0x04, 0x08 - .byte 0x10, 0x20, 0x40, 0x80 - .global ov29_02352780 -ov29_02352780: - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - .global ov29_02352788 -ov29_02352788: - .byte 0x01, 0x02, 0x04, 0x08 - .byte 0x10, 0x20, 0x40, 0x80 - .global ov29_02352790 -ov29_02352790: - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 diff --git a/include/directional_bit_masks.h b/include/directional_bit_masks.h new file mode 100644 index 00000000..aca61b80 --- /dev/null +++ b/include/directional_bit_masks.h @@ -0,0 +1,11 @@ +#ifndef PMDSKY_DIRECTIONAL_BIT_MASKS_H +#define PMDSKY_DIRECTIONAL_BIT_MASKS_H + +extern const u8 DIRECTIONAL_BIT_MASKS__02352770[]; +extern const u8 DIRECTIONAL_BIT_MASKS__02352778[]; +extern const u8 DIRECTIONAL_BIT_MASKS__02352780[]; +extern const u8 DIRECTIONAL_BIT_MASKS__02352788[]; +extern const u8 DIRECTIONAL_BIT_MASKS__02352790[]; +extern const u8 DIRECTIONAL_BIT_MASKS__02352798[]; + +#endif //PMDSKY_DIRECTIONAL_BIT_MASKS_H diff --git a/include/overlay_29_02301118.h b/include/overlay_29_02301118.h index a83a0ced..e17f793f 100644 --- a/include/overlay_29_02301118.h +++ b/include/overlay_29_02301118.h @@ -5,5 +5,8 @@ // True if the given monster is cornered (it can't move in any direction) bool8 IsMonsterCornered(struct entity *monster); +// Checks if the given monster can move in the specified direction. Includes if an allied or neutral monster is standing on an adjacent tile, as the monsters can swap places. +// Returns false if an enemy monster is standing on the target tile +bool8 CanMonsterMoveOrSwapWithAllyInDirection(struct entity *monster, s32 direction); #endif //PMDSKY_OVERLAY_29_02301118_H diff --git a/main.lsf b/main.lsf index 3f30bbf8..c088fc9f 100644 --- a/main.lsf +++ b/main.lsf @@ -344,10 +344,11 @@ Overlay OVY_29 Object asm/overlay_29_02300BF8.o Object src/dungeon_capabilities_2.o Object asm/overlay_29_02300D00.o + Object src/directional_bit_masks.o Object src/dungeon_logic_3.o Object asm/overlay_29_02300FCC.o Object src/overlay_29_02301118.o - Object asm/overlay_29_02301158.o + Object asm/overlay_29_02301234.o Object src/dungeon_ai_targeting.o Object asm/overlay_29_023016D8.o Object src/dungeon_ai_targeting_1.o diff --git a/src/directional_bit_masks.c b/src/directional_bit_masks.c new file mode 100644 index 00000000..26514e59 --- /dev/null +++ b/src/directional_bit_masks.c @@ -0,0 +1,8 @@ +#include "directional_bit_masks.h" + +const u8 DIRECTIONAL_BIT_MASKS__02352790[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 DIRECTIONAL_BIT_MASKS__02352788[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 DIRECTIONAL_BIT_MASKS__02352780[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 DIRECTIONAL_BIT_MASKS__02352778[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 DIRECTIONAL_BIT_MASKS__02352770[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 DIRECTIONAL_BIT_MASKS__02352798[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; diff --git a/src/dungeon_logic_3.c b/src/dungeon_logic_3.c index 3bfae410..e85bf94b 100644 --- a/src/dungeon_logic_3.c +++ b/src/dungeon_logic_3.c @@ -1,4 +1,5 @@ #include "dungeon_logic_3.h" +#include "directional_bit_masks.h" #include "dungeon_ai_targeting.h" #include "dungeon_map_access.h" #include "dungeon_mobility.h" @@ -8,8 +9,6 @@ #include "overlay_29_022FF898.h" #include "run_dungeon.h" -static const u8 DIRECTIONAL_BIT_MASKS[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; - bool8 MonsterCannotAttack(struct entity *pokemon, bool8 skip_sleep) { struct monster *pokemon_info = GetEntInfo(pokemon); @@ -89,7 +88,7 @@ bool8 CanMonsterMoveInDirection(struct entity *monster, u16 direction) #endif current_map_tile = GetTile(monster->pos.x, monster->pos.y); - if (current_map_tile->walkable_neighbor_flags[mobility] & DIRECTIONAL_BIT_MASKS[direction & DIRECTION_MASK]) + if (current_map_tile->walkable_neighbor_flags[mobility] & DIRECTIONAL_BIT_MASKS__02352798[direction & DIRECTION_MASK]) return TRUE; return FALSE; diff --git a/src/overlay_29_02301118.c b/src/overlay_29_02301118.c index ed3f0009..dbc81510 100644 --- a/src/overlay_29_02301118.c +++ b/src/overlay_29_02301118.c @@ -1,16 +1,70 @@ #include "overlay_29_02301118.h" #include "direction.h" - -extern bool8 ov29_02301158(struct entity *monster, s32 direction); +#include "directional_bit_masks.h" +#include "dungeon.h" +#include "dungeon_ai_targeting_1.h" +#include "dungeon_logic_3.h" +#include "dungeon_map_access.h" +#include "dungeon_mobility.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util.h" +#include "dungeon_util_static.h" +#include "item.h" +#include "overlay_29_022FF898.h" +#include "run_dungeon.h" +#include "targeting.h" bool8 IsMonsterCornered(struct entity *monster) { for (u8 i = 0; i < NUM_DIRECTIONS; i++) { - if (ov29_02301158(monster, i)) - { + if (CanMonsterMoveOrSwapWithAllyInDirection(monster, i)) return TRUE; - } } return FALSE; } + +bool8 CanMonsterMoveOrSwapWithAllyInDirection(struct entity *monster, s32 direction) +{ + struct monster *monster_info = GetEntInfo(monster); + enum mobility_type mobility = GetMobilityTypeCheckSlipAndFloating(monster, monster_info->id); + const struct tile *current_map_tile = GetTile(monster->pos.x + DIRECTIONS_XY[direction].x, + monster->pos.y + DIRECTIONS_XY[direction].y); + + if (current_map_tile->terrain_flags & TERRAIN_TYPE_IMPASSABLE_WALL) + return FALSE; + + if (current_map_tile->monster != NULL && + current_map_tile->monster->type == ENTITY_MONSTER && + GetTreatmentBetweenMonsters(monster, current_map_tile->monster, TRUE, FALSE) == TREATMENT_TREAT_AS_ENEMY) + return FALSE; + + #ifdef JAPAN + if (!IsCurrentTilesetBackground()) + { + if (GetEntInfo(monster)->invisible_class_status.status == STATUS_INVISIBLE_MOBILE) + mobility = MOBILITY_INTANGIBLE; + else if (ItemIsActive__022FF898(monster, ITEM_MOBILE_SCARF)) + mobility = MOBILITY_INTANGIBLE; + else if (IqSkillIsEnabled(monster, IQ_ALL_TERRAIN_HIKER)) + // BUG: If a Pokémon can normally move through walls, All-Terrain Hiker will block them from moving through walls. + // This bug is fixed in the NA/EU versions. + mobility = MOBILITY_HOVERING; + else if (IqSkillIsEnabled(monster, IQ_ABSOLUTE_MOVER)) { + if (direction & 1) + // Absolute Mover can't break walls diagonally. + mobility = MOBILITY_HOVERING; + else + mobility = MOBILITY_INTANGIBLE; + } + } + #else + mobility = GetDirectionalMobilityType(monster, mobility, direction); + #endif + + current_map_tile = GetTile(monster->pos.x, monster->pos.y); + if (current_map_tile->walkable_neighbor_flags[mobility] & DIRECTIONAL_BIT_MASKS__02352780[direction & DIRECTION_MASK]) + return TRUE; + + return FALSE; +} From 710459dbb1d582af677235975c2cca07dbe251de Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Tue, 17 Jun 2025 19:20:17 -0500 Subject: [PATCH 2/4] Fixed extract_function extracting offset constants --- tools/extract_function/write_inc_file.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/extract_function/write_inc_file.py b/tools/extract_function/write_inc_file.py index ec6adecf..2bafa441 100644 --- a/tools/extract_function/write_inc_file.py +++ b/tools/extract_function/write_inc_file.py @@ -46,7 +46,8 @@ def write_inc_file(lines: List[str], file_path: str): write_lines = ['#pragma once\n'] for function in sorted(used_functions): - write_lines.append(f'.public {function}\n') + if ' ' not in function: + write_lines.append(f'.public {function}\n') with open(file_path, 'w') as inc_file: inc_file.writelines(write_lines) From a792d10c2d585ad64a5aaeba24066d59612fecac Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Tue, 17 Jun 2025 22:18:05 -0500 Subject: [PATCH 3/4] Decomped IsChargingTwoTurnMove --- asm/include/overlay_29_02322DDC.inc | 18 ++++----- asm/overlay_29_02322DDC.s | 37 ------------------- ...eon_logic_3.h => dungeon_capabilities_3.h} | 6 +-- ...29_02301118.h => dungeon_capabilities_4.h} | 6 +-- include/dungeon_move.h | 2 + include/two_turn_moves_and_statuses.h | 15 ++++++++ main.lsf | 4 +- src/dungeon_ai_itcm.c | 6 +-- ...eon_logic_3.c => dungeon_capabilities_3.c} | 2 +- ...29_02301118.c => dungeon_capabilities_4.c} | 4 +- src/dungeon_move.c | 20 ++++++++++ src/status_checks.c | 2 +- src/two_turn_moves_and_statuses.c | 15 ++++++++ 13 files changed, 76 insertions(+), 61 deletions(-) rename include/{dungeon_logic_3.h => dungeon_capabilities_3.h} (91%) rename include/{overlay_29_02301118.h => dungeon_capabilities_4.h} (79%) create mode 100644 include/two_turn_moves_and_statuses.h rename src/{dungeon_logic_3.c => dungeon_capabilities_3.c} (99%) rename src/{overlay_29_02301118.c => dungeon_capabilities_4.c} (97%) create mode 100644 src/two_turn_moves_and_statuses.c diff --git a/asm/include/overlay_29_02322DDC.inc b/asm/include/overlay_29_02322DDC.inc index 08a6293b..b2be8b1d 100644 --- a/asm/include/overlay_29_02322DDC.inc +++ b/asm/include/overlay_29_02322DDC.inc @@ -1,16 +1,15 @@ #pragma once -.public _s32_div_f .public AbilityIsActiveVeneer .public AdvanceFrame .public AnimationDelayOrSomething -.public DefenderAbilityIsActive__02322D64 .public DETECT_BAND_MOVE_ACCURACY_DROP .public DIRECTIONS_XY .public DUNGEON_PTR +.public DefenderAbilityIsActive__02322D64 .public DungeonRandInt .public DungeonRandRange -.public EntityIsValid__02321438 .public EXCL_ITEM_EFFECTS_EVASION_BOOST +.public EntityIsValid__02321438 .public ExclusiveItemEffectFlagTest .public ExecuteMoveEffect .public FormatMoveStringMore @@ -27,11 +26,18 @@ .public GetTreatmentBetweenMonsters .public HasHeldItem .public IqSkillIsEnabled +.public IsChargingTwoTurnMove .public LogMessageQuiet .public LogMessageWithPopup .public MALE_ACCURACY_STAGE_MULTIPLIERS .public MALE_EVASION_STAGE_MULTIPLIERS .public MoveIsNotPhysical +.public PlayMoveAnimation +.public PositionHasMonster +.public QUICK_DODGER_MOVE_ACCURACY_DROP +.public ShouldDisplayEntityWrapper +.public TwoTurnMoveForcedMiss +.public _s32_div_f .public ov10_022BDE50 .public ov10_022BE9E8 .public ov10_022BEB2C @@ -58,12 +64,6 @@ .public ov29_02352A6C .public ov29_02352A8C .public ov29_0235370C -.public PlayMoveAnimation -.public PositionHasMonster -.public QUICK_DODGER_MOVE_ACCURACY_DROP -.public ShouldDisplayEntityWrapper .public sub_020018D0 .public sub_02001980 .public sub_0201CF90 -.public TWO_TURN_MOVES_AND_STATUSES -.public TwoTurnMoveForcedMiss diff --git a/asm/overlay_29_02322DDC.s b/asm/overlay_29_02322DDC.s index c4994f74..a705d59b 100644 --- a/asm/overlay_29_02322DDC.s +++ b/asm/overlay_29_02322DDC.s @@ -1719,40 +1719,3 @@ IsHyperBeamVariant: ; 0x02324534 .align 2, 0 _023245A0: .word 0x000001C5 arm_func_end IsHyperBeamVariant - - arm_func_start IsChargingTwoTurnMove -IsChargingTwoTurnMove: ; 0x023245A4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__02321438 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr ip, [r5, #0xb4] - mov lr, #0 - ldr r2, _02324618 ; =TWO_TURN_MOVES_AND_STATUSES - b _02324608 -_023245D0: - mov r3, lr, lsl #2 - ldrh r1, [r2, r3] - cmp r1, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldrh r0, [r4, #4] - cmp r0, r1 - addeq r0, r2, r3 - ldreqb r1, [ip, #0xd2] - ldreqb r0, [r0, #2] - cmpeq r1, r0 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} - add lr, lr, #1 -_02324608: - cmp lr, #0x64 - blt _023245D0 - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02324618: .word TWO_TURN_MOVES_AND_STATUSES - arm_func_end IsChargingTwoTurnMove diff --git a/include/dungeon_logic_3.h b/include/dungeon_capabilities_3.h similarity index 91% rename from include/dungeon_logic_3.h rename to include/dungeon_capabilities_3.h index c8e52089..5d8ca597 100644 --- a/include/dungeon_logic_3.h +++ b/include/dungeon_capabilities_3.h @@ -1,5 +1,5 @@ -#ifndef PMDSKY_DUNGEON_LOGIC_3_H -#define PMDSKY_DUNGEON_LOGIC_3_H +#ifndef PMDSKY_DUNGEON_CAPABILITIES_3_H +#define PMDSKY_DUNGEON_CAPABILITIES_3_H #include "dungeon_mode.h" @@ -22,4 +22,4 @@ bool8 CanMonsterMoveInDirection(struct entity *monster, u16 direction); enum mobility_type GetDirectionalMobilityType(struct entity *monster, enum mobility_type base_mobility, u8 direction); #endif -#endif //PMDSKY_DUNGEON_LOGIC_3_H +#endif //PMDSKY_DUNGEON_CAPABILITIES_3_H diff --git a/include/overlay_29_02301118.h b/include/dungeon_capabilities_4.h similarity index 79% rename from include/overlay_29_02301118.h rename to include/dungeon_capabilities_4.h index e17f793f..8b51a057 100644 --- a/include/overlay_29_02301118.h +++ b/include/dungeon_capabilities_4.h @@ -1,5 +1,5 @@ -#ifndef PMDSKY_OVERLAY_29_02301118_H -#define PMDSKY_OVERLAY_29_02301118_H +#ifndef PMDSKY_DUNGEON_CAPABILITIES_4_H +#define PMDSKY_DUNGEON_CAPABILITIES_4_H #include "dungeon_mode.h" @@ -9,4 +9,4 @@ bool8 IsMonsterCornered(struct entity *monster); // Returns false if an enemy monster is standing on the target tile bool8 CanMonsterMoveOrSwapWithAllyInDirection(struct entity *monster, s32 direction); -#endif //PMDSKY_OVERLAY_29_02301118_H +#endif //PMDSKY_DUNGEON_CAPABILITIES_4_H diff --git a/include/dungeon_move.h b/include/dungeon_move.h index 77f34506..da9a46b3 100644 --- a/include/dungeon_move.h +++ b/include/dungeon_move.h @@ -3,6 +3,8 @@ #include "dungeon_mode.h" +// Checks if a monster is currently charging the specified two-turn move. +bool8 IsChargingTwoTurnMove(struct entity *user, struct move *move); // Returns a boolean indicating whether or not the given entity is charging any two-turn move. // pokemon: Entity pointer // check_charge: Unused boolean which was supposed to make function return true if the entity is under the effect of Charge (the Electric-type move). diff --git a/include/two_turn_moves_and_statuses.h b/include/two_turn_moves_and_statuses.h new file mode 100644 index 00000000..e97d9d72 --- /dev/null +++ b/include/two_turn_moves_and_statuses.h @@ -0,0 +1,15 @@ +#ifndef PMDSKY_TWO_TURN_MOVES_AND_STATUSES_H +#define PMDSKY_TWO_TURN_MOVES_AND_STATUSES_H + +#include "enums.h" + +// Represents a two-turn move and its corresponding status_two_turn_id value +struct two_turn_move_and_status { + enum move_id move; + enum status_two_turn_id status; +}; + +// List that matches two-turn move IDs to their corresponding status ID. The last entry is null. +extern const struct two_turn_move_and_status TWO_TURN_MOVES_AND_STATUSES[11]; + +#endif //PMDSKY_TWO_TURN_MOVES_AND_STATUSES_H diff --git a/main.lsf b/main.lsf index c088fc9f..a425d0e1 100644 --- a/main.lsf +++ b/main.lsf @@ -345,9 +345,9 @@ Overlay OVY_29 Object src/dungeon_capabilities_2.o Object asm/overlay_29_02300D00.o Object src/directional_bit_masks.o - Object src/dungeon_logic_3.o + Object src/dungeon_capabilities_3.o Object asm/overlay_29_02300FCC.o - Object src/overlay_29_02301118.o + Object src/dungeon_capabilities_4.o Object asm/overlay_29_02301234.o Object src/dungeon_ai_targeting.o Object asm/overlay_29_023016D8.o diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index 53a30e47..cfac6cc7 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -3,13 +3,14 @@ #include "direction.h" #include "dungeon_action.h" #include "dungeon_ai_targeting.h" -#include "dungeon_logic_3.h" +#include "dungeon_capabilities_3.h" +#include "dungeon_capabilities_4.h" +#include "dungeon_mode.h" #include "dungeon_parameters.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_util_static.h" #include "fixed_room_data.h" -#include "overlay_29_02301118.h" #define REGULAR_ATTACK_INDEX 4 @@ -17,7 +18,6 @@ const s16 AI_REGULAR_ATTACK_WEIGHTS[5] = { 100, 20, 30, 40, 50 }; extern struct dungeon *DUNGEON_PTR[]; -extern bool8 IsChargingTwoTurnMove(struct entity *user, struct move *move); extern void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction); extern void UpdateAiTargetPos(struct entity *monster); extern void InitMove(struct move *move, enum move_id move_id); diff --git a/src/dungeon_logic_3.c b/src/dungeon_capabilities_3.c similarity index 99% rename from src/dungeon_logic_3.c rename to src/dungeon_capabilities_3.c index e85bf94b..6a194ddb 100644 --- a/src/dungeon_logic_3.c +++ b/src/dungeon_capabilities_3.c @@ -1,4 +1,4 @@ -#include "dungeon_logic_3.h" +#include "dungeon_capabilities_3.h" #include "directional_bit_masks.h" #include "dungeon_ai_targeting.h" #include "dungeon_map_access.h" diff --git a/src/overlay_29_02301118.c b/src/dungeon_capabilities_4.c similarity index 97% rename from src/overlay_29_02301118.c rename to src/dungeon_capabilities_4.c index dbc81510..1e457160 100644 --- a/src/overlay_29_02301118.c +++ b/src/dungeon_capabilities_4.c @@ -1,9 +1,9 @@ -#include "overlay_29_02301118.h" +#include "dungeon_capabilities_4.h" #include "direction.h" #include "directional_bit_masks.h" #include "dungeon.h" #include "dungeon_ai_targeting_1.h" -#include "dungeon_logic_3.h" +#include "dungeon_capabilities_3.h" #include "dungeon_map_access.h" #include "dungeon_mobility.h" #include "dungeon_pokemon_attributes_1.h" diff --git a/src/dungeon_move.c b/src/dungeon_move.c index 00557d35..0256c702 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -1,7 +1,9 @@ #include "dungeon_move.h" #include "dungeon_util_static.h" #include "overlay_29_02321438.h" +#include "two_turn_moves_and_statuses.h" +// Lists all status IDs that are for two-turn moves. The last entry is null. const enum status_two_turn_id TWO_TURN_STATUSES[11] = { STATUS_TWO_TURN_SOLARBEAM, @@ -17,6 +19,24 @@ const enum status_two_turn_id TWO_TURN_STATUSES[11] = STATUS_TWO_TURN_NONE }; +bool8 IsChargingTwoTurnMove(struct entity *user, struct move *move) +{ + if (!EntityIsValid__02321438(user)) + return FALSE; + + struct monster *pokemon_info = GetEntInfo(user); + for (s32 i = 0; i < 100; i++) + { + if (TWO_TURN_MOVES_AND_STATUSES[i].move == MOVE_NOTHING) + return FALSE; + + if (move->id == TWO_TURN_MOVES_AND_STATUSES[i].move && + pokemon_info->bide_class_status.bide == TWO_TURN_MOVES_AND_STATUSES[i].status) + return TRUE; + } + return FALSE; +} + bool8 IsChargingAnyTwoTurnMove(struct entity *entity, bool8 charge_check_unused) { if (!EntityIsValid__02321438(entity)) diff --git a/src/status_checks.c b/src/status_checks.c index a541e3e3..e9603452 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -2,7 +2,7 @@ #include "dg_random.h" #include "dungeon_action.h" #include "dungeon_ai_itcm.h" -#include "dungeon_logic_3.h" +#include "dungeon_capabilities_3.h" #include "dungeon_statuses.h" #include "dungeon_util_static.h" diff --git a/src/two_turn_moves_and_statuses.c b/src/two_turn_moves_and_statuses.c new file mode 100644 index 00000000..03104378 --- /dev/null +++ b/src/two_turn_moves_and_statuses.c @@ -0,0 +1,15 @@ +#include "two_turn_moves_and_statuses.h" + +const struct two_turn_move_and_status TWO_TURN_MOVES_AND_STATUSES[11] = { + {MOVE_SOLARBEAM, STATUS_TWO_TURN_SOLARBEAM}, + {MOVE_SKY_ATTACK, STATUS_TWO_TURN_SKY_ATTACK}, + {MOVE_RAZOR_WIND, STATUS_TWO_TURN_RAZOR_WIND}, + {MOVE_FOCUS_PUNCH, STATUS_TWO_TURN_FOCUS_PUNCH}, + {MOVE_SKULL_BASH, STATUS_TWO_TURN_SKULL_BASH}, + {MOVE_FLY, STATUS_TWO_TURN_FLYING}, + {MOVE_BOUNCE, STATUS_TWO_TURN_BOUNCING}, + {MOVE_DIVE, STATUS_TWO_TURN_DIVING}, + {MOVE_DIG, STATUS_TWO_TURN_DIGGING}, + {MOVE_SHADOW_FORCE, STATUS_TWO_TURN_SHADOW_FORCE}, + {MOVE_NOTHING, STATUS_TWO_TURN_NONE} +}; From 32940f65bc60036c6312714bc135ae3fc0f1eb79 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Tue, 17 Jun 2025 22:49:24 -0500 Subject: [PATCH 4/4] Decomped SetActionUseMoveAi --- asm/include/overlay_29_022EB44C.inc | 44 +- asm/include/overlay_29_022EBCE8.inc | 28 ++ asm/overlay_29_022EB44C.s | 667 ---------------------------- asm/overlay_29_022EBCE8.s | 656 +++++++++++++++++++++++++++ include/direction.h | 1 + include/dungeon_action_helper.h | 8 + include/dungeon_mode.h | 1 - main.lsf | 2 + src/dungeon_action_helper.c | 11 + src/dungeon_ai_itcm.c | 4 +- src/dungeon_capabilities_3.c | 2 +- 11 files changed, 719 insertions(+), 705 deletions(-) create mode 100644 asm/include/overlay_29_022EBCE8.inc create mode 100644 asm/overlay_29_022EBCE8.s create mode 100644 include/dungeon_action_helper.h create mode 100644 src/dungeon_action_helper.c diff --git a/asm/include/overlay_29_022EB44C.inc b/asm/include/overlay_29_022EB44C.inc index a4d7fe8c..c87c3a64 100644 --- a/asm/include/overlay_29_022EB44C.inc +++ b/asm/include/overlay_29_022EB44C.inc @@ -1,52 +1,26 @@ #pragma once -.public abs -.public AdvanceFrame -.public CalcSpeedStageWrapper -.public ChangeLeader -.public DecrementWindCounter -.public DisplayActions .public DUNGEON_PTR -.public EnemyEvolution -.public EntityIsValid__022EC608 -.public ExecuteMonsterAction -.public FRACTIONAL_TURN_SEQUENCE .public GetEquivItemIndex .public GetItemAtIdx .public GetItemCategoryVeneer .public GetItemInfo -.public GetLeader .public GetTile -.public IsFloorOver -.public IsHM .public ITEM_CATEGORY_ACTIONS +.public IsHM .public ItemZInit -.public ov29_022E81F8 -.public ov29_022EF9C8 -.public ov29_0230FC24 +.public RemoveEmptyItemsInBagWrapper +.public RemoveEquivItemNoHole +.public RemoveGroundItem +.public RemoveItem +.public SetItemAcquired +.public SetMonsterActionFields +.public ShouldDisplayEntityWrapper +.public SpawnItem .public ov29_02347040 -.public ov29_02348FD8 .public ov29_02352074 -.public ov29_023522B6 .public ov29_0237C918 .public ov29_0237C91C .public ov29_0237C91E .public ov29_0237C920 .public ov29_0237C922 .public ov29_0237C96C -.public RemoveEmptyItemsInBagWrapper -.public RemoveEquivItemNoHole -.public RemoveGroundItem -.public RemoveItem -.public RunMonsterAi -.public SetItemAcquired -.public SetLeaderAction -.public SetMonsterActionFields -.public ShouldDisplayEntityWrapper -.public SpawnItem -.public sub_01FFBDF4 -.public TickStatusAndHealthRegen -.public TryActivateArtificialWeatherAbilities -.public TryActivateWeather -.public TryForcedLoss -.public TryRestoreRoostTyping -.public TrySpawnMonsterAndActivatePlusMinus diff --git a/asm/include/overlay_29_022EBCE8.inc b/asm/include/overlay_29_022EBCE8.inc new file mode 100644 index 00000000..3fc6677c --- /dev/null +++ b/asm/include/overlay_29_022EBCE8.inc @@ -0,0 +1,28 @@ +#pragma once +.public AdvanceFrame +.public CalcSpeedStageWrapper +.public ChangeLeader +.public DUNGEON_PTR +.public DecrementWindCounter +.public DisplayActions +.public EnemyEvolution +.public EntityIsValid__022EC608 +.public ExecuteMonsterAction +.public FRACTIONAL_TURN_SEQUENCE +.public GetLeader +.public IsFloorOver +.public RunMonsterAi +.public SetLeaderAction +.public TickStatusAndHealthRegen +.public TryActivateArtificialWeatherAbilities +.public TryActivateWeather +.public TryForcedLoss +.public TryRestoreRoostTyping +.public TrySpawnMonsterAndActivatePlusMinus +.public abs +.public ov29_022E81F8 +.public ov29_022EF9C8 +.public ov29_0230FC24 +.public ov29_02348FD8 +.public ov29_023522B6 +.public sub_01FFBDF4 diff --git a/asm/overlay_29_022EB44C.s b/asm/overlay_29_022EB44C.s index 09057c6f..b143594d 100644 --- a/asm/overlay_29_022EB44C.s +++ b/asm/overlay_29_022EB44C.s @@ -732,670 +732,3 @@ SetActionUseMovePlayer: ; 0x022EBC98 strb r4, [r6, #0xa] ldmia sp!, {r4, r5, r6, pc} arm_func_end SetActionUseMovePlayer - - arm_func_start SetActionUseMoveAi -SetActionUseMoveAi: ; 0x022EBCBC - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - mov r1, #0x15 - mov r6, r0 - mov r4, r2 - bl SetMonsterActionFields - cmp r4, #0xff - strb r5, [r6, #4] - andne r0, r4, #7 - strneb r0, [r6, #2] - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SetActionUseMoveAi - - arm_func_start ov29_022EBCE8 -ov29_022EBCE8: ; 0x022EBCE8 - ldrh r1, [r0] - cmp r1, #0x15 - ldreqb r0, [r0, #4] - bxeq lr - cmp r1, #0x14 - ldreqb r0, [r0, #0xa] - mvnne r0, #0 - bx lr - arm_func_end ov29_022EBCE8 - - arm_func_start RunFractionalTurn -RunFractionalTurn: ; 0x022EBD08 -#ifdef JAPAN -#define RUN_FRACTIONAL_TURN_OFFSET -0xA4 -#define RUN_FRACTIONAL_TURN_OFFSET_2 -4 -#else -#define RUN_FRACTIONAL_TURN_OFFSET 0 -#define RUN_FRACTIONAL_TURN_OFFSET_2 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x40 - mov r4, r0 - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - bl TrySpawnMonsterAndActivatePlusMinus - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - mov r0, r4 - bl RunLeaderTurn - mov r4, r0 - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - cmp r4, #0 - beq _022EBD60 - bl DecrementWindCounter - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 -_022EBD60: - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - bl GetLeader - mov r8, r0 - bl ov29_02348FD8 - mov r5, #0 - b _022EBECC -_022EBD80: - ldr r0, _022EC2FC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r4, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] - mov r0, r4 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EBEC8 - ldr r6, [r4, #0xb4] - ldrb r0, [r6, #7] - cmp r0, #0 - bne _022EBEC8 - bl IsFloorOver - cmp r0, #0 - bne _022EBED4 - ldr r1, _022EC2FC ; =DUNGEON_PTR - mov r0, r4 - ldr r1, [r1] - str r4, [r1, #0xc4] - bl sub_01FFBDF4 - bl TryActivateArtificialWeatherAbilities - mov r1, #0 - mov r0, r4 - strb r1, [r6, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - bl CalcSpeedStageWrapper - ldr r1, _022EC2FC ; =DUNGEON_PTR - ldr r3, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE - ldr r2, [r1] - mov r1, #0x32 - add r2, r2, #0x700 - ldrsh r2, [r2, #0x80] - mla r1, r0, r1, r3 - mov r0, r2, lsl #1 - ldrsh r0, [r0, r1] - cmp r0, #0 - beq _022EBEC8 - ldrb r0, [r6, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2] - cmp r0, #0 - bne _022EBEC8 - ldrh r0, [r6] - tst r0, #0x8000 - bne _022EBEC8 - tst r0, #0x4000 - bicne r0, r0, #0x4000 - strneh r0, [r6] - bne _022EBEC8 - mov r1, #0 - mov r0, r4 - strb r1, [r6, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] - bl TickStatusAndHealthRegen - mov r0, r4 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EBEC8 - mov r0, r4 - bl EnemyEvolution - mov r0, r4 - mov r1, #1 - bl TryRestoreRoostTyping - mov sb, #0 - mov r7, sb - mov r6, sb - b _022EBEC0 -_022EBE80: - mov r0, r4 - mov r1, r7 - bl RunMonsterAi - bl IsFloorOver - cmp r0, #0 - bne _022EBEC8 - mov r0, r4 - bl ExecuteMonsterAction - cmp r0, #0 - beq _022EBEC8 - mov r0, r6 - bl TryForcedLoss - bl IsFloorOver - cmp r0, #0 - bne _022EBEC8 - add sb, sb, #1 -_022EBEC0: - cmp sb, #3 - blt _022EBE80 -_022EBEC8: - add r5, r5, #1 -_022EBECC: - cmp r5, #4 - blt _022EBD80 -_022EBED4: - mov sb, #0 -_022EBED8: - mov r3, #0 - mov sl, r3 - add r2, sp, #0 -_022EBEE4: - mov r0, r3, lsl #3 - str sl, [r2, r3, lsl #3] - add r3, r3, #1 - add r1, r2, r3, lsl #3 - add r0, r2, r0 - str r1, [r0, #4] - cmp r3, #3 - blt _022EBEE4 - str sl, [sp, #0x18] - str sl, [sp, #0x1c] - add r4, sp, #0x20 - add fp, sp, #0 - mov r6, #0 -_022EBF18: - ldr r0, _022EC2FC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, sl, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] - mov r0, r7 - bl EntityIsValid__022EC608 - cmp r0, #0 - ldrne r1, [r7, #0xb4] - ldrneb r0, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - cmpne r0, #0 - beq _022EBFA8 - ldrb r0, [r1, #7] - cmp r0, #0 - strneb r6, [r1, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] - strneb r6, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - bne _022EBFA8 - ldrsh r1, [r8, #6] - ldrsh r0, [r7, #6] - sub r0, r1, r0 - bl abs - ldrsh r2, [r8, #4] - ldrsh r1, [r7, #4] - mov r5, r0 - sub r0, r2, r1 - bl abs - cmp r0, r5 - movle r0, r5 - cmp r0, #3 - movge r0, #2 - add r2, fp, r0, lsl #3 - ldr r1, [r2, #4] - add r0, r4, sl, lsl #3 - str r7, [r4, sl, lsl #3] - str r1, [r0, #4] - str r0, [r2, #4] -_022EBFA8: - add sl, sl, #1 - cmp sl, #4 - blt _022EBF18 - mov r7, #0 - add r5, sp, #0 - mov sl, #1 - mov r6, r7 - b _022EC00C -_022EBFC8: - ldr r4, [r5] - cmp r4, #0 - beq _022EC008 - ldr r2, [r4, #0xb4] - mov r0, r4 - strb sl, [r2, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] - mov r1, sl - strb r7, [r2, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - bl RunMonsterAi - mov r0, r4 - bl ExecuteMonsterAction - bl ov29_022EF9C8 - mov r0, r6 - bl TryForcedLoss - mov r0, r4 - bl EntityIsValid__022EC608 -_022EC008: - ldr r5, [r5, #4] -_022EC00C: - cmp r5, #0 - bne _022EBFC8 - add sb, sb, #1 - cmp sb, #3 - blt _022EBED8 - bl IsFloorOver - cmp r0, #0 - bne _022EC094 - mov r4, #0 - ldr r5, _022EC2FC ; =DUNGEON_PTR - mov r6, r4 -_022EC038: - ldr r0, [r5] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] - mov r0, r7 - bl EntityIsValid__022EC608 - cmp r0, #0 - ldrne r8, [r7, #0xb4] - ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - cmpne r0, #0 - beq _022EC088 - mov r0, r7 - bl ov29_0230FC24 - mov r0, r7 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC088 - mov r0, r7 - bl EnemyEvolution - strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] -_022EC088: - add r4, r4, #1 - cmp r4, #4 - blt _022EC038 -_022EC094: - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - mov sb, #0 - mov r5, sb - mov r7, sb - ldr r6, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE - mov fp, #0x32 - ldr r4, _022EC2FC ; =DUNGEON_PTR - b _022EC1C0 -_022EC0BC: - ldr r0, [r4] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET] - mov r0, r8 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC1BC - bl IsFloorOver - cmp r0, #0 - bne _022EC1C8 - ldr sl, [r8, #0xb4] - ldr r1, [r4] - mov r0, r8 - str r8, [r1, #0xc4] - bl sub_01FFBDF4 - bl TryActivateArtificialWeatherAbilities - ldrh r0, [sl] - tst r0, #0x8000 - bne _022EC1BC - tst r0, #0x4000 - bicne r0, r0, #0x4000 - strneh r0, [sl] - bne _022EC1BC - mov r0, r8 - strb r7, [sl, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - bl CalcSpeedStageWrapper - ldr r2, [r4] - mla r1, r0, fp, r6 - add r0, r2, #0x700 - ldrsh r0, [r0, #0x80] - mov r0, r0, lsl #1 - ldrsh r0, [r0, r1] - cmp r0, #0 - beq _022EC1BC - ldrb r0, [sl, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2] - cmp r0, #0 - bne _022EC1BC - ldrh r1, [sl] - mov r0, r8 - bic r1, r1, #0xc000 - strh r1, [sl] - strb r5, [sl, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] - bl TickStatusAndHealthRegen - mov r0, r8 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC1BC - mov r0, r8 - bl EnemyEvolution - mov r0, r8 - mov r1, #0 - bl RunMonsterAi - bl IsFloorOver - cmp r0, #0 - bne _022EC1C8 - mov r0, r8 - bl ExecuteMonsterAction - bl ov29_022EF9C8 - mov r0, #0 - bl TryForcedLoss - bl IsFloorOver - cmp r0, #0 - bne _022EC1C8 -_022EC1BC: - add sb, sb, #1 -_022EC1C0: - cmp sb, #0x10 - blt _022EC0BC -_022EC1C8: - bl IsFloorOver - cmp r0, #0 - bne _022EC23C - mov r4, #0 - ldr r5, _022EC2FC ; =DUNGEON_PTR - mov r6, r4 -_022EC1E0: - ldr r0, [r5] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET] - mov r0, r7 - bl EntityIsValid__022EC608 - cmp r0, #0 - ldrne r8, [r7, #0xb4] - ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] - cmpne r0, #0 - beq _022EC230 - mov r0, r7 - bl ov29_0230FC24 - mov r0, r7 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC230 - mov r0, r7 - bl EnemyEvolution - strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] -_022EC230: - add r4, r4, #1 - cmp r4, #0x10 - blt _022EC1E0 -_022EC23C: - bl IsFloorOver - cmp r0, #0 - bne _022EC2F4 - ldr r4, _022EC2FC ; =DUNGEON_PTR - ldr r1, _022EC304 ; =ov29_023522B6 - ldr r0, [r4] - add r0, r0, #0x700 - ldrsh r0, [r0, #0x80] - add r0, r0, #1 - mov r0, r0, lsl #1 - ldrsh r0, [r1, r0] - cmp r0, #0 - beq _022EC2C4 - mov r5, #0 - b _022EC2A4 -_022EC278: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r0, [r0, #0xb78 + RUN_FRACTIONAL_TURN_OFFSET] - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC2A0 - mov r0, #0 - bl DisplayActions - b _022EC2AC -_022EC2A0: - add r5, r5, #1 -_022EC2A4: - cmp r5, #0x14 - blt _022EC278 -_022EC2AC: - mov r0, #1 - mov r1, #0 - bl TryActivateWeather - bl ov29_022EF9C8 - mov r0, #0 - bl TryForcedLoss -_022EC2C4: - ldr r1, _022EC2FC ; =DUNGEON_PTR - ldr r0, [r1] - add r0, r0, #0x700 - ldrsh r2, [r0, #0x80] - add r2, r2, #1 - strh r2, [r0, #0x80] - ldr r0, [r1] - add r0, r0, #0x700 - ldrsh r1, [r0, #0x80] - cmp r1, #0x18 - moveq r1, #0 - streqh r1, [r0, #0x80] -_022EC2F4: - add sp, sp, #0x40 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022EC2FC: .word DUNGEON_PTR -_022EC300: .word FRACTIONAL_TURN_SEQUENCE -_022EC304: .word ov29_023522B6 - arm_func_end RunFractionalTurn - - arm_func_start RunLeaderTurn -RunLeaderTurn: ; 0x022EC308 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - bl GetLeader - movs r4, r0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - bl ov29_02348FD8 - bl TryActivateArtificialWeatherAbilities - mov r0, r4 - bl CalcSpeedStageWrapper - ldr r1, _022EC600 ; =DUNGEON_PTR - ldr r3, _022EC604 ; =FRACTIONAL_TURN_SEQUENCE - ldr r2, [r1] - mov r1, #0x32 - add r2, r2, #0x700 - mla r1, r0, r1, r3 - ldrsh r2, [r2, #0x80] - mov r0, r2, lsl #1 - ldrsh r0, [r0, r1] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, [r4, #0xb4] -#ifdef JAPAN - ldrb r0, [r0, #0x14e] -#else - ldrb r0, [r0, #0x152] -#endif - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, r4 - mov r1, #1 - bl TryRestoreRoostTyping -_022EC380: - bl GetLeader - movs sb, r0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - bl sub_01FFBDF4 - mov r0, #0 - bl DisplayActions - cmp r0, #0 - bne _022EC3C8 - ldr r0, _022EC600 ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x78b] - cmp r0, #0 - ldreqb r0, [r1, #0x78e] - cmpeq r0, #0 - beq _022EC3C8 - mov r0, #0xc - bl AdvanceFrame -_022EC3C8: - cmp sb, #0 - moveq r0, #0 - beq _022EC3E8 - ldr r0, [sb] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_022EC3E8: - cmp r0, #0 - ldrne r0, [sb, #0xb4] - movne r1, #0 - strneb r1, [r0, #0x101] - bl IsFloorOver - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, _022EC600 ; =DUNGEON_PTR - mov r1, #0 - ldr r2, [r0] - cmp sl, #0 - str sb, [r2, #0xc4] - ldr r0, [r0] - movne sl, r1 - str r1, [r0, #0xc8] - bne _022EC434 - mov r0, sb - bl TickStatusAndHealthRegen -_022EC434: - bl IsFloorOver - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - bl ov29_022E81F8 - mov r0, sb - bl EnemyEvolution - ldr r0, _022EC600 ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x11] - bl SetLeaderAction - ldr r0, _022EC600 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x11] - bl IsFloorOver - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sb - bl ExecuteMonsterAction - bl ov29_022EF9C8 - mov r0, #0 - bl TryForcedLoss - bl IsFloorOver - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r1, [sb, #0xb4] - ldrh r0, [r1] - tst r0, #0x8000 - bicne r0, r0, #0x8000 - strneh r0, [r1] - ldrneh r0, [r1] - orrne r0, r0, #0x4000 - strneh r0, [r1] - bl IsFloorOver - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r4, _022EC600 ; =DUNGEON_PTR - ldr r1, [r4] - ldrb r0, [r1, #0x10] - cmp r0, #0 - beq _022EC59C - mov r7, #0 - strb r7, [r1, #0x10] - mov r5, r7 - mov fp, r7 - b _022EC594 -_022EC500: - ldr r0, [r4] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC590 - ldr r8, [r6, #0xb4] - ldrh r0, [r8] - tst r0, #0x8000 - beq _022EC590 - bl IsFloorOver - cmp r0, #0 - bne _022EC59C - mov r0, r6 - bl TickStatusAndHealthRegen - mov r0, r6 - bl EntityIsValid__022EC608 - cmp r0, #0 - beq _022EC590 - mov r0, r6 - bl EnemyEvolution - mov r0, r6 - mov r1, r5 - bl RunMonsterAi - mov r0, r6 - bl ExecuteMonsterAction - mov r0, fp - bl TryForcedLoss - ldrh r0, [r8] - bic r0, r0, #0x8000 - strh r0, [r8] - ldrh r0, [r8] - orr r0, r0, #0x4000 - strh r0, [r8] -_022EC590: - add r7, r7, #1 -_022EC594: - cmp r7, #0x14 - blt _022EC500 -_022EC59C: - bl IsFloorOver - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, _022EC600 ; =DUNGEON_PTR - ldr r1, [r0] - ldr r0, [r1, #0xc8] - cmp r0, #0 - beq _022EC5DC - bl ChangeLeader - ldr r0, _022EC600 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - mov sl, #1 - str r1, [r0, #0xc8] - b _022EC380 -_022EC5DC: - ldr r0, [sb, #0xb4] - ldrb r0, [r0, #0x101] - cmp r0, #0 - addne r0, r1, #0x700 - movne r1, #0 - strneh r1, [r0, #0x80] - bne _022EC380 - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022EC600: .word DUNGEON_PTR -_022EC604: .word FRACTIONAL_TURN_SEQUENCE - arm_func_end RunLeaderTurn diff --git a/asm/overlay_29_022EBCE8.s b/asm/overlay_29_022EBCE8.s new file mode 100644 index 00000000..e2f5e0d7 --- /dev/null +++ b/asm/overlay_29_022EBCE8.s @@ -0,0 +1,656 @@ + .include "asm/macros.inc" + .include "overlay_29_022EBCE8.inc" + + .text + + arm_func_start ov29_022EBCE8 +ov29_022EBCE8: ; 0x022EBCE8 + ldrh r1, [r0] + cmp r1, #0x15 + ldreqb r0, [r0, #4] + bxeq lr + cmp r1, #0x14 + ldreqb r0, [r0, #0xa] + mvnne r0, #0 + bx lr + arm_func_end ov29_022EBCE8 + + arm_func_start RunFractionalTurn +RunFractionalTurn: ; 0x022EBD08 +#ifdef JAPAN +#define RUN_FRACTIONAL_TURN_OFFSET -0xA4 +#define RUN_FRACTIONAL_TURN_OFFSET_2 -4 +#else +#define RUN_FRACTIONAL_TURN_OFFSET 0 +#define RUN_FRACTIONAL_TURN_OFFSET_2 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x40 + mov r4, r0 + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + bl TrySpawnMonsterAndActivatePlusMinus + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + mov r0, r4 + bl RunLeaderTurn + mov r4, r0 + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + cmp r4, #0 + beq _022EBD60 + bl DecrementWindCounter + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 +_022EBD60: + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + bl GetLeader + mov r8, r0 + bl ov29_02348FD8 + mov r5, #0 + b _022EBECC +_022EBD80: + ldr r0, _022EC2FC ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 + ldr r4, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] + mov r0, r4 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EBEC8 + ldr r6, [r4, #0xb4] + ldrb r0, [r6, #7] + cmp r0, #0 + bne _022EBEC8 + bl IsFloorOver + cmp r0, #0 + bne _022EBED4 + ldr r1, _022EC2FC ; =DUNGEON_PTR + mov r0, r4 + ldr r1, [r1] + str r4, [r1, #0xc4] + bl sub_01FFBDF4 + bl TryActivateArtificialWeatherAbilities + mov r1, #0 + mov r0, r4 + strb r1, [r6, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + bl CalcSpeedStageWrapper + ldr r1, _022EC2FC ; =DUNGEON_PTR + ldr r3, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE + ldr r2, [r1] + mov r1, #0x32 + add r2, r2, #0x700 + ldrsh r2, [r2, #0x80] + mla r1, r0, r1, r3 + mov r0, r2, lsl #1 + ldrsh r0, [r0, r1] + cmp r0, #0 + beq _022EBEC8 + ldrb r0, [r6, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2] + cmp r0, #0 + bne _022EBEC8 + ldrh r0, [r6] + tst r0, #0x8000 + bne _022EBEC8 + tst r0, #0x4000 + bicne r0, r0, #0x4000 + strneh r0, [r6] + bne _022EBEC8 + mov r1, #0 + mov r0, r4 + strb r1, [r6, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] + bl TickStatusAndHealthRegen + mov r0, r4 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EBEC8 + mov r0, r4 + bl EnemyEvolution + mov r0, r4 + mov r1, #1 + bl TryRestoreRoostTyping + mov sb, #0 + mov r7, sb + mov r6, sb + b _022EBEC0 +_022EBE80: + mov r0, r4 + mov r1, r7 + bl RunMonsterAi + bl IsFloorOver + cmp r0, #0 + bne _022EBEC8 + mov r0, r4 + bl ExecuteMonsterAction + cmp r0, #0 + beq _022EBEC8 + mov r0, r6 + bl TryForcedLoss + bl IsFloorOver + cmp r0, #0 + bne _022EBEC8 + add sb, sb, #1 +_022EBEC0: + cmp sb, #3 + blt _022EBE80 +_022EBEC8: + add r5, r5, #1 +_022EBECC: + cmp r5, #4 + blt _022EBD80 +_022EBED4: + mov sb, #0 +_022EBED8: + mov r3, #0 + mov sl, r3 + add r2, sp, #0 +_022EBEE4: + mov r0, r3, lsl #3 + str sl, [r2, r3, lsl #3] + add r3, r3, #1 + add r1, r2, r3, lsl #3 + add r0, r2, r0 + str r1, [r0, #4] + cmp r3, #3 + blt _022EBEE4 + str sl, [sp, #0x18] + str sl, [sp, #0x1c] + add r4, sp, #0x20 + add fp, sp, #0 + mov r6, #0 +_022EBF18: + ldr r0, _022EC2FC ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, sl, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] + mov r0, r7 + bl EntityIsValid__022EC608 + cmp r0, #0 + ldrne r1, [r7, #0xb4] + ldrneb r0, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + cmpne r0, #0 + beq _022EBFA8 + ldrb r0, [r1, #7] + cmp r0, #0 + strneb r6, [r1, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] + strneb r6, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + bne _022EBFA8 + ldrsh r1, [r8, #6] + ldrsh r0, [r7, #6] + sub r0, r1, r0 + bl abs + ldrsh r2, [r8, #4] + ldrsh r1, [r7, #4] + mov r5, r0 + sub r0, r2, r1 + bl abs + cmp r0, r5 + movle r0, r5 + cmp r0, #3 + movge r0, #2 + add r2, fp, r0, lsl #3 + ldr r1, [r2, #4] + add r0, r4, sl, lsl #3 + str r7, [r4, sl, lsl #3] + str r1, [r0, #4] + str r0, [r2, #4] +_022EBFA8: + add sl, sl, #1 + cmp sl, #4 + blt _022EBF18 + mov r7, #0 + add r5, sp, #0 + mov sl, #1 + mov r6, r7 + b _022EC00C +_022EBFC8: + ldr r4, [r5] + cmp r4, #0 + beq _022EC008 + ldr r2, [r4, #0xb4] + mov r0, r4 + strb sl, [r2, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] + mov r1, sl + strb r7, [r2, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + bl RunMonsterAi + mov r0, r4 + bl ExecuteMonsterAction + bl ov29_022EF9C8 + mov r0, r6 + bl TryForcedLoss + mov r0, r4 + bl EntityIsValid__022EC608 +_022EC008: + ldr r5, [r5, #4] +_022EC00C: + cmp r5, #0 + bne _022EBFC8 + add sb, sb, #1 + cmp sb, #3 + blt _022EBED8 + bl IsFloorOver + cmp r0, #0 + bne _022EC094 + mov r4, #0 + ldr r5, _022EC2FC ; =DUNGEON_PTR + mov r6, r4 +_022EC038: + ldr r0, [r5] + add r0, r0, r4, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET] + mov r0, r7 + bl EntityIsValid__022EC608 + cmp r0, #0 + ldrne r8, [r7, #0xb4] + ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + cmpne r0, #0 + beq _022EC088 + mov r0, r7 + bl ov29_0230FC24 + mov r0, r7 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC088 + mov r0, r7 + bl EnemyEvolution + strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] +_022EC088: + add r4, r4, #1 + cmp r4, #4 + blt _022EC038 +_022EC094: + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + mov sb, #0 + mov r5, sb + mov r7, sb + ldr r6, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE + mov fp, #0x32 + ldr r4, _022EC2FC ; =DUNGEON_PTR + b _022EC1C0 +_022EC0BC: + ldr r0, [r4] + add r0, r0, sb, lsl #2 + add r0, r0, #0x12000 + ldr r8, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET] + mov r0, r8 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC1BC + bl IsFloorOver + cmp r0, #0 + bne _022EC1C8 + ldr sl, [r8, #0xb4] + ldr r1, [r4] + mov r0, r8 + str r8, [r1, #0xc4] + bl sub_01FFBDF4 + bl TryActivateArtificialWeatherAbilities + ldrh r0, [sl] + tst r0, #0x8000 + bne _022EC1BC + tst r0, #0x4000 + bicne r0, r0, #0x4000 + strneh r0, [sl] + bne _022EC1BC + mov r0, r8 + strb r7, [sl, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + bl CalcSpeedStageWrapper + ldr r2, [r4] + mla r1, r0, fp, r6 + add r0, r2, #0x700 + ldrsh r0, [r0, #0x80] + mov r0, r0, lsl #1 + ldrsh r0, [r0, r1] + cmp r0, #0 + beq _022EC1BC + ldrb r0, [sl, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2] + cmp r0, #0 + bne _022EC1BC + ldrh r1, [sl] + mov r0, r8 + bic r1, r1, #0xc000 + strh r1, [sl] + strb r5, [sl, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2] + bl TickStatusAndHealthRegen + mov r0, r8 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC1BC + mov r0, r8 + bl EnemyEvolution + mov r0, r8 + mov r1, #0 + bl RunMonsterAi + bl IsFloorOver + cmp r0, #0 + bne _022EC1C8 + mov r0, r8 + bl ExecuteMonsterAction + bl ov29_022EF9C8 + mov r0, #0 + bl TryForcedLoss + bl IsFloorOver + cmp r0, #0 + bne _022EC1C8 +_022EC1BC: + add sb, sb, #1 +_022EC1C0: + cmp sb, #0x10 + blt _022EC0BC +_022EC1C8: + bl IsFloorOver + cmp r0, #0 + bne _022EC23C + mov r4, #0 + ldr r5, _022EC2FC ; =DUNGEON_PTR + mov r6, r4 +_022EC1E0: + ldr r0, [r5] + add r0, r0, r4, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET] + mov r0, r7 + bl EntityIsValid__022EC608 + cmp r0, #0 + ldrne r8, [r7, #0xb4] + ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] + cmpne r0, #0 + beq _022EC230 + mov r0, r7 + bl ov29_0230FC24 + mov r0, r7 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC230 + mov r0, r7 + bl EnemyEvolution + strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2] +_022EC230: + add r4, r4, #1 + cmp r4, #0x10 + blt _022EC1E0 +_022EC23C: + bl IsFloorOver + cmp r0, #0 + bne _022EC2F4 + ldr r4, _022EC2FC ; =DUNGEON_PTR + ldr r1, _022EC304 ; =ov29_023522B6 + ldr r0, [r4] + add r0, r0, #0x700 + ldrsh r0, [r0, #0x80] + add r0, r0, #1 + mov r0, r0, lsl #1 + ldrsh r0, [r1, r0] + cmp r0, #0 + beq _022EC2C4 + mov r5, #0 + b _022EC2A4 +_022EC278: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 + ldr r0, [r0, #0xb78 + RUN_FRACTIONAL_TURN_OFFSET] + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC2A0 + mov r0, #0 + bl DisplayActions + b _022EC2AC +_022EC2A0: + add r5, r5, #1 +_022EC2A4: + cmp r5, #0x14 + blt _022EC278 +_022EC2AC: + mov r0, #1 + mov r1, #0 + bl TryActivateWeather + bl ov29_022EF9C8 + mov r0, #0 + bl TryForcedLoss +_022EC2C4: + ldr r1, _022EC2FC ; =DUNGEON_PTR + ldr r0, [r1] + add r0, r0, #0x700 + ldrsh r2, [r0, #0x80] + add r2, r2, #1 + strh r2, [r0, #0x80] + ldr r0, [r1] + add r0, r0, #0x700 + ldrsh r1, [r0, #0x80] + cmp r1, #0x18 + moveq r1, #0 + streqh r1, [r0, #0x80] +_022EC2F4: + add sp, sp, #0x40 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022EC2FC: .word DUNGEON_PTR +_022EC300: .word FRACTIONAL_TURN_SEQUENCE +_022EC304: .word ov29_023522B6 + arm_func_end RunFractionalTurn + + arm_func_start RunLeaderTurn +RunLeaderTurn: ; 0x022EC308 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl GetLeader + movs r4, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov29_02348FD8 + bl TryActivateArtificialWeatherAbilities + mov r0, r4 + bl CalcSpeedStageWrapper + ldr r1, _022EC600 ; =DUNGEON_PTR + ldr r3, _022EC604 ; =FRACTIONAL_TURN_SEQUENCE + ldr r2, [r1] + mov r1, #0x32 + add r2, r2, #0x700 + mla r1, r0, r1, r3 + ldrsh r2, [r2, #0x80] + mov r0, r2, lsl #1 + ldrsh r0, [r0, r1] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, [r4, #0xb4] +#ifdef JAPAN + ldrb r0, [r0, #0x14e] +#else + ldrb r0, [r0, #0x152] +#endif + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, r4 + mov r1, #1 + bl TryRestoreRoostTyping +_022EC380: + bl GetLeader + movs sb, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl sub_01FFBDF4 + mov r0, #0 + bl DisplayActions + cmp r0, #0 + bne _022EC3C8 + ldr r0, _022EC600 ; =DUNGEON_PTR + ldr r1, [r0] + ldrb r0, [r1, #0x78b] + cmp r0, #0 + ldreqb r0, [r1, #0x78e] + cmpeq r0, #0 + beq _022EC3C8 + mov r0, #0xc + bl AdvanceFrame +_022EC3C8: + cmp sb, #0 + moveq r0, #0 + beq _022EC3E8 + ldr r0, [sb] + cmp r0, #1 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff +_022EC3E8: + cmp r0, #0 + ldrne r0, [sb, #0xb4] + movne r1, #0 + strneb r1, [r0, #0x101] + bl IsFloorOver + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _022EC600 ; =DUNGEON_PTR + mov r1, #0 + ldr r2, [r0] + cmp sl, #0 + str sb, [r2, #0xc4] + ldr r0, [r0] + movne sl, r1 + str r1, [r0, #0xc8] + bne _022EC434 + mov r0, sb + bl TickStatusAndHealthRegen +_022EC434: + bl IsFloorOver + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + bl ov29_022E81F8 + mov r0, sb + bl EnemyEvolution + ldr r0, _022EC600 ; =DUNGEON_PTR + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x11] + bl SetLeaderAction + ldr r0, _022EC600 ; =DUNGEON_PTR + mov r1, #0 + ldr r0, [r0] + strb r1, [r0, #0x11] + bl IsFloorOver + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r0, sb + bl ExecuteMonsterAction + bl ov29_022EF9C8 + mov r0, #0 + bl TryForcedLoss + bl IsFloorOver + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r1, [sb, #0xb4] + ldrh r0, [r1] + tst r0, #0x8000 + bicne r0, r0, #0x8000 + strneh r0, [r1] + ldrneh r0, [r1] + orrne r0, r0, #0x4000 + strneh r0, [r1] + bl IsFloorOver + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _022EC600 ; =DUNGEON_PTR + ldr r1, [r4] + ldrb r0, [r1, #0x10] + cmp r0, #0 + beq _022EC59C + mov r7, #0 + strb r7, [r1, #0x10] + mov r5, r7 + mov fp, r7 + b _022EC594 +_022EC500: + ldr r0, [r4] + add r0, r0, r7, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r6, [r0, #0xad4] +#else + ldr r6, [r0, #0xb78] +#endif + mov r0, r6 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC590 + ldr r8, [r6, #0xb4] + ldrh r0, [r8] + tst r0, #0x8000 + beq _022EC590 + bl IsFloorOver + cmp r0, #0 + bne _022EC59C + mov r0, r6 + bl TickStatusAndHealthRegen + mov r0, r6 + bl EntityIsValid__022EC608 + cmp r0, #0 + beq _022EC590 + mov r0, r6 + bl EnemyEvolution + mov r0, r6 + mov r1, r5 + bl RunMonsterAi + mov r0, r6 + bl ExecuteMonsterAction + mov r0, fp + bl TryForcedLoss + ldrh r0, [r8] + bic r0, r0, #0x8000 + strh r0, [r8] + ldrh r0, [r8] + orr r0, r0, #0x4000 + strh r0, [r8] +_022EC590: + add r7, r7, #1 +_022EC594: + cmp r7, #0x14 + blt _022EC500 +_022EC59C: + bl IsFloorOver + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _022EC600 ; =DUNGEON_PTR + ldr r1, [r0] + ldr r0, [r1, #0xc8] + cmp r0, #0 + beq _022EC5DC + bl ChangeLeader + ldr r0, _022EC600 ; =DUNGEON_PTR + mov r1, #0 + ldr r0, [r0] + mov sl, #1 + str r1, [r0, #0xc8] + b _022EC380 +_022EC5DC: + ldr r0, [sb, #0xb4] + ldrb r0, [r0, #0x101] + cmp r0, #0 + addne r0, r1, #0x700 + movne r1, #0 + strneh r1, [r0, #0x80] + bne _022EC380 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022EC600: .word DUNGEON_PTR +_022EC604: .word FRACTIONAL_TURN_SEQUENCE + arm_func_end RunLeaderTurn diff --git a/include/direction.h b/include/direction.h index 1f87c0b5..fec1e4f1 100644 --- a/include/direction.h +++ b/include/direction.h @@ -17,5 +17,6 @@ enum direction_id { #define DIRECTION_MASK 7 #define NUM_DIRECTIONS 8 +#define DIR_NONE_UNSIGNED 0xFF #endif //PMDSKY_DIRECTION_H \ No newline at end of file diff --git a/include/dungeon_action_helper.h b/include/dungeon_action_helper.h new file mode 100644 index 00000000..aff4352c --- /dev/null +++ b/include/dungeon_action_helper.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_DUNGEON_ACTION_HELPER_H +#define PMDSKY_DUNGEON_ACTION_HELPER_H + +#include "dungeon_mode.h" + +void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction); + +#endif //PMDSKY_DUNGEON_ACTION_HELPER_H diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 00efc7e7..495fedca 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -105,7 +105,6 @@ struct action_parameter { struct action_data { enum action action_id; // 0x0: Action ID u8 direction; // 0x2: Direction in which the action will be performed - u8 field_0x3; struct action_parameter action_parameters[2]; // 0x4: Parameters for the action // 0x10: Position of the target that the Pokémon wants throw an item at. struct position item_target_position; diff --git a/main.lsf b/main.lsf index a425d0e1..76fd9f31 100644 --- a/main.lsf +++ b/main.lsf @@ -294,6 +294,8 @@ Overlay OVY_29 Object asm/overlay_29_022EAB50.o Object src/dungeon_action.o Object asm/overlay_29_022EB44C.o + Object src/dungeon_action_helper.o + Object asm/overlay_29_022EBCE8.o Object src/overlay_29_022EC608.o Object asm/overlay_29_022EC62C.o Object src/overlay_29_022ECDC0.o diff --git a/src/dungeon_action_helper.c b/src/dungeon_action_helper.c new file mode 100644 index 00000000..afe0fab5 --- /dev/null +++ b/src/dungeon_action_helper.c @@ -0,0 +1,11 @@ +#include "dungeon_action_helper.h" +#include "direction.h" +#include "dungeon_action.h" + +void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction) +{ + SetMonsterActionFields(monster_action, ACTION_USE_MOVE_AI); + monster_action->action_parameters[0].action_use_idx = move_index; + if (direction != DIR_NONE_UNSIGNED) + monster_action->direction = direction & DIRECTION_MASK; +} diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index cfac6cc7..8a80382b 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -2,6 +2,7 @@ #include "dg_random.h" #include "direction.h" #include "dungeon_action.h" +#include "dungeon_action_helper.h" #include "dungeon_ai_targeting.h" #include "dungeon_capabilities_3.h" #include "dungeon_capabilities_4.h" @@ -14,11 +15,12 @@ #define REGULAR_ATTACK_INDEX 4 +// The weight of the regular attack in the weighted random when the AI is deciding which move to use, depending on how many other attacks the AI can currently use. +// Each index in the array corresponds to the number of attacks (0-4) the AI can use (i.e., is enabled and has PP remaining). const s16 AI_REGULAR_ATTACK_WEIGHTS[5] = { 100, 20, 30, 40, 50 }; extern struct dungeon *DUNGEON_PTR[]; -extern void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction); extern void UpdateAiTargetPos(struct entity *monster); extern void InitMove(struct move *move, enum move_id move_id); extern u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move); diff --git a/src/dungeon_capabilities_3.c b/src/dungeon_capabilities_3.c index 6a194ddb..56dc22e2 100644 --- a/src/dungeon_capabilities_3.c +++ b/src/dungeon_capabilities_3.c @@ -107,7 +107,7 @@ enum mobility_type GetDirectionalMobilityType(struct entity* monster, enum mobil else if (mobility != MOBILITY_INTANGIBLE && IqSkillIsEnabled(monster, IQ_ALL_TERRAIN_HIKER)) mobility = MOBILITY_HOVERING; else if (IqSkillIsEnabled(monster, IQ_ABSOLUTE_MOVER)) { - if (direction == 0xFF) + if (direction == DIR_NONE_UNSIGNED) mobility = MOBILITY_INTANGIBLE; else if (direction & 1) // Absolute Mover can't break walls diagonally.