From bfbcea5f9ff8b97785abe3b7102b720b8921545c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Mar 2025 23:33:39 +0100 Subject: [PATCH] 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