diff --git a/asm/code_80718D8.s b/asm/code_80718D8.s index e7d017aa4..eedc91160 100644 --- a/asm/code_80718D8.s +++ b/asm/code_80718D8.s @@ -5,254 +5,6 @@ .text - thumb_func_start sub_8071B48 -sub_8071B48: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x14 - movs r0, 0 - mov r8, r0 - ldr r0, _08071B94 - ldr r6, [r0] - ldr r1, _08071B98 - adds r0, r6, r1 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - bne _08071B66 - b _08071D3E -_08071B66: - subs r1, 0x20 - adds r0, r6, r1 - ldrb r0, [r0] - cmp r0, 0x15 - bne _08071B7C - ldr r2, _08071B9C - adds r0, r6, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _08071B7C - b _08071D3E -_08071B7C: - ldr r0, _08071BA0 - adds r1, r6, r0 - ldrh r0, [r1] - adds r2, r0, 0x1 - strh r2, [r1] - ldr r1, _08071BA4 - adds r0, r6, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _08071BAC - ldr r0, _08071BA8 - b _08071BAE - .align 2, 0 -_08071B94: .4byte gDungeon -_08071B98: .4byte 0x00000664 -_08071B9C: .4byte 0x000037fd -_08071BA0: .4byte 0x00000662 -_08071BA4: .4byte 0x0000066e -_08071BA8: .4byte gUnknown_80F4DAA -_08071BAC: - ldr r0, _08071C60 -_08071BAE: - lsls r1, r2, 16 - asrs r1, 16 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r1, r0 - bge _08071BBC - b _08071D3E -_08071BBC: - ldr r1, _08071C64 - adds r0, r6, r1 - movs r2, 0 - ldrsh r1, [r0, r2] - movs r0, 0xE1 - lsls r0, 2 - cmp r1, r0 - ble _08071BF6 - ldr r1, _08071C68 - adds r0, r6, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08071BF6 - ldrh r0, [r4, 0x26] - ldr r2, _08071C6C - adds r1, r6, r2 - ldr r1, [r1] - cmp r0, r1 - bne _08071BF6 - ldr r0, _08071C70 - adds r1, r4, 0 - movs r2, 0 - bl SetMessageArgument - mov r8, r4 -_08071BF6: - ldr r1, _08071C64 - adds r0, r6, r1 - movs r1, 0 - strh r1, [r0] - ldr r2, _08071C68 - adds r0, r6, r2 - str r1, [r0] - movs r7, 0 - movs r5, 0 -_08071C08: - lsls r0, r5, 2 - ldr r2, _08071C74 - adds r1, r6, r2 - adds r1, r0 - ldr r4, [r1] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08071C3A - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetTile - ldrh r0, [r0] - movs r2, 0x80 - lsls r2, 1 - adds r1, r2, 0 - ands r0, r1 - cmp r0, 0 - bne _08071C3A - adds r7, 0x1 -_08071C3A: - adds r5, 0x1 - cmp r5, 0xF - ble _08071C08 - ldr r1, _08071C78 - adds r0, r6, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _08071C92 - ldr r0, _08071C7C - ldr r0, [r0] - ldr r2, _08071C80 - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08071C88 - ldr r0, _08071C84 - movs r1, 0 - ldrsh r0, [r0, r1] - b _08071C8E - .align 2, 0 -_08071C60: .4byte gUnknown_80F4DAC -_08071C64: .4byte 0x00000662 -_08071C68: .4byte 0x00017b34 -_08071C6C: .4byte 0x00017b40 -_08071C70: .4byte gAvailablePokemonNames -_08071C74: .4byte 0x0001358c -_08071C78: .4byte 0x0000066e -_08071C7C: .4byte gDungeon -_08071C80: .4byte 0x00003a0c -_08071C84: .4byte gUnknown_80F4DA6 -_08071C88: - ldr r0, _08071CB8 - movs r2, 0 - ldrsh r0, [r0, r2] -_08071C8E: - cmp r7, r0 - bge _08071D3E -_08071C92: - mov r0, r8 - cmp r0, 0 - beq _08071CA8 - ldr r0, _08071CBC - ldr r1, [r0] - movs r0, 0 - bl sub_805239C - mov r0, r8 - bl sub_8042920 -_08071CA8: - ldr r1, _08071CC0 - adds r0, r6, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08071CC4 - movs r5, 0xBE - lsls r5, 1 - b _08071CCE - .align 2, 0 -_08071CB8: .4byte gUnknown_80F4DA8 -_08071CBC: .4byte gUnknown_80FED68 -_08071CC0: .4byte 0x0000066e -_08071CC4: - movs r0, 0 - bl sub_803D970 - lsls r0, 16 - asrs r5, r0, 16 -_08071CCE: - adds r0, r5, 0 - bl sub_803DA20 - adds r4, r0, 0 - cmp r4, 0 - bne _08071CDC - movs r4, 0x1 -_08071CDC: - adds r0, r5, 0 - movs r1, 0 - bl sub_806AA0C - lsls r0, 24 - cmp r0, 0 - beq _08071D3E - add r0, sp, 0xC - bl sub_8083660 - lsls r0, 24 - cmp r0, 0 - beq _08071D3E - mov r0, sp - movs r1, 0 - strh r5, [r0] - strh r4, [r0, 0x8] - strb r1, [r0, 0x2] - movs r0, 0x64 - bl DungeonRandInt - adds r4, r0, 0 - ldr r0, _08071D24 - ldr r0, [r0] - ldr r2, _08071D28 - adds r0, r2 - ldrb r0, [r0] - bl GetRandomMovementChance - lsls r0, 16 - asrs r0, 16 - cmp r4, r0 - bge _08071D2C - movs r0, 0x1 - b _08071D2E - .align 2, 0 -_08071D24: .4byte gDungeon -_08071D28: .4byte 0x00000644 -_08071D2C: - movs r0, 0 -_08071D2E: - str r0, [sp, 0x4] - mov r1, sp - movs r0, 0 - strb r0, [r1, 0x10] - mov r0, sp - movs r1, 0 - bl sub_806B7F8 -_08071D3E: - add sp, 0x14 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8071B48 - thumb_func_start sub_8071D4C sub_8071D4C: push {lr} @@ -2224,4 +1976,4 @@ _08072C80: .4byte 0x0000013d _08072C84: .4byte gAdjacentTileOffsets thumb_func_end sub_8072B78 - .align 2, 0 \ No newline at end of file + .align 2, 0 diff --git a/include/dungeon.h b/include/dungeon.h index 58b6bef5d..6b9177acc 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -41,6 +41,7 @@ const u8 *GetDungeonName1(u8 dungeon); u32 GetMaxItemsAllowed(u8 dungeon); s8 GetRescuesAllowed(u8 dungeon); bool8 HasCheckpoint(u8 dungeon); +s16 GetRandomMovementChance(u8 dungeon); void PrintYellowDungeonNametoBuffer(u8 *buffer, DungeonLocation *dungeonLocation); void PrintDungeonLocationtoBuffer(u8 *buffer, DungeonLocation *dungeonLocation); @@ -48,4 +49,4 @@ u32 sub_80908D8(DungeonLocation *dungeon); u8 sub_8090910(DungeonLocation *dungeon, u32 param_2); bool8 sub_809095C(u8 dungeon); -#endif // GUARD_DUNGEON_H \ No newline at end of file +#endif // GUARD_DUNGEON_H diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index bb65b6992..1f7133773 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -99,7 +99,8 @@ typedef struct Dungeon u8 unk65C; u8 fill65D[0x660 - 0x65D]; /* 0x660 */ s16 fractionalTurn; // Handles turn order when Pokémon have different movement speeds. - u8 fill662[0x666 - 0x662]; + s16 unk662; + s16 unk664; /* 0x666 */ s16 windTurns; // Turns remaining before getting swept out of the dungeon. /* 0x668 */ u16 unk668; u16 bossSongIndex; @@ -139,7 +140,8 @@ typedef struct Dungeon /* 0x3904 */ s16 unk3904; u8 fill3906[0x3A08 - 0x3906]; /* 0x3A08 */ u8 unk3A08; - u8 fill3A09[0x3A0D - 0x3A09]; + u8 fill3A09[0x3A0C - 0x3A09]; + u8 unk3A0C; /* 0x3A0D */ u8 unk3A0D; /* 0x3A0E */ s16 tileset; /* 0x3A10 */ u16 unk3A10; @@ -198,10 +200,10 @@ typedef struct Dungeon /* 0x15E2C */ Entity unk15E2C[0x40]; /* 0x17B2C */ Entity *lightningRodPokemon; /* 0x17B30 */ Entity *snatchPokemon; - /* 0x17B34 */ u8 fillunk1734[0x17B38 - 0x17B34]; + /* 0x17B34 */ Entity *unk17B34; /* 0x17B38 */ u32 unk17B38; /* 0x17B3C */ u32 unk17B3C; - u8 fill17B40[0x17B44 - 0x17B40]; + /* 0x17B3C */ u32 unk17B40; /* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX]; /* 0x181E4 */ OpenedFile *paletFile; /* 0x181E8 */ Position cameraPos; @@ -236,4 +238,4 @@ typedef struct Dungeon extern Dungeon *gDungeon; -#endif // GUARD_STR_DUNGEON_H \ No newline at end of file +#endif // GUARD_STR_DUNGEON_H diff --git a/ld_script.txt b/ld_script.txt index 27f3a8e5a..64638cccc 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -242,6 +242,7 @@ SECTIONS { src/dungeon_capabilities.o(.text); src/dungeon_ai_targeting.o(.text); src/dungeon_pokemon_attributes.o(.text); + src/code_80718D8.o(.text); asm/code_80718D8.o(.text); src/dungeon_ai_leader.o(.text); asm/code_8072CF4.o(.text); diff --git a/src/code_80718D8.c b/src/code_80718D8.c new file mode 100644 index 000000000..61904038a --- /dev/null +++ b/src/code_80718D8.c @@ -0,0 +1,131 @@ +#include "global.h" +#include "constants/dungeon.h" +#include "structs/str_dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_util.h" +#include "dungeon_random.h" +#include "dungeon.h" + +struct unkStruct_806B7F8 +{ + s16 species; + u8 unk2; + u32 unk4; + u16 level; + u8 fillA[2]; + struct Position pos; + u8 unk10; +}; + +extern u8 gAvailablePokemonNames[]; +extern s16 gUnknown_80F4DA6; +extern s16 gUnknown_80F4DA8; +extern s16 gUnknown_80F4DAA; +extern s16 gUnknown_80F4DAC; +extern u8 *gUnknown_80FED68[]; + +extern void SetMessageArgument(char[], struct Entity*, u32); +extern void sub_806B7F8(struct unkStruct_806B7F8 *, u32); +extern void sub_805239C(struct Entity *r0, const char r1[]); +extern void sub_8042920(struct Entity *r0); +extern s16 sub_803D970(u32); +extern s32 sub_803DA20(s32 param_1); +extern bool8 sub_806AA0C(s32, u32); +extern bool8 sub_8083660(struct Position *param_1); + +void sub_8071B48(void) +{ + struct Tile *tile; + struct Entity *entity2; + struct Entity *entity; + int index; + int index1; + int counter; + struct Entity *entityPtr; + s32 level; + struct Dungeon *dungeon; // feels like a hack + struct unkStruct_806B7F8 local_2c; + + entityPtr = NULL; + dungeon = gDungeon; + if ((dungeon->unk664 != 0) && + ((dungeon->dungeonLocation.id != DUNGEON_METEOR_CAVE || (dungeon->fill37FD[0] == 0)))) { + dungeon->unk662++; + if (dungeon->unk66E == 0) { + if ( dungeon->unk662 < gUnknown_80F4DAA) { + return; + } + } + else { + if ( dungeon->unk662 < gUnknown_80F4DAC) { + return; + } + } + + if (dungeon->unk662 > 900) { + entity2 = dungeon->unk17B34; + if ((EntityExists(entity2)) && (entity2->spawnGenID == dungeon->unk17B40)) { + SetMessageArgument(gAvailablePokemonNames,entity2,0); + entityPtr = entity2; + } + } + + dungeon->unk662 = 0; + dungeon->unk17B34 = NULL; + + counter = 0; + for(index = 0; index < DUNGEON_MAX_WILD_POKEMON; index++) + { + entity = dungeon->wildPokemon[index]; + if ((EntityExists(entity)) && + (tile = GetTile((entity->pos).x, (entity->pos).y), + (tile->terrainType & 0x100) == 0)) { + counter++; + } + } + if (dungeon->unk66E == 0) { + if (gDungeon->unk3A0C == 0xff) { + if (counter >= gUnknown_80F4DA6) { + return; + } + } + else + { + if (counter >= gUnknown_80F4DA8) { + return; + } + } + + } + if (entityPtr != NULL) { + sub_805239C(0,*gUnknown_80FED68); + sub_8042920(entityPtr); + } + if (dungeon->unk66E != 0) { + index1 = 0x17c; + } + else { + index1 = sub_803D970(0); + } + + level = sub_803DA20(index1); + if (level == 0) { + level = 1; + } + if ((sub_806AA0C(index1, 0)) && (sub_8083660(&local_2c.pos))) { + local_2c.species = index1; + local_2c.level = level; + local_2c.unk2 = 0; + if(DungeonRandInt(100) < GetRandomMovementChance(gDungeon->dungeonLocation.id)) + { + local_2c.unk4 = 1; + } + else + { + local_2c.unk4 = 0; + } + local_2c.unk10 = 0; + sub_806B7F8(&local_2c, 0); + } + } +}