From 7e2702c6993495a58dab9da79d96ec26daa3471c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Mar 2025 19:05:37 +0100 Subject: [PATCH 01/18] sub_8040150 --- asm/code_8040094.s | 94 ----------------------------------- include/structs/str_dungeon.h | 23 ++++++++- src/code_8040094.c | 33 ++++++++++++ 3 files changed, 54 insertions(+), 96 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index 48176725e..a5aa409fc 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -5,100 +5,6 @@ .text - thumb_func_start sub_8040150 -sub_8040150: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - movs r0, 0 - ldr r2, _080401EC -_08040164: - movs r4, 0 - lsls r1, r0, 3 - adds r3, r0, 0x1 - mov r8, r3 - subs r1, r0 - lsls r0, r1, 7 - ldr r3, _080401F0 - adds r6, r0, r3 - lsls r5, r1, 2 -_08040176: - ldr r0, [r2] - adds r0, r6 - lsls r1, r4, 5 - adds r0, r1 - movs r1, 0x20 - str r2, [sp] - bl CpuClear - ldr r2, [sp] - ldr r0, [r2] - adds r1, r4, r5 - ldr r3, _080401F4 - adds r0, r3 - adds r0, r1 - movs r7, 0 - strb r7, [r0] - adds r4, 0x1 - cmp r4, 0x1B - ble _08040176 - mov r0, r8 - cmp r0, 0xF - ble _08040164 - mov r0, r9 - cmp r0, 0 - bne _080401B0 - ldr r1, _080401F8 - movs r0, 0x64 - strh r0, [r1] - strh r0, [r1, 0x2] -_080401B0: - ldr r3, _080401EC - ldr r0, [r3] - ldr r2, _080401FC - adds r1, r0, r2 - str r7, [r1] - ldr r1, _08040200 - adds r0, r1 - movs r2, 0x1 - strb r2, [r0] - ldr r0, [r3] - ldr r3, _08040204 - adds r0, r3 - strb r7, [r0] - ldr r0, _08040208 - strb r2, [r0] - ldr r1, _0804020C - ldr r0, _08040210 - str r0, [r1] - ldr r0, _08040214 - strb r2, [r0] - bl sub_8040238 - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080401EC: .4byte gDungeon -_080401F0: .4byte 0x0001822c -_080401F4: .4byte 0x0001ba2c -_080401F8: .4byte gUnknown_203B410 -_080401FC: .4byte 0x0001bdcc -_08040200: .4byte 0x0001bdd0 -_08040204: .4byte 0x0001bdd2 -_08040208: .4byte gUnknown_202EE00 -_0804020C: .4byte gUnknown_202EE08 -_08040210: .4byte 0x06001700 -_08040214: .4byte gUnknown_202EE01 - thumb_func_end sub_8040150 - thumb_func_start sub_8040218 sub_8040218: push {lr} diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index c5e73164e..5c4122a78 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -332,6 +332,25 @@ typedef struct unkDungeon57C #define UNK12A18_ARR_COUNT 29 #define UNK12A18_ARR_COUNT_2 9 +struct UnkDungeonGlobal_1822C_Sub +{ + u8 fill0[0x20]; +}; + +#define UNK1822C_ARR_COUNT 16 +#define UNK1822C_ARR_COUNT_2 28 + +struct UnkDungeonGlobal_1822C +{ + struct UnkDungeonGlobal_1822C_Sub unk1822C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; + u8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; + u8 fillUnk[0x1e0]; + s32 unk1BDCC; + u8 unk1BDD0; + u8 fill1BDD1; + u8 unk1BDD2; +}; + // size: 0x1CEDC typedef struct Dungeon { @@ -447,8 +466,8 @@ typedef struct Dungeon /* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX]; /* 0x181E4 */ OpenedFile *paletFile; /* 0x181E8 */ UnkDungeonGlobal_unk181E8_sub unk181e8; - u8 fill18220[0x1BDD4 - 0x1822C]; - struct UnkStructDungeon1BDD4 unk1BDD4; + /* 0x1822C */ struct UnkDungeonGlobal_1822C unk1822C; + /* 0x1BDD4 */ struct UnkStructDungeon1BDD4 unk1BDD4; /* 0x1BE14 */ struct MessageLogString messageLogStrings[MESSAGE_LOG_STRINGS_COUNT]; /* 0x1C570 */ DungeonLocation unk1C570; /* 0x1C574 */ FloorProperties unk1C574; diff --git a/src/code_8040094.c b/src/code_8040094.c index 323f7a101..47e26f463 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -9,6 +9,8 @@ #include "dungeon_music.h" #include "file_system.h" #include "play_time.h" +#include "cpu.h" +#include "dungeon.h" extern s32 gUnknown_80F6568[]; extern u8 gUnknown_202EE01; @@ -81,3 +83,34 @@ void sub_8040130(void) { gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); } + +extern DungeonPos gUnknown_203B410; +extern u8 gUnknown_202EE00; +extern void *gUnknown_202EE08; + +void sub_8040238(void); + +void sub_8040150(bool8 a0) +{ + s32 i, j; + + for (i = 0; i < UNK1822C_ARR_COUNT; i++) { + for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { + CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); + gDungeon->unk1822C.unk1BA2C[i][j] = 0; + } + } + + if (!a0) { + gUnknown_203B410.x = 100; + gUnknown_203B410.y = 100; + } + + gDungeon->unk1822C.unk1BDCC = 0; + gDungeon->unk1822C.unk1BDD0 = 1; + gDungeon->unk1822C.unk1BDD2 = 0; + gUnknown_202EE00 = 1; + gUnknown_202EE08 = (void *) VRAM + 0x1700; + gUnknown_202EE01 = 1; + sub_8040238(); +} From 8686fa4c7309dcbdeffb5e12d4b07cf8b9998ee8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Mar 2025 13:12:11 +0100 Subject: [PATCH 02/18] sub_80402AC and game version defines --- asm/code_8040094.s | 715 ---------------------------------- include/global.h | 4 + include/structs/str_dungeon.h | 7 +- src/code_8040094.c | 328 ++++++++++++++++ 4 files changed, 336 insertions(+), 718 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index a5aa409fc..58091e35e 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -5,721 +5,6 @@ .text - thumb_func_start sub_8040218 -sub_8040218: - push {lr} - ldr r0, _08040230 - ldr r0, [r0] - cmp r0, 0 - beq _08040226 - bl CloseFile -_08040226: - bl sub_8040124 - pop {r0} - bx r0 - .align 2, 0 -_08040230: .4byte gUnknown_202EE04 - thumb_func_end sub_8040218 - - thumb_func_start nullsub_203 -nullsub_203: - bx lr - thumb_func_end nullsub_203 - - thumb_func_start sub_8040238 -sub_8040238: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r1, _0804026C - ldr r0, [r1] - cmp r0, 0 - beq _080402A0 - ldr r0, _08040270 - ldrb r0, [r0] - cmp r0, 0 - beq _080402A0 - movs r6, 0 - ldr r0, _08040274 - mov r8, r0 - adds r7, r1, 0 -_08040256: - cmp r6, 0xE - bne _08040278 - movs r0, 0xEE - mov r1, r8 - bl SetBGPaletteBufferColorArray - movs r0, 0xEE - mov r1, r8 - bl nullsub_5 - b _0804029A - .align 2, 0 -_0804026C: .4byte gUnknown_202EE04 -_08040270: .4byte gUnknown_202EE01 -_08040274: .4byte gFontPalette + 0x4 -_08040278: - adds r5, r6, 0 - adds r5, 0xE0 - ldr r0, [r7] - ldr r0, [r0, 0x4] - lsls r4, r6, 2 - ldr r1, [r0, 0x4] - adds r1, r4 - adds r0, r5, 0 - bl SetBGPaletteBufferColorArray - ldr r0, [r7] - ldr r0, [r0, 0x4] - ldr r1, [r0, 0x4] - adds r1, r4 - adds r0, r5, 0 - bl nullsub_5 -_0804029A: - adds r6, 0x1 - cmp r6, 0xF - ble _08040256 -_080402A0: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8040238 - - thumb_func_start sub_80402AC -sub_80402AC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - mov r8, r0 - str r1, [sp] - ldr r4, _0804034C - ldr r0, [r4] - str r0, [sp, 0x4] - movs r1, 0x1 - mov r10, r1 - ldr r0, _08040350 - ldr r0, [r0] - cmp r0, 0 - bne _080402D0 - b _08040776 -_080402D0: - ldr r0, _08040354 - ldrb r0, [r0] - cmp r0, 0 - bne _080402DA - b _08040776 -_080402DA: - bl sub_800EC74 - lsls r0, 24 - cmp r0, 0 - beq _080402E6 - b _08040776 -_080402E6: - mov r2, r8 - cmp r2, 0 - bge _080402EE - b _08040776 -_080402EE: - ldr r3, [sp] - cmp r3, 0x1 - bgt _080402F6 - b _08040776 -_080402F6: - cmp r2, 0x37 - ble _080402FC - b _08040776 -_080402FC: - cmp r3, 0x1E - ble _08040302 - b _08040776 -_08040302: - mov r0, r8 - adds r1, r3, 0 - bl GetTile - mov r9, r0 - ldrh r0, [r0] - movs r5, 0x3 - ands r5, r0 - str r5, [sp, 0x8] - ldr r0, [r4] - ldr r7, _08040358 - adds r1, r0, r7 - ldrb r1, [r1] - str r1, [sp, 0xC] - ldr r2, _0804035C - adds r1, r0, r2 - ldrb r5, [r1] - ldr r3, _08040360 - adds r1, r0, r3 - ldrb r1, [r1] - str r1, [sp, 0x14] - subs r7, 0x2 - adds r1, r0, r7 - ldrb r1, [r1] - str r1, [sp, 0x10] - ldr r1, _08040364 - adds r0, r1 - ldrb r0, [r0] - cmp r5, 0 - beq _08040368 - mov r2, r9 - ldrb r0, [r2, 0x4] - mov r7, r10 - ands r7, r0 - movs r3, 0 - str r3, [sp, 0x18] - b _0804039C - .align 2, 0 -_0804034C: .4byte gDungeon -_08040350: .4byte gUnknown_202EE04 -_08040354: .4byte gUnknown_202EE01 -_08040358: .4byte 0x00018210 -_0804035C: .4byte 0x0001820a -_08040360: .4byte 0x0001820f -_08040364: .4byte 0x0001820b -_08040368: - cmp r0, 0 - beq _08040370 - movs r7, 0x1 - b _08040378 -_08040370: - mov r7, r9 - ldrb r0, [r7, 0x4] - mov r7, r10 - ands r7, r0 -_08040378: - bl GetFloorType - lsls r0, 24 - cmp r0, 0 - bne _08040398 - ldr r0, _08040390 - ldr r0, [r0] - ldr r1, _08040394 - adds r0, r1 - ldrb r0, [r0] - str r0, [sp, 0x18] - b _0804039C - .align 2, 0 -_08040390: .4byte gDungeon -_08040394: .4byte 0x00018211 -_08040398: - movs r2, 0 - str r2, [sp, 0x18] -_0804039C: - bl sub_8094C48 - lsls r0, 24 - cmp r0, 0 - bne _080403A8 - b _08040632 -_080403A8: - ldr r0, _080403FC - ldr r0, [r0] - ldr r3, _08040400 - adds r0, r3 - ldrb r0, [r0] - cmp r0, 0 - beq _080403B8 - b _08040632 -_080403B8: - movs r6, 0 - cmp r5, 0 - bne _0804045E - mov r0, r9 - ldr r4, [r0, 0x10] - cmp r4, 0 - beq _0804045E - adds r0, r4, 0 - bl GetEntityType - adds r1, r0, 0 - ldr r0, _08040404 - ldrb r0, [r0] - cmp r0, 0 - beq _0804045E - cmp r1, 0x1 - bne _0804045E - adds r0, r4, 0 - bl sub_8045804 - lsls r0, 24 - cmp r0, 0 - beq _0804045E - ldr r1, [r4, 0x70] - adds r0, r1, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _080403F6 - cmp r0, 0x47 - bne _08040408 -_080403F6: - movs r0, 0x1 - b _0804040A - .align 2, 0 -_080403FC: .4byte gDungeon -_08040400: .4byte 0x0001356c -_08040404: .4byte gUnknown_202EE00 -_08040408: - movs r0, 0 -_0804040A: - cmp r0, 0 - bne _08040458 - adds r0, r1, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08040458 - cmp r0, 0x4 - beq _08040458 - ldrb r0, [r1, 0x6] - cmp r0, 0 - beq _08040426 - movs r6, 0x2 - b _0804045A -_08040426: - ldrb r0, [r1, 0x7] - cmp r0, 0 - beq _08040458 - ldr r0, _0804044C - mov r1, r8 - strh r1, [r0] - mov r2, sp - ldrh r2, [r2] - strh r2, [r0, 0x2] - ldr r0, _08040450 - ldr r0, [r0] - ldr r3, _08040454 - adds r0, r3 - ldrb r0, [r0] - cmp r0, 0 - beq _0804045A - movs r6, 0x8 - b _0804045A - .align 2, 0 -_0804044C: .4byte gUnknown_203B410 -_08040450: .4byte gDungeon -_08040454: .4byte 0x00018214 -_08040458: - movs r6, 0xA -_0804045A: - movs r0, 0 - mov r10, r0 -_0804045E: - mov r1, r10 - cmp r1, 0 - beq _0804054E - cmp r5, 0 - bne _08040548 - mov r2, r9 - ldr r4, [r2, 0x14] - cmp r4, 0 - beq _08040500 - adds r0, r4, 0 - bl GetEntityType - adds r5, r0, 0 - cmp r7, 0 - bne _0804049E - movs r6, 0 - cmp r5, 0x3 - bne _0804054E - ldr r3, [sp, 0x10] - cmp r3, 0 - bne _08040494 - mov r5, r9 - ldrh r1, [r5, 0x4] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0804054E -_08040494: - ldr r0, [sp, 0x8] - cmp r0, 0 - beq _0804054E - movs r6, 0x3 - b _0804054E -_0804049E: - cmp r5, 0x2 - bne _080404C4 - adds r0, r4, 0 - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, 0 - bne _080404B2 - ldr r1, [sp, 0x14] - cmp r1, 0 - beq _080404C4 -_080404B2: - adds r0, r4, 0 - bl GetTrapData - ldr r1, _080404FC - ldrb r0, [r0] - adds r0, r1 - ldrb r6, [r0] - movs r2, 0 - mov r10, r2 -_080404C4: - mov r3, r10 - cmp r3, 0 - beq _0804054E - cmp r5, 0x3 - bne _080404EC - ldr r5, [sp, 0x10] - cmp r5, 0 - bne _080404E0 - mov r0, r9 - ldrh r1, [r0, 0x4] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080404EC -_080404E0: - ldr r1, [sp, 0x8] - cmp r1, 0 - beq _080404EC - movs r6, 0x3 - movs r2, 0 - mov r10, r2 -_080404EC: - mov r3, r10 - cmp r3, 0 - beq _0804054E - ldr r5, [sp, 0x8] - cmp r5, 0x1 - beq _08040548 - movs r6, 0 - b _0804054E - .align 2, 0 -_080404FC: .4byte gUnknown_80F65F0 -_08040500: - cmp r7, 0 - bne _08040528 - ldr r0, [sp, 0x18] - cmp r0, 0 - beq _08040548 - mov r2, r9 - ldrh r1, [r2] - movs r0, 0x80 - lsls r0, 2 - ands r0, r1 - cmp r0, 0 - beq _08040548 - bl GetFloorType - lsls r0, 24 - movs r6, 0x5 - cmp r0, 0 - bne _0804054E - movs r6, 0x6 - b _0804054E -_08040528: - mov r3, r9 - ldrh r1, [r3] - movs r0, 0x80 - lsls r0, 2 - ands r0, r1 - cmp r0, 0 - beq _08040548 - bl GetFloorType - lsls r0, 24 - movs r6, 0x5 - cmp r0, 0 - bne _08040544 - movs r6, 0x6 -_08040544: - movs r5, 0 - mov r10, r5 -_08040548: - mov r0, r10 - cmp r0, 0 - bne _0804055A -_0804054E: - ldr r1, [sp, 0xC] - cmp r1, 0 - beq _0804055A - cmp r6, 0 - beq _0804055E - movs r6, 0xB -_0804055A: - cmp r6, 0 - bne _08040606 -_0804055E: - cmp r7, 0 - beq _08040568 - ldr r2, [sp, 0x8] - cmp r2, 0x1 - beq _0804056C -_08040568: - movs r6, 0x1 - b _08040606 -_0804056C: - movs r4, 0xF - ldr r3, [sp] - cmp r3, 0x1E - bgt _0804058A - adds r1, r3, 0 - adds r1, 0x1 - mov r0, r8 - bl GetTile - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - bne _0804058A - movs r4, 0xE -_0804058A: - ldr r5, [sp] - cmp r5, 0 - ble _080405AA - adds r1, r5, 0 - subs r1, 0x1 - mov r0, r8 - bl GetTile - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - bne _080405AA - movs r0, 0x5 - negs r0, r0 - ands r4, r0 -_080405AA: - mov r7, r8 - cmp r7, 0x36 - bgt _080405CA - mov r0, r8 - adds r0, 0x1 - ldr r1, [sp] - bl GetTile - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - bne _080405CA - movs r0, 0x3 - negs r0, r0 - ands r4, r0 -_080405CA: - mov r0, r8 - cmp r0, 0 - ble _080405E8 - subs r0, 0x1 - ldr r1, [sp] - bl GetTile - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - bne _080405E8 - movs r0, 0x9 - negs r0, r0 - ands r4, r0 -_080405E8: - lsls r0, r4, 16 - asrs r6, r0, 16 - mov r2, r9 - ldrh r1, [r2, 0x4] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080405FE - adds r0, r6, 0 - adds r0, 0x10 - b _08040602 -_080405FE: - adds r0, r6, 0 - adds r0, 0x20 -_08040602: - lsls r0, 16 - asrs r6, r0, 16 -_08040606: - ldr r0, _08040618 - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0x6 - bne _0804061C - adds r0, r6, 0 - adds r0, 0x80 - b _0804062C - .align 2, 0 -_08040618: .4byte gGameOptionsRef -_0804061C: - bl DoesNotHaveShadedMap - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0804063A - adds r0, r6, 0 - adds r0, 0x40 -_0804062C: - lsls r0, 16 - asrs r6, r0, 16 - b _0804063A -_08040632: - movs r6, 0x1 - ldr r1, _0804074C - movs r0, 0x64 - strh r0, [r1] -_0804063A: - mov r3, r8 - lsrs r0, r3, 31 - add r0, r8 - asrs r0, 1 - mov r9, r0 - ldr r0, [sp] - subs r0, 0x2 - lsrs r1, r0, 31 - adds r1, r0, r1 - asrs r1, 1 - mov r5, r9 - lsls r3, r5, 1 - mov r7, r8 - subs r3, r7, r3 - lsls r2, r1, 1 - subs r0, r2 - lsls r0, 1 - adds r3, r0 - lsls r0, r1, 3 - subs r5, r0, r1 - lsls r0, r5, 7 - ldr r1, _08040750 - adds r0, r1 - ldr r2, [sp, 0x4] - adds r0, r2, r0 - mov r7, r9 - lsls r1, r7, 5 - adds r4, r0, r1 - ldr r0, _08040754 - ldr r0, [r0] - ldr r1, [r0, 0x4] - lsls r0, r6, 2 - adds r0, r3 - ldr r1, [r1] - lsls r0, 2 - adds r0, r1 - ldr r2, [r0] - ldr r0, [r4] - ldr r1, [r2] - ands r0, r1 - ldr r1, [r2, 0x4] - orrs r0, r1 - str r0, [r4] - ldr r0, [r4, 0x4] - ldr r1, [r2, 0x8] - ands r0, r1 - ldr r1, [r2, 0xC] - orrs r0, r1 - str r0, [r4, 0x4] - ldr r0, [r4, 0x8] - ldr r1, [r2, 0x10] - ands r0, r1 - ldr r1, [r2, 0x14] - orrs r0, r1 - str r0, [r4, 0x8] - ldr r0, [r4, 0xC] - ldr r1, [r2, 0x18] - ands r0, r1 - ldr r1, [r2, 0x1C] - orrs r0, r1 - str r0, [r4, 0xC] - ldr r0, [r4, 0x10] - ldr r1, [r2, 0x20] - ands r0, r1 - ldr r1, [r2, 0x24] - orrs r0, r1 - str r0, [r4, 0x10] - ldr r0, [r4, 0x14] - ldr r1, [r2, 0x28] - ands r0, r1 - ldr r1, [r2, 0x2C] - orrs r0, r1 - str r0, [r4, 0x14] - ldr r0, [r4, 0x18] - ldr r1, [r2, 0x30] - ands r0, r1 - ldr r1, [r2, 0x34] - orrs r0, r1 - str r0, [r4, 0x18] - ldr r0, [r4, 0x1C] - ldr r1, [r2, 0x38] - ands r0, r1 - ldr r1, [r2, 0x3C] - orrs r0, r1 - str r0, [r4, 0x1C] - ldr r0, [sp, 0x4] - ldr r1, _08040758 - adds r2, r0, r1 - ldrb r0, [r2] - cmp r0, 0 - bne _08040776 - lsls r5, 2 - mov r10, r5 - mov r3, r9 - add r3, r10 - ldr r5, _0804075C - mov r8, r5 - ldr r0, [sp, 0x4] - add r0, r8 - adds r1, r0, r3 - ldrb r0, [r1] - cmp r0, 0 - bne _08040776 - movs r0, 0x1 - strb r0, [r1] - ldr r7, [sp, 0x4] - ldr r1, _08040760 - adds r6, r7, r1 - ldr r5, [r6] - cmp r5, 0x27 - bgt _08040774 - lsls r1, r5, 1 - adds r1, r5 - lsls r1, 2 - ldr r0, _08040764 - adds r2, r7, r0 - adds r2, r1 - ldr r0, _08040768 - lsls r3, 5 - ldr r0, [r0] - adds r0, r3 - str r0, [r2] - ldr r2, _0804076C - adds r0, r7, r2 - adds r0, r1 - str r4, [r0] - ldr r3, _08040770 - adds r2, r7, r3 - adds r2, r1 - mov r0, r10 - add r0, r8 - adds r0, r7, r0 - add r0, r9 - str r0, [r2] - adds r0, r5, 0x1 - str r0, [r6] - b _08040776 - .align 2, 0 -_0804074C: .4byte gUnknown_203B410 -_08040750: .4byte 0x0001822c -_08040754: .4byte gUnknown_202EE04 -_08040758: .4byte 0x0001bdd1 -_0804075C: .4byte 0x0001ba2c -_08040760: .4byte 0x0001bdcc -_08040764: .4byte 0x0001bbec -_08040768: .4byte gUnknown_202EE08 -_0804076C: .4byte 0x0001bbf0 -_08040770: .4byte 0x0001bbf4 -_08040774: - strb r0, [r2] -_08040776: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80402AC thumb_func_start sub_8040788 sub_8040788: diff --git a/include/global.h b/include/global.h index de3274263..38f0ab311 100644 --- a/include/global.h +++ b/include/global.h @@ -8,6 +8,10 @@ #include "constants/global.h" #include "constants/monster.h" +#define VERSION_BLUE 0 +#define VERSION_RED 1 +#define GAME_VERSION VERSION_RED + // IDE support #if defined(__APPLE__) || defined(__CYGWIN__) #define _(x) x diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 5c4122a78..6a2ab0d03 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -332,9 +332,10 @@ typedef struct unkDungeon57C #define UNK12A18_ARR_COUNT 29 #define UNK12A18_ARR_COUNT_2 9 +// Some palette? struct UnkDungeonGlobal_1822C_Sub { - u8 fill0[0x20]; + u32 arr[8]; }; #define UNK1822C_ARR_COUNT 16 @@ -344,10 +345,10 @@ struct UnkDungeonGlobal_1822C { struct UnkDungeonGlobal_1822C_Sub unk1822C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; u8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; - u8 fillUnk[0x1e0]; + void *unk1BBEC[40][3]; s32 unk1BDCC; u8 unk1BDD0; - u8 fill1BDD1; + u8 unk1BDD1; u8 unk1BDD2; }; diff --git a/src/code_8040094.c b/src/code_8040094.c index 47e26f463..50819b8d8 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -11,6 +11,14 @@ #include "play_time.h" #include "cpu.h" #include "dungeon.h" +#include "game_options.h" +#include "bg_palette_buffer.h" +#include "code_8009804.h" +#include "code_800E9E4.h" +#include "dungeon_generation.h" +#include "dungeon_util.h" +#include "trap.h" +#include "constants/dungeon.h" extern s32 gUnknown_80F6568[]; extern u8 gUnknown_202EE01; @@ -114,3 +122,323 @@ void sub_8040150(bool8 a0) gUnknown_202EE01 = 1; sub_8040238(); } + +void sub_8040218(void) +{ + if (gUnknown_202EE04 != NULL) { + CloseFile(gUnknown_202EE04); + } + sub_8040124(); +} + +UNUSED static void nullsub_203(void) +{ + +} + +struct UnkStruct1 +{ + u32 **unk0; +}; + +struct UnkPaletteFileData +{ + struct UnkStruct1 *unk0; + RGB *pal; +}; + +void sub_8040238(void) +{ + s32 i; + + if (gUnknown_202EE04 == NULL) + return; + if (!gUnknown_202EE01) + return; + + for (i = 0; i < 16; i++) { + if (i == 14) { + SetBGPaletteBufferColorArray(238, &gFontPalette[1]); + nullsub_5(238, &gFontPalette[1]); + } + else { + SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); + nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); + } + } +} + +extern u8 GetFloorType(void); +extern bool8 sub_8094C48(void); +extern bool8 sub_8045804(Entity *ent); +extern const u8 gUnknown_80F65F0[]; +extern bool8 DoesNotHaveShadedMap(void); + +void sub_80402AC(s32 x, s32 y) +{ + s32 yAdd = 0; + const Tile *tile; + Dungeon *dungeon; + bool8 blinded; + u32 terrainType; + bool8 hallucinating; + bool8 var_2C; + bool8 var_28; + bool8 r0; + bool8 var_24; + bool8 r7; + s32 r6; + s32 xDiv2, yDiv2; + u32 *src, *dst; + bool8 r10; + s32 r3, yMinus; + + dungeon = gDungeon; + r10 = TRUE; + + if (gUnknown_202EE04 == NULL) + return; + if (!gUnknown_202EE01) + return; + if (sub_800EC74()) + return; + if (GAME_VERSION == VERSION_BLUE) { + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + if (x < 0 || y < 1 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) + return; + yAdd = 1; + } + else { + if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) + return; + yAdd = 0; + } + // FUN_0001d198(); Unknown function call which doesn't exist in red + } + else if (GAME_VERSION == VERSION_RED) { + if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y - 1) + return; + } + + tile = GetTile(x, y); + terrainType = GetTerrainType(tile); + hallucinating = gDungeon->unk181e8.hallucinating; + blinded = gDungeon->unk181e8.blinded; + var_28 = gDungeon->unk181e8.unk1820F; + var_2C = gDungeon->unk181e8.unk1820E; + r0 = gDungeon->unk181e8.unk1820B; + if (blinded) { + r7 = tile->spawnOrVisibilityFlags & 1; + var_24 = FALSE; + } + else { + if (r0) { + r7 = TRUE; + } + else { + r7 = tile->spawnOrVisibilityFlags & 1; + } + + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + var_24 = gDungeon->unk181e8.unk18211; + } + else { + var_24 = FALSE; + } + } + + if (sub_8094C48() && !gDungeon->unk1356C) { + r6 = 0; + if (!blinded) { + Entity *entity = tile->monster; + if (entity != NULL) { + s32 entType = GetEntityType(entity); + if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) { + EntityInfo *entInfo = GetEntInfo(entity); + if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) { + r6 = 10; + } + else { + if (entInfo->isNotTeamMember) { + r6 = 2; + } + else if (entInfo->isTeamLeader) { + gUnknown_203B410.x = x; + gUnknown_203B410.y = y; + if (gDungeon->unk181e8.unk18214) { + r6 = 8; + } + } + else { + r6 = 10; + } + } + r10 = FALSE; + } + } + } + if (r10 && !blinded) { + Entity *entity = tile->object; + if (entity != NULL) { + s32 entType = GetEntityType(entity); + if (!r7) { + r6 = 0; + if (entType == ENTITY_ITEM) { + if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + r6 = 3; + } + } + r10 = FALSE; + } + else { + if (entType == ENTITY_TRAP) { + if (entity->isVisible || var_28) { + Trap *trap = GetTrapData(entity); + r6 = gUnknown_80F65F0[trap->id]; + r10 = FALSE; + } + } + } + + if (r10) { + if (entType == ENTITY_ITEM) { + if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + r6 = 3; + r10 = FALSE; + } + } + } + if (r10) { + if (terrainType != TERRAIN_TYPE_NORMAL) { + r6 = 0; + r10 = FALSE; + } + } + } + else { + if (!r7) { + if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) { + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + r6 = 6; + } + else { + r6 = 5; + } + r10 = FALSE; + } + } + else { + if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) { + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + r6 = 6; + } + else { + r6 = 5; + } + r10 = FALSE; + } + } + } + } + if (!r10) { + if (hallucinating) { + if (r6 != 0) { + r6 = 11; + } + } + } + if (r6 == 0) { + if (!r7) { + r6 = 1; + } + else if (terrainType != TERRAIN_TYPE_NORMAL) { + r6 = 1; + } + else { + s32 r4 = 1 | 2 | 4 | 8; + if (y < DUNGEON_MAX_SIZE_Y - 1) { + const Tile *adjacentTile = GetTile(x, y + 1); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(1); + } + } + if (y >= 1) { + const Tile *adjacentTile = GetTile(x, y - 1); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(4); + } + } + if (x < DUNGEON_MAX_SIZE_X - 1) { + const Tile *adjacentTile = GetTile(x + 1, y); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(2); + } + } + if (x >= 1) { + const Tile *adjacentTile = GetTile(x - 1, y); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(8); + } + } + + r6 = (s16) r4; + if (tile->spawnOrVisibilityFlags & 2) { + r6 = (s16) (r6 + 16); + } + else { + r6 = (s16) (r6 + 32); + } + } + } + + // Not possible on GBA. + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + r6 = (s16) (r6 + 128); + } + else if (DoesNotHaveShadedMap() == TRUE) { + r6 = (s16) (r6 + 64); + } + } + else { + r6 = 1; + gUnknown_203B410.x = 100; + } + + xDiv2 = x / 2; + yMinus = (y - 2) + yAdd; + yDiv2 = (yMinus / 2); + r3 = x - (xDiv2 * 2); + r3 += (yMinus - (yDiv2 * 2)) * 2; + dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr; + { + struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data)); + src = ptr->unk0->unk0[r6 * 4 + r3]; + } + + dst[0] = (dst[0] & src[0]) | src[1]; + dst[1] = (dst[1] & src[2]) | src[3]; + dst[2] = (dst[2] & src[4]) | src[5]; + dst[3] = (dst[3] & src[6]) | src[7]; + dst[4] = (dst[4] & src[8]) | src[9]; + dst[5] = (dst[5] & src[10]) | src[11]; + dst[6] = (dst[6] & src[12]) | src[13]; + dst[7] = (dst[7] & src[14]) | src[15]; + + if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) { + s32 id; + + dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = 1; + id = dungeon->unk1822C.unk1BDCC; + if (id < 40) { + dungeon->unk1822C.unk1BBEC[id][0] = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); + dungeon->unk1822C.unk1BBEC[id][1] = dst; + dungeon->unk1822C.unk1BBEC[id][2] = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; + dungeon->unk1822C.unk1BDCC++; + } + else { + dungeon->unk1822C.unk1BDD1 = 1; + } + } +} + +// From 59ac6518b643d4f7bb1d122b1216dec21f5c57d3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Mar 2025 17:13:38 +0100 Subject: [PATCH 03/18] sub_8040894 --- asm/code_8040094.s | 366 ---------------------------------- include/structs/str_dungeon.h | 11 +- src/code_8040094.c | 103 +++++++++- 3 files changed, 107 insertions(+), 373 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index 58091e35e..7b81e7123 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -5,372 +5,6 @@ .text - - thumb_func_start sub_8040788 -sub_8040788: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r0, _08040814 - ldr r0, [r0] - mov r8, r0 - cmp r0, 0 - beq _08040870 - ldr r0, _08040818 - add r0, r8 - ldrb r0, [r0] - cmp r0, 0 - beq _08040870 - bl sub_800EC74 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0 - bne _08040870 - ldr r1, _0804081C - add r1, r8 - ldrb r0, [r1] - cmp r0, 0 - bne _0804082C - movs r6, 0 - ldr r1, _08040820 - add r1, r8 - ldr r0, [r1] - cmp r6, r0 - bge _08040868 - adds r5, r1, 0 - movs r4, 0 -_080407C8: - ldr r1, _08040824 - adds r0, r4, r1 - mov r1, r8 - adds r3, r1, r0 - ldr r1, [r3, 0x4] - ldr r2, [r3] - ldr r0, _08040828 - ldr r0, [r0] - cmp r0, 0 - beq _080407E0 - cmp r0, 0x3 - bne _08040800 -_080407E0: - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldm r1!, {r0} - stm r2!, {r0} - ldr r0, [r1] - str r0, [r2] -_08040800: - ldr r0, [r3, 0x8] - movs r1, 0 - strb r1, [r0] - adds r4, 0xC - adds r6, 0x1 - ldr r0, [r5] - cmp r6, r0 - blt _080407C8 - b _08040868 - .align 2, 0 -_08040814: .4byte gDungeon -_08040818: .4byte 0x0001bdd0 -_0804081C: .4byte 0x0001bdd1 -_08040820: .4byte 0x0001bdcc -_08040824: .4byte 0x0001bbec -_08040828: .4byte gUnknown_202EDD0 -_0804082C: - strb r2, [r1] - ldr r0, _0804087C - ldr r5, [r0] - ldr r4, _08040880 - add r4, r8 - movs r6, 0 - movs r7, 0x80 - lsls r7, 1 -_0804083C: - ldr r0, _08040884 - ldr r0, [r0] - cmp r0, 0 - beq _08040848 - cmp r0, 0x3 - bne _08040854 -_08040848: - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0x80 - lsls r2, 1 - bl CpuCopy -_08040854: - adds r5, r7 - adds r4, r7 - adds r6, 0x8 - ldr r0, _08040888 - cmp r6, r0 - ble _0804083C - ldr r1, _0804088C - add r1, r8 - movs r0, 0x1 - strb r0, [r1] -_08040868: - ldr r1, _08040890 - add r1, r8 - movs r0, 0 - str r0, [r1] -_08040870: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804087C: .4byte gUnknown_202EE08 -_08040880: .4byte 0x0001822c -_08040884: .4byte gUnknown_202EDD0 -_08040888: .4byte 0x000001bf -_0804088C: .4byte 0x0001bdd2 -_08040890: .4byte 0x0001bdcc - thumb_func_end sub_8040788 - - thumb_func_start sub_8040894 -sub_8040894: - push {r4-r7,lr} - sub sp, 0x8 - ldr r0, _080409F4 - ldr r1, [r0] - ldr r2, _080409F8 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _080408A8 - b _08040A6A -_080408A8: - adds r2, 0x5 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080408B4 - b _08040A6A -_080408B4: - ldr r7, _080409FC - movs r1, 0 - ldrsh r0, [r7, r1] - cmp r0, 0x63 - ble _080408C0 - b _08040A6A -_080408C0: - ldr r0, _08040A00 - ldrb r1, [r0] - adds r1, 0x1 - strb r1, [r0] - movs r0, 0x8 - ands r1, r0 - cmp r1, 0 - beq _080408D2 - b _08040A6A -_080408D2: - movs r0, 0 - movs r1, 0 - str r0, [sp] - str r1, [sp, 0x4] - mov r0, sp - ldrh r0, [r0] - ldr r1, _08040A04 - ands r1, r0 - ldr r3, _08040A08 - ldr r0, [sp] - ands r0, r3 - orrs r0, r1 - str r0, [sp] - mov r1, sp - ldrh r1, [r1] - adds r2, r3, 0 - ands r2, r0 - orrs r2, r1 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _08040A0C - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r5, _08040A10 - adds r0, r5, 0 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _08040A14 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r0, _08040A18 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - adds r2, r3, 0 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - mov r0, sp - ldrh r1, [r0] - ldr r4, _08040A1C - adds r0, r4, 0 - ands r0, r1 - adds r1, r3, 0 - ands r1, r2 - orrs r1, r0 - str r1, [sp] - mov r0, sp - ldrh r0, [r0] - ands r3, r1 - orrs r3, r0 - str r3, [sp] - mov r3, sp - ldrh r0, [r3, 0x2] - ldr r6, _08040A20 - ands r6, r0 - ands r6, r4 - strh r6, [r3, 0x2] - ldr r2, _08040A24 - ldrh r1, [r3, 0x4] - movs r0, 0xFC - lsls r0, 8 - ands r0, r1 - orrs r0, r2 - ands r0, r5 - movs r5, 0xF - lsls r1, r5, 12 - ldr r4, _08040A28 - ands r0, r4 - orrs r0, r1 - strh r0, [r3, 0x4] - ldrh r0, [r3, 0x6] - ldr r2, _08040A2C - ands r2, r0 - ldr r0, _08040A30 - ands r2, r0 - strh r2, [r3, 0x6] - ldr r0, _08040A34 - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0x6 - bne _08040A3C - movs r1, 0 - ldrsh r0, [r7, r1] - lsls r0, 2 - adds r0, 0x10 - ldr r1, _08040A38 - ands r0, r1 - strh r0, [r3, 0x2] - movs r1, 0x2 - ldrsh r0, [r7, r1] - adds r0, 0x1 - lsls r0, 2 - ands r0, r4 - lsls r0, 4 - adds r1, r2, 0 - ands r1, r5 - orrs r1, r0 - strh r1, [r3, 0x6] - movs r1, 0x80 - lsls r1, 1 - mov r0, sp - movs r2, 0 - movs r3, 0 - bl nullsub_11 - b _08040A6A - .align 2, 0 -_080409F4: .4byte gDungeon -_080409F8: .4byte 0x00018214 -_080409FC: .4byte gUnknown_203B410 -_08040A00: .4byte gUnknown_202EE02 -_08040A04: .4byte 0x0000feff -_08040A08: .4byte 0xffff0000 -_08040A0C: .4byte 0x0000fdff -_08040A10: .4byte 0x0000f3ff -_08040A14: .4byte 0x0000efff -_08040A18: .4byte 0x0000dfff -_08040A1C: .4byte 0x00003fff -_08040A20: .4byte 0x0000c1ff -_08040A24: .4byte 0x00000215 -_08040A28: .4byte 0x00000fff -_08040A2C: .4byte 0x0000fffe -_08040A30: .4byte 0x0000fffd -_08040A34: .4byte gGameOptionsRef -_08040A38: .4byte 0x000001ff -_08040A3C: - movs r1, 0 - ldrsh r0, [r7, r1] - lsls r0, 2 - adds r0, 0x8 - ldr r1, _08040A74 - ands r0, r1 - strh r0, [r3, 0x2] - movs r1, 0x2 - ldrsh r0, [r7, r1] - lsls r0, 2 - ands r0, r4 - lsls r0, 4 - adds r1, r2, 0 - ands r1, r5 - orrs r1, r0 - strh r1, [r3, 0x6] - movs r1, 0x80 - lsls r1, 1 - mov r0, sp - movs r2, 0 - movs r3, 0 - bl AddSprite -_08040A6A: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08040A74: .4byte 0x000001ff - thumb_func_end sub_8040894 - thumb_func_start sub_8040A78 sub_8040A78: ldr r1, _08040A80 diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 6a2ab0d03..2252c2962 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -341,11 +341,18 @@ struct UnkDungeonGlobal_1822C_Sub #define UNK1822C_ARR_COUNT 16 #define UNK1822C_ARR_COUNT_2 28 +struct UnkDungeonGlobal_unk1BBEC +{ + u32 *ptr1; + u32 *ptr2; + bool8 *boolPtr; +}; + struct UnkDungeonGlobal_1822C { struct UnkDungeonGlobal_1822C_Sub unk1822C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; - u8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; - void *unk1BBEC[40][3]; + bool8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; + struct UnkDungeonGlobal_unk1BBEC unk1BBEC[40]; s32 unk1BDCC; u8 unk1BDD0; u8 unk1BDD1; diff --git a/src/code_8040094.c b/src/code_8040094.c index 50819b8d8..1474ac86e 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -105,7 +105,7 @@ void sub_8040150(bool8 a0) for (i = 0; i < UNK1822C_ARR_COUNT; i++) { for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); - gDungeon->unk1822C.unk1BA2C[i][j] = 0; + gDungeon->unk1822C.unk1BA2C[i][j] = FALSE; } } @@ -427,12 +427,12 @@ void sub_80402AC(s32 x, s32 y) if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) { s32 id; - dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = 1; + dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE; id = dungeon->unk1822C.unk1BDCC; if (id < 40) { - dungeon->unk1822C.unk1BBEC[id][0] = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); - dungeon->unk1822C.unk1BBEC[id][1] = dst; - dungeon->unk1822C.unk1BBEC[id][2] = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; + dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); + dungeon->unk1822C.unk1BBEC[id].ptr2 = dst; + dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; dungeon->unk1822C.unk1BDCC++; } else { @@ -441,4 +441,97 @@ void sub_80402AC(s32 x, s32 y) } } +extern s32 gUnknown_202EDD0; + +void sub_8040788(void) +{ + s32 i; + Dungeon *dungeon = gDungeon; + if (dungeon == NULL) + return; + if (!dungeon->unk1822C.unk1BDD0) + return; + if (sub_800EC74()) + return; + + if (!dungeon->unk1822C.unk1BDD1) { + for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) { + struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i]; + u32 *src = ptr->ptr2; + u32 *dst = ptr->ptr1; + + if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } + *ptr->boolPtr = FALSE; + } + } + else { + void *dst, *src; + + dungeon->unk1822C.unk1BDD1 = FALSE; + dst = gUnknown_202EE08; + src = dungeon->unk1822C.unk1822C[0][0].arr; + + for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) { + if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { + CpuCopy(dst, src, 0x100); + } + dst += 0x100; + src += 0x100; + } + dungeon->unk1822C.unk1BDD2 = 1; + } + dungeon->unk1822C.unk1BDCC = 0; +} + +extern u8 gUnknown_202EE02; + +extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *); + +void sub_8040894(void) +{ + if (gDungeon->unk181e8.unk18214) + return; + if (!gDungeon->unk181e8.unk18219) + return; + if (gUnknown_203B410.x >= 100) + return; + if ((++gUnknown_202EE02 & 8) == 0) { + SpriteOAM sprite = {0}; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 0); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); + SpriteSetMatrixNum(&sprite, 0); + SpriteSetSize(&sprite, 0); + SpriteSetTileNum(&sprite, 0x215); + SpriteSetPriority(&sprite, 0); + SpriteSetPalNum(&sprite, 15); + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); + // Nulled on GBA + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16); + SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4); + nullsub_11(&sprite,0x100,NULL,NULL); + } + else { + SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8); + SpriteSetY(&sprite, (gUnknown_203B410.y) * 4); + AddSprite(&sprite,0x100,NULL,NULL); + } + } +} + // From bfbcea5f9ff8b97785abe3b7102b720b8921545c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Mar 2025 23:33:39 +0100 Subject: [PATCH 04/18] split dungeon map file --- asm/code_8040094.s | 253 ---------------- include/structs/str_dungeon.h | 4 +- ld_script.txt | 2 + src/code_8040094.c | 462 +--------------------------- src/code_8040094_1.c | 77 +++++ src/dungeon_map.c | 552 ++++++++++++++++++++++++++++++++++ sym_ewram.txt | 11 +- 7 files changed, 635 insertions(+), 726 deletions(-) create mode 100644 src/code_8040094_1.c create mode 100644 src/dungeon_map.c diff --git a/asm/code_8040094.s b/asm/code_8040094.s index 7b81e7123..cc02245a9 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -5,260 +5,7 @@ .text - thumb_func_start sub_8040A78 -sub_8040A78: - ldr r1, _08040A80 - movs r0, 0 - strb r0, [r1] - bx lr - .align 2, 0 -_08040A80: .4byte gUnknown_202EE02 - thumb_func_end sub_8040A78 - thumb_func_start sub_8040A84 -sub_8040A84: - push {r4-r6,lr} - ldr r0, _08040AB4 - ldr r0, [r0] - ldr r1, _08040AB8 - adds r0, r1 - movs r1, 0x1 - strb r1, [r0] - movs r5, 0 -_08040A94: - movs r4, 0 - adds r6, r5, 0x1 -_08040A98: - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80402AC - adds r4, 0x1 - cmp r4, 0x37 - ble _08040A98 - adds r5, r6, 0 - cmp r5, 0x1F - ble _08040A94 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08040AB4: .4byte gDungeon -_08040AB8: .4byte 0x0001bdd1 - thumb_func_end sub_8040A84 - - thumb_func_start sub_8040ABC -sub_8040ABC: - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r1, r0, 24 - ldr r0, _08040AD8 - ldr r0, [r0] - ldrb r0, [r0, 0x4] - cmp r0, 0x6 - bne _08040ADC - movs r7, 0xF - movs r0, 0 - b _08040AEC - .align 2, 0 -_08040AD8: .4byte gGameOptionsRef -_08040ADC: - cmp r1, 0 - beq _08040AE8 - movs r7, 0xE - movs r4, 0 - mov r8, r4 - b _08040AEE -_08040AE8: - movs r7, 0x10 - movs r0, 0x3 -_08040AEC: - mov r8, r0 -_08040AEE: - ldr r6, _08040B58 - movs r2, 0x1 - movs r1, 0 - cmp r1, r7 - bge _08040B22 - ldr r4, _08040B5C - mov r12, r4 -_08040AFC: - lsls r0, r2, 6 - mov r4, r12 - adds r3, r0, r4 - adds r4, r2, 0x1 - adds r5, r1, 0x1 - movs r2, 0x1B -_08040B08: - adds r1, r6, 0 - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - strh r1, [r3] - adds r3, 0x2 - subs r2, 0x1 - cmp r2, 0 - bge _08040B08 - adds r2, r4, 0 - adds r1, r5, 0 - cmp r1, r7 - blt _08040AFC -_08040B22: - movs r1, 0 - cmp r1, r8 - bge _08040B4C - ldr r6, _08040B5C - movs r0, 0xE0 - lsls r0, 8 - adds r3, r0, 0 -_08040B30: - lsls r0, r2, 6 - adds r0, r6 - adds r4, r2, 0x1 - adds r5, r1, 0x1 - movs r2, 0x1B -_08040B3A: - strh r3, [r0] - adds r0, 0x2 - subs r2, 0x1 - cmp r2, 0 - bge _08040B3A - adds r2, r4, 0 - adds r1, r5, 0 - cmp r1, r8 - blt _08040B30 -_08040B4C: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08040B58: .4byte 0x0000e0b8 -_08040B5C: .4byte gUnknown_202B038 + 2 - thumb_func_end sub_8040ABC - - thumb_func_start sub_8040B60 -sub_8040B60: - push {r4,r5,lr} - ldr r0, _08040BA4 - ldr r3, [r0] - ldr r1, _08040BA8 - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08040B9E - movs r1, 0 - ldr r2, _08040BAC - adds r5, r3, r2 - movs r4, 0 -_08040B78: - lsls r0, r1, 3 - adds r2, r1, 0x1 - subs r0, r1 - movs r1, 0x37 - lsls r0, 2 - adds r0, r5 - adds r0, 0x37 -_08040B86: - strb r4, [r0] - subs r0, 0x1 - subs r1, 0x1 - cmp r1, 0 - bge _08040B86 - adds r1, r2, 0 - cmp r1, 0x1F - ble _08040B78 - movs r1, 0 - ldr r2, _08040BA8 - adds r0, r3, r2 - strb r1, [r0] -_08040B9E: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08040BA4: .4byte gDungeon -_08040BA8: .4byte 0x0001bdd2 -_08040BAC: .4byte 0x0001ba2c - thumb_func_end sub_8040B60 - - thumb_func_start sub_8040BB0 -sub_8040BB0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r6, r0, 0 - adds r7, r1, 0 - lsls r2, 24 - lsrs r2, 24 - mov r10, r2 - bl sub_804143C - mov r8, r0 - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r8 - bl sub_804141C - lsls r0, 24 - lsrs r5, r0, 24 - mov r9, r5 - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r8 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800ECB8 - movs r1, 0 - ldrsh r4, [r0, r1] - adds r0, r6, 0 - bl sub_8042768 - lsls r0, 24 - cmp r0, 0 - beq _08040C28 - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_80414C0 - lsls r0, 24 - cmp r0, 0 - bne _08040C28 - mov r0, r10 - cmp r0, 0 - bne _08040C2C -_08040C28: - adds r0, r5, 0 - b _08040C3C -_08040C2C: - cmp r4, 0 - beq _08040C3A - adds r0, r6, 0 - adds r1, r7, 0 - mov r2, r8 - bl sub_8040C4C -_08040C3A: - mov r0, r9 -_08040C3C: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8040BB0 thumb_func_start sub_8040C4C sub_8040C4C: diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 2252c2962..e29db5a6b 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -338,8 +338,8 @@ struct UnkDungeonGlobal_1822C_Sub u32 arr[8]; }; -#define UNK1822C_ARR_COUNT 16 -#define UNK1822C_ARR_COUNT_2 28 +#define UNK1822C_ARR_COUNT (DUNGEON_MAX_SIZE_Y / 2) +#define UNK1822C_ARR_COUNT_2 (DUNGEON_MAX_SIZE_X / 2) struct UnkDungeonGlobal_unk1BBEC { diff --git a/ld_script.txt b/ld_script.txt index 3508fe4a8..1b52d557e 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -200,6 +200,8 @@ SECTIONS { src/code_803E46C.o(.text); src/code_803E724.o(.text); src/code_8040094.o(.text); + src/dungeon_map.o(.text); + src/code_8040094_1.o(.text); asm/code_8040094.o(.text); src/code_8041AD0.o(.text); asm/code_8041AD0.o(.text); diff --git a/src/code_8040094.c b/src/code_8040094.c index 1474ac86e..50a8aa710 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -11,20 +11,14 @@ #include "play_time.h" #include "cpu.h" #include "dungeon.h" -#include "game_options.h" -#include "bg_palette_buffer.h" #include "code_8009804.h" #include "code_800E9E4.h" -#include "dungeon_generation.h" #include "dungeon_util.h" -#include "trap.h" -#include "constants/dungeon.h" +#include "code_804267C.h" extern s32 gUnknown_80F6568[]; -extern u8 gUnknown_202EE01; extern const char gUnknown_80F6604; // "zmappat" extern struct FileArchive gDungeonFileArchive; -extern OpenedFile *gUnknown_202EE04; extern void sub_803F7BC(void); @@ -81,457 +75,3 @@ void sub_80400D4(void) if(gDungeon->unk181e8.unk18200 == 0) gDungeon->unk181e8.unk18200 = gDungeon->unk181e8.unk18204; } - -void sub_8040124(void) -{ - gUnknown_202EE01 = 0; -} - -void sub_8040130(void) -{ - gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); -} - -extern DungeonPos gUnknown_203B410; -extern u8 gUnknown_202EE00; -extern void *gUnknown_202EE08; - -void sub_8040238(void); - -void sub_8040150(bool8 a0) -{ - s32 i, j; - - for (i = 0; i < UNK1822C_ARR_COUNT; i++) { - for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { - CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); - gDungeon->unk1822C.unk1BA2C[i][j] = FALSE; - } - } - - if (!a0) { - gUnknown_203B410.x = 100; - gUnknown_203B410.y = 100; - } - - gDungeon->unk1822C.unk1BDCC = 0; - gDungeon->unk1822C.unk1BDD0 = 1; - gDungeon->unk1822C.unk1BDD2 = 0; - gUnknown_202EE00 = 1; - gUnknown_202EE08 = (void *) VRAM + 0x1700; - gUnknown_202EE01 = 1; - sub_8040238(); -} - -void sub_8040218(void) -{ - if (gUnknown_202EE04 != NULL) { - CloseFile(gUnknown_202EE04); - } - sub_8040124(); -} - -UNUSED static void nullsub_203(void) -{ - -} - -struct UnkStruct1 -{ - u32 **unk0; -}; - -struct UnkPaletteFileData -{ - struct UnkStruct1 *unk0; - RGB *pal; -}; - -void sub_8040238(void) -{ - s32 i; - - if (gUnknown_202EE04 == NULL) - return; - if (!gUnknown_202EE01) - return; - - for (i = 0; i < 16; i++) { - if (i == 14) { - SetBGPaletteBufferColorArray(238, &gFontPalette[1]); - nullsub_5(238, &gFontPalette[1]); - } - else { - SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); - nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); - } - } -} - -extern u8 GetFloorType(void); -extern bool8 sub_8094C48(void); -extern bool8 sub_8045804(Entity *ent); -extern const u8 gUnknown_80F65F0[]; -extern bool8 DoesNotHaveShadedMap(void); - -void sub_80402AC(s32 x, s32 y) -{ - s32 yAdd = 0; - const Tile *tile; - Dungeon *dungeon; - bool8 blinded; - u32 terrainType; - bool8 hallucinating; - bool8 var_2C; - bool8 var_28; - bool8 r0; - bool8 var_24; - bool8 r7; - s32 r6; - s32 xDiv2, yDiv2; - u32 *src, *dst; - bool8 r10; - s32 r3, yMinus; - - dungeon = gDungeon; - r10 = TRUE; - - if (gUnknown_202EE04 == NULL) - return; - if (!gUnknown_202EE01) - return; - if (sub_800EC74()) - return; - if (GAME_VERSION == VERSION_BLUE) { - if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { - if (x < 0 || y < 1 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) - return; - yAdd = 1; - } - else { - if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) - return; - yAdd = 0; - } - // FUN_0001d198(); Unknown function call which doesn't exist in red - } - else if (GAME_VERSION == VERSION_RED) { - if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y - 1) - return; - } - - tile = GetTile(x, y); - terrainType = GetTerrainType(tile); - hallucinating = gDungeon->unk181e8.hallucinating; - blinded = gDungeon->unk181e8.blinded; - var_28 = gDungeon->unk181e8.unk1820F; - var_2C = gDungeon->unk181e8.unk1820E; - r0 = gDungeon->unk181e8.unk1820B; - if (blinded) { - r7 = tile->spawnOrVisibilityFlags & 1; - var_24 = FALSE; - } - else { - if (r0) { - r7 = TRUE; - } - else { - r7 = tile->spawnOrVisibilityFlags & 1; - } - - if (GetFloorType() == FLOOR_TYPE_NORMAL) { - var_24 = gDungeon->unk181e8.unk18211; - } - else { - var_24 = FALSE; - } - } - - if (sub_8094C48() && !gDungeon->unk1356C) { - r6 = 0; - if (!blinded) { - Entity *entity = tile->monster; - if (entity != NULL) { - s32 entType = GetEntityType(entity); - if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) { - EntityInfo *entInfo = GetEntInfo(entity); - if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) { - r6 = 10; - } - else { - if (entInfo->isNotTeamMember) { - r6 = 2; - } - else if (entInfo->isTeamLeader) { - gUnknown_203B410.x = x; - gUnknown_203B410.y = y; - if (gDungeon->unk181e8.unk18214) { - r6 = 8; - } - } - else { - r6 = 10; - } - } - r10 = FALSE; - } - } - } - if (r10 && !blinded) { - Entity *entity = tile->object; - if (entity != NULL) { - s32 entType = GetEntityType(entity); - if (!r7) { - r6 = 0; - if (entType == ENTITY_ITEM) { - if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { - r6 = 3; - } - } - r10 = FALSE; - } - else { - if (entType == ENTITY_TRAP) { - if (entity->isVisible || var_28) { - Trap *trap = GetTrapData(entity); - r6 = gUnknown_80F65F0[trap->id]; - r10 = FALSE; - } - } - } - - if (r10) { - if (entType == ENTITY_ITEM) { - if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { - r6 = 3; - r10 = FALSE; - } - } - } - if (r10) { - if (terrainType != TERRAIN_TYPE_NORMAL) { - r6 = 0; - r10 = FALSE; - } - } - } - else { - if (!r7) { - if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) { - if (GetFloorType() == FLOOR_TYPE_NORMAL) { - r6 = 6; - } - else { - r6 = 5; - } - r10 = FALSE; - } - } - else { - if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) { - if (GetFloorType() == FLOOR_TYPE_NORMAL) { - r6 = 6; - } - else { - r6 = 5; - } - r10 = FALSE; - } - } - } - } - if (!r10) { - if (hallucinating) { - if (r6 != 0) { - r6 = 11; - } - } - } - if (r6 == 0) { - if (!r7) { - r6 = 1; - } - else if (terrainType != TERRAIN_TYPE_NORMAL) { - r6 = 1; - } - else { - s32 r4 = 1 | 2 | 4 | 8; - if (y < DUNGEON_MAX_SIZE_Y - 1) { - const Tile *adjacentTile = GetTile(x, y + 1); - if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(1); - } - } - if (y >= 1) { - const Tile *adjacentTile = GetTile(x, y - 1); - if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(4); - } - } - if (x < DUNGEON_MAX_SIZE_X - 1) { - const Tile *adjacentTile = GetTile(x + 1, y); - if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(2); - } - } - if (x >= 1) { - const Tile *adjacentTile = GetTile(x - 1, y); - if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(8); - } - } - - r6 = (s16) r4; - if (tile->spawnOrVisibilityFlags & 2) { - r6 = (s16) (r6 + 16); - } - else { - r6 = (s16) (r6 + 32); - } - } - } - - // Not possible on GBA. - if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { - r6 = (s16) (r6 + 128); - } - else if (DoesNotHaveShadedMap() == TRUE) { - r6 = (s16) (r6 + 64); - } - } - else { - r6 = 1; - gUnknown_203B410.x = 100; - } - - xDiv2 = x / 2; - yMinus = (y - 2) + yAdd; - yDiv2 = (yMinus / 2); - r3 = x - (xDiv2 * 2); - r3 += (yMinus - (yDiv2 * 2)) * 2; - dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr; - { - struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data)); - src = ptr->unk0->unk0[r6 * 4 + r3]; - } - - dst[0] = (dst[0] & src[0]) | src[1]; - dst[1] = (dst[1] & src[2]) | src[3]; - dst[2] = (dst[2] & src[4]) | src[5]; - dst[3] = (dst[3] & src[6]) | src[7]; - dst[4] = (dst[4] & src[8]) | src[9]; - dst[5] = (dst[5] & src[10]) | src[11]; - dst[6] = (dst[6] & src[12]) | src[13]; - dst[7] = (dst[7] & src[14]) | src[15]; - - if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) { - s32 id; - - dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE; - id = dungeon->unk1822C.unk1BDCC; - if (id < 40) { - dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); - dungeon->unk1822C.unk1BBEC[id].ptr2 = dst; - dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; - dungeon->unk1822C.unk1BDCC++; - } - else { - dungeon->unk1822C.unk1BDD1 = 1; - } - } -} - -extern s32 gUnknown_202EDD0; - -void sub_8040788(void) -{ - s32 i; - Dungeon *dungeon = gDungeon; - if (dungeon == NULL) - return; - if (!dungeon->unk1822C.unk1BDD0) - return; - if (sub_800EC74()) - return; - - if (!dungeon->unk1822C.unk1BDD1) { - for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) { - struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i]; - u32 *src = ptr->ptr2; - u32 *dst = ptr->ptr1; - - if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; - } - *ptr->boolPtr = FALSE; - } - } - else { - void *dst, *src; - - dungeon->unk1822C.unk1BDD1 = FALSE; - dst = gUnknown_202EE08; - src = dungeon->unk1822C.unk1822C[0][0].arr; - - for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) { - if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { - CpuCopy(dst, src, 0x100); - } - dst += 0x100; - src += 0x100; - } - dungeon->unk1822C.unk1BDD2 = 1; - } - dungeon->unk1822C.unk1BDCC = 0; -} - -extern u8 gUnknown_202EE02; - -extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *); - -void sub_8040894(void) -{ - if (gDungeon->unk181e8.unk18214) - return; - if (!gDungeon->unk181e8.unk18219) - return; - if (gUnknown_203B410.x >= 100) - return; - if ((++gUnknown_202EE02 & 8) == 0) { - SpriteOAM sprite = {0}; - - SpriteSetAffine1(&sprite, 0); - SpriteSetAffine2(&sprite, 0); - SpriteSetObjMode(&sprite, 0); - SpriteSetMosaic(&sprite, 0); - SpriteSetBpp(&sprite, 0); - SpriteSetShape(&sprite, 0); - SpriteSetMatrixNum(&sprite, 0); - SpriteSetSize(&sprite, 0); - SpriteSetTileNum(&sprite, 0x215); - SpriteSetPriority(&sprite, 0); - SpriteSetPalNum(&sprite, 15); - SpriteSetUnk6_0(&sprite, 0); - SpriteSetUnk6_1(&sprite, 0); - // Nulled on GBA - if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { - SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16); - SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4); - nullsub_11(&sprite,0x100,NULL,NULL); - } - else { - SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8); - SpriteSetY(&sprite, (gUnknown_203B410.y) * 4); - AddSprite(&sprite,0x100,NULL,NULL); - } - } -} - -// diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c new file mode 100644 index 000000000..5c5e9a944 --- /dev/null +++ b/src/code_8040094_1.c @@ -0,0 +1,77 @@ +#include "global.h" +#include "code_800558C.h" +#include "code_800C9CC.h" +#include "code_80118A4.h" +#include "dungeon_message.h" +#include "structs/dungeon_entity.h" +#include "structs/str_dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_music.h" +#include "file_system.h" +#include "play_time.h" +#include "cpu.h" +#include "dungeon.h" +#include "game_options.h" +#include "bg_palette_buffer.h" +#include "code_8009804.h" +#include "code_800E9E4.h" +#include "dungeon_generation.h" +#include "dungeon_util.h" +#include "trap.h" +#include "text.h" +#include "code_804267C.h" +#include "weather.h" +#include "constants/dungeon.h" + +extern u8 sub_800EC94(s32 param_1); +extern s32 sub_800E710(s32 a0, u16 a1); +extern void sub_800569C(DungeonPos *, axdata *, u8); +extern void sub_800EEC8(u16 r0); +extern void sub_800EF64(void); +extern s32 sub_800EA84(s32 *param_1); +extern void sub_8042DD4(s32 a0, Entity *a1, s32 a2); + +u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2); +bool32 sub_804143C(Entity *entity, Move *move); +bool8 sub_80414C0(Entity *entity, Move *move); +bool8 sub_804141C(u16 moveIdy, u8 weather, bool32 a2); +void sub_8040C4C(Entity *entity, Move *move, bool32 a2); + +bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) +{ + bool32 r8 = sub_804143C(entity, move); + bool8 r9 = sub_804141C(move->id, GetApparentWeather(entity), r8); + s32 r4 = sub_800ECB8(sub_80412E0(move->id, GetApparentWeather(entity), r8))->unk0; + + if (!sub_8042768(entity)) + return r9; + if (sub_80414C0(entity, move)) + return r9; + if (!a2) + return r9; + + if (r4 != 0) { + sub_8040C4C(entity, move, r8); + } + return r9; +} + +/* +void sub_8040C4C(Entity *entity, Move *move, bool32 a2) +{ + DungeonPos pos; + s32 r9 = sub_80412E0(move->id, GetApparentWeather(entity), a2); + EntityInfo *entInfo = GetEntInfo(entity); + bool8 r8 = sub_800EC94(move->id); + s32 apparentId = entInfo->apparentID; + s32 r2 = sub_800E710(apparentId, sub_80412E0(move->id, GetApparentWeather(entity), TRUE)); + + if (r2 != -1) { + sub_800569C(&pos, &entity->axObj.axdata, r2); + } + else { + pos = (DungeonPos) {0}; + } +} +*/ +// diff --git a/src/dungeon_map.c b/src/dungeon_map.c new file mode 100644 index 000000000..edecf4f26 --- /dev/null +++ b/src/dungeon_map.c @@ -0,0 +1,552 @@ +#include "global.h" +#include "structs/dungeon_entity.h" +#include "structs/str_dungeon.h" +#include "dungeon_map_access.h" +#include "dungeon_music.h" +#include "file_system.h" +#include "cpu.h" +#include "dungeon.h" +#include "game_options.h" +#include "bg_palette_buffer.h" +#include "code_8009804.h" +#include "code_800E9E4.h" +#include "dungeon_generation.h" +#include "dungeon_util.h" +#include "trap.h" +#include "text.h" +#include "constants/dungeon.h" + +extern const char gUnknown_80F6604; // "zmappat" +extern struct FileArchive gDungeonFileArchive; +extern DungeonPos gUnknown_203B410; +extern s32 gUnknown_202EDD0; + +extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *); +extern u8 GetFloorType(void); +extern bool8 sub_8094C48(void); +extern bool8 sub_8045804(Entity *ent); +extern bool8 DoesNotHaveShadedMap(void); + +extern const u8 gUnknown_80F65F0[]; + +EWRAM_DATA u8 gUnknown_202EE00 = 0; +EWRAM_DATA u8 gUnknown_202EE01 = 0; +EWRAM_DATA static u8 gUnknown_202EE02 = 0; +EWRAM_DATA static OpenedFile *gUnknown_202EE04 = NULL; +EWRAM_DATA static void *gUnknown_202EE08 = NULL; + +void sub_8040238(void); + +void sub_8040124(void) +{ + gUnknown_202EE01 = 0; +} + +void sub_8040130(void) +{ + gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); +} + +void sub_8040150(bool8 a0) +{ + s32 i, j; + + for (i = 0; i < UNK1822C_ARR_COUNT; i++) { + for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { + CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); + gDungeon->unk1822C.unk1BA2C[i][j] = FALSE; + } + } + + if (!a0) { + gUnknown_203B410.x = 100; + gUnknown_203B410.y = 100; + } + + gDungeon->unk1822C.unk1BDCC = 0; + gDungeon->unk1822C.unk1BDD0 = 1; + gDungeon->unk1822C.unk1BDD2 = 0; + gUnknown_202EE00 = 1; + gUnknown_202EE08 = (void *) VRAM + 0x1700; + gUnknown_202EE01 = 1; + sub_8040238(); +} + +void sub_8040218(void) +{ + if (gUnknown_202EE04 != NULL) { + CloseFile(gUnknown_202EE04); + } + sub_8040124(); +} + +// Used in Pmd's Blue version. Stores different Vram address in gUnknown_202EE08(maybe?), depending on TOP_MAP_AND_TEAM_NO_BOTTOM map option. +UNUSED static void nullsub_203(void) +{ + +} + +struct UnkStruct1 +{ + u32 **unk0; +}; + +struct UnkPaletteFileData +{ + struct UnkStruct1 *unk0; + RGB *pal; +}; + +void sub_8040238(void) +{ + s32 i; + + if (gUnknown_202EE04 == NULL) + return; + if (!gUnknown_202EE01) + return; + + for (i = 0; i < 16; i++) { + if (i == 14) { + SetBGPaletteBufferColorArray(238, &gFontPalette[1]); + nullsub_5(238, &gFontPalette[1]); + } + else { + SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); + nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); + } + } +} + +void sub_80402AC(s32 x, s32 y) +{ + s32 yAdd = 0; + const Tile *tile; + Dungeon *dungeon; + bool8 blinded; + u32 terrainType; + bool8 hallucinating; + bool8 var_2C; + bool8 var_28; + bool8 r0; + bool8 var_24; + bool8 r7; + s32 r6; + s32 xDiv2, yDiv2; + u32 *src, *dst; + bool8 r10; + s32 r3, yMinus; + + dungeon = gDungeon; + r10 = TRUE; + + if (gUnknown_202EE04 == NULL) + return; + if (!gUnknown_202EE01) + return; + if (sub_800EC74()) + return; + if (GAME_VERSION == VERSION_BLUE) { + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + if (x < 0 || y < 1 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) + return; + yAdd = 1; + } + else { + if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y) + return; + yAdd = 0; + } + // FUN_0001d198(); Unknown function call which doesn't exist in red + } + else if (GAME_VERSION == VERSION_RED) { + if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y - 1) + return; + } + + tile = GetTile(x, y); + terrainType = GetTerrainType(tile); + hallucinating = gDungeon->unk181e8.hallucinating; + blinded = gDungeon->unk181e8.blinded; + var_28 = gDungeon->unk181e8.unk1820F; + var_2C = gDungeon->unk181e8.unk1820E; + r0 = gDungeon->unk181e8.unk1820B; + if (blinded) { + r7 = tile->spawnOrVisibilityFlags & 1; + var_24 = FALSE; + } + else { + if (r0) { + r7 = TRUE; + } + else { + r7 = tile->spawnOrVisibilityFlags & 1; + } + + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + var_24 = gDungeon->unk181e8.unk18211; + } + else { + var_24 = FALSE; + } + } + + if (sub_8094C48() && !gDungeon->unk1356C) { + r6 = 0; + if (!blinded) { + Entity *entity = tile->monster; + if (entity != NULL) { + s32 entType = GetEntityType(entity); + if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) { + EntityInfo *entInfo = GetEntInfo(entity); + if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) { + r6 = 10; + } + else { + if (entInfo->isNotTeamMember) { + r6 = 2; + } + else if (entInfo->isTeamLeader) { + gUnknown_203B410.x = x; + gUnknown_203B410.y = y; + if (gDungeon->unk181e8.unk18214) { + r6 = 8; + } + } + else { + r6 = 10; + } + } + r10 = FALSE; + } + } + } + if (r10 && !blinded) { + Entity *entity = tile->object; + if (entity != NULL) { + s32 entType = GetEntityType(entity); + if (!r7) { + r6 = 0; + if (entType == ENTITY_ITEM) { + if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + r6 = 3; + } + } + r10 = FALSE; + } + else { + if (entType == ENTITY_TRAP) { + if (entity->isVisible || var_28) { + Trap *trap = GetTrapData(entity); + r6 = gUnknown_80F65F0[trap->id]; + r10 = FALSE; + } + } + } + + if (r10) { + if (entType == ENTITY_ITEM) { + if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + r6 = 3; + r10 = FALSE; + } + } + } + if (r10) { + if (terrainType != TERRAIN_TYPE_NORMAL) { + r6 = 0; + r10 = FALSE; + } + } + } + else { + if (!r7) { + if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) { + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + r6 = 6; + } + else { + r6 = 5; + } + r10 = FALSE; + } + } + else { + if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) { + if (GetFloorType() == FLOOR_TYPE_NORMAL) { + r6 = 6; + } + else { + r6 = 5; + } + r10 = FALSE; + } + } + } + } + if (!r10) { + if (hallucinating) { + if (r6 != 0) { + r6 = 11; + } + } + } + if (r6 == 0) { + if (!r7) { + r6 = 1; + } + else if (terrainType != TERRAIN_TYPE_NORMAL) { + r6 = 1; + } + else { + s32 r4 = 1 | 2 | 4 | 8; + if (y < DUNGEON_MAX_SIZE_Y - 1) { + const Tile *adjacentTile = GetTile(x, y + 1); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(1); + } + } + if (y >= 1) { + const Tile *adjacentTile = GetTile(x, y - 1); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(4); + } + } + if (x < DUNGEON_MAX_SIZE_X - 1) { + const Tile *adjacentTile = GetTile(x + 1, y); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(2); + } + } + if (x >= 1) { + const Tile *adjacentTile = GetTile(x - 1, y); + if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { + r4 &= ~(8); + } + } + + r6 = (s16) r4; + if (tile->spawnOrVisibilityFlags & 2) { + r6 = (s16) (r6 + 16); + } + else { + r6 = (s16) (r6 + 32); + } + } + } + + // Not possible on GBA. + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + r6 = (s16) (r6 + 128); + } + else if (DoesNotHaveShadedMap() == TRUE) { + r6 = (s16) (r6 + 64); + } + } + else { + r6 = 1; + gUnknown_203B410.x = 100; + } + + xDiv2 = x / 2; + yMinus = (y - 2) + yAdd; + yDiv2 = (yMinus / 2); + r3 = x - (xDiv2 * 2); + r3 += (yMinus - (yDiv2 * 2)) * 2; + dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr; + { + struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data)); + src = ptr->unk0->unk0[r6 * 4 + r3]; + } + + dst[0] = (dst[0] & src[0]) | src[1]; + dst[1] = (dst[1] & src[2]) | src[3]; + dst[2] = (dst[2] & src[4]) | src[5]; + dst[3] = (dst[3] & src[6]) | src[7]; + dst[4] = (dst[4] & src[8]) | src[9]; + dst[5] = (dst[5] & src[10]) | src[11]; + dst[6] = (dst[6] & src[12]) | src[13]; + dst[7] = (dst[7] & src[14]) | src[15]; + + if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) { + s32 id; + + dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE; + id = dungeon->unk1822C.unk1BDCC; + if (id < 40) { + dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); + dungeon->unk1822C.unk1BBEC[id].ptr2 = dst; + dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; + dungeon->unk1822C.unk1BDCC++; + } + else { + dungeon->unk1822C.unk1BDD1 = 1; + } + } +} + +void sub_8040788(void) +{ + s32 i; + Dungeon *dungeon = gDungeon; + if (dungeon == NULL) + return; + if (!dungeon->unk1822C.unk1BDD0) + return; + if (sub_800EC74()) + return; + + if (!dungeon->unk1822C.unk1BDD1) { + for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) { + struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i]; + u32 *src = ptr->ptr2; + u32 *dst = ptr->ptr1; + + if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + } + *ptr->boolPtr = FALSE; + } + } + else { + void *dst, *src; + + dungeon->unk1822C.unk1BDD1 = FALSE; + dst = gUnknown_202EE08; + src = dungeon->unk1822C.unk1822C[0][0].arr; + + for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) { + if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { + CpuCopy(dst, src, 0x100); + } + dst += 0x100; + src += 0x100; + } + dungeon->unk1822C.unk1BDD2 = 1; + } + dungeon->unk1822C.unk1BDCC = 0; +} + +void sub_8040894(void) +{ + if (gDungeon->unk181e8.unk18214) + return; + if (!gDungeon->unk181e8.unk18219) + return; + if (gUnknown_203B410.x >= 100) + return; + if ((++gUnknown_202EE02 & 8) == 0) { + SpriteOAM sprite = {0}; + + SpriteSetAffine1(&sprite, 0); + SpriteSetAffine2(&sprite, 0); + SpriteSetObjMode(&sprite, 0); + SpriteSetMosaic(&sprite, 0); + SpriteSetBpp(&sprite, 0); + SpriteSetShape(&sprite, 0); + SpriteSetMatrixNum(&sprite, 0); + SpriteSetSize(&sprite, 0); + SpriteSetTileNum(&sprite, 0x215); + SpriteSetPriority(&sprite, 0); + SpriteSetPalNum(&sprite, 15); + SpriteSetUnk6_0(&sprite, 0); + SpriteSetUnk6_1(&sprite, 0); + // Nulled on GBA + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16); + SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4); + nullsub_11(&sprite,0x100,NULL,NULL); + } + else { + SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8); + SpriteSetY(&sprite, (gUnknown_203B410.y) * 4); + AddSprite(&sprite,0x100,NULL,NULL); + } + } +} + +void sub_8040A78(void) +{ + gUnknown_202EE02 = 0; +} + +void sub_8040A84(void) +{ + s32 x, y; + + gDungeon->unk1822C.unk1BDD1 = TRUE; + + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + sub_80402AC(x, y); + } + } +} + +void sub_8040ABC(bool8 a0) +{ + s32 id, count1, count2; + s32 i, j; + u16 val; + + if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { + count1 = 15; + count2 = 0; + } + else if (a0) { + count1 = 14; + count2 = 0; + } + else { + count1 = 16; + count2 = 3; + } + + val = 0xE0B8; + id = 1; + for (i = 0; i < count1; i++) { + u16 *ptr = &gUnknown_202B038[0][id][1]; + for (j = 0; j < 28; j++) { + *ptr++ = val++; + } + id++; + } + + for (i = 0; i < count2; i++) { + u16 *ptr = &gUnknown_202B038[0][id][1]; + for (j = 0; j < 28; j++) { + *ptr++ = 0xE000; + } + id++; + } +} + +// BUG: Overflowing into unk1BBEC. They forgot that the array size is max X/Y divided by two... +void sub_8040B60(void) +{ + s32 x, y; + Dungeon *dungeon = gDungeon; + if (dungeon->unk1822C.unk1BDD2) { + #ifdef BUGFIX + for (y = 0; y < UNK1822C_ARR_COUNT; y++) { + for (x = 0; x < UNK1822C_ARR_COUNT_2; x++) { + dungeon->unk1822C.unk1BA2C[y][x] = FALSE; + } + } + #else + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + dungeon->unk1822C.unk1BA2C[y][x] = FALSE; + } + } + #endif // BUGFIX + dungeon->unk1822C.unk1BDD2 = FALSE; + } +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 4ea6cbbfe..a34c394cd 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -109,16 +109,7 @@ gUnknown_202EDE8: /* 202EDE8 (sub_803E250 - sub_803EDF0) */ gUnknown_202EDFC: /* 202EDFC (sub_803F27C - sub_803F878) */ .space 0x4 -gUnknown_202EE00: /* 202EE00 (sub_8040150 - sub_805D8C8) */ - .space 0x1 -gUnknown_202EE01: /* 202EE01 (sub_8040124 - PrintFieldMessage) */ - .space 0x1 -gUnknown_202EE02: /* 202EE02 (sub_8040894 - sub_8040A78) */ - .space 0x2 -gUnknown_202EE04: /* 202EE04 (sub_8040130 - sub_80402AC) */ - .space 0x4 -gUnknown_202EE08: /* 202EE08 (sub_8040150 - sub_8040788) */ - .space 0x4 + .include "src/dungeon_map.o" gUnknown_202EE0C: /* 202EE0C (sub_80694C0 - sub_806B8CC) */ .space 0x4 From 7dd904a428debcdbd0c89b476f1d99fdee680e28 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 7 Mar 2025 00:26:17 +0100 Subject: [PATCH 05/18] document some dungeon map --- asm/code_800DAC0.s | 2 +- asm/code_805D8C8.s | 2 +- include/dungeon_map.h | 20 +++++ include/structs/str_dungeon.h | 6 +- src/code_800DAC0.c | 4 +- src/code_803E46C.c | 5 +- src/code_8040094.c | 6 -- src/code_804267C.c | 4 +- src/code_8042B34.c | 17 ++--- src/code_805D8C8_1.c | 4 +- src/dungeon_map.c | 135 +++++++++++++++++----------------- src/dungeon_message.c | 15 ++-- 12 files changed, 114 insertions(+), 106 deletions(-) create mode 100644 include/dungeon_map.h diff --git a/asm/code_800DAC0.s b/asm/code_800DAC0.s index 45ff12808..5843b950a 100644 --- a/asm/code_800DAC0.s +++ b/asm/code_800DAC0.s @@ -428,7 +428,7 @@ _0800E030: bl sub_8000728 cmp r0, 0x1 bne _0800E058 - bl sub_8040238 + bl LoadDungeonMapPalette movs r0, 0 movs r1, 0 bl sub_803EAF0 diff --git a/asm/code_805D8C8.s b/asm/code_805D8C8.s index 89960c859..8f37278ce 100644 --- a/asm/code_805D8C8.s +++ b/asm/code_805D8C8.s @@ -6828,7 +6828,7 @@ _08065062: ldr r0, [r0] str r0, [r1] bl sub_803E13C - bl sub_8040238 + bl LoadDungeonMapPalette _08065088: pop {r4} pop {r0} diff --git a/include/dungeon_map.h b/include/dungeon_map.h new file mode 100644 index 000000000..fa5350853 --- /dev/null +++ b/include/dungeon_map.h @@ -0,0 +1,20 @@ +#ifndef GUARD_DUNGEON_MAP_H +#define GUARD_DUNGEON_MAP_H + +extern bool8 gUnknown_202EE00; +extern bool8 gShowDungeonMap; + +void SetDungeonMapToNotShown(void); +void OpenDungeonMapFile(void); +void InitDungeonMap(bool8 a0); +void CloseDungeonMapFile(void); +void LoadDungeonMapPalette(void); +void sub_80402AC(s32 x, s32 y); +void sub_8040788(void); +void ShowPlayerDotOnMap(void); +void ResetMapPlayerDotFrames(void); +void sub_8040A84(void); +void sub_8040ABC(bool8 a0); +void sub_8040B60(void); + +#endif diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index e29db5a6b..d21ca18bb 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -348,9 +348,9 @@ struct UnkDungeonGlobal_unk1BBEC bool8 *boolPtr; }; -struct UnkDungeonGlobal_1822C +struct DungeonMap { - struct UnkDungeonGlobal_1822C_Sub unk1822C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; + struct UnkDungeonGlobal_1822C_Sub dungeonMap[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; bool8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; struct UnkDungeonGlobal_unk1BBEC unk1BBEC[40]; s32 unk1BDCC; @@ -474,7 +474,7 @@ typedef struct Dungeon /* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX]; /* 0x181E4 */ OpenedFile *paletFile; /* 0x181E8 */ UnkDungeonGlobal_unk181E8_sub unk181e8; - /* 0x1822C */ struct UnkDungeonGlobal_1822C unk1822C; + /* 0x1822C */ struct DungeonMap dungeonMap; /* 0x1BDD4 */ struct UnkStructDungeon1BDD4 unk1BDD4; /* 0x1BE14 */ struct MessageLogString messageLogStrings[MESSAGE_LOG_STRINGS_COUNT]; /* 0x1C570 */ DungeonLocation unk1C570; diff --git a/src/code_800DAC0.c b/src/code_800DAC0.c index 8c555c33a..07f03fdf6 100644 --- a/src/code_800DAC0.c +++ b/src/code_800DAC0.c @@ -6,6 +6,7 @@ #include "code_800E9A8.h" #include "file_system.h" #include "memory.h" +#include "dungeon_map.h" EWRAM_INIT struct unkStruct_203B0CC *gUnknown_203B0CC = NULL; @@ -19,7 +20,6 @@ extern s32 sub_800E2C0(u32); extern s32 sub_8000728(void); extern u32 sub_800E900(void); extern void sub_8009BE4(void); -extern void sub_8040238(void); extern void sub_800F204(void); extern void sub_803EAF0(u32, u32); extern struct unkStruct_800F18C *sub_800F18C(s32); @@ -136,7 +136,7 @@ void sub_800DC14(s32 param_1) if (preload->unk34 == 4) { sub_8009BE4(); if (sub_8000728() == 1) { - sub_8040238(); + LoadDungeonMapPalette(); sub_803EAF0(0,0); sub_800CD64(0x8000,0); } diff --git a/src/code_803E46C.c b/src/code_803E46C.c index 2bcefa896..2f36b5a4c 100644 --- a/src/code_803E46C.c +++ b/src/code_803E46C.c @@ -7,7 +7,7 @@ #include "code_800C9CC.h" #include "code_80118A4.h" #include "code_803E668.h" - +#include "dungeon_map.h" #include "bg_palette_buffer.h" #include "bg_control.h" #include "dungeon_music.h" @@ -32,7 +32,6 @@ void sub_806CC10(); void sub_804522C(); void sub_803F9CC(); extern void xxx_call_update_bg_vram(void); -void sub_8040894(); void sub_803ECE0(); void sub_803EDF0(); void sub_800E90C(); @@ -82,7 +81,7 @@ void sub_803E490(u32 unused) sub_8042E5C(); if(gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3 || gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) - sub_8040894(); + ShowPlayerDotOnMap(); sub_803ECE0(); sub_803EDF0(); diff --git a/src/code_8040094.c b/src/code_8040094.c index 50a8aa710..db7a90417 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -9,12 +9,6 @@ #include "dungeon_music.h" #include "file_system.h" #include "play_time.h" -#include "cpu.h" -#include "dungeon.h" -#include "code_8009804.h" -#include "code_800E9E4.h" -#include "dungeon_util.h" -#include "code_804267C.h" extern s32 gUnknown_80F6568[]; extern const char gUnknown_80F6604; // "zmappat" diff --git a/src/code_804267C.c b/src/code_804267C.c index aa73cb1e6..84ab5fd1c 100644 --- a/src/code_804267C.c +++ b/src/code_804267C.c @@ -8,6 +8,7 @@ #include "code_806CD90.h" #include "dungeon.h" #include "dungeon_engine.h" +#include "dungeon_map.h" #include "dungeon_leader.h" #include "dungeon_message.h" #include "dungeon_music.h" @@ -22,7 +23,6 @@ extern const u32 gUnknown_80F680C[8]; extern const u16 gUnknown_80F682C[8]; extern const u8 *gPtrFeralFoundItemMessage[]; -extern void sub_8040238(void); extern void sub_804151C(Entity *pokemon, u32 r1, u8 r2); extern void sub_804178C(u32); extern void sub_80416A4(DungeonPos *r0, u32 r1, bool8 r2); @@ -182,7 +182,7 @@ void sub_80426C8(u32 a0, u32 a1) sub_803E46C(0x46); sub_8042D7C(); - sub_8040238(); + LoadDungeonMapPalette(); sub_8052210(1); } diff --git a/src/code_8042B34.c b/src/code_8042B34.c index fcee722dd..baea0ad8d 100644 --- a/src/code_8042B34.c +++ b/src/code_8042B34.c @@ -40,6 +40,7 @@ #include "constants/trap.h" #include "dungeon_serializer.h" #include "dungeon_config.h" +#include "dungeon_map.h" extern void sub_800EE5C(s32); extern void sub_800EF64(void); @@ -255,17 +256,13 @@ extern void sub_8040094(u8 r0); extern void sub_8068BDC(u8 r0); extern s16 GetTurnLimit(u8 dungeon); extern void sub_8041888(u8 param_1); -extern void sub_8040150(bool8 param_1); extern void sub_803D4AC(void); extern void sub_804513C(void); extern void sub_8043CD8(void); extern void sub_803E250(void); -extern void sub_8040130(void); -extern void sub_8040124(void); extern void sub_803E830(void); extern void sub_803E214(void); extern void nullsub_56(void); -extern void sub_8040218(void); extern void sub_8047104(void); extern void sub_8068F28(void); extern void sub_806C1D8(void); @@ -415,8 +412,8 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) sub_8043CD8(); sub_80495E4(); sub_803E250(); - sub_8040130(); - sub_8040124(); + OpenDungeonMapFile(); + SetDungeonMapToNotShown(); sub_803F27C(1); gUnknown_2026E4E = 2056; sub_80095CC(1, 0x14); @@ -589,7 +586,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) sub_8049840(); sub_803E178(); gDungeonBrightness = 0; - sub_8040124(); + SetDungeonMapToNotShown(); sub_803EAF0(4, 0); sub_8052210(0); sub_803F27C(r6); @@ -661,7 +658,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) } sub_8040094(0); sub_803EAF0(0, 0); - sub_8040150(r6); + InitDungeonMap(r6); sub_8040A84(); gDungeon->unkB8 = NULL; gDungeon->unk644.unk28 = 0; @@ -745,7 +742,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) sub_8052740(0x4F); } - sub_8040124(); + SetDungeonMapToNotShown(); sub_803EAF0(1, 0); gDungeon->unk181e8.unk18219 = 0; gDungeon->unk181e8.unk18218 = 1; @@ -915,7 +912,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) CloseDungeonPaletteFile(); sub_803E214(); nullsub_56(); - sub_8040218(); + CloseDungeonMapFile(); if (r8->unk7C == 1 || r8->unk7C == 4 || r8->unk7C == 2) { sub_8047104(); } diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index b0228e120..fd2e0a2f7 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -9,6 +9,7 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_random.h" #include "dungeon_util.h" +#include "dungeon_map.h" #include "pokemon.h" #include "moves.h" #include "items.h" @@ -76,7 +77,6 @@ bool8 sub_80701A4(Entity *a0); void sub_80647F0(Entity *a0); void sub_805E738(Entity *a0); void sub_803E708(s32 a0, s32 a1); -void sub_8040A78(void); void sub_805E804(void); void sub_8064BE0(void); void sub_8075680(u32); @@ -168,7 +168,7 @@ void DungeonHandlePlayerInput(void) } gDungeon->unk644.unk2F = 0; - sub_8040A78(); + ResetMapPlayerDotFrames(); if (gDungeon->unk1 != 0) { gDungeon->unk1 = 0; if (!ShouldMonsterRunAwayAndShowEffect(GetLeader(), TRUE)) { diff --git a/src/dungeon_map.c b/src/dungeon_map.c index edecf4f26..1b4e7086a 100644 --- a/src/dungeon_map.c +++ b/src/dungeon_map.c @@ -1,4 +1,5 @@ #include "global.h" +#include "dungeon_map.h" #include "structs/dungeon_entity.h" #include "structs/str_dungeon.h" #include "dungeon_map_access.h" @@ -29,32 +30,41 @@ extern bool8 DoesNotHaveShadedMap(void); extern const u8 gUnknown_80F65F0[]; -EWRAM_DATA u8 gUnknown_202EE00 = 0; -EWRAM_DATA u8 gUnknown_202EE01 = 0; -EWRAM_DATA static u8 gUnknown_202EE02 = 0; -EWRAM_DATA static OpenedFile *gUnknown_202EE04 = NULL; +struct UnkStruct1 +{ + u32 **unk0; +}; + +struct DungeonMapGfx +{ + struct UnkStruct1 *gfx; + RGB *pal; +}; + +EWRAM_DATA bool8 gUnknown_202EE00 = FALSE; +EWRAM_DATA bool8 gShowDungeonMap = FALSE; +EWRAM_DATA static u8 sPlayerDotFrames = 0; +EWRAM_DATA static OpenedFile *sDungeonMapGfxFile = NULL; EWRAM_DATA static void *gUnknown_202EE08 = NULL; -void sub_8040238(void); - -void sub_8040124(void) +void SetDungeonMapToNotShown(void) { - gUnknown_202EE01 = 0; + gShowDungeonMap = FALSE; } -void sub_8040130(void) +void OpenDungeonMapFile(void) { - gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); + sDungeonMapGfxFile = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); } -void sub_8040150(bool8 a0) +void InitDungeonMap(bool8 a0) { s32 i, j; for (i = 0; i < UNK1822C_ARR_COUNT; i++) { for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { - CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); - gDungeon->unk1822C.unk1BA2C[i][j] = FALSE; + CpuClear(&gDungeon->dungeonMap.dungeonMap[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); + gDungeon->dungeonMap.unk1BA2C[i][j] = FALSE; } } @@ -63,21 +73,21 @@ void sub_8040150(bool8 a0) gUnknown_203B410.y = 100; } - gDungeon->unk1822C.unk1BDCC = 0; - gDungeon->unk1822C.unk1BDD0 = 1; - gDungeon->unk1822C.unk1BDD2 = 0; + gDungeon->dungeonMap.unk1BDCC = 0; + gDungeon->dungeonMap.unk1BDD0 = 1; + gDungeon->dungeonMap.unk1BDD2 = 0; gUnknown_202EE00 = 1; gUnknown_202EE08 = (void *) VRAM + 0x1700; - gUnknown_202EE01 = 1; - sub_8040238(); + gShowDungeonMap = TRUE; + LoadDungeonMapPalette(); } -void sub_8040218(void) +void CloseDungeonMapFile(void) { - if (gUnknown_202EE04 != NULL) { - CloseFile(gUnknown_202EE04); + if (sDungeonMapGfxFile != NULL) { + CloseFile(sDungeonMapGfxFile); } - sub_8040124(); + SetDungeonMapToNotShown(); } // Used in Pmd's Blue version. Stores different Vram address in gUnknown_202EE08(maybe?), depending on TOP_MAP_AND_TEAM_NO_BOTTOM map option. @@ -86,24 +96,13 @@ UNUSED static void nullsub_203(void) } -struct UnkStruct1 -{ - u32 **unk0; -}; - -struct UnkPaletteFileData -{ - struct UnkStruct1 *unk0; - RGB *pal; -}; - -void sub_8040238(void) +void LoadDungeonMapPalette(void) { s32 i; - if (gUnknown_202EE04 == NULL) + if (sDungeonMapGfxFile == NULL) return; - if (!gUnknown_202EE01) + if (!gShowDungeonMap) return; for (i = 0; i < 16; i++) { @@ -112,8 +111,8 @@ void sub_8040238(void) nullsub_5(238, &gFontPalette[1]); } else { - SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); - nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]); + SetBGPaletteBufferColorArray(i + 224, &((struct DungeonMapGfx *)(sDungeonMapGfxFile->data))->pal[i]); + nullsub_5(i + 224, &((struct DungeonMapGfx *)(sDungeonMapGfxFile->data))->pal[i]); } } } @@ -140,9 +139,9 @@ void sub_80402AC(s32 x, s32 y) dungeon = gDungeon; r10 = TRUE; - if (gUnknown_202EE04 == NULL) + if (sDungeonMapGfxFile == NULL) return; - if (!gUnknown_202EE01) + if (!gShowDungeonMap) return; if (sub_800EC74()) return; @@ -353,10 +352,10 @@ void sub_80402AC(s32 x, s32 y) yDiv2 = (yMinus / 2); r3 = x - (xDiv2 * 2); r3 += (yMinus - (yDiv2 * 2)) * 2; - dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr; + dst = dungeon->dungeonMap.dungeonMap[yDiv2][xDiv2].arr; { - struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data)); - src = ptr->unk0->unk0[r6 * 4 + r3]; + struct DungeonMapGfx *ptr = ((struct DungeonMapGfx *)(&sDungeonMapGfxFile->data)); + src = ptr->gfx->unk0[r6 * 4 + r3]; } dst[0] = (dst[0] & src[0]) | src[1]; @@ -368,19 +367,19 @@ void sub_80402AC(s32 x, s32 y) dst[6] = (dst[6] & src[12]) | src[13]; dst[7] = (dst[7] & src[14]) | src[15]; - if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) { + if (!dungeon->dungeonMap.unk1BDD1 && !dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2]) { s32 id; - dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE; - id = dungeon->unk1822C.unk1BDCC; + dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2] = TRUE; + id = dungeon->dungeonMap.unk1BDCC; if (id < 40) { - dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); - dungeon->unk1822C.unk1BBEC[id].ptr2 = dst; - dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]; - dungeon->unk1822C.unk1BDCC++; + dungeon->dungeonMap.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); + dungeon->dungeonMap.unk1BBEC[id].ptr2 = dst; + dungeon->dungeonMap.unk1BBEC[id].boolPtr = &dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2]; + dungeon->dungeonMap.unk1BDCC++; } else { - dungeon->unk1822C.unk1BDD1 = 1; + dungeon->dungeonMap.unk1BDD1 = 1; } } } @@ -391,14 +390,14 @@ void sub_8040788(void) Dungeon *dungeon = gDungeon; if (dungeon == NULL) return; - if (!dungeon->unk1822C.unk1BDD0) + if (!dungeon->dungeonMap.unk1BDD0) return; if (sub_800EC74()) return; - if (!dungeon->unk1822C.unk1BDD1) { - for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) { - struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i]; + if (!dungeon->dungeonMap.unk1BDD1) { + for (i = 0; i < dungeon->dungeonMap.unk1BDCC; i++) { + struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->dungeonMap.unk1BBEC[i]; u32 *src = ptr->ptr2; u32 *dst = ptr->ptr1; @@ -418,9 +417,9 @@ void sub_8040788(void) else { void *dst, *src; - dungeon->unk1822C.unk1BDD1 = FALSE; + dungeon->dungeonMap.unk1BDD1 = FALSE; dst = gUnknown_202EE08; - src = dungeon->unk1822C.unk1822C[0][0].arr; + src = dungeon->dungeonMap.dungeonMap[0][0].arr; for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) { if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { @@ -429,12 +428,12 @@ void sub_8040788(void) dst += 0x100; src += 0x100; } - dungeon->unk1822C.unk1BDD2 = 1; + dungeon->dungeonMap.unk1BDD2 = 1; } - dungeon->unk1822C.unk1BDCC = 0; + dungeon->dungeonMap.unk1BDCC = 0; } -void sub_8040894(void) +void ShowPlayerDotOnMap(void) { if (gDungeon->unk181e8.unk18214) return; @@ -442,7 +441,7 @@ void sub_8040894(void) return; if (gUnknown_203B410.x >= 100) return; - if ((++gUnknown_202EE02 & 8) == 0) { + if ((++sPlayerDotFrames & 8) == 0) { SpriteOAM sprite = {0}; SpriteSetAffine1(&sprite, 0); @@ -472,16 +471,16 @@ void sub_8040894(void) } } -void sub_8040A78(void) +void ResetMapPlayerDotFrames(void) { - gUnknown_202EE02 = 0; + sPlayerDotFrames = 0; } void sub_8040A84(void) { s32 x, y; - gDungeon->unk1822C.unk1BDD1 = TRUE; + gDungeon->dungeonMap.unk1BDD1 = TRUE; for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { @@ -533,20 +532,20 @@ void sub_8040B60(void) { s32 x, y; Dungeon *dungeon = gDungeon; - if (dungeon->unk1822C.unk1BDD2) { + if (dungeon->dungeonMap.unk1BDD2) { #ifdef BUGFIX for (y = 0; y < UNK1822C_ARR_COUNT; y++) { for (x = 0; x < UNK1822C_ARR_COUNT_2; x++) { - dungeon->unk1822C.unk1BA2C[y][x] = FALSE; + dungeon->dungeonMap.unk1BA2C[y][x] = FALSE; } } #else for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { - dungeon->unk1822C.unk1BA2C[y][x] = FALSE; + dungeon->dungeonMap.unk1BA2C[y][x] = FALSE; } } #endif // BUGFIX - dungeon->unk1822C.unk1BDD2 = FALSE; + dungeon->dungeonMap.unk1BDD2 = FALSE; } } diff --git a/src/dungeon_message.c b/src/dungeon_message.c index ccbaccb88..f731400f4 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -1,5 +1,6 @@ #include "global.h" #include "dungeon_message.h" +#include "dungeon_map.h" #include "dungeon.h" #include "structs/dungeon_entity.h" #include "code_803E46C.h" @@ -33,7 +34,6 @@ static bool8 sub_8052DC0(Entity *); extern bool8 sub_8045888(Entity *pokemon); extern void sub_805E804(void); extern void sub_803EAF0(s32, s32); -extern void sub_8040238(void); extern void sub_8083E28(void); extern u32 sub_8014140(s32 a0, const void *a1); extern void sub_8083D30(void); @@ -44,7 +44,6 @@ extern void sub_8083CE0(u8 param_1); extern u32 gUnknown_202EDD0; extern u8 gUnknown_203B40C; -extern u8 gUnknown_202EE01; extern s32 gUnknown_202EDCC; extern const u8 gUnknown_80F7AE8[]; @@ -379,8 +378,8 @@ void DisplayDungeonMessage(struct MonDialogueSpriteInfo *monSpriteInfo, const u8 if (a2) { sub_805E804(); - sub_8040238(); - if (gUnknown_202EE01) { + LoadDungeonMapPalette(); + if (gShowDungeonMap) { sub_803EAF0(0, 0); } else { @@ -510,7 +509,7 @@ void DisplayDungeonDialogue(const struct DungeonDialogueStruct *dialogueInfo) } if (dialogueInfo->unk0 != 1 && dialogueInfo->unk0 != 3) { - sub_8040238(); + LoadDungeonMapPalette(); sub_803EAF0(0, 0); } sub_803E708(8, 9); @@ -556,7 +555,7 @@ bool32 DisplayDungeonYesNoMessage(struct MonDialogueSpriteInfo *monSpriteInfo, c CloseFile(monPortrait.faceFile); } - sub_8040238(); + LoadDungeonMapPalette(); sub_803EAF0(0, 0); if (chosenMenuIndex == 1) @@ -599,7 +598,7 @@ s32 DisplayDungeonMenuMessage(struct MonDialogueSpriteInfo *monSpriteInfo, const CloseFile(monPortrait.faceFile); } - sub_8040238(); + LoadDungeonMapPalette(); sub_803EAF0(0, 0); return chosenMenuIndex; } @@ -786,7 +785,7 @@ void sub_8052FB8(const u8 *str) ShowWindows(NULL, TRUE, TRUE); sub_803E46C(9); - sub_8040238(); + LoadDungeonMapPalette(); for (j = 0; j < 8; j++) { SetBGPaletteBufferColorArray(240 + j, &gFontPalette[j]); } From ce798ff03ec4a0230f3373c58460f7d4301b3234 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 7 Mar 2025 10:25:51 +0100 Subject: [PATCH 06/18] dungeon map documentation --- include/structs/str_dungeon.h | 6 +++--- src/code_803E724.c | 28 ++++++++++++------------ src/code_8042B34.c | 6 +++--- src/code_80450F8.c | 8 +++---- src/code_805D8C8_1.c | 8 +++---- src/code_8069D4C.c | 10 ++++----- src/code_8069E0C.c | 2 +- src/code_807E5AC.c | 2 +- src/dungeon_map.c | 40 +++++++++++++++++------------------ src/dungeon_map_access.c | 24 ++++++++++----------- src/dungeon_serializer.c | 14 ++++++------ src/trap.c | 2 +- 12 files changed, 75 insertions(+), 75 deletions(-) diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index d21ca18bb..b35aafff6 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -85,13 +85,13 @@ typedef struct UnkDungeonGlobal_unk181E8_sub bool8 unk1820B; // x23 bool8 unk1820C; // x24 bool8 unk1820D; // x25 - bool8 unk1820E; // x26 - bool8 unk1820F; // x27 + bool8 showAllFloorItems; // x26 + bool8 showInvisibleTrapsMonsters; // x27 /* 0x18210 */ bool8 hallucinating; // x28 Displays Substitute and flower sprites when the player has the Cross-Eyed status. bool8 unk18211; // x29 u8 unk18212; // x2A bool8 unk18213; // x2B - u8 unk18214; // x2C + bool8 inFloorMapMode; // x2C u8 unk18215; // x2D u8 unk18216; // x2E u8 unk18217; // x2F diff --git a/src/code_803E724.c b/src/code_803E724.c index 85dcfaddc..e6334780e 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -686,10 +686,10 @@ void sub_803F27C(bool8 a0) if (!a0) { strPtr->blinded = 0; strPtr->hallucinating = 0; - strPtr->unk1820F = 0; + strPtr->showInvisibleTrapsMonsters = 0; strPtr->unk1820D = FALSE; strPtr->unk18211 = 0; - strPtr->unk1820E = FALSE; + strPtr->showAllFloorItems = FALSE; strPtr->unk1820B = 0; strPtr->unk1820C = 0; } @@ -700,7 +700,7 @@ void sub_803F27C(bool8 a0) strPtr->unk18212 = 0; strPtr->unk1821B = 0; strPtr->unk1821C = 0; - strPtr->unk18214 = 0; + strPtr->inFloorMapMode = 0; strPtr->unk18215 = 1; sub_803F38C(); @@ -805,7 +805,7 @@ void sub_803F580(u8 a0) if (cameraTarget != NULL && EntityIsValid(cameraTarget)) { s32 i; - u32 before, unk18214; + u32 before, inFloorMapMode; EntityInfo *info = GetEntInfo(cameraTarget); strPtr->cameraPixelPosMirror = strPtr->cameraPixelPos; @@ -818,24 +818,24 @@ void sub_803F580(u8 a0) if (HasHeldItem(cameraTarget, ITEM_X_RAY_SPECS) && info->isTeamLeader) { strPtr->unk1820D = TRUE; - strPtr->unk1820E = TRUE; + strPtr->showAllFloorItems = TRUE; } else { strPtr->unk1820D = info->powerEars; - strPtr->unk1820E = info->scanning; + strPtr->showAllFloorItems = info->scanning; } strPtr->unk18211 = info->stairSpotter; before = strPtr->blinded; - unk18214 = strPtr->unk18214; - if (unk18214 == 0) { + inFloorMapMode = strPtr->inFloorMapMode; + if (inFloorMapMode == 0) { u32 unkVar; if (info->blinkerClassStatus.status == STATUS_BLINKER) { strPtr->blinded = 1; unkVar = 0xE; } else { - strPtr->blinded = unk18214; + strPtr->blinded = inFloorMapMode; unkVar = 0; } @@ -865,15 +865,15 @@ void sub_803F580(u8 a0) sub_8041888(0); } - before = strPtr->unk1820F; + before = strPtr->showInvisibleTrapsMonsters; if (CanSeeInvisibleMonsters(cameraTarget)) { - strPtr->unk1820F = 1; + strPtr->showInvisibleTrapsMonsters = 1; } else { - strPtr->unk1820F = 0; + strPtr->showInvisibleTrapsMonsters = 0; } - if (before != strPtr->unk1820F) { + if (before != strPtr->showInvisibleTrapsMonsters) { sub_8049ED4(); sub_8040A84(); sub_8041888(0); @@ -951,7 +951,7 @@ void sub_803F878(s32 a0, s32 a1) strPtr->cameraPos.x = a0 / 6144; strPtr->cameraPos.y = a1 / 6144; strPtr->unk1820D = FALSE; - strPtr->unk1820E = FALSE; + strPtr->showAllFloorItems = FALSE; strPtr->unk18211 = 0; strPtr->unk18216 = 0; diff --git a/src/code_8042B34.c b/src/code_8042B34.c index baea0ad8d..2aa84f8c5 100644 --- a/src/code_8042B34.c +++ b/src/code_8042B34.c @@ -56,7 +56,7 @@ struct UnkStruct_203B414 struct DungeonPos unk8C[16]; }; -EWRAM_INIT DungeonPos gUnknown_203B410 = {100, 100}; +EWRAM_INIT DungeonPos gPlayerDotMapPosition = {100, 100}; static EWRAM_INIT struct UnkStruct_203B414 *sUnknown_203B414 = NULL; EWRAM_INIT Dungeon *gDungeon = NULL; EWRAM_INIT u8 *gSerializedData_203B41C = NULL; @@ -388,8 +388,8 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) dungeonPtr[i] = 0; } - gUnknown_203B410.x = 0; // Needed to match - gUnknown_203B410.x = 100; + gPlayerDotMapPosition.x = 0; // Needed to match + gPlayerDotMapPosition.x = 100; if (!r6) { gDungeon->unk644.unk34 = r8->unkF; diff --git a/src/code_80450F8.c b/src/code_80450F8.c index a1f59b13b..b7e22fe5f 100644 --- a/src/code_80450F8.c +++ b/src/code_80450F8.c @@ -217,7 +217,7 @@ bool8 sub_8045804(Entity *ent) if (!monInfo->isNotTeamMember) return TRUE; - if (!saveTyping->unk1820F && monInfo->invisibleClassStatus.status == STATUS_INVISIBLE) + if (!saveTyping->showInvisibleTrapsMonsters && monInfo->invisibleClassStatus.status == STATUS_INVISIBLE) return FALSE; if (saveTyping->unk1820B || saveTyping->unk1820D) @@ -252,7 +252,7 @@ bool8 sub_8045888(Entity *ent) switch (GetEntityType(ent)) { case ENTITY_ITEM: { - if (!saveTyping->unk1820E && !sub_803F428(&ent->pos)) + if (!saveTyping->showAllFloorItems && !sub_803F428(&ent->pos)) return FALSE; break; } @@ -260,7 +260,7 @@ bool8 sub_8045888(Entity *ent) EntityInfo *monInfo = GetEntInfo(ent); if (monInfo->isNotTeamMember) { - if (!gDungeon->unk181e8.unk1820F && monInfo->invisibleClassStatus.status == STATUS_INVISIBLE) + if (!gDungeon->unk181e8.showInvisibleTrapsMonsters && monInfo->invisibleClassStatus.status == STATUS_INVISIBLE) return FALSE; if (!saveTyping->unk1820D && !sub_803F428(&ent->pos)) @@ -269,7 +269,7 @@ bool8 sub_8045888(Entity *ent) break; } case ENTITY_TRAP: { - if (!gDungeon->unk181e8.unk1820F && !ent->isVisible) + if (!gDungeon->unk181e8.showInvisibleTrapsMonsters && !ent->isVisible) return FALSE; break; } diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index fd2e0a2f7..1cc91377c 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -427,7 +427,7 @@ void DungeonHandlePlayerInput(void) if (!gDungeon->unk181e8.blinded && gGameOptionsRef->mapOption != 6 && gRealInputs.pressed & SELECT_BUTTON) { s32 prevMapOption = gGameOptionsRef->mapOption; gUnknown_202EE00 = 1; - gDungeon->unk181e8.unk18214 = 1; + gDungeon->unk181e8.inFloorMapMode = TRUE; if (!sub_8094C48()) { sub_8094C88(); } @@ -447,7 +447,7 @@ void DungeonHandlePlayerInput(void) sub_8040A84(); } } - gDungeon->unk181e8.unk18214 = 0; + gDungeon->unk181e8.inFloorMapMode = FALSE; gGameOptionsRef->mapOption = prevMapOption; gUnknown_202EE00 = 1; sub_8040A84(); @@ -845,7 +845,7 @@ bool8 sub_805E874(void) if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP && GetEntityType(tile->object) == ENTITY_TRAP) { if (tile->object->isVisible) return FALSE; - if (gDungeon->unk181e8.unk1820F) + if (gDungeon->unk181e8.showInvisibleTrapsMonsters) return FALSE; } } @@ -853,7 +853,7 @@ bool8 sub_805E874(void) if (tile->object != NULL && GetEntityType(tile->object) == ENTITY_TRAP) { if (tile->object->isVisible) return FALSE; - if (gDungeon->unk181e8.unk1820F) + if (gDungeon->unk181e8.showInvisibleTrapsMonsters) return FALSE; } } diff --git a/src/code_8069D4C.c b/src/code_8069D4C.c index 0aa92cef7..9694c2ffd 100644 --- a/src/code_8069D4C.c +++ b/src/code_8069D4C.c @@ -17,7 +17,7 @@ extern u8 gUnknown_810AC62; // 0xC extern u8 gUnknown_810AC68; // 0x8 extern u8 gUnknown_810AC64; // 0x8 extern u8 gUnknown_810AC66; // 0x8 -extern DungeonPos gUnknown_203B410; +extern DungeonPos gPlayerDotMapPosition; extern DungeonPos gUnknown_202EE0C; s32 sub_806A4DC(EntityInfo *info); bool8 sub_8070F80(Entity * pokemon, s32 direction); @@ -51,8 +51,8 @@ void sub_80694C0(Entity *target,s32 x,int y,char param_4) (target->pos).x = x; (target->pos).y = y; if (info->isTeamLeader) { - gUnknown_203B410.x = x; - gUnknown_203B410.y = y; + gPlayerDotMapPosition.x = x; + gPlayerDotMapPosition.y = y; } tile->monster = target; if (info->isTeamLeader) { @@ -247,7 +247,7 @@ void sub_8069844(struct unkStruct_808FF20 *param_1, Entity *target) { param_1->unk44[1].level = 0; param_1->IQSkills = info->IQSkillMenuFlags; if (gDungeon->unk644.unk16 != 0) { - param_1->unk4C = sub_806A4DC(info); + param_1->unk4C = sub_806A4DC(info); } else { param_1->unk4C = 3; @@ -265,7 +265,7 @@ void sub_8069844(struct unkStruct_808FF20 *param_1, Entity *target) { } if (FixedPointToInt(info->belly) == 0) { if (info->isTeamLeader) { - param_1->unk58[uVar15] = 19; + param_1->unk58[uVar15] = 19; } else { param_1->unk58[uVar15] = 59; diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index d32a61f91..e74b9d09c 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -2061,7 +2061,7 @@ void sub_806C51C(Entity *entity) if (entInfo->isNotTeamMember && (entInfo->apparentID == MONSTER_DEOXYS_ATTACK || entInfo->apparentID == MONSTER_DEOXYS_DEFENSE || entInfo->apparentID == MONSTER_DEOXYS_SPEED)) { r4 = TRUE; } - if (entInfo->invisibleClassStatus.status == STATUS_INVISIBLE && !gDungeon->unk181e8.unk1820F) { + if (entInfo->invisibleClassStatus.status == STATUS_INVISIBLE && !gDungeon->unk181e8.showInvisibleTrapsMonsters) { r4 = TRUE; } if (r4) { diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index d3fd624f9..b01375b4e 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -877,7 +877,7 @@ extern SpriteOAM gUnknown_202EDC0; void sub_807FA9C(void) { s32 x, y; - bool8 unkBool = gDungeon->unk181e8.unk1820F; + bool8 unkBool = gDungeon->unk181e8.showInvisibleTrapsMonsters; for (y = gDungeon->unk181e8.cameraPos.y - 5; y < gDungeon->unk181e8.cameraPos.y + 5; y++) { for (x = gDungeon->unk181e8.cameraPos.x - 6; x < gDungeon->unk181e8.cameraPos.x + 6; x++) { diff --git a/src/dungeon_map.c b/src/dungeon_map.c index 1b4e7086a..0edb8ab89 100644 --- a/src/dungeon_map.c +++ b/src/dungeon_map.c @@ -19,7 +19,7 @@ extern const char gUnknown_80F6604; // "zmappat" extern struct FileArchive gDungeonFileArchive; -extern DungeonPos gUnknown_203B410; +extern DungeonPos gPlayerDotMapPosition; extern s32 gUnknown_202EDD0; extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *); @@ -69,8 +69,8 @@ void InitDungeonMap(bool8 a0) } if (!a0) { - gUnknown_203B410.x = 100; - gUnknown_203B410.y = 100; + gPlayerDotMapPosition.x = 100; + gPlayerDotMapPosition.y = 100; } gDungeon->dungeonMap.unk1BDCC = 0; @@ -125,8 +125,8 @@ void sub_80402AC(s32 x, s32 y) bool8 blinded; u32 terrainType; bool8 hallucinating; - bool8 var_2C; - bool8 var_28; + bool8 showItems; + bool8 showHiddenTraps; bool8 r0; bool8 var_24; bool8 r7; @@ -167,8 +167,8 @@ void sub_80402AC(s32 x, s32 y) terrainType = GetTerrainType(tile); hallucinating = gDungeon->unk181e8.hallucinating; blinded = gDungeon->unk181e8.blinded; - var_28 = gDungeon->unk181e8.unk1820F; - var_2C = gDungeon->unk181e8.unk1820E; + showHiddenTraps = gDungeon->unk181e8.showInvisibleTrapsMonsters; + showItems = gDungeon->unk181e8.showAllFloorItems; r0 = gDungeon->unk181e8.unk1820B; if (blinded) { r7 = tile->spawnOrVisibilityFlags & 1; @@ -206,9 +206,9 @@ void sub_80402AC(s32 x, s32 y) r6 = 2; } else if (entInfo->isTeamLeader) { - gUnknown_203B410.x = x; - gUnknown_203B410.y = y; - if (gDungeon->unk181e8.unk18214) { + gPlayerDotMapPosition.x = x; + gPlayerDotMapPosition.y = y; + if (gDungeon->unk181e8.inFloorMapMode) { r6 = 8; } } @@ -227,7 +227,7 @@ void sub_80402AC(s32 x, s32 y) if (!r7) { r6 = 0; if (entType == ENTITY_ITEM) { - if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + if ((showItems || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { r6 = 3; } } @@ -235,7 +235,7 @@ void sub_80402AC(s32 x, s32 y) } else { if (entType == ENTITY_TRAP) { - if (entity->isVisible || var_28) { + if (entity->isVisible || showHiddenTraps) { Trap *trap = GetTrapData(entity); r6 = gUnknown_80F65F0[trap->id]; r10 = FALSE; @@ -245,7 +245,7 @@ void sub_80402AC(s32 x, s32 y) if (r10) { if (entType == ENTITY_ITEM) { - if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { + if ((showItems || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { r6 = 3; r10 = FALSE; } @@ -344,7 +344,7 @@ void sub_80402AC(s32 x, s32 y) } else { r6 = 1; - gUnknown_203B410.x = 100; + gPlayerDotMapPosition.x = 100; } xDiv2 = x / 2; @@ -435,11 +435,11 @@ void sub_8040788(void) void ShowPlayerDotOnMap(void) { - if (gDungeon->unk181e8.unk18214) + if (gDungeon->unk181e8.inFloorMapMode) return; if (!gDungeon->unk181e8.unk18219) return; - if (gUnknown_203B410.x >= 100) + if (gPlayerDotMapPosition.x >= 100) return; if ((++sPlayerDotFrames & 8) == 0) { SpriteOAM sprite = {0}; @@ -459,13 +459,13 @@ void ShowPlayerDotOnMap(void) SpriteSetUnk6_1(&sprite, 0); // Nulled on GBA if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { - SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16); - SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4); + SpriteSetX(&sprite, (gPlayerDotMapPosition.x * 4) + 16); + SpriteSetY(&sprite, (gPlayerDotMapPosition.y + 1) * 4); nullsub_11(&sprite,0x100,NULL,NULL); } else { - SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8); - SpriteSetY(&sprite, (gUnknown_203B410.y) * 4); + SpriteSetX(&sprite, (gPlayerDotMapPosition.x * 4) + 8); + SpriteSetY(&sprite, (gPlayerDotMapPosition.y) * 4); AddSprite(&sprite,0x100,NULL,NULL); } } diff --git a/src/dungeon_map_access.c b/src/dungeon_map_access.c index 858fd80a5..18190d39e 100644 --- a/src/dungeon_map_access.c +++ b/src/dungeon_map_access.c @@ -442,7 +442,7 @@ void sub_8049BB0(s32 x, s32 y) void sub_8049ED4(void) { - bool32 hallucinating, unk1820F; + bool32 hallucinating, showInvisibleTrapsMonsters; u16 *src; const Tile *tile; s32 r7; @@ -455,7 +455,7 @@ void sub_8049ED4(void) Dungeon *dungeon = gDungeon; hallucinating = dungeon->unk181e8.hallucinating; - unk1820F = dungeon->unk181e8.unk1820F; + showInvisibleTrapsMonsters = dungeon->unk181e8.showInvisibleTrapsMonsters; x = dungeon->unk181e8.cameraPixelPos.x >> 3; r10 = gUnknown_80F6A4A[30 + x]; var_48 = gUnknown_80F6C06[30 + x]; @@ -484,7 +484,7 @@ void sub_8049ED4(void) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r7]; } @@ -529,7 +529,7 @@ void sub_8049ED4(void) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r7]; } @@ -562,7 +562,7 @@ void sub_804A1F0(s32 a0, s32 a1) { const Tile *tile; u16 *src; - bool32 hallucinating, unk1820F; + bool32 hallucinating, showInvisibleTrapsMonsters; s32 xTemp, yTemp; s32 i; s32 r8; @@ -574,7 +574,7 @@ void sub_804A1F0(s32 a0, s32 a1) Dungeon *dungeon = gDungeon; hallucinating = dungeon->unk181e8.hallucinating; - unk1820F = dungeon->unk181e8.unk1820F; + showInvisibleTrapsMonsters = dungeon->unk181e8.showInvisibleTrapsMonsters; xTemp = dungeon->unk181e8.cameraPixelPos.x + a0; yTemp = dungeon->unk181e8.cameraPixelPos.y + a1; yTemp >>= 3; @@ -599,7 +599,7 @@ void sub_804A1F0(s32 a0, s32 a1) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r6]; } @@ -640,7 +640,7 @@ void sub_804A1F0(s32 a0, s32 a1) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r6]; } @@ -664,7 +664,7 @@ void sub_804A49C(s32 a0, s32 a1) { const Tile *tile; u16 *src; - bool32 hallucinating, unk1820F; + bool32 hallucinating, showInvisibleTrapsMonsters; s32 xTemp, yTemp; s32 i; s32 var_2C; @@ -676,7 +676,7 @@ void sub_804A49C(s32 a0, s32 a1) Dungeon *dungeon = gDungeon; hallucinating = dungeon->unk181e8.hallucinating; - unk1820F = dungeon->unk181e8.unk1820F; + showInvisibleTrapsMonsters = dungeon->unk181e8.showInvisibleTrapsMonsters; xTemp = dungeon->unk181e8.cameraPixelPos.x + a0; yTemp = dungeon->unk181e8.cameraPixelPos.y + a1; x = xTemp >> 3; @@ -700,7 +700,7 @@ void sub_804A49C(s32 a0, s32 a1) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r6]; } @@ -741,7 +741,7 @@ void sub_804A49C(s32 a0, s32 a1) { Entity *tileObject = tile->object; if (tileObject != NULL) { - if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || unk1820F)) { + if (GetEntityType(tileObject) == ENTITY_TRAP && (tileObject->isVisible || showInvisibleTrapsMonsters)) { u8 trapType = GetEntInfo(tileObject)->flags; src = &dungeon->unk12A18[trapType][r6]; } diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index 3a7a424df..179d945a4 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -15,7 +15,7 @@ extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE]; extern u8 gUnknown_202EE76[DUNGEON_MAX_WILD_POKEMON_BODY_SIZE]; -extern DungeonPos gUnknown_203B410; +extern DungeonPos gPlayerDotMapPosition; extern Entity *gLeaderPointer; // 203B450 #include "data/dungeon_serializer.h" @@ -453,8 +453,8 @@ static void WriteDungeonVisibility(DataSerializer *seri) WriteBool8(seri, gDungeon->unk181e8.unk1820B); WriteBool8(seri, gDungeon->unk181e8.unk1820C); WriteBool8(seri, gDungeon->unk181e8.unk1820D); - WriteBool8(seri, gDungeon->unk181e8.unk1820E); - WriteBool8(seri, gDungeon->unk181e8.unk1820F); + WriteBool8(seri, gDungeon->unk181e8.showAllFloorItems); + WriteBool8(seri, gDungeon->unk181e8.showInvisibleTrapsMonsters); WriteBool8(seri, gDungeon->unk181e8.hallucinating); WriteBool8(seri, gDungeon->unk181e8.unk18211); WriteBool8(seri, gDungeon->unk181e8.unk18213); @@ -850,8 +850,8 @@ static void ReadDungeonVisibility(DataSerializer *seri) gDungeon->unk181e8.unk1820B = ReadBool8(seri); gDungeon->unk181e8.unk1820C = ReadBool8(seri); gDungeon->unk181e8.unk1820D = ReadBool8(seri); - gDungeon->unk181e8.unk1820E = ReadBool8(seri); - gDungeon->unk181e8.unk1820F = ReadBool8(seri); + gDungeon->unk181e8.showAllFloorItems = ReadBool8(seri); + gDungeon->unk181e8.showInvisibleTrapsMonsters = ReadBool8(seri); gDungeon->unk181e8.hallucinating = ReadBool8(seri); gDungeon->unk181e8.unk18211 = ReadBool8(seri); gDungeon->unk181e8.unk18213 = ReadBool8(seri); @@ -1100,8 +1100,8 @@ static void ReadMonster(DataSerializer *seri, bool8 isTeamMember, s32 index) gLeaderPointer = NULL; if (monEntInfo->isTeamLeader) { - gUnknown_203B410.x = mon->pos.x; - gUnknown_203B410.y = mon->pos.y; + gPlayerDotMapPosition.x = mon->pos.x; + gPlayerDotMapPosition.y = mon->pos.y; } LoadIQSkills(mon); diff --git a/src/trap.c b/src/trap.c index 5b6e251b9..2d5dca55f 100644 --- a/src/trap.c +++ b/src/trap.c @@ -247,7 +247,7 @@ void HandleTrap(Entity *pokemon, DungeonPos *pos, int param_3, char param_4) if (HasHeldItem(target, ITEM_TRAP_SCARF)) { text = *gUnknown_80FDB5C; } - if ((flag == TRUE) || (gDungeon->unk181e8.unk1820F != 0)) { + if ((flag == TRUE) || (gDungeon->unk181e8.showInvisibleTrapsMonsters != 0)) { if (rand < 0) text = *gUnknown_80FDB7C; } else if (rand < 0xf) { From 4734201c6df61783a3c048304a8d328cfeb4e418 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 7 Mar 2025 14:35:34 +0100 Subject: [PATCH 07/18] dungeon map documentation done --- asm/code_2.s | 2 +- asm/code_8009804.s | 4 +- asm/code_8045A00.s | 2 +- asm/code_805D8C8.s | 2 +- asm/code_805D8C8_1.s | 2 +- asm/code_80A26CC_1.s | 2 +- include/dungeon_map.h | 12 +- include/structs/map.h | 3 + include/structs/str_dungeon.h | 28 ++-- include/text.h | 8 +- src/code_8009804.c | 12 +- src/code_803E46C.c | 6 +- src/code_803E724.c | 32 ++--- src/code_8040094.c | 8 +- src/code_8042B34.c | 8 +- src/code_80450F8.c | 2 +- src/code_805D8C8_1.c | 17 ++- src/code_8069D4C.c | 6 +- src/code_8069E0C.c | 4 +- src/code_8077274_1.c | 10 +- src/code_807CD9C.c | 16 +-- src/code_80848F0.c | 4 +- src/dungeon_cutscenes.c | 10 +- src/dungeon_items.c | 4 +- src/dungeon_map.c | 242 ++++++++++++++++++---------------- src/dungeon_map_access.c | 14 +- src/dungeon_message.c | 2 +- src/dungeon_serializer.c | 4 +- src/friend_areas_map_util.c | 4 +- src/status.c | 8 +- src/status_actions.c | 6 +- src/text.c | 66 +++++----- src/tile_types.c | 6 +- src/trap.c | 4 +- src/world_map.c | 4 +- 35 files changed, 297 insertions(+), 267 deletions(-) diff --git a/asm/code_2.s b/asm/code_2.s index d7baabfaa..90a2a9524 100644 --- a/asm/code_2.s +++ b/asm/code_2.s @@ -111,7 +111,7 @@ _0800070C: .4byte gLoadScreenBackgroundPaletteFileNames _08000710: .4byte 0x00005b20 _08000714: .4byte gTitleMenuFileArchive _08000718: .4byte gTitlePaletteFile -_0800071C: .4byte gUnknown_202B038 +_0800071C: .4byte gBgTilemaps _08000720: .4byte 0x06008000 _08000724: .4byte 0x00004b20 thumb_func_end LoadTitleScreen diff --git a/asm/code_8009804.s b/asm/code_8009804.s index 0d9b13a6c..417ff23df 100644 --- a/asm/code_8009804.s +++ b/asm/code_8009804.s @@ -142,7 +142,7 @@ _08009B6E: adds r4, r1, 0 b _08009B82 .align 2, 0 -_08009B74: .4byte gUnknown_202B038 +_08009B74: .4byte gBgTilemaps _08009B78: .4byte gUnknown_202D2A0 _08009B7C: .4byte 0x000003ff _08009B80: @@ -264,6 +264,6 @@ _08009C36: bx r0 .align 2, 0 _08009C54: .4byte gUnknown_202D2A0 -_08009C58: .4byte gUnknown_202B038 +_08009C58: .4byte gBgTilemaps thumb_func_end sub_8009BE4 diff --git a/asm/code_8045A00.s b/asm/code_8045A00.s index 86e17e07e..c7aac6f24 100644 --- a/asm/code_8045A00.s +++ b/asm/code_8045A00.s @@ -1108,7 +1108,7 @@ _08046644: mov r4, sp movs r2, 0x2 ldrsh r1, [r4, r2] - bl sub_80402AC + bl ShowDungeonMapAtPos mov r0, sp movs r3, 0 ldrsh r0, [r0, r3] diff --git a/asm/code_805D8C8.s b/asm/code_805D8C8.s index 8f37278ce..5b37919c1 100644 --- a/asm/code_805D8C8.s +++ b/asm/code_805D8C8.s @@ -6426,7 +6426,7 @@ _08064D36: bne _08064D4C b _08064C14 _08064D4C: - bl sub_8040A84 + bl ShowWholeRevealedDungeonMap movs r0, 0 movs r1, 0 bl sub_803EAF0 diff --git a/asm/code_805D8C8_1.s b/asm/code_805D8C8_1.s index 1030d0ad7..711da9c4a 100644 --- a/asm/code_805D8C8_1.s +++ b/asm/code_805D8C8_1.s @@ -917,7 +917,7 @@ _08069018: ldrsh r0, [r2, r3] movs r3, 0x6 ldrsh r1, [r2, r3] - bl sub_80402AC + bl ShowDungeonMapAtPos movs r5, 0 adds r6, r7, 0 adds r6, 0xC8 diff --git a/asm/code_80A26CC_1.s b/asm/code_80A26CC_1.s index 5cac0b91e..23ce59134 100644 --- a/asm/code_80A26CC_1.s +++ b/asm/code_80A26CC_1.s @@ -107,7 +107,7 @@ _080A2BFC: .4byte 0x0000052c _080A2C00: .4byte 0x00000534 _080A2C04: .4byte 0x00000554 _080A2C08: .4byte 0x00000536 -_080A2C0C: .4byte gUnknown_202B038 +_080A2C0C: .4byte gBgTilemaps _080A2C10: .4byte 0x0000053c _080A2C14: .4byte 0x0000054c _080A2C18: .4byte 0x0000053a diff --git a/include/dungeon_map.h b/include/dungeon_map.h index fa5350853..ad9a5519b 100644 --- a/include/dungeon_map.h +++ b/include/dungeon_map.h @@ -1,7 +1,7 @@ #ifndef GUARD_DUNGEON_MAP_H #define GUARD_DUNGEON_MAP_H -extern bool8 gUnknown_202EE00; +extern bool8 gShowMonsterDotsInDungeonMap; extern bool8 gShowDungeonMap; void SetDungeonMapToNotShown(void); @@ -9,12 +9,12 @@ void OpenDungeonMapFile(void); void InitDungeonMap(bool8 a0); void CloseDungeonMapFile(void); void LoadDungeonMapPalette(void); -void sub_80402AC(s32 x, s32 y); -void sub_8040788(void); +void ShowDungeonMapAtPos(s32 x, s32 y); +void CopyDungeonMapToVram(void); void ShowPlayerDotOnMap(void); void ResetMapPlayerDotFrames(void); -void sub_8040A84(void); -void sub_8040ABC(bool8 a0); -void sub_8040B60(void); +void ShowWholeRevealedDungeonMap(void); +void UpdateBgTilemapForDungeonMap(bool8 a0); +void TryResetDungeonMapTilesScheduledForCopy(void); #endif diff --git a/include/structs/map.h b/include/structs/map.h index 8e98ced99..b57cb5428 100644 --- a/include/structs/map.h +++ b/include/structs/map.h @@ -52,6 +52,9 @@ enum SpawnFlags SPAWN_FLAG_UNK7 = 1 << 7, // 0x80 - Not fully understood field. In the dungeon algorithm, it is set to true for all tiles in a Divider secondary structure room. }; +#define VISIBILITY_FLAG_REVEALED 1 // When using Luminous Orb - whole layout is shown, but grayed-out +#define VISIBILITY_FLAG_VISITED 2 // Tile was visited, show filled/white layout + // size: 0x18 typedef struct Tile { diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index b35aafff6..1e37b126e 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -82,7 +82,7 @@ typedef struct UnkDungeonGlobal_unk181E8_sub u8 priority; // x20 /* 0x18209 */ u8 visibilityRange; // x21 Dungeon light level. /* 0x1820A */ bool8 blinded; // x22 Blacks out the screen when the player has the Blinker status. - bool8 unk1820B; // x23 + bool8 allTilesRevealed; // x23 bool8 unk1820C; // x24 bool8 unk1820D; // x25 bool8 showAllFloorItems; // x26 @@ -338,25 +338,27 @@ struct UnkDungeonGlobal_1822C_Sub u32 arr[8]; }; -#define UNK1822C_ARR_COUNT (DUNGEON_MAX_SIZE_Y / 2) -#define UNK1822C_ARR_COUNT_2 (DUNGEON_MAX_SIZE_X / 2) +#define DUNGEON_MAP_MAX_Y (DUNGEON_MAX_SIZE_Y / 2) +#define DUNGEON_MAP_MAX_X (DUNGEON_MAX_SIZE_X / 2) -struct UnkDungeonGlobal_unk1BBEC +struct DungeonMapVramCopy { - u32 *ptr1; - u32 *ptr2; + u32 *vramPtr; + u32 *mapArrayPtr; bool8 *boolPtr; }; +#define MAX_SCHEDULED_DUNGEON_MAP_COPIES 40 + struct DungeonMap { - struct UnkDungeonGlobal_1822C_Sub dungeonMap[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; - bool8 unk1BA2C[UNK1822C_ARR_COUNT][UNK1822C_ARR_COUNT_2]; - struct UnkDungeonGlobal_unk1BBEC unk1BBEC[40]; - s32 unk1BDCC; - u8 unk1BDD0; - u8 unk1BDD1; - u8 unk1BDD2; + struct UnkDungeonGlobal_1822C_Sub perTile[DUNGEON_MAP_MAX_Y][DUNGEON_MAP_MAX_X]; + bool8 tileScheduledForCopy[DUNGEON_MAP_MAX_Y][DUNGEON_MAP_MAX_X]; + struct DungeonMapVramCopy vramCopies[MAX_SCHEDULED_DUNGEON_MAP_COPIES]; + s32 scheduledVramCopiesCount; + bool8 copyToVram; + bool8 copyAllAtOnce; + bool8 resetTilesScheduledForCopy; }; // size: 0x1CEDC diff --git a/include/text.h b/include/text.h index eab07f382..b961b1bb3 100644 --- a/include/text.h +++ b/include/text.h @@ -52,7 +52,13 @@ struct UnkDrawStringStruct extern UnkTextStruct1 gUnknown_2027370[4]; extern u8 gUnknown_202749A[11]; extern bool8 gUnknown_20274A5; -extern u16 gUnknown_202B038[4][32][32]; // Usage points to these dimensions +// These should probably go to code_8009804.h +#define TILEMAP_TILE_NUM(num)(num & 0x3FF) // bits 0-9 +#define TILEMAP_FLIP_HORIZONTAL(f)((f & 1) << 10) // bit 10 +#define TILEMAP_FLIP_VERTICAL(f)((f & 1) << 11) // bit 11 +#define TILEMAP_PAL(pal)((pal & 0xF) << 12) // bits 12-15 +extern u16 gBgTilemaps[4][32][32]; // 4 bgs, 32x32 tiles, y dimension goes before x [bgId][y][x] + extern void (*gIwramTextFunc1)(s32 a0); extern void (*gIwramTextFunc2)(s32 a0); extern void (*gIwramTextFunc3)(s32 a0); diff --git a/src/code_8009804.c b/src/code_8009804.c index 0ba651473..f0d9f4fae 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -123,26 +123,26 @@ void sub_8009908(void) gUnknown_202D23C = 0; if (gUnknown_202D238[0] != 0) { gUnknown_202D238[0] = 0; - CpuCopy(BG_SCREEN_ADDR(12), gUnknown_202B038[0], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(12), gBgTilemaps[0], BG_SCREEN_SIZE); } if (gUnknown_202D238[1] != 0) { gUnknown_202D238[1] = 0; - CpuCopy(BG_SCREEN_ADDR(13), gUnknown_202B038[1], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(13), gBgTilemaps[1], BG_SCREEN_SIZE); } if (gUnknown_202D238[2] != 0) { gUnknown_202D238[2] = 0; - CpuCopy(BG_SCREEN_ADDR(14), gUnknown_202B038[2], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(14), gBgTilemaps[2], BG_SCREEN_SIZE); } if (gUnknown_202D238[3] != 0) { gUnknown_202D238[3] = 0; - CpuCopy(BG_SCREEN_ADDR(15), gUnknown_202B038[3], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(15), gBgTilemaps[3], BG_SCREEN_SIZE); } } void sub_80099C0(void) { - CpuCopy(BG_SCREEN_ADDR(12), gUnknown_202B038[0], BG_SCREEN_SIZE); - CpuCopy(BG_SCREEN_ADDR(13), gUnknown_202B038[1], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(12), gBgTilemaps[0], BG_SCREEN_SIZE); + CpuCopy(BG_SCREEN_ADDR(13), gBgTilemaps[1], BG_SCREEN_SIZE); } void SetFontsBaseColor(RGB a0) diff --git a/src/code_803E46C.c b/src/code_803E46C.c index 2f36b5a4c..ce548ed02 100644 --- a/src/code_803E46C.c +++ b/src/code_803E46C.c @@ -36,8 +36,6 @@ void sub_803ECE0(); void sub_803EDF0(); void sub_800E90C(); void sub_8042E5C(); -void sub_8040B60(); -void sub_8040788(); void sub_800F7D0(DungeonPos *); void sub_803E874(s32, s32); void sub_803EAF0(s32, s32); @@ -107,13 +105,13 @@ void sub_803E490(u32 unused) TransferBGPaletteBuffer(); sub_8009908(); xxx_call_update_bg_vram(); - sub_8040788(); + CopyDungeonMapToVram(); xxx_call_update_bg_sound_input(); gDungeon->unk181e8.unk18213 = 0; UpdateDungeonMusic(); sub_8011860(); - sub_8040B60(); + TryResetDungeonMapTilesScheduledForCopy(); ResetSprites(FALSE); nullsub_10(FALSE); gUnknown_202EDD4--; diff --git a/src/code_803E724.c b/src/code_803E724.c index e6334780e..9af53fb06 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -14,6 +14,7 @@ #include "dungeon_map_access.h" #include "sprite.h" #include "bg_control.h" +#include "dungeon_map.h" #include "game_options.h" #include "code_800558C.h" #include "dungeon_range.h" @@ -54,15 +55,14 @@ extern u8 gUnknown_20274A5; extern s32 gUnknown_202EDCC; -extern void sub_8040A84(); +extern void ShowWholeRevealedDungeonMap(); extern void sub_8083D44(void); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_80400D4(void); extern void sub_8041888(u8 param_1); -extern void sub_80402AC(s32, s32); +extern void ShowDungeonMapAtPos(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); @@ -279,14 +279,14 @@ void sub_803EAF0(u32 a0, u8 *a1) sub_803EC94(); ShowWindows(NULL, TRUE, TRUE); if (gUnknown_203B40C != 0) { - sub_8040A84(); - sub_8040ABC(0); + ShowWholeRevealedDungeonMap(); + UpdateBgTilemapForDungeonMap(FALSE); } break; case 3: ShowWindows(&gUnknown_80F62B0, TRUE, TRUE); if (gUnknown_203B40C != 0) { - sub_8040ABC(1); + UpdateBgTilemapForDungeonMap(TRUE); } break; case 6: @@ -690,7 +690,7 @@ void sub_803F27C(bool8 a0) strPtr->unk1820D = FALSE; strPtr->unk18211 = 0; strPtr->showAllFloorItems = FALSE; - strPtr->unk1820B = 0; + strPtr->allTilesRevealed = 0; strPtr->unk1820C = 0; } @@ -742,7 +742,7 @@ bool8 sub_803F428(DungeonPos *pos) 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) { + if (strPtr->allTilesRevealed == 0 && strPtr->unk1820C == 0 && cameraEntity != NULL) { return IsPositionActuallyInSight(&strPtr->cameraPos, pos); } return TRUE; @@ -795,7 +795,7 @@ void sub_803F508(Entity *a0) sub_806CD90(); } sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } void sub_803F580(u8 a0) @@ -875,7 +875,7 @@ void sub_803F580(u8 a0) if (before != strPtr->showInvisibleTrapsMonsters) { sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8041888(0); } @@ -905,7 +905,7 @@ void sub_803F580(u8 a0) for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { Entity *mon = gDungeon->activePokemon[i]; if (EntityIsValid(mon)) { - sub_80402AC(mon->pos.x, mon->pos.y); + ShowDungeonMapAtPos(mon->pos.x, mon->pos.y); } } } @@ -921,7 +921,7 @@ void sub_803F7BC(void) const Tile *tile = GetTile(strPtr->cameraPos.x, strPtr->cameraPos.y); u32 roomId = tile->room; - if (strPtr->unk1820B != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { + if (strPtr->allTilesRevealed != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { sub_8005838(NULL, 0); } else if (roomId == CORRIDOR_ROOM) { @@ -1010,7 +1010,7 @@ void sub_803F9CC(void) if (!r5) { for (i = 1; i < 30; i++) { - gUnknown_202B038[0][0][i] = 0; + gBgTilemaps[0][0][i] = 0; } sub_803F38C(); } @@ -1151,7 +1151,7 @@ void sub_803FB74(void) nullsub_5(0xFF, &gFontPalette[15 + r6]); } - arrPtr = gUnknown_202B038[0][0]; + arrPtr = gBgTilemaps[0][0]; unkFloor = gDungeon->unk14 + gDungeon->unk644.dungeonLocation.floor; if (strPtr->unk3A != unkFloor) { strPtr->unk3A = unkFloor; @@ -1203,7 +1203,7 @@ void sub_803FB74(void) } for (i = 0; i < 12; i++) { - gUnknown_202B038[0][0][18 + i] = (0x2CC + i) | 0xF000; + gBgTilemaps[0][0][18 + i] = (0x2CC + i) | 0xF000; } } diff --git a/src/code_8040094.c b/src/code_8040094.c index db7a90417..278031a6e 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -17,7 +17,7 @@ extern struct FileArchive gDungeonFileArchive; extern void sub_803F7BC(void); extern void sub_803F580(u32); -extern void sub_8040A84(); +extern void ShowWholeRevealedDungeonMap(); extern const char *gUnknown_80FD040; // It became brighter on the floor @@ -27,19 +27,19 @@ void HandleLuminousOrbAction(Entity *pokemon) int XCoord; int YCoord; - gDungeon->unk181e8.unk1820B = 1; + gDungeon->unk181e8.allTilesRevealed = TRUE; for(YCoord = 0; YCoord < DUNGEON_MAX_SIZE_Y; YCoord++) { for(XCoord = 0; XCoord < DUNGEON_MAX_SIZE_X; XCoord++) { Tile *mapTile = GetTileMut(XCoord, YCoord); - mapTile->spawnOrVisibilityFlags |= 1; + mapTile->spawnOrVisibilityFlags |= VISIBILITY_FLAG_REVEALED; } } sub_803F580(0); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); LogMessageByIdWithPopupCheckUser(pokemon, gUnknown_80FD040); } diff --git a/src/code_8042B34.c b/src/code_8042B34.c index 2aa84f8c5..d76bfeea6 100644 --- a/src/code_8042B34.c +++ b/src/code_8042B34.c @@ -288,7 +288,7 @@ extern void sub_8071DA4(Entity *); extern void sub_803E748(void); extern void sub_8083D68(void); extern void sub_803E7C8(void); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_807E5AC(void); extern void TriggerWeatherAbilities(void); extern void sub_807E88C(void); @@ -432,7 +432,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) } if (!r6) { - gDungeon->unk181e8.unk1820B = 1; + gDungeon->unk181e8.allTilesRevealed = 1; gDungeon->unk181e8.unk1820C = 1; if (gDungeon->unk644.unk34 == 1) { gDungeon->unk644.dungeonLocation.id = r8->unk14.unk0; @@ -659,7 +659,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) sub_8040094(0); sub_803EAF0(0, 0); InitDungeonMap(r6); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); gDungeon->unkB8 = NULL; gDungeon->unk644.unk28 = 0; gDungeon->unk644.unk29 = 0; @@ -683,7 +683,7 @@ void RunDungeon(struct UnkStruct_RunDungeon *r8) } else { sub_803F4A0(GetLeader()); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } } diff --git a/src/code_80450F8.c b/src/code_80450F8.c index b7e22fe5f..6428ade4a 100644 --- a/src/code_80450F8.c +++ b/src/code_80450F8.c @@ -220,7 +220,7 @@ bool8 sub_8045804(Entity *ent) if (!saveTyping->showInvisibleTrapsMonsters && monInfo->invisibleClassStatus.status == STATUS_INVISIBLE) return FALSE; - if (saveTyping->unk1820B || saveTyping->unk1820D) + if (saveTyping->allTilesRevealed || saveTyping->unk1820D) return TRUE; if (camTarget != NULL) diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index 1cc91377c..7fe39989b 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -81,7 +81,7 @@ void sub_805E804(void); void sub_8064BE0(void); void sub_8075680(u32); void sub_8094C88(void); -void sub_8040A84(void); +void ShowWholeRevealedDungeonMap(void); void sub_8047158(void); void sub_806A914(u8 a0, u8 a1, u8 a2); void sub_8044C10(u8 a0); @@ -118,7 +118,6 @@ extern bool8 sub_8071A8C(Entity *pokemon); extern void sub_80643AC(Entity *pokemon); extern u8 sub_8062F90(Entity *, u32, u32, u32, u32); -extern u8 gUnknown_202EE00; extern Entity *gLeaderPointer; extern const u8 *gUnknown_80F8A84; @@ -424,15 +423,15 @@ void DungeonHandlePlayerInput(void) } // SELECT button - if (!gDungeon->unk181e8.blinded && gGameOptionsRef->mapOption != 6 && gRealInputs.pressed & SELECT_BUTTON) { + if (!gDungeon->unk181e8.blinded && gGameOptionsRef->mapOption != TOP_MAP_AND_TEAM_NO_BOTTOM && gRealInputs.pressed & SELECT_BUTTON) { s32 prevMapOption = gGameOptionsRef->mapOption; - gUnknown_202EE00 = 1; + gShowMonsterDotsInDungeonMap = TRUE; gDungeon->unk181e8.inFloorMapMode = TRUE; if (!sub_8094C48()) { sub_8094C88(); } sub_8052210(1); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); SetBGOBJEnableFlags(0x1E); sub_803E708(0xA, 0x2F); while (1) { @@ -443,14 +442,14 @@ void DungeonHandlePlayerInput(void) break; if (gRealInputs.pressed & A_BUTTON) { - gUnknown_202EE00 = (gUnknown_202EE00 == 0) ? 1 : 0; // Flip - sub_8040A84(); + gShowMonsterDotsInDungeonMap = (gShowMonsterDotsInDungeonMap == FALSE) ? TRUE : FALSE; // Flip + ShowWholeRevealedDungeonMap(); } } gDungeon->unk181e8.inFloorMapMode = FALSE; gGameOptionsRef->mapOption = prevMapOption; - gUnknown_202EE00 = 1; - sub_8040A84(); + gShowMonsterDotsInDungeonMap = TRUE; + ShowWholeRevealedDungeonMap(); SetBGOBJEnableFlags(0); sub_803E46C(0x2F); sub_803E46C(0x2F); diff --git a/src/code_8069D4C.c b/src/code_8069D4C.c index 9694c2ffd..9ba6b93b2 100644 --- a/src/code_8069D4C.c +++ b/src/code_8069D4C.c @@ -21,7 +21,7 @@ extern DungeonPos gPlayerDotMapPosition; extern DungeonPos gUnknown_202EE0C; s32 sub_806A4DC(EntityInfo *info); bool8 sub_8070F80(Entity * pokemon, s32 direction); -void sub_80402AC(s32, s32); +void ShowDungeonMapAtPos(s32, s32); void sub_80694C0(Entity *target,s32 x,int y,char param_4) { @@ -44,7 +44,7 @@ void sub_80694C0(Entity *target,s32 x,int y,char param_4) if (tile2->monster == target) { tile2->monster = NULL; } - sub_80402AC((target->pos).x,(target->pos).y); + ShowDungeonMapAtPos((target->pos).x,(target->pos).y); } (target->prevPos).x = (target->pos).x; (target->prevPos).y = (target->pos).y; @@ -60,7 +60,7 @@ void sub_80694C0(Entity *target,s32 x,int y,char param_4) gUnknown_202EE0C.y = y; gDungeon->unk1 = 0; } - sub_80402AC(x,y); + ShowDungeonMapAtPos(x,y); switch(param_4) { diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index e74b9d09c..d79c82f84 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -80,7 +80,7 @@ extern void sub_8042EC8(Entity *a0, s32 a1); extern Entity *sub_804550C(s16 a); extern Entity *sub_80453AC(s16 id); extern void sub_803F580(s32); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_806B678(void); extern void EntityUpdateStatusSprites(Entity *); extern Entity *sub_80696A8(Entity *a0); @@ -543,7 +543,7 @@ void sub_806A6E8(Entity *entity) else { if (info->heldItem.id == ITEM_X_RAY_SPECS || info->unk64 == ITEM_X_RAY_SPECS) { sub_803F580(1); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } } sub_807AA30(); diff --git a/src/code_8077274_1.c b/src/code_8077274_1.c index 24550b07c..25944ff33 100644 --- a/src/code_8077274_1.c +++ b/src/code_8077274_1.c @@ -147,7 +147,7 @@ extern u8 *gUnknown_80FBF28[]; extern u8 *gUnknown_80FBF68[]; extern u8 *gUnknown_80FBF84[]; -extern void sub_8040A84(); +extern void ShowWholeRevealedDungeonMap(); extern void EntityUpdateStatusSprites(Entity *); extern void sub_8042A74(Entity *r0); extern void sub_807EC28(bool8); @@ -372,7 +372,7 @@ void BlindTarget(Entity *pokemon, Entity *target) TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FB7F4); sub_803E46C(0x31); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } else { @@ -399,7 +399,7 @@ void CrossEyeVisionTarget(Entity *pokemon, Entity *target) entityInfo->blinkerClassStatus.turns = CalculateStatusTurns(target,gCrossEyedTurnRange, TRUE) + 1; sub_803F580(0x1); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } else { @@ -425,7 +425,7 @@ void RestoreVisionTarget(Entity *pokemon, Entity *target) TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FB880); sub_803E46C(0x31); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } else { @@ -1508,7 +1508,7 @@ void SendEyesightEndMessage(Entity * pokemon,Entity * target) if (entityInfo->isTeamLeader) { sub_803E46C(0x31); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } } diff --git a/src/code_807CD9C.c b/src/code_807CD9C.c index 1edaa4117..a8db22a03 100644 --- a/src/code_807CD9C.c +++ b/src/code_807CD9C.c @@ -60,7 +60,7 @@ EWRAM_INIT u32 gUnknown_203B444[3] = {0x28, 0x28, 0x50}; void sub_804EB30(); bool8 ExposeTrap(s32 x, s32 y); -void sub_8040A84(); +void ShowWholeRevealedDungeonMap(); void sub_8049ED4(); void sub_806A5B8(Entity *); u8 sub_8045888(Entity *); @@ -76,7 +76,7 @@ bool8 sub_808384C(DungeonPos *, DungeonPos *); u8 sub_8083660(DungeonPos *); void sub_80460F8(DungeonPos *, Item *, u32); void sub_80462AC(Entity * ,u32, u32, u8, u32); -extern void sub_80402AC(s32, s32); +extern void ShowDungeonMapAtPos(s32, s32); void BlowAwayTarget(Entity *pokemon, Entity *target, u32 direction) { @@ -385,7 +385,7 @@ void sub_807D3CC(Entity *param_1) } if (flag) { LogMessageByIdWithPopupCheckUser(param_1,*gUnknown_80FD2F8); // All traps were exposed - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); } else { @@ -503,7 +503,7 @@ void HandleTrawlOrbAction(Entity *user, Entity *target) for (i = 0; i < itemsCount; i++) { if (EntityIsValid(&itemEntities[i])) { sub_80461C8(&itemEntities[i].pos, 1); - sub_80402AC(itemEntities[i].pos.x, itemEntities[i].pos.y); + ShowDungeonMapAtPos(itemEntities[i].pos.x, itemEntities[i].pos.y); itemVelocity[i].x = (((targetTilePos[i].x * 24 + 4) * 256) - itemEntities[i].pixelPos.x) / 60; itemVelocity[i].y = (((targetTilePos[i].y * 24 + 4) * 256) - itemEntities[i].pixelPos.y) / 60; } @@ -534,7 +534,7 @@ void HandleTrawlOrbAction(Entity *user, Entity *target) for (i = 0; i < itemsCount; i++) { if (targetTilePos[i].x >= 0) { sub_80460F8(&targetTilePos[i], GetItemData(&itemEntities[i]), 1); - sub_80402AC(targetTilePos[i].x, targetTilePos[i].y); + ShowDungeonMapAtPos(targetTilePos[i].x, targetTilePos[i].y); hasTrawled = TRUE; } } @@ -652,7 +652,7 @@ void HandleDroughtOrbAction(Entity *pokemon, Entity *target) { } gDungeon->unk644.unk2C = 1; sub_806CF60(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); } @@ -757,7 +757,7 @@ void HandleOneRoomOrb(Entity *pokemon, Entity *target) { sub_804AAD4(); sub_8049884(); sub_806CF60(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); LogMessageByIdWithPopupCheckUser(pokemon,*gUnknown_80FD3A0); sub_803E708(0x28,0x2b); @@ -861,7 +861,7 @@ void HandleExplosion(Entity *pokemon,Entity *target,DungeonPos *param_3,s32 para sub_8049BB0(x,y); } } - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); } } diff --git a/src/code_80848F0.c b/src/code_80848F0.c index bc881ff3f..c96ed81b1 100644 --- a/src/code_80848F0.c +++ b/src/code_80848F0.c @@ -14,7 +14,7 @@ #include "structs/str_806B7F8.h" extern const DungeonPos gUnknown_80F4598[]; -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); struct unkData_8107234 { @@ -32,7 +32,7 @@ void sub_80847D4(void) gDungeon->unk3A0D = 0; gDungeon->unk1356C = 0; - sub_8040A84(); + ShowWholeRevealedDungeonMap(); for(index = 0; index < 0x3e7 && gUnknown_8107234[index].unk0[0] != 0; index++) { fixedRoomNumber = gDungeon->fixedRoomNumber; if (fixedRoomNumber - 0x1c < 0x16) { diff --git a/src/dungeon_cutscenes.c b/src/dungeon_cutscenes.c index 010fe490c..45cb831d1 100644 --- a/src/dungeon_cutscenes.c +++ b/src/dungeon_cutscenes.c @@ -374,7 +374,7 @@ extern void BgColorCallNullsub4(void); extern void sub_8085EB0(void); extern void sub_8049884(void); extern void sub_8049B8C(void); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_8086A54(Entity *); extern void ResetMonEntityData(EntityInfo *, u32); extern void sub_808BBA8(Entity * ); @@ -3721,7 +3721,7 @@ void sub_808B1CC(u8 itemID) sub_80460F8(&pos,&item,1); } sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } void SetupRegiFacingDirection(Entity *regiEntity) @@ -3812,7 +3812,7 @@ void sub_808B3E4(u8 param_1, u8 param_2, u8 param_3) sub_808B50C(); } gDungeon->unk1356C = uVar1; - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } } } @@ -4181,7 +4181,7 @@ void CreateJirachiWishWarpTile(void) sub_8049884(); sub_8049B8C(); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } void EnableJirachiWishWarpTile(void) @@ -4197,7 +4197,7 @@ void EnableJirachiWishWarpTile(void) sub_8049884(); sub_8049B8C(); sub_8049ED4(); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } u8 JirachiFriendAreaSearch(void) diff --git a/src/dungeon_items.c b/src/dungeon_items.c index 2e12ed8fd..1d894a191 100644 --- a/src/dungeon_items.c +++ b/src/dungeon_items.c @@ -24,7 +24,7 @@ extern void sub_80416E0(PixelPos *r0, u32, bool8); extern void sub_80855E4(void *); extern void PlaySoundEffect(u32); extern void sub_804178C(u32); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); static void MusicBoxCreation(void); static u8 sub_8046D70(void); @@ -157,7 +157,7 @@ void MusicBoxCreation(void) sub_803E708(10,0x41); sub_804178C(1); gDungeon->unk1356C = 0; - sub_8040A84(); + ShowWholeRevealedDungeonMap(); } } diff --git a/src/dungeon_map.c b/src/dungeon_map.c index 0edb8ab89..091063fbe 100644 --- a/src/dungeon_map.c +++ b/src/dungeon_map.c @@ -41,11 +41,11 @@ struct DungeonMapGfx RGB *pal; }; -EWRAM_DATA bool8 gUnknown_202EE00 = FALSE; +EWRAM_DATA bool8 gShowMonsterDotsInDungeonMap = FALSE; EWRAM_DATA bool8 gShowDungeonMap = FALSE; EWRAM_DATA static u8 sPlayerDotFrames = 0; EWRAM_DATA static OpenedFile *sDungeonMapGfxFile = NULL; -EWRAM_DATA static void *gUnknown_202EE08 = NULL; +EWRAM_DATA static void *sDungeonMapVramDst = NULL; void SetDungeonMapToNotShown(void) { @@ -61,10 +61,10 @@ void InitDungeonMap(bool8 a0) { s32 i, j; - for (i = 0; i < UNK1822C_ARR_COUNT; i++) { - for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) { - CpuClear(&gDungeon->dungeonMap.dungeonMap[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); - gDungeon->dungeonMap.unk1BA2C[i][j] = FALSE; + for (i = 0; i < DUNGEON_MAP_MAX_Y; i++) { + for (j = 0; j < DUNGEON_MAP_MAX_X; j++) { + CpuClear(&gDungeon->dungeonMap.perTile[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub)); + gDungeon->dungeonMap.tileScheduledForCopy[i][j] = FALSE; } } @@ -73,11 +73,11 @@ void InitDungeonMap(bool8 a0) gPlayerDotMapPosition.y = 100; } - gDungeon->dungeonMap.unk1BDCC = 0; - gDungeon->dungeonMap.unk1BDD0 = 1; - gDungeon->dungeonMap.unk1BDD2 = 0; - gUnknown_202EE00 = 1; - gUnknown_202EE08 = (void *) VRAM + 0x1700; + gDungeon->dungeonMap.scheduledVramCopiesCount = 0; + gDungeon->dungeonMap.copyToVram = TRUE; + gDungeon->dungeonMap.resetTilesScheduledForCopy = FALSE; + gShowMonsterDotsInDungeonMap = TRUE; + sDungeonMapVramDst = (void *) VRAM + 0x1700; gShowDungeonMap = TRUE; LoadDungeonMapPalette(); } @@ -90,7 +90,7 @@ void CloseDungeonMapFile(void) SetDungeonMapToNotShown(); } -// Used in Pmd's Blue version. Stores different Vram address in gUnknown_202EE08(maybe?), depending on TOP_MAP_AND_TEAM_NO_BOTTOM map option. +// Used in Pmd's Blue version. Stores different Vram address in sDungeonMapVramDst(maybe?), depending on TOP_MAP_AND_TEAM_NO_BOTTOM map option. UNUSED static void nullsub_203(void) { @@ -117,7 +117,29 @@ void LoadDungeonMapPalette(void) } } -void sub_80402AC(s32 x, s32 y) +enum { + MAP_GFX_NOTHING, + MAP_GFX_UNK1, // Appears to be nothing too + MAP_GFX_ENEMY, + MAP_GFX_ITEM, + MAP_GFX_TRAP, + MAP_GFX_SPECIAL_STAIRS, + MAP_GFX_STAIRS, + MAP_GFX_WONDER_TILE, + MAP_GFX_PLAYER, + MAP_GFX_WHITE_SQUARE, // Possibly unused? It's like Stairs, but white instead of blue + MAP_GFX_ALLY, + MAP_GFX_GREEN_DOT, // Used when hallucinating +}; + +#define MAP_GFX_TERRAIN_TILES_VISITED 0x10 +#define MAP_GFX_TERRAIN_TILES_REVEALED 0x20 +#define MAP_GFX_TERRAIN_LINE_UP 0x1 +#define MAP_GFX_TERRAIN_LINE_RIGHT 0x2 +#define MAP_GFX_TERRAIN_LINE_DOWN 0x4 +#define MAP_GFX_TERRAIN_LINE_LEFT 0x8 + +void ShowDungeonMapAtPos(s32 x, s32 y) { s32 yAdd = 0; const Tile *tile; @@ -127,17 +149,17 @@ void sub_80402AC(s32 x, s32 y) bool8 hallucinating; bool8 showItems; bool8 showHiddenTraps; - bool8 r0; + bool8 allTilesRevealed; bool8 var_24; - bool8 r7; - s32 r6; + bool8 tileKnown; + s32 mapGfxType; s32 xDiv2, yDiv2; u32 *src, *dst; - bool8 r10; + bool8 lookForMapObject; s32 r3, yMinus; dungeon = gDungeon; - r10 = TRUE; + lookForMapObject = TRUE; if (sDungeonMapGfxFile == NULL) return; @@ -169,17 +191,17 @@ void sub_80402AC(s32 x, s32 y) blinded = gDungeon->unk181e8.blinded; showHiddenTraps = gDungeon->unk181e8.showInvisibleTrapsMonsters; showItems = gDungeon->unk181e8.showAllFloorItems; - r0 = gDungeon->unk181e8.unk1820B; + allTilesRevealed = gDungeon->unk181e8.allTilesRevealed; if (blinded) { - r7 = tile->spawnOrVisibilityFlags & 1; + tileKnown = tile->spawnOrVisibilityFlags & VISIBILITY_FLAG_REVEALED; var_24 = FALSE; } else { - if (r0) { - r7 = TRUE; + if (allTilesRevealed) { + tileKnown = TRUE; } else { - r7 = tile->spawnOrVisibilityFlags & 1; + tileKnown = tile->spawnOrVisibilityFlags & VISIBILITY_FLAG_REVEALED; } if (GetFloorType() == FLOOR_TYPE_NORMAL) { @@ -191,159 +213,159 @@ void sub_80402AC(s32 x, s32 y) } if (sub_8094C48() && !gDungeon->unk1356C) { - r6 = 0; + mapGfxType = MAP_GFX_NOTHING; if (!blinded) { Entity *entity = tile->monster; if (entity != NULL) { s32 entType = GetEntityType(entity); - if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) { + if (gShowMonsterDotsInDungeonMap && entType == ENTITY_MONSTER && sub_8045804(entity)) { EntityInfo *entInfo = GetEntInfo(entity); if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) { - r6 = 10; + mapGfxType = MAP_GFX_ALLY; } else { if (entInfo->isNotTeamMember) { - r6 = 2; + mapGfxType = MAP_GFX_ENEMY; } else if (entInfo->isTeamLeader) { gPlayerDotMapPosition.x = x; gPlayerDotMapPosition.y = y; if (gDungeon->unk181e8.inFloorMapMode) { - r6 = 8; + mapGfxType = MAP_GFX_PLAYER; } } else { - r6 = 10; + mapGfxType = MAP_GFX_ALLY; } } - r10 = FALSE; + lookForMapObject = FALSE; } } } - if (r10 && !blinded) { + if (lookForMapObject && !blinded) { Entity *entity = tile->object; if (entity != NULL) { s32 entType = GetEntityType(entity); - if (!r7) { - r6 = 0; + if (!tileKnown) { + mapGfxType = MAP_GFX_NOTHING; if (entType == ENTITY_ITEM) { if ((showItems || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { - r6 = 3; + mapGfxType = MAP_GFX_ITEM; } } - r10 = FALSE; + lookForMapObject = FALSE; } else { if (entType == ENTITY_TRAP) { if (entity->isVisible || showHiddenTraps) { Trap *trap = GetTrapData(entity); - r6 = gUnknown_80F65F0[trap->id]; - r10 = FALSE; + mapGfxType = gUnknown_80F65F0[trap->id]; + lookForMapObject = FALSE; } } } - if (r10) { + if (lookForMapObject) { if (entType == ENTITY_ITEM) { if ((showItems || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) { - r6 = 3; - r10 = FALSE; + mapGfxType = MAP_GFX_ITEM; + lookForMapObject = FALSE; } } } - if (r10) { + if (lookForMapObject) { if (terrainType != TERRAIN_TYPE_NORMAL) { - r6 = 0; - r10 = FALSE; + mapGfxType = MAP_GFX_NOTHING; + lookForMapObject = FALSE; } } } else { - if (!r7) { + if (!tileKnown) { if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) { if (GetFloorType() == FLOOR_TYPE_NORMAL) { - r6 = 6; + mapGfxType = MAP_GFX_STAIRS; } else { - r6 = 5; + mapGfxType = MAP_GFX_SPECIAL_STAIRS; } - r10 = FALSE; + lookForMapObject = FALSE; } } else { if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) { if (GetFloorType() == FLOOR_TYPE_NORMAL) { - r6 = 6; + mapGfxType = MAP_GFX_STAIRS; } else { - r6 = 5; + mapGfxType = MAP_GFX_SPECIAL_STAIRS; } - r10 = FALSE; + lookForMapObject = FALSE; } } } } - if (!r10) { + if (!lookForMapObject) { if (hallucinating) { - if (r6 != 0) { - r6 = 11; + if (mapGfxType != MAP_GFX_NOTHING) { + mapGfxType = MAP_GFX_GREEN_DOT; } } } - if (r6 == 0) { - if (!r7) { - r6 = 1; + if (mapGfxType == MAP_GFX_NOTHING) { + if (!tileKnown) { + mapGfxType = 1; } else if (terrainType != TERRAIN_TYPE_NORMAL) { - r6 = 1; + mapGfxType = 1; } else { - s32 r4 = 1 | 2 | 4 | 8; + s32 terrainLine = MAP_GFX_TERRAIN_LINE_UP | MAP_GFX_TERRAIN_LINE_RIGHT | MAP_GFX_TERRAIN_LINE_DOWN | MAP_GFX_TERRAIN_LINE_LEFT; if (y < DUNGEON_MAX_SIZE_Y - 1) { const Tile *adjacentTile = GetTile(x, y + 1); if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(1); + terrainLine &= ~(MAP_GFX_TERRAIN_LINE_UP); } } if (y >= 1) { const Tile *adjacentTile = GetTile(x, y - 1); if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(4); + terrainLine &= ~(MAP_GFX_TERRAIN_LINE_DOWN); } } if (x < DUNGEON_MAX_SIZE_X - 1) { const Tile *adjacentTile = GetTile(x + 1, y); if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(2); + terrainLine &= ~(MAP_GFX_TERRAIN_LINE_RIGHT); } } if (x >= 1) { const Tile *adjacentTile = GetTile(x - 1, y); if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) { - r4 &= ~(8); + terrainLine &= ~(MAP_GFX_TERRAIN_LINE_LEFT); } } - r6 = (s16) r4; - if (tile->spawnOrVisibilityFlags & 2) { - r6 = (s16) (r6 + 16); + mapGfxType = (s16) terrainLine; + if (tile->spawnOrVisibilityFlags & VISIBILITY_FLAG_VISITED) { + mapGfxType = (s16) (mapGfxType + MAP_GFX_TERRAIN_TILES_VISITED); } else { - r6 = (s16) (r6 + 32); + mapGfxType = (s16) (mapGfxType + MAP_GFX_TERRAIN_TILES_REVEALED); } } } // Not possible on GBA. if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { - r6 = (s16) (r6 + 128); + mapGfxType = (s16) (mapGfxType + 128); } else if (DoesNotHaveShadedMap() == TRUE) { - r6 = (s16) (r6 + 64); + mapGfxType = (s16) (mapGfxType + 64); } } else { - r6 = 1; + mapGfxType = 1; gPlayerDotMapPosition.x = 100; } @@ -352,10 +374,10 @@ void sub_80402AC(s32 x, s32 y) yDiv2 = (yMinus / 2); r3 = x - (xDiv2 * 2); r3 += (yMinus - (yDiv2 * 2)) * 2; - dst = dungeon->dungeonMap.dungeonMap[yDiv2][xDiv2].arr; + dst = dungeon->dungeonMap.perTile[yDiv2][xDiv2].arr; { struct DungeonMapGfx *ptr = ((struct DungeonMapGfx *)(&sDungeonMapGfxFile->data)); - src = ptr->gfx->unk0[r6 * 4 + r3]; + src = ptr->gfx->unk0[mapGfxType * 4 + r3]; } dst[0] = (dst[0] & src[0]) | src[1]; @@ -367,39 +389,39 @@ void sub_80402AC(s32 x, s32 y) dst[6] = (dst[6] & src[12]) | src[13]; dst[7] = (dst[7] & src[14]) | src[15]; - if (!dungeon->dungeonMap.unk1BDD1 && !dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2]) { + if (!dungeon->dungeonMap.copyAllAtOnce && !dungeon->dungeonMap.tileScheduledForCopy[yDiv2][xDiv2]) { s32 id; - dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2] = TRUE; - id = dungeon->dungeonMap.unk1BDCC; - if (id < 40) { - dungeon->dungeonMap.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32); - dungeon->dungeonMap.unk1BBEC[id].ptr2 = dst; - dungeon->dungeonMap.unk1BBEC[id].boolPtr = &dungeon->dungeonMap.unk1BA2C[yDiv2][xDiv2]; - dungeon->dungeonMap.unk1BDCC++; + dungeon->dungeonMap.tileScheduledForCopy[yDiv2][xDiv2] = TRUE; + id = dungeon->dungeonMap.scheduledVramCopiesCount; + if (id < MAX_SCHEDULED_DUNGEON_MAP_COPIES) { + dungeon->dungeonMap.vramCopies[id].vramPtr = sDungeonMapVramDst + ((xDiv2 + yDiv2 * DUNGEON_MAP_MAX_X) * sizeof(struct UnkDungeonGlobal_1822C_Sub)); + dungeon->dungeonMap.vramCopies[id].mapArrayPtr = dst; + dungeon->dungeonMap.vramCopies[id].boolPtr = &dungeon->dungeonMap.tileScheduledForCopy[yDiv2][xDiv2]; + dungeon->dungeonMap.scheduledVramCopiesCount++; } else { - dungeon->dungeonMap.unk1BDD1 = 1; + dungeon->dungeonMap.copyAllAtOnce = TRUE; } } } -void sub_8040788(void) +void CopyDungeonMapToVram(void) { s32 i; Dungeon *dungeon = gDungeon; if (dungeon == NULL) return; - if (!dungeon->dungeonMap.unk1BDD0) + if (!dungeon->dungeonMap.copyToVram) return; if (sub_800EC74()) return; - if (!dungeon->dungeonMap.unk1BDD1) { - for (i = 0; i < dungeon->dungeonMap.unk1BDCC; i++) { - struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->dungeonMap.unk1BBEC[i]; - u32 *src = ptr->ptr2; - u32 *dst = ptr->ptr1; + if (!dungeon->dungeonMap.copyAllAtOnce) { + for (i = 0; i < dungeon->dungeonMap.scheduledVramCopiesCount; i++) { + struct DungeonMapVramCopy *ptr = &dungeon->dungeonMap.vramCopies[i]; + u32 *src = ptr->mapArrayPtr; + u32 *dst = ptr->vramPtr; if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { *dst++ = *src++; @@ -417,9 +439,9 @@ void sub_8040788(void) else { void *dst, *src; - dungeon->dungeonMap.unk1BDD1 = FALSE; - dst = gUnknown_202EE08; - src = dungeon->dungeonMap.dungeonMap[0][0].arr; + dungeon->dungeonMap.copyAllAtOnce = FALSE; + dst = sDungeonMapVramDst; + src = dungeon->dungeonMap.perTile[0][0].arr; for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) { if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) { @@ -428,9 +450,9 @@ void sub_8040788(void) dst += 0x100; src += 0x100; } - dungeon->dungeonMap.unk1BDD2 = 1; + dungeon->dungeonMap.resetTilesScheduledForCopy = TRUE; } - dungeon->dungeonMap.unk1BDCC = 0; + dungeon->dungeonMap.scheduledVramCopiesCount = 0; } void ShowPlayerDotOnMap(void) @@ -476,24 +498,24 @@ void ResetMapPlayerDotFrames(void) sPlayerDotFrames = 0; } -void sub_8040A84(void) +void ShowWholeRevealedDungeonMap(void) { s32 x, y; - gDungeon->dungeonMap.unk1BDD1 = TRUE; + gDungeon->dungeonMap.copyAllAtOnce = TRUE; for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { - sub_80402AC(x, y); + ShowDungeonMapAtPos(x, y); } } } -void sub_8040ABC(bool8 a0) +void UpdateBgTilemapForDungeonMap(bool8 a0) { s32 id, count1, count2; s32 i, j; - u16 val; + u16 tilemapValue; if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) { count1 = 15; @@ -508,44 +530,44 @@ void sub_8040ABC(bool8 a0) count2 = 3; } - val = 0xE0B8; + tilemapValue = TILEMAP_TILE_NUM(0xB8) | TILEMAP_PAL(14); id = 1; for (i = 0; i < count1; i++) { - u16 *ptr = &gUnknown_202B038[0][id][1]; + u16 *ptr = &gBgTilemaps[0][id][1]; for (j = 0; j < 28; j++) { - *ptr++ = val++; + *ptr++ = tilemapValue++; } id++; } for (i = 0; i < count2; i++) { - u16 *ptr = &gUnknown_202B038[0][id][1]; + u16 *ptr = &gBgTilemaps[0][id][1]; for (j = 0; j < 28; j++) { - *ptr++ = 0xE000; + *ptr++ = TILEMAP_TILE_NUM(0) | TILEMAP_PAL(14); } id++; } } -// BUG: Overflowing into unk1BBEC. They forgot that the array size is max X/Y divided by two... -void sub_8040B60(void) +// BUG: Overflowing into vramCopies. They forgot that the array size is max X/Y divided by two... +void TryResetDungeonMapTilesScheduledForCopy(void) { s32 x, y; Dungeon *dungeon = gDungeon; - if (dungeon->dungeonMap.unk1BDD2) { + if (dungeon->dungeonMap.resetTilesScheduledForCopy) { #ifdef BUGFIX - for (y = 0; y < UNK1822C_ARR_COUNT; y++) { - for (x = 0; x < UNK1822C_ARR_COUNT_2; x++) { - dungeon->dungeonMap.unk1BA2C[y][x] = FALSE; + for (y = 0; y < DUNGEON_MAP_MAX_Y; y++) { + for (x = 0; x < DUNGEON_MAP_MAX_X; x++) { + dungeon->dungeonMap.tileScheduledForCopy[y][x] = FALSE; } } #else for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { - dungeon->dungeonMap.unk1BA2C[y][x] = FALSE; + dungeon->dungeonMap.tileScheduledForCopy[y][x] = FALSE; } } #endif // BUGFIX - dungeon->dungeonMap.unk1BDD2 = FALSE; + dungeon->dungeonMap.resetTilesScheduledForCopy = FALSE; } } diff --git a/src/dungeon_map_access.c b/src/dungeon_map_access.c index 18190d39e..fd1ebe87e 100644 --- a/src/dungeon_map_access.c +++ b/src/dungeon_map_access.c @@ -37,7 +37,7 @@ EWRAM_DATA Tile gOutOfBoundsTileData = {0}; EWRAM_INIT const Tile *gCurTilesetOobTile = {NULL}; extern u8 sub_8043CE4(u32); -extern void sub_80402AC(s32, s32); +extern void ShowDungeonMapAtPos(s32, s32); extern int sprintf(char *, const char *, ...); const Tile *GetTile(s32 x, s32 y) @@ -503,7 +503,7 @@ void sub_8049ED4(void) for (j = 0; j < 23; j++) { y &= 0x1F; - gUnknown_202B038[3][y][x] = *src; + gBgTilemaps[3][y][x] = *src; src += 3; y++; r8++; @@ -618,7 +618,7 @@ void sub_804A1F0(s32 a0, s32 a1) for (i = 0; i < 23; i++) { x &= 0x1F; y &= 0x1F; - gUnknown_202B038[3][y][x] = *src; + gBgTilemaps[3][y][x] = *src; src += 3; y++; r8++; @@ -719,7 +719,7 @@ void sub_804A49C(s32 a0, s32 a1) for (i = 0; i < 31; i++) { x &= 0x1F; y &= 0x1F; - gUnknown_202B038[3][y][x] = *src; + gBgTilemaps[3][y][x] = *src; src++; x++; r9++; @@ -833,7 +833,7 @@ void sub_804A728(DungeonPos *pos, s32 a1, u8 a2, u8 a3) for (j = 0; j < 21; j++) { x &= 0x1F; y &= 0x1F; - gUnknown_202B038[2][y][x] = *src; + gBgTilemaps[2][y][x] = *src; src += 3; y++; var_34++; @@ -893,7 +893,7 @@ void sub_804AA60(void) { for(j = 0; j < 0x20; j++) { - gUnknown_202B038[2][i][j] = 0; + gBgTilemaps[2][i][j] = 0; } } sub_80098F8(2); @@ -1023,7 +1023,7 @@ void sub_804AC20(DungeonPos *pos) for (x = xMin; x <= xMax; x++) { tile = GetTileMut(x,y); tile->spawnOrVisibilityFlags |= 3; - sub_80402AC(x,y); + ShowDungeonMapAtPos(x,y); } } } diff --git a/src/dungeon_message.c b/src/dungeon_message.c index f731400f4..ce445f182 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -735,7 +735,7 @@ void sub_8052FB8(const u8 *str) { s32 i; for (i = 1; i < 30; i++) { - gUnknown_202B038[0][0][i] = 0; + gBgTilemaps[0][0][i] = 0; } } diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index 179d945a4..6f3530849 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -450,7 +450,7 @@ static void WriteDungeonVisibility(DataSerializer *seri) WriteU8(seri, gDungeon->unk181e8.priority); WriteU8(seri, gDungeon->unk181e8.visibilityRange); WriteBool8(seri, gDungeon->unk181e8.blinded); - WriteBool8(seri, gDungeon->unk181e8.unk1820B); + WriteBool8(seri, gDungeon->unk181e8.allTilesRevealed); WriteBool8(seri, gDungeon->unk181e8.unk1820C); WriteBool8(seri, gDungeon->unk181e8.unk1820D); WriteBool8(seri, gDungeon->unk181e8.showAllFloorItems); @@ -847,7 +847,7 @@ static void ReadDungeonVisibility(DataSerializer *seri) gDungeon->unk181e8.priority = ReadU8(seri); gDungeon->unk181e8.visibilityRange = ReadU8(seri); gDungeon->unk181e8.blinded = ReadBool8(seri); - gDungeon->unk181e8.unk1820B = ReadBool8(seri); + gDungeon->unk181e8.allTilesRevealed = ReadBool8(seri); gDungeon->unk181e8.unk1820C = ReadBool8(seri); gDungeon->unk181e8.unk1820D = ReadBool8(seri); gDungeon->unk181e8.showAllFloorItems = ReadBool8(seri); diff --git a/src/friend_areas_map_util.c b/src/friend_areas_map_util.c index 5d88a9508..837ce5c89 100644 --- a/src/friend_areas_map_util.c +++ b/src/friend_areas_map_util.c @@ -153,8 +153,8 @@ void FriendAreasMap_UpdateBg(void) x1 &= 0x1F; y1 &= 0x1F; - gUnknown_202B038[2][y1][x1] = gFriendAreasMapPtr->unk2014[y2][x2]; - gUnknown_202B038[3][y1][x1] = gFriendAreasMapPtr->unk14[y2][x2]; + gBgTilemaps[2][y1][x1] = gFriendAreasMapPtr->unk2014[y2][x2]; + gBgTilemaps[3][y1][x1] = gFriendAreasMapPtr->unk14[y2][x2]; x2++; x1++; } diff --git a/src/status.c b/src/status.c index f6ca6db60..b0581100c 100644 --- a/src/status.c +++ b/src/status.c @@ -140,7 +140,7 @@ extern void nullsub_84(Entity *); extern void nullsub_85(Entity *); extern void sub_803F580(u32); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_8041D9C(Entity *); extern void sub_8041DB0(Entity *pokemon); extern void sub_8041CA8(Entity *); @@ -713,7 +713,7 @@ void HandleScannerOrb(Entity* pokemon, Entity* target) SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], target, 0); TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FAEA0); // Item locations became evident sub_803F580(0); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); EntityUpdateStatusSprites(target); } } @@ -738,7 +738,7 @@ void HandleStairsOrb(Entity* pokemon, Entity* target) SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0); TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FAEC8); sub_803F580(0); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); EntityUpdateStatusSprites(target); } } @@ -758,7 +758,7 @@ void HandleRadarOrb(Entity* pokemon, Entity* target) SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0); TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FAFAC); sub_803F580(0); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); EntityUpdateStatusSprites(target); } } diff --git a/src/status_actions.c b/src/status_actions.c index c623a8a77..de33f439a 100644 --- a/src/status_actions.c +++ b/src/status_actions.c @@ -43,7 +43,7 @@ extern void sub_8068FE0(Entity *, u32, Entity *r2); extern void sub_806F370(Entity *r0, Entity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32); extern void sub_807FC3C(DungeonPos *, u32, u32); extern void sub_8042A64(DungeonPos *); -extern void sub_8040A84(void); +extern void ShowWholeRevealedDungeonMap(void); extern void sub_80498A8(s32, s32); extern void sub_8042A54(DungeonPos *); extern void sub_8049BB0(s32, s32); @@ -954,7 +954,7 @@ bool8 TrapbustOrbAction(Entity * pokemon,Entity * target, Move *move, s32 param_ } if (foundTrap) { TryDisplayDungeonLoggableMessage3(pokemon, target, *gUnknown_80FD1B0); - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); } else { @@ -1106,7 +1106,7 @@ bool8 FillInOrbAction(Entity *pokemon,Entity *target, Move *move, s32 param_4) else { TryDisplayDungeonLoggableMessage3(pokemon,target,*gUnknown_80FD0B8); } - sub_8040A84(); + ShowWholeRevealedDungeonMap(); sub_8049ED4(); return filledInTile; } diff --git a/src/text.c b/src/text.c index 8a2abacde..89ec26f3b 100644 --- a/src/text.c +++ b/src/text.c @@ -39,7 +39,7 @@ EWRAM_DATA static s32 sUnknown_202B024 = 0; EWRAM_DATA static s32 sCharHeight[2] = {0}; EWRAM_DATA static u32 sTextShadowMask = 0; // Some text color info is stored; retrieve via "& 0xF" EWRAM_DATA static u8 sDrawTextShadow = 0; -EWRAM_DATA ALIGNED(4) u16 gUnknown_202B038[4][32][32] = {0}; +EWRAM_DATA ALIGNED(4) u16 gBgTilemaps[4][32][32] = {0}; IWRAM_DATA static s16 gUnknown_3000E94[161] = {0}; @@ -190,12 +190,12 @@ void LoadCharmaps(void) sCharacterSpacing = 0; for (i = 0; i < 20; i++) { - gUnknown_202B038[0][i][0] = 0xf279; - gUnknown_202B038[1][i][0] = 0xf27a; + gBgTilemaps[0][i][0] = 0xf279; + gBgTilemaps[1][i][0] = 0xf27a; for (j = 1; j < 32; j++) { - gUnknown_202B038[0][i][j] = 0; - gUnknown_202B038[1][i][j] = 0xf27a; + gBgTilemaps[0][i][j] = 0; + gBgTilemaps[1][i][j] = 0xf27a; } } @@ -297,7 +297,7 @@ static void SaveUnkTextStructAndXXX_8006438(const Windows *a0, bool8 a1, bool8 a sUnknown_202AFC0.id[i] = a0->id[i]; if (a0->id[i].width) { - sub_8006554(gUnknown_2027370, (u32 *)VRAM, sUnknown_20274B4, &gUnknown_202B038[0][0][0], gUnknown_80B8804[i], &a0->id[i], a1, r9, a3, 0); + sub_8006554(gUnknown_2027370, (u32 *)VRAM, sUnknown_20274B4, &gBgTilemaps[0][0][0], gUnknown_80B8804[i], &a0->id[i], a1, r9, a3, 0); sub_80089AC(&a0->id[i], a3); r9 += a0->id[i].width * a0->id[i].unk10; } @@ -1471,8 +1471,8 @@ void sub_8007334(s32 a0) for (i = 0; i < textStructPtr->unk6; i++) { s32 id = textStructPtr->unk0; for (j = 0; j < textStructPtr->unk4; j++) { - gUnknown_202B038[0][r6][id] &= ~0x3ff; - gUnknown_202B038[0][r6][id] |= r5; + gBgTilemaps[0][r6][id] &= ~0x3ff; + gBgTilemaps[0][r6][id] |= r5; id++; r5++; } @@ -2278,7 +2278,7 @@ static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 co void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) { - sub_8007E64(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a5, a6); + sub_8007E64(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); } UNUSED static void nullsub_160(void) @@ -2355,7 +2355,7 @@ static u32 FlipPixelsHorizontally(u32 a0) UNUSED static void sub_8007FEC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) { - sub_8008030(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a5, a6); + sub_8008030(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a5, a6); } UNUSED static void nullsub_161(void) @@ -2459,7 +2459,7 @@ UNUSED static void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id) void DisplayMonPortraitSprite(s32 a0, const u8 *compressedData, s32 a2) { - DisplayMonPortrait(gUnknown_2027370, gUnknown_202B038[0], a0, compressedData, a2); + DisplayMonPortrait(gUnknown_2027370, gBgTilemaps[0], a0, compressedData, a2); } UNUSED static void nullsub_162(void) @@ -2550,7 +2550,7 @@ static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *comp UNUSED static void sub_8008468(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a6) { - sub_80084A4(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a6); + sub_80084A4(gUnknown_2027370, gBgTilemaps[0], a0, a1, a2, a3, a4, a6); } UNUSED static void nullsub_164(void) @@ -3083,14 +3083,14 @@ UNUSED static bool8 sub_8008DA8(void) UNUSED static void sub_8008DAC(s32 a0, s32 a1, s32 a2) { - gUnknown_202B038[0][a1][a0] = a2; + gBgTilemaps[0][a1][a0] = a2; gUnknown_20274A5 = TRUE; } void sub_8008DC8(s32 a0, s32 a1, u16 a2, s32 a3) { - gUnknown_202B038[0][a1][a0] = a2; - gUnknown_202B038[1][a1][a0] = a3; + gBgTilemaps[0][a1][a0] = a2; + gBgTilemaps[1][a1][a0] = a3; gUnknown_20274A5 = TRUE; } @@ -3106,7 +3106,7 @@ UNUSED static void sub_8008DF4(s32 a0, s32 a1, u8 *a2) if (r1 >= 97 && r1 <= 122) { r1 -= 32; } - gUnknown_202B038[0][a1][a0] = 0xF000 | (r1 + 0x258); + gBgTilemaps[0][a1][a0] = 0xF000 | (r1 + 0x258); a2++; a0++; } @@ -3128,7 +3128,7 @@ UNUSED static void sub_8008E58(s32 a0, s32 a1, u8 *a2, s32 a3) if (r1 >= 97 && r1 <= 122) { r1 -= 32; } - gUnknown_202B038[0][a1][a0] = 0xF000 | (r1 + 0x258); + gBgTilemaps[0][a1][a0] = 0xF000 | (r1 + 0x258); a2++; a0++; a3--; @@ -3432,14 +3432,14 @@ static void sub_8009388(void) { s32 i, j; - gUnknown_202B038[0][0][0] = 0xF279; - gUnknown_202B038[1][0][0] = 0xF27A; + gBgTilemaps[0][0][0] = 0xF279; + gBgTilemaps[1][0][0] = 0xF27A; for (i = sUnknown_202B020; i < sUnknown_202B024; i++) { - gUnknown_202B038[0][i][0] = 0xF279; - gUnknown_202B038[1][i][0] = 0xF27A; + gBgTilemaps[0][i][0] = 0xF279; + gBgTilemaps[1][i][0] = 0xF27A; for (j = 1; j < 32; j++) { - gUnknown_202B038[0][i][j] = 0; - gUnknown_202B038[1][i][j] = 0xF27A; + gBgTilemaps[0][i][j] = 0; + gBgTilemaps[1][i][j] = 0xF27A; } } } @@ -3448,14 +3448,14 @@ void sub_8009408(s32 from, s32 to) { s32 i, j; - gUnknown_202B038[0][0][0] = 0xF279; - gUnknown_202B038[1][0][0] = 0xF27A; + gBgTilemaps[0][0][0] = 0xF279; + gBgTilemaps[1][0][0] = 0xF27A; for (i = from; i < to; i++) { - gUnknown_202B038[0][i][0] = 0xF279; - gUnknown_202B038[1][i][0] = 0xF27A; + gBgTilemaps[0][i][0] = 0xF279; + gBgTilemaps[1][i][0] = 0xF27A; for (j = 1; j < 32; j++) { - gUnknown_202B038[0][i][j] = 0; - gUnknown_202B038[1][i][j] = 0xF27A; + gBgTilemaps[0][i][j] = 0; + gBgTilemaps[1][i][j] = 0xF27A; } } gUnknown_20274A5 = TRUE; @@ -3471,8 +3471,8 @@ UNUSED static void sub_8009488(s32 strArrId) for (i = 0; i < strPtr->unk6; i++) { id1 = strPtr->unk0; for (j = 0; j < strPtr->unk4; j++) { - gUnknown_202B038[0][id0][id1] &= 0xFC00; - gUnknown_202B038[1][id0][id1] = 0xF27A; + gBgTilemaps[0][id0][id1] &= 0xFC00; + gBgTilemaps[1][id0][id1] = 0xF27A; id1++; } id0++; @@ -3492,8 +3492,8 @@ void sub_8009524(s32 strArrId) for (i = 0; i < strPtr->unk6 + 2; i++) { s32 id1 = strPtr->unk0 - 1; for (j = 0; j < strPtr->unk4 + 2; j++) { - gUnknown_202B038[0][id0][id1] &= 0xFC00; - gUnknown_202B038[1][id0][id1] = 0xF27A; + gBgTilemaps[0][id0][id1] &= 0xFC00; + gBgTilemaps[1][id0][id1] = 0xF27A; id1++; } id0++; diff --git a/src/tile_types.c b/src/tile_types.c index ac0b9dbd4..3ee74f822 100644 --- a/src/tile_types.c +++ b/src/tile_types.c @@ -84,7 +84,7 @@ const u8 gDungeonWaterType[76] = { DUNGEON_WATER_TYPE_NONE, }; -extern void sub_80402AC(s32, s32); +extern void ShowDungeonMapAtPos(s32, s32); extern void sub_8049BB0(s32, s32); void sub_8042A14(DungeonPos *); @@ -136,7 +136,7 @@ bool8 sub_804AD34(DungeonPos *pos) { sub_80498A8(x + pos->x, y + pos->y); sub_8049BB0(x + pos->x, y + pos->y); - sub_80402AC(x + pos->x, y + pos->y); + ShowDungeonMapAtPos(x + pos->x, y + pos->y); } } } @@ -198,7 +198,7 @@ void sub_804AE84(DungeonPos *pos) for(x = -1; x < 2; x++) { sub_80498A8(x + pos->x, y + pos->y); - sub_80402AC(x + pos->x, y + pos->y); + ShowDungeonMapAtPos(x + pos->x, y + pos->y); } } diff --git a/src/trap.c b/src/trap.c index 2d5dca55f..036f18b2a 100644 --- a/src/trap.c +++ b/src/trap.c @@ -58,7 +58,7 @@ extern u32 gUnknown_8106A50; void sub_806A9B4(Entity *, u32); void sub_80461C8(DungeonPos *, u32); -void sub_80402AC(s32, s32); +void ShowDungeonMapAtPos(s32, s32); s16 sub_803D970(u32); bool8 sub_806AA0C(s32, s32); void sub_80421EC(DungeonPos *, u32); @@ -771,7 +771,7 @@ void HandlePokemonTrap(Entity *param_1,DungeonPos *pos) counter++; } } - sub_80402AC(x,y); + ShowDungeonMapAtPos(x,y); } } } diff --git a/src/world_map.c b/src/world_map.c index 50032c5a1..c47ca543a 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -367,8 +367,8 @@ static void UpdateBg(void) x1 &= 0x1F; y1 &= 0x1F; - gUnknown_202B038[2][y1][x1] = sWorldMapPtr->unk3114[y2][x2]; - gUnknown_202B038[3][y1][x1] = sWorldMapPtr->unk1114[y2][x2]; + gBgTilemaps[2][y1][x1] = sWorldMapPtr->unk3114[y2][x2]; + gBgTilemaps[3][y1][x1] = sWorldMapPtr->unk1114[y2][x2]; x2++; x1++; } From 6602a686ba58b983068f34a793c62ed95faa4b0b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 7 Mar 2025 21:43:57 +0100 Subject: [PATCH 08/18] sub_8040C4C --- asm/code_8040094.s | 164 ------------------------------------------- src/code_8040094_1.c | 70 ++++++++++++++++-- 2 files changed, 63 insertions(+), 171 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index cc02245a9..ddd3a7b21 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -6,170 +6,6 @@ .text - - thumb_func_start sub_8040C4C -sub_8040C4C: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x14 - adds r7, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - ldrh r5, [r4, 0x2] - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r5, 0 - adds r2, r6, 0 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - mov r9, r0 - ldr r6, [r7, 0x70] - ldrh r0, [r4, 0x2] - bl sub_800EC94 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - movs r0, 0x4 - ldrsh r5, [r6, r0] - ldrh r4, [r4, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0x1 - bl sub_80412E0 - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r5, 0 - bl sub_800E710 - adds r2, r0, 0 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _08040CC4 - add r0, sp, 0x8 - adds r1, r7, 0 - adds r1, 0x28 - lsls r2, 24 - lsrs r2, 24 - bl sub_800569C - b _08040CC8 -_08040CC4: - movs r0, 0 - str r0, [sp, 0x8] -_08040CC8: - mov r0, sp - mov r1, r9 - strh r1, [r0] - mov r1, sp - ldrh r0, [r6, 0x4] - strh r0, [r1, 0x2] - ldr r0, [r7, 0xC] - cmp r0, 0 - bge _08040CDC - adds r0, 0xFF -_08040CDC: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r1, sp - ldr r0, [r7, 0x10] - cmp r0, 0 - bge _08040CEA - adds r0, 0xFF -_08040CEA: - asrs r0, 8 - strh r0, [r1, 0x6] - adds r0, r6, 0 - adds r0, 0x46 - ldrb r0, [r0] - str r0, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - mov r0, sp - bl sub_8041500 - mov r0, r9 - bl sub_800EEC8 - bl sub_800EF64 - movs r0, 0x58 - bl sub_803E46C - mov r0, sp - bl sub_800EA84 - adds r4, r0, 0 - adds r1, r7, 0 - movs r2, 0x5 - bl sub_8042DD4 - ldr r0, _08040D28 - ldrb r5, [r0] - ldr r6, _08040D2C - b _08040D78 - .align 2, 0 -_08040D28: .4byte gUnknown_203B40D -_08040D2C: .4byte 0x00001010 -_08040D30: - ldr r0, _08040D58 - movs r1, 0x1 - strb r1, [r0] - ldr r1, _08040D5C - ldrh r2, [r1] - movs r3, 0 - ldrsh r0, [r1, r3] - cmp r0, r6 - beq _08040D48 - ldr r3, _08040D60 - adds r0, r2, r3 - strh r0, [r1] -_08040D48: - ldr r1, _08040D64 - ldr r0, [r1] - cmp r0, 0x4 - ble _08040D68 - subs r0, 0x4 - str r0, [r1] - b _08040D6E - .align 2, 0 -_08040D58: .4byte gUnknown_203B40D -_08040D5C: .4byte gUnknown_2026E4E -_08040D60: .4byte 0x00000101 -_08040D64: .4byte gDungeonBrightness -_08040D68: - movs r0, 0 - str r0, [r1] - mov r8, r0 -_08040D6E: - bl sub_803EA10 - movs r0, 0x26 - bl sub_803E46C -_08040D78: - adds r0, r4, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - beq _08040D8A - mov r0, r8 - cmp r0, 0 - bne _08040D30 -_08040D8A: - ldr r0, _08040D9C - strb r5, [r0] - add sp, 0x14 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08040D9C: .4byte gUnknown_203B40D - thumb_func_end sub_8040C4C - thumb_func_start sub_8040DA0 sub_8040DA0: push {r4-r7,lr} diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 5c5e9a944..d1d699971 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -28,8 +28,8 @@ extern s32 sub_800E710(s32 a0, u16 a1); extern void sub_800569C(DungeonPos *, axdata *, u8); extern void sub_800EEC8(u16 r0); extern void sub_800EF64(void); -extern s32 sub_800EA84(s32 *param_1); extern void sub_8042DD4(s32 a0, Entity *a1, s32 a2); +extern void sub_803E46C(u32); u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2); bool32 sub_804143C(Entity *entity, Move *move); @@ -56,22 +56,78 @@ bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) return r9; } -/* +struct UnkStruct_202EDE8 +{ + u16 unk0; + u16 unk2; + DungeonPos unk4; + DungeonPos unk8; + s32 unkC; + s32 unk10; +}; + +void sub_8041500(struct UnkStruct_202EDE8 *a0); +extern s32 sub_800EA84(struct UnkStruct_202EDE8 *a0); +extern bool8 sub_800E9A8(s32 a0); +extern void sub_803EA10(void); + +extern u8 gUnknown_203B40D; +extern s16 gUnknown_2026E4E; +extern s32 gDungeonBrightness; + void sub_8040C4C(Entity *entity, Move *move, bool32 a2) { - DungeonPos pos; - s32 r9 = sub_80412E0(move->id, GetApparentWeather(entity), a2); + u8 savedUnkVar; + s32 r4; + struct UnkStruct_202EDE8 sp; + u16 r9 = sub_80412E0(move->id, GetApparentWeather(entity), a2); EntityInfo *entInfo = GetEntInfo(entity); bool8 r8 = sub_800EC94(move->id); s32 apparentId = entInfo->apparentID; s32 r2 = sub_800E710(apparentId, sub_80412E0(move->id, GetApparentWeather(entity), TRUE)); if (r2 != -1) { - sub_800569C(&pos, &entity->axObj.axdata, r2); + sub_800569C(&sp.unk8, &entity->axObj.axdata, r2); } else { - pos = (DungeonPos) {0}; + sp.unk8 = (DungeonPos) {0}; } + + sp.unk0 = r9; + sp.unk2 = entInfo->apparentID; + sp.unk4.x = entity->pixelPos.x / 256; + sp.unk4.y = entity->pixelPos.y / 256; + sp.unkC = entInfo->action.direction; + sp.unk10 = 0; + sub_8041500(&sp); + sub_800EEC8(r9); + sub_800EF64(); + sub_803E46C(0x58); + r4 = sub_800EA84(&sp); + sub_8042DD4(r4, entity, 5); + savedUnkVar = gUnknown_203B40D; + while (1) { + if (!sub_800E9A8(r4)) + break; + if (!r8) + break; + + gUnknown_203B40D = 1; + if (gUnknown_2026E4E != 0x1010) { + gUnknown_2026E4E += 0x101; + } + + if (gDungeonBrightness >= 5) { + gDungeonBrightness -= 4; + } + else { + gDungeonBrightness = 0; + r8 = FALSE; + } + sub_803EA10(); + sub_803E46C(0x26); + } + gUnknown_203B40D = savedUnkVar; } -*/ + // From 1dd1df44b9375a5f064c9c01315663524c81e900 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 12:16:20 +0100 Subject: [PATCH 09/18] Match sub_8007BA8 and sub_8007D00 --- src/text.c | 476 +++++++++++------------------------------------------ 1 file changed, 96 insertions(+), 380 deletions(-) diff --git a/src/text.c b/src/text.c index 8a2abacde..b44d01a2b 100644 --- a/src/text.c +++ b/src/text.c @@ -1864,246 +1864,64 @@ UNUSED static void nullsub_158(void) { } -#ifdef NONMATCHING // https://decomp.me/scratch/AU1bH -static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color) +void sub_8007BA8(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) { - s32 iVar1; // r1 - s32 iVar3; - s32 iVar9; // r8? + u32 *dst; + s32 i; + s32 xDiv8, yDiv8; + s32 j, k; - u32 *r4; - u32 r5; - u32 r6; - UnkTextStruct1 *ip; - s32 sp4; - s32 sp8; - u32 sp1C; // Used correctly - - s32 yeah; - u32 *sp10; // r2? - - ip = &a0[a1]; - - sp8 = y / 8; - - if (sp8 >= ip->unk8) + struct UnkTextStruct1 *window = &windows[windowId]; + yDiv8 = y / 8; + if (yDiv8 >= window->unk8) return; - yeah = ip->unk4 * sp8; + dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8); + dst += y - (yDiv8 * 8); - r4 = ip->unk18 + ((yeah + x / 8) * 8); - r4 += (sp8 * -8) + y; + for (i = 0; i < color; i++) { + u32 *loopDst = dst; + xDiv8 = x / 8; - for (sp4 = 0; sp4 < color; sp4++) { - sp10 = r4; - iVar1 = x / 8; + for (j = 0; j < a4; j += 8) { + if (xDiv8 < window->unk4) { + u32 andBits = 0xF0000000; + u32 orBits = 0xE0000000; + u32 bits = 0; + u32 var = *loopDst; - for (iVar9 = 0; iVar9 < a4; iVar9 += 8) { - if (iVar1 >= ip->unk4) - break; + for (k = 0; k < 8; k++) { + if (!(var & andBits)) + bits |= orBits; - r6 = 0xF0000000; - r5 = 0xE0000000; - sp1C = 0; + andBits >>= 4; + orBits >>= 4; + } - for (iVar3 = 0; iVar3 < 8; iVar3++) { - if ((sp10[0] & r6) == 0) - sp1C |= r5; + *loopDst |= bits; + if (window->unk3C > loopDst) + window->unk3C = loopDst; + if (window->unk40 < loopDst) + window->unk40 = loopDst; - r6 >>= 4; - r5 >>= 4; + xDiv8++; + loopDst += 8; + } + else { + break; } - - sp10[0] |= sp1C; - if (ip->unk3C > sp10) - ip->unk3C = sp10; - if (ip->unk40 < sp10) - ip->unk40 = sp10; - sp10 += 8; - iVar1++; } y++; - r4++; + dst++; if ((y % 8) == 0) { - r4 += ip->unk20; - sp8++; - if (sp8 >= ip->unk8) + dst += window->unk20; + yDiv8++; + if (yDiv8 >= window->unk8) return; } - - sp4++; } } -#else -NAKED -static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color) -{ - asm_unified( - "push {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x20\n" - "\tstr r2, [sp]\n" - "\tlsls r2, r1, 3\n" - "\tadds r2, r1\n" - "\tlsls r2, 3\n" - "\tadds r0, r2\n" - "\tmov r12, r0\n" - "\tadds r0, r3, 0\n" - "\tcmp r3, 0\n" - "\tbge _08007BC8\n" - "\tadds r0, r3, 0x7\n" -"_08007BC8:\n" - "\tasrs r0, 3\n" - "\tstr r0, [sp, 0x8]\n" - "\tmov r1, r12\n" - "\tmovs r2, 0x8\n" - "\tldrsh r0, [r1, r2]\n" - "\tldr r4, [sp, 0x8]\n" - "\tcmp r4, r0\n" - "\tbge _08007CC4\n" - "\tmovs r7, 0x4\n" - "\tldrsh r0, [r1, r7]\n" - "\tadds r1, r4, 0\n" - "\tmuls r1, r0\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbge _08007BE8\n" - "\tadds r0, 0x7\n" -"_08007BE8:\n" - "\tasrs r0, 3\n" - "\tadds r0, r1, r0\n" - "\tlsls r0, 5\n" - "\tmov r2, r12\n" - "\tldr r1, [r2, 0x18]\n" - "\tadds r4, r1, r0\n" - "\tldr r7, [sp, 0x8]\n" - "\tlsls r0, r7, 3\n" - "\tsubs r0, r3, r0\n" - "\tlsls r0, 2\n" - "\tadds r4, r0\n" - "\tmovs r0, 0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r1, [sp, 0x44]\n" - "\tcmp r0, r1\n" - "\tbge _08007CC4\n" -"_08007C08:\n" - "\tadds r2, r4, 0\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbge _08007C12\n" - "\tadds r0, 0x7\n" -"_08007C12:\n" - "\tasrs r1, r0, 3\n" - "\tmovs r7, 0\n" - "\tmov r8, r7\n" - "\tadds r3, 0x1\n" - "\tstr r3, [sp, 0xC]\n" - "\tadds r4, 0x4\n" - "\tstr r4, [sp, 0x14]\n" - "\tldr r0, [sp, 0x40]\n" - "\tcmp r8, r0\n" - "\tbge _08007C94\n" -"_08007C26:\n" - "\tmov r3, r12\n" - "\tmovs r4, 0x4\n" - "\tldrsh r0, [r3, r4]\n" - "\tcmp r1, r0\n" - "\tbge _08007C94\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 24\n" - "\tmovs r5, 0xE0\n" - "\tlsls r5, 24\n" - "\tmovs r7, 0\n" - "\tstr r7, [sp, 0x1C]\n" - "\tldr r4, [r2]\n" - "\tadds r3, r4, 0\n" - "\tmov r0, r12\n" - "\tldr r0, [r0, 0x3C]\n" - "\tmov r9, r0\n" - "\tmov r7, r12\n" - "\tldr r7, [r7, 0x40]\n" - "\tmov r10, r7\n" - "\tadds r1, 0x1\n" - "\tstr r1, [sp, 0x10]\n" - "\tadds r0, r2, 0\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0x18]\n" - "\tmovs r1, 0x8\n" - "\tadd r8, r1\n" - "\tmovs r1, 0x7\n" -"_08007C5C:\n" - "\tadds r0, r4, 0\n" - "\tands r0, r6\n" - "\tcmp r0, 0\n" - "\tbne _08007C6A\n" - "\tldr r7, [sp, 0x1C]\n" - "\torrs r7, r5\n" - "\tstr r7, [sp, 0x1C]\n" -"_08007C6A:\n" - "\tlsrs r6, 4\n" - "\tlsrs r5, 4\n" - "\tsubs r1, 0x1\n" - "\tcmp r1, 0\n" - "\tbge _08007C5C\n" - "\tldr r0, [sp, 0x1C]\n" - "\torrs r3, r0\n" - "\tstr r3, [r2]\n" - "\tcmp r9, r2\n" - "\tbls _08007C82\n" - "\tmov r1, r12\n" - "\tstr r2, [r1, 0x3C]\n" -"_08007C82:\n" - "\tcmp r10, r2\n" - "\tbcs _08007C8A\n" - "\tmov r3, r12\n" - "\tstr r2, [r3, 0x40]\n" -"_08007C8A:\n" - "\tldr r1, [sp, 0x10]\n" - "\tldr r2, [sp, 0x18]\n" - "\tldr r4, [sp, 0x40]\n" - "\tcmp r8, r4\n" - "\tblt _08007C26\n" -"_08007C94:\n" - "\tldr r3, [sp, 0xC]\n" - "\tldr r4, [sp, 0x14]\n" - "\tmovs r0, 0x7\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbne _08007CB8\n" - "\tmov r7, r12\n" - "\tldr r0, [r7, 0x20]\n" - "\tlsls r0, 2\n" - "\tadds r4, r0\n" - "\tldr r0, [sp, 0x8]\n" - "\tadds r0, 0x1\n" - "\tstr r0, [sp, 0x8]\n" - "\tmovs r1, 0x8\n" - "\tldrsh r0, [r7, r1]\n" - "\tldr r2, [sp, 0x8]\n" - "\tcmp r2, r0\n" - "\tbge _08007CC4\n" -"_08007CB8:\n" - "\tldr r7, [sp, 0x4]\n" - "\tadds r7, 0x1\n" - "\tstr r7, [sp, 0x4]\n" - "\tldr r0, [sp, 0x44]\n" - "\tcmp r7, r0\n" - "\tblt _08007C08\n" -"_08007CC4:\n" - "\tadd sp, 0x20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif // NONMATCHING UNUSED static void sub_8007CD4(u32 a0, s32 a1, s32 a2, s32 a3, s32 a4) { @@ -2114,166 +1932,64 @@ UNUSED static void nullsub_159(void) { } -NAKED // Very similar to sub_8007BA8 -static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color) +// Very similar to sub_8007BA8. It clears bits instead of setting them. +void sub_8007D00(struct UnkTextStruct1 *windows, u32 windowId, s32 x, s32 y, s32 a4, s32 color) { - asm_unified( - "push {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x20\n" - "\tstr r2, [sp]\n" - "\tlsls r2, r1, 3\n" - "\tadds r2, r1\n" - "\tlsls r2, 3\n" - "\tadds r0, r2\n" - "\tmov r12, r0\n" - "\tadds r0, r3, 0\n" - "\tcmp r3, 0\n" - "\tbge _08007D20\n" - "\tadds r0, r3, 0x7\n" -"_08007D20:\n" - "\tasrs r0, 3\n" - "\tstr r0, [sp, 0x8]\n" - "\tmov r1, r12\n" - "\tmovs r2, 0x8\n" - "\tldrsh r0, [r1, r2]\n" - "\tldr r4, [sp, 0x8]\n" - "\tcmp r4, r0\n" - "\tbge _08007E0E\n" - "\tmovs r5, 0x4\n" - "\tldrsh r0, [r1, r5]\n" - "\tadds r1, r4, 0\n" - "\tmuls r1, r0\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbge _08007D40\n" - "\tadds r0, 0x7\n" -"_08007D40:\n" - "\tasrs r0, 3\n" - "\tadds r0, r1, r0\n" - "\tlsls r0, 5\n" - "\tmov r2, r12\n" - "\tldr r1, [r2, 0x18]\n" - "\tadds r4, r1, r0\n" - "\tldr r5, [sp, 0x8]\n" - "\tlsls r0, r5, 3\n" - "\tsubs r0, r3, r0\n" - "\tlsls r0, 2\n" - "\tadds r4, r0\n" - "\tmovs r0, 0\n" - "\tb _08007E06\n" -"_08007D5A:\n" - "\tadds r2, r4, 0\n" - "\tldr r0, [sp]\n" - "\tcmp r0, 0\n" - "\tbge _08007D64\n" - "\tadds r0, 0x7\n" -"_08007D64:\n" - "\tasrs r1, r0, 3\n" - "\tmovs r5, 0\n" - "\tmov r8, r5\n" - "\tadds r3, 0x1\n" - "\tstr r3, [sp, 0xC]\n" - "\tadds r4, 0x4\n" - "\tstr r4, [sp, 0x14]\n" - "\tldr r0, [sp, 0x40]\n" - "\tcmp r8, r0\n" - "\tbge _08007DE0\n" -"_08007D78:\n" - "\tmov r3, r12\n" - "\tmovs r4, 0x4\n" - "\tldrsh r0, [r3, r4]\n" - "\tcmp r1, r0\n" - "\tbge _08007DE0\n" - "\tmovs r4, 0xF0\n" - "\tlsls r4, 24\n" - "\tmovs r6, 0xE0\n" - "\tlsls r6, 24\n" - "\tmovs r7, 0\n" - "\tldr r5, [r2]\n" - "\tstr r5, [sp, 0x1C]\n" - "\tadds r3, r5, 0\n" - "\tmov r0, r12\n" - "\tldr r0, [r0, 0x3C]\n" - "\tmov r9, r0\n" - "\tmov r5, r12\n" - "\tldr r5, [r5, 0x40]\n" - "\tmov r10, r5\n" - "\tadds r1, 0x1\n" - "\tstr r1, [sp, 0x10]\n" - "\tadds r0, r2, 0\n" - "\tadds r0, 0x20\n" - "\tstr r0, [sp, 0x18]\n" - "\tmovs r1, 0x8\n" - "\tadd r8, r1\n" - "\tmovs r1, 0x7\n" -"_08007DAE:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tands r0, r4\n" - "\tcmp r0, r6\n" - "\tbne _08007DB8\n" - "\torrs r7, r4\n" -"_08007DB8:\n" - "\tlsrs r4, 4\n" - "\tlsrs r6, 4\n" - "\tsubs r1, 0x1\n" - "\tcmp r1, 0\n" - "\tbge _08007DAE\n" - "\tbics r3, r7\n" - "\tstr r3, [r2]\n" - "\tcmp r9, r2\n" - "\tbls _08007DCE\n" - "\tmov r3, r12\n" - "\tstr r2, [r3, 0x3C]\n" -"_08007DCE:\n" - "\tcmp r10, r2\n" - "\tbcs _08007DD6\n" - "\tmov r4, r12\n" - "\tstr r2, [r4, 0x40]\n" -"_08007DD6:\n" - "\tldr r1, [sp, 0x10]\n" - "\tldr r2, [sp, 0x18]\n" - "\tldr r5, [sp, 0x40]\n" - "\tcmp r8, r5\n" - "\tblt _08007D78\n" -"_08007DE0:\n" - "\tldr r3, [sp, 0xC]\n" - "\tldr r4, [sp, 0x14]\n" - "\tmovs r0, 0x7\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbne _08007E02\n" - "\tmov r1, r12\n" - "\tldr r0, [r1, 0x20]\n" - "\tlsls r0, 2\n" - "\tadds r4, r0\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r2, 0x1\n" - "\tstr r2, [sp, 0x8]\n" - "\tmovs r5, 0x8\n" - "\tldrsh r0, [r1, r5]\n" - "\tcmp r2, r0\n" - "\tbge _08007E0E\n" -"_08007E02:\n" - "\tldr r0, [sp, 0x4]\n" - "\tadds r0, 0x1\n" -"_08007E06:\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r1, [sp, 0x44]\n" - "\tcmp r0, r1\n" - "\tblt _08007D5A\n" -"_08007E0E:\n" - "\tadd sp, 0x20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); + u32 *dst; + s32 i; + s32 xDiv8, yDiv8; + s32 j, k; + + struct UnkTextStruct1 *window = &windows[windowId]; + yDiv8 = y / 8; + if (yDiv8 >= window->unk8) + return; + + dst = window->unk18 + (((yDiv8 * window->unk4) + x / 8) * 8); + dst += y - (yDiv8 * 8); + + for (i = 0; i < color; i++) { + u32 *loopDst = dst; + xDiv8 = x / 8; + + for (j = 0; j < a4; j += 8) { + if (xDiv8 < window->unk4) { + u32 andBits = 0xF0000000; + u32 equalBits = 0xE0000000; + u32 bits = 0; + u32 var = *loopDst; + + for (k = 0; k < 8; k++) { + if ((var & andBits) == equalBits) + bits |= andBits; + + andBits >>= 4; + equalBits >>= 4; + } + + *loopDst &= ~(bits); + if (window->unk3C > loopDst) + window->unk3C = loopDst; + if (window->unk40 < loopDst) + window->unk40 = loopDst; + + xDiv8++; + loopDst += 8; + } + else { + break; + } + } + + y++; + dst++; + if ((y % 8) == 0) { + dst += window->unk20; + yDiv8++; + if (yDiv8 >= window->unk8) + return; + } + } } void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6) From 601a9db41ed90e1d363cf9a443e50d202ce8dcfd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 14:17:02 +0100 Subject: [PATCH 10/18] sub_8041108 --- asm/code_8040094.s | 468 ------------------------------------------- src/code_8040094_1.c | 211 +++++++++++++++---- 2 files changed, 177 insertions(+), 502 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index ddd3a7b21..6299338d8 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -6,474 +6,6 @@ .text - thumb_func_start sub_8040DA0 -sub_8040DA0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - adds r7, r0, 0 - mov r8, r1 - bl sub_804143C - mov r9, r0 - movs r0, 0 - str r0, [sp, 0x14] - ldr r1, [r7, 0x70] - mov r10, r1 - movs r0, 0x4 - ldrsh r5, [r1, r0] - mov r1, r8 - ldrh r4, [r1, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r9 - bl sub_80412E0 - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r5, 0 - bl sub_800EA44 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x18] - mov r0, sp - adds r1, r7, 0 - mov r2, r8 - mov r3, r9 - bl sub_8041038 - mov r0, sp - movs r1, 0x1 - bl sub_800E838 - lsls r0, 24 - cmp r0, 0 - bne _08040E0E - mov r1, r8 - ldrh r0, [r1, 0x2] - cmp r0, 0x52 - bne _08040E24 -_08040E0E: - ldr r0, _08040E1C - ldr r0, [r0] - ldr r1, _08040E20 - adds r0, r1 - ldr r6, [r0] - b _08040E26 - .align 2, 0 -_08040E1C: .4byte gDungeon -_08040E20: .4byte 0x000181f8 -_08040E24: - adds r6, r7, 0 -_08040E26: - adds r0, r6, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - bne _08040E34 - adds r6, r7, 0 -_08040E34: - mov r1, sp - ldr r0, [r6, 0xC] - cmp r0, 0 - bge _08040E3E - adds r0, 0xFF -_08040E3E: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r1, sp - ldr r0, [r6, 0x10] - cmp r0, 0 - bge _08040E4C - adds r0, 0xFF -_08040E4C: - asrs r0, 8 - strh r0, [r1, 0x6] - adds r0, r6, 0 - bl sub_8042768 - lsls r0, 24 - cmp r0, 0 - bne _08040E5E - b _08041026 -_08040E5E: - adds r0, r7, 0 - mov r1, r8 - bl sub_80414C0 - lsls r0, 24 - cmp r0, 0 - beq _08040E6E - b _08041026 -_08040E6E: - mov r0, r8 - ldrh r1, [r0, 0x2] - movs r0, 0x94 - lsls r0, 1 - cmp r1, r0 - bne _08040ED0 - movs r0, 0x7 - bl DungeonRandInt - ldr r1, _08040EB8 - str r0, [r1] - ldr r1, _08040EBC - ldr r2, [r1] - ldr r1, _08040EC0 - adds r4, r2, r1 - subs r1, 0x4 - adds r2, r1 - ldr r3, _08040EC4 - lsls r1, r0, 2 - adds r1, r3 - ldr r1, [r1] - str r1, [r2] - str r1, [r4] - ldr r1, _08040EC8 - adds r0, 0x4 - str r0, [r1] - ldr r0, _08040ECC - ldr r1, [r0] - adds r0, r6, 0 - bl LogMessageByIdWithPopupCheckUser - movs r1, 0xD2 - lsls r1, 1 - adds r0, r6, 0 - bl sub_80421C0 - b _08040EF0 - .align 2, 0 -_08040EB8: .4byte gUnknown_202F224 -_08040EBC: .4byte gDungeon -_08040EC0: .4byte 0x00018204 -_08040EC4: .4byte gUnknown_8106A8C -_08040EC8: .4byte gFormatArgs -_08040ECC: .4byte gPtrMagnitudeMessage -_08040ED0: - cmp r1, 0x76 - bne _08040EF0 - ldr r0, _08040F70 - ldr r0, [r0] - ldr r1, _08040F74 - adds r2, r0, r1 - subs r1, 0x4 - adds r0, r1 - movs r1, 0xC - str r1, [r0] - str r1, [r2] - movs r1, 0xD2 - lsls r1, 1 - adds r0, r6, 0 - bl sub_80421C0 -_08040EF0: - mov r0, r10 - movs r1, 0x4 - ldrsh r5, [r0, r1] - mov r0, r8 - ldrh r4, [r0, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r9 - bl sub_80412E0 - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r5, 0 - bl sub_800E790 - adds r1, r0, 0 - ldr r0, _08040F78 - cmp r1, r0 - beq _08040F2A - lsls r0, r1, 16 - lsrs r0, 16 - bl PlaySoundEffect -_08040F2A: - ldr r1, [sp, 0x18] - cmp r1, 0x63 - bne _08040F7C - adds r0, r6, 0 - bl sub_8042768 - lsls r0, 24 - cmp r0, 0 - beq _08041026 - mov r0, r10 - adds r0, 0x46 - ldrb r4, [r0] - mov r0, sp - adds r1, r7, 0 - mov r2, r8 - mov r3, r9 - bl sub_8041108 - movs r6, 0x7 - movs r5, 0x7 -_08040F52: - subs r4, 0x1 - ands r4, r6 - adds r0, r7, 0 - movs r1, 0 - adds r2, r4, 0 - bl sub_806CDD4 - movs r0, 0x2 - movs r1, 0x15 - bl sub_803E708 - subs r5, 0x1 - cmp r5, 0 - bge _08040F52 - b _08041026 - .align 2, 0 -_08040F70: .4byte gDungeon -_08040F74: .4byte 0x00018204 -_08040F78: .4byte 0x000003e5 -_08040F7C: - ldr r0, [sp, 0x18] - cmp r0, 0x62 - bne _08040FC2 - adds r0, r6, 0 - bl sub_8042768 - lsls r0, 24 - cmp r0, 0 - beq _08041026 - mov r0, r10 - adds r0, 0x46 - ldrb r4, [r0] - mov r0, sp - adds r1, r7, 0 - mov r2, r8 - mov r3, r9 - bl sub_8041108 - movs r6, 0x7 - movs r5, 0x8 -_08040FA4: - ands r4, r6 - adds r0, r7, 0 - movs r1, 0 - adds r2, r4, 0 - bl sub_806CDD4 - movs r0, 0x2 - movs r1, 0x15 - bl sub_803E708 - adds r4, 0x1 - subs r5, 0x1 - cmp r5, 0 - bge _08040FA4 - b _08041026 -_08040FC2: - mov r0, r10 - adds r0, 0x46 - ldrb r2, [r0] - adds r0, r7, 0 - ldr r1, [sp, 0x18] - bl sub_806CDD4 - adds r0, r7, 0 - adds r0, 0x21 - movs r1, 0 - strb r1, [r0] - movs r5, 0 - adds r6, r0, 0 - b _08040FE6 -_08040FDE: - ldrb r0, [r6] - cmp r0, 0 - bne _08041022 - adds r5, 0x1 -_08040FE6: - cmp r5, 0x77 - bgt _08041022 - movs r0, 0x59 - bl sub_803E46C - ldr r4, [r7, 0x40] - ldr r1, [sp, 0x18] - cmp r1, 0x9 - bne _08040FFC - movs r0, 0x2 - orrs r4, r0 -_08040FFC: - movs r0, 0x2 - ands r0, r4 - cmp r0, 0 - beq _0804101A - ldr r0, [sp, 0x14] - cmp r0, 0 - bne _0804101A - mov r0, sp - adds r1, r7, 0 - mov r2, r8 - mov r3, r9 - bl sub_8041108 - movs r1, 0x1 - str r1, [sp, 0x14] -_0804101A: - movs r0, 0x1 - ands r4, r0 - cmp r4, 0 - beq _08040FDE -_08041022: - movs r0, 0 - strb r0, [r6] -_08041026: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8040DA0 - - thumb_func_start sub_8041038 -sub_8041038: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r0, 0 - adds r7, r1, 0 - mov r8, r2 - mov r10, r3 - ldr r0, [r7, 0x70] - mov r9, r0 - ldrh r4, [r2, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r10 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp] - bl sub_800ECB8 - movs r1, 0x2 - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _080410F4 - mov r0, r9 - movs r1, 0x4 - ldrsh r5, [r0, r1] - mov r0, r8 - ldrh r4, [r0, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - mov r2, r10 - bl sub_80412E0 - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r5, 0 - bl sub_800E710 - adds r2, r0, 0 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _080410BE - adds r0, r6, 0 - adds r0, 0x8 - adds r1, r7, 0 - adds r1, 0x28 - lsls r2, 24 - lsrs r2, 24 - bl sub_800569C - b _080410C2 -_080410BE: - movs r0, 0 - str r0, [r6, 0x8] -_080410C2: - mov r1, sp - ldrh r1, [r1] - strh r1, [r6] - mov r1, r9 - ldrh r0, [r1, 0x4] - strh r0, [r6, 0x2] - ldr r0, [r7, 0xC] - cmp r0, 0 - bge _080410D6 - adds r0, 0xFF -_080410D6: - asrs r0, 8 - strh r0, [r6, 0x4] - ldr r0, [r7, 0x10] - cmp r0, 0 - bge _080410E2 - adds r0, 0xFF -_080410E2: - asrs r0, 8 - strh r0, [r6, 0x6] - mov r0, r9 - adds r0, 0x46 - ldrb r0, [r0] - str r0, [r6, 0xC] - movs r0, 0 - str r0, [r6, 0x10] - b _080410F6 -_080410F4: - strh r0, [r6] -_080410F6: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8041038 - - thumb_func_start sub_8041108 -sub_8041108: - push {r4-r7,lr} - adds r6, r0, 0 - adds r7, r1, 0 - adds r5, r3, 0 - ldrh r4, [r2, 0x2] - adds r0, r7, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - adds r2, r5, 0 - bl sub_80412E0 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 - bl sub_800ECB8 - movs r2, 0x2 - ldrsh r1, [r0, r2] - ldrh r0, [r6] - cmp r0, 0 - beq _08041162 - cmp r1, 0 - beq _08041162 - adds r0, r6, 0 - bl sub_8041500 - adds r0, r4, 0 - bl sub_800EEF8 - bl sub_800EF64 - movs r0, 0x5A - bl sub_803E46C - adds r0, r6, 0 - bl sub_800E52C - adds r1, r7, 0 - movs r2, 0x1 - bl sub_8042DD4 -_08041162: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8041108 thumb_func_start sub_8041168 sub_8041168: diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index d1d699971..01bc18eab 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -1,27 +1,26 @@ #include "global.h" -#include "code_800558C.h" -#include "code_800C9CC.h" -#include "code_80118A4.h" #include "dungeon_message.h" +#include "dungeon_random.h" #include "structs/dungeon_entity.h" #include "structs/str_dungeon.h" -#include "dungeon_map_access.h" #include "dungeon_music.h" -#include "file_system.h" -#include "play_time.h" -#include "cpu.h" #include "dungeon.h" -#include "game_options.h" -#include "bg_palette_buffer.h" #include "code_8009804.h" #include "code_800E9E4.h" -#include "dungeon_generation.h" #include "dungeon_util.h" -#include "trap.h" -#include "text.h" #include "code_804267C.h" #include "weather.h" -#include "constants/dungeon.h" +#include "constants/move_id.h" + +struct UnkStruct_8040094 +{ + u16 unk0; + u16 unk2; + DungeonPos unk4; + DungeonPos unk8; + s32 unkC; + s32 unk10; +}; extern u8 sub_800EC94(s32 param_1); extern s32 sub_800E710(s32 a0, u16 a1); @@ -30,12 +29,34 @@ extern void sub_800EEC8(u16 r0); extern void sub_800EF64(void); extern void sub_8042DD4(s32 a0, Entity *a1, s32 a2); extern void sub_803E46C(u32); +extern u8 sub_800EA44(s32 species, u16 a2); +extern s32 sub_800E790(s32 species, u16 a2); +extern void sub_806CDD4(Entity *entity, u8, u32 direction); +void sub_8041500(struct UnkStruct_8040094 *a0); +extern s32 sub_800E52C(struct UnkStruct_8040094 *a0); +extern s32 sub_800EA84(struct UnkStruct_8040094 *a0); +extern bool8 sub_800E838(struct UnkStruct_8040094 *a0, s32 a1); +extern bool8 sub_800E9A8(s32 a0); +extern void sub_803EA10(void); +extern void sub_803E708(s32, u32); +extern void sub_800EEF8(u16 a0); + +extern u8 gUnknown_203B40D; +extern s16 gUnknown_2026E4E; +extern s32 gDungeonBrightness; +extern s32 gUnknown_202F224; + +extern const u8 *const gPtrMagnitudeMessage; +extern const s32 gUnknown_8106A8C[]; u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2); bool32 sub_804143C(Entity *entity, Move *move); bool8 sub_80414C0(Entity *entity, Move *move); -bool8 sub_804141C(u16 moveIdy, u8 weather, bool32 a2); +bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2); void sub_8040C4C(Entity *entity, Move *move, bool32 a2); +void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); +void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); +void sub_80421C0(Entity *pokemon, u16); bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) { @@ -56,30 +77,11 @@ bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) return r9; } -struct UnkStruct_202EDE8 -{ - u16 unk0; - u16 unk2; - DungeonPos unk4; - DungeonPos unk8; - s32 unkC; - s32 unk10; -}; - -void sub_8041500(struct UnkStruct_202EDE8 *a0); -extern s32 sub_800EA84(struct UnkStruct_202EDE8 *a0); -extern bool8 sub_800E9A8(s32 a0); -extern void sub_803EA10(void); - -extern u8 gUnknown_203B40D; -extern s16 gUnknown_2026E4E; -extern s32 gDungeonBrightness; - void sub_8040C4C(Entity *entity, Move *move, bool32 a2) { u8 savedUnkVar; s32 r4; - struct UnkStruct_202EDE8 sp; + struct UnkStruct_8040094 sp; u16 r9 = sub_80412E0(move->id, GetApparentWeather(entity), a2); EntityInfo *entInfo = GetEntInfo(entity); bool8 r8 = sub_800EC94(move->id); @@ -130,4 +132,145 @@ void sub_8040C4C(Entity *entity, Move *move, bool32 a2) gUnknown_203B40D = savedUnkVar; } +void sub_8040DA0(Entity *entity, Move *move) +{ + s32 i; + s32 soundEffectId; + Entity *anotherEntity; + struct UnkStruct_8040094 sp; + bool32 r9 = sub_804143C(entity, move); + bool8 var_28 = FALSE; + EntityInfo *entInfo = GetEntInfo(entity); + u8 var_24 = sub_800EA44(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), r9)); + + sub_8041038(&sp, entity, move, r9); + if (sub_800E838(&sp, 1)) { + anotherEntity = gDungeon->unk181e8.cameraTarget; + } + else if (move->id == MOVE_SILVER_WIND) { + anotherEntity = gDungeon->unk181e8.cameraTarget; + } + else { + anotherEntity = entity; + } + + if (!EntityIsValid(anotherEntity)) { + anotherEntity = entity; + } + + sp.unk4.x = anotherEntity->pixelPos.x / 256; + sp.unk4.y = anotherEntity->pixelPos.y / 256; + + if (!sub_8042768(anotherEntity)) + return; + if (sub_80414C0(entity, move)) + return; + + if (move->id == MOVE_MAGNITUDE) { + gUnknown_202F224 = DungeonRandInt(7); + gDungeon->unk181e8.unk18204 = gDungeon->unk181e8.unk18200 = gUnknown_8106A8C[gUnknown_202F224]; + gFormatArgs[0] = gUnknown_202F224 + 4; + LogMessageByIdWithPopupCheckUser(anotherEntity, gPtrMagnitudeMessage); + sub_80421C0(anotherEntity, 0x1A4); + } + else if (move->id == MOVE_EARTHQUAKE) { + gDungeon->unk181e8.unk18204 = gDungeon->unk181e8.unk18200 = 12; + sub_80421C0(anotherEntity, 0x1A4); + } + + soundEffectId = sub_800E790(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), r9)); + if (soundEffectId != 0x3E5) { + PlaySoundEffect((u16) soundEffectId); + } + + if (var_24 == 99) { + if (sub_8042768(anotherEntity)) { + s32 direction = entInfo->action.direction; + sub_8041108(&sp, entity, move, r9); + for (i = 0; i < NUM_DIRECTIONS; i++) { + direction--; + direction &= DIRECTION_MASK; + sub_806CDD4(entity, 0, direction); + sub_803E708(2, 0x15); + } + } + } + else if (var_24 == 98) { + if (sub_8042768(anotherEntity)) { + s32 direction = entInfo->action.direction; + sub_8041108(&sp, entity, move, r9); + for (i = 0; i < NUM_DIRECTIONS + 1; i++) { + direction &= DIRECTION_MASK; + sub_806CDD4(entity, 0, direction); + sub_803E708(2, 0x15); + direction++; + } + } + } + else { + sub_806CDD4(entity, var_24, entInfo->action.direction); + entity->unk21 = 0; + for (i = 0; i < 120; i++) { + u32 unk; + + sub_803E46C(0x59); + unk = entity->axObj.axdata.sub1.unk10; + if (var_24 == 9) { + unk |= 2; + } + + if ((unk & 2) && !var_28) { + sub_8041108(&sp, entity, move, r9); + var_28 = TRUE; + } + if (unk & 1) + break; + if (entity->unk21 != 0) + break; + } + entity->unk21 = 0; + } +} + +void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) +{ + EntityInfo *entInfo = GetEntInfo(entity); + u16 var_24 = sub_80412E0(move->id, GetApparentWeather(entity), a2); + + if (sub_800ECB8(var_24)->unk2 != 0) { + s32 r2 = sub_800E710(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), a2)); + + if (r2 != -1) { + sub_800569C(&a0->unk8, &entity->axObj.axdata, r2); + } + else { + a0->unk8 = (DungeonPos) {0}; + } + + a0->unk0 = var_24; + a0->unk2 = entInfo->apparentID; + a0->unk4.x = entity->pixelPos.x / 256; + a0->unk4.y = entity->pixelPos.y / 256; + a0->unkC = entInfo->action.direction; + a0->unk10 = 0; + } + else { + a0->unk0 = 0; + } +} + +void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) +{ + u16 r4 = sub_80412E0(move->id, GetApparentWeather(entity), a2); + s32 var = sub_800ECB8(r4)->unk2; + + if (a0->unk0 != 0 && var != 0) { + sub_8041500(a0); + sub_800EEF8(r4); + sub_800EF64(); + sub_803E46C(0x5A); + sub_8042DD4(sub_800E52C(a0), entity, 1); + } +} + // From f03e66dd33f30fd43a12f3aa69a8fc93b80012f1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 15:45:24 +0100 Subject: [PATCH 11/18] sub_8041500 --- asm/code_8040094.s | 499 ------------------------------------------- src/code_8040094_1.c | 210 ++++++++++++++++++ 2 files changed, 210 insertions(+), 499 deletions(-) diff --git a/asm/code_8040094.s b/asm/code_8040094.s index 6299338d8..2824379e2 100644 --- a/asm/code_8040094.s +++ b/asm/code_8040094.s @@ -7,505 +7,6 @@ - thumb_func_start sub_8041168 -sub_8041168: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - mov r8, r0 - adds r6, r1, 0 - adds r7, r2, 0 - mov r9, r3 - adds r1, r7, 0 - bl sub_804143C - adds r5, r0, 0 - cmp r5, 0 - beq _0804118A - movs r5, 0x1 -_0804118A: - ldrh r4, [r7, 0x2] - mov r0, r8 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - adds r2, r5, 0 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - mov r10, r0 - bl sub_800ECB8 - movs r1, 0x4 - ldrsh r5, [r0, r1] - movs r2, 0 - str r2, [sp, 0x14] - adds r0, r6, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080411CA - ldr r0, [r6, 0x70] - str r0, [sp, 0x14] - adds r0, r6, 0 - bl sub_8042768 - b _080411D0 -_080411CA: - mov r0, r9 - bl sub_803F428 -_080411D0: - lsls r0, 24 - cmp r0, 0 - beq _080412CE - mov r0, r8 - adds r1, r7, 0 - bl sub_80414C0 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _080412CE - cmp r5, 0 - beq _080412CE - adds r0, r5, 0 - bl sub_800ECA4 - ldr r5, [r0, 0x1C] - movs r0, 0x1 - negs r0, r0 - cmp r5, r0 - beq _08041216 - adds r0, r6, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08041216 - add r0, sp, 0x8 - adds r1, r6, 0 - adds r1, 0x28 - lsls r2, r5, 24 - lsrs r2, 24 - bl sub_800569C - b _08041218 -_08041216: - str r4, [sp, 0x8] -_08041218: - mov r0, sp - mov r1, r10 - strh r1, [r0] - ldr r2, [sp, 0x14] - cmp r2, 0 - beq _08041248 - mov r1, sp - ldrh r0, [r2, 0x4] - strh r0, [r1, 0x2] - ldr r0, [r6, 0xC] - cmp r0, 0 - bge _08041232 - adds r0, 0xFF -_08041232: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r1, sp - ldr r0, [r6, 0x10] - cmp r0, 0 - bge _08041240 - adds r0, 0xFF -_08041240: - asrs r0, 8 - strh r0, [r1, 0x6] - movs r0, 0 - b _0804128C -_08041248: - mov r1, sp - movs r0, 0x1 - strh r0, [r1, 0x2] - mov r0, r9 - movs r2, 0 - ldrsh r1, [r0, r2] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - mov r1, sp - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2 - cmp r0, 0 - bge _08041268 - adds r0, 0xFF -_08041268: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r0, r9 - movs r2, 0x2 - ldrsh r1, [r0, r2] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - mov r1, sp - movs r2, 0x80 - lsls r2, 5 - adds r0, r2 - cmp r0, 0 - bge _08041286 - adds r0, 0xFF -_08041286: - asrs r0, 8 - strh r0, [r1, 0x6] - ldr r0, [sp, 0x14] -_0804128C: - str r0, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - mov r0, sp - bl sub_8041500 - mov r0, r10 - bl sub_800EEE0 - bl sub_800EF64 - mov r0, sp - bl sub_800EBC8 - adds r4, r0, 0 - movs r0, 0x5B - bl sub_803E46C - adds r0, r4, 0 - adds r1, r6, 0 - movs r2, 0x6 - bl sub_8042DD4 - b _080412C2 -_080412BC: - movs r0, 0x28 - bl sub_803E46C -_080412C2: - adds r0, r4, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - bne _080412BC -_080412CE: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8041168 - - thumb_func_start sub_80412E0 -sub_80412E0: - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - lsls r1, 24 - lsrs r0, r1, 24 - adds r3, r4, 0 - cmp r3, 0x1F - bne _08041344 - cmp r0, 0x7 - bls _080412F6 - b _080413F6 -_080412F6: - lsls r0, 2 - ldr r1, _08041300 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08041300: .4byte _08041304 - .align 2, 0 -_08041304: - .4byte _080413F4 - .4byte _08041324 - .4byte _0804132A - .4byte _080413F4 - .4byte _08041334 - .4byte _0804133A - .4byte _080413F4 - .4byte _0804133A -_08041324: - movs r3, 0xCF - lsls r3, 1 - b _080413F6 -_0804132A: - ldr r3, _08041330 - b _080413F6 - .align 2, 0 -_08041330: .4byte 0x000001a1 -_08041334: - movs r3, 0xD0 - lsls r3, 1 - b _080413F6 -_0804133A: - ldr r3, _08041340 - b _080413F6 - .align 2, 0 -_08041340: .4byte 0x0000019f -_08041344: - cmp r2, 0 - beq _080413F6 - cmp r3, 0x97 - beq _080413B4 - cmp r3, 0x97 - bgt _0804136C - cmp r3, 0x3C - beq _0804139C - cmp r3, 0x3C - bgt _08041362 - cmp r3, 0x8 - beq _08041396 - cmp r3, 0x19 - beq _080413E4 - b _080413F4 -_08041362: - cmp r3, 0x4B - beq _080413A4 - cmp r3, 0x64 - beq _080413AA - b _080413F4 -_0804136C: - cmp r3, 0xCD - beq _080413CA - cmp r3, 0xCD - bgt _0804137E - cmp r3, 0x99 - beq _080413BA - cmp r3, 0x9C - beq _080413C4 - b _080413F4 -_0804137E: - cmp r3, 0xED - beq _080413DA - cmp r3, 0xED - bgt _0804138C - cmp r3, 0xE3 - beq _080413EA - b _080413F4 -_0804138C: - movs r0, 0xAE - lsls r0, 1 - cmp r3, r0 - beq _080413D4 - b _080413F4 -_08041396: - movs r3, 0xD1 - lsls r3, 1 - b _080413F6 -_0804139C: - ldr r3, _080413A0 - b _080413F6 - .align 2, 0 -_080413A0: .4byte 0x000001a3 -_080413A4: - movs r3, 0xD2 - lsls r3, 1 - b _080413F6 -_080413AA: - ldr r3, _080413B0 - b _080413F6 - .align 2, 0 -_080413B0: .4byte 0x000001a5 -_080413B4: - movs r3, 0xD3 - lsls r3, 1 - b _080413F6 -_080413BA: - ldr r3, _080413C0 - b _080413F6 - .align 2, 0 -_080413C0: .4byte 0x000001a7 -_080413C4: - movs r3, 0xD4 - lsls r3, 1 - b _080413F6 -_080413CA: - ldr r3, _080413D0 - b _080413F6 - .align 2, 0 -_080413D0: .4byte 0x000001a9 -_080413D4: - movs r3, 0xD5 - lsls r3, 1 - b _080413F6 -_080413DA: - ldr r3, _080413E0 - b _080413F6 - .align 2, 0 -_080413E0: .4byte 0x000001ab -_080413E4: - movs r3, 0xD6 - lsls r3, 1 - b _080413F6 -_080413EA: - ldr r3, _080413F0 - b _080413F6 - .align 2, 0 -_080413F0: .4byte 0x000001ad -_080413F4: - adds r3, r4, 0 -_080413F6: - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80412E0 - - thumb_func_start sub_8041400 -sub_8041400: - push {lr} - lsls r0, 16 - lsrs r0, 16 - lsls r1, 24 - lsrs r1, 24 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800ED20 - pop {r1} - bx r1 - thumb_func_end sub_8041400 - - thumb_func_start sub_804141C -sub_804141C: - push {lr} - lsls r0, 16 - lsrs r0, 16 - lsls r1, 24 - lsrs r1, 24 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800EC84 - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_804141C - - thumb_func_start sub_804143C -sub_804143C: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldrh r0, [r5, 0x2] - cmp r0, 0xED - bne _08041476 - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080414A4 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x1 - bne _080414A4 - ldr r1, [r4, 0x70] - adds r0, r1, 0 - adds r0, 0x5C - ldrb r0, [r0] - cmp r0, 0xE - beq _080414A0 - adds r0, r1, 0 - adds r0, 0x5D - ldrb r0, [r0] - cmp r0, 0xE - beq _080414A0 - b _0804148A -_08041476: - cmp r0, 0x19 - beq _0804147E - cmp r0, 0xE3 - bne _0804148E -_0804147E: - adds r0, r4, 0 - bl IsSleeping - lsls r0, 24 - cmp r0, 0 - beq _080414A0 -_0804148A: - movs r0, 0 - b _080414B8 -_0804148E: - cmp r0, 0x97 - bne _080414A4 - adds r0, r4, 0 - bl GetApparentWeather - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080414A4 -_080414A0: - movs r0, 0x1 - b _080414B8 -_080414A4: - adds r0, r4, 0 - adds r1, r5, 0 - bl MoveMatchesBideClassStatus - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 -_080414B8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_804143C - - thumb_func_start sub_80414C0 -sub_80414C0: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - ldrh r0, [r4, 0x2] - cmp r0, 0x9C - bne _080414DC - adds r0, r5, 0 - bl GetTileAtEntitySafe - bl IsTileGround - lsls r0, 24 - cmp r0, 0 - bne _080414F2 -_080414DC: - ldrh r0, [r4, 0x2] - cmp r0, 0x8 - bne _080414F6 - adds r0, r5, 0 - bl GetTileAtEntitySafe - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - beq _080414F6 -_080414F2: - movs r0, 0x1 - b _080414F8 -_080414F6: - movs r0, 0 -_080414F8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80414C0 - - thumb_func_start sub_8041500 -sub_8041500: - push {lr} - bl sub_800E7D0 - lsls r0, 24 - cmp r0, 0 - beq _08041518 - movs r0, 0x5C - bl sub_803E46C - movs r0, 0x5D - bl sub_8052740 -_08041518: - pop {r0} - bx r0 - thumb_func_end sub_8041500 - thumb_func_start sub_804151C sub_804151C: push {r4-r6,lr} diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 01bc18eab..891875abb 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -10,7 +10,10 @@ #include "dungeon_util.h" #include "code_804267C.h" #include "weather.h" +#include "tile_types.h" #include "constants/move_id.h" +#include "constants/weather.h" +#include "constants/type.h" struct UnkStruct_8040094 { @@ -40,6 +43,14 @@ extern bool8 sub_800E9A8(s32 a0); extern void sub_803EA10(void); extern void sub_803E708(s32, u32); extern void sub_800EEF8(u16 a0); +extern bool8 sub_803F428(DungeonPos *pos); +extern void sub_800EEE0(u16 a0); +extern s32 sub_800EBC8(struct UnkStruct_8040094 *a0); +extern bool8 sub_800E7D0(struct UnkStruct_8040094 *a0); +extern s32 sub_800ED20(u16 param_1); +extern u8 sub_800EC84(s32 param_1); +extern bool8 MoveMatchesBideClassStatus(Entity *pokemon, Move *move); +extern bool8 IsSleeping(Entity *pokemon); extern u8 gUnknown_203B40D; extern s16 gUnknown_2026E4E; @@ -273,4 +284,203 @@ void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool3 } } +void sub_8041168(Entity *entity, Entity *entity2, Move *move, DungeonPos *pos) +{ + s32 var2; + s32 var3; + struct UnkStruct_8040094 sp; + bool32 r5 = (sub_804143C(entity, move) != 0); + u16 r10 = sub_80412E0(move->id, GetApparentWeather(entity), r5); + s32 var = sub_800ECB8(r10)->unk4; + EntityInfo *ent2Info = NULL; + + if (EntityIsValid(entity2)) { + ent2Info = GetEntInfo(entity2); + if (!sub_8042768(entity2)) + return; + } + else { + if (!sub_803F428(pos)) + return; + } + + if (sub_80414C0(entity, move)) + return; + if (var == 0) + return; + + var2 = sub_800ECA4(var)->unk1c; + if (var2 != -1) { + if (EntityIsValid(entity2)) { + sub_800569C(&sp.unk8, &entity2->axObj.axdata, var2); + } + else { + sp.unk8 = (DungeonPos) {0}; + } + } + else { + sp.unk8 = (DungeonPos) {0}; + } + + sp.unk0 = r10; + if (ent2Info != NULL) { + sp.unk2 = ent2Info->apparentID; + sp.unk4.x = entity2->pixelPos.x / 256; + sp.unk4.y = entity2->pixelPos.y / 256; + sp.unkC = 0; + } + else { + s32 x, y; + + sp.unk2 = 1; + x = X_POS_TO_PIXELPOS(pos->x); + sp.unk4.x = x / 256; + y = Y_POS_TO_PIXELPOS(pos->y); + sp.unk4.y = y / 256; + sp.unkC = 0; + } + + sp.unk10 = 0; + sub_8041500(&sp); + sub_800EEE0(r10); + sub_800EF64(); + var3 = sub_800EBC8(&sp); + sub_803E46C(0x5B); + sub_8042DD4(var3, entity2, 6); + while (1) { + if (!sub_800E9A8(var3)) + break; + sub_803E46C(0x28); + } +} + +u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2) +{ + u16 ret = moveId; + + if (moveId == MOVE_WEATHER_BALL) { + switch (weather) { + case WEATHER_CLEAR: + case WEATHER_FOG: + case WEATHER_CLOUDY: + ret = moveId; + break; + case WEATHER_SUNNY: + ret = 0x19E; + break; + case WEATHER_SANDSTORM: + ret = 0x1A1; + break; + case WEATHER_RAIN: + ret = 0x1A0; + break; + case WEATHER_HAIL: + case WEATHER_SNOW: + ret = 0x19F; + break; + } + } + else if (a2) { + switch (moveId) { + case MOVE_DIG: + ret = 0x1A2; + break; + case MOVE_RAZOR_WIND: + ret = 0x1A3; + break; + case MOVE_FOCUS_PUNCH: + ret = 0x1A4; + break; + case MOVE_SKY_ATTACK: + ret = 0x1A5; + break; + case MOVE_SOLARBEAM: + ret = 0x1A6; + break; + case MOVE_FLY: + ret = 0x1A7; + break; + case MOVE_DIVE: + ret = 0x1A8; + break; + case MOVE_BOUNCE: + ret = 0x1A9; + break; + case MOVE_SKULL_BASH: + ret = 0x1AA; + break; + case MOVE_CURSE: + ret = 0x1AB; + break; + case MOVE_SNORE: + ret = 0x1AC; + break; + case MOVE_SLEEP_TALK: + ret = 0x1AD; + break; + default: + ret = moveId; + break; + } + } + + return ret; +} + +UNUSED static s32 sub_8041400(u16 moveId, u8 weather, bool32 a2) +{ + return sub_800ED20(sub_80412E0(moveId, weather, a2)); +} + +bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2) +{ + return sub_800EC84(sub_80412E0(moveId, weather, a2)); +} + +bool32 sub_804143C(Entity *entity, Move *move) +{ + if (move->id == MOVE_CURSE) { + if (EntityIsValid(entity) && GetEntityType(entity) == ENTITY_MONSTER) { + if (GetEntInfo(entity)->types[0] == TYPE_GHOST || GetEntInfo(entity)->types[1] == TYPE_GHOST) + return TRUE; + else + return FALSE; + } + } + else if (move->id == MOVE_SNORE || move->id == MOVE_SLEEP_TALK) { + if (!IsSleeping(entity)) + return TRUE; + else + return FALSE; + } + else if (move->id == MOVE_SOLARBEAM) { + if (GetApparentWeather(entity) == WEATHER_SUNNY) + return TRUE; + } + + return MoveMatchesBideClassStatus(entity, move) != FALSE; +} + +bool8 sub_80414C0(Entity *entity, Move *move) +{ + if (move->id == MOVE_DIVE) { + if (IsTileGround(GetTileAtEntitySafe(entity))) + return TRUE; + } + if (move->id == MOVE_DIG) { + if (GetTerrainType(GetTileAtEntitySafe(entity)) != TERRAIN_TYPE_NORMAL) + return TRUE; + } + + return FALSE; +} + +void sub_8041500(struct UnkStruct_8040094 *a0) +{ + if (sub_800E7D0(a0)) { + sub_803E46C(0x5C); + sub_8052740(0x5D); + } +} + // From 2c79110bad483571cae17b82ae23e97fa185dbfe Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 18:57:40 +0100 Subject: [PATCH 12/18] code_8040094 decompiled --- asm/code_8040094.s | 215 ------------------------------------------- ld_script.txt | 1 - src/code_8040094_1.c | 32 +++---- src/code_8041AD0.c | 75 ++++++++++++++- 4 files changed, 87 insertions(+), 236 deletions(-) delete mode 100644 asm/code_8040094.s diff --git a/asm/code_8040094.s b/asm/code_8040094.s deleted file mode 100644 index 2824379e2..000000000 --- a/asm/code_8040094.s +++ /dev/null @@ -1,215 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - - thumb_func_start sub_804151C -sub_804151C: - push {r4-r6,lr} - sub sp, 0x8 - adds r6, r0, 0 - adds r5, r1, 0 - lsls r4, r2, 24 - lsrs r4, 24 - adds r0, r5, 0 - bl sub_800DC9C - adds r3, r0, 0 - lsls r3, 24 - lsrs r3, 24 - movs r0, 0x2 - str r0, [sp] - movs r0, 0 - str r0, [sp, 0x4] - adds r0, r6, 0 - adds r1, r5, 0 - adds r2, r4, 0 - bl sub_8041550 - add sp, 0x8 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_804151C - - thumb_func_start sub_8041550 -sub_8041550: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x30 - adds r7, r0, 0 - mov r10, r1 - ldr r0, [sp, 0x54] - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x2C] - lsls r3, 24 - lsrs r3, 24 - mov r9, r3 - lsls r0, 24 - lsrs r6, r0, 24 - adds r0, r7, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _0804159C - ldr r0, [r7, 0x70] - mov r8, r0 - adds r0, r7, 0 - bl sub_8042768 - lsls r0, 24 - cmp r0, 0 - beq _0804159C - cmp r6, 0 - bne _080415A2 - mov r0, r8 - adds r0, 0xFF - ldrb r0, [r0] - cmp r0, 0x2 - bne _080415A2 -_0804159C: - movs r0, 0x1 - negs r0, r0 - b _08041692 -_080415A2: - ldr r1, [sp, 0x50] - cmp r1, 0 - beq _080415B4 - movs r0, 0 - cmp r1, 0x2 - bne _080415B0 - movs r0, 0x1 -_080415B0: - bl sub_804178C -_080415B4: - add r6, sp, 0x28 - adds r1, r7, 0 - adds r1, 0x28 - adds r0, r6, 0 - mov r2, r9 - bl sub_800569C - movs r2, 0 - ldrsh r0, [r6, r2] - cmp r0, 0x63 - beq _080415F2 - ldrh r0, [r6, 0x2] - cmp r0, 0x63 - beq _080415F2 - movs r1, 0 - ldrsh r0, [r6, r1] - lsls r0, 8 - ldr r1, [r7, 0xC] - adds r4, r1, r0 - movs r2, 0x2 - ldrsh r0, [r6, r2] - lsls r0, 8 - ldr r2, [r7, 0x10] - adds r0, r2, r0 - movs r1, 0xBA - lsls r1, 1 - add r1, r8 - ldr r1, [r1] - subs r5, r0, r1 - adds r1, r2, 0 - b _08041600 -_080415F2: - ldr r4, [r7, 0xC] - movs r0, 0xBA - lsls r0, 1 - add r0, r8 - ldr r1, [r7, 0x10] - ldr r0, [r0] - subs r5, r1, r0 -_08041600: - cmp r1, 0 - bge _08041606 - adds r1, 0xFF -_08041606: - asrs r1, 8 - ldr r0, _0804166C - ldr r0, [r0] - ldr r2, _08041670 - adds r0, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - subs r1, r0 - lsrs r0, r1, 31 - adds r0, r1, r0 - asrs r1, r0, 1 - adds r1, 0x1 - mov r0, r10 - str r0, [sp] - movs r3, 0 - str r3, [sp, 0x4] - movs r6, 0x1 - negs r6, r6 - str r6, [sp, 0x8] - mov r2, sp - adds r0, r4, 0 - cmp r4, 0 - bge _08041636 - adds r0, 0xFF -_08041636: - asrs r0, 8 - strh r0, [r2, 0xC] - mov r2, sp - adds r0, r5, 0 - cmp r0, 0 - bge _08041644 - adds r0, 0xFF -_08041644: - asrs r0, 8 - strh r0, [r2, 0xE] - str r6, [sp, 0x14] - mov r0, sp - strh r3, [r0, 0x10] - strh r3, [r0, 0x12] - str r1, [sp, 0x18] - add r0, sp, 0x1C - bl sub_8004E8C - mov r0, sp - movs r1, 0 - bl sub_8041764 - adds r4, r0, 0 - ldr r1, [sp, 0x2C] - cmp r1, 0 - beq _08041690 - movs r5, 0 - b _0804167C - .align 2, 0 -_0804166C: .4byte gDungeon -_08041670: .4byte 0x000181f2 -_08041674: - movs r0, 0x42 - bl sub_803E46C - adds r5, 0x1 -_0804167C: - cmp r5, 0x63 - bgt _0804168C - adds r0, r4, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - bne _08041674 -_0804168C: - movs r4, 0x1 - negs r4, r4 -_08041690: - adds r0, r4, 0 -_08041692: - add sp, 0x30 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8041550 - - .align 2,0 diff --git a/ld_script.txt b/ld_script.txt index 1b52d557e..fc7b7f925 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -202,7 +202,6 @@ SECTIONS { src/code_8040094.o(.text); src/dungeon_map.o(.text); src/code_8040094_1.o(.text); - asm/code_8040094.o(.text); src/code_8041AD0.o(.text); asm/code_8041AD0.o(.text); src/code_804267C.o(.text); diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 891875abb..9237dc6e6 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -35,7 +35,6 @@ extern void sub_803E46C(u32); extern u8 sub_800EA44(s32 species, u16 a2); extern s32 sub_800E790(s32 species, u16 a2); extern void sub_806CDD4(Entity *entity, u8, u32 direction); -void sub_8041500(struct UnkStruct_8040094 *a0); extern s32 sub_800E52C(struct UnkStruct_8040094 *a0); extern s32 sub_800EA84(struct UnkStruct_8040094 *a0); extern bool8 sub_800E838(struct UnkStruct_8040094 *a0, s32 a1); @@ -51,6 +50,7 @@ extern s32 sub_800ED20(u16 param_1); extern u8 sub_800EC84(s32 param_1); extern bool8 MoveMatchesBideClassStatus(Entity *pokemon, Move *move); extern bool8 IsSleeping(Entity *pokemon); +extern void sub_80421C0(Entity *pokemon, u16); extern u8 gUnknown_203B40D; extern s16 gUnknown_2026E4E; @@ -61,13 +61,13 @@ extern const u8 *const gPtrMagnitudeMessage; extern const s32 gUnknown_8106A8C[]; u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2); -bool32 sub_804143C(Entity *entity, Move *move); -bool8 sub_80414C0(Entity *entity, Move *move); -bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2); -void sub_8040C4C(Entity *entity, Move *move, bool32 a2); -void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); -void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); -void sub_80421C0(Entity *pokemon, u16); +static bool32 sub_804143C(Entity *entity, Move *move); +static bool8 sub_80414C0(Entity *entity, Move *move); +static bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2); +static void sub_8040C4C(Entity *entity, Move *move, bool32 a2); +static void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); +static void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2); +static void sub_8041500(struct UnkStruct_8040094 *a0); bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) { @@ -88,7 +88,7 @@ bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2) return r9; } -void sub_8040C4C(Entity *entity, Move *move, bool32 a2) +static void sub_8040C4C(Entity *entity, Move *move, bool32 a2) { u8 savedUnkVar; s32 r4; @@ -243,7 +243,7 @@ void sub_8040DA0(Entity *entity, Move *move) } } -void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) +static void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) { EntityInfo *entInfo = GetEntInfo(entity); u16 var_24 = sub_80412E0(move->id, GetApparentWeather(entity), a2); @@ -270,7 +270,7 @@ void sub_8041038(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool3 } } -void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) +static void sub_8041108(struct UnkStruct_8040094 *a0, Entity *entity, Move *move, bool32 a2) { u16 r4 = sub_80412E0(move->id, GetApparentWeather(entity), a2); s32 var = sub_800ECB8(r4)->unk2; @@ -432,12 +432,12 @@ UNUSED static s32 sub_8041400(u16 moveId, u8 weather, bool32 a2) return sub_800ED20(sub_80412E0(moveId, weather, a2)); } -bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2) +static bool8 sub_804141C(u16 moveId, u8 weather, bool32 a2) { return sub_800EC84(sub_80412E0(moveId, weather, a2)); } -bool32 sub_804143C(Entity *entity, Move *move) +static bool32 sub_804143C(Entity *entity, Move *move) { if (move->id == MOVE_CURSE) { if (EntityIsValid(entity) && GetEntityType(entity) == ENTITY_MONSTER) { @@ -461,7 +461,7 @@ bool32 sub_804143C(Entity *entity, Move *move) return MoveMatchesBideClassStatus(entity, move) != FALSE; } -bool8 sub_80414C0(Entity *entity, Move *move) +static bool8 sub_80414C0(Entity *entity, Move *move) { if (move->id == MOVE_DIVE) { if (IsTileGround(GetTileAtEntitySafe(entity))) @@ -475,12 +475,10 @@ bool8 sub_80414C0(Entity *entity, Move *move) return FALSE; } -void sub_8041500(struct UnkStruct_8040094 *a0) +static void sub_8041500(struct UnkStruct_8040094 *a0) { if (sub_800E7D0(a0)) { sub_803E46C(0x5C); sub_8052740(0x5D); } } - -// diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 6e87e719c..2d58e2131 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -32,12 +32,11 @@ extern u32 gStatusSpriteMasks_InvisibleClassStatus[]; extern u32 gStatusSpriteMasks_BlinkerClassStatus[]; extern u32 gStatusSpriteMasks_MuzzledStatus[]; - extern void sub_803ED30(u8, Entity *pokemon, u8, u8); -extern void sub_804151C(Entity *pokemon, u32 r1, u8 r2); extern u32 sub_806F62C(u32); +extern u32 sub_800DC9C(s32 a0); +extern void sub_800569C(DungeonPos *, axdata *, u8); extern void PlaySoundEffect(u32); -extern void sub_8041550(Entity *pokemon, u32, u32, u32, u32, u32); void EntityUpdateStatusSprites(Entity *entity); @@ -51,8 +50,78 @@ extern void sub_8042E98(void); extern void sub_800EE5C(u32); extern void sub_800EF64(void); +void sub_804178C(u8 param_1); u32 sub_8041764(unkStruct_80416E0 *param_1, bool8 param_2); s32 sub_80416E0(PixelPos *pos, u32 param_2, bool8 param_3); +s32 sub_8041550(Entity *entity, s32 a1, u8 a2, u8 a3, s32 a4, u8 a5); + +s32 sub_804151C(Entity *entity, s32 r1, u8 r2) +{ + u8 r3 = sub_800DC9C(r1); + return sub_8041550(entity, r1, r2, r3, 2, 0); +} + +s32 sub_8041550(Entity *entity, s32 a1, u8 a2, u8 a3, s32 a4, u8 a5) +{ + s32 i; + EntityInfo *entInfo; + DungeonPos pos; + unkStruct_80416E0 sp; + unkStruct_2039DB0 unkStruct; + PixelPos pixelPos; + s32 var; + s32 r4; + + if (!EntityIsValid(entity)) + return -1; + entInfo = GetEntInfo(entity); + if (!sub_8042768(entity)) + return -1; + if (!a5 && entInfo->unkFF == 2) + return -1; + + if (a4 != 0) { + sub_804178C(a4 == 2); + } + + sub_800569C(&pos, &entity->axObj.axdata, a3); + if (pos.x != 99 && pos.y != 99) { + pixelPos.x = entity->pixelPos.x + (pos.x << 8); + pixelPos.y = (entity->pixelPos.y + (pos.y << 8)) - entInfo->unk174.raw; + } + else { + pixelPos.x = entity->pixelPos.x; + pixelPos.y = entity->pixelPos.y - entInfo->unk174.raw; + } + + var = entity->pixelPos.y / 256; + var -= gDungeon->unk181e8.cameraPixelPos.y; + var /= 2; + var++; + + sp.unk0 = a1; + sp.unk4 = 0; + sp.dir = -1; + sp.x = pixelPos.x / 256; + sp.y = pixelPos.y / 256; + sp.unk14 = -1; + sp.unk10 = 0; + sp.unk12 = 0; + sp.unk18 = var; + + sub_8004E8C(&unkStruct); + r4 = sub_8041764(&sp, FALSE); + if (a2) { + for (i = 0; i < 100; i++) { + if (!sub_800E9A8(r4)) { + break; + } + sub_803E46C(0x42); + } + r4 = -1; + } + return r4; +} s32 sub_80416A4(DungeonPos *pos_1, u32 param_2, bool8 param_3) { From e3df01cecee973b64477cf0a974e504c1a1bbd71 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Mar 2025 19:14:00 +0100 Subject: [PATCH 13/18] Add const data and pksdir to dungeon map --- data/data_80F59C8.s | 70 -------------------------------------- data/data_80F59C8_0.s | 62 ++++++++++++++++++++++++++++++++++ ld_script.txt | 3 ++ src/code_8040094_1.c | 1 + src/dungeon_map.c | 78 ++++++++++++++++++++++++++++--------------- 5 files changed, 117 insertions(+), 97 deletions(-) create mode 100644 data/data_80F59C8_0.s diff --git a/data/data_80F59C8.s b/data/data_80F59C8.s index 3e5939f14..40e27742d 100644 --- a/data/data_80F59C8.s +++ b/data/data_80F59C8.s @@ -2,76 +2,6 @@ .section .rodata #.incbin "baserom.gba", 0xF59C4, 0x4 -.string "pksdir0\0" -.global gUnknown_80F6490 -gUnknown_80F6490: @ 80F6490 -@ replacing .incbin "baserom.gba", 0x000f6490, 0x24 -.byte 0x00, 0x00, 0x00, 0x0 -.byte 0x0f, 0x00, 0x00, 0x00 -.byte 0xff, 0x00, 0x00, 0x00 -.byte 0xff, 0x0f, 0x00, 0x00 -.byte 0xff, 0xff, 0x00, 0x00 -.byte 0xff, 0xff, 0x0f, 0x00 -.byte 0xff, 0xff, 0xff, 0x00 -.byte 0xff, 0xff, 0xff, 0x0f -.byte 0xff, 0xff, 0xff, 0xff - -.global gUnknown_80F64B4 -gUnknown_80F64B4: @ 80F64B4 -@ replacing .incbin "baserom.gba", 0x000f64b4, 0x24 -.byte 0x5a, 0x00, 0x00, 0x00 -.byte 0x50, 0x00, 0x00, 0x00 -.byte 0x46, 0x00, 0x00, 0x00 -.byte 0x3c, 0x00, 0x00, 0x00 -.byte 0x32, 0x00, 0x00, 0x00 -.byte 0x28, 0x00, 0x00, 0x00 -.byte 0x1e, 0x00, 0x00, 0x00 -.byte 0x14, 0x00, 0x00, 0x00 -.byte 0x0a, 0x00, 0x00, 0x00 - -.global gUnknown_80F64D8 -gUnknown_80F64D8: @ 80F64D8 -@ replacing .incbin "baserom.gba", 0x000f64d8, 0x24 -.byte 0x91, 0xf2, 0x90, 0xf2, 0x8f, 0xf2, 0x8e, 0xf2, 0x8d, 0xf2, 0x8c, 0xf2, 0x8b, 0xf2, 0x8a, 0xf2, 0x89, 0xf2, 0xc8, 0xf2, 0xc7, 0xf2, 0xc6, 0xf2, 0xc5, 0xf2, 0xc4, 0xf2, 0xc3, 0xf2, 0xc2, 0xf2 -.byte 0xc1, 0xf2, 0xc0, 0xf2 - -.global gUnknown_80F64FC -gUnknown_80F64FC: @ 80F64FC -@ replacing .incbin "baserom.gba", 0x000f64fc, 0x24 -.byte 0x84, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00 -.byte 0x64, 0x00, 0x00, 0x00 - -.global gUnknown_80F6520 -gUnknown_80F6520: @ 80F6520 -@ replacing .incbin "baserom.gba", 0x000f6520, 0x24 -.byte 0x5a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 -.byte 0x0a, 0x00, 0x00, 0x00 - -.global gUnknown_80F6544 -gUnknown_80F6544: @ 80F6544 -@ replacing .incbin "baserom.gba", 0x000f6544, 0x24 -.byte 0x91, 0xf2, 0x90, 0xf2, 0x8f, 0xf2, 0x8e, 0xf2, 0x8d, 0xf2, 0x8c, 0xf2, 0x8b, 0xf2, 0x8a, 0xf2, 0x89, 0xf2, 0xc8, 0xf2, 0xc7, 0xf2, 0xc6, 0xf2, 0xc5, 0xf2, 0xc4, 0xf2, 0xc3, 0xf2, 0xc2, 0xf2 -.byte 0xc1, 0xf2, 0xc0, 0xf2 - -.global gUnknown_80F6568 -gUnknown_80F6568: @ 80F6568 -@ replacing .incbin "baserom.gba", 0x000f6568, 0x88 -.byte 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff -.byte 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff -.byte 0x03, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff -.byte 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff -.byte 0x70, 0x6b, 0x73, 0x64, 0x69, 0x72, 0x30, 0x00 - -.global gUnknown_80F65F0 -gUnknown_80F65F0: @ 80F65F0 -@ replacing .incbin "baserom.gba", 0x000f65f0, 0x14 -.byte 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x04, 0x04 - -.global gUnknown_80F6604 -gUnknown_80F6604: @ 80F6604 -@ replacing .incbin "baserom.gba", 0x000f6604, 0x20 -.string "zmappat\0" -.string "pksdir0\0" .string "pksdir0\0" .string "pksdir0\0" diff --git a/data/data_80F59C8_0.s b/data/data_80F59C8_0.s new file mode 100644 index 000000000..7e47e8ff5 --- /dev/null +++ b/data/data_80F59C8_0.s @@ -0,0 +1,62 @@ +#include "constants/status.h" +.section .rodata +#.incbin "baserom.gba", 0xF59C4, 0x4 + +.string "pksdir0\0" +.global gUnknown_80F6490 +gUnknown_80F6490: @ 80F6490 +@ replacing .incbin "baserom.gba", 0x000f6490, 0x24 +.byte 0x00, 0x00, 0x00, 0x0 +.byte 0x0f, 0x00, 0x00, 0x00 +.byte 0xff, 0x00, 0x00, 0x00 +.byte 0xff, 0x0f, 0x00, 0x00 +.byte 0xff, 0xff, 0x00, 0x00 +.byte 0xff, 0xff, 0x0f, 0x00 +.byte 0xff, 0xff, 0xff, 0x00 +.byte 0xff, 0xff, 0xff, 0x0f +.byte 0xff, 0xff, 0xff, 0xff + +.global gUnknown_80F64B4 +gUnknown_80F64B4: @ 80F64B4 +@ replacing .incbin "baserom.gba", 0x000f64b4, 0x24 +.byte 0x5a, 0x00, 0x00, 0x00 +.byte 0x50, 0x00, 0x00, 0x00 +.byte 0x46, 0x00, 0x00, 0x00 +.byte 0x3c, 0x00, 0x00, 0x00 +.byte 0x32, 0x00, 0x00, 0x00 +.byte 0x28, 0x00, 0x00, 0x00 +.byte 0x1e, 0x00, 0x00, 0x00 +.byte 0x14, 0x00, 0x00, 0x00 +.byte 0x0a, 0x00, 0x00, 0x00 + +.global gUnknown_80F64D8 +gUnknown_80F64D8: @ 80F64D8 +@ replacing .incbin "baserom.gba", 0x000f64d8, 0x24 +.byte 0x91, 0xf2, 0x90, 0xf2, 0x8f, 0xf2, 0x8e, 0xf2, 0x8d, 0xf2, 0x8c, 0xf2, 0x8b, 0xf2, 0x8a, 0xf2, 0x89, 0xf2, 0xc8, 0xf2, 0xc7, 0xf2, 0xc6, 0xf2, 0xc5, 0xf2, 0xc4, 0xf2, 0xc3, 0xf2, 0xc2, 0xf2 +.byte 0xc1, 0xf2, 0xc0, 0xf2 + +.global gUnknown_80F64FC +gUnknown_80F64FC: @ 80F64FC +@ replacing .incbin "baserom.gba", 0x000f64fc, 0x24 +.byte 0x84, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00 +.byte 0x64, 0x00, 0x00, 0x00 + +.global gUnknown_80F6520 +gUnknown_80F6520: @ 80F6520 +@ replacing .incbin "baserom.gba", 0x000f6520, 0x24 +.byte 0x5a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 +.byte 0x0a, 0x00, 0x00, 0x00 + +.global gUnknown_80F6544 +gUnknown_80F6544: @ 80F6544 +@ replacing .incbin "baserom.gba", 0x000f6544, 0x24 +.byte 0x91, 0xf2, 0x90, 0xf2, 0x8f, 0xf2, 0x8e, 0xf2, 0x8d, 0xf2, 0x8c, 0xf2, 0x8b, 0xf2, 0x8a, 0xf2, 0x89, 0xf2, 0xc8, 0xf2, 0xc7, 0xf2, 0xc6, 0xf2, 0xc5, 0xf2, 0xc4, 0xf2, 0xc3, 0xf2, 0xc2, 0xf2 +.byte 0xc1, 0xf2, 0xc0, 0xf2 + +.global gUnknown_80F6568 +gUnknown_80F6568: @ 80F6568 +@ replacing .incbin "baserom.gba", 0x000f6568, 0x88 +.byte 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff +.byte 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff +.byte 0x03, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff +.byte 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff diff --git a/ld_script.txt b/ld_script.txt index fc7b7f925..0d6002b72 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -538,6 +538,9 @@ SECTIONS { src/code_803D110.o(.rodata); data/data_80F59C8_3.o(.rodata); src/code_803E724.o(.rodata); + data/data_80F59C8_0.o(.rodata); + src/dungeon_map.o(.rodata); + src/code_8040094_1.o(.rodata); data/data_80F59C8.o(.rodata); src/dungeon_message.o(.rodata); src/dungeon_move.o(.rodata); diff --git a/src/code_8040094_1.c b/src/code_8040094_1.c index 9237dc6e6..89db6cfbf 100644 --- a/src/code_8040094_1.c +++ b/src/code_8040094_1.c @@ -1,4 +1,5 @@ #include "global.h" +#include "globaldata.h" #include "dungeon_message.h" #include "dungeon_random.h" #include "structs/dungeon_entity.h" diff --git a/src/dungeon_map.c b/src/dungeon_map.c index 091063fbe..5de20775c 100644 --- a/src/dungeon_map.c +++ b/src/dungeon_map.c @@ -1,4 +1,5 @@ #include "global.h" +#include "globaldata.h" #include "dungeon_map.h" #include "structs/dungeon_entity.h" #include "structs/str_dungeon.h" @@ -16,8 +17,8 @@ #include "trap.h" #include "text.h" #include "constants/dungeon.h" +#include "constants/trap.h" -extern const char gUnknown_80F6604; // "zmappat" extern struct FileArchive gDungeonFileArchive; extern DungeonPos gPlayerDotMapPosition; extern s32 gUnknown_202EDD0; @@ -28,8 +29,6 @@ extern bool8 sub_8094C48(void); extern bool8 sub_8045804(Entity *ent); extern bool8 DoesNotHaveShadedMap(void); -extern const u8 gUnknown_80F65F0[]; - struct UnkStruct1 { u32 **unk0; @@ -41,12 +40,59 @@ struct DungeonMapGfx RGB *pal; }; +enum { + MAP_GFX_NOTHING, + MAP_GFX_UNK1, // Appears to be nothing too + MAP_GFX_ENEMY, + MAP_GFX_ITEM, + MAP_GFX_TRAP, + MAP_GFX_SPECIAL_STAIRS, + MAP_GFX_STAIRS, + MAP_GFX_WONDER_TILE, + MAP_GFX_PLAYER, + MAP_GFX_WHITE_SQUARE, // Possibly unused? It's like Stairs, but white instead of blue + MAP_GFX_ALLY, + MAP_GFX_GREEN_DOT, // Used when hallucinating +}; + +#define MAP_GFX_TERRAIN_TILES_VISITED 0x10 +#define MAP_GFX_TERRAIN_TILES_REVEALED 0x20 +#define MAP_GFX_TERRAIN_LINE_UP 0x1 +#define MAP_GFX_TERRAIN_LINE_RIGHT 0x2 +#define MAP_GFX_TERRAIN_LINE_DOWN 0x4 +#define MAP_GFX_TERRAIN_LINE_LEFT 0x8 + EWRAM_DATA bool8 gShowMonsterDotsInDungeonMap = FALSE; EWRAM_DATA bool8 gShowDungeonMap = FALSE; EWRAM_DATA static u8 sPlayerDotFrames = 0; EWRAM_DATA static OpenedFile *sDungeonMapGfxFile = NULL; EWRAM_DATA static void *sDungeonMapVramDst = NULL; +// All traps look the same on Map, except for the Wonder Tile. +static const u8 sTrapToMapGfxId[NUM_TRAPS] = +{ + [TRAP_TRIP_TRAP] = MAP_GFX_TRAP, + [TRAP_MUD_TRAP] = MAP_GFX_TRAP, + [TRAP_STICKY_TRAP] = MAP_GFX_TRAP, + [TRAP_GRIMY_TRAP] = MAP_GFX_TRAP, + [TRAP_SUMMON_TRAP] = MAP_GFX_TRAP, + [TRAP_PITFALL_TRAP] = MAP_GFX_TRAP, + [TRAP_WARP_TRAP] = MAP_GFX_TRAP, + [TRAP_WHIRLWIND_TRAP] = MAP_GFX_TRAP, + [TRAP_SPIN_TRAP] = MAP_GFX_TRAP, + [TRAP_SLUMBER_TRAP] = MAP_GFX_TRAP, + [TRAP_SLOW_TRAP] = MAP_GFX_TRAP, + [TRAP_SEAL_TRAP] = MAP_GFX_TRAP, + [TRAP_POISON_TRAP] = MAP_GFX_TRAP, + [TRAP_SELFDESTRUCT_TRAP] = MAP_GFX_TRAP, + [TRAP_EXPLOSION_TRAP] = MAP_GFX_TRAP, + [TRAP_PP_ZERO_TRAP] = MAP_GFX_TRAP, + [TRAP_CHESTNUT_TRAP] = MAP_GFX_TRAP, + [TRAP_WONDER_TILE] = MAP_GFX_WONDER_TILE, + [TRAP_POKEMON_TRAP] = MAP_GFX_TRAP, + [TRAP_SPIKE_TRAP] = MAP_GFX_TRAP, +}; + void SetDungeonMapToNotShown(void) { gShowDungeonMap = FALSE; @@ -54,7 +100,7 @@ void SetDungeonMapToNotShown(void) void OpenDungeonMapFile(void) { - sDungeonMapGfxFile = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive); + sDungeonMapGfxFile = OpenFileAndGetFileDataPtr("zmappat", &gDungeonFileArchive); } void InitDungeonMap(bool8 a0) @@ -117,28 +163,6 @@ void LoadDungeonMapPalette(void) } } -enum { - MAP_GFX_NOTHING, - MAP_GFX_UNK1, // Appears to be nothing too - MAP_GFX_ENEMY, - MAP_GFX_ITEM, - MAP_GFX_TRAP, - MAP_GFX_SPECIAL_STAIRS, - MAP_GFX_STAIRS, - MAP_GFX_WONDER_TILE, - MAP_GFX_PLAYER, - MAP_GFX_WHITE_SQUARE, // Possibly unused? It's like Stairs, but white instead of blue - MAP_GFX_ALLY, - MAP_GFX_GREEN_DOT, // Used when hallucinating -}; - -#define MAP_GFX_TERRAIN_TILES_VISITED 0x10 -#define MAP_GFX_TERRAIN_TILES_REVEALED 0x20 -#define MAP_GFX_TERRAIN_LINE_UP 0x1 -#define MAP_GFX_TERRAIN_LINE_RIGHT 0x2 -#define MAP_GFX_TERRAIN_LINE_DOWN 0x4 -#define MAP_GFX_TERRAIN_LINE_LEFT 0x8 - void ShowDungeonMapAtPos(s32 x, s32 y) { s32 yAdd = 0; @@ -259,7 +283,7 @@ void ShowDungeonMapAtPos(s32 x, s32 y) if (entType == ENTITY_TRAP) { if (entity->isVisible || showHiddenTraps) { Trap *trap = GetTrapData(entity); - mapGfxType = gUnknown_80F65F0[trap->id]; + mapGfxType = sTrapToMapGfxId[trap->id]; lookForMapObject = FALSE; } } From 18765f850e0b460a3be9ca1dc76aa7793ed78885 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Mar 2025 14:12:59 +0100 Subject: [PATCH 14/18] sub_804225C --- asm/code_8041AD0.s | 162 --------------------------------------------- ld_script.txt | 1 - src/code_8041AD0.c | 54 +++++++++++++++ 3 files changed, 54 insertions(+), 163 deletions(-) delete mode 100644 asm/code_8041AD0.s diff --git a/asm/code_8041AD0.s b/asm/code_8041AD0.s deleted file mode 100644 index d45d8b6bd..000000000 --- a/asm/code_8041AD0.s +++ /dev/null @@ -1,162 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_804225C -sub_804225C: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - mov r8, r0 - adds r5, r1, 0 - lsls r2, 24 - lsrs r4, r2, 24 - adds r7, r4, 0 - cmp r4, 0x11 - bne _08042274 - b _08042384 -_08042274: - adds r0, r5, 0 - bl sub_803F428 - lsls r0, 24 - cmp r0, 0 - bne _08042282 - b _08042384 -_08042282: - adds r0, r4, 0 - bl sub_800EF28 - bl sub_800EF64 - movs r0, 0x4 - movs r1, 0x42 - bl sub_803E708 - movs r0, 0 - ldrsh r1, [r5, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r1, 0xC0 - lsls r1, 4 - adds r0, r1 - cmp r0, 0 - bge _080422AA - adds r0, 0xFF -_080422AA: - lsls r0, 8 - lsrs r0, 16 - ldr r1, _080422FC - ldr r2, [sp] - ands r2, r1 - orrs r2, r0 - str r2, [sp] - movs r0, 0x2 - ldrsh r1, [r5, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r1, 0x80 - lsls r1, 5 - adds r0, r1 - cmp r0, 0 - bge _080422CE - adds r0, 0xFF -_080422CE: - lsls r0, 8 - lsrs r0, 16 - lsls r0, 16 - ldr r1, _08042300 - ands r2, r1 - orrs r2, r0 - str r2, [sp] - adds r0, r4, 0 - mov r1, sp - bl sub_800E448 - adds r6, r0, 0 - cmp r4, 0x4 - bne _08042308 - ldr r1, _08042304 - movs r0, 0 - bl sub_80421C0 - movs r0, 0x28 - movs r1, 0x33 - bl sub_803E708 - b _08042360 - .align 2, 0 -_080422FC: .4byte 0xffff0000 -_08042300: .4byte 0x0000ffff -_08042304: .4byte 0x00000193 -_08042308: - cmp r7, 0x8 - bne _08042358 - mov r0, r8 - ldr r7, [r0, 0x70] - adds r0, r7, 0 - adds r0, 0x46 - ldrb r4, [r0] - movs r5, 0 - b _0804231C -_0804231A: - adds r5, 0x2 -_0804231C: - ldr r0, _08042354 - cmp r5, r0 - bgt _08042346 - subs r4, 0x1 - movs r0, 0x7 - ands r4, r0 - mov r0, r8 - movs r1, 0 - adds r2, r4, 0 - bl sub_806CDD4 - movs r0, 0x2 - movs r1, 0x33 - bl sub_803E708 - adds r0, r6, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - bne _0804231A -_08042346: - movs r0, 0x7 - ands r4, r0 - adds r0, r7, 0 - adds r0, 0x46 - strb r4, [r0] - b _08042360 - .align 2, 0 -_08042354: .4byte 0x000003e7 -_08042358: - movs r0, 0x28 - movs r1, 0x33 - bl sub_803E708 -_08042360: - movs r5, 0 - ldr r4, _08042368 - b _0804236E - .align 2, 0 -_08042368: .4byte 0x000003e7 -_0804236C: - adds r5, 0x1 -_0804236E: - cmp r5, r4 - bgt _08042384 - movs r0, 0x42 - bl sub_803E46C - adds r0, r6, 0 - bl sub_800E9A8 - lsls r0, 24 - cmp r0, 0 - bne _0804236C -_08042384: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_804225C - - .align 2,0 diff --git a/ld_script.txt b/ld_script.txt index 3508fe4a8..f9301c179 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -202,7 +202,6 @@ SECTIONS { src/code_8040094.o(.text); asm/code_8040094.o(.text); src/code_8041AD0.o(.text); - asm/code_8041AD0.o(.text); src/code_804267C.o(.text); src/code_8042B34.o(.text); src/dungeon_engine.o(.text); diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 6e87e719c..26dd961cc 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -893,3 +893,57 @@ void sub_8042238(Entity *pokemon, Entity *target) else PlaySoundEffect(0x156); } + +extern void sub_800EF28(u8); +extern void sub_803E708(u32, u32); +extern u32 sub_800E448(u8, DungeonPos *); + +void sub_804225C(Entity *entity, DungeonPos *pos, u8 trapId) +{ + s32 uVar6; + DungeonPos newPos; + s32 i, x, y; + + if (trapId == TRAP_WONDER_TILE) + return; + if (!sub_803F428(pos)) + return; + + sub_800EF28(trapId); + sub_800EF64(); + sub_803E708(4,0x42); + + x = X_POS_TO_PIXELPOS(pos->x); + newPos.x = x / 256; + + y = Y_POS_TO_PIXELPOS(pos->y); + newPos.y = y / 256; + + uVar6 = sub_800E448(trapId,&newPos); + if (trapId == TRAP_SUMMON_TRAP) { + sub_80421C0(0,0x193); + sub_803E708(0x28,0x33); + } + else if (trapId == TRAP_SPIN_TRAP) { + EntityInfo *info = GetEntInfo(entity); + s32 direction = info->action.direction; + for (i = 0; i < 1000; i += 2) { + direction--; + direction &= DIRECTION_MASK; + sub_806CDD4(entity,0,direction); + sub_803E708(2,0x33); + if (!sub_800E9A8(uVar6)) + break; + } + info->action.direction = direction & DIRECTION_MASK; + } + else { + sub_803E708(0x28,0x33); + } + + for (i = 0; i < 1000; i++) { + sub_803E46C(0x42); + if (!sub_800E9A8(uVar6)) + break; + } +} From b0c055b7fa39ec479b29ec145a0ae6689a30e339 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Mar 2025 15:12:05 +0100 Subject: [PATCH 15/18] sub_803E250 --- asm/code_803D110.s | 254 ---------------------------------- include/structs/str_202ED28.h | 5 +- include/structs/str_202EDE8.h | 18 +++ ld_script.txt | 1 - src/code_803D110.c | 89 +++++++++++- src/code_803E724.c | 13 +- src/code_8069E0C.c | 4 +- src/code_808333C.c | 4 +- 8 files changed, 114 insertions(+), 274 deletions(-) delete mode 100644 asm/code_803D110.s create mode 100644 include/structs/str_202EDE8.h diff --git a/asm/code_803D110.s b/asm/code_803D110.s deleted file mode 100644 index c89b8b4ae..000000000 --- a/asm/code_803D110.s +++ /dev/null @@ -1,254 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - thumb_func_start sub_803E250 -sub_803E250: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - ldr r1, _0803E3FC - ldr r0, _0803E400 - str r0, [r1] - ldr r0, _0803E404 - movs r1, 0 - str r1, [r0] - ldr r0, _0803E408 - strb r1, [r0] - ldr r0, _0803E40C - strh r1, [r0] - ldr r5, _0803E410 - ldrh r0, [r5, 0x6] - movs r3, 0xF - adds r2, r3, 0 - ands r2, r0 - ldrh r4, [r5] - ldr r1, _0803E414 - adds r0, r1, 0 - ands r0, r4 - ldr r4, _0803E418 - ands r0, r4 - ldr r6, _0803E41C - ands r0, r6 - ldr r7, _0803E420 - ands r0, r7 - ldr r4, _0803E424 - mov r12, r4 - ands r0, r4 - ldr r4, _0803E428 - ands r0, r4 - strh r0, [r5] - movs r0, 0x80 - lsls r0, 7 - strh r0, [r5, 0x2] - movs r0, 0 - strh r0, [r5, 0x4] - ldr r0, _0803E42C - mov r10, r0 - ands r2, r0 - subs r0, 0x1 - mov r9, r0 - ands r2, r0 - subs r0, 0x2 - mov r8, r0 - ands r2, r0 - strh r2, [r5, 0x6] - ldr r2, _0803E430 - ldrh r0, [r2, 0x6] - ands r3, r0 - ldrh r0, [r2] - ands r1, r0 - ldr r0, _0803E418 - ands r1, r0 - ands r1, r6 - ands r1, r7 - mov r7, r12 - ands r1, r7 - ands r1, r4 - strh r1, [r2] - movs r0, 0 - strh r0, [r2, 0x2] - movs r0, 0xB8 - lsls r0, 7 - strh r0, [r2, 0x4] - mov r0, r10 - ands r3, r0 - mov r1, r9 - ands r3, r1 - mov r7, r8 - ands r3, r7 - strh r3, [r2, 0x6] - movs r0, 0 - mov r8, r0 -_0803E2EE: - movs r1, 0 - mov r9, r1 - mov r2, r8 - lsls r0, r2, 3 - lsls r2, 1 - mov r12, r2 - mov r3, r8 - adds r3, 0x1 - str r3, [sp] - mov r10, r1 - add r0, r8 - lsls r5, r0, 3 - ldr r4, _0803E434 - adds r4, r5, r4 - str r4, [sp, 0x4] - ldr r7, _0803E438 - adds r6, r5, r7 - ldr r0, _0803E43C - adds r3, r5, r0 - ldr r1, _0803E440 - adds r4, r5, r1 -_0803E318: - mov r7, r10 - adds r2, r5, r7 - ldrh r1, [r3] - ldr r0, _0803E414 - ands r0, r1 - ldr r1, _0803E418 - ands r0, r1 - ldr r1, _0803E41C - ands r0, r1 - ldr r1, _0803E420 - ands r0, r1 - ldr r1, _0803E424 - ands r0, r1 - strh r0, [r3] - ldr r1, [r4] - movs r7, 0x3 - ands r1, r7 - lsls r1, 14 - ldr r7, _0803E428 - ands r0, r7 - orrs r0, r1 - strh r0, [r3] - ldrh r1, [r3, 0x2] - ldr r0, _0803E444 - ands r0, r1 - strh r0, [r3, 0x2] - ldr r1, _0803E440 - adds r1, 0x4 - adds r2, r1 - ldr r1, [r2] - movs r2, 0x3 - ands r1, r2 - lsls r1, 14 - ands r0, r7 - orrs r0, r1 - strh r0, [r3, 0x2] - ldr r1, [r6] - ldr r0, _0803E448 - ands r1, r0 - ldrh r2, [r3, 0x4] - movs r0, 0xFC - lsls r0, 8 - ands r0, r2 - orrs r0, r1 - ldr r7, _0803E41C - ands r0, r7 - movs r1, 0xC0 - lsls r1, 4 - orrs r0, r1 - movs r2, 0 - orrs r0, r2 - ldr r1, _0803E44C - ands r0, r1 - strh r0, [r3, 0x4] - ldrh r1, [r3, 0x6] - ldr r0, _0803E42C - ands r0, r1 - ldr r1, _0803E450 - ands r0, r1 - strh r0, [r3, 0x6] - mov r7, r9 - lsls r1, r7, 2 - mov r0, r12 - add r0, r8 - lsls r0, 3 - adds r1, r0 - ldr r0, _0803E454 - adds r1, r0, r1 - ldr r0, [r1] - ldr r1, [sp, 0x4] - str r0, [r1] - adds r1, 0xC - str r1, [sp, 0x4] - adds r6, 0xC - adds r3, 0xC - adds r4, 0xC - movs r2, 0xC - add r10, r2 - movs r7, 0x1 - add r9, r7 - mov r0, r9 - cmp r0, 0x5 - ble _0803E318 - ldr r1, [sp] - mov r8, r1 - cmp r1, 0x1 - ble _0803E2EE - movs r2, 0 - ldr r3, _0803E458 - ldr r0, [r3] - ldr r4, _0803E45C - adds r0, r4 - movs r1, 0x1 - strb r1, [r0] - ldr r0, [r3] - ldr r7, _0803E460 - adds r0, r7 - strb r1, [r0] - ldr r0, _0803E464 - str r2, [r0] - movs r0, 0xF8 - ldr r1, _0803E468 - movs r3, 0 - bl SetBGPaletteBufferColorRGB - 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 -_0803E3FC: .4byte gUnknown_202EDD0 -_0803E400: .4byte 0x000003e7 -_0803E404: .4byte gUnknown_202EDD4 -_0803E408: .4byte gUnknown_203B40D -_0803E40C: .4byte gUnknown_202EDE8 -_0803E410: .4byte gUnknown_202EDC0 -_0803E414: .4byte 0x0000feff -_0803E418: .4byte 0x0000fdff -_0803E41C: .4byte 0x0000f3ff -_0803E420: .4byte 0x0000efff -_0803E424: .4byte 0x0000dfff -_0803E428: .4byte 0x00003fff -_0803E42C: .4byte 0x0000fffe -_0803E430: .4byte gUnknown_202EDB8 -_0803E434: .4byte gUnknown_202ED30 -_0803E438: .4byte gUnknown_80F6224 -_0803E43C: .4byte gUnknown_202ED28 -_0803E440: .4byte gUnknown_80F621C -_0803E444: .4byte 0x0000c1ff -_0803E448: .4byte 0x000003ff -_0803E44C: .4byte 0x00000fff -_0803E450: .4byte 0x0000fffd -_0803E454: .4byte gUnknown_80F61EC -_0803E458: .4byte gDungeon -_0803E45C: .4byte 0x00018217 -_0803E460: .4byte 0x00018218 -_0803E464: .4byte gDungeonBrightness -_0803E468: .4byte gFontPalette + 0x20 - thumb_func_end sub_803E250 diff --git a/include/structs/str_202ED28.h b/include/structs/str_202ED28.h index 9ad561024..889f837a5 100644 --- a/include/structs/str_202ED28.h +++ b/include/structs/str_202ED28.h @@ -1,11 +1,12 @@ #ifndef GUARD_STR_202ED28_H #define GUARD_STR_202ED28_H +#include "structs/str_position.h" + struct unkStruct_202ED28 { SpriteOAM sprite; - s16 x; - s16 y; + DungeonPos pos; }; extern struct unkStruct_202ED28 gUnknown_202ED28[][6]; diff --git a/include/structs/str_202EDE8.h b/include/structs/str_202EDE8.h new file mode 100644 index 000000000..c13ade944 --- /dev/null +++ b/include/structs/str_202EDE8.h @@ -0,0 +1,18 @@ +#ifndef GUARD_STR_202EDE8_H +#define GUARD_STR_202EDE8_H + +#include "structs/dungeon_entity.h" + +struct UnkStruct_202EDE8 +{ + s16 unk0; + s16 unk2; + Entity *unk4; + s32 unk8; + s32 unkC; + s32 unk10; +}; + +extern struct UnkStruct_202EDE8 gUnknown_202EDE8; + +#endif diff --git a/ld_script.txt b/ld_script.txt index 3508fe4a8..a34b84c8e 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -196,7 +196,6 @@ SECTIONS { src/personality_test2.o(.text); src/code_803D0D8.o(.text); src/code_803D110.o(.text); - asm/code_803D110.o(.text); src/code_803E46C.o(.text); src/code_803E724.o(.text); src/code_8040094.o(.text); diff --git a/src/code_803D110.c b/src/code_803D110.c index 6f40c9e93..859604bc2 100644 --- a/src/code_803D110.c +++ b/src/code_803D110.c @@ -12,6 +12,8 @@ #include "game_options.h" #include "text.h" #include "constants/dungeon.h" +#include "structs/str_202ED28.h" +#include "structs/str_202EDE8.h" extern void sub_803E13C(void); extern void sub_80901D8(DungeonLocation *param_1,DungeonLocation *param_2); @@ -662,5 +664,90 @@ void sub_803E214(void) void nullsub_56(void) {} -// sub_803E250 left, but it seems to be sprite related, and I'd rather not deal with it now lol +extern u8 gUnknown_203B40D; +extern u32 gUnknown_202EDD0; +extern s32 gUnknown_202EDD4; +extern s32 gDungeonBrightness; +extern SpriteOAM gUnknown_202EDC0; +extern SpriteOAM gUnknown_202EDB8; + +extern const DungeonPos gUnknown_80F61EC[2][6]; + +struct Unk80F6224Struct +{ + s32 unk0; + s32 unk4; + s32 unk8; +}; + +extern const struct Unk80F6224Struct gUnknown_80F621C[2][6]; + +void sub_803E250(void) +{ + s32 i, j; + + gUnknown_202EDD0 = 999; + gUnknown_202EDD4 = 0; + gUnknown_203B40D = 0; + gUnknown_202EDE8.unk0 = 0; + + SpriteSetY(&gUnknown_202EDC0, 0); + SpriteSetAffine1(&gUnknown_202EDC0, 0); + SpriteSetAffine2(&gUnknown_202EDC0, 0); + SpriteSetObjMode(&gUnknown_202EDC0, 0); + SpriteSetMosaic(&gUnknown_202EDC0, 0); + SpriteSetBpp(&gUnknown_202EDC0, 0); + SpriteSetShape(&gUnknown_202EDC0, 0); + SpriteSetMatrixNum(&gUnknown_202EDC0, 0); + SpriteSetSize(&gUnknown_202EDC0, 1); + SpriteSetX(&gUnknown_202EDC0, 0); + SpriteSetTileNum(&gUnknown_202EDC0, 0); + SpriteSetPriority(&gUnknown_202EDC0, 0); + SpriteSetPalNum(&gUnknown_202EDC0, 0); + SpriteSetUnk6_0(&gUnknown_202EDC0, 0); + SpriteSetUnk6_1(&gUnknown_202EDC0, 0); + SpriteSetUnk6_2(&gUnknown_202EDC0, 0); + + SpriteSetY(&gUnknown_202EDB8, 0); + SpriteSetAffine1(&gUnknown_202EDB8, 0); + SpriteSetAffine2(&gUnknown_202EDB8, 0); + SpriteSetObjMode(&gUnknown_202EDB8, 0); + SpriteSetMosaic(&gUnknown_202EDB8, 0); + SpriteSetBpp(&gUnknown_202EDB8, 0); + SpriteSetShape(&gUnknown_202EDB8, 0); + SpriteSetMatrixNum(&gUnknown_202EDB8, 0); + SpriteSetSize(&gUnknown_202EDB8, 0); + SpriteSetX(&gUnknown_202EDB8, 0); + SpriteSetTileNum(&gUnknown_202EDB8, 0); + SpriteSetPriority(&gUnknown_202EDB8, 3); + SpriteSetPalNum(&gUnknown_202EDB8, 5); + SpriteSetUnk6_0(&gUnknown_202EDB8, 0); + SpriteSetUnk6_1(&gUnknown_202EDB8, 0); + SpriteSetUnk6_2(&gUnknown_202EDB8, 0); + + for (i = 0; i < 2; i++) { + for (j = 0; j < 6; j++) { + SpriteSetAffine1(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetAffine2(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetObjMode(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetMosaic(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetBpp(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetShape(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk0); + SpriteSetMatrixNum(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetSize(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk4); + SpriteSetTileNum(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk8); + SpriteSetPriority(&gUnknown_202ED28[i][j].sprite, 3); + SpriteSetPalNum(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetUnk6_0(&gUnknown_202ED28[i][j].sprite, 0); + SpriteSetUnk6_1(&gUnknown_202ED28[i][j].sprite, 0); + + gUnknown_202ED28[i][j].pos = gUnknown_80F61EC[i][j]; + } + } + + gDungeon->unk181e8.unk18217 = 1; + gDungeon->unk181e8.unk18218 = 1; + gDungeonBrightness = 0; + SetBGPaletteBufferColorRGB(0xf8, &gFontPalette[8],0,NULL); +} diff --git a/src/code_803E724.c b/src/code_803E724.c index 85dcfaddc..eda267cbf 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -23,6 +23,7 @@ #include "constants/item.h" #include "constants/status.h" #include "code_803E724.h" +#include "structs/str_202EDE8.h" extern s32 gDungeonBrightness; extern u32 gUnknown_202EDD0; @@ -372,18 +373,6 @@ void sub_803ECE0(void) sub_80098BC((void *)VRAM + 0x14400, gUnknown_202EC94->unk4 + ((gUnknown_202EDD8 / 4) * 0x240), 0x240); } -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; diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index d32a61f91..0183aa9a3 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -2106,8 +2106,8 @@ void sub_806C51C(Entity *entity) if (xSprite >= -32 && ySprite >= -32 && xSprite <= 271 && ySprite <= 191 && r7 != 6 && entity->unk22 == 0) { struct unkStruct_202ED28 *spriteStructPtr = &gUnknown_202ED28[var_34][r7]; if (entInfo->unk156 != 0) { - SpriteSetX(&spriteStructPtr->sprite, xSprite + spriteStructPtr->x); - SpriteSetY(&spriteStructPtr->sprite, ySprite + spriteStructPtr->y); + SpriteSetX(&spriteStructPtr->sprite, xSprite + spriteStructPtr->pos.x); + SpriteSetY(&spriteStructPtr->sprite, ySprite + spriteStructPtr->pos.y); AddSprite(&spriteStructPtr->sprite, 0, NULL, NULL); } diff --git a/src/code_808333C.c b/src/code_808333C.c index e0635cd11..5a6a97171 100644 --- a/src/code_808333C.c +++ b/src/code_808333C.c @@ -9,8 +9,8 @@ bool8 sub_8083568(s32 inX, s32 inY, u8 index) if (x >= -16 && y >= -16 && x <= 255 && y <= 175) { - SpriteSetX(&gUnknown_202ED28[0][index].sprite, x + gUnknown_202ED28[0][index].x); - SpriteSetY(&gUnknown_202ED28[0][index].sprite, y + gUnknown_202ED28[0][index].y); + SpriteSetX(&gUnknown_202ED28[0][index].sprite, x + gUnknown_202ED28[0][index].pos.x); + SpriteSetY(&gUnknown_202ED28[0][index].sprite, y + gUnknown_202ED28[0][index].pos.y); AddSprite(&gUnknown_202ED28[0][index].sprite, 0, NULL, NULL); return TRUE; From fbd1d15ce93e4dab03c269c09537e9f6e9aac8f8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Mar 2025 15:17:15 +0100 Subject: [PATCH 16/18] better field names for Unk80F6224Struct --- src/code_803D110.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/code_803D110.c b/src/code_803D110.c index 859604bc2..82a23f61f 100644 --- a/src/code_803D110.c +++ b/src/code_803D110.c @@ -676,9 +676,9 @@ extern const DungeonPos gUnknown_80F61EC[2][6]; struct Unk80F6224Struct { - s32 unk0; - s32 unk4; - s32 unk8; + s32 shape; + s32 size; + s32 tileNum; }; extern const struct Unk80F6224Struct gUnknown_80F621C[2][6]; @@ -733,10 +733,10 @@ void sub_803E250(void) SpriteSetObjMode(&gUnknown_202ED28[i][j].sprite, 0); SpriteSetMosaic(&gUnknown_202ED28[i][j].sprite, 0); SpriteSetBpp(&gUnknown_202ED28[i][j].sprite, 0); - SpriteSetShape(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk0); + SpriteSetShape(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].shape); SpriteSetMatrixNum(&gUnknown_202ED28[i][j].sprite, 0); - SpriteSetSize(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk4); - SpriteSetTileNum(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].unk8); + SpriteSetSize(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].size); + SpriteSetTileNum(&gUnknown_202ED28[i][j].sprite, gUnknown_80F621C[i][j].tileNum); SpriteSetPriority(&gUnknown_202ED28[i][j].sprite, 3); SpriteSetPalNum(&gUnknown_202ED28[i][j].sprite, 0); SpriteSetUnk6_0(&gUnknown_202ED28[i][j].sprite, 0); From a828da70a6c5a96d938b2d300dba2df5009533ec Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Mar 2025 15:58:06 +0100 Subject: [PATCH 17/18] sub_8085B80 --- asm/code_8085B80.s | 110 ------------------------------------------- src/dungeon_util_1.c | 36 ++++++++++++++ 2 files changed, 36 insertions(+), 110 deletions(-) diff --git a/asm/code_8085B80.s b/asm/code_8085B80.s index f9f27fd90..e49e82d5f 100644 --- a/asm/code_8085B80.s +++ b/asm/code_8085B80.s @@ -5,116 +5,6 @@ .text -@ https://decomp.me/scratch/lb4jF (kermalis 87.53%) `bool8 sub_8085B80(struct_8085B80 *)` - thumb_func_start sub_8085B80 -sub_8085B80: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r1, r0, 0 - movs r0, 0 - mov r8, r0 - movs r7, 0 - ldr r0, _08085BE4 - ldr r0, [r0] - cmp r8, r0 - bge _08085C3E - adds r5, r1, 0 -_08085B98: - ldr r6, [r5, 0x4] - ldr r2, [r6, 0x70] - adds r3, r2, 0 - ldr r4, [r5, 0xC] - ldrb r0, [r5] - cmp r0, 0 - beq _08085C32 - movs r1, 0x1 - mov r8, r1 - ldr r0, [r5, 0x8] - cmp r0, 0 - bne _08085C08 - adds r4, 0x8 - movs r1, 0x4 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _08085BE8 - strb r0, [r5] - ldrb r1, [r4] - movs r0, 0x7 - ands r0, r1 - adds r1, r2, 0 - adds r1, 0x46 - strb r0, [r1] - movs r3, 0 - ldrsh r2, [r4, r3] - adds r0, r6, 0 - movs r1, 0x7 - bl sub_806CDD4 - movs r0, 0xA - ldrsh r1, [r4, r0] - movs r3, 0xC - ldrsh r2, [r4, r3] - adds r0, r6, 0 - bl sub_80856C8 - b _08085C32 - .align 2, 0 -_08085BE4: .4byte gUnknown_202F3D8 -_08085BE8: - movs r1, 0x4 - ldrsh r0, [r4, r1] - str r0, [r5, 0x8] - str r4, [r5, 0xC] - ldrb r1, [r4] - movs r0, 0x7 - ands r0, r1 - adds r1, r3, 0 - adds r1, 0x46 - strb r0, [r1] - movs r3, 0 - ldrsh r2, [r4, r3] - adds r0, r6, 0 - movs r1, 0 - bl sub_806CDD4 -_08085C08: - ldr r0, [r5, 0x8] - subs r0, 0x1 - str r0, [r5, 0x8] - ldr r1, _08085C4C - movs r2, 0 - ldrsh r0, [r4, r2] - lsls r0, 2 - adds r0, r1 - movs r3, 0 - ldrsh r1, [r0, r3] - movs r3, 0x2 - ldrsh r2, [r4, r3] - muls r1, r2 - lsls r1, 8 - movs r3, 0x2 - ldrsh r0, [r0, r3] - muls r2, r0 - lsls r2, 8 - adds r0, r6, 0 - bl IncreaseEntityPixelPos -_08085C32: - adds r5, 0x10 - adds r7, 0x1 - ldr r0, _08085C50 - ldr r0, [r0] - cmp r7, r0 - blt _08085B98 -_08085C3E: - mov r0, r8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08085C4C: .4byte gAdjacentTileOffsets -_08085C50: .4byte gUnknown_202F3D8 - thumb_func_end sub_8085B80 - thumb_func_start SetDungeonBGColorRGB SetDungeonBGColorRGB: push {r4-r7,lr} diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index fa1d66152..609b008ab 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -418,3 +418,39 @@ void sub_8085B4C(struct_8085B80 a0[], s16 *a1[], Entity *a2[], s32 a3) a0[i].unk8 = a1[i][2]; } } + +bool8 sub_8085B80(struct_8085B80 *a0) +{ + s16 *unkCPtr; + int i; + bool8 ret = FALSE; + + for (i = 0; i < gUnknown_202F3D8; i++) { + Entity *entity = a0[i].unk4; + EntityInfo *enInfo = GetEntInfo(entity); + unkCPtr = a0[i].unkC; + if (a0[i].unk0 != 0) { + ret = TRUE; + if (a0[i].unk8 == 0) { + unkCPtr = unkCPtr + 4; + if (unkCPtr[2] == 0) { + a0[i].unk0 = 0; + enInfo->action.direction = unkCPtr[0] & DIRECTION_MASK; + sub_806CDD4(entity, 7, unkCPtr[0]); + sub_80856C8(entity, unkCPtr[5], unkCPtr[6]); + continue; + } + a0[i].unk8 = unkCPtr[2]; + a0[i].unkC = unkCPtr; + enInfo->action.direction = *(u8 *)unkCPtr & DIRECTION_MASK; + sub_806CDD4(entity, 0, (int)*unkCPtr); + } + + a0[i].unk8--; + IncreaseEntityPixelPos(entity, + gAdjacentTileOffsets[*unkCPtr].x * unkCPtr[1] * 0x100, + gAdjacentTileOffsets[*unkCPtr].y * unkCPtr[1] * 0x100); + } + } + return ret; +} From 9f69bb501089af16caf2ae25bebe691edd74963a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Mar 2025 17:46:21 +0100 Subject: [PATCH 18/18] Update src/dungeon_util_1.c Co-authored-by: Seth Barberee --- src/dungeon_util_1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dungeon_util_1.c b/src/dungeon_util_1.c index 609b008ab..33bca699a 100644 --- a/src/dungeon_util_1.c +++ b/src/dungeon_util_1.c @@ -442,7 +442,7 @@ bool8 sub_8085B80(struct_8085B80 *a0) } a0[i].unk8 = unkCPtr[2]; a0[i].unkC = unkCPtr; - enInfo->action.direction = *(u8 *)unkCPtr & DIRECTION_MASK; + enInfo->action.direction = unkCPtr[0] & DIRECTION_MASK; sub_806CDD4(entity, 0, (int)*unkCPtr); }