From ef2868a2bc2048801aacd0072bb024267fe9cb1a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 23 Oct 2024 12:35:56 +0200 Subject: [PATCH] sub_8055DDC --- asm/dungeon_message.s | 684 ------------------------------- include/code_808417C.h | 2 +- include/structs/dungeon_entity.h | 17 +- src/code_806CD90.c | 22 +- src/dungeon_message.c | 270 +++++++++++- src/trap_1.c | 2 +- 6 files changed, 298 insertions(+), 699 deletions(-) diff --git a/asm/dungeon_message.s b/asm/dungeon_message.s index 94e95e6bf..1c95080d5 100644 --- a/asm/dungeon_message.s +++ b/asm/dungeon_message.s @@ -5,690 +5,6 @@ .text - - - thumb_func_start sub_8055A00 -sub_8055A00: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x34 - adds r5, r0, 0 - mov r9, r1 - str r2, [sp, 0x20] - str r3, [sp, 0x24] - ldr r0, [r5, 0x70] - mov r10, r0 - mov r7, r9 - cmp r7, 0x3 - ble _08055A22 - movs r0, 0 - b _08055DB4 -_08055A22: - movs r0, 0xBC - lsls r0, 1 - add r0, r10 - movs r1, 0 - movs r2, 0 - strh r2, [r0] - ldr r0, _08055A4C - add r0, r10 - strb r1, [r0] - mov r0, r10 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x1 - bne _08055A58 - ldr r0, _08055A50 - adds r1, r5, 0 - bl SetMessageArgument - ldr r0, _08055A54 - b _08055A8A - .align 2, 0 -_08055A4C: .4byte 0x00000159 -_08055A50: .4byte gAvailablePokemonNames -_08055A54: .4byte gUnknown_80FC714 -_08055A58: - cmp r0, 0x7 - bne _08055A74 - ldr r0, _08055A6C - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08055A70 - b _08055A8A - .align 2, 0 -_08055A6C: .4byte gAvailablePokemonNames -_08055A70: .4byte gUnknown_80FC718 -_08055A74: - mov r0, r10 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x4 - bne _08055AA0 - ldr r0, _08055A98 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08055A9C -_08055A8A: - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage - movs r0, 0 - b _08055DB4 - .align 2, 0 -_08055A98: .4byte gAvailablePokemonNames -_08055A9C: .4byte gUnknown_80FC6A8 -_08055AA0: - ldr r0, _08055B24 - strb r1, [r0] - ldr r0, _08055B28 - str r2, [r0] - ldr r0, _08055B2C - strb r1, [r0] - adds r0, r7, 0x1 - movs r2, 0 - movs r6, 0x3 - movs r1, 0xC0 - lsls r1, 1 - add r1, r10 -_08055AB8: - strh r2, [r1] - subs r1, 0x2 - subs r6, 0x1 - cmp r6, 0 - bge _08055AB8 - movs r6, 0 - movs r3, 0x1 - adds r7, r0, 0 - cmp r7, 0x3 - bgt _08055B06 - lsls r2, r7, 3 - mov r1, r10 - adds r0, r1, r2 - movs r4, 0x8C - lsls r4, 1 - adds r0, r4 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08055B06 - movs r0, 0x2 - mov r8, r0 - adds r0, r2, r4 - mov r1, r10 - adds r2, r0, r1 -_08055AEC: - adds r6, 0x1 - cmp r6, 0x3 - bgt _08055B06 - adds r3, 0x1 - adds r2, 0x8 - adds r7, 0x1 - cmp r7, 0x3 - bgt _08055B06 - ldrb r1, [r2] - mov r0, r8 - ands r0, r1 - cmp r0, 0 - bne _08055AEC -_08055B06: - movs r0, 0 - str r0, [sp, 0x28] - cmp r3, 0x1 - ble _08055B12 - movs r1, 0x1 - str r1, [sp, 0x28] -_08055B12: - mov r7, r9 - lsls r0, r7, 3 - movs r1, 0x8C - lsls r1, 1 - adds r0, r1 - add r0, r10 - mov r8, r0 - b _08055CB4 - .align 2, 0 -_08055B24: .4byte gUnknown_202F222 -_08055B28: .4byte gUnknown_202F208 -_08055B2C: .4byte gUnknown_202F221 -_08055B30: - mov r1, r8 - ldrh r0, [r1, 0x2] - cmp r0, 0x19 - beq _08055B3C - cmp r0, 0xE3 - bne _08055B4E -_08055B3C: - adds r0, r5, 0 - bl IsSleeping - lsls r0, 24 - cmp r0, 0 - bne _08055B5E - adds r0, r5, 0 - movs r1, 0x1 - b _08055B52 -_08055B4E: - adds r0, r5, 0 - movs r1, 0 -_08055B52: - bl CannotAttack - lsls r0, 24 - cmp r0, 0 - beq _08055B5E - b _08055CCE -_08055B5E: - ldr r0, _08055B9C - ldrb r0, [r0] - cmp r0, 0 - beq _08055B68 - b _08055CCE -_08055B68: - ldrb r1, [r6] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08055B74 - b _08055C82 -_08055B74: - movs r2, 0x1 - movs r0, 0 - str r0, [sp, 0x2C] - adds r0, r5, 0 - adds r1, r6, 0 - str r2, [sp, 0x30] - bl MoveMatchesChargingStatus - lsls r0, 24 - lsrs r4, r0, 24 - ldrb r0, [r6, 0x4] - ldr r2, [sp, 0x30] - cmp r0, 0 - beq _08055BA0 - cmp r4, 0 - bne _08055BBA - movs r1, 0x1 - str r1, [sp, 0x2C] - b _08055BBA - .align 2, 0 -_08055B9C: .4byte gUnknown_202F221 -_08055BA0: - cmp r4, 0 - bne _08055BBA - ldr r0, _08055C08 - adds r1, r6, 0 - movs r2, 0 - bl sub_80928C0 - ldr r0, _08055C0C - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage - movs r2, 0 -_08055BBA: - cmp r2, 0 - beq _08055C82 - ldr r0, _08055C10 - ldr r0, [r0] - mov r9, r0 - ldr r0, _08055C14 - add r0, r10 - strb r4, [r0] - ldrh r0, [r6, 0x2] - cmp r0, 0xE5 - bne _08055C20 - ldr r0, [r6] - ldr r1, [r6, 0x4] - str r0, [sp, 0x8] - str r1, [sp, 0xC] - adds r0, r5, 0 - bl sub_8057144 - lsls r0, 16 - ldr r2, _08055C18 - ldr r1, [sp, 0x8] - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x8] - ldr r0, _08055C08 - add r1, sp, 0x8 - movs r2, 0 - bl sub_80928C0 - ldr r0, _08055C1C - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage - ldr r0, [sp, 0x28] - str r0, [sp] - add r1, sp, 0x8 - str r1, [sp, 0x4] - b _08055C26 - .align 2, 0 -_08055C08: .4byte gFormatItems -_08055C0C: .4byte gUnknown_80F93C8 -_08055C10: .4byte gUnknown_202F208 -_08055C14: .4byte 0x00000159 -_08055C18: .4byte 0x0000ffff -_08055C1C: .4byte gUnknown_80FD2DC -_08055C20: - ldr r0, [sp, 0x28] - str r0, [sp] - str r6, [sp, 0x4] -_08055C26: - adds r0, r5, 0 - ldr r1, [sp, 0x20] - ldr r2, [sp, 0x24] - ldr r3, [sp, 0x54] - bl sub_8055FA0 - lsls r0, 24 - lsrs r0, 24 - ldr r1, [sp, 0x2C] - cmp r1, 0 - beq _08055C56 - cmp r0, 0 - beq _08055C56 - ldrb r1, [r6, 0x1] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _08055C50 - movs r0, 0xFB - ands r0, r1 - b _08055C54 -_08055C50: - movs r0, 0x8 - orrs r0, r1 -_08055C54: - strb r0, [r6, 0x1] -_08055C56: - ldr r0, _08055C70 - ldr r0, [r0] - cmp r9, r0 - bne _08055C82 - ldr r0, [sp, 0x24] - cmp r0, 0 - bne _08055C78 - ldr r0, _08055C74 - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage - b _08055C82 - .align 2, 0 -_08055C70: .4byte gUnknown_202F208 -_08055C74: .4byte gUnknown_80FC690 -_08055C78: - ldr r0, _08055DC4 - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage -_08055C82: - movs r0, 0x1 - bl sub_804178C - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055CCE - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _08055CCE - movs r1, 0x8 - add r8, r1 - adds r7, 0x1 - cmp r7, 0x3 - bgt _08055CCE - mov r0, r8 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08055CCE -_08055CB4: - mov r6, r8 - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055CCE - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _08055CCE - b _08055B30 -_08055CCE: - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055D54 - movs r6, 0 -_08055CDC: - lsls r0, r6, 1 - movs r1, 0xBD - lsls r1, 1 - add r1, r10 - adds r1, r0 - ldrh r0, [r1] - cmp r0, 0 - beq _08055D4E - add r4, sp, 0x10 - adds r1, r0, 0 - adds r0, r4, 0 - bl sub_8092AA8 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08055D48 - ldrh r0, [r4, 0x2] - cmp r0, 0xE5 - bne _08055D36 - ldr r0, [sp, 0x10] - ldr r1, [sp, 0x14] - str r0, [sp, 0x18] - str r1, [sp, 0x1C] - adds r0, r5, 0 - bl sub_8057144 - lsls r0, 16 - ldr r2, _08055DC8 - ldr r1, [sp, 0x18] - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x18] - add r4, sp, 0x18 - ldr r0, _08055DCC - adds r1, r4, 0 - movs r2, 0 - bl sub_80928C0 - ldr r0, _08055DD0 - ldr r1, [r0] - adds r0, r5, 0 - bl TryDisplayDungeonLoggableMessage -_08055D36: - ldr r1, [sp, 0x28] - str r1, [sp] - str r4, [sp, 0x4] - adds r0, r5, 0 - movs r1, 0 - ldr r2, [sp, 0x24] - ldr r3, [sp, 0x54] - bl sub_8055FA0 -_08055D48: - movs r0, 0x1 - bl sub_804178C -_08055D4E: - adds r6, 0x1 - cmp r6, 0x3 - ble _08055CDC -_08055D54: - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055DB2 - adds r0, r5, 0 - bl sub_8071DA4 - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055DB2 - ldr r1, _08055DD4 - ldrb r0, [r1] - cmp r0, 0 - beq _08055DB2 - movs r0, 0 - strb r0, [r1] - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08055DB2 - ldr r4, [r5, 0x70] - ldr r1, _08055DD8 - adds r0, r5, 0 - movs r2, 0x1 - bl CalculateStatusTurns - adds r3, r0, 0 - movs r0, 0 - str r0, [sp] - adds r0, r5, 0 - adds r1, r5, 0 - movs r2, 0x1 - bl PausedStatusTarget - adds r4, 0xFB - ldrb r0, [r4] - cmp r0, 0 - bne _08055DB2 - movs r0, 0x1 - strb r0, [r4] -_08055DB2: - movs r0, 0x1 -_08055DB4: - add sp, 0x34 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08055DC4: .4byte gUnknown_80FC6A4 -_08055DC8: .4byte 0x0000ffff -_08055DCC: .4byte gFormatItems -_08055DD0: .4byte gUnknown_80FD2DC -_08055DD4: .4byte gUnknown_202F222 -_08055DD8: .4byte gUnknown_80F4E70 - thumb_func_end sub_8055A00 - - thumb_func_start sub_8055DDC -sub_8055DDC: - push {r4-r7,lr} - adds r4, r0, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _08055DEC - b _08055F62 -_08055DEC: - ldr r6, [r4, 0x70] - movs r7, 0xBC - lsls r7, 1 - adds r5, r6, r7 - ldrh r1, [r5] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08055E10 - ldr r0, _08055F68 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - bl ImmobilizedStatusTarget -_08055E10: - ldrh r1, [r5] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08055E2C - ldr r0, _08055F6C - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - bl ImmobilizedStatusTarget -_08055E2C: - ldrh r1, [r5] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _08055E48 - ldr r0, _08055F70 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - bl ImmobilizedStatusTarget -_08055E48: - ldrh r1, [r5] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08055E66 - ldr r0, _08055F74 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - bl ParalyzeStatusTarget -_08055E66: - ldrh r1, [r5] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _08055E84 - ldr r0, _08055F78 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - bl ParalyzeStatusTarget -_08055E84: - ldrh r1, [r5] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _08055EA2 - ldr r0, _08055F7C - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - bl PoisonedStatusTarget -_08055EA2: - ldrh r1, [r5] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08055EC0 - ldr r0, _08055F80 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - bl PoisonedStatusTarget -_08055EC0: - ldrh r1, [r5] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08055EEA - ldr r0, _08055F84 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - ldr r1, _08055F88 - adds r0, r4, 0 - movs r2, 0x1 - bl CalculateStatusTurns - adds r2, r0, 0 - adds r0, r4, 0 - adds r1, r4, 0 - movs r3, 0x1 - bl sub_8075C58 -_08055EEA: - ldrh r1, [r5] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - cmp r0, 0 - beq _08055F0C - ldr r0, _08055F8C - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - movs r3, 0x1 - bl BurnedStatusTarget -_08055F0C: - ldrh r1, [r5] - movs r0, 0x80 - lsls r0, 2 - ands r0, r1 - cmp r0, 0 - beq _08055F2C - ldr r0, _08055F90 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - adds r1, r4, 0 - movs r2, 0x1 - bl InfatuateStatusTarget -_08055F2C: - adds r5, r6, r7 - ldrh r1, [r5] - movs r0, 0x80 - lsls r0, 3 - ands r0, r1 - cmp r0, 0 - beq _08055F5E - ldr r0, _08055F94 - adds r1, r4, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08055F98 - ldr r1, [r0] - adds r0, r4, 0 - bl TryDisplayDungeonLoggableMessage - adds r0, r4, 0 - bl sub_80428A0 - ldr r0, _08055F9C - ldrh r1, [r0] - adds r0, r6, 0 - adds r0, 0xFA - strb r1, [r0] -_08055F5E: - movs r0, 0 - strh r0, [r5] -_08055F62: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08055F68: .4byte gUnknown_80FEEA4 -_08055F6C: .4byte gUnknown_80FEEC8 -_08055F70: .4byte gUnknown_80FEEEC -_08055F74: .4byte gUnknown_80FEF0C -_08055F78: .4byte gUnknown_80FEF30 -_08055F7C: .4byte gUnknown_80FEF4C -_08055F80: .4byte gUnknown_80FEF50 -_08055F84: .4byte gUnknown_80FEF54 -_08055F88: .4byte gUnknown_80F4E74 -_08055F8C: .4byte gUnknown_80FEF74 -_08055F90: .4byte gUnknown_80FEF98 -_08055F94: .4byte gAvailablePokemonNames -_08055F98: .4byte gUnknown_80FEFD0 -_08055F9C: .4byte gUnknown_80F5004 - thumb_func_end sub_8055DDC - thumb_func_start sub_8055FA0 sub_8055FA0: push {r4-r7,lr} diff --git a/include/code_808417C.h b/include/code_808417C.h index 4830ac082..12359877f 100644 --- a/include/code_808417C.h +++ b/include/code_808417C.h @@ -3,6 +3,6 @@ #include "structs/dungeon_entity.h" -s32 CalculateStatusTurns(Entity *target, s16 *turnRange, bool8 factorCurerSkills); +s32 CalculateStatusTurns(Entity *target, const s16 *turnRange, bool8 factorCurerSkills); #endif // GUARD_808417C_H diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index beddfc0bd..827d87fbd 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -318,7 +318,7 @@ typedef struct EntityInfo /* 0x16C */ Position targetPos; /* 0x170 */ Position pixelPos; u32 unk174; - u16 unk178; + u16 abilityEffectFlags; // See enum AbilityEffectFlags /* 0x17A */ u16 mimicMoveIDs[MAX_MON_MOVES]; // All moves that Mimic has copied (not sure on size...) // Previous value of targetPosition for movement, 1 and 2 moves ago. /* 0x184 */ Unk_Entity_x184 unk184[4]; @@ -381,6 +381,21 @@ enum MovementFlag MOVEMENT_FLAG_SWAPPING_PLACES_PETRIFIED_ALLY = 1 << 15 // Set if the Pokémon is petrified and the leader cures them by swapping places. }; +enum AbilityEffectFlags +{ + ABILITY_FLAG_ARENA_TRAP = 1 << 0, + ABILITY_FLAG_SHADOW_TAG = 1 << 1, + ABILITY_FLAG_MAGNET_PULL = 1 << 2, + ABILITY_FLAG_STATIC = 1 << 3, + ABILITY_FLAG_EFFECT_SPORE_PRLZ = 1 << 4, + ABILITY_FLAG_POISON_POINT = 1 << 5, + ABILITY_FLAG_EFFECT_SPORE_PSN = 1 << 6, + ABILITY_FLAG_EFFECT_SPORE_SLP = 1 << 7, + ABILITY_FLAG_FLAME_BODY = 1 << 8, + ABILITY_FLAG_CUTE_CHARM = 1 << 9, + ABILITY_FLAG_STENCH = 1 << 10, +}; + enum ShopkeeperMode { SHOPKEEPER_MODE_NORMAL, diff --git a/src/code_806CD90.c b/src/code_806CD90.c index a4dd3774a..aa1401b5b 100644 --- a/src/code_806CD90.c +++ b/src/code_806CD90.c @@ -409,30 +409,30 @@ void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct * && !HasAbility(attacker, ABILITY_LEVITATE) && DungeonRandInt(100) < gUnknown_80F4E10) { - attackerInfo->unk178 |= 1; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_ARENA_TRAP; } if (HasAbility(target, ABILITY_SHADOW_TAG) && DungeonRandInt(100) < gUnknown_80F4E12) { - attackerInfo->unk178 |= 2; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_SHADOW_TAG; } if (HasAbility(target, ABILITY_MAGNET_PULL) && MonsterIsType(attacker, TYPE_STEEL) && DungeonRandInt(100) < gUnknown_80F4E14) { - attackerInfo->unk178 |= 4; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_MAGNET_PULL; } if (HasAbility(target, ABILITY_STATIC) && isPhysical && DungeonRandInt(100) < gUnknown_80F4E16) { - attackerInfo->unk178 |= 8; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_STATIC; } if (HasAbility(target, ABILITY_POISON_POINT) && DungeonRandInt(100) < gUnknown_80F4E18) { - attackerInfo->unk178 |= 0x20; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_POISON_POINT; } if (HasAbility(target, ABILITY_EFFECT_SPORE) && isPhysical @@ -440,27 +440,27 @@ void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct * { s32 rnd = DungeonRandInt(3); if (rnd < 1) - attackerInfo->unk178 |= 0x40; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_PSN; else if (rnd < 2) - attackerInfo->unk178 |= 0x10; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_PRLZ; else - attackerInfo->unk178 |= 0x80; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_SLP; } if (HasAbility(target, ABILITY_FLAME_BODY) && DungeonRandInt(100) < gUnknown_80F4E1C) { - attackerInfo->unk178 |= 0x100; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_FLAME_BODY; } if (HasAbility(target, ABILITY_CUTE_CHARM) && isPhysical && DungeonRandInt(100) < gUnknown_80F4E1E) { - attackerInfo->unk178 |= 0x200; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_CUTE_CHARM; } if (HasAbility(target, ABILITY_STENCH) && DungeonRandInt(100) < gUnknown_80F4E20) { - attackerInfo->unk178 |= 0x400; + attackerInfo->abilityEffectFlags |= ABILITY_FLAG_STENCH; } } if (!EntityExists(attacker) || !EntityExists(target)) diff --git a/src/dungeon_message.c b/src/dungeon_message.c index ee763a92f..34083a8e3 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -1081,9 +1081,16 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y) #include "dungeon_ai_targeting.h" #include "structs/str_damage.h" #include "constants/ability.h" +#include "constants/status.h" #include "type_chart.h" #include "position_util.h" #include "code_806CD90.h" +#include "move_util.h" +#include "code_808417C.h" +#include "dungeon_capabilities.h" +#include "move_effects_target.h" +#include "status.h" +#include "charge_move.h" NAKED void sub_8053704(void) { @@ -4394,7 +4401,7 @@ NAKED void sub_8053704(void) " cmp r1, 0x89\n" " beq _08055568\n" " adds r0, r7, 0\n" - " bl sub_8055DDC\n" + " bl TriggerAbilityEffect\n" " adds r0, r7, 0\n" " adds r1, r5, 0\n" " mov r2, r8\n" @@ -4648,3 +4655,264 @@ void sub_80559DC(Entity *entity1, Entity *entity2) entInfo->action.direction = direction & DIRECTION_MASK; sub_806CE68(entity1, direction); } + +extern const u8 *const gUnknown_80FC714; +extern const u8 *const gUnknown_80FC718; +extern const u8 *const gUnknown_80FC6A8; +extern const u8 *const gUnknown_80FD2D0; +extern const u8 *const gUnknown_80FD2DC; +extern const u8 *const gUnknown_80F93C8; +extern const u8 *const gUnknown_80FC690; +extern const u8 *const gUnknown_80FC6A4; + +extern const s16 gUnknown_80F4E70[]; +extern const s16 gUnknown_80F4E74[]; + +extern u8 gFormatItems[]; +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) +{ + s32 i, j; + s32 moveId; + EntityInfo *entInfo = GetEntInfo(entity); + bool32 var_2C; + + moveId = firstMoveId; + if (firstMoveId >= MAX_MON_MOVES) + return FALSE; + + entInfo->abilityEffectFlags = 0; + entInfo->unk159 = 0; + if (entInfo->volatileStatus.volatileStatus == STATUS_CRINGE) { + SetMessageArgument(gAvailablePokemonNames, entity, 0); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC714); // is cringing! + return FALSE; + } + else if (entInfo->volatileStatus.volatileStatus == STATUS_INFATUATED) { + SetMessageArgument(gAvailablePokemonNames, entity, 0); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC718); // is infatuated! + return FALSE; + } + else if (entInfo->nonVolatile.nonVolatileStatus == STATUS_PARALYSIS) { + SetMessageArgument(gAvailablePokemonNames, entity, 0); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6A8); // is paralyzed! + return FALSE; + } + + gUnknown_202F222 = 0; + gUnknown_202F208 = 0; + gUnknown_202F221 = 0; + for (i = 0; i < MAX_MON_MOVES; i++) { + entInfo->mimicMoveIDs[i] = 0; + } + + for (i = 0, j = 0; i < MAX_MON_MOVES; i++) { + j++; + if (++moveId >= MAX_MON_MOVES) + break; + if (!(entInfo->moves.moves[moveId].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN)) + break; + } + + var_2C = (j > 1); + moveId = firstMoveId; + + while (1) { + Move *currMove = &entInfo->moves.moves[moveId]; + if (!EntityExists(entity) || sub_8044B28()) + break; + + if (currMove->id == MOVE_SNORE || currMove->id == MOVE_SLEEP_TALK) { + if (!IsSleeping(entity)) { + if (CannotAttack(entity, TRUE)) + break; + } + } + else { + if (CannotAttack(entity, FALSE)) + break; + } + + if (gUnknown_202F221 != 0) + break; + + if (MoveFlagExists(currMove)) { + bool32 moveUsable = TRUE; + bool32 var_28 = FALSE; + bool32 statusMoveMatch = MoveMatchesChargingStatus(entity, currMove); + + if (currMove->PP != 0) { + if (!statusMoveMatch) { + var_28 = TRUE; + } + } + else { + if (!statusMoveMatch) { + sub_80928C0(gFormatItems, currMove, NULL); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80F93C8); // The move can't be used! + moveUsable = FALSE; + } + } + + if (moveUsable) { + bool32 r0; + s32 unkBefore = gUnknown_202F208; + + entInfo->unk159 = statusMoveMatch; + if (currMove->id == MOVE_ASSIST) { + Move assistMove = *currMove; + + 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); + } + else { + r0 = sub_8055FA0(entity, var_34, isOrb, arg_0, var_2C, currMove); + } + + if (var_28 && r0) { + if (currMove->moveFlags2 & MOVE_FLAG2_UNK4) { + currMove->moveFlags2 &= ~(MOVE_FLAG2_UNK4); + } + else { + currMove->moveFlags2 |= MOVE_FLAG_TEMPORARY; + } + } + + if (unkBefore == gUnknown_202F208) { + if (!isOrb) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC690); // The currMove failed! + } + else { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6A4); // The Orb failed! + } + } + } + } + + sub_804178C(1); + if (!EntityExists(entity) || sub_8044B28()) + break; + if (++moveId >= MAX_MON_MOVES) + break; + if (!MoveFlagLinkChain(&entInfo->moves.moves[moveId])) + break; + } + + if (EntityExists(entity)) { + for (i = 0; i < MAX_MON_MOVES; i++) { + if (entInfo->mimicMoveIDs[i] != 0) { + Move mimicMove, assistMove; + Move *movePtr; + + movePtr = &mimicMove; + sub_8092AA8(&mimicMove, entInfo->mimicMoveIDs[i]); + if (MoveFlagExists(&mimicMove)) { + if (mimicMove.id == MOVE_ASSIST) { + assistMove = mimicMove; + assistMove.id = sub_8057144(entity); + movePtr = &assistMove; + sub_80928C0(gFormatItems, &assistMove, NULL); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FD2DC); // Assist: + } + sub_8055FA0(entity, 0, isOrb, arg_0, var_2C, movePtr); + } + sub_804178C(1); + } + } + } + + if (EntityExists(entity)) { + sub_8071DA4(entity); + if (EntityExists(entity) && gUnknown_202F222 != 0) { + gUnknown_202F222 = 0; + if (EntityExists(entity)) { + EntityInfo *entInfo = GetEntInfo(entity); + s32 statusTurns = CalculateStatusTurns(entity, gUnknown_80F4E70, TRUE); + PausedStatusTarget(entity, entity, 1, statusTurns, FALSE); + SetExpMultplier(entInfo); + } + } + } + + return TRUE; +} + +extern const u16 gUnknown_80F5004; +extern const u8 *const gUnknown_80FEEA4; +extern const u8 *const gUnknown_80FEEC8; +extern const u8 *const gUnknown_80FEEEC; +extern const u8 *const gUnknown_80FEF0C; +extern const u8 *const gUnknown_80FEF30; +extern const u8 *const gUnknown_80FEF4C; +extern const u8 *const gUnknown_80FEF50; +extern const u8 *const gUnknown_80FEF54; +extern const u8 *const gUnknown_80FEF74; +extern const u8 *const gUnknown_80FEF98; +extern const u8 *const gUnknown_80FEFD0; + +void TriggerAbilityEffect(Entity *entity) +{ + if (EntityExists(entity)) { + EntityInfo *entInfo = GetEntInfo(entity); + + if (entInfo->abilityEffectFlags & ABILITY_FLAG_ARENA_TRAP) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEA4); // Arena Trap prevents movement! + ImmobilizedStatusTarget(entity, entity); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_SHADOW_TAG) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEC8); // Shadow Tag prevents movement! + ImmobilizedStatusTarget(entity, entity); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_MAGNET_PULL) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEEC); // Magnet Pull prevents movement! + ImmobilizedStatusTarget(entity, entity); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_STATIC) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF0C); // Static caused paralysis! + ParalyzeStatusTarget(entity, entity, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_PRLZ) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF30); // Effect Spore scattered spores + ParalyzeStatusTarget(entity, entity, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_POISON_POINT) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF4C); // Poison Point struck! + PoisonedStatusTarget(entity, entity, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_PSN) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF50); // Effect Spore scattered spores! + PoisonedStatusTarget(entity, entity, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_SLP) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF54); // Effect Spore scattered spores! + sub_8075C58(entity, entity, CalculateStatusTurns(entity, gUnknown_80F4E74, TRUE), TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_FLAME_BODY) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF74); // Flame Body caused a burn! + BurnedStatusTarget(entity, entity, TRUE, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_CUTE_CHARM) { + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF98); // Cute Charm caused infatuation + InfatuateStatusTarget(entity, entity, TRUE); + } + if (entInfo->abilityEffectFlags & ABILITY_FLAG_STENCH) { + SetMessageArgument(gAvailablePokemonNames, entity, 0); + TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEFD0); // A horrid stench billowed out + sub_80428A0(entity); + entInfo->terrifiedTurns = gUnknown_80F5004; + } + + entInfo->abilityEffectFlags = 0; + } +} diff --git a/src/trap_1.c b/src/trap_1.c index a13bcccae..c4f35d0db 100644 --- a/src/trap_1.c +++ b/src/trap_1.c @@ -469,7 +469,7 @@ void SaveEntity(unkStruct_8094924 *param_1, Entity *param_2) sub_8083060(param_1,info->turnsSinceWarpScarfActivation); SavePosition(param_1,&(info->targetPos)); sub_80830A0(param_1,info->unk174); - sub_8083030(param_1,info->unk178); + sub_8083030(param_1,info->abilityEffectFlags); sub_8083048(param_1,info->unk1F8); sub_8083048(param_1,info->mobileTurnTimer); sub_8083078(param_1,info->expGainedInTurn);