Match sub_807F43C

This commit is contained in:
DizzyEggg
2025-02-26 14:40:44 +01:00
parent b641525d63
commit d1b81605e4

View File

@@ -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)