From 1de7c500e90c44ef34a77c2ffbf1c5555f93da9f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 22 Nov 2024 12:00:34 +0100 Subject: [PATCH] sub_806A914 --- asm/code_8069E0C.s | 488 ---------------------------------- include/number_util.h | 3 + include/structs/map.h | 30 +++ include/structs/str_dungeon.h | 2 +- src/code_8042B34.c | 4 +- src/code_8048480.c | 4 +- src/code_8069E0C.c | 192 +++++++++++++ src/dungeon_generation.c | 27 -- src/number_util.c | 4 +- 9 files changed, 231 insertions(+), 523 deletions(-) diff --git a/asm/code_8069E0C.s b/asm/code_8069E0C.s index 060888d6c..3a92bad0c 100644 --- a/asm/code_8069E0C.s +++ b/asm/code_8069E0C.s @@ -8,494 +8,6 @@ - thumb_func_start sub_806A5B8 -sub_806A5B8: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - adds r6, r0, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0806A5CE - b _0806A6D2 -_0806A5CE: - adds r0, r6, 0 - bl GetTileAtEntitySafe - ldrh r0, [r0] - movs r1, 0x3 - ands r1, r0 - cmp r1, 0x2 - bne _0806A664 - ldr r4, [r6, 0x70] - ldr r1, _0806A640 - ldr r0, _0806A644 - ldr r0, [r0] - ldr r2, _0806A648 - adds r0, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806A650 - adds r0, r4, 0 - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806A608 - adds r0, r6, 0 - adds r1, r6, 0 - bl EndFrozenClassStatus -_0806A608: - movs r1, 0x2 - ldrsh r0, [r4, r1] - bl GetMovementType - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - beq _0806A6D2 - movs r2, 0x2 - ldrsh r1, [r4, r2] - ldr r0, _0806A64C - cmp r1, r0 - beq _0806A6D2 - cmp r1, 0x92 - beq _0806A6D2 - adds r0, r4, 0 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x1 - beq _0806A6D2 - adds r0, r6, 0 - adds r1, r6, 0 - movs r2, 0x1 - movs r3, 0 - bl BurnedStatusTarget - b _0806A6D2 - .align 2, 0 -_0806A640: .4byte gDungeonWaterType -_0806A644: .4byte gDungeon -_0806A648: .4byte 0x00003a0e -_0806A64C: .4byte 0x00000113 -_0806A650: - adds r0, r4, 0 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806A6D2 - adds r0, r6, 0 - adds r1, r6, 0 - bl EndBurnClassStatus - b _0806A6D2 -_0806A664: - cmp r1, 0 - bne _0806A6D2 - ldr r7, [r6, 0x70] - ldrb r0, [r7, 0x7] - cmp r0, 0 - beq _0806A6D2 - movs r0, 0x9E - lsls r0, 1 - adds r4, r7, r0 - ldr r5, [r4] - mov r0, sp - adds r1, r5, 0 - movs r2, 0x5 - bl FixedPoint_Subtract - ldr r0, [sp] - str r0, [r4] - movs r1, 0 - mov r8, r1 - adds r0, r5, 0 - bl FixedPointToInt - cmp r0, 0x13 - ble _0806A6A4 - ldr r0, [r4] - bl FixedPointToInt - cmp r0, 0x13 - bgt _0806A6A4 - ldr r0, _0806A6E0 - ldr r0, [r0] - mov r8, r0 -_0806A6A4: - adds r0, r5, 0 - bl FixedPointToInt - cmp r0, 0x9 - ble _0806A6C4 - movs r2, 0x9E - lsls r2, 1 - adds r0, r7, r2 - ldr r0, [r0] - bl FixedPointToInt - cmp r0, 0x9 - bgt _0806A6C4 - ldr r0, _0806A6E4 - ldr r0, [r0] - mov r8, r0 -_0806A6C4: - mov r0, r8 - cmp r0, 0 - beq _0806A6D2 - adds r0, r6, 0 - mov r1, r8 - bl LogMessageByIdWithPopupCheckUser -_0806A6D2: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806A6E0: .4byte gUnknown_80FD594 -_0806A6E4: .4byte gUnknown_80FD5B8 - thumb_func_end sub_806A5B8 - - thumb_func_start sub_806A6E8 -sub_806A6E8: - push {r4-r7,lr} - sub sp, 0xC - adds r7, r0, 0 - ldr r6, [r7, 0x70] - adds r0, r6, 0 - adds r0, 0x64 - adds r1, r6, 0 - adds r1, 0x62 - ldrb r2, [r0] - ldrb r1, [r1] - cmp r2, r1 - beq _0806A77A - ldrb r0, [r6, 0x7] - cmp r0, 0 - bne _0806A764 - cmp r1, 0xA - beq _0806A70E - cmp r1, 0x2B - bne _0806A72E -_0806A70E: - movs r0, 0x9E - lsls r0, 1 - adds r5, r6, r0 - ldr r4, [r5] - mov r0, sp - movs r1, 0xA - bl IntToFixedPoint - ldr r2, [sp] - add r0, sp, 0x4 - adds r1, r4, 0 - bl FixedPoint_Subtract - ldr r0, [sp, 0x4] - str r0, [r5] - b _0806A744 -_0806A72E: - cmp r1, 0x1B - bne _0806A744 - add r0, sp, 0x8 - movs r1, 0 - bl IntToFixedPoint - movs r0, 0x9E - lsls r0, 1 - adds r1, r6, r0 - ldr r0, [sp, 0x8] - str r0, [r1] -_0806A744: - ldr r0, _0806A75C - ldr r0, [r0] - ldr r1, _0806A760 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0806A776 - adds r0, r7, 0 - bl EntityUpdateStatusSprites - b _0806A776 - .align 2, 0 -_0806A75C: .4byte gDungeon -_0806A760: .4byte 0x00000676 -_0806A764: - cmp r1, 0x11 - beq _0806A76C - cmp r2, 0x11 - bne _0806A776 -_0806A76C: - movs r0, 0x1 - bl sub_803F580 - bl sub_8040A84 -_0806A776: - bl sub_807AA30 -_0806A77A: - adds r0, r6, 0 - adds r0, 0x60 - ldrb r0, [r0] - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - beq _0806A792 - adds r0, r6, 0 - adds r0, 0x62 - ldrb r1, [r0] - adds r0, 0x2 - b _0806A796 -_0806A792: - adds r0, r6, 0 - adds r0, 0x64 -_0806A796: - strb r1, [r0] - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806A6E8 - - thumb_func_start sub_806A7A0 -sub_806A7A0: - push {r4,r5,lr} - movs r5, 0 -_0806A7A4: - ldr r0, _0806A7E0 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _0806A7E4 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0806A7D2 - ldr r2, [r4, 0x70] - movs r1, 0xC - ldrsh r0, [r2, r1] - cmp r0, 0x1 - ble _0806A7D2 - adds r1, r0, 0 - subs r1, 0x1 - adds r0, r2, 0 - bl sub_806A7E8 -_0806A7D2: - adds r5, 0x1 - cmp r5, 0x3 - ble _0806A7A4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0806A7E0: .4byte gDungeon -_0806A7E4: .4byte 0x0001357c - thumb_func_end sub_806A7A0 - - thumb_func_start sub_806A7E8 -sub_806A7E8: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x30 - adds r5, r0, 0 - mov r0, sp - bl GetNumAvailableIQSkills - mov r9, r0 - add r4, sp, 0x18 - movs r0, 0xC - ldrsh r1, [r5, r0] - adds r0, r4, 0 - bl GetNumAvailableIQSkills - adds r6, r0, 0 - ldr r0, _0806A828 - adds r1, r5, 0 - movs r2, 0 - bl SetMessageArgument_2 - movs r2, 0x1 - mov r8, r4 -_0806A818: - movs r3, 0 - movs r5, 0 - movs r1, 0 - adds r4, r2, 0x1 - cmp r3, r9 - bge _0806A83E - mov r0, sp - b _0806A836 - .align 2, 0 -_0806A828: .4byte gFormatBuffer_Monsters -_0806A82C: - adds r1, 0x1 - cmp r1, r9 - bge _0806A83E - mov r7, sp - adds r0, r7, r1 -_0806A836: - ldrb r0, [r0] - cmp r0, r2 - bne _0806A82C - movs r3, 0x1 -_0806A83E: - movs r1, 0 - cmp r1, r6 - bge _0806A85C - mov r7, r8 - ldrb r0, [r7] - b _0806A856 -_0806A84A: - adds r1, 0x1 - cmp r1, r6 - bge _0806A85C - mov r7, r8 - adds r0, r7, r1 - ldrb r0, [r0] -_0806A856: - cmp r0, r2 - bne _0806A84A - movs r5, 0x1 -_0806A85C: - cmp r3, r5 - beq _0806A87A - lsls r0, r2, 24 - lsrs r0, 24 - bl GetIQSkillName - adds r1, r0, 0 - ldr r0, _0806A890 - bl strcpy - ldr r0, _0806A894 - ldr r1, [r0] - movs r0, 0 - bl DisplayDungeonLoggableMessageTrue -_0806A87A: - adds r2, r4, 0 - cmp r2, 0x17 - ble _0806A818 - add sp, 0x30 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806A890: .4byte gFormatBuffer_Items -_0806A894: .4byte gUnknown_80FEAC4 - thumb_func_end sub_806A7E8 - - thumb_func_start sub_806A898 -sub_806A898: - push {r4-r7,lr} - adds r4, r0, 0 - lsls r1, 24 - lsrs r7, r1, 24 - lsls r2, 24 - lsrs r1, r2, 24 - ldr r5, [r4, 0x70] - ldrb r0, [r5, 0x7] - cmp r0, 0 - beq _0806A8C2 - ldrh r1, [r4, 0x4] - movs r2, 0xB6 - lsls r2, 1 - adds r0, r5, r2 - strh r1, [r0] - ldrh r0, [r4, 0x6] - adds r0, 0x1 - adds r2, 0x2 - adds r1, r5, r2 - strh r0, [r1] - b _0806A8C8 -_0806A8C2: - adds r0, r4, 0 - bl AIMovement -_0806A8C8: - movs r0, 0xB6 - lsls r0, 1 - adds r6, r5, r0 - ldr r0, [r6] - cmp r0, 0 - beq _0806A90E - adds r0, r4, 0 - movs r1, 0x1 - bl CheckVariousStatuses2 - lsls r0, 24 - cmp r0, 0 - beq _0806A8EE - adds r0, r4, 0 - bl CheckVariousStatuses - lsls r0, 24 - cmp r0, 0 - bne _0806A90E -_0806A8EE: - adds r0, r4, 0x4 - adds r1, r6, 0 - bl GetDirectionTowardsPosition - adds r2, r0, 0 - movs r1, 0x7 - ands r0, r1 - adds r1, r5, 0 - adds r1, 0x46 - strb r0, [r1] - cmp r7, 0 - beq _0806A90E - adds r0, r4, 0 - adds r1, r2, 0 - bl sub_806CE68 -_0806A90E: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806A898 - - thumb_func_start sub_806A914 -sub_806A914: - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r1, 24 - lsrs r7, r1, 24 - lsls r2, 24 - lsrs r6, r2, 24 - movs r5, 0 -_0806A92A: - ldr r0, _0806A96C - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _0806A970 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0806A95C - ldr r0, [r4, 0x70] - cmp r7, 0 - beq _0806A952 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806A95C -_0806A952: - adds r0, r4, 0 - mov r1, r8 - adds r2, r6, 0 - bl sub_806A898 -_0806A95C: - adds r5, 0x1 - cmp r5, 0x13 - ble _0806A92A - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806A96C: .4byte gDungeon -_0806A970: .4byte 0x000135cc - thumb_func_end sub_806A914 - thumb_func_start sub_806A974 sub_806A974: push {r4,r5,lr} diff --git a/include/number_util.h b/include/number_util.h index ed5c06d0e..ec1f30eb9 100644 --- a/include/number_util.h +++ b/include/number_util.h @@ -50,6 +50,9 @@ FixedPoint FixedPoint_SetFromUnk(s48_16* param_1); FixedPoint FixedPoint_Div(FixedPoint a, FixedPoint b); s32 FixedPointToInt(FixedPoint a); // Always rounded up +// Sometimes it's used directly as opposed to calling IntToFixedPoint +#define IntToFixedPointMacro(x) ((FixedPoint){x, 0}) + #define IntToF248_2(x) ((s24_8){x * 0x100}) #define FloatToF248_2(x) ((s24_8){(int)(x * 0x100)}) static inline s24_8 IntToF248(s32 x) { diff --git a/include/structs/map.h b/include/structs/map.h index f5f3b5c2c..1d10fc4fc 100644 --- a/include/structs/map.h +++ b/include/structs/map.h @@ -10,9 +10,11 @@ enum TerrainType { + // These 3 seem to indicate the 'main' type of the terrain. See helper functions for how they're set. TERRAIN_TYPE_WALL = 0, // x0 When neither TERRAIN_TYPE_NORMAL nor TERRAIN_TYPE_SECONDARY are set TERRAIN_TYPE_NORMAL = 1 << 0, // x1 TERRAIN_TYPE_SECONDARY = 1 << 1, // Water or lava depending on the dungeon. x2 + // Rest seems to be flags. TERRAIN_TYPE_CORNER_CUTTABLE = 1 << 2, // x4 This tile can be corner-cut when walking. Seemingly only used during dungeon generation. TERRAIN_TYPE_NATURAL_JUNCTION = 1 << 3, // x8 TERRAIN_TYPE_IMPASSABLE_WALL = 1 << 4, // x10 @@ -84,4 +86,32 @@ typedef struct RoomData u32 unk18; // top left y } RoomData; +// Helper functions for main terrain types. +static inline void SetTerrainType(Tile *tile, u32 terrainType) +{ + tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrainType |= terrainType; +} + +static inline void SetTerrainNormal(Tile *tile) +{ + SetTerrainType(tile, TERRAIN_TYPE_NORMAL); +} + +static inline void SetTerrainSecondary(Tile *tile) +{ + SetTerrainType(tile, TERRAIN_TYPE_SECONDARY); +} + +static inline void SetTerrainWall(Tile *tile) +{ + SetTerrainType(tile, TERRAIN_TYPE_WALL); +} + +static inline u32 GetTerrainType(const Tile *tile) +{ + return tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); +} + + #endif // GUARD_MAP_H diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index ec6ecaefd..8eede3747 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -14,7 +14,7 @@ #define DUNGEON_MAX_SIZE_Y 32 #define DUNGEON_MAX_WILD_POKEMON 16 #define DUNGEON_MAX_WILD_POKEMON_BODY_SIZE 16 -#define DUNGEON_MAX_POKEMON MAX_TEAM_MEMBERS + DUNGEON_MAX_WILD_POKEMON +#define DUNGEON_MAX_POKEMON (MAX_TEAM_MEMBERS + DUNGEON_MAX_WILD_POKEMON) #define DUNGEON_MAX_TRAPS 64 #define DUNGEON_MAX_ITEMS 64 diff --git a/src/code_8042B34.c b/src/code_8042B34.c index 5630bb3d3..fa5975f77 100644 --- a/src/code_8042B34.c +++ b/src/code_8042B34.c @@ -367,7 +367,7 @@ extern void LoadDungeonTilesetAssets(void); extern void LoadDungeonPokemonSprites(void); extern void ShowDungeonNameBanner(void); extern void sub_803EAF0(u32, u32); -extern void sub_806A914(u8 a0, u8 a1, u8 a2); +extern void sub_806A914(bool8 a0, bool8 a1, bool8 showRunAwayEffect); extern void sub_803F4A0(Entity *a0); extern void sub_8083AB0(s16 param_0, Entity * target, Entity * entity); extern void sub_8046F84(s32 itemFlag); @@ -674,7 +674,7 @@ void xxx_dungeon_8042F6C(struct UnkStruct_xxx_dungeon_8042F6C *r8) sub_8049ED4(); if (!r6) { - sub_806A914(1, 0, 0); + sub_806A914(TRUE, FALSE, FALSE); } else { sub_806CF60(); diff --git a/src/code_8048480.c b/src/code_8048480.c index da8e833d2..be70c22df 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -108,7 +108,7 @@ extern void LevelDownTarget(Entity *pokemon, Entity *r1, u32 r2); extern void sub_806F370(Entity *pokemon, Entity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32); extern s32 sub_8042520(Entity *); Entity *sub_80696FC(Entity *); -extern void sub_806A7E8(EntityInfo *, s32); +extern void DisplayMsgIfNewIqSkillLearned(EntityInfo *, s32); extern u32 HandleDamagingMove(struct Entity *, struct Entity *, struct Move *, u32, u32); void StunSeedItemAction(Entity *, Entity *); @@ -774,7 +774,7 @@ void HandleGummiItemAction(Entity *pokemon, Entity *target, u8 gummiIndex) TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FD648[iVar4]); TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FD6E8[iVar3]); LoadIQSkills(target); - sub_806A7E8(targetInfo,baseIQ); + DisplayMsgIfNewIqSkillLearned(targetInfo,baseIQ); } } } diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index 43c306376..fb6d0cdef 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -311,7 +311,18 @@ void sub_806A390(Entity *pokemon) // New file? #include "file_system.h" +#include "tile_types.h" +#include "position_util.h" +#include "number_util.h" +#include "pokemon_3.h" +#include "code_8077274_1.h" +#include "code_806CD90.h" +#include "dungeon_capabilities.h" +#include "status_checks_1.h" +#include "dungeon_ai_movement.h" +#include "constants/iq_skill.h" +extern void EntityUpdateStatusSprites(Entity *); extern s32 sub_808F700(PokemonStruct1 *pokemon); extern Entity *sub_80696A8(Entity *a0); extern int sprintf(char *, const char *, ...); @@ -491,3 +502,184 @@ bool8 sub_806A5A4(s16 r0) return FALSE; } +extern const u8 *const gUnknown_80FD594; +extern const u8 *const gUnknown_80FD5B8; +extern const u8 *const gUnknown_80FEAC4; + +void sub_806A5B8(Entity *entity) +{ + s32 terrainType; + + if (!EntityExists(entity)) + return; + + terrainType = GetTerrainType(GetTileAtEntitySafe(entity)); + if (terrainType == TERRAIN_TYPE_SECONDARY) { + EntityInfo *info = GetEntInfo(entity); + // If lava - defrost and burn + if (gDungeonWaterType[gDungeon->tileset] == DUNGEON_WATER_TYPE_LAVA) { + if (info->frozenClassStatus.status == STATUS_FROZEN) { + EndFrozenClassStatus(entity, entity); + } + if (GetMovementType(info->id) != 4 && + info->id != MONSTER_HO_OH + && info->id != MONSTER_MOLTRES + && info->burnClassStatus.status != STATUS_BURN) + { + BurnedStatusTarget(entity, entity, 1, FALSE); + } + } + // It's water - heal burn + else { + if (info->burnClassStatus.status == STATUS_BURN) { + EndBurnClassStatus(entity, entity); + } + } + } + // If wall - decrement belly by 5 + else if (terrainType == TERRAIN_TYPE_WALL) { + const u8 *str; + EntityInfo *info = GetEntInfo(entity); + + if (info->isTeamLeader) { + FixedPoint bellyBefore = info->belly; + info->belly = FixedPoint_Subtract(bellyBefore, IntToFixedPointMacro(5)); + str = NULL; + if (FixedPointToInt(bellyBefore) > 19 && FixedPointToInt(info->belly) <= 19) { + str = gUnknown_80FD594; // Getting hungry... + } + if (FixedPointToInt(bellyBefore) > 9 && FixedPointToInt(info->belly) <= 9) { + str = gUnknown_80FD5B8; // Getting dizzy from hunger... + } + + if (str != NULL) { + LogMessageByIdWithPopupCheckUser(entity, str); + } + } + } +} + +extern void sub_803F580(s32); +extern void sub_8040A84(void); + +void sub_806A6E8(Entity *entity) +{ + EntityInfo *info = GetEntInfo(entity); + + if (info->unk64 != info->heldItem.id) { + if (!info->isTeamLeader) { + if (info->heldItem.id == ITEM_HEAL_RIBBON || info->heldItem.id == ITEM_MUNCH_BELT) { + info->belly = FixedPoint_Subtract(info->belly, IntToFixedPoint(10)); + } + else if (info->heldItem.id == ITEM_DIET_RIBBON) { + info->belly = IntToFixedPoint(0); + } + + if (gDungeon->unk644.itemHoldersIdentified) { + EntityUpdateStatusSprites(entity); + } + } + else { + if (info->heldItem.id == ITEM_X_RAY_SPECS || info->unk64 == ITEM_X_RAY_SPECS) { + sub_803F580(1); + sub_8040A84(); + } + } + sub_807AA30(); + } + + if (ItemExists(&info->heldItem)) { + info->unk64 = info->heldItem.id; + } + else { + info->unk64 = ITEM_NOTHING; + } +} + +void DisplayMsgIfNewIqSkillLearned(EntityInfo *info, s32 pokeIq); + +UNUSED static void DisplayMsgIfTeamMonsLearnedNewIqSkill(void) +{ + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *entity = gDungeon->teamPokemon[i]; + if (EntityExists(entity)) { + EntityInfo *info = GetEntInfo(entity); + if (info->IQ > 1) { + DisplayMsgIfNewIqSkillLearned(info, info->IQ - 1); + } + } + } +} + +void DisplayMsgIfNewIqSkillLearned(EntityInfo *info, s32 iqBefore) +{ + s32 i, j; + u8 iqSkillsArrayBefore[NUM_IQ_SKILLS]; + u8 iqSkillsArrayNow[NUM_IQ_SKILLS]; + s32 numIqSkillsBefore = GetNumAvailableIQSkills(iqSkillsArrayBefore, iqBefore); + s32 numIqSkillsNow = GetNumAvailableIQSkills(iqSkillsArrayNow, info->IQ); + + SetMessageArgument_2(gFormatBuffer_Monsters[0], info, 0); + for (i = 1; i < NUM_IQ_SKILLS; i++) { + bool8 hadIqSkillBefore = FALSE; + bool8 hasIqSkillNow = FALSE; + + for (j = 0; j < numIqSkillsBefore; j++) { + if (iqSkillsArrayBefore[j] == i) { + hadIqSkillBefore = TRUE; + break; + } + } + + for (j = 0; j < numIqSkillsNow; j++) { + if (iqSkillsArrayNow[j] == i) { + hasIqSkillNow = TRUE; + break; + } + } + + if (hadIqSkillBefore != hasIqSkillNow) { + strcpy(gFormatBuffer_Items[0], GetIQSkillName(i)); + DisplayDungeonLoggableMessageTrue(NULL, gUnknown_80FEAC4); // IQ rose! \n It learned the IQ skill 'i0' + } + } +} + +void sub_806A898(Entity *entity, bool8 r7, bool8 showRunAwayEffect) +{ + EntityInfo *info = GetEntInfo(entity); + if (info->isTeamLeader) { + info->targetPos.x = entity->pos.x; + info->targetPos.y = entity->pos.y + 1; + } + else { + AIMovement(entity, showRunAwayEffect); + } + + if (info->targetPos.x != 0 || info->targetPos.y != 0) { + if (!CheckVariousStatuses2(entity, TRUE) || !CheckVariousStatuses(entity)) { + s32 newDirection = GetDirectionTowardsPosition(&entity->pos, &info->targetPos); + info->action.direction = newDirection & DIRECTION_MASK; + if (r7) { + sub_806CE68(entity, newDirection); + } + } + } +} + +void sub_806A914(bool8 a0, bool8 a1, bool8 showRunAwayEffect) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + Entity *entity = gDungeon->activePokemon[i]; + if (EntityExists(entity)) { + EntityInfo *info = GetEntInfo(entity); + if (!a1 || info->monsterBehavior == 1) { + sub_806A898(entity, a0, showRunAwayEffect); + } + } + } +} diff --git a/src/dungeon_generation.c b/src/dungeon_generation.c index 7f8698f12..839088cfc 100644 --- a/src/dungeon_generation.c +++ b/src/dungeon_generation.c @@ -136,33 +136,6 @@ static EWRAM_DATA s32 sFloorLayout = 0; static EWRAM_DATA s32 sNumTilesReachableFromStairs = 0; static EWRAM_DATA DungeonPos sKecleonShopMiddlePos = {0}; -// Helper functions for terrain flags -static inline void SetTerrainType(Tile *tile, u32 terrainType) -{ - tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); - tile->terrainType |= terrainType; -} - -static inline void SetTerrainNormal(Tile *tile) -{ - SetTerrainType(tile, TERRAIN_TYPE_NORMAL); -} - -static inline void SetTerrainSecondary(Tile *tile) -{ - SetTerrainType(tile, TERRAIN_TYPE_SECONDARY); -} - -static inline void SetTerrainWall(Tile *tile) -{ - SetTerrainType(tile, TERRAIN_TYPE_WALL); -} - -static inline u32 GetTerrainType(const Tile *tile) -{ - return tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); -} - struct FixedRoomsData { u8 x; diff --git a/src/number_util.c b/src/number_util.c index 19c9c1bd8..a8a94e8b2 100644 --- a/src/number_util.c +++ b/src/number_util.c @@ -78,9 +78,7 @@ FixedPoint sub_8094370(FixedPoint param_1, FixedPoint param_2) FixedPoint IntToFixedPoint(s32 a) { - FixedPoint p; - p.unk0 = a; - p.unk2 = 0; + FixedPoint p = IntToFixedPointMacro(a); return p; }