From b20adedb188c4ea9722c878b45075c0afd0e607b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Sep 2024 12:41:52 +0200 Subject: [PATCH] sub_803D73C --- asm/code_803D110.s | 418 +--------------------------------- include/structs/str_dungeon.h | 80 +++++-- ld_script.txt | 1 + src/code_803D0D8.c | 12 +- src/code_803D110.c | 410 +++++++++++++++++++++++++++++++++ src/code_8045A00.c | 44 ++-- src/code_809447C.c | 2 +- src/dungeon_music.c | 8 +- src/weather.c | 2 +- 9 files changed, 503 insertions(+), 474 deletions(-) create mode 100644 src/code_803D110.c diff --git a/asm/code_803D110.s b/asm/code_803D110.s index 6c0b66b90..82bf81c7d 100644 --- a/asm/code_803D110.s +++ b/asm/code_803D110.s @@ -5,424 +5,8 @@ .text - thumb_func_start sub_803D4D0 -sub_803D4D0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1FC - ldr r6, _0803D654 - ldr r1, [r6] - movs r4, 0xC9 - lsls r4, 3 - adds r0, r1, r4 - ldr r2, _0803D658 - adds r1, r2 - bl sub_80901D8 - ldr r0, [r6] - ldr r3, _0803D65C - adds r2, r0, r3 - adds r1, r0, r4 - ldrh r0, [r2] - ldrh r4, [r1] - cmp r0, r4 - bne _0803D500 - b _0803D6E0 -_0803D500: - ldr r0, [r1] - str r0, [r2] - ldr r0, _0803D660 - ldr r1, _0803D664 - bl OpenFileAndGetFileDataPtr - mov r9, r0 - ldr r3, [r0, 0x4] - ldr r2, [r6] - ldr r7, _0803D65C - adds r0, r2, r7 - ldrb r1, [r0] - ldr r0, [r3] - lsls r1, 2 - adds r1, r0 - ldr r3, _0803D668 - adds r0, r2, r3 - ldrb r0, [r0] - lsls r0, 4 - ldr r1, [r1] - adds r1, r0 - mov r8, r1 - ldr r4, _0803D658 - adds r2, r4 - ldrb r0, [r2] - bl GetDungeonFloorCount - ldr r1, [r6] - ldr r7, _0803D66C - adds r1, r7 - strb r0, [r1] - ldr r0, [r6] - adds r0, r4 - ldrb r0, [r0] - bl sub_80902C8 - ldr r1, [r6] - strh r0, [r1, 0x14] - mov r2, r9 - ldr r0, [r2, 0x4] - mov r3, r8 - movs r4, 0 - ldrsh r2, [r3, r4] - ldr r3, [r0, 0x4] - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - ldr r7, _0803D670 - adds r1, r7 - adds r0, r3 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldm r0!, {r2,r3,r7} - stm r1!, {r2,r3,r7} - ldr r0, [r0] - str r0, [r1] - movs r5, 0 - mov r10, r6 - ldr r4, _0803D674 -_0803D576: - mov r6, r10 - ldr r2, [r6] - lsls r3, r5, 1 - adds r2, r4 - adds r2, r3 - mov r7, r9 - ldr r1, [r7, 0x4] - mov r6, r8 - movs r7, 0x4 - ldrsh r0, [r6, r7] - ldr r1, [r1, 0x10] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - adds r3, r0 - ldrh r0, [r3] - strh r0, [r2] - adds r5, 0x1 - cmp r5, 0x13 - ble _0803D576 - movs r5, 0 - adds r6, 0x6 - str r6, [sp, 0x1F8] - ldr r6, _0803D678 - mov r10, r6 -_0803D5A8: - ldr r1, _0803D654 - ldr r0, [r1] - lsls r3, r5, 3 - mov r2, r10 - adds r4, r0, r2 - adds r4, r3 - mov r12, r4 - mov r4, r9 - ldr r2, [r4, 0x4] - mov r7, r8 - movs r4, 0x2 - ldrsh r1, [r7, r4] - ldr r2, [r2, 0xC] - lsls r1, 2 - adds r1, r2 - ldr r1, [r1] - adds r3, r1 - ldr r1, [r3] - ldr r2, [r3, 0x4] - mov r7, r12 - str r1, [r7] - str r2, [r7, 0x4] - adds r0, r6 - bl ExtractSpeciesIndex - lsls r0, 16 - cmp r0, 0 - beq _0803D5E8 - adds r6, 0x8 - adds r5, 0x1 - cmp r5, 0x1E - ble _0803D5A8 -_0803D5E8: - cmp r5, 0x1F - bgt _0803D606 - ldr r6, _0803D654 - lsls r0, r5, 3 - ldr r1, _0803D678 - adds r4, r0, r1 -_0803D5F4: - ldr r0, [r6] - adds r0, r4 - movs r1, 0 - bl sub_808E9C4 - adds r4, 0x8 - adds r5, 0x1 - cmp r5, 0x1F - ble _0803D5F4 -_0803D606: - movs r5, 0 - ldr r2, _0803D67C - mov r10, r2 -_0803D60C: - mov r3, r9 - ldr r1, [r3, 0x4] - lsls r0, r5, 1 - ldr r4, [sp, 0x1F8] - adds r0, r4, r0 - movs r6, 0 - ldrsh r0, [r0, r6] - ldr r1, [r1, 0x8] - lsls r0, 2 - adds r0, r1 - movs r4, 0 - adds r7, r5, 0x1 - mov r8, r7 - lsls r1, r5, 6 - mov r12, r1 - ldr r3, [r0] - mov r2, sp -_0803D62E: - ldrh r0, [r3] - cmp r0, r10 - bls _0803D684 - ldrh r0, [r3] - ldr r6, _0803D680 - adds r1, r0, r6 - cmp r1, 0 - beq _0803D68A - movs r6, 0 - lsls r0, r4, 1 - add r0, sp -_0803D644: - strh r6, [r0] - adds r0, 0x2 - adds r2, 0x2 - adds r4, 0x1 - subs r1, 0x1 - cmp r1, 0 - bne _0803D644 - b _0803D68A - .align 2, 0 -_0803D654: .4byte gDungeon -_0803D658: .4byte 0x00000644 -_0803D65C: .4byte 0x0001c570 -_0803D660: .4byte gUnknown_80F4D8C -_0803D664: .4byte gDungeonFileArchive -_0803D668: .4byte 0x0001c571 -_0803D66C: .4byte 0x0001cec8 -_0803D670: .4byte 0x0001c574 -_0803D674: .4byte 0x0001cd70 -_0803D678: .4byte 0x0001cd98 -_0803D67C: .4byte 0x0000752f -_0803D680: .4byte 0xffff8ad0 -_0803D684: - strh r0, [r2] - adds r2, 0x2 - adds r4, 0x1 -_0803D68A: - adds r3, 0x2 - cmp r4, 0xFB - ble _0803D62E - ldr r7, _0803D6F0 - mov r1, r12 - subs r0, r1, r5 - movs r4, 0xB - mov r3, sp - lsls r2, r0, 3 - ldr r6, _0803D6F4 -_0803D69E: - ldr r0, [r7] - adds r0, r6 - adds r0, r2 - ldrh r1, [r3] - strh r1, [r0] - adds r3, 0x2 - adds r2, 0x2 - subs r4, 0x1 - cmp r4, 0 - bge _0803D69E - ldr r6, _0803D6F0 - mov r2, r12 - subs r0, r2, r5 - lsls r3, r0, 3 - add r2, sp, 0x18 - ldr r5, _0803D6F8 - movs r4, 0xEF -_0803D6C0: - ldr r0, [r6] - adds r0, r5 - adds r0, r3 - ldrh r1, [r2] - strh r1, [r0] - adds r2, 0x2 - adds r3, 0x2 - subs r4, 0x1 - cmp r4, 0 - bge _0803D6C0 - mov r5, r8 - cmp r5, 0x3 - ble _0803D60C - mov r0, r9 - bl CloseFile -_0803D6E0: - add sp, 0x1FC - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803D6F0: .4byte gDungeon -_0803D6F4: .4byte 0x0001c590 -_0803D6F8: .4byte 0x0001c5a8 - thumb_func_end sub_803D4D0 + - thumb_func_start sub_803D6FC -sub_803D6FC: - push {r4,lr} - ldr r0, _0803D720 - bl DungeonRandInt - adds r3, r0, 0 - movs r2, 0 - ldr r0, _0803D724 - ldr r0, [r0] - ldr r4, _0803D728 - adds r1, r0, r4 -_0803D710: - ldrh r0, [r1] - cmp r0, 0 - beq _0803D72C - cmp r0, r3 - blt _0803D72C - lsls r0, r2, 24 - lsrs r0, 24 - b _0803D736 - .align 2, 0 -_0803D720: .4byte 0x00002710 -_0803D724: .4byte gDungeon -_0803D728: .4byte 0x0001cd70 -_0803D72C: - adds r1, 0x2 - adds r2, 0x1 - cmp r2, 0x13 - ble _0803D710 - movs r0, 0x10 -_0803D736: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_803D6FC - - thumb_func_start sub_803D73C -sub_803D73C: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - adds r4, r0, 0 - ldr r0, _0803D784 - bl DungeonRandInt - adds r7, r0, 0 - movs r0, 0xC - mov r8, r0 - movs r6, 0 - ldr r0, _0803D788 - ldr r2, [r0] - lsls r1, r4, 6 - subs r0, r1, r4 - adds r5, r1, 0 - lsls r0, 3 - ldr r1, _0803D78C - adds r2, r1 - adds r1, r0, r2 -_0803D766: - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _0803D772 - cmp r0, r7 - bge _0803D790 -_0803D772: - adds r1, 0x2 - adds r6, 0x1 - cmp r6, 0xB - ble _0803D766 -_0803D77A: - mov r0, r8 - cmp r0, 0xC - bne _0803D79C - b _0803D7EC - .align 2, 0 -_0803D784: .4byte 0x00002710 -_0803D788: .4byte gDungeon -_0803D78C: .4byte 0x0001c590 -_0803D790: - lsls r0, r6, 24 - lsrs r0, 24 - mov r8, r0 - b _0803D77A -_0803D798: - adds r0, r5, 0 - b _0803D7EE -_0803D79C: - ldr r0, _0803D7FC - bl DungeonRandInt - adds r7, r0, 0 - movs r6, 0 - ldr r2, _0803D800 - subs r0, r5, r4 - ldr r1, _0803D804 - lsls r4, r0, 3 -_0803D7AE: - ldr r0, [r2] - adds r0, r1 - adds r0, r4 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, 0 - beq _0803D7E4 - lsls r0, r6, 24 - lsrs r5, r0, 24 - adds r0, r5, 0 - str r1, [sp] - str r2, [sp, 0x4] - bl GetItemCategory - lsls r0, 24 - lsrs r0, 24 - ldr r1, [sp] - ldr r2, [sp, 0x4] - cmp r0, r8 - bne _0803D7E4 - ldr r0, [r2] - adds r0, r1 - adds r0, r4 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, r7 - bge _0803D798 -_0803D7E4: - adds r4, 0x2 - adds r6, 0x1 - cmp r6, 0xEF - ble _0803D7AE -_0803D7EC: - movs r0, 0x69 -_0803D7EE: - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803D7FC: .4byte 0x00002710 -_0803D800: .4byte gDungeon -_0803D804: .4byte 0x0001c5a8 - thumb_func_end sub_803D73C thumb_func_start sub_803D808 sub_803D808: diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 3199f5deb..fb0e166fc 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -47,7 +47,7 @@ typedef struct Weather } Weather; // size: 0x30 -typedef struct unkDungeonGlobal_unk1CE98_sub +typedef struct UnkDungeonGlobal_unk1CE98_sub { /* 0x0 */ u8 buffer1[10]; /* 0xA */ u8 buffer2[10]; @@ -67,7 +67,7 @@ typedef struct unkDungeonGlobal_unk1CE98_sub /* 0x2D */ u8 defBoost; /* 0x2E */ u8 spDefBoost; u8 unk2F; // speedBoost? -} unkDungeonGlobal_unk1CE98_sub; +} UnkDungeonGlobal_unk1CE98_sub; // size: 0x10 typedef struct DungeonMusicPlayer @@ -81,7 +81,7 @@ typedef struct DungeonMusicPlayer } DungeonMusicPlayer; // Size unknown? -typedef struct unkDungeonGlobal_unk181E8_sub +typedef struct UnkDungeonGlobal_unk181E8_sub { /* 0x181E8 */ Position cameraPos; /* 0x181EC */ Position cameraPosMirror; @@ -115,7 +115,51 @@ typedef struct unkDungeonGlobal_unk181E8_sub u8 fill1821D; u8 fill1821E; u8 fill1821F; -} unkDungeonGlobal_unk181E8_sub; +} UnkDungeonGlobal_unk181E8_sub; + +// Sizeof: 0x1C +typedef struct UnkDungeonGlobal_unk1C574 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; + u8 unkC; + u8 unkD; + u8 unkE; + u8 unkF; + u8 unk10; + u8 unk11; + u8 unk12; + u8 unk13; + u8 unk14; + u8 unk15; + u8 unk16; + u8 unk17; + u8 unk18; + u8 unk19; + u8 unk1A; +} UnkDungeonGlobal_unk1C574; + +typedef struct UnkDungeonGlobal_unk1C590 +{ + s16 unk0[NUM_ITEM_CATEGORIES]; + s16 unk18[NUMBER_OF_ITEM_IDS]; +} UnkDungeonGlobal_unk1C590; + +typedef struct UnkDungeonGlobal_unk1CD98 +{ + struct PokemonStruct1 *unk0; + void *unk4; +} UnkDungeonGlobal_unk1CD98; // size: 0x1CEDC typedef struct Dungeon @@ -136,7 +180,8 @@ typedef struct Dungeon u8 unk10; u8 unk11; s16 unk12; - u8 fill14[0xB8 - 0x14]; + s16 unk14; + u8 fill14[0xB8 - 0x16]; Entity *unkB8; Entity *unkBC; u8 fillC0[0x13C - 0xC0]; @@ -154,7 +199,8 @@ typedef struct Dungeon /* 0x5C0 */ s32 unk5C0; /* 0x5C4 */ u8 fill5C4[0x644 - 0x5C4]; /* 0x644 */ DungeonLocation dungeonLocation; - u8 fill646[0x654 - 0x648]; + /* 0x648 */ DungeonLocation dungeonLocation2; + u8 fill64C[0x654 - 0x64C]; u8 unk654; u8 fill655[0x65B - 0x655]; u8 unk65B; @@ -269,21 +315,17 @@ typedef struct Dungeon /* 0x17B3C */ u32 unk17B40; /* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX]; /* 0x181E4 */ OpenedFile *paletFile; - /* 0x181E8 */ unkDungeonGlobal_unk181E8_sub unk181e8; + /* 0x181E8 */ UnkDungeonGlobal_unk181E8_sub unk181e8; u8 fill18220[0x1C06C - 0x18220]; - u32 unk1C06C; + u32 unk1C06C; u8 fill1C070[0x1C570 - 0x1C070]; - u8 unk1C570; - u8 unk1C571; - u8 fill1C572[0x1C578 - 0x1C572]; - u8 unk1C578; - u8 fill1C579[0x1C57E - 0x1C579]; - u8 unk1C57E; - u8 fill1C57F[0x1C58B - 0x1C57F]; - u8 unk1C58B; - u8 fill1C58C[0x1CE98 - 0x1C58C]; - unkDungeonGlobal_unk1CE98_sub unk1CE98; // TODO: not sure how large this is - u32 unk1CEC8; + /* 0x1C570 */ DungeonLocation unk1C570; + /* 0x1C574 */ UnkDungeonGlobal_unk1C574 unk1C574; + /* 0x1C590 */ UnkDungeonGlobal_unk1C590 unk1C590[4]; + u16 unk1CD70[20]; + UnkDungeonGlobal_unk1CD98 unk1CD98[32]; + UnkDungeonGlobal_unk1CE98_sub unk1CE98; // TODO: not sure how large this is + u8 unk1CEC8; /* 0x1CECC */ DungeonMusicPlayer musPlayer; } Dungeon; diff --git a/ld_script.txt b/ld_script.txt index 0c66956f3..3c3295d40 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -205,6 +205,7 @@ SECTIONS { src/personality_test1.o(.text); src/personality_test2.o(.text); src/code_803D0D8.o(.text); + src/code_803D110.o(.text); asm/code_803D110.o(.text); src/code_803E46C.o(.text); asm/code_803E724.o(.text); diff --git a/src/code_803D0D8.c b/src/code_803D0D8.c index 2e01b9199..3c424f85d 100644 --- a/src/code_803D0D8.c +++ b/src/code_803D0D8.c @@ -46,7 +46,7 @@ u8 sub_803D110(u8 *param_1, u8 *param_2, s32 size) auStack_40[index1] = 0; } - for (index1 = 0; index1 < size; index1++) + for (index1 = 0; index1 < size; index1++) { local_78[index1] = sub_803D0F0(*param_1); if (local_78[index1] == 0xff) { @@ -107,7 +107,7 @@ bool8 sub_803D204(u8 *buffer,unkStruct_203B480 *param_2) u8 localBuffer [PASSWORD_BUFFER_SIZE]; unkStruct_8094924 uStack_30; s32 index; - + checksum = 0; MemoryCopy8(localBuffer,buffer,sizeof(localBuffer)); for(index = 0; index < PASSWORD_BUFFER_SIZE; index++) @@ -119,9 +119,9 @@ bool8 sub_803D204(u8 *buffer,unkStruct_203B480 *param_2) translateBuffer[index] = localBuffer[innerIndex]; } - + if (sub_803D110(translateBuffer,local_c4,sizeof(translateBuffer)) != 0) { - + for(index = 1; index < 34; index++) { checksum += local_c4[index] + index; @@ -242,6 +242,6 @@ void sub_803D414(u8 *buffer,WonderMail *mail) void sub_803D4AC(void) { - gDungeon->unk1C570 = 0x63; - gDungeon->unk1C571 = 0xFF; + gDungeon->unk1C570.id = 0x63; + gDungeon->unk1C570.floor = 0xFF; } diff --git a/src/code_803D110.c b/src/code_803D110.c new file mode 100644 index 000000000..e5e9d3a1c --- /dev/null +++ b/src/code_803D110.c @@ -0,0 +1,410 @@ +#include "global.h" +#include "dungeon.h" +#include "pokemon.h" +#include "file_system.h" +#include "dungeon_random.h" + +extern void sub_80901D8(DungeonLocation *param_1,DungeonLocation *param_2); +extern s32 sub_80902C8(u8 dungeon); +extern u16 ExtractSpeciesIndex(UnkDungeonGlobal_unk1CD98 *r0); +extern void sub_808E9C4(UnkDungeonGlobal_unk1CD98 *r0, s16 r1); + +extern const char gUnknown_80F4D8C[]; // "mapparam" +extern struct FileArchive gDungeonFileArchive; + +struct UnkDungeonFileData +{ + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6[5]; +}; + +struct UnkDataFileStruct +{ + struct UnkDungeonFileData **unk0; + UnkDungeonGlobal_unk1C574 *unk4; + u16 **unk8; + UnkDungeonGlobal_unk1CD98 **unkC; + u16 **unk10; +}; + +// TODO https://decomp.me/scratch/nXUH3 +/* +void sub_803D4D0(void) +{ + u16 spArray[252]; + s32 i, j, k; + OpenedFile *file; + struct UnkDungeonFileData *strPtr; + + sub_80901D8(&gDungeon->dungeonLocation2, &gDungeon->dungeonLocation); + if (gDungeon->unk1C570.id == gDungeon->dungeonLocation2.id && gDungeon->unk1C570.floor == gDungeon->dungeonLocation2.floor) + return; + + gDungeon->unk1C570 = gDungeon->dungeonLocation2; + file = OpenFileAndGetFileDataPtr(gUnknown_80F4D8C, &gDungeonFileArchive); + + strPtr = &file->data.dungData->unk0[gDungeon->unk1C570.id][gDungeon->unk1C570.floor]; + + gDungeon->unk1CEC8 = GetDungeonFloorCount(gDungeon->dungeonLocation.id); + gDungeon->unk14 = sub_80902C8(gDungeon->dungeonLocation.id); + + gDungeon->unk1C574 = file->data.dungData->unk4[strPtr->unk0]; + + for (i = 0; i < 20; i++) { + gDungeon->unk1CD70[i] = file->data.dungData->unk10[strPtr->unk4][i]; + } + for (i = 0; i < 31; i++) { + gDungeon->unk1CD98[i] = file->data.dungData->unkC[strPtr->unk2][i]; + if (ExtractSpeciesIndex(&gDungeon->unk1CD98[i]) == 0) + break; + } + while (i <= 31) { + sub_808E9C4(&gDungeon->unk1CD98[i], 0); + i++; + } + + for (i = 0; i < 4; i++) + { + u16 *src = file->data.dungData->unk8[strPtr->unk6[i]]; + + for (j = 0; j < 252; src++) { + if (*src > 29999) { + for (k = *src - 30000; k != 0; k--) { + spArray[j++] = 0; + } + } + else { + spArray[j++] = *src; + } + } + + for (j = 0; j < 12; j++) { + gDungeon->unk1C590[i].unk0[j] = spArray[j]; + } + + for (j = 0; j < 240; j++) { + gDungeon->unk1C590[i].unk18[j] = spArray[12 + j]; + } + } + + CloseFile(file); +} + +*/ +// + +NAKED void sub_803D4D0(void) +{ + asm_unified(" .text\n" +" push {r4-r7,lr}\n" +" mov r7, r10\n" +" mov r6, r9\n" +" mov r5, r8\n" +" push {r5-r7}\n" +" sub sp, 0x1FC\n" +" ldr r6, _0803D654\n" +" ldr r1, [r6]\n" +" movs r4, 0xC9\n" +" lsls r4, 3\n" +" adds r0, r1, r4\n" +" ldr r2, _0803D658\n" +" adds r1, r2\n" +" bl sub_80901D8\n" +" ldr r0, [r6]\n" +" ldr r3, _0803D65C\n" +" adds r2, r0, r3\n" +" adds r1, r0, r4\n" +" ldrh r0, [r2]\n" +" ldrh r4, [r1]\n" +" cmp r0, r4\n" +" bne _0803D500\n" +" b _0803D6E0\n" +"_0803D500:\n" +" ldr r0, [r1]\n" +" str r0, [r2]\n" +" ldr r0, _0803D660\n" +" ldr r1, _0803D664\n" +" bl OpenFileAndGetFileDataPtr\n" +" mov r9, r0\n" +" ldr r3, [r0, 0x4]\n" +" ldr r2, [r6]\n" +" ldr r7, _0803D65C\n" +" adds r0, r2, r7\n" +" ldrb r1, [r0]\n" +" ldr r0, [r3]\n" +" lsls r1, 2\n" +" adds r1, r0\n" +" ldr r3, _0803D668\n" +" adds r0, r2, r3\n" +" ldrb r0, [r0]\n" +" lsls r0, 4\n" +" ldr r1, [r1]\n" +" adds r1, r0\n" +" mov r8, r1\n" +" ldr r4, _0803D658\n" +" adds r2, r4\n" +" ldrb r0, [r2]\n" +" bl GetDungeonFloorCount\n" +" ldr r1, [r6]\n" +" ldr r7, _0803D66C\n" +" adds r1, r7\n" +" strb r0, [r1]\n" +" ldr r0, [r6]\n" +" adds r0, r4\n" +" ldrb r0, [r0]\n" +" bl sub_80902C8\n" +" ldr r1, [r6]\n" +" strh r0, [r1, 0x14]\n" +" mov r2, r9\n" +" ldr r0, [r2, 0x4]\n" +" mov r3, r8\n" +" movs r4, 0\n" +" ldrsh r2, [r3, r4]\n" +" ldr r3, [r0, 0x4]\n" +" lsls r0, r2, 3\n" +" subs r0, r2\n" +" lsls r0, 2\n" +" ldr r7, _0803D670\n" +" adds r1, r7\n" +" adds r0, r3\n" +" ldm r0!, {r2-r4}\n" +" stm r1!, {r2-r4}\n" +" ldm r0!, {r2,r3,r7}\n" +" stm r1!, {r2,r3,r7}\n" +" ldr r0, [r0]\n" +" str r0, [r1]\n" +" movs r5, 0\n" +" mov r10, r6\n" +" ldr r4, _0803D674\n" +"_0803D576:\n" +" mov r6, r10\n" +" ldr r2, [r6]\n" +" lsls r3, r5, 1\n" +" adds r2, r4\n" +" adds r2, r3\n" +" mov r7, r9\n" +" ldr r1, [r7, 0x4]\n" +" mov r6, r8\n" +" movs r7, 0x4\n" +" ldrsh r0, [r6, r7]\n" +" ldr r1, [r1, 0x10]\n" +" lsls r0, 2\n" +" adds r0, r1\n" +" ldr r0, [r0]\n" +" adds r3, r0\n" +" ldrh r0, [r3]\n" +" strh r0, [r2]\n" +" adds r5, 0x1\n" +" cmp r5, 0x13\n" +" ble _0803D576\n" +" movs r5, 0\n" +" adds r6, 0x6\n" +" str r6, [sp, 0x1F8]\n" +" ldr r6, _0803D678\n" +" mov r10, r6\n" +"_0803D5A8:\n" +" ldr r1, _0803D654\n" +" ldr r0, [r1]\n" +" lsls r3, r5, 3\n" +" mov r2, r10\n" +" adds r4, r0, r2\n" +" adds r4, r3\n" +" mov r12, r4\n" +" mov r4, r9\n" +" ldr r2, [r4, 0x4]\n" +" mov r7, r8\n" +" movs r4, 0x2\n" +" ldrsh r1, [r7, r4]\n" +" ldr r2, [r2, 0xC]\n" +" lsls r1, 2\n" +" adds r1, r2\n" +" ldr r1, [r1]\n" +" adds r3, r1\n" +" ldr r1, [r3]\n" +" ldr r2, [r3, 0x4]\n" +" mov r7, r12\n" +" str r1, [r7]\n" +" str r2, [r7, 0x4]\n" +" adds r0, r6\n" +" bl ExtractSpeciesIndex\n" +" lsls r0, 16\n" +" cmp r0, 0\n" +" beq _0803D5E8\n" +" adds r6, 0x8\n" +" adds r5, 0x1\n" +" cmp r5, 0x1E\n" +" ble _0803D5A8\n" +"_0803D5E8:\n" +" cmp r5, 0x1F\n" +" bgt _0803D606\n" +" ldr r6, _0803D654\n" +" lsls r0, r5, 3\n" +" ldr r1, _0803D678\n" +" adds r4, r0, r1\n" +"_0803D5F4:\n" +" ldr r0, [r6]\n" +" adds r0, r4\n" +" movs r1, 0\n" +" bl sub_808E9C4\n" +" adds r4, 0x8\n" +" adds r5, 0x1\n" +" cmp r5, 0x1F\n" +" ble _0803D5F4\n" +"_0803D606:\n" +" movs r5, 0\n" +" ldr r2, _0803D67C\n" +" mov r10, r2\n" +"_0803D60C:\n" +" mov r3, r9\n" +" ldr r1, [r3, 0x4]\n" +" lsls r0, r5, 1\n" +" ldr r4, [sp, 0x1F8]\n" +" adds r0, r4, r0\n" +" movs r6, 0\n" +" ldrsh r0, [r0, r6]\n" +" ldr r1, [r1, 0x8]\n" +" lsls r0, 2\n" +" adds r0, r1\n" +" movs r4, 0\n" +" adds r7, r5, 0x1\n" +" mov r8, r7\n" +" lsls r1, r5, 6\n" +" mov r12, r1\n" +" ldr r3, [r0]\n" +" mov r2, sp\n" +"_0803D62E:\n" +" ldrh r0, [r3]\n" +" cmp r0, r10\n" +" bls _0803D684\n" +" ldrh r0, [r3]\n" +" ldr r6, _0803D680\n" +" adds r1, r0, r6\n" +" cmp r1, 0\n" +" beq _0803D68A\n" +" movs r6, 0\n" +" lsls r0, r4, 1\n" +" add r0, sp\n" +"_0803D644:\n" +" strh r6, [r0]\n" +" adds r0, 0x2\n" +" adds r2, 0x2\n" +" adds r4, 0x1\n" +" subs r1, 0x1\n" +" cmp r1, 0\n" +" bne _0803D644\n" +" b _0803D68A\n" +" .align 2, 0\n" +"_0803D654: .4byte gDungeon\n" +"_0803D658: .4byte 0x00000644\n" +"_0803D65C: .4byte 0x0001c570\n" +"_0803D660: .4byte gUnknown_80F4D8C\n" +"_0803D664: .4byte gDungeonFileArchive\n" +"_0803D668: .4byte 0x0001c571\n" +"_0803D66C: .4byte 0x0001cec8\n" +"_0803D670: .4byte 0x0001c574\n" +"_0803D674: .4byte 0x0001cd70\n" +"_0803D678: .4byte 0x0001cd98\n" +"_0803D67C: .4byte 0x0000752f\n" +"_0803D680: .4byte 0xffff8ad0\n" +"_0803D684:\n" +" strh r0, [r2]\n" +" adds r2, 0x2\n" +" adds r4, 0x1\n" +"_0803D68A:\n" +" adds r3, 0x2\n" +" cmp r4, 0xFB\n" +" ble _0803D62E\n" +" ldr r7, _0803D6F0\n" +" mov r1, r12\n" +" subs r0, r1, r5\n" +" movs r4, 0xB\n" +" mov r3, sp\n" +" lsls r2, r0, 3\n" +" ldr r6, _0803D6F4\n" +"_0803D69E:\n" +" ldr r0, [r7]\n" +" adds r0, r6\n" +" adds r0, r2\n" +" ldrh r1, [r3]\n" +" strh r1, [r0]\n" +" adds r3, 0x2\n" +" adds r2, 0x2\n" +" subs r4, 0x1\n" +" cmp r4, 0\n" +" bge _0803D69E\n" +" ldr r6, _0803D6F0\n" +" mov r2, r12\n" +" subs r0, r2, r5\n" +" lsls r3, r0, 3\n" +" add r2, sp, 0x18\n" +" ldr r5, _0803D6F8\n" +" movs r4, 0xEF\n" +"_0803D6C0:\n" +" ldr r0, [r6]\n" +" adds r0, r5\n" +" adds r0, r3\n" +" ldrh r1, [r2]\n" +" strh r1, [r0]\n" +" adds r2, 0x2\n" +" adds r3, 0x2\n" +" subs r4, 0x1\n" +" cmp r4, 0\n" +" bge _0803D6C0\n" +" mov r5, r8\n" +" cmp r5, 0x3\n" +" ble _0803D60C\n" +" mov r0, r9\n" +" bl CloseFile\n" +"_0803D6E0:\n" +" add sp, 0x1FC\n" +" pop {r3-r5}\n" +" mov r8, r3\n" +" mov r9, r4\n" +" mov r10, r5\n" +" pop {r4-r7}\n" +" pop {r0}\n" +" bx r0\n" +" .align 2, 0\n" +"_0803D6F0: .4byte gDungeon\n" +"_0803D6F4: .4byte 0x0001c590\n" +"_0803D6F8: .4byte 0x0001c5a8\n"); +} + +u8 sub_803D6FC(void) +{ + s32 i; + s32 rand = DungeonRandInt(10000); + for (i = 0; i < 20; i++) { + if (gDungeon->unk1CD70[i] != 0 && gDungeon->unk1CD70[i] >= rand) + return i; + } + + return 16; +} + +u8 sub_803D73C(s32 a0) +{ + s32 i; + s32 rand = DungeonRandInt(10000); + u8 category = NUM_ITEM_CATEGORIES; + for (i = 0; i < NUM_ITEM_CATEGORIES; i++) { + if (gDungeon->unk1C590[a0].unk0[i] != 0 && gDungeon->unk1C590[a0].unk0[i] >= rand) { + category = i; + break; + } + } + if (category == NUM_ITEM_CATEGORIES) + return 105; + + rand = DungeonRandInt(10000); + for (i = 0; i < NUMBER_OF_ITEM_IDS; i++) { + if (gDungeon->unk1C590[a0].unk18[i] != 0 && GetItemCategory(i) == category && gDungeon->unk1C590[a0].unk18[i] >= rand) { + return i; + } + } + + return 105; +} + diff --git a/src/code_8045A00.c b/src/code_8045A00.c index e9b2268e5..38cdf10e0 100644 --- a/src/code_8045A00.c +++ b/src/code_8045A00.c @@ -98,38 +98,30 @@ void sub_8045C18(u8 *buffer, Item *item) sub_8090E14(buffer, item, &gUnknown_80F6990); } -void sub_8045C28(Item *Item, u8 itemID, u32 param_3) +void sub_8045C28(Item *item, u8 itemID, u32 param_3) { - bool8 stickyFlag; - u32 total; + bool8 stickyFlag; - xxx_init_itemslot_8090A8C(Item,itemID,0); - stickyFlag = FALSE; - if (IsNotSpecialItem(itemID)) { - if (param_3 == 0) { - if (DungeonRandInt(100) >= gDungeon->unk1C57E) - { - goto _short; + xxx_init_itemslot_8090A8C(item,itemID,0); + stickyFlag = FALSE; + if (IsNotSpecialItem(itemID)) { + if (param_3 == 0) { + if (DungeonRandInt(100) < gDungeon->unk1C574.unkA) + stickyFlag = TRUE; + else + stickyFlag = FALSE; } - else - { - goto _store; + else if (param_3 == 1) { + stickyFlag = TRUE; } } - else if (param_3 == 1) { - stickyFlag = TRUE; + if (stickyFlag) { + item->flags |= ITEM_FLAG_STICKY; + } + + if (GetItemCategory(itemID) == CATEGORY_POKE) { + sub_8046CE4(item, gDungeon->unk1C574.unk17 * 40); } - } -_short: - if (stickyFlag) -_store: - Item->flags = Item->flags | ITEM_FLAG_STICKY; - if (GetItemCategory(itemID) == CATEGORY_POKE) { - // FIXME: total hack but too lazy to figure out array for now - total = (gDungeon->unk1C58B << 2) + gDungeon->unk1C58B; - total <<= 3; - sub_8046CE4(Item, total); - } } void sub_8045CB0(void) diff --git a/src/code_809447C.c b/src/code_809447C.c index 090a080ff..869fbf568 100644 --- a/src/code_809447C.c +++ b/src/code_809447C.c @@ -80,7 +80,7 @@ static u8 sub_8094528(s16 moveID) } } -void sub_8094558(u32 param_1,u8 *param_2,unkDungeonGlobal_unk1CE98_sub *param_3) +void sub_8094558(u32 param_1,u8 *param_2,UnkDungeonGlobal_unk1CE98_sub *param_3) { u8 buffer [200]; s32 x, y; diff --git a/src/dungeon_music.c b/src/dungeon_music.c index 36c839621..fc486f8d9 100644 --- a/src/dungeon_music.c +++ b/src/dungeon_music.c @@ -34,7 +34,7 @@ void sub_8083AB0(s16 param_0, Entity * target, Entity * entity) EntityInfo * targetEntityInfo; u8 *spAttPtr; u8 buffer [0x14]; - unkDungeonGlobal_unk1CE98_sub *temp; + UnkDungeonGlobal_unk1CE98_sub *temp; u8 *id; s32 param_0_s32 = param_0; @@ -96,7 +96,7 @@ void sub_8083AB0(s16 param_0, Entity * target, Entity * entity) bool8 sub_8083C24(void) { - unkDungeonGlobal_unk1CE98_sub *temp; + UnkDungeonGlobal_unk1CE98_sub *temp; temp = &gDungeon->unk1CE98; @@ -110,7 +110,7 @@ bool8 sub_8083C24(void) bool8 sub_8083C50(void) { - unkDungeonGlobal_unk1CE98_sub *temp; + UnkDungeonGlobal_unk1CE98_sub *temp; temp = &gDungeon->unk1CE98; @@ -124,7 +124,7 @@ bool8 sub_8083C50(void) bool8 sub_8083C88(u8 param_1) { - unkDungeonGlobal_unk1CE98_sub *temp; + UnkDungeonGlobal_unk1CE98_sub *temp; temp = &gDungeon->unk1CE98; diff --git a/src/weather.c b/src/weather.c index f64ed70aa..cd391ee9e 100644 --- a/src/weather.c +++ b/src/weather.c @@ -25,7 +25,7 @@ u8 GetApparentWeather(Entity *pokemon) void sub_807E5AC(void) { u8 weather; - weather = gDungeon->unk1C578; + weather = gDungeon->unk1C574.unk4; if(weather == WEATHER_RANDOM) weather = DungeonRandInt(WEATHER_RANDOM); sub_807E5E4(weather);