From d1b81605e4b8fbe1fed4230864942d6fa1e5fda7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 26 Feb 2025 14:40:44 +0100 Subject: [PATCH 1/2] Match sub_807F43C --- src/code_807E5AC.c | 914 +++++++++------------------------------------ 1 file changed, 177 insertions(+), 737 deletions(-) diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index dca37458b..be276ce13 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -22,9 +22,14 @@ #include "dungeon_ai.h" #include "code_806CD90.h" #include "code_807CD9C.h" +#include "dungeon_random.h" #include "code_805D8C8.h" +#include "code_803E668.h" #include "code_8045A00.h" +#include "move_util.h" +#include "moves.h" #include "code_80450F8.h" +#include "math.h" #include "constants/ability.h" #include "constants/monster.h" #include "constants/type.h" @@ -615,766 +620,201 @@ void sub_807F33C(void) extern void sub_80833E8(DungeonPos *param_1, s32 *param_2); extern void sub_806A5B8(Entity *); +extern bool8 sub_8045888(Entity *ent); +extern void sub_806F370(Entity *pokemon, Entity *target, u32, u32, u8 *, u8 moveType, s32, u32, u32, u32); +extern void sub_807D068(Entity *, DungeonPos *); +extern void sub_80694C0(Entity *target,s32 x,int y,char param_4); void sub_807F9BC(Entity *entity); -/* +extern const u8 *const gUnknown_80FCB40; +extern const u8 *const gUnknown_80FCB70; +extern const u8 *const gUnknown_80FE6B4; +extern const u8 *const gUnknown_80FE690; + void sub_807F43C(Entity *target, Entity *attacker) { + s32 attackerDirection; + s32 var_3C; + DungeonPos attackerPos; + s32 pixelPosX, pixelPosY; + PixelPos var_54; + s32 var_30, r10; + s32 r6; + s32 newDir; + s32 i, directionId; + Entity *tileEntity; + s32 var_2C; + DungeonPos positions[40]; + s32 var_74[4]; + s32 positionsCounter; + if (AbilityIsActive(attacker, ABILITY_SUCTION_CUPS)) { SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], attacker, 0); - TryDisplayDungeonLoggableMessage3(attacker, target, gUnknown_80FCB40); // is anchored, cannot be moved + TryDisplayDungeonLoggableMessage3(target, attacker, gUnknown_80FCB40); // is anchored, cannot be moved + return; } - else if (attacker == target) { + if (target == attacker) { SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], attacker, 0); - TryDisplayDungeonLoggableMessage3(attacker, attacker, gUnknown_80FCB70); // couldn't be thrown for some reason + TryDisplayDungeonLoggableMessage3(target, attacker, gUnknown_80FCB70); // couldn't be thrown for some reason + return; } - else { - s32 var_74[4]; - DungeonPos positions[40]; - DungeonPos attackerPos = attacker->pos; - s32 var_3C = 0; - s32 monId; - while (1) { - s32 positionsCounter = 0; - for (monId = 0; monId < DUNGEON_MAX_POKEMON; monId++) { - Entity *mon = gDungeon->activePokemon[monId]; - if (EntityIsValid(mon) && target != mon && attacker != mon && CanSeeTarget(target, mon)) { - if (var_3C == 0) { - if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 1) - continue; - } - else { - if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 0) - continue; + attackerPos = attacker->pos; + for (var_3C = 0; var_3C < 2; var_3C++) { + positionsCounter = 0; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + Entity *mon = gDungeon->activePokemon[i]; + if (EntityIsValid(mon) && target != mon && attacker != mon && CanSeeTarget(target, mon)) { + if (var_3C == 0) { + if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 1) + continue; + } + else { + if (GetTreatmentBetweenMonsters(target, mon, FALSE, TRUE) != 0) + continue; + } + + if (var_3C == 0) { + DungeonPos pos; + for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) { + pos.x = gAdjacentTileOffsets[directionId].x + mon->pos.x; + pos.y = gAdjacentTileOffsets[directionId].y + mon->pos.y; + if (!sub_80703A0(attacker, &pos)) + break; } - if (var_3C != 0) { - s32 directionId; - DungeonPos pos; - for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) { - pos.x = mon->pos.x + gAdjacentTileOffsets[directionId].x; - pos.y = mon->pos.y + gAdjacentTileOffsets[directionId].y; - if (!sub_80703A0(attacker, &pos)) - break; - } - - if (directionId == NUM_DIRECTIONS) - break; - if (positionsCounter > 39) - break; + if (directionId != NUM_DIRECTIONS && positionsCounter < 40) { positions[positionsCounter++] = mon->pos; } - else { - s32 directionId; - DungeonPos pos; - for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) { - pos.x = mon->pos.x + gAdjacentTileOffsets[directionId].x; - pos.y = mon->pos.y + gAdjacentTileOffsets[directionId].y; - if (!sub_80703A0(attacker, &pos) && positionsCounter < 40) { - positions[positionsCounter++] = mon->pos; - } + } + else { + DungeonPos pos; + for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) { + pos.x = gAdjacentTileOffsets[directionId].x + mon->pos.x; + pos.y = gAdjacentTileOffsets[directionId].y + mon->pos.y; + if (!sub_80703A0(attacker, &pos) && positionsCounter < 40) { + positions[positionsCounter++] = pos; } } } } - - if (positionsCounter == 0) { - if (++var_3C < 2) - continue; - sub_80833E8(&target->pos, var_74); - } - else { - - } - break; } + if (positionsCounter != 0) + break; } -} -*/ -NAKED void sub_807F43C(Entity *target, Entity *attacker) -{ - asm_unified("push {r4-r7,lr}\n" -" mov r7, r10\n" -" mov r6, r9\n" -" mov r5, r8\n" -" push {r5-r7}\n" -" sub sp, 0x10C\n" -" str r0, [sp, 0xEC]\n" -" mov r8, r1\n" -" mov r0, r8\n" -" movs r1, 0xE\n" -" bl AbilityIsActive\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F470\n" -" ldr r0, _0807F468\n" -" mov r1, r8\n" -" movs r2, 0\n" -" bl SubstitutePlaceholderStringTags\n" -" ldr r0, _0807F46C\n" -" b _0807F694\n" -" .align 2, 0\n" -"_0807F468: .4byte gFormatBuffer_Monsters\n" -"_0807F46C: .4byte gUnknown_80FCB40\n" -"_0807F470:\n" -" ldr r0, [sp, 0xEC]\n" -" cmp r0, r8\n" -" bne _0807F490\n" -" ldr r0, _0807F488\n" -" mov r1, r8\n" -" movs r2, 0\n" -" bl SubstitutePlaceholderStringTags\n" -" ldr r0, _0807F48C\n" -" ldr r2, [r0]\n" -" mov r0, r8\n" -" b _0807F698\n" -" .align 2, 0\n" -"_0807F488: .4byte gFormatBuffer_Monsters\n" -"_0807F48C: .4byte gUnknown_80FCB70\n" -"_0807F490:\n" -" mov r1, r8\n" -" ldr r0, [r1, 0x4]\n" -" add r1, sp, 0xD4\n" -" str r0, [r1]\n" -" movs r2, 0\n" -" str r2, [sp, 0xF0]\n" -"_0807F49C:\n" -" movs r3, 0\n" -" mov r9, r3\n" -" movs r7, 0\n" -" mov r4, sp\n" -" adds r4, 0x18\n" -" str r4, [sp, 0x108]\n" -"_0807F4A8:\n" -" ldr r0, _0807F504\n" -" ldr r0, [r0]\n" -" lsls r1, r7, 2\n" -" ldr r2, _0807F508\n" -" adds r0, r2\n" -" adds r0, r1\n" -" ldr r4, [r0]\n" -" adds r0, r4, 0\n" -" bl EntityIsValid\n" -" lsls r0, 24\n" -" adds r3, r7, 0x1\n" -" str r3, [sp, 0x104]\n" -" cmp r0, 0\n" -" bne _0807F4C8\n" -" b _0807F602\n" -"_0807F4C8:\n" -" ldr r0, [sp, 0xEC]\n" -" cmp r0, r4\n" -" bne _0807F4D0\n" -" b _0807F602\n" -"_0807F4D0:\n" -" cmp r8, r4\n" -" bne _0807F4D6\n" -" b _0807F602\n" -"_0807F4D6:\n" -" adds r1, r4, 0\n" -" bl CanSeeTarget\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" bne _0807F4E4\n" -" b _0807F602\n" -"_0807F4E4:\n" -" ldr r1, [sp, 0xF0]\n" -" cmp r1, 0\n" -" bne _0807F50C\n" -" ldr r0, [sp, 0xEC]\n" -" adds r1, r4, 0\n" -" movs r2, 0\n" -" movs r3, 0x1\n" -" bl GetTreatmentBetweenMonsters\n" -" lsls r0, 24\n" -" lsrs r0, 24\n" -" cmp r0, 0x1\n" -" beq _0807F500\n" -" b _0807F602\n" -"_0807F500:\n" -" b _0807F51E\n" -" .align 2, 0\n" -"_0807F504: .4byte gDungeon\n" -"_0807F508: .4byte 0x000135cc\n" -"_0807F50C:\n" -" ldr r0, [sp, 0xEC]\n" -" adds r1, r4, 0\n" -" movs r2, 0\n" -" movs r3, 0x1\n" -" bl GetTreatmentBetweenMonsters\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" bne _0807F602\n" -"_0807F51E:\n" -" ldr r2, [sp, 0xF0]\n" -" cmp r2, 0\n" -" bne _0807F594\n" -" movs r5, 0\n" -" add r6, sp, 0xC8\n" -" adds r3, r7, 0x1\n" -" str r3, [sp, 0x104]\n" -" adds r7, r6, 0\n" -" ldr r0, _0807F588\n" -" mov r10, r0\n" -"_0807F532:\n" -" ldr r0, _0807F58C\n" -" lsls r3, r5, 2\n" -" adds r3, r0\n" -" ldrh r0, [r4, 0x4]\n" -" ldrh r1, [r3]\n" -" adds r0, r1\n" -" lsls r0, 16\n" -" lsrs r0, 16\n" -" ldr r1, [r6]\n" -" mov r2, r10\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [r7]\n" -" ldrh r2, [r4, 0x6]\n" -" ldrh r3, [r3, 0x2]\n" -" adds r2, r3\n" -" lsls r2, 16\n" -" ldr r0, _0807F590\n" -" ands r1, r0\n" -" orrs r1, r2\n" -" str r1, [r7]\n" -" mov r0, r8\n" -" add r1, sp, 0xC8\n" -" bl sub_80703A0\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F570\n" -" adds r5, 0x1\n" -" cmp r5, 0x7\n" -" ble _0807F532\n" -"_0807F570:\n" -" cmp r5, 0x8\n" -" beq _0807F602\n" -" mov r3, r9\n" -" cmp r3, 0x27\n" -" bgt _0807F602\n" -" ldr r0, [r4, 0x4]\n" -" ldr r4, [sp, 0x108]\n" -" stm r4!, {r0}\n" -" str r4, [sp, 0x108]\n" -" movs r0, 0x1\n" -" add r9, r0\n" -" b _0807F602\n" -" .align 2, 0\n" -"_0807F588: .4byte 0xffff0000\n" -"_0807F58C: .4byte gAdjacentTileOffsets\n" -"_0807F590: .4byte 0x0000ffff\n" -"_0807F594:\n" -" movs r5, 0\n" -" add r6, sp, 0xCC\n" -" adds r1, r7, 0x1\n" -" str r1, [sp, 0x104]\n" -" adds r7, r6, 0\n" -" mov r2, r9\n" -" lsls r0, r2, 2\n" -" add r0, sp\n" -" adds r0, 0x18\n" -" mov r10, r0\n" -"_0807F5A8:\n" -" ldr r0, _0807F630\n" -" lsls r3, r5, 2\n" -" adds r3, r0\n" -" ldrh r0, [r4, 0x4]\n" -" ldrh r1, [r3]\n" -" adds r0, r1\n" -" lsls r0, 16\n" -" lsrs r0, 16\n" -" ldr r2, _0807F634\n" -" ldr r1, [r6]\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [r7]\n" -" ldrh r2, [r4, 0x6]\n" -" ldrh r3, [r3, 0x2]\n" -" adds r2, r3\n" -" lsls r2, 16\n" -" ldr r0, _0807F638\n" -" ands r1, r0\n" -" orrs r1, r2\n" -" str r1, [r7]\n" -" mov r0, r8\n" -" add r1, sp, 0xCC\n" -" bl sub_80703A0\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" bne _0807F5FC\n" -" mov r2, r9\n" -" cmp r2, 0x27\n" -" bgt _0807F5FC\n" -" ldr r0, [r6]\n" -" mov r3, r10\n" -" adds r3, 0x4\n" -" mov r10, r3\n" -" subs r3, 0x4\n" -" stm r3!, {r0}\n" -" ldr r0, [sp, 0x108]\n" -" adds r0, 0x4\n" -" str r0, [sp, 0x108]\n" -" movs r1, 0x1\n" -" add r9, r1\n" -"_0807F5FC:\n" -" adds r5, 0x1\n" -" cmp r5, 0x7\n" -" ble _0807F5A8\n" -"_0807F602:\n" -" ldr r7, [sp, 0x104]\n" -" cmp r7, 0x13\n" -" bgt _0807F60A\n" -" b _0807F4A8\n" -"_0807F60A:\n" -" mov r2, r9\n" -" cmp r2, 0\n" -" bne _0807F63C\n" -" ldr r3, [sp, 0xF0]\n" -" adds r3, 0x1\n" -" str r3, [sp, 0xF0]\n" -" cmp r3, 0x1\n" -" bgt _0807F61C\n" -" b _0807F49C\n" -"_0807F61C:\n" -" ldr r0, [sp, 0xEC]\n" -" adds r0, 0x4\n" -" add r4, sp, 0xB8\n" -" adds r1, r4, 0\n" -" bl sub_80833E8\n" -" movs r7, 0\n" -" add r5, sp, 0xD0\n" -" adds r6, r5, 0\n" -" b _0807F654\n" -" .align 2, 0\n" -"_0807F630: .4byte gAdjacentTileOffsets\n" -"_0807F634: .4byte 0xffff0000\n" -"_0807F638: .4byte 0x0000ffff\n" -"_0807F63C:\n" -" mov r0, r9\n" -" bl DungeonRandInt\n" -" lsls r0, 2\n" -" add r0, sp\n" -" adds r0, 0x18\n" -" ldr r0, [r0]\n" -" str r0, [sp, 0xD4]\n" -" b _0807F6A8\n" -"_0807F64E:\n" -" ldr r0, [r5]\n" -" str r0, [sp, 0xD4]\n" -" b _0807F68E\n" -"_0807F654:\n" -" ldr r0, [r4]\n" -" ldr r1, [r4, 0x8]\n" -" bl DungeonRandRange\n" -" lsls r0, 16\n" -" lsrs r0, 16\n" -" ldr r2, _0807F6A0\n" -" ldr r1, [r5]\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [r6]\n" -" ldr r0, [r4, 0x4]\n" -" ldr r1, [r4, 0xC]\n" -" bl DungeonRandRange\n" -" lsls r0, 16\n" -" ldrh r1, [r6]\n" -" orrs r1, r0\n" -" str r1, [r6]\n" -" mov r0, r8\n" -" add r1, sp, 0xD0\n" -" bl sub_80703A0\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F64E\n" -" adds r7, 0x1\n" -" cmp r7, 0x63\n" -" ble _0807F654\n" -"_0807F68E:\n" -" cmp r7, 0x64\n" -" bne _0807F6A8\n" -" ldr r0, _0807F6A4\n" -"_0807F694:\n" -" ldr r2, [r0]\n" -" ldr r0, [sp, 0xEC]\n" -"_0807F698:\n" -" mov r1, r8\n" -" bl TryDisplayDungeonLoggableMessage3\n" -" b _0807F99C\n" -" .align 2, 0\n" -"_0807F6A0: .4byte 0xffff0000\n" -"_0807F6A4: .4byte gUnknown_80FE6B4\n" -"_0807F6A8:\n" -" ldr r0, _0807F860\n" -" mov r1, r8\n" -" movs r2, 0\n" -" bl SubstitutePlaceholderStringTags\n" -" ldr r0, _0807F864\n" -" ldr r2, [r0]\n" -" ldr r0, [sp, 0xEC]\n" -" mov r1, r8\n" -" bl TryDisplayDungeonLoggableMessage3\n" -" mov r0, r8\n" -" bl sub_8045888\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F6D0\n" -" ldr r0, _0807F868\n" -" bl PlaySoundEffect\n" -"_0807F6D0:\n" -" movs r4, 0\n" -" str r4, [sp, 0x100]\n" -" mov r1, r8\n" -" ldr r0, [r1, 0x70]\n" -" adds r0, 0x46\n" -" ldrb r0, [r0]\n" -" mov r9, r0\n" -" add r2, sp, 0xD4\n" -" movs r3, 0\n" -" ldrsh r1, [r2, r3]\n" -" mov r4, r8\n" -" movs r3, 0x4\n" -" ldrsh r0, [r4, r3]\n" -" subs r3, r1, r0\n" -" movs r4, 0x2\n" -" ldrsh r1, [r2, r4]\n" -" mov r2, r8\n" -" movs r4, 0x6\n" -" ldrsh r0, [r2, r4]\n" -" subs r1, r0\n" -" cmp r1, r3\n" -" bge _0807F6FE\n" -" adds r1, r3, 0\n" -"_0807F6FE:\n" -" lsls r6, r1, 4\n" -" cmp r6, 0x50\n" -" ble _0807F706\n" -" movs r6, 0x50\n" -"_0807F706:\n" -" cmp r6, 0x9\n" -" bgt _0807F70C\n" -" movs r6, 0xA\n" -"_0807F70C:\n" -" mov r1, r8\n" -" adds r1, 0x4\n" -" add r0, sp, 0xD4\n" -" bl GetDirectionTowardsPosition\n" -" adds r5, r0, 0\n" -" add r2, sp, 0xD4\n" -" movs r1, 0\n" -" ldrsh r0, [r2, r1]\n" -" lsls r4, r0, 1\n" -" adds r4, r0\n" -" lsls r4, 11\n" -" movs r3, 0xC0\n" -" lsls r3, 4\n" -" adds r4, r3\n" -" ldr r0, _0807F86C\n" -" lsls r5, 2\n" -" adds r5, r0\n" -" movs r1, 0\n" -" ldrsh r0, [r5, r1]\n" -" lsls r0, 8\n" -" movs r1, 0x3\n" -" bl __divsi3\n" -" adds r4, r0\n" -" str r4, [sp, 0xF4]\n" -" movs r3, 0xD6\n" -" add r3, sp\n" -" movs r2, 0\n" -" ldrsh r0, [r3, r2]\n" -" lsls r4, r0, 1\n" -" adds r4, r0\n" -" lsls r4, 11\n" -" movs r0, 0x80\n" -" lsls r0, 5\n" -" adds r4, r0\n" -" movs r1, 0x2\n" -" ldrsh r0, [r5, r1]\n" -" lsls r0, 8\n" -" movs r1, 0x3\n" -" bl __divsi3\n" -" adds r4, r0\n" -" str r4, [sp, 0xF8]\n" -" mov r2, r8\n" -" ldr r5, [r2, 0xC]\n" -" ldr r3, [sp, 0xF4]\n" -" subs r0, r3, r5\n" -" adds r1, r6, 0\n" -" bl __divsi3\n" -" str r0, [sp, 0xFC]\n" -" mov r0, r8\n" -" ldr r4, [r0, 0x10]\n" -" ldr r1, [sp, 0xF8]\n" -" subs r0, r1, r4\n" -" adds r1, r6, 0\n" -" bl __divsi3\n" -" mov r10, r0\n" -" add r0, sp, 0xD8\n" -" str r5, [r0]\n" -" str r4, [r0, 0x4]\n" -" movs r7, 0\n" -" adds r5, r0, 0\n" -" cmp r7, r6\n" -" bge _0807F7FC\n" -" adds r4, r5, 0\n" -"_0807F794:\n" -" ldr r0, [r5]\n" -" ldr r2, [sp, 0xFC]\n" -" adds r0, r2, r0\n" -" str r0, [r4]\n" -" ldr r0, [r4, 0x4]\n" -" add r0, r10\n" -" str r0, [r4, 0x4]\n" -" mov r0, r8\n" -" adds r1, r4, 0\n" -" bl sub_804535C\n" -" mov r0, r8\n" -" bl sub_8045888\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F7E6\n" -" ldr r0, [sp, 0x100]\n" -" bl sin_4096\n" -" lsls r0, 5\n" -" mov r3, r8\n" -" str r0, [r3, 0x1C]\n" -" movs r0, 0x3B\n" -" bl sub_803E46C\n" -" movs r0, 0x3\n" -" ands r0, r7\n" -" cmp r0, 0\n" -" bne _0807F7E6\n" -" movs r0, 0x7\n" -" mov r1, r9\n" -" ands r1, r0\n" -" mov r9, r1\n" -" mov r0, r8\n" -" movs r1, 0x6\n" -" mov r2, r9\n" -" bl sub_806CDD4\n" -" movs r2, 0x1\n" -" add r9, r2\n" -"_0807F7E6:\n" -" movs r0, 0x80\n" -" lsls r0, 4\n" -" adds r1, r6, 0\n" -" bl __divsi3\n" -" ldr r3, [sp, 0x100]\n" -" adds r3, r0\n" -" str r3, [sp, 0x100]\n" -" adds r7, 0x1\n" -" cmp r7, r6\n" -" blt _0807F794\n" -"_0807F7FC:\n" -" ldr r4, [sp, 0xF4]\n" -" str r4, [r5]\n" -" add r1, sp, 0xD8\n" -" ldr r0, [sp, 0xF8]\n" -" str r0, [r1, 0x4]\n" -" movs r0, 0\n" -" mov r2, r8\n" -" str r0, [r2, 0x1C]\n" -" mov r0, r8\n" -" bl sub_804535C\n" -" movs r0, 0x3B\n" -" bl sub_803E46C\n" -" mov r3, r8\n" -" ldr r0, [r3, 0x70]\n" -" movs r1, 0x7\n" -" mov r4, r9\n" -" ands r4, r1\n" -" adds r0, 0x46\n" -" strb r4, [r0]\n" -" add r2, sp, 0xD4\n" -" movs r1, 0\n" -" ldrsh r0, [r2, r1]\n" -" adds r4, r2, 0\n" -" movs r3, 0x2\n" -" ldrsh r1, [r4, r3]\n" -" bl GetTile\n" -" ldr r6, [r0, 0x10]\n" -" adds r0, r6, 0\n" -" bl EntityIsValid\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" bne _0807F876\n" -" add r2, sp, 0xD4\n" -" movs r0, 0\n" -" ldrsh r1, [r2, r0]\n" -" movs r3, 0x2\n" -" ldrsh r2, [r4, r3]\n" -" mov r0, r8\n" -" movs r3, 0x1\n" -" bl sub_80694C0\n" -" mov r0, r8\n" -" bl sub_807F9BC\n" -" b _0807F99C\n" -" .align 2, 0\n" -"_0807F860: .4byte gFormatBuffer_Monsters\n" -"_0807F864: .4byte gUnknown_80FE690\n" -"_0807F868: .4byte 0x000001a3\n" -"_0807F86C: .4byte gAdjacentTileOffsets\n" -"_0807F870:\n" -" ldr r0, [r7]\n" -" str r0, [sp, 0xD4]\n" -" b _0807F8BE\n" -"_0807F876:\n" -" movs r5, 0\n" -" add r4, sp, 0xE0\n" -" adds r7, r4, 0\n" -"_0807F87C:\n" -" ldr r0, _0807F8D0\n" -" lsls r3, r5, 2\n" -" adds r3, r0\n" -" add r1, sp, 0xD4\n" -" ldrh r0, [r1]\n" -" ldrh r2, [r3]\n" -" adds r0, r2\n" -" lsls r0, 16\n" -" lsrs r0, 16\n" -" ldr r2, _0807F8D4\n" -" ldr r1, [r7]\n" -" ands r1, r2\n" -" orrs r1, r0\n" -" str r1, [r4]\n" -" add r0, sp, 0xD4\n" -" ldrh r2, [r0, 0x2]\n" -" ldrh r3, [r3, 0x2]\n" -" adds r2, r3\n" -" lsls r2, 16\n" -" ldr r0, _0807F8D8\n" -" ands r1, r0\n" -" orrs r1, r2\n" -" str r1, [r4]\n" -" mov r0, r8\n" -" add r1, sp, 0xE0\n" -" bl sub_80703A0\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F870\n" -" adds r5, 0x1\n" -" cmp r5, 0x7\n" -" ble _0807F87C\n" -"_0807F8BE:\n" -" cmp r5, 0x8\n" -" bne _0807F8DC\n" -" ldr r0, [sp, 0xEC]\n" -" mov r1, r8\n" -" movs r2, 0\n" -" movs r3, 0\n" -" bl WarpTarget\n" -" b _0807F8FA\n" -" .align 2, 0\n" -"_0807F8D0: .4byte gAdjacentTileOffsets\n" -"_0807F8D4: .4byte 0xffff0000\n" -"_0807F8D8: .4byte 0x0000ffff\n" -"_0807F8DC:\n" -" mov r0, r8\n" -" add r1, sp, 0xD4\n" -" bl sub_807D068\n" -" add r0, sp, 0xD4\n" -" movs r3, 0\n" -" ldrsh r1, [r0, r3]\n" -" movs r0, 0xD6\n" -" add r0, sp\n" -" movs r4, 0\n" -" ldrsh r2, [r0, r4]\n" -" mov r0, r8\n" -" movs r3, 0x1\n" -" bl sub_80694C0\n" -"_0807F8FA:\n" -" adds r0, r6, 0\n" -" bl GetEntityType\n" -" cmp r0, 0x1\n" -" bne _0807F954\n" -" add r4, sp, 0xE4\n" -" ldr r1, _0807F9AC\n" -" adds r0, r4, 0\n" -" bl InitPokemonMove\n" -" adds r0, r6, 0\n" -" adds r1, r4, 0\n" -" bl sub_80571F0\n" -" lsls r0, 24\n" -" lsrs r1, r0, 24\n" -" cmp r1, 0\n" -" bne _0807F93C\n" -" ldr r0, _0807F9B0\n" -" movs r3, 0\n" -" ldrsh r2, [r0, r3]\n" -" str r1, [sp]\n" -" str r1, [sp, 0x4]\n" -" ldr r0, _0807F9B4\n" -" str r0, [sp, 0x8]\n" -" str r1, [sp, 0xC]\n" -" str r1, [sp, 0x10]\n" -" str r1, [sp, 0x14]\n" -" ldr r0, [sp, 0xEC]\n" -" adds r1, r6, 0\n" -" movs r3, 0\n" -" bl sub_806F370\n" -"_0807F93C:\n" -" adds r0, r6, 0\n" -" bl EntityIsValid\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F954\n" -" ldr r0, [r6, 0x70]\n" -" adds r0, 0x46\n" -" ldrb r1, [r0]\n" -" adds r0, r6, 0\n" -" bl sub_806CE68\n" -"_0807F954:\n" -" ldr r0, _0807F9B0\n" -" movs r4, 0\n" -" ldrsh r2, [r0, r4]\n" -" movs r1, 0\n" -" str r1, [sp]\n" -" str r1, [sp, 0x4]\n" -" ldr r0, _0807F9B8\n" -" str r0, [sp, 0x8]\n" -" str r1, [sp, 0xC]\n" -" str r1, [sp, 0x10]\n" -" str r1, [sp, 0x14]\n" -" ldr r0, [sp, 0xEC]\n" -" mov r1, r8\n" -" movs r3, 0\n" -" bl sub_806F370\n" -" mov r0, r8\n" -" bl EntityIsValid\n" -" lsls r0, 24\n" -" cmp r0, 0\n" -" beq _0807F98E\n" -" mov r1, r8\n" -" ldr r0, [r1, 0x70]\n" -" adds r0, 0x46\n" -" ldrb r1, [r0]\n" -" mov r0, r8\n" -" bl sub_806CE68\n" -"_0807F98E:\n" -" movs r0, 0x1E\n" -" movs r1, 0x3B\n" -" bl sub_803E708\n" -" mov r0, r8\n" -" bl sub_807F9BC\n" -"_0807F99C:\n" -" add sp, 0x10C\n" -" pop {r3-r5}\n" -" mov r8, r3\n" -" mov r9, r4\n" -" mov r10, r5\n" -" pop {r4-r7}\n" -" pop {r0}\n" -" bx r0\n" -" .align 2, 0\n" -"_0807F9AC: .4byte 0x00000163\n" -"_0807F9B0: .4byte gHurlOrbDmgValue\n" -"_0807F9B4: .4byte 0x0000021a\n" -"_0807F9B8: .4byte 0x00000219"); + if (positionsCounter != 0) { + s32 rnd = DungeonRandInt(positionsCounter); + attackerPos = positions[rnd]; + } + else { + sub_80833E8(&target->pos, var_74); + for (i = 0; i < 100; i++) { + DungeonPos pos; + pos.x = DungeonRandRange(var_74[0], var_74[2]); + pos.y = DungeonRandRange(var_74[1], var_74[3]); + if (!sub_80703A0(attacker, &pos)) { + attackerPos = pos; + break; + } + } + if (i == 100) { + TryDisplayDungeonLoggableMessage3(target, attacker, gUnknown_80FE6B4); // But it didn~27t go anywhere. + return; + } + } + + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], attacker, 0); + TryDisplayDungeonLoggableMessage3(target, attacker, gUnknown_80FE690); // m0 was sent flying! + if (sub_8045888(attacker)) { + PlaySoundEffect(0x1A3); + } + + var_2C = 0; + attackerDirection = GetEntInfo(attacker)->action.direction; + r6 = max(attackerPos.x - attacker->pos.x, attackerPos.y - attacker->pos.y) << 4; + if (r6 > 80) + r6 = 80; + if (r6 < 10) + r6 = 10; + + newDir = GetDirectionTowardsPosition(&attackerPos, &attacker->pos); + + pixelPosX = (((attackerPos.x * 24) + 12) << 8) + ((gAdjacentTileOffsets[newDir].x << 8) / 3); + pixelPosY = (((attackerPos.y * 24) + 16) << 8) + ((gAdjacentTileOffsets[newDir].y << 8) / 3); + + var_30 = (pixelPosX - attacker->pixelPos.x) / r6; + r10 = (pixelPosY - attacker->pixelPos.y) / r6; + var_54.x = attacker->pixelPos.x; + var_54.y = attacker->pixelPos.y; + for (i = 0; i < r6; i++) { + var_54.x += var_30; + var_54.y += r10; + sub_804535C(attacker, &var_54); + if (sub_8045888(attacker)) { + attacker->unk1C.raw = sin_4096(var_2C) << 5; + sub_803E46C(0x3B); + if (!(i & 3)) { + attackerDirection &= DIRECTION_MASK; + sub_806CDD4(attacker, 6, attackerDirection); + attackerDirection++; + } + } + var_2C += (0x800 / r6); + } + + var_54.x = pixelPosX; + var_54.y = pixelPosY; + attacker->unk1C.raw = 0; + sub_804535C(attacker, &var_54); + sub_803E46C(0x3B); + GetEntInfo(attacker)->action.direction = attackerDirection & DIRECTION_MASK; + + tileEntity = GetTile(attackerPos.x, attackerPos.y)->monster; + if (!EntityIsValid(tileEntity)) { + sub_80694C0(attacker, attackerPos.x, attackerPos.y, 1); + sub_807F9BC(attacker); + } + else { + for (directionId = 0; directionId < NUM_DIRECTIONS; directionId++) { + DungeonPos pos; + + pos.x = gAdjacentTileOffsets[directionId].x + attackerPos.x; + pos.y = gAdjacentTileOffsets[directionId].y + attackerPos.y; + if (!sub_80703A0(attacker, &pos)) { + attackerPos = pos; + break; + } + } + if (directionId == NUM_DIRECTIONS) { + WarpTarget(target, attacker, 0, NULL); + } + else { + sub_807D068(attacker, &attackerPos); + sub_80694C0(attacker, attackerPos.x, attackerPos.y, 1); + } + + if (GetEntityType(tileEntity) == ENTITY_MONSTER) { + Move move; + + InitPokemonMove(&move, MOVE_REGULAR_ATTACK); + if (!sub_80571F0(tileEntity, &move)) { + sub_806F370(target, tileEntity, gHurlOrbDmgValue, FALSE, NULL, TYPE_NONE, 0x21A, 0, 0, 0); + } + if (EntityIsValid(tileEntity)) { + sub_806CE68(tileEntity, GetEntInfo(tileEntity)->action.direction); + } + } + + sub_806F370(target, attacker, gHurlOrbDmgValue, FALSE, NULL, TYPE_NONE, 0x219, 0, 0, 0); + if (EntityIsValid(attacker)) { + sub_806CE68(attacker, GetEntInfo(attacker)->action.direction); + } + sub_803E708(0x1E, 0x3B); + sub_807F9BC(attacker); + } } void sub_807F9BC(Entity *entity) From 9d723ee37cb20db9886c05fcc3fd31568e283eea Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 26 Feb 2025 15:09:10 +0100 Subject: [PATCH 2/2] Make pos->pixelPos conversion more readable --- include/structs/str_position.h | 3 +++ src/code_8041AD0.c | 4 ++-- src/code_8073CF0.c | 8 ++++---- src/code_807CD9C.c | 4 ++-- src/code_807E5AC.c | 4 ++-- src/dungeon_cutscenes.c | 18 ++++++------------ src/dungeon_move.c | 18 ++++++------------ src/dungeon_util.c | 9 ++++----- src/dungeon_util_1.c | 2 +- src/move_actions.c | 11 ++--------- 10 files changed, 32 insertions(+), 49 deletions(-) diff --git a/include/structs/str_position.h b/include/structs/str_position.h index e56ee1d18..42b312f96 100644 --- a/include/structs/str_position.h +++ b/include/structs/str_position.h @@ -19,6 +19,9 @@ typedef struct PixelPos /* 0x4 */ s32 y; } PixelPos; +#define X_POS_TO_PIXELPOS(x)((((x) * 24) + 12) << 8) +#define Y_POS_TO_PIXELPOS(y)((((y) * 24) + 16) << 8) + /** * Currently only used in script data, for entities and GroundLink data. * DungeonPos expressed in terms of *graphics* tiles, 8 pixels per unit. diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 53be37e00..6e87e719c 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -58,8 +58,8 @@ s32 sub_80416A4(DungeonPos *pos_1, u32 param_2, bool8 param_3) { PixelPos pos; - pos.x = pos_1->x * 0x1800 + 0xc00; - pos.y = pos_1->y * 0x1800 + 0x1000; + pos.x = X_POS_TO_PIXELPOS(pos_1->x); + pos.y = Y_POS_TO_PIXELPOS(pos_1->y); return sub_80416E0(&pos, param_2, param_3); } diff --git a/src/code_8073CF0.c b/src/code_8073CF0.c index f2ad85430..6a06e5be5 100644 --- a/src/code_8073CF0.c +++ b/src/code_8073CF0.c @@ -892,8 +892,8 @@ bool8 UseAttack(Entity *a0) PixelPos pos; monInfo->flags |= 0x2000; - pos.x = (monInfo->unk184[0].previousTargetMovePosition2.x * 0x1800) + 0xC00; - pos.y = (monInfo->unk184[0].previousTargetMovePosition2.y * 0x1800) + 0x1000; + pos.x = X_POS_TO_PIXELPOS(monInfo->unk184[0].previousTargetMovePosition2.x); + pos.y = Y_POS_TO_PIXELPOS(monInfo->unk184[0].previousTargetMovePosition2.y); sub_804535C(mon, &pos); sub_806CDFC(mon, 0, monInfo->unk184[0].lastMoveDirection); monInfo->notMoving = 0; @@ -929,8 +929,8 @@ bool8 UseAttack(Entity *a0) else { PixelPos pos; - pos.x = (monInfo->unk184[monInfo->notMoving].previousTargetMovePosition2.x * 0x1800) + 0xC00; - pos.y = (monInfo->unk184[monInfo->notMoving].previousTargetMovePosition2.y * 0x1800) + 0x1000; + pos.x = X_POS_TO_PIXELPOS(monInfo->unk184[monInfo->notMoving].previousTargetMovePosition2.x); + pos.y = Y_POS_TO_PIXELPOS(monInfo->unk184[monInfo->notMoving].previousTargetMovePosition2.y); sub_804535C(mon, &pos); sub_806CDFC(mon, 0, monInfo->unk184[monInfo->notMoving].lastMoveDirection); } diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index 8f4874380..1edaa4117 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -202,8 +202,8 @@ void sub_807D068(Entity *pokemon, DungeonPos *pos) int incrementX; int incrementY; - posX = pos->x * 0x1800 + 0xc00; - posY = pos->y * 0x1800 + 0x1000; + posX = X_POS_TO_PIXELPOS(pos->x); + posY = Y_POS_TO_PIXELPOS(pos->y); diff = (pokemon->pixelPos).x - posX; if (diff < 0) { diff = -diff; diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index be276ce13..d3fd624f9 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -742,8 +742,8 @@ void sub_807F43C(Entity *target, Entity *attacker) newDir = GetDirectionTowardsPosition(&attackerPos, &attacker->pos); - pixelPosX = (((attackerPos.x * 24) + 12) << 8) + ((gAdjacentTileOffsets[newDir].x << 8) / 3); - pixelPosY = (((attackerPos.y * 24) + 16) << 8) + ((gAdjacentTileOffsets[newDir].y << 8) / 3); + pixelPosX = X_POS_TO_PIXELPOS(attackerPos.x) + ((gAdjacentTileOffsets[newDir].x << 8) / 3); + pixelPosY = Y_POS_TO_PIXELPOS(attackerPos.y) + ((gAdjacentTileOffsets[newDir].y << 8) / 3); var_30 = (pixelPosX - attacker->pixelPos.x) / r6; r10 = (pixelPosY - attacker->pixelPos.y) / r6; diff --git a/src/dungeon_cutscenes.c b/src/dungeon_cutscenes.c index 0760645f4..010fe490c 100644 --- a/src/dungeon_cutscenes.c +++ b/src/dungeon_cutscenes.c @@ -1270,12 +1270,10 @@ void MoltresScreenFlash1(s32 xArg, s32 yArg) s32 x, y; DungeonPos newPos; - x = (xArg * 3) << 11; - x += 0xC00; + x = X_POS_TO_PIXELPOS(xArg); newPos.x = x / 256; - y = (yArg * 3) << 11; - y += 0x1000; + y = Y_POS_TO_PIXELPOS(yArg); newPos.y = y / 256; sub_8085EC8(370,16,0,&newPos,0); @@ -1287,12 +1285,10 @@ void MoltresScreenFlash2(s32 xArg, s32 yArg) s32 i, x, y; DungeonPos newPos; - x = (xArg * 3) << 11; - x += 0xC00; + x = X_POS_TO_PIXELPOS(xArg); newPos.x = x / 256; - y = (yArg * 3) << 11; - y += 0x1000; + y = Y_POS_TO_PIXELPOS(yArg); newPos.y = y / 256; r6 = sub_8085EC8(370,22,0,&newPos,0); @@ -4102,12 +4098,10 @@ void sub_808BB3C(DungeonPos *pos1) s32 x, y; DungeonPos newPos; - x = (pos1->x * 3) << 11; - x += 0xC00; + x = X_POS_TO_PIXELPOS(pos1->x); newPos.x = x / 256; - y = (pos1->y * 3) << 11; - y += 0x1000; + y = Y_POS_TO_PIXELPOS(pos1->y); newPos.y = y / 256; sub_8085EC8(100,0,0,&newPos,0); diff --git a/src/dungeon_move.c b/src/dungeon_move.c index b87d60d73..95881ee7a 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -2274,17 +2274,11 @@ s32 sub_8056564(Entity *entity, DungeonPos *pos, Move *move, s32 r4) if (!gDungeon->unk181e8.blinded && (GetBodySize(entInfo->apparentID) < 4 || r4 != 1)) { s32 unk6 = sub_800ECB8(sub_80412E0(move->id, GetApparentWeather(entity), 1))->unk6; - s32 x = (pos->x * 3 << 11); - s32 y = (pos->y * 3 << 11); - // This is needed for matching purposes. - s32 y2; + s32 pixelPosX = X_POS_TO_PIXELPOS(pos->x); + s32 pixelPosY = Y_POS_TO_PIXELPOS(pos->y); - x += 0xC00; - y += 0x1000; - y2 = y; - - unkSp2.x = x / 256; - unkSp2.y = y2 / 256; + unkSp2.x = pixelPosX / 256; + unkSp2.y = pixelPosY / 256; if (unk6 != 0) { s32 someRetVal; @@ -2422,8 +2416,8 @@ void sub_80566F8(Entity *attacker, Move *move, s32 a2, bool8 a3, s32 itemId, s32 var_68.y += var_48; if (sub_803F428(&var_68) && !gDungeon->unk181e8.blinded) { PixelPos pos32; - pos32.x = (var_68Before.x * 0x1800) + 0xC00; - pos32.y = (var_68Before.y * 0x1800) + 0x1000; + pos32.x = X_POS_TO_PIXELPOS(var_68Before.x); + pos32.y = Y_POS_TO_PIXELPOS(var_68Before.y); var_28 = var_30 * (var_4C << 8); var_24 = var_30 * (var_48 << 8); for (j = 0; j < 24 / var_30; j++) { diff --git a/src/dungeon_util.c b/src/dungeon_util.c index e7b32e641..fc06a04a2 100644 --- a/src/dungeon_util.c +++ b/src/dungeon_util.c @@ -179,14 +179,13 @@ void sub_804522C(void) { void sub_804535C(Entity *entity, PixelPos *pos) { - if (pos != NULL) { - (entity->pixelPos).x = pos->x; - (entity->pixelPos).y = pos->y; + entity->pixelPos.x = pos->x; + entity->pixelPos.y = pos->y; } else { - (entity->pixelPos).x = (entity->pos).x * 0x1800 + 0xc00; - (entity->pixelPos).y = (entity->pos).y * 0x1800 + 0x1000; + entity->pixelPos.x = X_POS_TO_PIXELPOS(entity->pos.x); + entity->pixelPos.y = Y_POS_TO_PIXELPOS(entity->pos.y); } } diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index d4873ae97..fa1d66152 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -239,7 +239,7 @@ void sub_80857B8(void) void sub_8085860(s32 x, s32 y) { sub_803F4A0(0); - sub_803F878(x * 0x1800 + 0xc00, y * 0x1800 + 0x1000); + sub_803F878(X_POS_TO_PIXELPOS(x), Y_POS_TO_PIXELPOS(y)); } void sub_8085890(s32 x, s32 y) diff --git a/src/move_actions.c b/src/move_actions.c index 17e6816ce..a50f494ed 100644 --- a/src/move_actions.c +++ b/src/move_actions.c @@ -2585,8 +2585,6 @@ bool8 SplashMoveAction(Entity * pokemon, Entity * target, Move *move, u32 param_ PixelPos pos2; Tile *tile; Entity *entity; - s32 temp; - s32 temp2; u8 check; @@ -2610,14 +2608,9 @@ _0805A8C2: TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FEBDC); return FALSE; } - temp = pos1.x * 0x1800; - temp += (0xC00); - pos2.x = (temp - target->pixelPos.x) / 0xc; - - temp2 = pos1.y * 0x1800; - temp2 += (0x80 << 5); - pos2.y = ((temp2 - target->pixelPos.y) / 0xc); + pos2.x = (X_POS_TO_PIXELPOS(pos1.x) - target->pixelPos.x) / 0xc; + pos2.y = (Y_POS_TO_PIXELPOS(pos1.y) - target->pixelPos.y) / 0xc; if (((check = sub_803F428(&target->pos), r9 = &target->pos, check)) || (sub_803F428(&pos1))) { for(counter = 0; counter < 0xC; counter++)