diff --git a/asm/code_80450F8.s b/asm/code_80450F8.s index afbd0fef8..84d2e416b 100644 --- a/asm/code_80450F8.s +++ b/asm/code_80450F8.s @@ -5,650 +5,6 @@ .text - thumb_func_start sub_80453AC -sub_80453AC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - movs r0, 0x1 - negs r0, r0 - mov r9, r0 - mov r0, r8 - bl GetBodySize - lsls r0, 24 - lsrs r6, r0, 24 - movs r5, 0 - movs r0, 0x6 - subs r3, r0, r6 - ldr r4, _080453D8 - b _080453DE - .align 2, 0 -_080453D8: .4byte gUnknown_202EE70 -_080453DC: - adds r5, 0x1 -_080453DE: - cmp r5, r3 - bgt _08045400 - movs r2, 0 - cmp r2, r6 - bge _080453FA - adds r1, r5, r4 - b _080453F4 -_080453EC: - adds r1, 0x1 - adds r2, 0x1 - cmp r2, r6 - bge _080453FA -_080453F4: - ldrb r0, [r1] - cmp r0, 0 - beq _080453EC -_080453FA: - cmp r2, r6 - bne _080453DC - mov r9, r5 -_08045400: - movs r0, 0x1 - negs r0, r0 - cmp r9, r0 - beq _080454FC - movs r5, 0 - ldr r7, _080454DC -_0804540C: - ldr r1, _080454E0 - ldr r0, [r1] - lsls r1, r5, 2 - ldr r2, _080454E4 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - cmp r0, 0 - bne _080454F0 - movs r0, 0x1 - str r0, [r4] - adds r0, r4, 0 - adds r0, 0x24 - strb r5, [r0] - ldr r1, _080454E0 - ldr r0, [r1] - adds r0, r7 - str r0, [r4, 0x70] - mov r2, r8 - strh r2, [r0, 0x2] - movs r0, 0 - mov r1, r8 - bl GetMonsterApparentID - ldr r1, [r4, 0x70] - strh r0, [r1, 0x4] - ldr r0, [r4, 0x70] - movs r5, 0 - strb r5, [r0, 0x6] - movs r0, 0 - mov r1, r8 - bl GetMonsterApparentID - lsls r0, 16 - asrs r0, 16 - bl GetSpriteData - str r0, [r4, 0x64] - mov r1, r9 - lsls r0, r1, 4 - adds r0, 0x40 - adds r1, r4, 0 - adds r1, 0x68 - strh r0, [r1] - adds r1, 0x2 - movs r0, 0x7 - strb r0, [r1] - adds r0, r4, 0 - adds r0, 0x6C - movs r2, 0 - strb r2, [r0] - adds r1, 0x1 - movs r0, 0xFF - strb r0, [r1] - adds r0, r4, 0 - adds r0, 0x6D - movs r5, 0x1 - strb r5, [r0] - adds r0, 0x2 - strb r5, [r0] - mov r0, r10 - str r0, [r4, 0x1C] - bl sub_8045ACC - ldr r0, [r4, 0x70] - ldr r1, _080454E8 - adds r0, r1 - mov r2, r9 - strb r2, [r0] - ldr r0, [r4, 0x70] - movs r5, 0xB4 - lsls r5, 1 - adds r0, r5 - strb r6, [r0] - cmp r6, 0 - beq _080454C6 - ldr r3, _080454EC - movs r2, 0x1 - adds r1, r6, 0 -_080454B6: - mov r5, r9 - adds r0, r5, r3 - strb r2, [r0] - movs r0, 0x1 - add r9, r0 - subs r1, 0x1 - cmp r1, 0 - bne _080454B6 -_080454C6: - ldr r1, _080454E0 - ldr r0, [r1] - movs r2, 0xCD - lsls r2, 3 - adds r0, r2 - ldrh r2, [r0] - adds r1, r2, 0x1 - strh r1, [r0] - strh r2, [r4, 0x26] - adds r0, r4, 0 - b _080454FE - .align 2, 0 -_080454DC: .4byte 0x0000069c -_080454E0: .4byte gDungeon -_080454E4: .4byte 0x0001357c -_080454E8: .4byte 0x00000167 -_080454EC: .4byte gUnknown_202EE70 -_080454F0: - movs r0, 0x82 - lsls r0, 2 - adds r7, r0 - adds r5, 0x1 - cmp r5, 0x3 - ble _0804540C -_080454FC: - movs r0, 0 -_080454FE: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80453AC - - thumb_func_start sub_804550C -sub_804550C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - movs r0, 0x1 - negs r0, r0 - mov r9, r0 - mov r0, r8 - bl GetBodySize - lsls r0, 24 - lsrs r7, r0, 24 - movs r5, 0 - movs r0, 0x10 - subs r3, r0, r7 - ldr r4, _08045538 - b _0804553E - .align 2, 0 -_08045538: .4byte gUnknown_202EE76 -_0804553C: - adds r5, 0x1 -_0804553E: - cmp r5, r3 - bgt _08045560 - movs r2, 0 - cmp r2, r7 - bge _0804555A - adds r1, r5, r4 - b _08045554 -_0804554C: - adds r1, 0x1 - adds r2, 0x1 - cmp r2, r7 - bge _0804555A -_08045554: - ldrb r0, [r1] - cmp r0, 0 - beq _0804554C -_0804555A: - cmp r2, r7 - bne _0804553C - mov r9, r5 -_08045560: - movs r0, 0x1 - negs r0, r0 - cmp r9, r0 - bne _0804556A - b _08045670 -_0804556A: - movs r5, 0 - movs r1, 0x1 - mov r10, r1 - ldr r2, _08045650 - mov r3, r9 - lsls r0, r3, 4 - adds r0, 0xA0 - str r0, [sp] -_0804557A: - ldr r1, _08045654 - ldr r0, [r1] - lsls r1, r5, 2 - ldr r3, _08045658 - adds r0, r3 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - str r2, [sp, 0x4] - bl EntityExists - lsls r0, 24 - lsrs r6, r0, 24 - ldr r2, [sp, 0x4] - cmp r6, 0 - bne _08045664 - mov r0, r10 - str r0, [r4] - adds r0, r4, 0 - adds r0, 0x24 - strb r5, [r0] - subs r0, 0x2 - strb r6, [r0] - ldr r1, _08045654 - ldr r0, [r1] - adds r0, r2 - str r0, [r4, 0x70] - mov r2, r8 - strh r2, [r0, 0x2] - movs r0, 0 - mov r1, r8 - bl GetMonsterApparentID - ldr r1, [r4, 0x70] - strh r0, [r1, 0x4] - ldr r0, [r4, 0x70] - mov r3, r10 - strb r3, [r0, 0x6] - movs r0, 0 - mov r1, r8 - bl GetMonsterApparentID - lsls r0, 16 - asrs r0, 16 - bl GetSpriteData - str r0, [r4, 0x64] - adds r0, r4, 0 - adds r0, 0x68 - mov r5, sp - ldrh r5, [r5] - strh r5, [r0] - adds r1, r4, 0 - adds r1, 0x6A - movs r0, 0x7 - strb r0, [r1] - adds r0, r4, 0 - adds r0, 0x6C - movs r1, 0 - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x6B - movs r0, 0xFF - strb r0, [r1] - adds r0, r4, 0 - adds r0, 0x6D - mov r2, r10 - strb r2, [r0] - adds r0, 0x2 - strb r2, [r0] - str r6, [r4, 0x1C] - ldr r0, [r4, 0x70] - ldr r3, _0804565C - adds r0, r3 - mov r5, r9 - strb r5, [r0] - ldr r0, [r4, 0x70] - movs r1, 0xB4 - lsls r1, 1 - adds r0, r1 - strb r7, [r0] - cmp r7, 0 - beq _08045636 - ldr r3, _08045660 - movs r2, 0x1 - adds r1, r7, 0 -_08045626: - mov r5, r9 - adds r0, r5, r3 - strb r2, [r0] - movs r0, 0x1 - add r9, r0 - subs r1, 0x1 - cmp r1, 0 - bne _08045626 -_08045636: - bl sub_8045ACC - ldr r1, _08045654 - ldr r0, [r1] - movs r2, 0xCD - lsls r2, 3 - adds r0, r2 - ldrh r2, [r0] - adds r1, r2, 0x1 - strh r1, [r0] - strh r2, [r4, 0x26] - adds r0, r4, 0 - b _08045672 - .align 2, 0 -_08045650: .4byte 0x00000ebc -_08045654: .4byte gDungeon -_08045658: .4byte 0x0001358c -_0804565C: .4byte 0x00000167 -_08045660: .4byte gUnknown_202EE76 -_08045664: - movs r3, 0x82 - lsls r3, 2 - adds r2, r3 - adds r5, 0x1 - cmp r5, 0xF - ble _0804557A -_08045670: - movs r0, 0 -_08045672: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_804550C - - thumb_func_start sub_8045684 -sub_8045684: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r10, r1 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r2, 24 - lsrs r2, 24 - mov r9, r2 - movs r5, 0 - ldr r7, _080456E4 - ldr r6, _080456E8 -_080456A2: - ldr r0, [r7] - lsls r1, r5, 2 - ldr r2, _080456EC - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0 - bne _080456F0 - movs r0, 0x2 - str r0, [r4] - ldr r0, [r7] - adds r0, r6 - str r0, [r4, 0x70] - mov r2, r8 - strb r2, [r0] - ldr r0, [r4, 0x70] - mov r2, r9 - strb r2, [r0, 0x1] - str r1, [r4, 0x1C] - adds r0, r4, 0 - adds r0, 0x22 - strb r1, [r0] - mov r2, r10 - ldr r0, [r2] - str r0, [r4, 0x4] - strh r1, [r4, 0x26] - adds r0, r4, 0 - b _080456FA - .align 2, 0 -_080456E4: .4byte gDungeon -_080456E8: .4byte 0x00003908 -_080456EC: .4byte 0x0001371c -_080456F0: - adds r6, 0x4 - adds r5, 0x1 - cmp r5, 0x3F - ble _080456A2 - movs r0, 0 -_080456FA: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8045684 - - thumb_func_start sub_8045708 -sub_8045708: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - mov r8, r0 - ldr r1, _08045744 - ldr r0, _08045748 - ldr r0, [r0] - ldr r2, _0804574C - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0804579C - mov r1, r8 - movs r2, 0 - ldrsh r0, [r1, r2] - movs r3, 0x2 - ldrsh r1, [r1, r3] - bl GetTileSafe - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x2 - bne _0804579C - b _080457C4 - .align 2, 0 -_08045744: .4byte gDungeonWaterType -_08045748: .4byte gDungeon -_0804574C: .4byte 0x00003a0e -_08045750: - movs r0, 0x3 - str r0, [r4] - ldr r0, _08045798 - adds r1, r6, r0 - mov r2, r9 - ldr r0, [r2] - adds r0, r1 - str r0, [r4, 0x70] - mov r3, r8 - ldr r0, [r3] - str r0, [r4, 0x4] - movs r1, 0 - ldrsh r0, [r3, r1] - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 3 - adds r1, 0x4 - lsls r1, 8 - movs r2, 0x2 - ldrsh r0, [r3, r2] - lsls r2, r0, 1 - adds r2, r0 - lsls r2, 3 - adds r2, 0x4 - lsls r2, 8 - adds r0, r4, 0 - bl SetEntityPixelPos - movs r0, 0 - strh r7, [r4, 0x26] - adds r1, r4, 0 - adds r1, 0x22 - strb r0, [r1] - str r7, [r4, 0x1C] - adds r0, r4, 0 - b _080457C6 - .align 2, 0 -_08045798: .4byte 0x00003804 -_0804579C: - movs r5, 0 - ldr r3, _080457D4 - mov r9, r3 -_080457A2: - mov r1, r9 - ldr r0, [r1] - lsls r6, r5, 2 - ldr r2, _080457D8 - adds r0, r2 - adds r0, r6 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0 - beq _08045750 - adds r5, 0x1 - cmp r5, 0x3F - ble _080457A2 -_080457C4: - movs r0, 0 -_080457C6: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080457D4: .4byte gDungeon -_080457D8: .4byte 0x0001361c - thumb_func_end sub_8045708 - - thumb_func_start sub_80457DC -sub_80457DC: - push {r4-r6,lr} - adds r4, r0, 0 - movs r0, 0x5 - str r0, [r4] - movs r6, 0 - movs r5, 0 - strh r5, [r4, 0x4] - strh r5, [r4, 0x6] - adds r0, r4, 0 - movs r1, 0 - movs r2, 0 - bl SetEntityPixelPos - strh r5, [r4, 0x26] - adds r4, 0x22 - strb r6, [r4] - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80457DC - - thumb_func_start sub_8045804 -sub_8045804: - push {r4-r6,lr} - adds r4, r0, 0 - bl GetEntityType - cmp r0, 0x1 - beq _0804581C - cmp r0, 0x1 - bcc _08045880 - cmp r0, 0x5 - beq _08045880 -_08045818: - movs r0, 0x1 - b _08045882 -_0804581C: - adds r0, r4, 0 - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, 0 - beq _08045880 - ldr r0, _08045874 - ldr r1, [r0] - ldr r0, _08045878 - adds r2, r1, r0 - ldr r5, [r2, 0x10] - ldr r3, [r4, 0x70] - ldrb r0, [r3, 0x6] - cmp r0, 0 - beq _08045818 - ldr r6, _0804587C - adds r0, r1, r6 - ldrb r0, [r0] - cmp r0, 0 - bne _0804584C - adds r0, r3, 0 - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08045880 -_0804584C: - adds r0, r2, 0 - adds r0, 0x23 - ldrb r0, [r0] - cmp r0, 0 - bne _08045818 - adds r0, r2, 0 - adds r0, 0x25 - ldrb r0, [r0] - cmp r0, 0 - bne _08045818 - cmp r5, 0 - beq _08045880 - adds r1, r4, 0x4 - adds r0, r2, 0 - bl IsPositionActuallyInSight - lsls r0, 24 - lsrs r0, 24 - b _08045882 - .align 2, 0 -_08045874: .4byte gDungeon -_08045878: .4byte 0x000181e8 -_0804587C: .4byte 0x0001820f -_08045880: - movs r0, 0 -_08045882: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8045804 - thumb_func_start sub_8045888 sub_8045888: push {r4,r5,lr} diff --git a/include/code_80450F8.h b/include/code_80450F8.h new file mode 100644 index 000000000..abf7c7d92 --- /dev/null +++ b/include/code_80450F8.h @@ -0,0 +1,10 @@ +#ifndef GUARD_CODE_80227B8_H +#define GUARD_CODE_80227B8_H + +#include "structs/dungeon_entity.h" + +Entity *sub_8045684(u8 a, Position *pos, u8 c); +Entity *sub_8045708(Position *pos); +void sub_80457DC(Entity* ent); + +#endif // GUARD_CODE_80227B8_H \ No newline at end of file diff --git a/include/structs/axdata.h b/include/structs/axdata.h index 8719322ad..cbc027b1f 100644 --- a/include/structs/axdata.h +++ b/include/structs/axdata.h @@ -84,7 +84,12 @@ struct axObject u8 unk45_orientation; u8 unk46; u8 unk47; - /* 0x48 */ struct EntityInfo* info; + /* 0x48 */ union + { + struct Item* item; + struct EntityInfo* monster; + struct EntTrapInfo* trap; + } info; }; // size: 0x80? (assuming it's the last sub-struct of GroundLives) diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index 712807bb5..579c6e3f9 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -1,15 +1,15 @@ #ifndef GUARD_DUNGEON_ENTITY_H #define GUARD_DUNGEON_ENTITY_H -#include "constants/global.h" #include "constants/dungeon_action.h" -#include "structs/str_position.h" -#include "sprite.h" +#include "constants/global.h" +#include "constants/status.h" +#include "structs/axdata.h" #include "structs/str_items.h" #include "structs/str_moves.h" -#include "structs/axdata.h" - +#include "structs/str_position.h" #include "number_util.h" +#include "sprite.h" #define MAX_STAT_STAGE 20 #define STAT_MULTIPLIER_THRESHOLD 63 @@ -352,6 +352,13 @@ typedef struct EntityInfo u8 unk204; } EntityInfo; +// size: 0x4 +typedef struct EntTrapInfo +{ + /* 0x0 */ u8 unk0; + /* 0x0 */ u8 unk1; +} EntTrapInfo; + // size: 0x74 | Used for Pokémon, items, and traps. typedef struct Entity { @@ -472,7 +479,7 @@ static inline void SetExpMultplier(EntityInfo *info) static inline EntityInfo *GetEntInfo(Entity *ent) { - return ent->axObj.info; + return ent->axObj.info.monster; } #endif diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 08200e67d..66642c31b 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -354,9 +354,9 @@ typedef struct Dungeon /* 0x37FE */ bool8 unk37FF; // dungeon_serializer.c refers to this as a u16 but elsewhere it's handled as a s16 /* 0x3800 */ s16 deoxysForm; - EntityInfo *unk3804[DUNGEON_MAX_ITEMS]; // TODO: ItemInfo[DUNGEON_MAX_ITEMS] + Item unk3804[DUNGEON_MAX_ITEMS]; /* 0x3904 */ s16 unk3904; - EntityInfo *unk3908[DUNGEON_MAX_TRAPS]; // TODO: TrapInfo[DUNGEON_MAX_TRAPS] + EntTrapInfo unk3908[DUNGEON_MAX_TRAPS]; /* 0x3A08 */ bool8 unk3A08; /* 0x3A09 */ bool8 unk3A09; /* 0x3A0A */ bool8 unk3A0A; diff --git a/include/tile_types.h b/include/tile_types.h index ef99fbdab..78ce34014 100644 --- a/include/tile_types.h +++ b/include/tile_types.h @@ -7,10 +7,10 @@ #define DUNGEON_WATER_TYPE_LAVA 1 #define DUNGEON_WATER_TYPE_WATER 2 -extern const u8 gDungeonWaterType[]; +extern const u8 gDungeonWaterType[76]; void sub_804AE84(Position *pos); bool8 IsTileGround(Tile *tile); bool8 IsWaterTileset(); -#endif +#endif // GUARD_TILE_TYPES_H \ No newline at end of file diff --git a/ld_script.txt b/ld_script.txt index ab9d054e3..7c02dd494 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -216,6 +216,7 @@ SECTIONS { src/dungeon_action.o(.text); src/code_8044CC8.o(.text); src/dungeon_util.o(.text); + src/code_80450F8.o(.text); asm/code_80450F8.o(.text); src/dungeon_visibility.o(.text); src/code_8045A00.o(.text); diff --git a/src/code_80450F8.c b/src/code_80450F8.c new file mode 100644 index 000000000..243bb1e9f --- /dev/null +++ b/src/code_80450F8.c @@ -0,0 +1,491 @@ +#include "global.h" +#include "structs/str_dungeon.h" +#include "code_80450F8.h" +#include "dungeon_map_access.h" +#include "dungeon_range.h" +#include "dungeon_util.h" +#include "tile_types.h" + +// Related to sub_80828E0 +// 93.08% https://decomp.me/scratch/AYGBN +NAKED +Entity *sub_80453AC(s16 id) +{ + asm_unified( +" push {r4-r7,lr}\n" +" mov r7, r10\n" +" mov r6, r9\n" +" mov r5, r8\n" +" push {r5-r7}\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" mov r8, r0\n" +" movs r0, 0x1\n" +" negs r0, r0\n" +" mov r9, r0\n" +" mov r0, r8\n" +" bl GetBodySize\n" +" lsls r0, 24\n" +" lsrs r6, r0, 24\n" +" movs r5, 0\n" +" movs r0, 0x6\n" +" subs r3, r0, r6\n" +" ldr r4, _080453D8\n" +" b _080453DE\n" +" .align 2, 0\n" +"_080453D8: .4byte gUnknown_202EE70\n" +"_080453DC:\n" +" adds r5, 0x1\n" +"_080453DE:\n" +" cmp r5, r3\n" +" bgt _08045400\n" +" movs r2, 0\n" +" cmp r2, r6\n" +" bge _080453FA\n" +" adds r1, r5, r4\n" +" b _080453F4\n" +"_080453EC:\n" +" adds r1, 0x1\n" +" adds r2, 0x1\n" +" cmp r2, r6\n" +" bge _080453FA\n" +"_080453F4:\n" +" ldrb r0, [r1]\n" +" cmp r0, 0\n" +" beq _080453EC\n" +"_080453FA:\n" +" cmp r2, r6\n" +" bne _080453DC\n" +" mov r9, r5\n" +"_08045400:\n" +" movs r0, 0x1\n" +" negs r0, r0\n" +" cmp r9, r0\n" +" beq _080454FC\n" +" movs r5, 0\n" +" ldr r7, _080454DC\n" +"_0804540C:\n" +" ldr r1, _080454E0\n" +" ldr r0, [r1]\n" +" lsls r1, r5, 2\n" +" ldr r2, _080454E4\n" +" adds r0, r2\n" +" adds r0, r1\n" +" ldr r4, [r0]\n" +" adds r0, r4, 0\n" +" bl EntityExists\n" +" lsls r0, 24\n" +" lsrs r0, 24\n" +" mov r10, r0\n" +" cmp r0, 0\n" +" bne _080454F0\n" +" movs r0, 0x1\n" +" str r0, [r4]\n" +" adds r0, r4, 0\n" +" adds r0, 0x24\n" +" strb r5, [r0]\n" +" ldr r1, _080454E0\n" +" ldr r0, [r1]\n" +" adds r0, r7\n" +" str r0, [r4, 0x70]\n" +" mov r2, r8\n" +" strh r2, [r0, 0x2]\n" +" movs r0, 0\n" +" mov r1, r8\n" +" bl GetMonsterApparentID\n" +" ldr r1, [r4, 0x70]\n" +" strh r0, [r1, 0x4]\n" +" ldr r0, [r4, 0x70]\n" +" movs r5, 0\n" +" strb r5, [r0, 0x6]\n" +" movs r0, 0\n" +" mov r1, r8\n" +" bl GetMonsterApparentID\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" bl GetSpriteData\n" +" str r0, [r4, 0x64]\n" +" mov r1, r9\n" +" lsls r0, r1, 4\n" +" adds r0, 0x40\n" +" adds r1, r4, 0\n" +" adds r1, 0x68\n" +" strh r0, [r1]\n" +" adds r1, 0x2\n" +" movs r0, 0x7\n" +" strb r0, [r1]\n" +" adds r0, r4, 0\n" +" adds r0, 0x6C\n" +" movs r2, 0\n" +" strb r2, [r0]\n" +" adds r1, 0x1\n" +" movs r0, 0xFF\n" +" strb r0, [r1]\n" +" adds r0, r4, 0\n" +" adds r0, 0x6D\n" +" movs r5, 0x1\n" +" strb r5, [r0]\n" +" adds r0, 0x2\n" +" strb r5, [r0]\n" +" mov r0, r10\n" +" str r0, [r4, 0x1C]\n" +" bl sub_8045ACC\n" +" ldr r0, [r4, 0x70]\n" +" ldr r1, _080454E8\n" +" adds r0, r1\n" +" mov r2, r9\n" +" strb r2, [r0]\n" +" ldr r0, [r4, 0x70]\n" +" movs r5, 0xB4\n" +" lsls r5, 1\n" +" adds r0, r5\n" +" strb r6, [r0]\n" +" cmp r6, 0\n" +" beq _080454C6\n" +" ldr r3, _080454EC\n" +" movs r2, 0x1\n" +" adds r1, r6, 0\n" +"_080454B6:\n" +" mov r5, r9\n" +" adds r0, r5, r3\n" +" strb r2, [r0]\n" +" movs r0, 0x1\n" +" add r9, r0\n" +" subs r1, 0x1\n" +" cmp r1, 0\n" +" bne _080454B6\n" +"_080454C6:\n" +" ldr r1, _080454E0\n" +" ldr r0, [r1]\n" +" movs r2, 0xCD\n" +" lsls r2, 3\n" +" adds r0, r2\n" +" ldrh r2, [r0]\n" +" adds r1, r2, 0x1\n" +" strh r1, [r0]\n" +" strh r2, [r4, 0x26]\n" +" adds r0, r4, 0\n" +" b _080454FE\n" +" .align 2, 0\n" +"_080454DC: .4byte 0x0000069c\n" +"_080454E0: .4byte gDungeon\n" +"_080454E4: .4byte 0x0001357c\n" +"_080454E8: .4byte 0x00000167\n" +"_080454EC: .4byte gUnknown_202EE70\n" +"_080454F0:\n" +" movs r0, 0x82\n" +" lsls r0, 2\n" +" adds r7, r0\n" +" adds r5, 0x1\n" +" cmp r5, 0x3\n" +" ble _0804540C\n" +"_080454FC:\n" +" movs r0, 0\n" +"_080454FE:\n" +" pop {r3-r5}\n" +" mov r8, r3\n" +" mov r9, r4\n" +" mov r10, r5\n" +" pop {r4-r7}\n" +" pop {r1}\n" +" bx r1" +); +} + +// Related to sub_8082A08 +// 91.51% https://decomp.me/scratch/Fp0Kw +NAKED +Entity *sub_804550C(s16 a) +{ + 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, 0x8\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" mov r8, r0\n" +" movs r0, 0x1\n" +" negs r0, r0\n" +" mov r9, r0\n" +" mov r0, r8\n" +" bl GetBodySize\n" +" lsls r0, 24\n" +" lsrs r7, r0, 24\n" +" movs r5, 0\n" +" movs r0, 0x10\n" +" subs r3, r0, r7\n" +" ldr r4, _08045538\n" +" b _0804553E\n" +" .align 2, 0\n" +"_08045538: .4byte gUnknown_202EE76\n" +"_0804553C:\n" +" adds r5, 0x1\n" +"_0804553E:\n" +" cmp r5, r3\n" +" bgt _08045560\n" +" movs r2, 0\n" +" cmp r2, r7\n" +" bge _0804555A\n" +" adds r1, r5, r4\n" +" b _08045554\n" +"_0804554C:\n" +" adds r1, 0x1\n" +" adds r2, 0x1\n" +" cmp r2, r7\n" +" bge _0804555A\n" +"_08045554:\n" +" ldrb r0, [r1]\n" +" cmp r0, 0\n" +" beq _0804554C\n" +"_0804555A:\n" +" cmp r2, r7\n" +" bne _0804553C\n" +" mov r9, r5\n" +"_08045560:\n" +" movs r0, 0x1\n" +" negs r0, r0\n" +" cmp r9, r0\n" +" bne _0804556A\n" +" b _08045670\n" +"_0804556A:\n" +" movs r5, 0\n" +" movs r1, 0x1\n" +" mov r10, r1\n" +" ldr r2, _08045650\n" +" mov r3, r9\n" +" lsls r0, r3, 4\n" +" adds r0, 0xA0\n" +" str r0, [sp]\n" +"_0804557A:\n" +" ldr r1, _08045654\n" +" ldr r0, [r1]\n" +" lsls r1, r5, 2\n" +" ldr r3, _08045658\n" +" adds r0, r3\n" +" adds r0, r1\n" +" ldr r4, [r0]\n" +" adds r0, r4, 0\n" +" str r2, [sp, 0x4]\n" +" bl EntityExists\n" +" lsls r0, 24\n" +" lsrs r6, r0, 24\n" +" ldr r2, [sp, 0x4]\n" +" cmp r6, 0\n" +" bne _08045664\n" +" mov r0, r10\n" +" str r0, [r4]\n" +" adds r0, r4, 0\n" +" adds r0, 0x24\n" +" strb r5, [r0]\n" +" subs r0, 0x2\n" +" strb r6, [r0]\n" +" ldr r1, _08045654\n" +" ldr r0, [r1]\n" +" adds r0, r2\n" +" str r0, [r4, 0x70]\n" +" mov r2, r8\n" +" strh r2, [r0, 0x2]\n" +" movs r0, 0\n" +" mov r1, r8\n" +" bl GetMonsterApparentID\n" +" ldr r1, [r4, 0x70]\n" +" strh r0, [r1, 0x4]\n" +" ldr r0, [r4, 0x70]\n" +" mov r3, r10\n" +" strb r3, [r0, 0x6]\n" +" movs r0, 0\n" +" mov r1, r8\n" +" bl GetMonsterApparentID\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" bl GetSpriteData\n" +" str r0, [r4, 0x64]\n" +" adds r0, r4, 0\n" +" adds r0, 0x68\n" +" mov r5, sp\n" +" ldrh r5, [r5]\n" +" strh r5, [r0]\n" +" adds r1, r4, 0\n" +" adds r1, 0x6A\n" +" movs r0, 0x7\n" +" strb r0, [r1]\n" +" adds r0, r4, 0\n" +" adds r0, 0x6C\n" +" movs r1, 0\n" +" strb r1, [r0]\n" +" adds r1, r4, 0\n" +" adds r1, 0x6B\n" +" movs r0, 0xFF\n" +" strb r0, [r1]\n" +" adds r0, r4, 0\n" +" adds r0, 0x6D\n" +" mov r2, r10\n" +" strb r2, [r0]\n" +" adds r0, 0x2\n" +" strb r2, [r0]\n" +" str r6, [r4, 0x1C]\n" +" ldr r0, [r4, 0x70]\n" +" ldr r3, _0804565C\n" +" adds r0, r3\n" +" mov r5, r9\n" +" strb r5, [r0]\n" +" ldr r0, [r4, 0x70]\n" +" movs r1, 0xB4\n" +" lsls r1, 1\n" +" adds r0, r1\n" +" strb r7, [r0]\n" +" cmp r7, 0\n" +" beq _08045636\n" +" ldr r3, _08045660\n" +" movs r2, 0x1\n" +" adds r1, r7, 0\n" +"_08045626:\n" +" mov r5, r9\n" +" adds r0, r5, r3\n" +" strb r2, [r0]\n" +" movs r0, 0x1\n" +" add r9, r0\n" +" subs r1, 0x1\n" +" cmp r1, 0\n" +" bne _08045626\n" +"_08045636:\n" +" bl sub_8045ACC\n" +" ldr r1, _08045654\n" +" ldr r0, [r1]\n" +" movs r2, 0xCD\n" +" lsls r2, 3\n" +" adds r0, r2\n" +" ldrh r2, [r0]\n" +" adds r1, r2, 0x1\n" +" strh r1, [r0]\n" +" strh r2, [r4, 0x26]\n" +" adds r0, r4, 0\n" +" b _08045672\n" +" .align 2, 0\n" +"_08045650: .4byte 0x00000ebc\n" +"_08045654: .4byte gDungeon\n" +"_08045658: .4byte 0x0001358c\n" +"_0804565C: .4byte 0x00000167\n" +"_08045660: .4byte gUnknown_202EE76\n" +"_08045664:\n" +" movs r3, 0x82\n" +" lsls r3, 2\n" +" adds r2, r3\n" +" adds r5, 0x1\n" +" cmp r5, 0xF\n" +" ble _0804557A\n" +"_08045670:\n" +" movs r0, 0\n" +"_08045672:\n" +" add sp, 0x8\n" +" pop {r3-r5}\n" +" mov r8, r3\n" +" mov r9, r4\n" +" mov r10, r5\n" +" pop {r4-r7}\n" +" pop {r1}\n" +" bx r1" +); +} + +Entity *sub_8045684(u8 a, Position *pos, u8 c) +{ + Entity *entity; + s32 i; + + for (i = 0; i < DUNGEON_MAX_TRAPS; i++) { + entity = gDungeon->traps[i]; + if (!EntityExists(entity)) { + entity->type = ENTITY_TRAP; + entity->axObj.info.trap = &gDungeon->unk3908[i]; + entity->axObj.info.trap->unk0 = a; + entity->axObj.info.trap->unk1 = c; + + entity->unk1C = 0; + entity->unk22 = 0; + entity->pos = *pos; + entity->spawnGenID = 0; + return entity; + } + } + + return NULL; +} + +Entity *sub_8045708(Position *pos) +{ + s32 i; + Entity *ent; + + if (gDungeonWaterType[gDungeon->tileset] == DUNGEON_WATER_TYPE_LAVA + && (GetTileSafe(pos->x, pos->y)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)) == TERRAIN_TYPE_SECONDARY) { + return NULL; + } + + for (i = 0; i < DUNGEON_MAX_ITEMS; i++) { + ent = gDungeon->items[i]; + if (!EntityExists(ent)) { + ent->type = ENTITY_ITEM; + ent->axObj.info.item = &gDungeon->unk3804[i]; + + ent->pos = *pos; + SetEntityPixelPos(ent, ((pos->x * 24) + 4) * 0x100, ((pos->y * 24) + 4) * 0x100); + ent->spawnGenID = 0; + ent->unk22 = 0; + ent->unk1C = 0; + return ent; + } + } + + return NULL; +} + +void sub_80457DC(Entity* ent) +{ + ent->type = ENTITY_UNK_5; + ent->pos.x = 0; + ent->pos.y = 0; + SetEntityPixelPos(ent, 0, 0); + ent->spawnGenID = 0; + ent->unk22 = 0; +} + +bool8 sub_8045804(Entity *ent) +{ + UnkDungeonGlobal_unk181E8_sub* saveTyping; + Entity* camTarget; + EntityInfo *entInfo; + + switch (GetEntityType(ent)) { + case ENTITY_MONSTER: { + if (ent->isVisible) { + saveTyping = &gDungeon->unk181e8; + camTarget = saveTyping->cameraTarget; + entInfo = GetEntInfo(ent); + + if (!entInfo->isNotTeamMember) + return TRUE; + + if (!saveTyping->unk1820F && entInfo->transformStatus.transformStatus == STATUS_INVISIBLE) + return FALSE; + + if (saveTyping->unk1820B || saveTyping->unk1820D) + return TRUE; + + if (camTarget != NULL) + return IsPositionActuallyInSight(&saveTyping->cameraPos, &ent->pos); + } + return FALSE; + } + default: { + return TRUE; + } + case ENTITY_NOTHING: + case ENTITY_UNK_5: { + return FALSE; + } + } +} \ No newline at end of file diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index bc9c07e90..a20dc29d6 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -2297,7 +2297,7 @@ typedef struct UnkTextStruct3 { } UnkTextStruct3; extern void sub_803ECB4(UnkTextStruct3 *a0, u8 a1); -void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, UnkTextStruct3 *a4, UnkTextStruct2_sub2 *a5); +static void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, UnkTextStruct3 *a4, UnkTextStruct2_sub2 *a5); // Inline needed to (fake?)match. static inline void sub_805FC30_SetUpTxtStruct(UnkTextStruct3 *src) @@ -2660,7 +2660,7 @@ bool8 sub_805FD74(Entity * a0, struct UnkMenuBitsStruct *a1) extern const struct UnkTextStruct2 gUnknown_8106B6C; extern const struct unkStruct_8090F58 gUnknown_8106B60; -void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, UnkTextStruct3 *a4, UnkTextStruct2_sub2 *a5) +static void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, UnkTextStruct3 *a4, UnkTextStruct2_sub2 *a5) { s32 i, x, y; s32 r10; @@ -2785,8 +2785,9 @@ void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, UnkTextStruct3 default: { Entity *chosenTeamMember = gDungeon->teamPokemon[sUnknown_202F248[a0] - MAX_TEAM_MEMBERS]; if (EntityExists(chosenTeamMember)) { - Item *item = &GetEntInfo(chosenTeamMember)->heldItem; - SetMessageArgument_2(gFormatBuffer_Monsters[0], chosenTeamMember->axObj.info, 0); + EntityInfo *monInfo = GetEntInfo(chosenTeamMember); + Item *item = &monInfo->heldItem; + SetMessageArgument_2(gFormatBuffer_Monsters[0], monInfo, 0); PrintFormattedStringOnWindow(x, 0, gUnknown_80FE940, 0, 0); if (item->flags & ITEM_FLAG_EXISTS) { gUnknown_202EE10.unk1A++; diff --git a/src/code_806E8B0.c b/src/code_806E8B0.c index 0d8e7b0a3..8da4a347b 100644 --- a/src/code_806E8B0.c +++ b/src/code_806E8B0.c @@ -17,6 +17,7 @@ #include "status.h" #include "type_chart.h" #include "dungeon_random.h" +#include "code_80450F8.h" #include "code_8045A00.h" #include "dungeon_items.h" #include "structs/str_damage.h" @@ -30,7 +31,6 @@ extern bool8 sub_806E100(struct unkStruct_80943A8 *param_1, Entity *pokemon, Ent extern void sub_8041B74(Entity *pokemon); extern void sub_8041B5C(Entity *pokemon); extern void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *dmgStruct, bool32 isFalseSwipe, bool32 giveExp, s16 arg4, bool32 arg8, s32 argC); -extern void sub_80457DC(Entity *); extern const s32 gUnknown_80F54B4[NUM_EFFECTIVENESS][NUM_EFFECTIVENESS]; extern const s32 gUnknown_80F504C[]; diff --git a/src/code_80718D8.c b/src/code_80718D8.c index c84022775..fda3037bd 100644 --- a/src/code_80718D8.c +++ b/src/code_80718D8.c @@ -5,6 +5,7 @@ #include "dungeon_leader.h" #include "dungeon_message.h" #include "code_8041AD0.h" +#include "code_80450F8.h" #include "code_8045A00.h" #include "code_8077274_1.h" #include "constants/dungeon.h" diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index 384165657..9016fd767 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -1,6 +1,7 @@ #include "global.h" #include "globaldata.h" #include "code_800F958.h" +#include "code_80450F8.h" #include "code_8045A00.h" #include "code_805D8C8.h" #include "code_806CD90.h" @@ -133,7 +134,6 @@ static Entity* sub_8082A08(s16 id, s16 apparentID, s32 index); // These externs are from other files extern u8 GetBodySize(s16 index); -extern Entity *sub_8045684(u8, Position *, u8); extern void sub_80460F8(Position *, Item *, u32); void SaveDungeonState(u8 *buffer, u32 bufLen) @@ -1145,10 +1145,10 @@ static Entity* sub_80828E0(s16 id, s16 apparentID, s32 index) entity = gDungeon->teamPokemon[index]; entity->type = ENTITY_MONSTER; entity->unk24 = index; - entity->axObj.info = &gDungeon->unk69C[index]; - entity->axObj.info->id = id_; - entity->axObj.info->apparentID = appID; - entity->axObj.info->isNotTeamMember = FALSE; + entity->axObj.info.monster = &gDungeon->unk69C[index]; + entity->axObj.info.monster->id = id_; + entity->axObj.info.monster->apparentID = appID; + entity->axObj.info.monster->isNotTeamMember = FALSE; entity->axObj.spriteFile = GetSpriteData(appID); entity->axObj.unk40_maybeAnimTimer = (r4 * 0x10) + 0x40; @@ -1160,8 +1160,8 @@ static Entity* sub_80828E0(s16 id, s16 apparentID, s32 index) entity->unk1C = 0; sub_8045ACC(); - entity->axObj.info->unk167 = r4; - entity->axObj.info->unk168 = apparentBodySize; + entity->axObj.info.monster->unk167 = r4; + entity->axObj.info.monster->unk168 = apparentBodySize; for (r1 = 0; r1 < apparentBodySize; r1++) { gUnknown_202EE70[r4] = 1; @@ -1213,10 +1213,10 @@ static Entity* sub_8082A08(s16 id, s16 apparentID, s32 index) entity->type = ENTITY_MONSTER; entity->unk24 = index; entity->unk22 = 0; - entity->axObj.info = &gDungeon->unkEBC[index]; - entity->axObj.info->id = id_; - entity->axObj.info->apparentID = appID; - entity->axObj.info->isNotTeamMember = TRUE; + entity->axObj.info.monster = &gDungeon->unkEBC[index]; + entity->axObj.info.monster->id = id_; + entity->axObj.info.monster->apparentID = appID; + entity->axObj.info.monster->isNotTeamMember = TRUE; entity->axObj.spriteFile = GetSpriteData(appID); entity->axObj.unk40_maybeAnimTimer = (r8 * 0x10) + 0xA0; @@ -1227,8 +1227,8 @@ static Entity* sub_8082A08(s16 id, s16 apparentID, s32 index) entity->axObj.unk47 = 1; entity->unk1C = 0; - entity->axObj.info->unk167 = r8; - entity->axObj.info->unk168 = apparentBodySize; + entity->axObj.info.monster->unk167 = r8; + entity->axObj.info.monster->unk168 = apparentBodySize; for (r1 = 0; r1 < apparentBodySize; r1++) { gUnknown_202EE76[r8] = 1; diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index 423c50056..677a040b2 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -3,6 +3,7 @@ #include "code_803E46C.h" #include "code_803E668.h" +#include "code_80450F8.h" #include "code_806CD90.h" #include "constants/direction.h" #include "constants/dungeon.h" @@ -21,7 +22,6 @@ extern void sub_803F4A0(u32); extern void sub_803F878(s32, s32); extern void sub_8068FE0(Entity *, u32, Entity*); -extern void sub_80457DC(Entity *); extern void sub_80694C0(Entity *, s32, s32, u32); diff --git a/src/move_actions.c b/src/move_actions.c index f245bb2a0..479362d3e 100644 --- a/src/move_actions.c +++ b/src/move_actions.c @@ -186,7 +186,7 @@ extern void sub_806F370(Entity *r0, Entity *r1, u32, u32, u8 *, u8, s32, u32, u3 extern void sub_804652C(Entity *, Entity *, Item *, u32, Position *); extern void CalcDamage(Entity *, Entity *, u8, u32, u32, s32 *, u32, u16, u32); extern void sub_8045C28(Item *, u8 , u8); -extern void sub_805A7D4(Entity *, Entity *, Item *, Position *); +static void sub_805A7D4(Entity *, Entity *, Item *, Position *); extern void MudWaterSportEffect(u32); extern void CalcDamage(Entity *, Entity *, u8, u32, u32, s32 *, u32, u16, u32); extern void sub_806A6E8(Entity *); @@ -2632,7 +2632,7 @@ bool8 KnockOffMoveAction(Entity *pokemon, Entity *target, Move *move, u32 param_ } } -void sub_805A7D4(Entity * pokemon, Entity * target, Item *item, Position *pos) +static void sub_805A7D4(Entity * pokemon, Entity * target, Item *item, Position *pos) { Entity stackEntity; @@ -2640,7 +2640,7 @@ void sub_805A7D4(Entity * pokemon, Entity * target, Item *item, Position *pos) stackEntity.unk24 = 0; stackEntity.isVisible = TRUE; stackEntity.unk22 = 0; - stackEntity.axObj.info = (EntityInfo*) item; + stackEntity.axObj.info.item = item; stackEntity.pos.x = target->pos.x + pos->x; stackEntity.pos.y = target->pos.y + pos->y; SetEntityPixelPos(&stackEntity,(target->pos.x * 0x18 + 4) * 0x100, diff --git a/src/tile_types.c b/src/tile_types.c index 078eee7b8..fc0f64d2c 100644 --- a/src/tile_types.c +++ b/src/tile_types.c @@ -5,7 +5,7 @@ #include "dungeon_map_access.h" #include "dungeon_util.h" -const u8 gDungeonWaterType[] = { +const u8 gDungeonWaterType[76] = { DUNGEON_WATER_TYPE_NONE, DUNGEON_WATER_TYPE_NONE, DUNGEON_WATER_TYPE_NONE, diff --git a/src/trap.c b/src/trap.c index fcd798538..abc60d817 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2,6 +2,7 @@ #include "trap.h" #include "code_803E668.h" +#include "code_80450F8.h" #include "code_8041AD0.h" #include "code_8045A00.h" #include "dungeon_message.h" @@ -85,7 +86,6 @@ void sub_8071DA4(Entity *); extern u8 sub_803F428(Position *pos); void sub_806A1E8(Entity *pokemon); u8 sub_803D6FC(void); -Entity *sub_8045684(u8, Position *, u8); extern void sub_807DF38(Entity *pokemon, Entity *target, Position *pos, u32, u8 moveType, s16); void sub_807FC3C(Position *pos, u32 trapID, u32 param_3)