sub_8055FA0

This commit is contained in:
DizzyEggg 2024-10-23 14:35:33 +02:00
parent ef2868a2bc
commit 902d82fcaf
3 changed files with 254 additions and 581 deletions

View File

@ -5,579 +5,6 @@
.text
thumb_func_start sub_8055FA0
sub_8055FA0:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x130
adds r5, r0, 0
adds r6, r1, 0
mov r10, r2
str r3, [sp, 0x120]
ldr r7, [sp, 0x154]
movs r0, 0
mov r8, r0
str r0, [sp, 0xC]
movs r0, 0x1
bl sub_804178C
ldrh r1, [r7, 0x2]
movs r0, 0xA5
lsls r0, 1
cmp r1, r0
bne _08056010
movs r0, 0x69
bl DungeonRandInt
ldr r1, _08056004
str r0, [r1]
add r4, sp, 0x110
ldr r1, _08056008
lsls r0, 3
adds r0, r1
ldrh r1, [r0]
adds r0, r4, 0
bl InitPokemonMove
ldrb r1, [r7]
add r0, sp, 0x110
strb r1, [r0]
ldrb r0, [r7, 0x1]
strb r0, [r4, 0x1]
ldr r0, _0805600C
ldr r2, [r0]
mov r1, r10
str r1, [sp]
movs r0, 0x1
str r0, [sp, 0x4]
mov r0, r8
str r0, [sp, 0x8]
b _08056056
.align 2, 0
_08056004: .4byte gUnknown_202F228
_08056008: .4byte gUnknown_80F59C8
_0805600C: .4byte gUnknown_80FECBC
_08056010:
cmp r1, 0x77
bne _08056068
ldr r0, _08056108
ldr r0, [r0]
ldr r1, _0805610C
adds r0, r1
movs r2, 0
ldrsh r0, [r0, r2]
cmp r0, 0
bge _08056026
movs r0, 0
_08056026:
cmp r0, 0x4A
ble _0805602C
movs r0, 0x4A
_0805602C:
add r4, sp, 0x118
ldr r1, _08056110
lsls r0, 3
adds r0, r1
ldrh r1, [r0]
adds r0, r4, 0
bl InitPokemonMove
ldrb r1, [r7]
add r0, sp, 0x118
strb r1, [r0]
ldrb r0, [r7, 0x1]
strb r0, [r4, 0x1]
ldr r0, _08056114
ldr r2, [r0]
mov r0, r10
str r0, [sp]
movs r0, 0x1
str r0, [sp, 0x4]
mov r1, r8
str r1, [sp, 0x8]
_08056056:
adds r0, r5, 0
adds r1, r7, 0
add r3, sp, 0xC
bl sub_8056468
movs r0, 0x1
bl sub_804178C
adds r7, r4, 0
_08056068:
movs r2, 0
str r2, [sp, 0x128]
adds r0, r5, 0
adds r1, r7, 0
movs r2, 0x1
bl GetMoveTargetAndRangeForPokemon
movs r4, 0xF0
adds r1, r4, 0
ands r1, r0
cmp r1, 0x50
bne _08056084
movs r0, 0xA
str r0, [sp, 0x128]
_08056084:
adds r0, r5, 0
adds r1, r7, 0
movs r2, 0x1
bl GetMoveTargetAndRangeForPokemon
adds r1, r4, 0
ands r1, r0
cmp r1, 0x80
bne _080560CC
movs r1, 0x1
str r1, [sp, 0x128]
ldrh r0, [r7, 0x2]
cmp r0, 0x97
bne _080560AE
adds r0, r5, 0
bl GetApparentWeather
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
beq _080560CC
_080560AE:
ldrh r0, [r7, 0x2]
bl DoesMoveCharge
lsls r0, 24
cmp r0, 0
beq _080560CC
adds r0, r5, 0
adds r1, r7, 0
bl MoveMatchesChargingStatus
lsls r0, 24
cmp r0, 0
bne _080560CC
movs r2, 0
str r2, [sp, 0x128]
_080560CC:
ldr r0, _08056118
ldr r1, [r5, 0x70]
movs r2, 0
bl SetMessageArgument_2
ldr r0, _0805611C
adds r1, r7, 0
movs r2, 0
bl sub_80928C0
adds r0, r5, 0
adds r1, r7, 0
bl MoveMatchesChargingStatus
lsls r0, 24
cmp r0, 0
beq _08056124
ldr r0, _08056120
ldr r0, [r0]
mov r8, r0
ldr r0, [r5, 0x70]
adds r0, 0xFF
movs r1, 0
strb r1, [r0]
adds r0, r5, 0
adds r1, r7, 0
movs r2, 0x1
bl sub_805744C
b _08056142
.align 2, 0
_08056108: .4byte gDungeon
_0805610C: .4byte 0x00003a0e
_08056110: .4byte gNaturePowerMoveTable
_08056114: .4byte gUnknown_80FECE0
_08056118: .4byte gAvailablePokemonNames
_0805611C: .4byte gFormatItems
_08056120: .4byte gUnknown_80FC72C
_08056124:
mov r0, r10
cmp r0, 0
bne _08056132
ldrh r0, [r7, 0x2]
bl GetMoveUseText
b _08056136
_08056132:
ldr r0, _08056194
ldr r0, [r0]
_08056136:
mov r8, r0
adds r0, r5, 0
adds r1, r7, 0
movs r2, 0x1
bl CanMonsterUseMove
_08056142:
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0
beq _08056156
cmp r6, 0
beq _08056156
adds r0, r5, 0
adds r1, r7, 0
bl sub_806ACE8
_08056156:
ldr r0, [r5, 0x70]
adds r0, 0xEC
ldrb r0, [r0]
cmp r0, 0x1
bne _080561A0
ldrh r0, [r7, 0x2]
bl FailsWhileMuzzled
lsls r0, 24
cmp r0, 0
beq _080561A0
ldr r0, _08056198
adds r1, r5, 0
movs r2, 0
bl SetMessageArgument
adds r0, r5, 0
mov r1, r8
bl TryDisplayDungeonLoggableMessage
movs r0, 0xA
movs r1, 0x3F
bl sub_803E708
ldr r0, _0805619C
_08056188:
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
_08056190:
movs r0, 0
b _08056446
.align 2, 0
_08056194: .4byte gUnknown_80F9158
_08056198: .4byte gAvailablePokemonNames
_0805619C: .4byte gUnknown_80FC710
_080561A0:
cmp r4, 0
bne _08056214
ldr r0, _080561D4
ldr r1, [r5, 0x70]
movs r2, 0
bl SetMessageArgument_2
mov r1, r10
cmp r1, 0
bne _080561E0
ldr r0, _080561D8
adds r1, r7, 0
movs r2, 0
bl sub_80928C0
adds r0, r5, 0
mov r1, r8
bl TryDisplayDungeonLoggableMessage
movs r0, 0xA
movs r1, 0x3F
bl sub_803E708
ldr r0, _080561DC
b _08056188
.align 2, 0
_080561D4: .4byte gAvailablePokemonNames
_080561D8: .4byte gFormatItems
_080561DC: .4byte gUnknown_80FC6D0
_080561E0:
ldr r0, _0805620C
mov r2, r10
lsls r1, r2, 24
lsrs r1, 24
movs r2, 0
bl BufferItemName
adds r0, r5, 0
mov r1, r8
bl TryDisplayDungeonLoggableMessage
movs r0, 0xA
movs r1, 0x3F
bl sub_803E708
ldr r0, _08056210
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
b _08056190
.align 2, 0
_0805620C: .4byte gFormatItems
_08056210: .4byte gUnknown_80FC6FC
_08056214:
ldr r0, _0805625C
movs r1, 0
str r1, [r0]
ldr r0, _08056260
str r1, [r0]
ldr r0, _08056264
str r1, [r0]
ldr r0, _08056268
strb r1, [r0]
ldr r0, _0805626C
strb r1, [r0]
ldr r0, _08056270
strb r1, [r0]
ldr r0, _08056274
str r1, [r0]
ldr r0, _08056278
strb r1, [r0]
ldr r0, [sp, 0x150]
cmp r0, 0
beq _0805624C
ldr r0, [r5, 0x70]
ldr r2, _0805627C
adds r1, r0, r2
ldrb r0, [r1]
cmp r0, 0x3
bhi _0805624C
adds r0, 0x1
strb r0, [r1]
_0805624C:
adds r0, r7, 0
bl sub_8057070
str r0, [sp, 0x124]
movs r0, 0
mov r9, r0
b _080563E4
.align 2, 0
_0805625C: .4byte gUnknown_202F214
_08056260: .4byte gUnknown_202F20C
_08056264: .4byte gUnknown_202F210
_08056268: .4byte gUnknown_202F218
_0805626C: .4byte gUnknown_202F219
_08056270: .4byte gUnknown_202F21A
_08056274: .4byte gUnknown_202F21C
_08056278: .4byte gUnknown_202F220
_0805627C: .4byte 0x00000153
_08056280:
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
bne _0805628E
b _08056444
_0805628E:
bl sub_8044B28
lsls r0, 24
cmp r0, 0
beq _0805629A
b _08056444
_0805629A:
ldr r4, [r5, 0x70]
ldr r0, [sp, 0x120]
cmp r0, 0
bne _080562AC
ldrh r0, [r7, 0x2]
cmp r0, 0x19
beq _080562AC
cmp r0, 0xE3
bne _080562BE
_080562AC:
adds r0, r5, 0
bl IsSleeping
lsls r0, 24
cmp r0, 0
bne _080562CE
adds r0, r5, 0
movs r1, 0x1
b _080562C2
_080562BE:
adds r0, r5, 0
movs r1, 0
_080562C2:
bl CannotAttack
lsls r0, 24
cmp r0, 0
beq _080562CE
b _08056400
_080562CE:
movs r1, 0xA5
lsls r1, 1
adds r0, r4, r1
movs r6, 0
strb r6, [r0]
ldrh r0, [r7, 0x2]
cmp r0, 0x9
bne _080562F4
ldr r4, [r5, 0x70]
movs r0, 0x8
bl DungeonRandInt
adds r4, 0x46
strb r0, [r4]
adds r0, r5, 0
bl TargetTileInFront
movs r2, 0
str r2, [sp, 0x12C]
_080562F4:
ldr r0, _080563A0
str r6, [r0]
str r6, [sp, 0xC]
ldr r0, [sp, 0x128]
cmp r0, 0x1
bhi _08056324
add r0, sp, 0xC
adds r1, r5, 0
adds r2, r7, 0
bl sub_8056CE8
add r0, sp, 0xC
adds r1, r5, 0
bl sub_80574C4
mov r1, r9
cmp r1, 0
beq _08056324
ldr r2, [sp, 0x12C]
cmp r2, 0
beq _08056324
ldr r0, [sp, 0xC]
cmp r0, 0
beq _08056400
_08056324:
mov r0, r10
str r0, [sp]
movs r0, 0
mov r1, r9
cmp r1, 0
bne _08056332
movs r0, 0x1
_08056332:
str r0, [sp, 0x4]
ldr r2, [sp, 0x128]
str r2, [sp, 0x8]
adds r0, r5, 0
adds r1, r7, 0
mov r2, r8
add r3, sp, 0xC
bl sub_8056468
lsls r0, 24
lsrs r4, r0, 24
movs r0, 0
mov r8, r0
ldr r0, _080563A0
ldr r0, [r0]
cmp r0, 0
beq _08056358
bl sub_806A1E8
_08056358:
ldr r1, [r5, 0x70]
adds r0, r1, 0
adds r0, 0xBC
ldrb r0, [r0]
cmp r0, 0x2
beq _0805637C
cmp r0, 0x4
beq _0805637C
movs r2, 0xB6
lsls r2, 1
adds r0, r1, r2
mov r2, r8
strh r2, [r0]
movs r2, 0xB7
lsls r2, 1
adds r0, r1, r2
mov r1, r8
strh r1, [r0]
_0805637C:
ldr r1, _080563A4
ldr r0, [r1]
adds r0, 0x1
str r0, [r1]
ldr r2, [sp, 0x128]
cmp r2, 0
beq _080563A8
mov r0, r10
str r0, [sp]
ldr r1, [sp, 0x150]
str r1, [sp, 0x4]
adds r0, r5, 0
adds r1, r7, 0
adds r3, r4, 0
bl sub_80566F8
b _080563B8
.align 2, 0
_080563A0: .4byte gUnknown_203B438
_080563A4: .4byte gUnknown_202F214
_080563A8:
ldr r2, [sp, 0x150]
str r2, [sp]
add r0, sp, 0xC
adds r1, r5, 0
adds r2, r7, 0
mov r3, r10
bl sub_8053704
_080563B8:
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08056400
adds r0, r5, 0
bl sub_806CF18
ldr r0, [r5, 0x70]
movs r2, 0xA5
lsls r2, 1
adds r1, r0, r2
ldrb r0, [r1]
cmp r0, 0
bne _080563E0
strb r0, [r1]
adds r0, r5, 0
bl sub_8079764
_080563E0:
movs r0, 0x1
add r9, r0
_080563E4:
ldr r1, [sp, 0x124]
cmp r9, r1
bge _08056400
movs r2, 0x1
str r2, [sp, 0x12C]
ldr r0, _08056458
ldrb r0, [r0]
cmp r0, 0
bne _08056400
ldr r0, _0805645C
ldrb r0, [r0]
cmp r0, 0
bne _08056400
b _08056280
_08056400:
ldr r0, _08056460
ldrb r0, [r0]
cmp r0, 0
beq _08056418
adds r0, r5, 0
adds r1, r5, 0
bl SendImmobilizeEndMessage
adds r0, r5, 0
adds r1, r5, 0
bl SendLinkedEndMessage
_08056418:
ldr r0, _08056464
ldrb r0, [r0]
cmp r0, 0
beq _08056444
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08056444
ldr r4, [r5, 0x70]
adds r0, r5, 0
adds r1, r5, 0
movs r2, 0
bl ConfuseStatusTarget
adds r4, 0xFB
ldrb r0, [r4]
cmp r0, 0
bne _08056444
movs r0, 0x1
strb r0, [r4]
_08056444:
movs r0, 0x1
_08056446:
add sp, 0x130
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_08056458: .4byte gUnknown_202F220
_0805645C: .4byte gUnknown_202F221
_08056460: .4byte gUnknown_202F21A
_08056464: .4byte gUnknown_202F219
thumb_func_end sub_8055FA0
thumb_func_start sub_8056468
sub_8056468:
push {r4-r7,lr}

View File

@ -260,7 +260,7 @@ typedef struct EntityInfo
/* 0xF8 */ bool8 speedStageChanged; // Toggled when pokemon is movement speed is sped up
/* 0xF9 */ u8 unkF9;
/* 0xFA */ u8 terrifiedTurns; // Doubles as a bool for whether the Pokémon is terrified.
u8 expMultiplier;
/* 0xFB */ u8 expMultiplier;
// Set to true if the player makes a teammate use their held item.
// This is done by going to the teammate's held item in the toolbox and selecting "Use".
/* 0xFC */ bool8 useHeldItem;

View File

@ -1082,6 +1082,7 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y)
#include "structs/str_damage.h"
#include "constants/ability.h"
#include "constants/status.h"
#include "constants/weather.h"
#include "type_chart.h"
#include "position_util.h"
#include "code_806CD90.h"
@ -1090,9 +1091,14 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y)
#include "dungeon_capabilities.h"
#include "move_effects_target.h"
#include "status.h"
#include "weather.h"
#include "code_8077274_1.h"
#include "charge_move.h"
#include "dungeon_random.h"
#include "targeting_flags.h"
#include "targeting.h"
NAKED void sub_8053704(void)
NAKED void sub_8053704(s32 *sp, Entity *entity, Move *move, s32 itemId, s32 a4)
{
asm_unified("\n"
" push {r4-r7,lr}\n"
@ -4504,6 +4510,7 @@ NAKED void sub_8053704(void)
s32 sub_8055640(Entity *, Entity *, Move *, s32, s32);
s32 sub_8055728(Entity *attacker, Entity *target, Move *move, struct DamageStruct *dmgStruct, s16 unk);
bool8 sub_8056B34(Entity *attacker, Entity *target, Move *move, s32 accuracyType, bool8 unkBool);
bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move);
UNUSED bool32 sub_8055620(Entity *a0, Entity *a1, Move *a2, s32 a3)
{
@ -4515,6 +4522,8 @@ extern void sub_806EAF4(Entity *, Entity *, u8, u32, u32, struct DamageStruct *d
extern s16 sub_8057600(Move *move, s32 itemID);
extern void sub_803ED30(s32, Entity *r0, u8, s32);
extern void sub_8042238(Entity *pokemon, Entity *target);
extern void sub_806A1E8(Entity *pokemon);
extern void sub_80574C4(s32 *a0, s32 a1);
extern const u8 *const gUnknown_80F9688;
@ -4673,13 +4682,13 @@ extern u8 gUnknown_202F221;
extern u8 gUnknown_202F222;
extern s32 gUnknown_202F208;
extern bool8 sub_8055FA0(struct Entity *, u32, u32, u32, u32, struct Move *);
extern bool8 sub_8044B28(void);
extern void sub_804178C(u32);
extern void sub_8071DA4(Entity *);
extern void sub_80428A0(Entity *r0);
bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, bool32 isOrb, s32 arg_0)
bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, s32 itemId, s32 arg_0)
{
s32 i, j;
s32 moveId;
@ -4774,10 +4783,10 @@ bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, bool32 isOrb, s3
assistMove.id = sub_8057144(entity);
sub_80928C0(gFormatItems, &assistMove, NULL);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FD2DC); // Assist:
r0 = sub_8055FA0(entity, var_34, isOrb, arg_0, var_2C, &assistMove);
r0 = sub_8055FA0(entity, var_34, itemId, arg_0, var_2C, &assistMove);
}
else {
r0 = sub_8055FA0(entity, var_34, isOrb, arg_0, var_2C, currMove);
r0 = sub_8055FA0(entity, var_34, itemId, arg_0, var_2C, currMove);
}
if (var_28 && r0) {
@ -4790,7 +4799,7 @@ bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, bool32 isOrb, s3
}
if (unkBefore == gUnknown_202F208) {
if (!isOrb) {
if (!itemId) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC690); // The currMove failed!
}
else {
@ -4825,7 +4834,7 @@ bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, bool32 isOrb, s3
sub_80928C0(gFormatItems, &assistMove, NULL);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FD2DC); // Assist:
}
sub_8055FA0(entity, 0, isOrb, arg_0, var_2C, movePtr);
sub_8055FA0(entity, 0, itemId, arg_0, var_2C, movePtr);
}
sub_804178C(1);
}
@ -4860,6 +4869,15 @@ extern const u8 *const gUnknown_80FEF54;
extern const u8 *const gUnknown_80FEF74;
extern const u8 *const gUnknown_80FEF98;
extern const u8 *const gUnknown_80FEFD0;
extern const u8 *const gUnknown_80FECA4;
extern const u8 *const gUnknown_80F9158;
extern const u8 *const gUnknown_80FC72C;
extern const u8 *const gUnknown_80FC700;
extern const u8 *const gUnknown_80FC6D0;
extern const u8 *const gUnknown_80FC710;
extern const u8 *const gUnknown_80FC6FC;
extern const u8 *const gUnknown_80FECBC;
extern const u8 *const gUnknown_80FECE0;
void TriggerAbilityEffect(Entity *entity)
{
@ -4916,3 +4934,231 @@ void TriggerAbilityEffect(Entity *entity)
entInfo->abilityEffectFlags = 0;
}
}
extern s32 gUnknown_202F228;
// Todo: unify
typedef bool8 (*MoveCallback)(Entity *pokemon, Entity *target, Move *move, s32 param_4);
struct NaturePowerMove
{
u16 moveID;
u16 unk2;
MoveCallback move;
};
extern const struct NaturePowerMove gUnknown_80F59C8[];
extern const struct NaturePowerMove gNaturePowerMoveTable[];
extern void sub_806ACE8(Entity *entity, Move *move);
extern s32 sub_8057070(Move *move);
bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, s32 *unkArray, bool32 itemId, bool8 arg_4, bool32 unused);
bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3);
void sub_8056CE8(s32 *, Entity * pokemon, Move *move);
void sub_80566F8(Entity*, Move *, s32 a2, bool8 a3, s32 a4, s32 a5);
extern s32 gUnknown_202F214;
extern s32 gUnknown_202F20C;
extern s32 gUnknown_202F210;
extern s32 gUnknown_202F21C;
extern Entity *gUnknown_203B438;
extern u8 gUnknown_202F218;
extern u8 gUnknown_202F219;
extern u8 gUnknown_202F21A;
extern u8 gUnknown_202F220;
extern u8 gUnknown_202F221;
bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move)
{
s32 i;
s32 var_144[65]; //????
const u8 *msg;
Move metronomeMove, naturePwrMove;
s32 var_2C;
s32 var_28;
s32 var_24;
bool8 moveUsable;
msg = NULL;
var_144[0] = 0;
sub_804178C(1);
if (move->id == MOVE_METRONOME) {
gUnknown_202F228 = DungeonRandInt(105);
InitPokemonMove(&metronomeMove, gUnknown_80F59C8[gUnknown_202F228].moveID);
metronomeMove.moveFlags = move->moveFlags;
metronomeMove.moveFlags2 = move->moveFlags2;
sub_8056468(entity, move, gUnknown_80FECBC, var_144, itemId, TRUE, FALSE);
sub_804178C(1);
move = &metronomeMove;
}
else if (move->id == MOVE_NATURE_POWER)
{
s32 tileset = gDungeon->tileset;
if (tileset < 0)
tileset = 0;
if (tileset > 74)
tileset = 74;
InitPokemonMove(&naturePwrMove, gNaturePowerMoveTable[tileset].moveID);
naturePwrMove.moveFlags = move->moveFlags;
naturePwrMove.moveFlags2 = move->moveFlags2;
sub_8056468(entity, move, gUnknown_80FECE0, var_144, itemId, TRUE, FALSE);
sub_804178C(1);
move = &naturePwrMove;
}
var_28 = 0;
if ((GetMoveTargetAndRangeForPokemon(entity, move, TRUE)
& (0xF0)) == TARGETING_FLAG_TARGET_LINE)
{
var_28 = 10;
}
if ((GetMoveTargetAndRangeForPokemon(entity, move, TRUE)
& (0xF0)) == TARGETING_FLAG_CUT_CORNERS)
{
var_28 = 1;
if ((move->id != MOVE_SOLARBEAM || GetApparentWeather(entity) != WEATHER_SUNNY) && DoesMoveCharge(move->id)) {
if (!MoveMatchesChargingStatus(entity, move)) {
var_28 = 0;
}
}
}
SetMessageArgument_2(gAvailablePokemonNames, GetEntInfo(entity), 0);
sub_80928C0(gFormatItems, move, NULL);
if (MoveMatchesChargingStatus(entity, move)) {
msg = gUnknown_80FC72C; // mon loosed move
GetEntInfo(entity)->unkFF = 0;
moveUsable = sub_805744C(entity, move, TRUE);
}
else {
if (!itemId) {
msg = GetMoveUseText(move->id);
}
else {
msg = gUnknown_80F9158;
}
moveUsable = CanMonsterUseMove(entity, move, TRUE);
}
if (moveUsable && r6) {
sub_806ACE8(entity, move);
}
if (GetEntInfo(entity)->muzzled.muzzled == TRUE && FailsWhileMuzzled(move->id)) {
SetMessageArgument(gAvailablePokemonNames, entity, 0);
TryDisplayDungeonLoggableMessage(entity, msg);
sub_803E708(0xA, 0x3F);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC710); // is muzzled!
return FALSE;
}
else if (!moveUsable) {
SetMessageArgument_2(gAvailablePokemonNames, GetEntInfo(entity), 0);
if (!itemId) {
sub_80928C0(gFormatItems, move, NULL);
TryDisplayDungeonLoggableMessage(entity, msg);
sub_803E708(0xA, 0x3F);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6D0); // But the move couldn't be used!
}
else {
BufferItemName(gFormatItems, itemId, NULL);
TryDisplayDungeonLoggableMessage(entity, msg);
sub_803E708(0xA, 0x3F);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6FC); // But Orbs are prevented from being used!
}
return FALSE;
}
gUnknown_202F214 = 0;
gUnknown_202F20C = 0;
gUnknown_202F210 = 0;
gUnknown_202F218 = 0;
gUnknown_202F219 = 0;
gUnknown_202F21A = 0;
gUnknown_202F21C = 0;
gUnknown_202F220 = 0;
if (arg_0 && GetEntInfo(entity)->unk153 <= 3) {
GetEntInfo(entity)->unk153++;
}
var_2C = sub_8057070(move);
for (i = 0; i < var_2C; i++) {
u8 r4;
EntityInfo *entInfo;
var_24 = 1;
if (gUnknown_202F220 != 0 || gUnknown_202F221 != 0)
break;
if (!EntityExists(entity) || sub_8044B28())
return TRUE;
entInfo = GetEntInfo(entity);
if (var_30 != 0 || move->id == MOVE_SNORE || move->id == MOVE_SLEEP_TALK) {
if (!IsSleeping(entity) && CannotAttack(entity, TRUE))
break;
}
else {
if (CannotAttack(entity, FALSE))
break;
}
entInfo->unk14A = 0;
if (move->id == MOVE_THRASH) {
GetEntInfo(entity)->action.direction = DungeonRandInt(NUM_DIRECTIONS);
TargetTileInFront(entity);
var_24 = 0;
}
gUnknown_203B438 = NULL;
var_144[0] = 0;
if (var_28 == 0 || var_28 == 1) {
sub_8056CE8(var_144, entity, move);
sub_80574C4(var_144, (s32) entity); // Todo fix sub_80574C4
if (i != 0 && var_24 != 0 && var_144[0] == 0)
break;
}
r4 = sub_8056468(entity, move, msg, var_144, itemId, (i == 0), var_28);
msg = NULL;
if (gUnknown_203B438 != 0) {
sub_806A1E8(gUnknown_203B438);
}
if (GetEntInfo(entity)->volatileStatus.volatileStatus != STATUS_CONFUSED && GetEntInfo(entity)->volatileStatus.volatileStatus != STATUS_COWERING) {
EntityInfo *entInfo = GetEntInfo(entity);
entInfo->targetPos.x = 0;
entInfo->targetPos.y = 0;
}
gUnknown_202F214++;
if (var_28 != 0) {
sub_80566F8(entity, move, var_28, r4, itemId, arg_0);
}
else {
sub_8053704(var_144, entity, move, itemId, arg_0);
}
if (!EntityExists(entity))
break;
sub_806CF18(entity);
if (GetEntInfo(entity)->unk14A == 0) {
GetEntInfo(entity)->unk14A = 0; // Redundant as it's already 0
sub_8079764(entity);
}
}
if (gUnknown_202F21A != 0) {
SendImmobilizeEndMessage(entity, entity);
SendLinkedEndMessage(entity, entity);
}
if (gUnknown_202F219 != 0 && EntityExists(entity)) {
EntityInfo *entInfo = GetEntInfo(entity);
ConfuseStatusTarget(entity, entity, FALSE);
SetExpMultplier(entInfo);
}
return TRUE;
}
//