From 8ec9d4781837d3a9d8d6285409f2425b15b05000 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 4 Oct 2024 11:10:29 +0200 Subject: [PATCH 1/8] sub_803E9D0 --- asm/code_803E724.s | 198 ------------------------------------ include/bg_palette_buffer.h | 8 +- ld_script.txt | 1 + src/bg_palette_buffer.c | 6 +- src/code_803E724.c | 87 ++++++++++++++++ 5 files changed, 95 insertions(+), 205 deletions(-) create mode 100644 src/code_803E724.c diff --git a/asm/code_803E724.s b/asm/code_803E724.s index ac3842db5..7f9895d45 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -5,205 +5,7 @@ .text - thumb_func_start sub_803E874 -sub_803E874: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - mov r9, r1 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r0, _0803E9A4 - ldr r0, [r0] - ldr r5, [r0, 0x4] - ldr r1, _0803E9A8 - ldr r0, _0803E9AC - ldr r2, [r0] - ldr r0, _0803E9B0 - ldr r3, [r0] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - movs r0, 0 - bl SetBGPaletteBufferColorRGB - adds r5, 0x4 - movs r6, 0x1 - movs r4, 0x9F -_0803E8AA: - ldr r1, _0803E9AC - mov r8, r1 - ldr r2, [r1] - ldr r7, _0803E9B0 - ldr r3, [r7] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - adds r0, r6, 0 - adds r1, r5, 0 - bl SetBGPaletteBufferColorRGB - adds r5, 0x4 - adds r6, 0x1 - subs r4, 0x1 - cmp r4, 0 - bne _0803E8AA - ldr r3, [r7] - ldr r1, _0803E9B4 - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0803E8E2 - ldr r2, _0803E9B8 - adds r0, r3, r2 - ldr r0, [r0] - cmp r0, 0x3 - bne _0803E8FC -_0803E8E2: - ldr r1, _0803E9BC - mov r2, r8 - ldr r0, [r2] - str r0, [sp] - movs r2, 0xBE - lsls r2, 1 - adds r0, r3, r2 - str r0, [sp, 0x4] - movs r0, 0x1 - movs r2, 0xA0 - movs r3, 0x20 - bl sub_8004AF0 -_0803E8FC: - adds r6, 0x20 - ldr r5, _0803E9C0 - movs r4, 0x20 -_0803E902: - ldr r0, _0803E9AC - ldr r2, [r0] - ldr r0, _0803E9B0 - ldr r3, [r0] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - adds r0, r6, 0 - adds r1, r5, 0 - bl SetBGPaletteBufferColorRGB - adds r5, 0x4 - adds r6, 0x1 - subs r4, 0x1 - cmp r4, 0 - bne _0803E902 - mov r1, r10 - cmp r1, 0 - beq _0803E948 - movs r6, 0xE0 - ldr r0, _0803E9C4 - ldr r0, [r0] - ldr r5, [r0, 0x4] - movs r4, 0x10 -_0803E932: - adds r0, r6, 0 - adds r1, r5, 0 - mov r2, r9 - movs r3, 0 - bl SetBGPaletteBufferColorRGB - adds r5, 0x4 - adds r6, 0x1 - subs r4, 0x1 - cmp r4, 0 - bne _0803E932 -_0803E948: - ldr r1, _0803E9C8 - ldr r4, _0803E9AC - ldr r2, [r4] - movs r0, 0xF8 - movs r3, 0 - bl SetBGPaletteBufferColorRGB - ldr r0, _0803E9B0 - ldr r0, [r0] - ldr r2, _0803E9CC - adds r0, r2 - ldr r0, [r0] - ldr r5, [r0, 0x4] - movs r6, 0x80 - lsls r6, 1 - adds r7, r4, 0 - movs r4, 0xD0 -_0803E96A: - ldr r2, [r7] - ldr r0, _0803E9B0 - ldr r3, [r0] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - adds r0, r6, 0 - adds r1, r5, 0 - bl SetBGPaletteBufferColorRGB - ldr r2, [r7] - adds r0, r6, 0 - adds r1, r5, 0 - movs r3, 0 - bl nullsub_4 - adds r5, 0x4 - adds r6, 0x1 - subs r4, 0x1 - cmp r4, 0 - bne _0803E96A - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803E9A4: .4byte gDungeonPaletteFile -_0803E9A8: .4byte gUnknown_80F62AC -_0803E9AC: .4byte gUnknown_202EDC8 -_0803E9B0: .4byte gDungeon -_0803E9B4: .4byte 0x00018215 -_0803E9B8: .4byte 0x0001c06c -_0803E9BC: .4byte gUnknown_202EE8C -_0803E9C0: .4byte gUnknown_202ECA4 -_0803E9C4: .4byte gDungeonNameBannerPalette -_0803E9C8: .4byte gUnknown_202D058 -_0803E9CC: .4byte 0x000181e4 - thumb_func_end sub_803E874 - thumb_func_start sub_803E9D0 -sub_803E9D0: - push {r4-r7,lr} - ldr r0, _0803EA04 - ldr r0, [r0] - ldr r1, _0803EA08 - adds r0, r1 - ldr r0, [r0] - ldr r4, [r0, 0x4] - movs r6, 0x80 - lsls r6, 1 - ldr r7, _0803EA0C - movs r5, 0xD0 -_0803E9E6: - ldr r2, [r7] - adds r0, r6, 0 - adds r1, r4, 0 - movs r3, 0 - bl nullsub_4 - adds r4, 0x4 - adds r6, 0x1 - subs r5, 0x1 - cmp r5, 0 - bne _0803E9E6 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803EA04: .4byte gDungeon -_0803EA08: .4byte 0x000181e4 -_0803EA0C: .4byte gUnknown_202EDC8 - thumb_func_end sub_803E9D0 thumb_func_start sub_803EA10 sub_803EA10: diff --git a/include/bg_palette_buffer.h b/include/bg_palette_buffer.h index 0a27e3929..2f613353e 100644 --- a/include/bg_palette_buffer.h +++ b/include/bg_palette_buffer.h @@ -2,10 +2,10 @@ #define GUARD_BG_PALETTE_BUFFER_H void InitBGPaletteBuffer(void); -void nullsub_4(s32 index, u8 *colorArray, s32, u8 *); +void nullsub_4(s32 index, const u8 *colorArray, s32, u8 *); void nullsub_5(void); -void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray); -void SetBGPaletteBufferColorRGB(s32 index, u8 *colorArray, s32, u8 *); +void SetBGPaletteBufferColorArray(s32 index, const u8 *colorArray); +void SetBGPaletteBufferColorRGB(s32 index, const u8 *colorArray, s32, u8 *); void TransferBGPaletteBuffer(void); -#endif // GUARD_BG_PALETTE_BUFFER_H \ No newline at end of file +#endif // GUARD_BG_PALETTE_BUFFER_H diff --git a/ld_script.txt b/ld_script.txt index 468ae7303..c4032e3ff 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -208,6 +208,7 @@ SECTIONS { src/code_803D110.o(.text); asm/code_803D110.o(.text); src/code_803E46C.o(.text); + src/code_803E724.o(.text); asm/code_803E724.o(.text); src/code_8040094.o(.text); asm/code_8040094.o(.text); diff --git a/src/bg_palette_buffer.c b/src/bg_palette_buffer.c index 9c413f5e7..5ccede77e 100644 --- a/src/bg_palette_buffer.c +++ b/src/bg_palette_buffer.c @@ -22,7 +22,7 @@ void InitBGPaletteBuffer(void) } // 99.48% (r3/r4 regswap) https://decomp.me/scratch/7Yc8i -void SetBGPaletteBufferColorRGB(s32 index, u8 *colorArray, s32 a1, u8 *a2) +void SetBGPaletteBufferColorRGB(s32 index, const u8 *colorArray, s32 a1, u8 *a2) { #ifdef NONMATCHING s32 var; @@ -43,7 +43,7 @@ void SetBGPaletteBufferColorRGB(s32 index, u8 *colorArray, s32 a1, u8 *a2) sBGPaletteBuffer[index] = var = ((a2[4 * colorArray[2] + 2] * a1 / 256 & 0x1F) << 10) | ((a2[4 * colorArray[1] + 1] * a1 / 256 & 0x1F) << 5) | (a2[4 * colorArray[0]] * a1 / 256 & 0x1F); } -void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray) +void SetBGPaletteBufferColorArray(s32 index, const u8 *colorArray) { sBGPaletteUsed[index / BG_PALETTE_BUFFER_CHUNK_SIZE] = TRUE; sBGPaletteBuffer[index] = (colorArray[2] >> 3) << 10 | (colorArray[1] >> 3) << 5 | colorArray[0] >> 3; @@ -55,7 +55,7 @@ void SetBGPaletteBufferColor(s32 index, u16 *color) sBGPaletteBuffer[index] = *color; } -void nullsub_4(s32 index, u8 *colorArray, s32 a1, u8 *a2) +void nullsub_4(s32 index, const u8 *colorArray, s32 a1, u8 *a2) { } diff --git a/src/code_803E724.c b/src/code_803E724.c new file mode 100644 index 000000000..ec283870e --- /dev/null +++ b/src/code_803E724.c @@ -0,0 +1,87 @@ +#include "global.h" +#include "dungeon.h" +#include "bg_palette_buffer.h" +#include "code_8004AA0.h" + +extern s32 gUnknown_202EDC8; + +struct DungeonPalFile +{ + void *unk0; + const void *unk4; +}; + +extern struct DungeonPalFile *gDungeonPaletteFile; +extern struct DungeonPalFile *gDungeonNameBannerPalette; +extern u8 gUnknown_202ECA4[]; +extern u8 gUnknown_202D058[]; + +extern const u8 gUnknown_80F62AC[]; + +void sub_803E874(bool8 r10, s32 r9) +{ + s32 i, index, count; + const u8 *colorArray; + + colorArray = gDungeonPaletteFile->unk4; + SetBGPaletteBufferColorRGB(0, gUnknown_80F62AC, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index = 1; + count = 159; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index++; + } + + if (gDungeon->unk181e8.unk18215 == 0 || gDungeon->unk1C06C == 3) { + sub_8004AF0(TRUE, gUnknown_202EE8C, 0xA0, 0x20, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + } + + index += 32; + colorArray = gUnknown_202ECA4; + count = 32; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index++; + } + + if (r10) { + index = 224; + colorArray = gDungeonNameBannerPalette->unk4; + count = 16; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, r9, NULL); + colorArray += 4; + index++; + } + } + + SetBGPaletteBufferColorRGB(248, gUnknown_202D058, gUnknown_202EDC8, NULL); + + colorArray = ((struct DungeonPalFile*) gDungeon->paletFile)->unk4; + index = 256; + count = 208; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + nullsub_4(index, colorArray, gUnknown_202EDC8, NULL); + colorArray += 4; + index++; + } +} + +void sub_803E9D0(void) +{ + s32 i, index, count; + const u8 *colorArray; + + colorArray = ((struct DungeonPalFile*) gDungeon->paletFile)->unk4; + index = 256; + count = 208; + for (i = 0; i < count; i++) { + nullsub_4(index, colorArray, gUnknown_202EDC8, NULL); + colorArray += 4; + index++; + } +} From 0d3e64bba627eba78436295e4bbc471a5805fa02 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 4 Oct 2024 11:14:02 +0200 Subject: [PATCH 2/8] sub_803EA10 --- asm/code_803E724.s | 105 ------------------------------------------- src/code_803E724.c | 34 +++++++++++++- src/code_8057824_1.c | 8 ++-- src/code_80869E4.c | 4 +- 4 files changed, 39 insertions(+), 112 deletions(-) diff --git a/asm/code_803E724.s b/asm/code_803E724.s index 7f9895d45..e43d76df4 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -7,111 +7,6 @@ - thumb_func_start sub_803EA10 -sub_803EA10: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - ldr r0, _0803EACC - ldr r0, [r0] - ldr r4, [r0, 0x4] - ldr r1, _0803EAD0 - ldr r0, _0803EAD4 - ldr r2, [r0] - ldr r0, _0803EAD8 - ldr r3, [r0] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - movs r0, 0 - bl SetBGPaletteBufferColorRGB - adds r4, 0x4 - movs r6, 0x1 - movs r5, 0x9F -_0803EA3A: - ldr r1, _0803EAD4 - mov r8, r1 - ldr r2, [r1] - ldr r7, _0803EAD8 - ldr r3, [r7] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - adds r0, r6, 0 - adds r1, r4, 0 - bl SetBGPaletteBufferColorRGB - adds r4, 0x4 - adds r6, 0x1 - subs r5, 0x1 - cmp r5, 0 - bne _0803EA3A - ldr r3, [r7] - ldr r1, _0803EADC - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EA72 - ldr r2, _0803EAE0 - adds r0, r3, r2 - ldr r0, [r0] - cmp r0, 0x3 - bne _0803EA8C -_0803EA72: - ldr r1, _0803EAE4 - mov r2, r8 - ldr r0, [r2] - str r0, [sp] - movs r2, 0xBE - lsls r2, 1 - adds r0, r3, r2 - str r0, [sp, 0x4] - movs r0, 0x1 - movs r2, 0xA0 - movs r3, 0x20 - bl sub_8004AF0 -_0803EA8C: - adds r6, 0x20 - ldr r4, _0803EAE8 - movs r5, 0x20 -_0803EA92: - ldr r7, _0803EAD4 - ldr r2, [r7] - ldr r0, _0803EAD8 - ldr r3, [r0] - movs r0, 0xBE - lsls r0, 1 - adds r3, r0 - adds r0, r6, 0 - adds r1, r4, 0 - bl SetBGPaletteBufferColorRGB - adds r4, 0x4 - adds r6, 0x1 - subs r5, 0x1 - cmp r5, 0 - bne _0803EA92 - ldr r1, _0803EAEC - ldr r2, [r7] - movs r0, 0xF8 - movs r3, 0 - bl SetBGPaletteBufferColorRGB - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803EACC: .4byte gDungeonPaletteFile -_0803EAD0: .4byte gUnknown_80F62AC -_0803EAD4: .4byte gUnknown_202EDC8 -_0803EAD8: .4byte gDungeon -_0803EADC: .4byte 0x00018215 -_0803EAE0: .4byte 0x0001c06c -_0803EAE4: .4byte gUnknown_202EE8C -_0803EAE8: .4byte gUnknown_202ECA4 -_0803EAEC: .4byte gUnknown_202D058 - thumb_func_end sub_803EA10 thumb_func_start sub_803EAF0 sub_803EAF0: diff --git a/src/code_803E724.c b/src/code_803E724.c index ec283870e..000db2df5 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -71,7 +71,7 @@ void sub_803E874(bool8 r10, s32 r9) } } -void sub_803E9D0(void) +void BgColorCallNullsub4(void) { s32 i, index, count; const u8 *colorArray; @@ -85,3 +85,35 @@ void sub_803E9D0(void) index++; } } + +void sub_803EA10(void) +{ + s32 i, index, count; + const u8 *colorArray; + + colorArray = gDungeonPaletteFile->unk4; + SetBGPaletteBufferColorRGB(0, gUnknown_80F62AC, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index = 1; + count = 159; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index++; + } + + if (gDungeon->unk181e8.unk18215 == 0 || gDungeon->unk1C06C == 3) { + sub_8004AF0(TRUE, gUnknown_202EE8C, 0xA0, 0x20, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + } + + index += 32; + colorArray = gUnknown_202ECA4; + count = 32; + for (i = 0; i < count; i++) { + SetBGPaletteBufferColorRGB(index, colorArray, gUnknown_202EDC8, (void *) &gDungeon->unk17C); + colorArray += 4; + index++; + } + + SetBGPaletteBufferColorRGB(248, gUnknown_202D058, gUnknown_202EDC8, NULL); +} diff --git a/src/code_8057824_1.c b/src/code_8057824_1.c index e9621b758..f7281b5bd 100644 --- a/src/code_8057824_1.c +++ b/src/code_8057824_1.c @@ -333,7 +333,7 @@ extern s32 GetCameraXPos(); extern s32 GetCameraYPos(); extern void sub_803F878(u32, s32); extern void SetupBossFightHP(Entity *, u32, u32); -extern void sub_803E9D0(void); +extern void BgColorCallNullsub4(void); extern void DeoxysScreenFlash(void); extern void sub_8085EB0(); @@ -3987,7 +3987,7 @@ void sub_808C0CC(void) { gUnknown_202EDC8 = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); - sub_803E9D0(); + BgColorCallNullsub4(); sub_803E46C(0x46); gDungeon->unk7 = 0; LugiaScreenFlash(); @@ -4109,7 +4109,7 @@ void sub_808C360(void) { gUnknown_202EDC8 = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); - sub_803E9D0(); + BgColorCallNullsub4(); sub_803E46C(0x46); gDungeon->unk7 = 0; KyogreScreenFlash(); @@ -4196,7 +4196,7 @@ void sub_808C550(void) { gUnknown_202EDC8 = 0x1f; SetDungeonBGColorRGB(0,0,0,1,1); - sub_803E9D0(); + BgColorCallNullsub4(); sub_803E46C(0x46); gDungeon->unk7 = 0; DeoxysScreenFlash(); diff --git a/src/code_80869E4.c b/src/code_80869E4.c index 6c974b629..a44b50a52 100644 --- a/src/code_80869E4.c +++ b/src/code_80869E4.c @@ -20,7 +20,7 @@ EWRAM_DATA unkStruct_202F3D0 gUnknown_202F3D0 = {0}; extern u32 gUnknown_8107314[]; s8 sub_8002984(s8, u8); -extern void sub_803E9D0(void); +extern void BgColorCallNullsub4(void); extern void SetDungeonBGColorRGB(u32, u32, u32, u32, u32); extern void PlaySoundEffect(u32); extern void DisplayDungeonDialogue(const u8 *); @@ -347,7 +347,7 @@ void sub_8086794(void) for (i = 0; i < 200; i++) { SetDungeonBGColorRGB(0, 0, 0, 1, 0); - sub_803E9D0(); + BgColorCallNullsub4(); sub_803E46C(70); if ((i & 3) == 0) { From 200c2e2d35c5b0f6e5d3c0c9c6bd19aa00ca7489 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 7 Oct 2024 14:25:22 +0200 Subject: [PATCH 3/8] sub_803EDF0 --- asm/code_803E724.s | 596 ---------------------------------- include/code_8009804.h | 4 +- include/cpu.h | 2 +- include/structs/str_dungeon.h | 2 +- include/text1.h | 4 +- src/code_8009804.c | 2 +- src/code_803E724.c | 274 ++++++++++++++++ src/cpu.c | 2 +- src/text1.c | 4 +- 9 files changed, 284 insertions(+), 606 deletions(-) diff --git a/asm/code_803E724.s b/asm/code_803E724.s index e43d76df4..8c7ffbc71 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -6,602 +6,6 @@ .text - - - thumb_func_start sub_803EAF0 -sub_803EAF0: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldr r0, _0803EB20 - ldr r0, [r0] - cmp r4, r0 - bne _0803EB00 - b _0803EC88 -_0803EB00: - cmp r4, 0x5 - bne _0803EB06 - b _0803EC1C -_0803EB06: - cmp r4, 0x5 - bhi _0803EB2E - cmp r4, 0x2 - bne _0803EB10 - b _0803EBFC -_0803EB10: - cmp r4, 0x2 - bhi _0803EB24 - cmp r4, 0 - beq _0803EB70 - cmp r4, 0x1 - beq _0803EB50 - b _0803EC84 - .align 2, 0 -_0803EB20: .4byte gUnknown_202EDD0 -_0803EB24: - cmp r4, 0x3 - beq _0803EB98 - cmp r4, 0x4 - beq _0803EBFC - b _0803EC84 -_0803EB2E: - cmp r4, 0x8 - bne _0803EB34 - b _0803EC34 -_0803EB34: - cmp r4, 0x8 - bhi _0803EB42 - cmp r4, 0x6 - beq _0803EBBC - cmp r4, 0x7 - beq _0803EBDC - b _0803EC84 -_0803EB42: - cmp r4, 0xA - bne _0803EB48 - b _0803EC80 -_0803EB48: - cmp r4, 0xA - bcs _0803EB4E - b _0803EC54 -_0803EB4E: - b _0803EC84 -_0803EB50: - ldr r0, _0803EB6C - ldrb r0, [r0] - cmp r0, 0 - beq _0803EB5E - movs r0, 0 - bl sub_8052210 -_0803EB5E: - bl ResetUnusedInputStruct - bl sub_803EC94 - movs r0, 0 - movs r1, 0x1 - b _0803EC6E - .align 2, 0 -_0803EB6C: .4byte gUnknown_203B40C -_0803EB70: - bl sub_803EC94 - movs r0, 0 - movs r1, 0x1 - movs r2, 0x1 - bl xxx_call_save_unk_text_struct_800641C - ldr r0, _0803EB94 - ldrb r0, [r0] - cmp r0, 0 - bne _0803EB88 - b _0803EC84 -_0803EB88: - bl sub_8040A84 - movs r0, 0 - bl sub_8040ABC - b _0803EC84 - .align 2, 0 -_0803EB94: .4byte gUnknown_203B40C -_0803EB98: - ldr r0, _0803EBB4 - movs r1, 0x1 - movs r2, 0x1 - bl xxx_call_save_unk_text_struct_800641C - ldr r0, _0803EBB8 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EC84 - movs r0, 0x1 - bl sub_8040ABC - b _0803EC84 - .align 2, 0 -_0803EBB4: .4byte gUnknown_80F62B0 -_0803EBB8: .4byte gUnknown_203B40C -_0803EBBC: - ldr r0, _0803EBD4 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EBCA - movs r0, 0 - bl sub_8052210 -_0803EBCA: - bl ResetUnusedInputStruct - ldr r0, _0803EBD8 - movs r1, 0x1 - b _0803EC6E - .align 2, 0 -_0803EBD4: .4byte gUnknown_203B40C -_0803EBD8: .4byte gUnknown_80F6310 -_0803EBDC: - ldr r0, _0803EBF4 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EBEA - movs r0, 0 - bl sub_8052210 -_0803EBEA: - bl ResetUnusedInputStruct - ldr r0, _0803EBF8 - movs r1, 0x1 - b _0803EC6E - .align 2, 0 -_0803EBF4: .4byte gUnknown_203B40C -_0803EBF8: .4byte gUnknown_80F6370 -_0803EBFC: - ldr r0, _0803EC18 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EC0A - movs r0, 0 - bl sub_8052210 -_0803EC0A: - bl ResetUnusedInputStruct - bl sub_803EC94 - movs r0, 0 - movs r1, 0x1 - b _0803EC6E - .align 2, 0 -_0803EC18: .4byte gUnknown_203B40C -_0803EC1C: - ldr r0, _0803EC30 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EC2A - movs r0, 0 - bl sub_8052210 -_0803EC2A: - movs r0, 0 - movs r1, 0x1 - b _0803EC6E - .align 2, 0 -_0803EC30: .4byte gUnknown_203B40C -_0803EC34: - ldr r0, _0803EC50 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EC46 - bl sub_8083D44 - movs r0, 0 - bl sub_8052210 -_0803EC46: - movs r0, 0x2 - adds r1, r5, 0 - bl CreateConfirmNameMenu - b _0803EC84 - .align 2, 0 -_0803EC50: .4byte gUnknown_203B40C -_0803EC54: - ldr r0, _0803EC78 - ldrb r0, [r0] - cmp r0, 0 - beq _0803EC66 - movs r0, 0 - bl sub_8052210 - bl sub_8083D44 -_0803EC66: - bl ResetUnusedInputStruct - ldr r0, _0803EC7C - movs r1, 0 -_0803EC6E: - movs r2, 0x1 - bl xxx_call_save_unk_text_struct_800641C - b _0803EC84 - .align 2, 0 -_0803EC78: .4byte gUnknown_203B40C -_0803EC7C: .4byte gUnknown_80F63D0 -_0803EC80: - bl sub_8083D44 -_0803EC84: - ldr r0, _0803EC90 - str r4, [r0] -_0803EC88: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803EC90: .4byte gUnknown_202EDD0 - thumb_func_end sub_803EAF0 - - thumb_func_start sub_803EC94 -sub_803EC94: - push {lr} - ldr r0, _0803ECB0 - movs r1, 0 - strh r1, [r0, 0x1E] - strh r1, [r0, 0x20] - strh r1, [r0, 0xC] - strh r1, [r0, 0xE] - strh r1, [r0, 0x14] - adds r0, 0x28 - bl sub_801317C - pop {r0} - bx r0 - .align 2, 0 -_0803ECB0: .4byte gUnknown_202EE10 - thumb_func_end sub_803EC94 - - thumb_func_start sub_803ECB4 -sub_803ECB4: - push {r4,r5,lr} - adds r5, r0, 0 - lsls r4, r1, 24 - lsrs r4, 24 - ldr r1, _0803ECDC - movs r0, 0xA - str r0, [r1] - movs r0, 0 - bl sub_8052210 - bl ResetUnusedInputStruct - adds r0, r5, 0 - movs r1, 0x1 - adds r2, r4, 0 - bl xxx_call_save_unk_text_struct_800641C - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803ECDC: .4byte gUnknown_202EDD0 - thumb_func_end sub_803ECB4 - - thumb_func_start sub_803ECE0 -sub_803ECE0: - push {lr} - ldr r1, _0803ED24 - ldr r0, [r1] - adds r0, 0x1 - str r0, [r1] - cmp r0, 0 - bge _0803ECF2 - movs r0, 0 - str r0, [r1] -_0803ECF2: - ldr r0, [r1] - cmp r0, 0xB - ble _0803ECFC - movs r0, 0 - str r0, [r1] -_0803ECFC: - ldr r0, _0803ED28 - ldr r2, [r0] - ldr r0, [r1] - cmp r0, 0 - bge _0803ED08 - adds r0, 0x3 -_0803ED08: - asrs r1, r0, 2 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 6 - ldr r1, [r2, 0x4] - adds r1, r0 - movs r2, 0x90 - lsls r2, 2 - ldr r0, _0803ED2C - bl sub_80098BC - pop {r0} - bx r0 - .align 2, 0 -_0803ED24: .4byte gUnknown_202EDD8 -_0803ED28: .4byte gUnknown_202EC94 -_0803ED2C: .4byte 0x06014400 - thumb_func_end sub_803ECE0 - - thumb_func_start sub_803ED30 -sub_803ED30: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r5, r0, 0 - adds r7, r1, 0 - mov r9, r3 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - cmp r5, 0 - beq _0803EDDA - ldr r0, _0803EDAC - ldr r0, [r0] - ldr r1, _0803EDB0 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _0803EDDA - movs r4, 0 - ldr r1, _0803EDB4 - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _0803ED78 - adds r6, r1, 0 -_0803ED64: - movs r0, 0x29 - bl sub_803E46C - adds r4, 0x1 - cmp r4, 0x13 - bgt _0803ED78 - movs r1, 0 - ldrsh r0, [r6, r1] - cmp r0, 0 - bne _0803ED64 -_0803ED78: - adds r0, r5, 0 - mov r1, r8 - bl sub_803EF90 - ldr r3, _0803EDB4 - movs r2, 0 - movs r1, 0x3C - strh r1, [r3] - str r7, [r3, 0x4] - ldrh r1, [r7, 0x26] - str r1, [r3, 0x8] - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 8 - negs r1, r1 - str r1, [r3, 0xC] - str r2, [r3, 0x10] - mov r2, r9 - cmp r2, 0 - bge _0803EDC8 - ldr r0, _0803EDB8 - cmp r5, r0 - bge _0803EDBC - movs r0, 0x6 - b _0803EDCA - .align 2, 0 -_0803EDAC: .4byte gDungeon -_0803EDB0: .4byte 0x0001820a -_0803EDB4: .4byte gUnknown_202EDE8 -_0803EDB8: .4byte 0xfffffc19 -_0803EDBC: - cmp r5, 0 - blt _0803EDC4 - movs r0, 0xA - b _0803EDCA -_0803EDC4: - movs r0, 0x3 - b _0803EDCA -_0803EDC8: - mov r0, r9 -_0803EDCA: - strh r0, [r3, 0x2] - ldr r0, _0803EDE8 - ldr r1, _0803EDEC - ldr r1, [r1] - adds r1, 0x18 - movs r2, 0x80 - bl sub_80098BC -_0803EDDA: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803EDE8: .4byte 0x060142c0 -_0803EDEC: .4byte gDungeon - thumb_func_end sub_803ED30 - - thumb_func_start sub_803EDF0 -sub_803EDF0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r6, _0803EE18 - movs r1, 0 - ldrsh r0, [r6, r1] - cmp r0, 0 - bne _0803EE06 - b _0803EF42 -_0803EE06: - ldr r0, [r6, 0x4] - bl EntityExists - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _0803EE1C - strh r0, [r6] - b _0803EF42 - .align 2, 0 -_0803EE18: .4byte gUnknown_202EDE8 -_0803EE1C: - ldr r1, [r6, 0x4] - ldr r0, [r6, 0x8] - ldrh r2, [r1, 0x26] - cmp r0, r2 - beq _0803EE2C - movs r0, 0 - strh r0, [r6] - b _0803EF42 -_0803EE2C: - ldrh r0, [r6] - subs r0, 0x1 - strh r0, [r6] - ldr r4, [r6, 0x10] - adds r3, r4, 0 - subs r3, 0x2E - str r3, [r6, 0x10] - ldr r2, [r1, 0x70] - movs r5, 0xB8 - lsls r5, 1 - adds r0, r2, r5 - movs r1, 0 - ldrsh r0, [r0, r1] - ldr r1, [r6, 0xC] - cmp r1, 0 - bge _0803EE4E - adds r1, 0xFF -_0803EE4E: - asrs r1, 8 - adds r1, r0, r1 - ldr r0, _0803EF50 - ldr r0, [r0] - mov r12, r0 - ldr r0, _0803EF54 - add r0, r12 - movs r5, 0 - ldrsh r0, [r0, r5] - subs r7, r1, r0 - movs r1, 0xB9 - lsls r1, 1 - adds r0, r2, r1 - movs r2, 0 - ldrsh r0, [r0, r2] - adds r1, r3, 0 - cmp r1, 0 - bge _0803EE76 - adds r1, r4, 0 - adds r1, 0xD1 -_0803EE76: - asrs r1, 8 - adds r1, r0, r1 - ldr r0, _0803EF58 - add r0, r12 - movs r3, 0 - ldrsh r0, [r0, r3] - adds r0, 0x18 - subs r2, r1, r0 - movs r0, 0x20 - negs r0, r0 - cmp r7, r0 - blt _0803EF42 - adds r0, 0x18 - cmp r2, r0 - blt _0803EF42 - cmp r7, 0xEF - bgt _0803EF42 - cmp r2, 0x9F - bgt _0803EF42 - ldr r1, _0803EF5C - ands r1, r2 - lsls r1, 4 - ldr r0, _0803EF60 - ldrh r2, [r0, 0x6] - movs r4, 0xF - mov r8, r4 - mov r3, r8 - ands r3, r2 - orrs r3, r1 - strh r3, [r0, 0x6] - ldrh r2, [r0] - ldr r1, _0803EF64 - ands r1, r2 - ldr r2, _0803EF68 - ands r1, r2 - movs r5, 0x3 - mov r9, r5 - ldr r2, _0803EF6C - mov r10, r2 - ands r1, r2 - ldr r2, _0803EF70 - ands r1, r2 - ldr r2, _0803EF74 - ands r1, r2 - movs r5, 0x80 - lsls r5, 7 - ldr r4, _0803EF78 - ands r1, r4 - orrs r1, r5 - strh r1, [r0] - ldr r1, _0803EF7C - ands r7, r1 - ldrh r2, [r0, 0x2] - movs r1, 0xFE - lsls r1, 8 - ands r1, r2 - orrs r1, r7 - ldr r2, _0803EF80 - ands r1, r2 - ands r1, r4 - orrs r1, r5 - strh r1, [r0, 0x2] - ldr r4, _0803EF84 - ldrh r2, [r0, 0x4] - movs r1, 0xFC - lsls r1, 8 - ands r1, r2 - orrs r1, r4 - movs r2, 0 - orrs r1, r2 - strh r1, [r0, 0x4] - ldr r2, _0803EF88 - add r2, r12 - ldrb r2, [r2] - mov r4, r9 - ands r2, r4 - lsls r2, 10 - mov r5, r10 - ands r1, r5 - orrs r1, r2 - movs r4, 0x2 - ldrsh r2, [r6, r4] - mov r5, r8 - ands r2, r5 - lsls r2, 12 - ldr r4, _0803EF5C - ands r1, r4 - orrs r1, r2 - strh r1, [r0, 0x4] - ldr r1, _0803EF8C - ands r3, r1 - subs r1, 0x1 - ands r3, r1 - subs r1, 0x2 - ands r3, r1 - strh r3, [r0, 0x6] - movs r1, 0x80 - lsls r1, 1 - movs r2, 0 - movs r3, 0 - bl AddSprite -_0803EF42: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803EF50: .4byte gDungeon -_0803EF54: .4byte 0x000181f0 -_0803EF58: .4byte 0x000181f2 -_0803EF5C: .4byte 0x00000fff -_0803EF60: .4byte gUnknown_202EDDC -_0803EF64: .4byte 0x0000feff -_0803EF68: .4byte 0x0000fdff -_0803EF6C: .4byte 0x0000f3ff -_0803EF70: .4byte 0x0000efff -_0803EF74: .4byte 0x0000dfff -_0803EF78: .4byte 0x00003fff -_0803EF7C: .4byte 0x000001ff -_0803EF80: .4byte 0x0000c1ff -_0803EF84: .4byte 0x00000216 -_0803EF88: .4byte 0x00018208 -_0803EF8C: .4byte 0x0000fffe - thumb_func_end sub_803EDF0 - thumb_func_start sub_803EF90 sub_803EF90: push {r4-r7,lr} diff --git a/include/code_8009804.h b/include/code_8009804.h index 11de16a16..d698ffa59 100644 --- a/include/code_8009804.h +++ b/include/code_8009804.h @@ -5,7 +5,7 @@ struct unkStruct_202D240 { u32 *unk0; - u32 *unk4; + const u32 *unk4; u32 size; }; @@ -19,7 +19,7 @@ void vram_related_8009804(void); void InitFontPalette(void); void sub_80098A0(void); -void sub_80098BC(u32 *, u32 *, u32); +void sub_80098BC(u32 *, const u32 *, u32); void sub_80098F8(u32); void sub_8009908(void); void sub_80099C0(void); diff --git a/include/cpu.h b/include/cpu.h index 4d3459db4..9042fa8a2 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -2,7 +2,7 @@ #define GUARD_CPU_H void CpuClear(void *, s32); -void CpuCopy(void *, void *, s32); +void CpuCopy(void *dest, const void *src, s32 size); void nullsub_23(bool8); void SetWindowTitle(u8 *); void sub_800CDA8(u32); diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index a22886bcb..8c4f56fc4 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -180,7 +180,7 @@ typedef struct Dungeon u8 unk11; s16 unk12; s16 unk14; - u8 fill14[0xB8 - 0x16]; + u32 unk18[(0xB8 - 0x18) / 4]; Entity *unkB8; Entity *unkBC; u8 fillC0[0x13C - 0xC0]; diff --git a/include/text1.h b/include/text1.h index c2e068b62..81468c476 100644 --- a/include/text1.h +++ b/include/text1.h @@ -13,6 +13,6 @@ void SelectCharmap(u32); u32 UpdateFadeInTile(u32 a0); u32 sub_80063B0(void); -void xxx_call_save_unk_text_struct_800641C(UnkTextStruct2 *a0, bool8 a1, bool8 a2); +void xxx_call_save_unk_text_struct_800641C(const UnkTextStruct2 *a0, bool8 a1, bool8 a2); -#endif // GUARD_TEXT1_H \ No newline at end of file +#endif // GUARD_TEXT1_H diff --git a/src/code_8009804.c b/src/code_8009804.c index b57403083..50bb2c15c 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -79,7 +79,7 @@ void sub_80098A0(void) gUnknown_202D238[3] = 0; } -void sub_80098BC(u32 *r0, u32 *r1, u32 r2) +void sub_80098BC(u32 *r0, const u32 *r1, u32 r2) { if (gUnknown_202D23C < 8) { gUnknown_202D240[gUnknown_202D23C].unk0 = r0; diff --git a/src/code_803E724.c b/src/code_803E724.c index 000db2df5..9e8cb18a5 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -2,8 +2,18 @@ #include "dungeon.h" #include "bg_palette_buffer.h" #include "code_8004AA0.h" +#include "input.h" +#include "text1.h" +#include "code_801602C.h" +#include "menu_input.h" +#include "code_8009804.h" +#include "code_803E46C.h" +#include "dungeon_util.h" +#include "sprite.h" extern s32 gUnknown_202EDC8; +extern u32 gUnknown_202EDD0; +extern s32 gUnknown_202EDD8; struct DungeonPalFile { @@ -13,11 +23,18 @@ struct DungeonPalFile extern struct DungeonPalFile *gDungeonPaletteFile; extern struct DungeonPalFile *gDungeonNameBannerPalette; +extern struct DungeonPalFile *gUnknown_202EC94; extern u8 gUnknown_202ECA4[]; extern u8 gUnknown_202D058[]; extern const u8 gUnknown_80F62AC[]; +extern void sub_8052210(u32); +extern void sub_8040A84(); +extern void sub_8083D44(void); + +void sub_803EC94(void); + void sub_803E874(bool8 r10, s32 r9) { s32 i, index, count; @@ -117,3 +134,260 @@ void sub_803EA10(void) SetBGPaletteBufferColorRGB(248, gUnknown_202D058, gUnknown_202EDC8, NULL); } + +extern u8 gUnknown_203B40C; + +extern const struct UnkTextStruct2 gUnknown_80F62B0[]; +extern const struct UnkTextStruct2 gUnknown_80F6310[]; +extern const struct UnkTextStruct2 gUnknown_80F6370[]; +extern const struct UnkTextStruct2 gUnknown_80F63D0[]; + +void sub_8040ABC(u8 a0); + +void sub_803EAF0(u32 a0, u8 *a1) +{ + if (a0 == gUnknown_202EDD0) + return; + + switch (a0) { + case 1: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + } + ResetUnusedInputStruct(); + sub_803EC94(); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); + break; + case 0: + sub_803EC94(); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); + if (gUnknown_203B40C != 0) { + sub_8040A84(); + sub_8040ABC(0); + } + break; + case 3: + xxx_call_save_unk_text_struct_800641C(gUnknown_80F62B0, TRUE, TRUE); + if (gUnknown_203B40C != 0) { + sub_8040ABC(1); + } + break; + case 6: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + } + ResetUnusedInputStruct(); + xxx_call_save_unk_text_struct_800641C(gUnknown_80F6310, TRUE, TRUE); + break; + case 7: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + } + ResetUnusedInputStruct(); + xxx_call_save_unk_text_struct_800641C(gUnknown_80F6370, TRUE, TRUE); + break; + case 2: + case 4: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + } + ResetUnusedInputStruct(); + sub_803EC94(); + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); + break; + case 5: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + } + xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); + break; + case 8: + if (gUnknown_203B40C != 0) { + sub_8083D44(); + sub_8052210(0); + } + CreateConfirmNameMenu(2, a1); + break; + case 9: + if (gUnknown_203B40C != 0) { + sub_8052210(0); + sub_8083D44(); + } + ResetUnusedInputStruct(); + xxx_call_save_unk_text_struct_800641C(gUnknown_80F63D0, FALSE, TRUE); + break; + case 10: + sub_8083D44(); + break; + case 150: // Dummy case put here to match, any value >= 150 works + break; + } + + gUnknown_202EDD0 = a0; +} + +extern MenuInputStruct gUnknown_202EE10; + +void sub_803EC94(void) +{ + gUnknown_202EE10.unk1E = 0; + gUnknown_202EE10.unk20 = 0; + gUnknown_202EE10.unkC = 0; + gUnknown_202EE10.unkE = 0; + gUnknown_202EE10.unk14.x = 0; + sub_801317C(&gUnknown_202EE10.unk28); +} + +extern void sub_8052210(u32); + +void sub_803ECB4(UnkTextStruct2 *a0, bool8 a1) +{ + gUnknown_202EDD0 = 10; + sub_8052210(0); + ResetUnusedInputStruct(); + xxx_call_save_unk_text_struct_800641C(a0, TRUE, a1); +} + +void sub_803ECE0(void) +{ + gUnknown_202EDD8++; + if (gUnknown_202EDD8 < 0) + gUnknown_202EDD8 = 0; + if (gUnknown_202EDD8 > 11) + gUnknown_202EDD8 = 0; + + sub_80098BC((void *)VRAM + 0x14400, gUnknown_202EC94->unk4 + ((gUnknown_202EDD8 / 4) * 0x240), 0x240); +} + +s32 sub_803EF90(s32 a0, u8 a1); + +struct UnkStruct_202EDE8 +{ + s16 unk0; + s16 unk2; + Entity *unk4; + s32 unk8; + s32 unkC; + s32 unk10; +}; + +extern struct UnkStruct_202EDE8 gUnknown_202EDE8; + +void sub_803ED30(s32 a0, Entity *mon, u8 a2, s32 a3) +{ + s32 i, var; + + if (a0 == 0 || gDungeon->unk181e8.blinded) + return; + + for (i = 0; i < 20; i++) { + if (gUnknown_202EDE8.unk0 == 0) + break; + sub_803E46C(0x29); + } + + var = sub_803EF90(a0, a2); + gUnknown_202EDE8.unk0 = 60; + gUnknown_202EDE8.unk4 = mon; + gUnknown_202EDE8.unk8 = mon->spawnGenID; + gUnknown_202EDE8.unkC = -(var * 768); + gUnknown_202EDE8.unk10 = 0; + + if (a3 < 0) { + if (a0 < -999) { + gUnknown_202EDE8.unk2 = 6; + } + else if (a0 >= 0) { + gUnknown_202EDE8.unk2 = 10; + } + else { + gUnknown_202EDE8.unk2 = 3; + } + } + else { + gUnknown_202EDE8.unk2 = a3; + } + + sub_80098BC((void *) VRAM + 0x142C0, gDungeon->unk18, 0x80); +} + +SpriteOAM gUnknown_202EDDC; + +void sub_803EDF0(void) +{ + EntityInfo *entInfo; + s32 x, y, y1, y2; + + if (gUnknown_202EDE8.unk0 == 0) + return; + if (!EntityExists(gUnknown_202EDE8.unk4)) { + gUnknown_202EDE8.unk0 = 0; + return; + } + if (gUnknown_202EDE8.unk8 != gUnknown_202EDE8.unk4->spawnGenID) { + gUnknown_202EDE8.unk0 = 0; + return; + } + + gUnknown_202EDE8.unk0--; + gUnknown_202EDE8.unk10 -= 46; + entInfo = GetEntInfo(gUnknown_202EDE8.unk4); + x = (entInfo->pixelPos.x + (gUnknown_202EDE8.unkC / 256)) - gDungeon->unk181e8.cameraPixelPos.x; + y1 = (entInfo->pixelPos.y + (gUnknown_202EDE8.unk10 / 256)); + y2 = (gDungeon->unk181e8.cameraPixelPos.y + 24); + y = y1 - y2; + + // sprite oam memes strike again + if (x >= -32 && y >= -8 && x < 240 && y < 160) { + u32 r9; + u32 unk6; + u32 shape, spriteX, palNum, prio, tileNum; + + unk6 = y & SPRITEOAM_MAX_UNK6_4; + unk6 <<= SPRITEOAM_SHIFT_UNK6_4; + gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_4; + gUnknown_202EDDC.unk6 |= unk6; + + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; + r9 = 3; + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_BPP; + + shape = 1 << SPRITEOAM_SHIFT_SHAPE; + gUnknown_202EDDC.attrib1 &= ~SPRITEOAM_MASK_SHAPE; + gUnknown_202EDDC.attrib1 |= shape; + + spriteX = x & SPRITEOAM_MAX_X; + gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_X; + gUnknown_202EDDC.attrib2 |= spriteX; + + gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; + gUnknown_202EDDC.attrib2 &= ~SPRITEOAM_MASK_SIZE; + gUnknown_202EDDC.attrib2 |= 1 << SPRITEOAM_SHIFT_SIZE; + + tileNum = 0x216 << SPRITEOAM_SHIFT_TILENUM; + gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_TILENUM; + gUnknown_202EDDC.attrib3 |= tileNum; + + prio = gDungeon->unk181e8.unk18208 & r9; + prio <<= SPRITEOAM_SHIFT_PRIORITY; + gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; + gUnknown_202EDDC.attrib3 |= prio; + + palNum = gUnknown_202EDE8.unk2; + palNum &= 0xF; + palNum <<= SPRITEOAM_SHIFT_PALETTENUM; + gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; + gUnknown_202EDDC.attrib3 |= palNum; + + gUnknown_202EDDC.unk6 &= 0xFFFE; + gUnknown_202EDDC.unk6 &= 0xFFFD; + gUnknown_202EDDC.unk6 &= 0xFFFB; + + AddSprite(&gUnknown_202EDDC, 0x100, NULL, NULL); + } +} + +// diff --git a/src/cpu.c b/src/cpu.c index 862a611ef..d0c6a2338 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -35,7 +35,7 @@ UNUSED static bool8 sub_800CDE0(void) return TRUE; } -void CpuCopy(void *dest, void *src, s32 size) +void CpuCopy(void *dest, const void *src, s32 size) { CpuCopy32(src, dest, size); } diff --git a/src/text1.c b/src/text1.c index a46d98b37..4908b3176 100644 --- a/src/text1.c +++ b/src/text1.c @@ -144,7 +144,7 @@ void SetCharacterMask(int a0) } // TODO: Move xxx_call_save_unk_text_struct_800641C and SaveUnkTextStructAndXXX_8006438 to text2.c ? data.s shows text1 and text2 are merged somehow but not fully -void xxx_call_save_unk_text_struct_800641C(UnkTextStruct2 *a0, bool8 a1, bool8 a2) +void xxx_call_save_unk_text_struct_800641C(const UnkTextStruct2 *a0, bool8 a1, bool8 a2) { UnkTextStruct2_sub r3 = {0, 0}; SaveUnkTextStructAndXXX_8006438(a0, a1, a2, &r3); @@ -186,4 +186,4 @@ static void SaveUnkTextStructAndXXX_8006438(const UnkTextStruct2 *a0, bool8 a1, ptr1 = &gUnknown_20274A5; *ptr2 = ptr0; *ptr1 = 1; -} \ No newline at end of file +} From 94b0d1ceddfe3287ef1541661431c6314e92905e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 8 Oct 2024 09:40:32 +0200 Subject: [PATCH 4/8] sub_803F580 --- asm/code_803E724.s | 1067 --------------------------------- include/bg_palette_buffer.h | 2 +- include/structs/str_dungeon.h | 72 +-- src/bg_palette_buffer.c | 2 +- src/code_803E724.c | 685 ++++++++++++++++++++- 5 files changed, 724 insertions(+), 1104 deletions(-) diff --git a/asm/code_803E724.s b/asm/code_803E724.s index 8c7ffbc71..2c9578003 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -6,1073 +6,6 @@ .text - thumb_func_start sub_803EF90 -sub_803EF90: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x58 - str r0, [sp, 0x48] - lsls r1, 24 - lsrs r5, r1, 24 - ldr r0, _0803F060 - ldr r0, [r0] - adds r0, 0x18 - mov r8, r0 - ldr r0, _0803F064 - ldr r1, [r0] - ldr r0, [r1, 0x4] - movs r2, 0x92 - lsls r2, 1 - adds r0, r2 - str r0, [sp, 0x24] - ldr r0, [r1, 0x4] - movs r3, 0x82 - lsls r3, 1 - adds r0, r3 - str r0, [sp, 0x28] - ldr r0, [r1, 0x4] - adds r0, 0xE4 - str r0, [sp, 0x2C] - ldr r0, [r1, 0x4] - adds r0, 0xC4 - str r0, [sp, 0x30] - ldr r0, [r1, 0x4] - adds r0, 0xA4 - str r0, [sp, 0x34] - ldr r0, [r1, 0x4] - adds r0, 0x84 - str r0, [sp, 0x38] - ldr r0, [r1, 0x4] - adds r0, 0x64 - str r0, [sp, 0x3C] - ldr r0, [r1, 0x4] - adds r0, 0x44 - str r0, [sp, 0x40] - ldr r0, [r1, 0x4] - adds r0, 0x24 - str r0, [sp, 0x44] - add r4, sp, 0x24 - mov r0, sp - adds r1, r4, 0 - movs r2, 0x24 - bl memcpy - movs r1, 0 - movs r6, 0x3 - mov r0, r8 -_0803EFFE: - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - stm r0!, {r1} - subs r6, 0x1 - cmp r6, 0 - bge _0803EFFE - ldr r0, _0803F068 - ldr r1, [sp, 0x48] - cmp r1, r0 - bne _0803F0A6 - adds r0, r4, 0 - ldr r1, _0803F06C - ldm r1!, {r2,r3,r5} - stm r0!, {r2,r3,r5} - ldr r1, [r1] - str r1, [r0] - movs r5, 0 - movs r2, 0 - mov r12, r4 - movs r0, 0x20 - mov r10, r0 -_0803F032: - mov r3, r8 - ldr r0, _0803F064 - ldr r1, [r0] - lsls r0, r2, 2 - add r0, r12 - ldr r0, [r0] - lsls r0, 5 - adds r0, 0x4 - ldr r1, [r1, 0x4] - adds r4, r1, r0 - movs r1, 0x18 - adds r1, r5 - mov r9, r1 - adds r2, 0x1 - str r2, [sp, 0x54] - mov r2, r10 - subs r7, r2, r5 - movs r6, 0x7 -_0803F056: - cmp r5, 0 - bne _0803F070 - movs r1, 0 - ldr r2, [r4] - b _0803F07A - .align 2, 0 -_0803F060: .4byte gDungeon -_0803F064: .4byte gUnknown_202EC9C -_0803F068: .4byte 0x0000270f -_0803F06C: .4byte gUnknown_80F6478 -_0803F070: - ldr r0, [r4] - adds r1, r0, 0 - lsrs r1, r7 - adds r2, r0, 0 - lsls r2, r5 -_0803F07A: - adds r4, 0x4 - ldr r0, [r3] - orrs r0, r2 - str r0, [r3] - ldr r0, [r3, 0x20] - orrs r0, r1 - str r0, [r3, 0x20] - adds r3, 0x4 - subs r6, 0x1 - cmp r6, 0 - bge _0803F056 - mov r5, r9 - cmp r5, 0x1F - ble _0803F09C - subs r5, 0x20 - movs r3, 0x20 - add r8, r3 -_0803F09C: - ldr r2, [sp, 0x54] - cmp r2, 0x3 - ble _0803F032 - movs r0, 0x4 - b _0803F26A -_0803F0A6: - ldr r0, _0803F0D8 - ldr r1, [sp, 0x48] - cmp r1, r0 - ble _0803F0B0 - str r0, [sp, 0x48] -_0803F0B0: - ldr r0, _0803F0DC - ldr r2, [sp, 0x48] - cmp r2, r0 - bge _0803F0BA - str r0, [sp, 0x48] -_0803F0BA: - ldr r1, _0803F0E0 - ldr r0, [r1] - ldr r0, [r0, 0x4] - movs r3, 0xC2 - lsls r3, 1 - adds r2, r0, r3 - cmp r5, 0 - beq _0803F0F4 - ldr r5, [sp, 0x48] - cmp r5, 0 - ble _0803F0E4 - movs r1, 0xA2 - lsls r1, 1 - adds r2, r0, r1 - b _0803F0F4 - .align 2, 0 -_0803F0D8: .4byte 0x000003e7 -_0803F0DC: .4byte 0xfffffc19 -_0803F0E0: .4byte gUnknown_202EC9C -_0803F0E4: - ldr r3, [sp, 0x48] - cmp r3, 0 - bge _0803F0F4 - movs r5, 0xB2 - lsls r5, 1 - adds r2, r0, r5 - negs r3, r3 - str r3, [sp, 0x48] -_0803F0F4: - ldm r2!, {r0} - mov r1, r8 - str r0, [r1] - ldm r2!, {r0} - str r0, [r1, 0x4] - ldm r2!, {r0} - str r0, [r1, 0x8] - ldm r2!, {r0} - str r0, [r1, 0xC] - ldm r2!, {r0} - str r0, [r1, 0x10] - ldm r2!, {r0} - str r0, [r1, 0x14] - ldm r2!, {r0} - str r0, [r1, 0x18] - ldr r0, [r2] - str r0, [r1, 0x1C] - movs r5, 0x18 - movs r2, 0x1 - str r2, [sp, 0x4C] - movs r3, 0 - str r3, [sp, 0x50] - movs r2, 0 -_0803F122: - movs r0, 0 - mov r10, r0 - adds r1, r2, 0x1 - str r1, [sp, 0x54] - lsls r0, r2, 3 - adds r0, r2 - lsls r0, 2 - mov r1, sp - ldr r2, _0803F15C - adds r7, r0, r2 -_0803F136: - ldr r0, [r7] - ldr r3, [sp, 0x48] - cmp r0, r3 - bgt _0803F1A2 - ldr r4, [r1] - mov r2, r8 - movs r0, 0x18 - adds r0, r5 - mov r9, r0 - movs r1, 0x20 - subs r1, r5 - mov r12, r1 - movs r6, 0x7 -_0803F150: - cmp r5, 0 - bne _0803F160 - movs r3, 0 - ldr r1, [r4] - b _0803F16C - .align 2, 0 -_0803F15C: .4byte gUnknown_80F6430 -_0803F160: - ldr r0, [r4] - adds r3, r0, 0 - mov r1, r12 - lsrs r3, r1 - adds r1, r0, 0 - lsls r1, r5 -_0803F16C: - adds r4, 0x4 - ldr r0, [r2] - orrs r0, r1 - str r0, [r2] - ldr r0, [r2, 0x20] - orrs r0, r3 - str r0, [r2, 0x20] - adds r2, 0x4 - movs r3, 0x1 - str r3, [sp, 0x50] - subs r6, 0x1 - cmp r6, 0 - bge _0803F150 - mov r5, r9 - cmp r5, 0x1F - ble _0803F192 - subs r5, 0x20 - movs r0, 0x20 - add r8, r0 -_0803F192: - ldr r0, [r7] - ldr r1, [sp, 0x48] - subs r1, r0 - str r1, [sp, 0x48] - ldr r2, [sp, 0x4C] - adds r2, 0x1 - str r2, [sp, 0x4C] - b _0803F1B0 -_0803F1A2: - adds r1, 0x4 - adds r7, 0x4 - movs r3, 0x1 - add r10, r3 - mov r0, r10 - cmp r0, 0x8 - ble _0803F136 -_0803F1B0: - mov r1, r10 - cmp r1, 0x9 - bne _0803F212 - ldr r2, [sp, 0x50] - cmp r2, 0 - beq _0803F212 - ldr r3, _0803F1DC - ldr r0, [r3] - ldr r0, [r0, 0x4] - adds r4, r0, 0x4 - mov r2, r8 - movs r0, 0x18 - adds r0, r5 - mov r9, r0 - movs r1, 0x20 - subs r7, r1, r5 - movs r6, 0x7 -_0803F1D2: - cmp r5, 0 - bne _0803F1E0 - movs r3, 0 - ldr r1, [r4] - b _0803F1EA - .align 2, 0 -_0803F1DC: .4byte gUnknown_202EC9C -_0803F1E0: - ldr r0, [r4] - adds r3, r0, 0 - lsrs r3, r7 - adds r1, r0, 0 - lsls r1, r5 -_0803F1EA: - adds r4, 0x4 - ldr r0, [r2] - orrs r0, r1 - str r0, [r2] - ldr r0, [r2, 0x20] - orrs r0, r3 - str r0, [r2, 0x20] - adds r2, 0x4 - subs r6, 0x1 - cmp r6, 0 - bge _0803F1D2 - mov r5, r9 - cmp r5, 0x1F - ble _0803F20C - subs r5, 0x20 - movs r2, 0x20 - add r8, r2 -_0803F20C: - ldr r3, [sp, 0x4C] - adds r3, 0x1 - str r3, [sp, 0x4C] -_0803F212: - ldr r2, [sp, 0x54] - cmp r2, 0x1 - ble _0803F122 - ldr r0, _0803F240 - ldr r1, [r0] - ldr r2, [sp, 0x48] - lsls r0, r2, 5 - adds r0, 0x4 - ldr r1, [r1, 0x4] - adds r1, r0 - mov r3, r8 - ldr r0, [sp, 0x4C] - adds r0, 0x1 - mov r8, r0 - movs r0, 0x20 - subs r7, r0, r5 - movs r6, 0x7 -_0803F234: - cmp r5, 0 - bne _0803F244 - movs r4, 0 - ldr r2, [r1] - b _0803F24E - .align 2, 0 -_0803F240: .4byte gUnknown_202EC9C -_0803F244: - ldr r0, [r1] - adds r4, r0, 0 - lsrs r4, r7 - adds r2, r0, 0 - lsls r2, r5 -_0803F24E: - adds r1, 0x4 - ldr r0, [r3] - orrs r0, r2 - str r0, [r3] - ldr r0, [r3, 0x20] - orrs r0, r4 - str r0, [r3, 0x20] - adds r3, 0x4 - subs r6, 0x1 - cmp r6, 0 - bge _0803F234 - mov r1, r8 - str r1, [sp, 0x4C] - adds r0, r1, 0 -_0803F26A: - add sp, 0x58 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_803EF90 - - thumb_func_start sub_803F27C -sub_803F27C: - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r0, 24 - adds r7, r0, 0 - ldr r0, _0803F360 - mov r8, r0 - ldr r4, [r0] - ldr r2, _0803F364 - adds r1, r4, r2 - movs r2, 0 - movs r3, 0 - strh r3, [r1, 0x8] - strh r3, [r1, 0xA] - strh r3, [r1] - strh r3, [r1, 0x2] - strh r3, [r1, 0xC] - strh r3, [r1, 0xE] - strh r3, [r1, 0x4] - strh r3, [r1, 0x6] - str r3, [r1, 0x14] - ldr r5, _0803F368 - adds r0, r4, r5 - strb r2, [r0] - ldr r6, _0803F36C - adds r0, r4, r6 - movs r5, 0x1 - strb r5, [r0] - adds r6, 0x1 - adds r0, r4, r6 - strb r5, [r0] - adds r6, 0x1 - adds r0, r4, r6 - strb r2, [r0] - str r3, [r1, 0x18] - str r3, [r1, 0x1C] - cmp r7, 0 - bne _0803F2FA - subs r6, 0xF - adds r0, r4, r6 - strb r2, [r0] - adds r6, 0x6 - adds r0, r4, r6 - strb r2, [r0] - subs r6, 0x1 - adds r0, r4, r6 - strb r2, [r0] - subs r6, 0x2 - adds r0, r4, r6 - strb r2, [r0] - adds r6, 0x4 - adds r0, r4, r6 - strb r2, [r0] - subs r6, 0x3 - adds r0, r4, r6 - strb r2, [r0] - subs r6, 0x3 - adds r0, r4, r6 - strb r2, [r0] - adds r6, 0x1 - adds r0, r4, r6 - strb r2, [r0] -_0803F2FA: - str r3, [r1, 0x10] - ldr r1, _0803F370 - adds r0, r4, r1 - movs r6, 0x3 - strb r6, [r0] - adds r1, 0x12 - adds r0, r4, r1 - strb r2, [r0] - subs r1, 0x8 - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x9 - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x1 - adds r0, r4, r1 - strb r2, [r0] - subs r1, 0x8 - adds r0, r4, r1 - strb r2, [r0] - ldr r2, _0803F374 - adds r0, r4, r2 - strb r5, [r0] - bl sub_803F38C - ldr r1, _0803F378 - ldr r0, _0803F37C - str r0, [r1] - cmp r7, 0 - bne _0803F354 - mov r1, r8 - ldr r0, [r1] - ldr r2, _0803F380 - adds r0, r2 - ldrb r1, [r0] - adds r0, r6, 0 - ands r0, r1 - ldr r6, _0803F384 - adds r1, r4, r6 - strb r0, [r1] - cmp r0, 0 - bne _0803F354 - ldr r1, _0803F388 - adds r0, r4, r1 - strb r5, [r0] -_0803F354: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803F360: .4byte gDungeon -_0803F364: .4byte 0x000181e8 -_0803F368: .4byte 0x00018216 -_0803F36C: .4byte 0x00018217 -_0803F370: .4byte 0x00018208 -_0803F374: .4byte 0x00018215 -_0803F378: .4byte gUnknown_202EDFC -_0803F37C: .4byte 0x0000ffff -_0803F380: .4byte 0x0001c58a -_0803F384: .4byte 0x00018209 -_0803F388: .4byte 0x0001820c - thumb_func_end sub_803F27C - - thumb_func_start sub_803F38C -sub_803F38C: - push {r4-r6,lr} - mov r6, r8 - push {r6} - ldr r0, _0803F410 - ldr r1, [r0] - ldr r0, _0803F414 - adds r2, r1, r0 - ldr r0, _0803F418 - strh r0, [r2, 0x3A] - movs r0, 0x1 - negs r0, r0 - strh r0, [r2, 0x3C] - strh r0, [r2, 0x3E] - ldr r0, _0803F41C - adds r1, r0 - movs r0, 0x1 - negs r0, r0 - strh r0, [r1] - strh r0, [r2, 0x36] - strh r0, [r2, 0x38] - ldr r0, _0803F420 - ldr r0, [r0] - ldrb r0, [r0, 0xB] - negs r4, r0 - orrs r4, r0 - asrs r4, 31 - movs r0, 0x80 - lsls r0, 1 - ands r4, r0 - ldr r5, _0803F424 - adds r0, r4, r5 - mov r8, r0 - movs r0, 0xFD - mov r1, r8 - bl SetBGPaletteBufferColorArray - adds r6, r5, 0x4 - adds r6, r4, r6 - movs r0, 0xFE - adds r1, r6, 0 - bl SetBGPaletteBufferColorArray - adds r5, 0x8 - adds r4, r5 - movs r0, 0xFF - adds r1, r4, 0 - bl SetBGPaletteBufferColorArray - movs r0, 0xFD - mov r1, r8 - bl nullsub_5 - movs r0, 0xFE - adds r1, r6, 0 - bl nullsub_5 - movs r0, 0xFF - adds r1, r4, 0 - bl nullsub_5 - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0803F410: .4byte gDungeon -_0803F414: .4byte 0x000181e8 -_0803F418: .4byte 0x0000ffff -_0803F41C: .4byte 0x00018228 -_0803F420: .4byte gGameOptionsRef -_0803F424: .4byte gUnknown_202D06C - thumb_func_end sub_803F38C - - thumb_func_start sub_803F428 -sub_803F428: - push {r4-r6,lr} - adds r4, r0, 0 - ldr r0, _0803F484 - ldr r3, [r0] - ldr r0, _0803F488 - adds r2, r3, r0 - ldr r5, [r2, 0x10] - movs r6, 0 - ldrsh r1, [r2, r6] - movs r6, 0 - ldrsh r0, [r4, r6] - subs r1, r0 - cmp r1, 0 - bge _0803F446 - negs r1, r1 -_0803F446: - cmp r1, 0x6 - bgt _0803F498 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r6, 0x2 - ldrsh r0, [r4, r6] - subs r1, r0 - cmp r1, 0 - bge _0803F45A - negs r1, r1 -_0803F45A: - cmp r1, 0x5 - bgt _0803F498 - ldr r1, _0803F48C - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F494 - ldr r6, _0803F490 - adds r0, r3, r6 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F494 - cmp r5, 0 - beq _0803F494 - adds r0, r2, 0 - adds r1, r4, 0 - bl IsPositionActuallyInSight - lsls r0, 24 - lsrs r0, 24 - b _0803F49A - .align 2, 0 -_0803F484: .4byte gDungeon -_0803F488: .4byte 0x000181e8 -_0803F48C: .4byte 0x0001820b -_0803F490: .4byte 0x0001820c -_0803F494: - movs r0, 0x1 - b _0803F49A -_0803F498: - movs r0, 0 -_0803F49A: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_803F428 - - thumb_func_start sub_803F4A0 -sub_803F4A0: - push {lr} - adds r2, r0, 0 - ldr r0, _0803F4B8 - ldr r1, [r0] - ldr r3, _0803F4BC - adds r0, r1, r3 - str r2, [r0, 0x10] - cmp r2, 0 - bne _0803F4C0 - adds r3, 0x2E - b _0803F4CA - .align 2, 0 -_0803F4B8: .4byte gDungeon -_0803F4BC: .4byte 0x000181e8 -_0803F4C0: - ldr r0, [r2, 0x70] - ldrb r2, [r0, 0x7] - cmp r2, 0 - bne _0803F4D4 - ldr r3, _0803F4D0 -_0803F4CA: - adds r0, r1, r3 - strb r2, [r0] - b _0803F4DC - .align 2, 0 -_0803F4D0: .4byte 0x00018216 -_0803F4D4: - ldr r0, _0803F4FC - adds r1, r0 - movs r0, 0x1 - strb r0, [r1] -_0803F4DC: - movs r0, 0 - bl sub_803F580 - bl sub_803F38C - ldr r0, _0803F500 - ldr r0, [r0] - ldr r1, _0803F504 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F4F8 - bl sub_806CD90 -_0803F4F8: - pop {r0} - bx r0 - .align 2, 0 -_0803F4FC: .4byte 0x00018216 -_0803F500: .4byte gDungeon -_0803F504: .4byte 0x0001356c - thumb_func_end sub_803F4A0 - - thumb_func_start sub_803F508 -sub_803F508: - push {r4,r5,lr} - adds r3, r0, 0 - ldr r0, _0803F520 - ldr r1, [r0] - ldr r0, _0803F524 - adds r4, r1, r0 - cmp r3, 0 - bne _0803F52C - ldr r2, _0803F528 - adds r0, r1, r2 - strb r3, [r0] - b _0803F548 - .align 2, 0 -_0803F520: .4byte gDungeon -_0803F524: .4byte 0x000181e8 -_0803F528: .4byte 0x00018216 -_0803F52C: - ldr r0, [r3, 0x70] - ldrb r2, [r0, 0x7] - cmp r2, 0 - bne _0803F540 - ldr r5, _0803F53C - adds r0, r1, r5 - strb r2, [r0] - b _0803F548 - .align 2, 0 -_0803F53C: .4byte 0x00018216 -_0803F540: - ldr r0, _0803F574 - adds r1, r0 - movs r0, 0x1 - strb r0, [r1] -_0803F548: - str r3, [r4, 0x10] - movs r0, 0 - bl sub_803F580 - bl sub_803F38C - ldr r0, _0803F578 - ldr r0, [r0] - ldr r1, _0803F57C - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F566 - bl sub_806CD90 -_0803F566: - bl sub_8049ED4 - bl sub_8040A84 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803F574: .4byte 0x00018216 -_0803F578: .4byte gDungeon -_0803F57C: .4byte 0x0001356c - thumb_func_end sub_803F508 - - thumb_func_start sub_803F580 -sub_803F580: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - ldr r0, _0803F600 - ldr r4, [r0] - ldr r0, _0803F604 - adds r5, r4, r0 - ldr r6, [r5, 0x10] - cmp r6, 0 - bne _0803F59E - b _0803F7A0 -_0803F59E: - adds r0, r6, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0803F5AC - b _0803F7A0 -_0803F5AC: - ldr r7, [r6, 0x70] - ldr r0, [r5, 0x8] - str r0, [r5, 0xC] - ldr r0, [r5] - str r0, [r5, 0x4] - ldrh r0, [r6, 0x4] - strh r0, [r5] - ldrh r0, [r6, 0x6] - strh r0, [r5, 0x2] - ldr r0, [r6, 0xC] - cmp r0, 0 - bge _0803F5C6 - adds r0, 0xFF -_0803F5C6: - asrs r0, 8 - subs r0, 0x78 - strh r0, [r5, 0x8] - ldr r0, [r6, 0x10] - cmp r0, 0 - bge _0803F5D4 - adds r0, 0xFF -_0803F5D4: - asrs r0, 8 - subs r0, 0x60 - strh r0, [r5, 0xA] - adds r0, r6, 0 - movs r1, 0x11 - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0803F610 - ldrb r0, [r7, 0x7] - cmp r0, 0 - beq _0803F610 - ldr r1, _0803F608 - adds r0, r4, r1 - movs r1, 0x1 - strb r1, [r0] - ldr r2, _0803F60C - adds r0, r4, r2 - strb r1, [r0] - b _0803F626 - .align 2, 0 -_0803F600: .4byte gDungeon -_0803F604: .4byte 0x000181e8 -_0803F608: .4byte 0x0001820d -_0803F60C: .4byte 0x0001820e -_0803F610: - adds r0, r7, 0 - adds r0, 0xF0 - ldrb r0, [r0] - adds r1, r5, 0 - adds r1, 0x25 - strb r0, [r1] - adds r0, r7, 0 - adds r0, 0xF1 - ldrb r0, [r0] - adds r1, 0x1 - strb r0, [r1] -_0803F626: - adds r0, r7, 0 - adds r0, 0xF2 - ldrb r0, [r0] - adds r1, r5, 0 - adds r1, 0x29 - strb r0, [r1] - subs r1, 0x7 - ldrb r0, [r1] - mov r8, r0 - adds r0, r5, 0 - adds r0, 0x2C - ldrb r2, [r0] - adds r4, r1, 0 - cmp r2, 0 - bne _0803F670 - adds r0, r7, 0 - adds r0, 0xE8 - ldrb r1, [r0] - adds r7, r0, 0 - cmp r1, 0x1 - bne _0803F656 - strb r1, [r4] - movs r1, 0xE - b _0803F65A -_0803F656: - strb r2, [r4] - movs r1, 0 -_0803F65A: - ldr r2, _0803F66C - ldr r0, [r2] - cmp r0, r1 - beq _0803F678 - str r1, [r2] - adds r0, r1, 0 - bl SetBGOBJEnableFlags - b _0803F678 - .align 2, 0 -_0803F66C: .4byte gUnknown_202EDFC -_0803F670: - ldr r1, _0803F698 - ldr r0, _0803F69C - str r0, [r1] - adds r7, 0xE8 -_0803F678: - ldrb r4, [r4] - cmp r8, r4 - beq _0803F684 - movs r0, 0 - bl sub_8041888 -_0803F684: - adds r0, r5, 0 - adds r0, 0x28 - ldrb r1, [r0] - mov r8, r1 - ldrb r1, [r7] - adds r2, r0, 0 - cmp r1, 0x2 - bne _0803F6A0 - movs r0, 0x1 - b _0803F6A2 - .align 2, 0 -_0803F698: .4byte gUnknown_202EDFC -_0803F69C: .4byte 0x0000ffff -_0803F6A0: - movs r0, 0 -_0803F6A2: - strb r0, [r2] - ldrb r2, [r2] - cmp r8, r2 - beq _0803F6B4 - bl sub_806CC70 - movs r0, 0 - bl sub_8041888 -_0803F6B4: - adds r4, r5, 0 - adds r4, 0x27 - ldrb r2, [r4] - mov r8, r2 - adds r0, r6, 0 - bl CanSeeInvisibleMonsters - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _0803F6CC - movs r0, 0x1 -_0803F6CC: - strb r0, [r4] - ldrb r4, [r4] - cmp r8, r4 - beq _0803F6E2 - bl sub_8049ED4 - bl sub_8040A84 - movs r0, 0 - bl sub_8041888 -_0803F6E2: - mov r0, r9 - cmp r0, 0 - beq _0803F76A - adds r0, r5, 0 - adds r0, 0x2B - ldrb r1, [r0] - adds r4, r0, 0 - cmp r1, 0 - bne _0803F76A - movs r2, 0xC - ldrsh r1, [r5, r2] - movs r2, 0x8 - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F704 - negs r1, r1 -_0803F704: - cmp r1, 0x7 - bgt _0803F71C - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F718 - negs r1, r1 -_0803F718: - cmp r1, 0x7 - ble _0803F726 -_0803F71C: - bl sub_8049ED4 - movs r0, 0x1 - strb r0, [r4] - b _0803F76A -_0803F726: - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r2, 0x8 - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F73C - movs r0, 0xF0 - movs r1, 0 - bl sub_804A1F0 - b _0803F748 -_0803F73C: - cmp r1, r0 - ble _0803F748 - movs r0, 0 - movs r1, 0 - bl sub_804A1F0 -_0803F748: - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F75E - movs r0, 0 - movs r1, 0xA0 - bl sub_804A49C - b _0803F76A -_0803F75E: - cmp r1, r0 - ble _0803F76A - movs r0, 0 - movs r1, 0 - bl sub_804A49C -_0803F76A: - ldr r1, [r5] - ldr r0, [r5, 0x4] - cmp r1, r0 - beq _0803F7A0 - movs r5, 0 -_0803F774: - ldr r0, _0803F7B4 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _0803F7B8 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0803F79A - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl sub_80402AC -_0803F79A: - adds r5, 0x1 - cmp r5, 0x13 - ble _0803F774 -_0803F7A0: - bl sub_80400D4 - bl sub_803F7BC - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803F7B4: .4byte gDungeon -_0803F7B8: .4byte 0x000135cc - thumb_func_end sub_803F580 - thumb_func_start sub_803F7BC sub_803F7BC: push {r4-r6,lr} diff --git a/include/bg_palette_buffer.h b/include/bg_palette_buffer.h index 2f613353e..eade3fb36 100644 --- a/include/bg_palette_buffer.h +++ b/include/bg_palette_buffer.h @@ -3,7 +3,7 @@ void InitBGPaletteBuffer(void); void nullsub_4(s32 index, const u8 *colorArray, s32, u8 *); -void nullsub_5(void); +void nullsub_5(s32 index, const u8 *colorArray); void SetBGPaletteBufferColorArray(s32 index, const u8 *colorArray); void SetBGPaletteBufferColorRGB(s32 index, const u8 *colorArray, s32, u8 *); void TransferBGPaletteBuffer(void); diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 8c4f56fc4..af8290545 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -82,39 +82,43 @@ typedef struct DungeonMusicPlayer // Size unknown? typedef struct UnkDungeonGlobal_unk181E8_sub { - /* 0x181E8 */ Position cameraPos; - /* 0x181EC */ Position cameraPosMirror; - /* 0x181F0 */ Position cameraPixelPos; - /* 0x181F4 */ Position cameraPixelPosMirror; - /* 0x181F8 */ Entity *cameraTarget; - u32 unk181FC; - u32 unk18200; - u32 unk18204; - u8 unk18208; - /* 0x18209 */ u8 visibilityRange; // Dungeon light level. - /* 0x1820A */ bool8 blinded; // Blacks out the screen when the player has the Blinker status. - u8 unk1820B; - u8 unk1820C; - u8 unk1820D; - u8 unk1820E; - u8 unk1820F; - /* 0x18210 */ bool8 hallucinating; // Displays Substitute and flower sprites when the player has the Cross-Eyed status. - u8 unk18211; - u8 unk18212; - u8 unk18213; - u8 unk18214; - u8 unk18215; - u8 fill18216; - u8 unk18217; - u8 fill18218; - u8 fill18219; - u8 unk1821A; - u8 unk1821B; - u8 unk1821C; - u8 fill1821D; - u8 fill1821E; - u8 fill1821F; -} UnkDungeonGlobal_unk181E8_sub; + /* 0x181E8 */ Position cameraPos; // x0 + /* 0x181EC */ Position cameraPosMirror; // x4 + /* 0x181F0 */ Position cameraPixelPos; // x8 + /* 0x181F4 */ Position cameraPixelPosMirror; // xC + /* 0x181F8 */ Entity *cameraTarget; // x10 + u32 unk181FC; // x14 + u32 unk18200; // x18 + u32 unk18204; // x1C + u8 unk18208; // x20 + /* 0x18209 */ u8 visibilityRange; // x21 Dungeon light level. + /* 0x1820A */ bool8 blinded; // x22 Blacks out the screen when the player has the Blinker status. + u8 unk1820B; // x23 + u8 unk1820C; // x24 + u8 unk1820D; // x25 + u8 unk1820E; // x26 + u8 unk1820F; // x27 + /* 0x18210 */ bool8 hallucinating; // x28 Displays Substitute and flower sprites when the player has the Cross-Eyed status. + u8 unk18211; // x29 + u8 unk18212; // x2A + u8 unk18213; // x2B + u8 unk18214; // x2C + u8 unk18215; // x2D + u8 unk18216; // x2E + u8 unk18217; // x2F + u8 unk18218; // x30 + u8 unk18219; // x31 + u8 unk1821A; // x32 + u8 unk1821B; // x33 + u8 unk1821C; // x34 + u8 fill1821D; // x35 + s16 unk36; // x36 + s16 unk38; // x38 + s16 unk3A; // x3A + s16 unk3C; // x3C + s16 unk3E; // x3E + s16 unk40; // x40 +} UnkDungeonGlobal_unk181E8_sub; // x44 // Sizeof: 0x1C typedef struct UnkDungeonGlobal_unk1C574 @@ -325,7 +329,7 @@ typedef struct Dungeon /* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX]; /* 0x181E4 */ OpenedFile *paletFile; /* 0x181E8 */ UnkDungeonGlobal_unk181E8_sub unk181e8; - u8 fill18220[0x1C06C - 0x18220]; + u8 fill1822C[0x1C06C - 0x1822C]; u32 unk1C06C; u8 fill1C070[0x1C570 - 0x1C070]; /* 0x1C570 */ DungeonLocation unk1C570; diff --git a/src/bg_palette_buffer.c b/src/bg_palette_buffer.c index 5ccede77e..a66bbad64 100644 --- a/src/bg_palette_buffer.c +++ b/src/bg_palette_buffer.c @@ -59,7 +59,7 @@ void nullsub_4(s32 index, const u8 *colorArray, s32 a1, u8 *a2) { } -void nullsub_5(void) +void nullsub_5(s32 index, const u8 *colorArray) { } diff --git a/src/code_803E724.c b/src/code_803E724.c index 9e8cb18a5..1c26bf1d5 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -9,7 +9,15 @@ #include "code_8009804.h" #include "code_803E46C.h" #include "dungeon_util.h" +#include "dungeon_pokemon_attributes.h" #include "sprite.h" +#include "bg_control.h" +#include "game_options.h" +#include "dungeon_range.h" +#include "code_806CD90.h" +#include "dungeon_items.h" +#include "constants/item.h" +#include "constants/status.h" extern s32 gUnknown_202EDC8; extern u32 gUnknown_202EDD0; @@ -311,7 +319,7 @@ void sub_803ED30(s32 a0, Entity *mon, u8 a2, s32 a3) sub_80098BC((void *) VRAM + 0x142C0, gDungeon->unk18, 0x80); } -SpriteOAM gUnknown_202EDDC; +extern SpriteOAM gUnknown_202EDDC; void sub_803EDF0(void) { @@ -390,4 +398,679 @@ void sub_803EDF0(void) } } +/* +Not even attempting this, opened file unknown structs weirdly put on stack, my head hurts just looking at this +s32 sub_803EF90(s32 a0, u8 a1) +{ + +} +*/ + +NAKED s32 sub_803EF90(s32 a0, u8 a1) +{ + 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, 0x58\n" + " str r0, [sp, 0x48]\n" + " lsls r1, 24\n" + " lsrs r5, r1, 24\n" + " ldr r0, _0803F060\n" + " ldr r0, [r0]\n" + " adds r0, 0x18\n" + " mov r8, r0\n" + " ldr r0, _0803F064\n" + " ldr r1, [r0]\n" + " ldr r0, [r1, 0x4]\n" + " movs r2, 0x92\n" + " lsls r2, 1\n" + " adds r0, r2\n" + " str r0, [sp, 0x24]\n" + " ldr r0, [r1, 0x4]\n" + " movs r3, 0x82\n" + " lsls r3, 1\n" + " adds r0, r3\n" + " str r0, [sp, 0x28]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0xE4\n" + " str r0, [sp, 0x2C]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0xC4\n" + " str r0, [sp, 0x30]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0xA4\n" + " str r0, [sp, 0x34]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0x84\n" + " str r0, [sp, 0x38]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0x64\n" + " str r0, [sp, 0x3C]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0x44\n" + " str r0, [sp, 0x40]\n" + " ldr r0, [r1, 0x4]\n" + " adds r0, 0x24\n" + " str r0, [sp, 0x44]\n" + " add r4, sp, 0x24\n" + " mov r0, sp\n" + " adds r1, r4, 0\n" + " movs r2, 0x24\n" + " bl memcpy\n" + " movs r1, 0\n" + " movs r6, 0x3\n" + " mov r0, r8\n" + "_0803EFFE:\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " stm r0!, {r1}\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bge _0803EFFE\n" + " ldr r0, _0803F068\n" + " ldr r1, [sp, 0x48]\n" + " cmp r1, r0\n" + " bne _0803F0A6\n" + " adds r0, r4, 0\n" + " ldr r1, _0803F06C\n" + " ldm r1!, {r2,r3,r5}\n" + " stm r0!, {r2,r3,r5}\n" + " ldr r1, [r1]\n" + " str r1, [r0]\n" + " movs r5, 0\n" + " movs r2, 0\n" + " mov r12, r4\n" + " movs r0, 0x20\n" + " mov r10, r0\n" + "_0803F032:\n" + " mov r3, r8\n" + " ldr r0, _0803F064\n" + " ldr r1, [r0]\n" + " lsls r0, r2, 2\n" + " add r0, r12\n" + " ldr r0, [r0]\n" + " lsls r0, 5\n" + " adds r0, 0x4\n" + " ldr r1, [r1, 0x4]\n" + " adds r4, r1, r0\n" + " movs r1, 0x18\n" + " adds r1, r5\n" + " mov r9, r1\n" + " adds r2, 0x1\n" + " str r2, [sp, 0x54]\n" + " mov r2, r10\n" + " subs r7, r2, r5\n" + " movs r6, 0x7\n" + "_0803F056:\n" + " cmp r5, 0\n" + " bne _0803F070\n" + " movs r1, 0\n" + " ldr r2, [r4]\n" + " b _0803F07A\n" + " .align 2, 0\n" + "_0803F060: .4byte gDungeon\n" + "_0803F064: .4byte gUnknown_202EC9C\n" + "_0803F068: .4byte 0x0000270f\n" + "_0803F06C: .4byte gUnknown_80F6478\n" + "_0803F070:\n" + " ldr r0, [r4]\n" + " adds r1, r0, 0\n" + " lsrs r1, r7\n" + " adds r2, r0, 0\n" + " lsls r2, r5\n" + "_0803F07A:\n" + " adds r4, 0x4\n" + " ldr r0, [r3]\n" + " orrs r0, r2\n" + " str r0, [r3]\n" + " ldr r0, [r3, 0x20]\n" + " orrs r0, r1\n" + " str r0, [r3, 0x20]\n" + " adds r3, 0x4\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bge _0803F056\n" + " mov r5, r9\n" + " cmp r5, 0x1F\n" + " ble _0803F09C\n" + " subs r5, 0x20\n" + " movs r3, 0x20\n" + " add r8, r3\n" + "_0803F09C:\n" + " ldr r2, [sp, 0x54]\n" + " cmp r2, 0x3\n" + " ble _0803F032\n" + " movs r0, 0x4\n" + " b _0803F26A\n" + "_0803F0A6:\n" + " ldr r0, _0803F0D8\n" + " ldr r1, [sp, 0x48]\n" + " cmp r1, r0\n" + " ble _0803F0B0\n" + " str r0, [sp, 0x48]\n" + "_0803F0B0:\n" + " ldr r0, _0803F0DC\n" + " ldr r2, [sp, 0x48]\n" + " cmp r2, r0\n" + " bge _0803F0BA\n" + " str r0, [sp, 0x48]\n" + "_0803F0BA:\n" + " ldr r1, _0803F0E0\n" + " ldr r0, [r1]\n" + " ldr r0, [r0, 0x4]\n" + " movs r3, 0xC2\n" + " lsls r3, 1\n" + " adds r2, r0, r3\n" + " cmp r5, 0\n" + " beq _0803F0F4\n" + " ldr r5, [sp, 0x48]\n" + " cmp r5, 0\n" + " ble _0803F0E4\n" + " movs r1, 0xA2\n" + " lsls r1, 1\n" + " adds r2, r0, r1\n" + " b _0803F0F4\n" + " .align 2, 0\n" + "_0803F0D8: .4byte 0x000003e7\n" + "_0803F0DC: .4byte 0xfffffc19\n" + "_0803F0E0: .4byte gUnknown_202EC9C\n" + "_0803F0E4:\n" + " ldr r3, [sp, 0x48]\n" + " cmp r3, 0\n" + " bge _0803F0F4\n" + " movs r5, 0xB2\n" + " lsls r5, 1\n" + " adds r2, r0, r5\n" + " negs r3, r3\n" + " str r3, [sp, 0x48]\n" + "_0803F0F4:\n" + " ldm r2!, {r0}\n" + " mov r1, r8\n" + " str r0, [r1]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0x4]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0x8]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0xC]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0x10]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0x14]\n" + " ldm r2!, {r0}\n" + " str r0, [r1, 0x18]\n" + " ldr r0, [r2]\n" + " str r0, [r1, 0x1C]\n" + " movs r5, 0x18\n" + " movs r2, 0x1\n" + " str r2, [sp, 0x4C]\n" + " movs r3, 0\n" + " str r3, [sp, 0x50]\n" + " movs r2, 0\n" + "_0803F122:\n" + " movs r0, 0\n" + " mov r10, r0\n" + " adds r1, r2, 0x1\n" + " str r1, [sp, 0x54]\n" + " lsls r0, r2, 3\n" + " adds r0, r2\n" + " lsls r0, 2\n" + " mov r1, sp\n" + " ldr r2, _0803F15C\n" + " adds r7, r0, r2\n" + "_0803F136:\n" + " ldr r0, [r7]\n" + " ldr r3, [sp, 0x48]\n" + " cmp r0, r3\n" + " bgt _0803F1A2\n" + " ldr r4, [r1]\n" + " mov r2, r8\n" + " movs r0, 0x18\n" + " adds r0, r5\n" + " mov r9, r0\n" + " movs r1, 0x20\n" + " subs r1, r5\n" + " mov r12, r1\n" + " movs r6, 0x7\n" + "_0803F150:\n" + " cmp r5, 0\n" + " bne _0803F160\n" + " movs r3, 0\n" + " ldr r1, [r4]\n" + " b _0803F16C\n" + " .align 2, 0\n" + "_0803F15C: .4byte gUnknown_80F6430\n" + "_0803F160:\n" + " ldr r0, [r4]\n" + " adds r3, r0, 0\n" + " mov r1, r12\n" + " lsrs r3, r1\n" + " adds r1, r0, 0\n" + " lsls r1, r5\n" + "_0803F16C:\n" + " adds r4, 0x4\n" + " ldr r0, [r2]\n" + " orrs r0, r1\n" + " str r0, [r2]\n" + " ldr r0, [r2, 0x20]\n" + " orrs r0, r3\n" + " str r0, [r2, 0x20]\n" + " adds r2, 0x4\n" + " movs r3, 0x1\n" + " str r3, [sp, 0x50]\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bge _0803F150\n" + " mov r5, r9\n" + " cmp r5, 0x1F\n" + " ble _0803F192\n" + " subs r5, 0x20\n" + " movs r0, 0x20\n" + " add r8, r0\n" + "_0803F192:\n" + " ldr r0, [r7]\n" + " ldr r1, [sp, 0x48]\n" + " subs r1, r0\n" + " str r1, [sp, 0x48]\n" + " ldr r2, [sp, 0x4C]\n" + " adds r2, 0x1\n" + " str r2, [sp, 0x4C]\n" + " b _0803F1B0\n" + "_0803F1A2:\n" + " adds r1, 0x4\n" + " adds r7, 0x4\n" + " movs r3, 0x1\n" + " add r10, r3\n" + " mov r0, r10\n" + " cmp r0, 0x8\n" + " ble _0803F136\n" + "_0803F1B0:\n" + " mov r1, r10\n" + " cmp r1, 0x9\n" + " bne _0803F212\n" + " ldr r2, [sp, 0x50]\n" + " cmp r2, 0\n" + " beq _0803F212\n" + " ldr r3, _0803F1DC\n" + " ldr r0, [r3]\n" + " ldr r0, [r0, 0x4]\n" + " adds r4, r0, 0x4\n" + " mov r2, r8\n" + " movs r0, 0x18\n" + " adds r0, r5\n" + " mov r9, r0\n" + " movs r1, 0x20\n" + " subs r7, r1, r5\n" + " movs r6, 0x7\n" + "_0803F1D2:\n" + " cmp r5, 0\n" + " bne _0803F1E0\n" + " movs r3, 0\n" + " ldr r1, [r4]\n" + " b _0803F1EA\n" + " .align 2, 0\n" + "_0803F1DC: .4byte gUnknown_202EC9C\n" + "_0803F1E0:\n" + " ldr r0, [r4]\n" + " adds r3, r0, 0\n" + " lsrs r3, r7\n" + " adds r1, r0, 0\n" + " lsls r1, r5\n" + "_0803F1EA:\n" + " adds r4, 0x4\n" + " ldr r0, [r2]\n" + " orrs r0, r1\n" + " str r0, [r2]\n" + " ldr r0, [r2, 0x20]\n" + " orrs r0, r3\n" + " str r0, [r2, 0x20]\n" + " adds r2, 0x4\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bge _0803F1D2\n" + " mov r5, r9\n" + " cmp r5, 0x1F\n" + " ble _0803F20C\n" + " subs r5, 0x20\n" + " movs r2, 0x20\n" + " add r8, r2\n" + "_0803F20C:\n" + " ldr r3, [sp, 0x4C]\n" + " adds r3, 0x1\n" + " str r3, [sp, 0x4C]\n" + "_0803F212:\n" + " ldr r2, [sp, 0x54]\n" + " cmp r2, 0x1\n" + " ble _0803F122\n" + " ldr r0, _0803F240\n" + " ldr r1, [r0]\n" + " ldr r2, [sp, 0x48]\n" + " lsls r0, r2, 5\n" + " adds r0, 0x4\n" + " ldr r1, [r1, 0x4]\n" + " adds r1, r0\n" + " mov r3, r8\n" + " ldr r0, [sp, 0x4C]\n" + " adds r0, 0x1\n" + " mov r8, r0\n" + " movs r0, 0x20\n" + " subs r7, r0, r5\n" + " movs r6, 0x7\n" + "_0803F234:\n" + " cmp r5, 0\n" + " bne _0803F244\n" + " movs r4, 0\n" + " ldr r2, [r1]\n" + " b _0803F24E\n" + " .align 2, 0\n" + "_0803F240: .4byte gUnknown_202EC9C\n" + "_0803F244:\n" + " ldr r0, [r1]\n" + " adds r4, r0, 0\n" + " lsrs r4, r7\n" + " adds r2, r0, 0\n" + " lsls r2, r5\n" + "_0803F24E:\n" + " adds r1, 0x4\n" + " ldr r0, [r3]\n" + " orrs r0, r2\n" + " str r0, [r3]\n" + " ldr r0, [r3, 0x20]\n" + " orrs r0, r4\n" + " str r0, [r3, 0x20]\n" + " adds r3, 0x4\n" + " subs r6, 0x1\n" + " cmp r6, 0\n" + " bge _0803F234\n" + " mov r1, r8\n" + " str r1, [sp, 0x4C]\n" + " adds r0, r1, 0\n" + "_0803F26A:\n" + " add sp, 0x58\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\n"); +} + +void sub_803F38C(void); + +extern u32 gUnknown_202EDFC; + +void sub_803F27C(bool8 a0) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + strPtr->cameraPixelPos.x = 0; + strPtr->cameraPixelPos.y = 0; + strPtr->cameraPos.x = 0; + strPtr->cameraPos.y = 0; + strPtr->cameraPixelPosMirror.x = 0; + strPtr->cameraPixelPosMirror.y = 0; + strPtr->cameraPosMirror.x = 0; + strPtr->cameraPosMirror.y = 0; + + strPtr->unk181FC = 0; + strPtr->unk18216 = 0; + strPtr->unk18217 = 1; + strPtr->unk18218 = 1; + strPtr->unk18219 = 0; + + strPtr->unk18200 = 0; + strPtr->unk18204 = 0; + if (!a0) { + strPtr->blinded = 0; + strPtr->hallucinating = 0; + strPtr->unk1820F = 0; + strPtr->unk1820D = 0; + strPtr->unk18211 = 0; + strPtr->unk1820E = 0; + strPtr->unk1820B = 0; + strPtr->unk1820C = 0; + } + + strPtr->cameraTarget = NULL; + strPtr->unk18208 = 3; + strPtr->unk1821A = 0; + strPtr->unk18212 = 0; + strPtr->unk1821B = 0; + strPtr->unk1821C = 0; + strPtr->unk18214 = 0; + strPtr->unk18215 = 1; + sub_803F38C(); + + gUnknown_202EDFC = 0xFFFF; + if (!a0) { + strPtr->visibilityRange = gDungeon->unk1C574.unk16 & 3; + if (strPtr->visibilityRange == 0) { + strPtr->unk1820C = 1; + } + } +} + +extern u8 gUnknown_202D06C[]; + +void sub_803F38C(void) +{ + s32 palAdd; + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + strPtr->unk3A = -1; + strPtr->unk3C = -1; + strPtr->unk3E = -1; + strPtr->unk40 = -1; + strPtr->unk36 = -1; + strPtr->unk38 = -1; + + palAdd = (gGameOptionsRef->playerGender != MALE) ? 256 : 0; + + SetBGPaletteBufferColorArray(0xFD, &gUnknown_202D06C[0 + palAdd]); + SetBGPaletteBufferColorArray(0xFE, &gUnknown_202D06C[4 + palAdd]); + SetBGPaletteBufferColorArray(0xFF, &gUnknown_202D06C[8 + palAdd]); + + nullsub_5(0xFD, &gUnknown_202D06C[0 + palAdd]); + nullsub_5(0xFE, &gUnknown_202D06C[4 + palAdd]); + nullsub_5(0xFF, &gUnknown_202D06C[8 + palAdd]); +} + +bool8 sub_803F428(Position *pos) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + Entity *cameraEntity = strPtr->cameraTarget; + + if (abs(strPtr->cameraPos.x - pos->x) <= 6 && abs(strPtr->cameraPos.y - pos->y) <= 5) { + if (strPtr->unk1820B == 0 && strPtr->unk1820C == 0 && cameraEntity != NULL) { + return IsPositionActuallyInSight(&strPtr->cameraPos, pos); + } + return TRUE; + } + + return FALSE; +} + +void sub_803F580(u8 a0); +void sub_803F7BC(void); +extern void sub_8049ED4(void); +extern void sub_8040A84(void); +extern void sub_80400D4(void); + +void sub_803F4A0(Entity *a0) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + strPtr->cameraTarget = a0; + if (a0 == NULL) { + strPtr->unk18216 = 0; + } + else if (!GetEntInfo(a0)->isTeamLeader) { + strPtr->unk18216 = 0; + } + else { + strPtr->unk18216 = 1; + } + + sub_803F580(0); + sub_803F38C(); + if (gDungeon->unk1356C == 0) { + sub_806CD90(); + } +} + +// Very similar to the one above +void sub_803F508(Entity *a0) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + if (a0 == NULL) { + strPtr->unk18216 = 0; + } + else if (!GetEntInfo(a0)->isTeamLeader) { + strPtr->unk18216 = 0; + } + else { + strPtr->unk18216 = 1; + } + strPtr->cameraTarget = a0; + + sub_803F580(0); + sub_803F38C(); + if (gDungeon->unk1356C == 0) { + sub_806CD90(); + } + sub_8049ED4(); + sub_8040A84(); +} + +extern void sub_8041888(u8 param_1); +extern void sub_804A1F0(s32 a0, s32 a1); +extern void sub_804A49C(s32 a0, s32 a1); +extern void sub_80402AC(s32, s32); + +void sub_803F580(u8 a0) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + Entity *cameraTarget = strPtr->cameraTarget; + + if (cameraTarget != NULL && EntityExists(cameraTarget)) { + s32 i; + u32 before, unk18214; + EntityInfo *info = GetEntInfo(cameraTarget); + + strPtr->cameraPixelPosMirror = strPtr->cameraPixelPos; + strPtr->cameraPosMirror = strPtr->cameraPos; + strPtr->cameraPos.x = cameraTarget->pos.x; + strPtr->cameraPos.y = cameraTarget->pos.y; + + strPtr->cameraPixelPos.x = (cameraTarget->pixelPos.x / 256) - 120; + strPtr->cameraPixelPos.y = (cameraTarget->pixelPos.y / 256) - 96; + + if (HasHeldItem(cameraTarget, ITEM_X_RAY_SPECS) && info->isTeamLeader) { + strPtr->unk1820D = 1; + strPtr->unk1820E = 1; + } + else { + strPtr->unk1820D = info->powerEars; + strPtr->unk1820E = info->scanning; + } + + strPtr->unk18211 = info->stairSpotter; + before = strPtr->blinded; + unk18214 = strPtr->unk18214; + if (unk18214 == 0) { + u32 unkVar; + if (info->eyesightStatus.eyesightStatus == STATUS_BLINKER) { + strPtr->blinded = 1; + unkVar = 0xE; + } + else { + strPtr->blinded = unk18214; + unkVar = 0; + } + + if (gUnknown_202EDFC != unkVar) { + gUnknown_202EDFC = unkVar; + SetBGOBJEnableFlags(unkVar); + } + } + else { + gUnknown_202EDFC = 0xFFFF; + } + + if (before != strPtr->blinded) { + sub_8041888(0); + } + + before = strPtr->hallucinating; + if (info->eyesightStatus.eyesightStatus == STATUS_CROSS_EYED) { + strPtr->hallucinating = 1; + } + else { + strPtr->hallucinating = 0; + } + + if (before != strPtr->hallucinating) { + sub_806CC70(); + sub_8041888(0); + } + + before = strPtr->unk1820F; + if (CanSeeInvisibleMonsters(cameraTarget)) { + strPtr->unk1820F = 1; + } + else { + strPtr->unk1820F = 0; + } + + if (before != strPtr->unk1820F) { + sub_8049ED4(); + sub_8040A84(); + sub_8041888(0); + } + + if (a0 && strPtr->unk18213 == 0) { + if (abs(strPtr->cameraPixelPosMirror.x - strPtr->cameraPixelPos.x) > 7 || abs(strPtr->cameraPixelPosMirror.y - strPtr->cameraPixelPos.y) > 7) { + sub_8049ED4(); + strPtr->unk18213 = 1; + } + else { + if (strPtr->cameraPixelPosMirror.x < strPtr->cameraPixelPos.x) { + sub_804A1F0(240, 0); + } + else if (strPtr->cameraPixelPosMirror.x > strPtr->cameraPixelPos.x) { + sub_804A1F0(0, 0); + } + + if (strPtr->cameraPixelPosMirror.y < strPtr->cameraPixelPos.y) { + sub_804A49C(0, 160); + } + else if (strPtr->cameraPixelPosMirror.y > strPtr->cameraPixelPos.y) { + sub_804A49C(0, 0); + } + } + } + + if (strPtr->cameraPos.x != strPtr->cameraPosMirror.x || strPtr->cameraPos.y != strPtr->cameraPosMirror.y) { + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + Entity *mon = gDungeon->allPokemon[i]; + if (EntityExists(mon)) { + sub_80402AC(mon->pos.x, mon->pos.y); + } + } + } + } + + sub_80400D4(); + sub_803F7BC(); +} + // From 4b7e9c6597bcc2623a5d56f05ed2fad9c5314ff9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 9 Oct 2024 10:08:03 +0200 Subject: [PATCH 5/8] sub_803FE30 --- asm/code_803E724.s | 947 ---------------------------------- include/structs/str_dungeon.h | 1 + src/code_803E724.c | 359 +++++++++++++ 3 files changed, 360 insertions(+), 947 deletions(-) diff --git a/asm/code_803E724.s b/asm/code_803E724.s index 2c9578003..b148e780f 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -6,954 +6,7 @@ .text - thumb_func_start sub_803F7BC -sub_803F7BC: - push {r4-r6,lr} - sub sp, 0x10 - ldr r6, _0803F800 - ldr r4, [r6] - ldr r0, _0803F804 - adds r5, r4, r0 - movs r1, 0 - ldrsh r0, [r5, r1] - movs r2, 0x2 - ldrsh r1, [r5, r2] - bl GetTile - ldrb r1, [r0, 0x9] - ldr r2, _0803F808 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F7F4 - adds r2, 0x1 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F7F4 - adds r2, 0xB - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _0803F80C -_0803F7F4: - movs r0, 0 - movs r1, 0 - bl sub_8005838 - b _0803F86A - .align 2, 0 -_0803F800: .4byte gDungeon -_0803F804: .4byte 0x000181e8 -_0803F808: .4byte 0x0001820b -_0803F80C: - cmp r1, 0xFF - bne _0803F82C - ldr r1, _0803F828 - adds r0, r4, r1 - ldrb r0, [r0] - movs r1, 0x2 - cmp r0, 0x2 - bne _0803F81E - movs r1, 0x1 -_0803F81E: - movs r0, 0 - bl sub_8005838 - b _0803F86A - .align 2, 0 -_0803F828: .4byte 0x00018209 -_0803F82C: - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r2, _0803F874 - adds r0, r2 - ldr r2, [r6] - adds r2, r0 - movs r0, 0x8 - ldrsh r1, [r5, r0] - ldr r0, [r2, 0xC] - subs r0, r1 - str r0, [sp] - movs r0, 0xA - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x10] - subs r0, r1 - str r0, [sp, 0x4] - movs r0, 0x8 - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x14] - subs r0, r1 - str r0, [sp, 0x8] - movs r0, 0xA - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x18] - subs r0, r1 - str r0, [sp, 0xC] - mov r0, sp - movs r1, 0x3 - bl sub_8005838 -_0803F86A: - add sp, 0x10 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0803F874: .4byte 0x000104c4 - thumb_func_end sub_803F7BC - thumb_func_start sub_803F878 -sub_803F878: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r2, r0, 0 - adds r6, r1, 0 - ldr r0, _0803F92C - ldr r7, [r0] - ldr r0, _0803F930 - adds r5, r7, r0 - ldr r0, [r5, 0x8] - str r0, [r5, 0xC] - ldr r0, [r5] - str r0, [r5, 0x4] - adds r0, r2, 0 - cmp r2, 0 - bge _0803F89A - adds r0, 0xFF -_0803F89A: - asrs r0, 8 - subs r0, 0x78 - movs r1, 0 - mov r8, r1 - strh r0, [r5, 0x8] - adds r0, r6, 0 - cmp r6, 0 - bge _0803F8AC - adds r0, 0xFF -_0803F8AC: - asrs r0, 8 - subs r0, 0x60 - strh r0, [r5, 0xA] - movs r4, 0xC0 - lsls r4, 5 - adds r0, r2, 0 - adds r1, r4, 0 - bl __divsi3 - strh r0, [r5] - adds r0, r6, 0 - adds r1, r4, 0 - bl __divsi3 - strh r0, [r5, 0x2] - ldr r2, _0803F934 - adds r0, r7, r2 - mov r1, r8 - strb r1, [r0] - adds r2, 0x1 - adds r0, r7, r2 - strb r1, [r0] - ldr r1, _0803F938 - adds r0, r7, r1 - mov r2, r8 - strb r2, [r0] - adds r1, 0x5 - adds r0, r7, r1 - strb r2, [r0] - ldr r1, _0803F93C - ldr r0, [r1] - cmp r0, 0 - beq _0803F8F6 - movs r0, 0 - str r0, [r1] - bl SetBGOBJEnableFlags -_0803F8F6: - movs r2, 0xC - ldrsh r1, [r5, r2] - movs r2, 0x8 - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F906 - negs r1, r1 -_0803F906: - cmp r1, 0x7 - bgt _0803F91E - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F91A - negs r1, r1 -_0803F91A: - cmp r1, 0x7 - ble _0803F940 -_0803F91E: - bl sub_8049ED4 - adds r1, r5, 0 - adds r1, 0x2B - movs r0, 0x1 - strb r0, [r1] - b _0803F984 - .align 2, 0 -_0803F92C: .4byte gDungeon -_0803F930: .4byte 0x000181e8 -_0803F934: .4byte 0x0001820d -_0803F938: .4byte 0x00018211 -_0803F93C: .4byte gUnknown_202EDFC -_0803F940: - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r2, 0x8 - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F956 - movs r0, 0xF0 - movs r1, 0 - bl sub_804A1F0 - b _0803F962 -_0803F956: - cmp r1, r0 - ble _0803F962 - movs r0, 0 - movs r1, 0 - bl sub_804A1F0 -_0803F962: - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F978 - movs r0, 0 - movs r1, 0xA0 - bl sub_804A49C - b _0803F984 -_0803F978: - cmp r1, r0 - ble _0803F984 - movs r0, 0 - movs r1, 0 - bl sub_804A49C -_0803F984: - bl sub_803F7BC - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_803F878 - - thumb_func_start GetCameraXPos -GetCameraXPos: - ldr r0, _0803F9A8 - ldr r0, [r0] - ldr r1, _0803F9AC - adds r0, r1 - movs r1, 0x8 - ldrsh r0, [r0, r1] - adds r0, 0x78 - lsls r0, 8 - bx lr - .align 2, 0 -_0803F9A8: .4byte gDungeon -_0803F9AC: .4byte 0x000181e8 - thumb_func_end GetCameraXPos - - thumb_func_start GetCameraYPos -GetCameraYPos: - ldr r0, _0803F9C4 - ldr r0, [r0] - ldr r1, _0803F9C8 - adds r0, r1 - movs r1, 0xA - ldrsh r0, [r0, r1] - adds r0, 0x60 - lsls r0, 8 - bx lr - .align 2, 0 -_0803F9C4: .4byte gDungeon -_0803F9C8: .4byte 0x000181e8 - thumb_func_end GetCameraYPos - - thumb_func_start sub_803F9CC -sub_803F9CC: - push {r4,r5,lr} - ldr r0, _0803FA24 - ldr r1, [r0] - ldr r2, _0803FA28 - adds r0, r1, r2 - ldr r4, [r0] - movs r5, 0 - ldr r2, _0803FA2C - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803FA0C - ldr r2, _0803FA30 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803FA0C - bl sub_800EC74 - lsls r0, 24 - cmp r0, 0 - bne _0803FA0C - cmp r4, 0 - beq _0803FA08 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0803FA08 - movs r5, 0x1 -_0803FA08: - cmp r5, 0 - bne _0803FA38 -_0803FA0C: - ldr r0, _0803FA34 - movs r2, 0 - adds r0, 0x2 - movs r1, 0x1C -_0803FA14: - strh r2, [r0] - adds r0, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803FA14 - bl sub_803F38C - b _0803FA3C - .align 2, 0 -_0803FA24: .4byte gDungeon -_0803FA28: .4byte 0x000181f8 -_0803FA2C: .4byte 0x0001356c -_0803FA30: .4byte 0x00018218 -_0803FA34: .4byte gUnknown_202B038 -_0803FA38: - bl sub_803FB74 -_0803FA3C: - ldr r1, _0803FA48 - movs r0, 0x1 - strb r0, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803FA48: .4byte gUnknown_20274A5 - thumb_func_end sub_803F9CC - - thumb_func_start sub_803FA4C -sub_803FA4C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - adds r4, r0, 0 - mov r8, r1 - lsls r2, 24 - lsrs r2, 24 - mov r12, r2 - ldr r0, _0803FB4C - ldr r3, [r0] - ldr r0, _0803FB50 - adds r0, r3, r0 - str r0, [sp, 0x24] - ldr r7, _0803FB54 - mov r1, sp - ldr r0, _0803FB58 - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldr r0, _0803FB5C - mov r10, r0 - ldr r1, _0803FB60 - mov r9, r1 - ldr r2, [sp, 0x24] - movs r5, 0x3E - ldrsh r0, [r2, r5] - cmp r4, r0 - bne _0803FA9C - ldr r6, _0803FB64 - adds r0, r3, r6 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r8, r0 - beq _0803FB3A -_0803FA9C: - mov r2, r12 - cmp r2, 0 - bne _0803FAA6 - ldr r5, _0803FB68 - mov r9, r5 -_0803FAA6: - ldr r6, [sp, 0x24] - strh r4, [r6, 0x3E] - ldr r1, _0803FB64 - adds r0, r3, r1 - mov r2, r8 - strh r2, [r0] - mov r5, r8 - cmp r5, 0x5F - ble _0803FAC8 - movs r5, 0x60 - lsls r0, r4, 1 - adds r0, r4 - lsls r0, 5 - mov r1, r8 - bl __divsi3 - adds r4, r0, 0 -_0803FAC8: - movs r3, 0 - mov r8, r3 - movs r6, 0x58 - mov r12, r6 -_0803FAD0: - ldr r6, _0803FB6C - adds r2, r4, 0 - adds r0, r5, 0 - cmp r4, 0x7 - ble _0803FADC - movs r2, 0x8 -_0803FADC: - cmp r5, 0x7 - ble _0803FAE2 - movs r0, 0x8 -_0803FAE2: - lsls r0, 2 - mov r3, sp - adds r1, r3, r0 - lsls r0, r2, 2 - add r0, sp - ldr r2, [r0] - ldr r3, [r1] - adds r1, r3, 0 - bics r1, r2 - mov r0, r10 - ands r1, r0 - mov r0, r9 - ands r0, r2 - orrs r0, r1 - ands r6, r3 - mov r1, r8 - stm r7!, {r1} - stm r7!, {r6} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r6} - stm r7!, {r1} - subs r4, 0x8 - subs r5, 0x8 - cmp r4, 0 - bge _0803FB1C - movs r4, 0 -_0803FB1C: - cmp r5, 0 - bge _0803FB22 - movs r5, 0 -_0803FB22: - movs r2, 0x8 - negs r2, r2 - add r12, r2 - mov r3, r12 - cmp r3, 0 - bge _0803FAD0 - ldr r0, _0803FB70 - movs r2, 0xC0 - lsls r2, 1 - ldr r1, _0803FB54 - bl sub_80098BC -_0803FB3A: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FB4C: .4byte gDungeon -_0803FB50: .4byte 0x000181e8 -_0803FB54: .4byte gUnknown_3001018 -_0803FB58: .4byte gUnknown_80F6490 -_0803FB5C: .4byte 0x22222222 -_0803FB60: .4byte 0x44444444 -_0803FB64: .4byte 0x00018228 -_0803FB68: .4byte 0x55555555 -_0803FB6C: .4byte 0x77777777 -_0803FB70: .4byte 0x06005980 - thumb_func_end sub_803FA4C - - thumb_func_start sub_803FB74 -sub_803FB74: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r0, _0803FBE8 - ldr r0, [r0] - ldr r1, _0803FBEC - adds r7, r0, r1 - movs r4, 0 - movs r2, 0 - str r2, [sp] - ldr r0, [r7, 0x10] - ldr r0, [r0, 0x70] - movs r1, 0xE - ldrsh r3, [r0, r1] - mov r9, r3 - movs r3, 0x10 - ldrsh r2, [r0, r3] - mov r8, r2 - ldrb r1, [r0, 0x9] - mov r10, r1 - movs r2, 0xE - ldrsh r1, [r0, r2] - cmp r1, 0 - ble _0803FBBA - mov r0, r8 - cmp r0, 0 - bge _0803FBB2 - adds r0, 0x3 -_0803FBB2: - asrs r0, 2 - cmp r1, r0 - bgt _0803FBBA - movs r4, 0x1 -_0803FBBA: - ldr r0, [r7, 0x10] - ldr r0, [r0, 0x70] - movs r3, 0x9E - lsls r3, 1 - adds r0, r3 - ldr r0, [r0] - bl FixedPointToInt - cmp r0, 0 - bne _0803FBD2 - movs r0, 0x1 - str r0, [sp] -_0803FBD2: - cmp r4, 0 - beq _0803FBF4 - ldr r0, _0803FBF0 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803FBF4 - movs r5, 0x20 - movs r6, 0x20 - b _0803FBF8 - .align 2, 0 -_0803FBE8: .4byte gDungeon -_0803FBEC: .4byte 0x000181e8 -_0803FBF0: .4byte gUnknown_202EDCC -_0803FBF4: - movs r5, 0 - movs r6, 0 -_0803FBF8: - ldr r1, [sp] - cmp r1, 0 - beq _0803FC0E - ldr r0, _0803FC20 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803FC0E - movs r5, 0x30 - movs r6, 0x30 -_0803FC0E: - cmp r5, 0 - bne _0803FC30 - adds r0, r7, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - beq _0803FC24 - movs r5, 0x60 - b _0803FC30 - .align 2, 0 -_0803FC20: .4byte gUnknown_202EDCC -_0803FC24: - ldr r0, _0803FCE4 - ldr r0, [r0] - ldrb r0, [r0, 0xB] - cmp r0, 0 - beq _0803FC30 - movs r5, 0x40 -_0803FC30: - cmp r6, 0 - bne _0803FC40 - ldr r0, _0803FCE4 - ldr r0, [r0] - ldrb r0, [r0, 0xB] - cmp r0, 0 - beq _0803FC40 - movs r6, 0x40 -_0803FC40: - movs r2, 0x36 - ldrsh r0, [r7, r2] - cmp r0, r5 - beq _0803FC78 - strh r5, [r7, 0x36] - lsls r5, 2 - ldr r4, _0803FCE8 - adds r1, r5, r4 - movs r0, 0xFC - bl SetBGPaletteBufferColorArray - adds r1, r4, 0x4 - adds r1, r5, r1 - movs r0, 0xFD - bl SetBGPaletteBufferColorArray - adds r1, r4, 0 - adds r1, 0x8 - adds r1, r5, r1 - movs r0, 0xFE - bl SetBGPaletteBufferColorArray - adds r4, 0xC - adds r5, r4 - movs r0, 0xFF - adds r1, r5, 0 - bl SetBGPaletteBufferColorArray -_0803FC78: - movs r3, 0x38 - ldrsh r0, [r7, r3] - cmp r0, r6 - beq _0803FCB0 - strh r6, [r7, 0x38] - lsls r5, r6, 2 - ldr r4, _0803FCE8 - adds r1, r5, r4 - movs r0, 0xFC - bl nullsub_5 - adds r1, r4, 0x4 - adds r1, r5, r1 - movs r0, 0xFD - bl nullsub_5 - adds r1, r4, 0 - adds r1, 0x8 - adds r1, r5, r1 - movs r0, 0xFE - bl nullsub_5 - adds r4, 0xC - adds r5, r4 - movs r0, 0xFF - adds r1, r5, 0 - bl nullsub_5 -_0803FCB0: - ldr r5, _0803FCEC - ldr r0, _0803FCF0 - ldr r2, [r0] - ldr r0, _0803FCF4 - adds r1, r2, r0 - movs r3, 0x14 - ldrsh r0, [r2, r3] - ldrb r1, [r1] - adds r6, r0, r1 - movs r1, 0x3A - ldrsh r0, [r7, r1] - adds r4, r7, 0 - adds r4, 0x2E - cmp r0, r6 - beq _0803FD3E - strh r6, [r7, 0x3A] - ldr r3, _0803FCF8 - adds r0, r2, r3 - ldrb r0, [r0] - bl IsStairDirectionUp - lsls r0, 24 - cmp r0, 0 - beq _0803FCFC - movs r0, 0 - b _0803FD00 - .align 2, 0 -_0803FCE4: .4byte gGameOptionsRef -_0803FCE8: .4byte gUnknown_202D068 -_0803FCEC: .4byte gUnknown_202B038 -_0803FCF0: .4byte gDungeon -_0803FCF4: .4byte 0x00000645 -_0803FCF8: .4byte 0x00000644 -_0803FCFC: - ldr r1, _0803FD20 - adds r0, r1, 0 -_0803FD00: - strh r0, [r5, 0x2] - cmp r6, 0x9 - bgt _0803FD28 - adds r1, r5, 0x4 - adds r4, r7, 0 - adds r4, 0x2E - ldrb r2, [r4] - adds r0, r6, 0 - movs r3, 0x1 - bl sub_803FE30 - ldr r2, _0803FD24 - adds r0, r2, 0 - strh r0, [r5, 0x6] - b _0803FD3E - .align 2, 0 -_0803FD20: .4byte 0x0000f2be -_0803FD24: .4byte 0x0000f2b8 -_0803FD28: - adds r1, r5, 0x4 - adds r4, r7, 0 - adds r4, 0x2E - ldrb r2, [r4] - adds r0, r6, 0 - movs r3, 0 - bl sub_803FE30 - ldr r3, _0803FE10 - adds r0, r3, 0 - strh r0, [r5, 0x8] -_0803FD3E: - movs r1, 0x3C - ldrsh r0, [r7, r1] - cmp r0, r10 - beq _0803FD64 - mov r2, r10 - strh r2, [r7, 0x3C] - ldr r3, _0803FE14 - adds r0, r3, 0 - strh r0, [r5, 0xA] - ldr r1, _0803FE18 - adds r0, r1, 0 - strh r0, [r5, 0xC] - adds r1, r5, 0 - adds r1, 0xE - ldrb r2, [r4] - mov r0, r10 - movs r3, 0 - bl sub_803FE30 -_0803FD64: - movs r2, 0x3E - ldrsh r0, [r7, r2] - cmp r0, r9 - beq _0803FD84 - ldr r3, _0803FE1C - adds r0, r3, 0 - strh r0, [r5, 0x12] - ldr r1, _0803FE20 - adds r0, r1, 0 - strh r0, [r5, 0x14] - adds r1, r5, 0 - adds r1, 0x16 - ldrb r2, [r4] - mov r0, r9 - bl sub_803FF18 -_0803FD84: - adds r6, r7, 0 - adds r6, 0x40 - movs r2, 0 - ldrsh r0, [r6, r2] - cmp r0, r8 - beq _0803FDA2 - ldr r3, _0803FE24 - adds r0, r3, 0 - strh r0, [r5, 0x1C] - adds r1, r5, 0 - adds r1, 0x1E - ldrb r2, [r4] - mov r0, r8 - bl sub_803FF18 -_0803FDA2: - ldrb r2, [r4] - mov r0, r9 - mov r1, r8 - bl sub_803FA4C - mov r0, r8 - strh r0, [r6] - mov r1, r9 - strh r1, [r7, 0x3E] - mov r0, r8 - cmp r0, 0 - bge _0803FDBC - adds r0, 0x7 -_0803FDBC: - asrs r1, r0, 3 - adds r4, r7, 0 - adds r4, 0x42 - strh r1, [r4] - movs r0, 0x7 - mov r2, r8 - ands r2, r0 - cmp r2, 0 - beq _0803FDD2 - adds r0, r1, 0x1 - strh r0, [r4] -_0803FDD2: - movs r3, 0 - ldrsh r0, [r4, r3] - cmp r0, 0xB - ble _0803FDDE - movs r0, 0xC - strh r0, [r4] -_0803FDDE: - movs r1, 0 - ldr r0, _0803FE28 - movs r2, 0xB3 - lsls r2, 2 - adds r4, r2, 0 - ldr r2, _0803FE2C - adds r3, r2, 0 - adds r2, r0, 0 - adds r2, 0x24 -_0803FDF0: - adds r0, r1, r4 - orrs r0, r3 - strh r0, [r2] - adds r2, 0x2 - adds r1, 0x1 - cmp r1, 0xB - ble _0803FDF0 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FE10: .4byte 0x0000f2b8 -_0803FE14: .4byte 0x0000f2b9 -_0803FE18: .4byte 0x0000f2ba -_0803FE1C: .4byte 0x0000f2bb -_0803FE20: .4byte 0x0000f2bc -_0803FE24: .4byte 0x0000f2bd -_0803FE28: .4byte gUnknown_202B038 -_0803FE2C: .4byte 0xfffff000 - thumb_func_end sub_803FB74 - - thumb_func_start sub_803FE30 -sub_803FE30: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r5, r0, 0 - adds r4, r1, 0 - lsls r2, 24 - lsrs r2, 24 - adds r1, r2, 0 - lsls r3, 24 - lsrs r3, 24 - mov r12, r3 - movs r0, 0 - cmp r2, 0 - bne _0803FE4E - movs r0, 0x37 -_0803FE4E: - cmp r5, 0x64 - ble _0803FE70 - cmp r2, 0 - beq _0803FE60 - ldr r1, _0803FE5C - adds r0, r1, 0 - b _0803FE64 - .align 2, 0 -_0803FE5C: .4byte 0x0000f291 -_0803FE60: - ldr r2, _0803FE6C - adds r0, r2, 0 -_0803FE64: - strh r0, [r4] - strh r0, [r4, 0x2] - b _0803FF00 - .align 2, 0 -_0803FE6C: .4byte 0x0000f2c8 -_0803FE70: - cmp r5, 0x64 - bne _0803FEBC - ldr r1, _0803FE84 - adds r0, r1, 0 - strh r0, [r4] - ldr r2, _0803FE88 - adds r0, r2, 0 - strh r0, [r4, 0x2] - b _0803FF00 - .align 2, 0 -_0803FE84: .4byte 0x0000f294 -_0803FE88: .4byte 0x0000f295 -_0803FE8C: - ldr r1, _0803FEB4 - lsls r0, r6, 3 - adds r0, r6 - adds r0, r2 - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r4] - subs r0, r5, r3 - adds r0, r7 - movs r1, 0x96 - lsls r1, 2 - adds r0, r1 - ldr r2, _0803FEB8 - adds r1, r2, 0 - orrs r0, r1 - mov r1, r8 - strh r0, [r1] - b _0803FF00 - .align 2, 0 -_0803FEB4: .4byte gUnknown_80F64D8 -_0803FEB8: .4byte 0xfffff000 -_0803FEBC: - adds r2, r4, 0x2 - mov r8, r2 - adds r7, r0, 0 - adds r7, 0x30 - cmp r5, 0x9 - ble _0803FEE2 - movs r6, 0 - cmp r1, 0 - bne _0803FED0 - movs r6, 0x1 -_0803FED0: - movs r2, 0 - ldr r0, _0803FF0C -_0803FED4: - ldr r3, [r0] - cmp r3, r5 - ble _0803FE8C - adds r0, 0x4 - adds r2, 0x1 - cmp r2, 0x8 - ble _0803FED4 -_0803FEE2: - mov r0, r12 - cmp r0, 0 - bne _0803FEF0 - ldr r1, _0803FF10 - adds r0, r1, 0 - strh r0, [r4] - adds r4, 0x2 -_0803FEF0: - adds r0, r5, r7 - movs r2, 0x96 - lsls r2, 2 - adds r0, r2 - ldr r2, _0803FF14 - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r4] -_0803FF00: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FF0C: .4byte gUnknown_80F64B4 -_0803FF10: .4byte 0x0000f278 -_0803FF14: .4byte 0xfffff000 - thumb_func_end sub_803FE30 thumb_func_start sub_803FF18 sub_803FF18: diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index af8290545..bb9ff0069 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -118,6 +118,7 @@ typedef struct UnkDungeonGlobal_unk181E8_sub s16 unk3C; // x3C s16 unk3E; // x3E s16 unk40; // x40 + s16 unk42; // x42 } UnkDungeonGlobal_unk181E8_sub; // x44 // Sizeof: 0x1C diff --git a/src/code_803E724.c b/src/code_803E724.c index 1c26bf1d5..c6fc3b295 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -9,10 +9,13 @@ #include "code_8009804.h" #include "code_803E46C.h" #include "dungeon_util.h" +#include "code_800E9E4.h" #include "dungeon_pokemon_attributes.h" +#include "dungeon_map_access.h" #include "sprite.h" #include "bg_control.h" #include "game_options.h" +#include "code_800558C.h" #include "dungeon_range.h" #include "code_806CD90.h" #include "dungeon_items.h" @@ -1073,4 +1076,360 @@ void sub_803F580(u8 a0) sub_803F7BC(); } +void sub_803F7BC(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + Tile *tile = GetTile(strPtr->cameraPos.x, strPtr->cameraPos.y); + u32 roomId = tile->room; + + if (strPtr->unk1820B != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { + sub_8005838(NULL, 0); + } + else if (roomId == 0xFF) { + u32 kind = (strPtr->visibilityRange == 2) ? 1 : 2; + sub_8005838(NULL, kind); + } + else { + s32 sp[4]; + RoomData *room = &gDungeon->roomData[roomId]; + + sp[0] = room->unkC - strPtr->cameraPixelPos.x; + sp[1] = room->unk10 - strPtr->cameraPixelPos.y; + sp[2] = room->unk14 - strPtr->cameraPixelPos.x; + sp[3] = room->unk18 - strPtr->cameraPixelPos.y; + sub_8005838(sp, 3); + } +} + +void sub_803F878(s32 a0, s32 a1) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + strPtr->cameraPixelPosMirror = strPtr->cameraPixelPos; + strPtr->cameraPosMirror = strPtr->cameraPos; + strPtr->cameraPixelPos.x = (a0 / 256) - 120; + strPtr->cameraPixelPos.y = (a1 / 256) - 96; + strPtr->cameraPos.x = a0 / 6144; + strPtr->cameraPos.y = a1 / 6144; + strPtr->unk1820D = 0; + strPtr->unk1820E = 0; + strPtr->unk18211 = 0; + strPtr->unk18216 = 0; + + if (gUnknown_202EDFC != 0) { + gUnknown_202EDFC = 0; + SetBGOBJEnableFlags(0); + } + + if (abs(strPtr->cameraPixelPosMirror.x - strPtr->cameraPixelPos.x) > 7 || abs(strPtr->cameraPixelPosMirror.y - strPtr->cameraPixelPos.y) > 7) { + sub_8049ED4(); + strPtr->unk18213 = 1; + } + else { + if (strPtr->cameraPixelPosMirror.x < strPtr->cameraPixelPos.x) { + sub_804A1F0(240, 0); + } + else if (strPtr->cameraPixelPosMirror.x > strPtr->cameraPixelPos.x) { + sub_804A1F0(0, 0); + } + + if (strPtr->cameraPixelPosMirror.y < strPtr->cameraPixelPos.y) { + sub_804A49C(0, 160); + } + else if (strPtr->cameraPixelPosMirror.y > strPtr->cameraPixelPos.y) { + sub_804A49C(0, 0); + } + } + + sub_803F7BC(); +} + +s32 GetCameraXPos(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + return (strPtr->cameraPixelPos.x + 120) * 256; +} + +s32 GetCameraYPos(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + return (strPtr->cameraPixelPos.y + 96) * 256; +} + +void sub_803FB74(void); +extern u8 gUnknown_20274A5; + +void sub_803F9CC(void) +{ + s32 i; + Entity *cameraTarget = gDungeon->unk181e8.cameraTarget; + bool32 r5 = FALSE; + + if (gDungeon->unk1356C != 0 || gDungeon->unk181e8.unk18218 != 0 || sub_800EC74() != 0) { + r5 = FALSE; + } + else if (cameraTarget != NULL && GetEntityType(cameraTarget) == ENTITY_MONSTER) { + r5 = TRUE; + } + + if (!r5) { + for (i = 1; i < 30; i++) { + gUnknown_202B038[0][0][i] = 0; + } + sub_803F38C(); + } + else { + sub_803FB74(); + } + + gUnknown_20274A5 = 1; +} + +extern u32 gUnknown_3001018[]; +extern const u32 gUnknown_80F6490[]; + +void sub_803FA4C(s32 a0, s32 a1, bool8 a2) +{ + s32 i; + s32 r5; + u32 r10, r9; + u32 sp[9]; + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + u32 *dst = gUnknown_3001018; + memcpy(sp, gUnknown_80F6490, sizeof(sp)); + + r10 = 0x22222222; + r9 = 0x44444444; + if (a0 == strPtr->unk3E && a1 == strPtr->unk40) + return; + if (!a2) { + r9 = 0x55555555; + } + + strPtr->unk3E = a0; + strPtr->unk40 = a1; + r5 = a1; + if (r5 >= 96) { + r5 = 96; + a0 = (a0 * 96) / a1; + } + + for (i = 0; i < 96; i += 8) { + u32 val0, val1; + u32 val6 = 0x77777777; + s32 id1 = a0; + s32 id2 = r5; + + if (a0 >= 8) { + id1 = 8; + } + if (r5 >= 8) { + id2 = 8; + } + + val1 = sp[id2] & ~(sp[id1]); + val1 &= r10; + val0 = (sp[id1] & r9) | val1; + val6 = sp[id2] & val6; + *(dst++) = 0; + *(dst++) = val6; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val6; + *(dst++) = 0; + + a0 -= 8; + r5 -= 8; + if (a0 < 0) { + a0 = 0; + } + if (r5 < 0) { + r5 = 0; + } + } + sub_80098BC((void *) VRAM + 0x5980, gUnknown_3001018, 0x180); +} + +extern s32 gUnknown_202EDCC; + +// 2d array? possibly the same as gUnknown_202D06C TODO: merge the variables +extern u8 gUnknown_202D068[]; + +void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3); +void sub_803FF18(s32 a0, u16 *a1, u8 a2); + +void sub_803FB74(void) +{ + s32 i; + u16 *arrPtr; + s32 r5, r6, unkFloor; + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + bool32 lowHp = FALSE; + bool32 hungry = FALSE; + EntityInfo *entInfo = GetEntInfo(strPtr->cameraTarget); + s32 hp = entInfo->HP; + s32 maxHp = entInfo->maxHPStat; + s32 level = entInfo->level; + + if (entInfo->HP > 0 && entInfo->HP <= entInfo->maxHPStat / 4) { + lowHp = TRUE; + } + // reloaded again + entInfo = GetEntInfo(strPtr->cameraTarget); + if (FixedPointToInt(entInfo->belly) == 0) { + hungry = TRUE; + } + + if (lowHp && (gUnknown_202EDCC & 16) != 0) { + r5 = 32, r6 = 32; + } + else { + r5 = 0, r6 = 0; + } + + if (hungry && (gUnknown_202EDCC & 16) != 0) { + r5 = 48, r6 = 48; + } + + if (r5 == 0) { + if (strPtr->unk18212 != 0) { + r5 = 96; + } + else if (gGameOptionsRef->playerGender != MALE) { + r5 = 64; + } + } + + if (r6 == 0) { + if (gGameOptionsRef->playerGender != MALE) { + r6 = 64; + } + } + + if (strPtr->unk36 != r5) { + strPtr->unk36 = r5; + SetBGPaletteBufferColorArray(0xFC, &gUnknown_202D068[0 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFD, &gUnknown_202D068[4 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFE, &gUnknown_202D068[8 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFF, &gUnknown_202D068[12 + r5 * 4]); + } + + if (strPtr->unk38 != r6) { + strPtr->unk38 = r6; + nullsub_5(0xFC, &gUnknown_202D068[0 + r6 * 4]); + nullsub_5(0xFD, &gUnknown_202D068[4 + r6 * 4]); + nullsub_5(0xFE, &gUnknown_202D068[8 + r6 * 4]); + nullsub_5(0xFF, &gUnknown_202D068[12 + r6 * 4]); + } + + arrPtr = gUnknown_202B038[0][0]; + unkFloor = gDungeon->unk14 + gDungeon->dungeonLocation.floor; + if (strPtr->unk3A != unkFloor) { + strPtr->unk3A = unkFloor; + if (IsStairDirectionUp(gDungeon->dungeonLocation.id)) { + arrPtr[1] = 0; + } + else { + arrPtr[1] = 0xF2BE; + } + + if (unkFloor < 10) { + sub_803FE30(unkFloor, &arrPtr[2], strPtr->unk18216, 1); + arrPtr[3] = 0xF2B8; + } + else { + sub_803FE30(unkFloor, &arrPtr[2], strPtr->unk18216, 0); + arrPtr[4] = 0xF2B8; + } + } + + if (strPtr->unk3C != level) { + strPtr->unk3C = level; + arrPtr[5] = 0xF2B9; + arrPtr[6] = 0xF2BA; + sub_803FE30(level, &arrPtr[7], strPtr->unk18216, 0); + } + + if (strPtr->unk3E != hp) { + arrPtr[9] = 0xF2BB; + arrPtr[10] = 0xF2BC; + sub_803FF18(hp, &arrPtr[11], strPtr->unk18216); + } + + if (strPtr->unk40 != maxHp) { + arrPtr[14] = 0xF2BD; + sub_803FF18(maxHp, &arrPtr[15], strPtr->unk18216); + } + + sub_803FA4C(hp, maxHp, strPtr->unk18216); + strPtr->unk40 = maxHp; + strPtr->unk3E = hp; + strPtr->unk42 = maxHp / 8; + if (maxHp % 8 != 0) { + strPtr->unk42++; + } + + if (strPtr->unk42 >= 12) { + strPtr->unk42 = 12; + } + + for (i = 0; i < 12; i++) { + gUnknown_202B038[0][0][18 + i] = (0x2CC + i) | 0xF000; + } +} + +extern const s32 gUnknown_80F64B4[]; +extern const u16 gUnknown_80F64D8[][9]; + +void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3) +{ + s32 var = 0; + if (!a2) { + var = 55; + } + + if (a0 > 100) { + if (a2) { + a1[0] = 0xF291; + a1[1] = 0xF291; + } + else { + a1[0] = 0xF2C8; + a1[1] = 0xF2C8; + } + } + else if (a0 == 100) { + a1[0] = 0xF294; + a1[1] = 0xF295; + } + else { + // I thought 'ptr' was a compiler generated variable, but I couldn't match the function without declaring it. + u16 *ptr = a1 + 1; + s32 r7 = var + 48; + + if (a0 >= 10) { + s32 i; + s32 arrId = (a2 == 0) ? 1 : 0; + + for (i = 0; i < 9; i++) { + #ifndef NONMATCHING + a1++;a1--; // Good old matching trick. + #endif // NONMATCHING + if (gUnknown_80F64B4[i] <= a0) { + *a1 = gUnknown_80F64D8[arrId][i]; + *ptr = (((a0 - gUnknown_80F64B4[i]) + r7) + 0x258) | 0xF000; + return; + } + } + } + if (a3 == 0) { + *(a1++) = 0xF278; + } + + *a1 = (a0 + r7 + 0x258) | 0xF000; + } +} + // From 0f72d97ac49b2682ab151a5cfefb11d3144c6edd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 9 Oct 2024 10:50:25 +0200 Subject: [PATCH 6/8] code_803E724 decompiled --- asm/code_803E724.s | 158 --------------------------------------------- ld_script.txt | 1 - src/code_803E724.c | 150 ++++++++++++++++++++++++------------------ 3 files changed, 88 insertions(+), 221 deletions(-) delete mode 100644 asm/code_803E724.s diff --git a/asm/code_803E724.s b/asm/code_803E724.s deleted file mode 100644 index b148e780f..000000000 --- a/asm/code_803E724.s +++ /dev/null @@ -1,158 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - - - thumb_func_start sub_803FF18 -sub_803FF18: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r5, r0, 0 - adds r3, r1, 0 - lsls r2, 24 - lsrs r2, 24 - movs r6, 0 - cmp r2, 0 - bne _0803FF2E - movs r6, 0x1 -_0803FF2E: - movs r1, 0 - cmp r2, 0 - bne _0803FF36 - movs r1, 0x37 -_0803FF36: - ldr r0, _0803FF54 - cmp r5, r0 - ble _0803FF7C - ldr r0, _0803FF58 - lsls r1, r6, 3 - adds r1, r6 - lsls r1, 1 - adds r1, r0 - ldrh r0, [r1] - strh r0, [r3] - adds r3, 0x2 - strh r0, [r3] - strh r0, [r3, 0x2] - b _0804001A - .align 2, 0 -_0803FF54: .4byte 0x000003e7 -_0803FF58: .4byte gUnknown_80F6544 -_0803FF5C: - ldr r1, _0803FF78 - lsls r0, r6, 3 - adds r0, r6 - adds r0, r4 - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r3] - adds r3, 0x2 - subs r5, r2 - mov r1, r8 - lsls r0, r1, 24 - lsrs r7, r0, 24 - b _0803FF98 - .align 2, 0 -_0803FF78: .4byte gUnknown_80F6544 -_0803FF7C: - movs r7, 0x20 - movs r4, 0 - adds r1, 0x30 - mov r8, r1 - ldr r2, _0803FFC0 - mov r12, r2 - ldr r0, _0803FFC4 -_0803FF8A: - ldr r2, [r0] - cmp r2, r5 - ble _0803FF5C - adds r0, 0x4 - adds r4, 0x1 - cmp r4, 0x8 - ble _0803FF8A -_0803FF98: - cmp r4, 0x9 - bne _0803FFAC - movs r1, 0x96 - lsls r1, 2 - adds r0, r7, r1 - ldr r2, _0803FFC8 - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r3] - adds r3, 0x2 -_0803FFAC: - movs r4, 0 - mov r0, r12 - ldr r2, [r0] - cmp r2, r5 - bgt _0803FFD0 - ldr r0, _0803FFCC - lsls r1, r6, 3 - adds r1, r6 - b _0803FFE8 - .align 2, 0 -_0803FFC0: .4byte gUnknown_80F6520 -_0803FFC4: .4byte gUnknown_80F64FC -_0803FFC8: .4byte 0xfffff000 -_0803FFCC: .4byte gUnknown_80F6544 -_0803FFD0: - adds r4, 0x1 - cmp r4, 0x8 - bgt _0803FFF4 - lsls r0, r4, 2 - add r0, r12 - ldr r2, [r0] - cmp r2, r5 - bgt _0803FFD0 - ldr r0, _08040024 - lsls r1, r6, 3 - adds r1, r6 - adds r1, r4 -_0803FFE8: - lsls r1, 1 - adds r1, r0 - ldrh r0, [r1] - strh r0, [r3] - adds r3, 0x2 - subs r5, r2 -_0803FFF4: - cmp r4, 0x9 - bne _08040008 - movs r1, 0x96 - lsls r1, 2 - adds r0, r7, r1 - ldr r2, _08040028 - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r3] - adds r3, 0x2 -_08040008: - mov r1, r8 - adds r0, r5, r1 - movs r2, 0x96 - lsls r2, 2 - adds r0, r2 - ldr r2, _08040028 - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r3] -_0804001A: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08040024: .4byte gUnknown_80F6544 -_08040028: .4byte 0xfffff000 - thumb_func_end sub_803FF18 - - .align 2,0 @ Don't pad with nop diff --git a/ld_script.txt b/ld_script.txt index c4032e3ff..f2dc4e5af 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -209,7 +209,6 @@ SECTIONS { asm/code_803D110.o(.text); src/code_803E46C.o(.text); src/code_803E724.o(.text); - asm/code_803E724.o(.text); src/code_8040094.o(.text); asm/code_8040094.o(.text); src/code_8041AD0.o(.text); diff --git a/src/code_803E724.c b/src/code_803E724.c index c6fc3b295..def790229 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -25,6 +25,7 @@ extern s32 gUnknown_202EDC8; extern u32 gUnknown_202EDD0; extern s32 gUnknown_202EDD8; +extern u32 gUnknown_202EDFC; struct DungeonPalFile { @@ -37,14 +38,52 @@ extern struct DungeonPalFile *gDungeonNameBannerPalette; extern struct DungeonPalFile *gUnknown_202EC94; extern u8 gUnknown_202ECA4[]; extern u8 gUnknown_202D058[]; +extern u8 gUnknown_203B40C; +extern MenuInputStruct gUnknown_202EE10; +extern SpriteOAM gUnknown_202EDDC; extern const u8 gUnknown_80F62AC[]; +extern const struct UnkTextStruct2 gUnknown_80F62B0[]; +extern const struct UnkTextStruct2 gUnknown_80F6310[]; +extern const struct UnkTextStruct2 gUnknown_80F6370[]; +extern const struct UnkTextStruct2 gUnknown_80F63D0[]; +extern const u32 gUnknown_80F6490[]; +extern const s32 gUnknown_80F64B4[]; +extern const s32 gUnknown_80F64FC[]; +extern const s32 gUnknown_80F6520[]; +extern const u16 gUnknown_80F64D8[][9]; +extern const u16 gUnknown_80F6544[][9]; + +extern u8 gUnknown_20274A5; + +extern u8 gUnknown_202D06C[]; +// 2d array? possibly the same as gUnknown_202D06C TODO: merge the variables +extern u8 gUnknown_202D068[]; + +extern s32 gUnknown_202EDCC; +extern u32 gUnknown_3001018[]; extern void sub_8052210(u32); extern void sub_8040A84(); extern void sub_8083D44(void); +extern void sub_8052210(u32); +extern void sub_8049ED4(void); +extern void sub_8040A84(void); +extern void sub_80400D4(void); +extern void sub_8041888(u8 param_1); +extern void sub_804A1F0(s32 a0, s32 a1); +extern void sub_804A49C(s32 a0, s32 a1); +extern void sub_80402AC(s32, s32); void sub_803EC94(void); +void sub_8040ABC(u8 a0); +s32 sub_803EF90(s32 a0, u8 a1); +void sub_803F580(u8 a0); +void sub_803F7BC(void); +void sub_803F38C(void); +void sub_803FB74(void); +void sub_803FE30(s32 a0, u16 *a1, bool8 a2, bool8 a3); +void sub_803FF18(s32 a0, u16 *a1, bool8 a2); void sub_803E874(bool8 r10, s32 r9) { @@ -146,15 +185,6 @@ void sub_803EA10(void) SetBGPaletteBufferColorRGB(248, gUnknown_202D058, gUnknown_202EDC8, NULL); } -extern u8 gUnknown_203B40C; - -extern const struct UnkTextStruct2 gUnknown_80F62B0[]; -extern const struct UnkTextStruct2 gUnknown_80F6310[]; -extern const struct UnkTextStruct2 gUnknown_80F6370[]; -extern const struct UnkTextStruct2 gUnknown_80F63D0[]; - -void sub_8040ABC(u8 a0); - void sub_803EAF0(u32 a0, u8 *a1) { if (a0 == gUnknown_202EDD0) @@ -237,8 +267,6 @@ void sub_803EAF0(u32 a0, u8 *a1) gUnknown_202EDD0 = a0; } -extern MenuInputStruct gUnknown_202EE10; - void sub_803EC94(void) { gUnknown_202EE10.unk1E = 0; @@ -249,8 +277,6 @@ void sub_803EC94(void) sub_801317C(&gUnknown_202EE10.unk28); } -extern void sub_8052210(u32); - void sub_803ECB4(UnkTextStruct2 *a0, bool8 a1) { gUnknown_202EDD0 = 10; @@ -270,8 +296,6 @@ void sub_803ECE0(void) sub_80098BC((void *)VRAM + 0x14400, gUnknown_202EC94->unk4 + ((gUnknown_202EDD8 / 4) * 0x240), 0x240); } -s32 sub_803EF90(s32 a0, u8 a1); - struct UnkStruct_202EDE8 { s16 unk0; @@ -322,8 +346,6 @@ void sub_803ED30(s32 a0, Entity *mon, u8 a2, s32 a3) sub_80098BC((void *) VRAM + 0x142C0, gDungeon->unk18, 0x80); } -extern SpriteOAM gUnknown_202EDDC; - void sub_803EDF0(void) { EntityInfo *entInfo; @@ -806,10 +828,6 @@ NAKED s32 sub_803EF90(s32 a0, u8 a1) " bx r1\n"); } -void sub_803F38C(void); - -extern u32 gUnknown_202EDFC; - void sub_803F27C(bool8 a0) { UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; @@ -861,8 +879,6 @@ void sub_803F27C(bool8 a0) } } -extern u8 gUnknown_202D06C[]; - void sub_803F38C(void) { s32 palAdd; @@ -901,12 +917,6 @@ bool8 sub_803F428(Position *pos) return FALSE; } -void sub_803F580(u8 a0); -void sub_803F7BC(void); -extern void sub_8049ED4(void); -extern void sub_8040A84(void); -extern void sub_80400D4(void); - void sub_803F4A0(Entity *a0) { UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; @@ -954,11 +964,6 @@ void sub_803F508(Entity *a0) sub_8040A84(); } -extern void sub_8041888(u8 param_1); -extern void sub_804A1F0(s32 a0, s32 a1); -extern void sub_804A49C(s32 a0, s32 a1); -extern void sub_80402AC(s32, s32); - void sub_803F580(u8 a0) { UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; @@ -1156,9 +1161,6 @@ s32 GetCameraYPos(void) return (strPtr->cameraPixelPos.y + 96) * 256; } -void sub_803FB74(void); -extern u8 gUnknown_20274A5; - void sub_803F9CC(void) { s32 i; @@ -1185,9 +1187,6 @@ void sub_803F9CC(void) gUnknown_20274A5 = 1; } -extern u32 gUnknown_3001018[]; -extern const u32 gUnknown_80F6490[]; - void sub_803FA4C(s32 a0, s32 a1, bool8 a2) { s32 i; @@ -1252,14 +1251,6 @@ void sub_803FA4C(s32 a0, s32 a1, bool8 a2) sub_80098BC((void *) VRAM + 0x5980, gUnknown_3001018, 0x180); } -extern s32 gUnknown_202EDCC; - -// 2d array? possibly the same as gUnknown_202D06C TODO: merge the variables -extern u8 gUnknown_202D068[]; - -void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3); -void sub_803FF18(s32 a0, u16 *a1, u8 a2); - void sub_803FB74(void) { s32 i; @@ -1380,15 +1371,9 @@ void sub_803FB74(void) } } -extern const s32 gUnknown_80F64B4[]; -extern const u16 gUnknown_80F64D8[][9]; - -void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3) +void sub_803FE30(s32 a0, u16 *a1, bool8 a2, bool8 a3) { - s32 var = 0; - if (!a2) { - var = 55; - } + s32 var = (a2) ? 0 : 55; if (a0 > 100) { if (a2) { @@ -1407,11 +1392,11 @@ void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3) else { // I thought 'ptr' was a compiler generated variable, but I couldn't match the function without declaring it. u16 *ptr = a1 + 1; - s32 r7 = var + 48; + s32 varAdd = var + 48; if (a0 >= 10) { s32 i; - s32 arrId = (a2 == 0) ? 1 : 0; + s32 arrId = (!a2) ? 1 : 0; for (i = 0; i < 9; i++) { #ifndef NONMATCHING @@ -1419,17 +1404,58 @@ void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3) #endif // NONMATCHING if (gUnknown_80F64B4[i] <= a0) { *a1 = gUnknown_80F64D8[arrId][i]; - *ptr = (((a0 - gUnknown_80F64B4[i]) + r7) + 0x258) | 0xF000; + *ptr = (((a0 - gUnknown_80F64B4[i]) + varAdd) + 0x258) | 0xF000; return; } } } - if (a3 == 0) { + if (!a3) { *(a1++) = 0xF278; } - *a1 = (a0 + r7 + 0x258) | 0xF000; + *a1 = (a0 + varAdd + 0x258) | 0xF000; } } -// +void sub_803FF18(s32 a0, u16 *a1, bool8 a2) +{ + s32 arrId = (!a2) ? 1 : 0; + s32 var = (a2) ? 0 : 55; + + if (a0 > 999) { + u16 val = gUnknown_80F6544[arrId][0]; + *(a1++) = val; + *(a1++) = val; + *a1 = val; + } + else { + u8 toAdd = 32; + s32 i = 0; + s32 varAdd = var + 48; + + for (i = 0; i < 9; i++) { + if (gUnknown_80F64FC[i] <= a0) { + *(a1++) = gUnknown_80F6544[arrId][i]; + a0 -= gUnknown_80F64FC[i]; + toAdd = varAdd; + break; + } + } + if (i == 9) { + *(a1++) = (toAdd + 0x258) | 0xF000; + } + + for (i = 0; i < 9; i++) { + if (gUnknown_80F6520[i] <= a0) { + *(a1++) = gUnknown_80F6544[arrId][i]; + a0 -= gUnknown_80F6520[i]; + break; + } + } + if (i == 9) { + *(a1++) = (toAdd + 0x258) | 0xF000; + } + + *a1 = (a0 + varAdd + 0x258) | 0xF000; + } +} From 8d979b9c8377e4ce39d80e1f07efd45bdac15a39 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 9 Oct 2024 19:47:08 +0200 Subject: [PATCH 7/8] Update src/code_803E724.c Co-authored-by: Seth Barberee --- src/code_803E724.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code_803E724.c b/src/code_803E724.c index def790229..6a2f40509 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -1090,7 +1090,7 @@ void sub_803F7BC(void) if (strPtr->unk1820B != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { sub_8005838(NULL, 0); } - else if (roomId == 0xFF) { + else if (roomId == CORRIDOR_ROOM) { u32 kind = (strPtr->visibilityRange == 2) ? 1 : 2; sub_8005838(NULL, kind); } From c997958e97aaa5c3940fc2ea0a9607135ad2d3bc Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 9 Oct 2024 23:44:06 -0400 Subject: [PATCH 8/8] Update HandleTextFormat decomp.me to closer match --- src/text2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text2.c b/src/text2.c index 783eb4170..e6b6856e2 100644 --- a/src/text2.c +++ b/src/text2.c @@ -3532,7 +3532,7 @@ extern u8 gUnknown_20274A6[]; s32 InterpretColorChar(u8 a0); #ifdef NONMATCHING -// https://decomp.me/scratch/AJ2km +// https://decomp.me/scratch/lp1Fo const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct UnkDrawStringStruct *sp) { while (*str == '#') {