diff --git a/asm/dungeon_message.s b/asm/dungeon_message.s index 1c95080d5..692769a52 100644 --- a/asm/dungeon_message.s +++ b/asm/dungeon_message.s @@ -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} diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index 827d87fbd..2680fda56 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -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; diff --git a/src/dungeon_message.c b/src/dungeon_message.c index 34083a8e3..dd9d58d43 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -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; +} + +//