From ad8c36c679a60bf65d274d2cc7c3497ff6a89399 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 18 Nov 2024 11:22:12 +0100 Subject: [PATCH] sub_8051438 --- asm/code_804FD30.s | 270 ---------------------------------- include/structs/str_dungeon.h | 5 +- src/dungeon_generation.c | 144 +++++++++++++----- 3 files changed, 110 insertions(+), 309 deletions(-) diff --git a/asm/code_804FD30.s b/asm/code_804FD30.s index 363ae5d28..7b873c43e 100644 --- a/asm/code_804FD30.s +++ b/asm/code_804FD30.s @@ -5,276 +5,6 @@ .text - - thumb_func_start sub_8051438 -sub_8051438: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - mov r9, r0 - ldr r0, _080515AC - ldr r0, [r0] - str r0, [sp, 0x4] - ldr r2, _080515B0 - ldr r4, _080515B4 - adds r3, r0, r4 - ldr r0, [r3] - ldr r0, [r0, 0x4] - lsls r1, 2 - adds r0, r1, r0 - ldr r0, [r0] - adds r0, 0x3 - str r0, [r2] - ldr r2, _080515B8 - movs r0, 0 - strb r0, [r2] - ldr r0, [r3] - ldr r0, [r0, 0x4] - adds r1, r0 - ldr r0, [r1] - ldrb r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0805147A - b _080515D8 -_0805147A: - ldr r5, [sp, 0x4] - ldr r0, _080515BC - adds r1, r5, r0 - mov r2, r9 - movs r3, 0 - ldrsh r0, [r2, r3] - str r0, [r1] - ldr r4, _080515C0 - adds r1, r5, r4 - movs r5, 0x2 - ldrsh r0, [r2, r5] - str r0, [r1] - ldr r0, [sp, 0x4] - ldr r2, _080515C4 - adds r1, r0, r2 - mov r3, r9 - movs r4, 0x4 - ldrsh r0, [r3, r4] - str r0, [r1] - ldr r5, [sp, 0x4] - ldr r0, _080515C8 - adds r1, r5, r0 - movs r2, 0x6 - ldrsh r0, [r3, r2] - str r0, [r1] - movs r3, 0 - str r3, [sp, 0x8] - mov r4, r9 - movs r5, 0x2 - ldrsh r4, [r4, r5] - mov r8, r4 - mov r1, r9 - movs r2, 0x6 - ldrsh r0, [r1, r2] - cmp r8, r0 - blt _080514C4 - b _08051640 -_080514C4: - mov r3, r9 - movs r4, 0 - ldrsh r7, [r3, r4] - movs r5, 0x4 - ldrsh r0, [r3, r5] - ldr r1, [sp, 0x8] - adds r1, 0x1 - str r1, [sp, 0x10] - mov r2, r8 - adds r2, 0x1 - str r2, [sp, 0xC] - cmp r7, r0 - bge _08051598 - ldr r4, _080515CC - ldr r3, [sp, 0x4] - adds r4, r3, r4 - str r4, [sp, 0x14] - movs r5, 0 - str r5, [sp, 0x18] - ldr r0, [sp, 0x8] - mov r10, r0 -_080514EE: - bl sub_80511F0 - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - adds r0, r7, 0 - mov r1, r8 - bl GetTileSafe - adds r6, r0, 0 - ldr r1, [sp, 0x4] - ldr r2, _080515D0 - adds r0, r1, r2 - add r0, r10 - strb r5, [r0] - ldr r3, [sp, 0x8] - lsls r4, r3, 1 - adds r4, r3 - lsls r4, 3 - ldr r1, [sp, 0x14] - adds r0, r1, r4 - movs r2, 0 - str r2, [sp] - adds r1, r5, 0 - adds r2, r7, 0 - mov r3, r8 - bl sub_805124C - ldrb r1, [r6, 0x9] - ldr r3, [sp, 0x18] - adds r4, r3 - ldr r5, [sp, 0x4] - adds r4, r5, r4 - adds r0, r6, 0 - ldr r2, _080515CC - adds r4, r2 - ldm r4!, {r2,r3,r5} - stm r0!, {r2,r3,r5} - ldm r4!, {r2,r3,r5} - stm r0!, {r2,r3,r5} - mov r3, r9 - movs r4, 0 - ldrsh r0, [r3, r4] - adds r0, 0x2 - cmp r7, r0 - blt _08051572 - movs r5, 0x4 - ldrsh r0, [r3, r5] - subs r0, 0x2 - cmp r7, r0 - bge _08051572 - movs r2, 0x2 - ldrsh r0, [r3, r2] - adds r0, 0x2 - cmp r8, r0 - blt _08051572 - movs r4, 0x6 - ldrsh r0, [r3, r4] - subs r0, 0x2 - cmp r8, r0 - bge _08051572 - movs r0, 0x88 - lsls r0, 1 - strh r0, [r6] - movs r0, 0xE - strb r0, [r6, 0xE] -_08051572: - strb r1, [r6, 0x9] - ldr r5, [sp, 0x4] - ldr r2, _080515D4 - adds r0, r5, r2 - strb r1, [r0] - ldr r3, [sp, 0x14] - adds r3, 0xC0 - str r3, [sp, 0x14] - ldr r4, [sp, 0x18] - adds r4, 0xC0 - str r4, [sp, 0x18] - movs r5, 0x8 - add r10, r5 - adds r7, 0x1 - mov r1, r9 - movs r2, 0x4 - ldrsh r0, [r1, r2] - cmp r7, r0 - blt _080514EE -_08051598: - ldr r3, [sp, 0x10] - str r3, [sp, 0x8] - ldr r4, [sp, 0xC] - mov r8, r4 - mov r5, r9 - movs r1, 0x6 - ldrsh r0, [r5, r1] - cmp r8, r0 - blt _080514C4 - b _08051640 - .align 2, 0 -_080515AC: .4byte gDungeon -_080515B0: .4byte gUnknown_202F1DC -_080515B4: .4byte 0x00013568 -_080515B8: .4byte gUnknown_202F1E1 -_080515BC: .4byte 0x0000e250 -_080515C0: .4byte 0x0000e254 -_080515C4: .4byte 0x0000e258 -_080515C8: .4byte 0x0000e25c -_080515CC: .4byte 0x0000e27c -_080515D0: .4byte 0x0000e87c -_080515D4: .4byte 0x0000e8bc -_080515D8: - mov r2, r9 - movs r3, 0x2 - ldrsh r2, [r2, r3] - mov r8, r2 - b _08051636 -_080515E2: - mov r0, r9 - movs r1, 0 - ldrsh r7, [r0, r1] - movs r2, 0x4 - ldrsh r0, [r0, r2] - mov r3, r8 - adds r3, 0x1 - str r3, [sp, 0xC] - cmp r7, r0 - bge _08051632 -_080515F6: - bl sub_80511F0 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - adds r0, r7, 0 - mov r1, r8 - bl GetTileSafe - adds r5, r0, 0 - ldrb r6, [r5, 0x9] - movs r0, 0x1 - str r0, [sp] - adds r0, r5, 0 - adds r1, r4, 0 - adds r2, r7, 0 - mov r3, r8 - bl sub_805124C - strb r6, [r5, 0x9] - ldr r4, [sp, 0x4] - ldr r5, _08051650 - adds r0, r4, r5 - strb r6, [r0] - adds r7, 0x1 - mov r1, r9 - movs r2, 0x4 - ldrsh r0, [r1, r2] - cmp r7, r0 - blt _080515F6 -_08051632: - ldr r3, [sp, 0xC] - mov r8, r3 -_08051636: - mov r4, r9 - movs r5, 0x6 - ldrsh r0, [r4, r5] - cmp r8, r0 - blt _080515E2 -_08051640: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08051650: .4byte 0x0000e8bc - thumb_func_end sub_8051438 - thumb_func_start sub_8051654 sub_8051654: push {r4-r7,lr} diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index aa6a04abd..fa152029a 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -363,13 +363,12 @@ typedef struct Dungeon Position stairsSpawn; // stairs location Position unkE220[8]; struct MinMaxPosition kecleonShopPos; - u32 unkE250; - u8 fillE254[0xE260 - 0xE254]; + struct MinMaxPosition unkE250; Position unkE260; /* 0xE264 */ Weather weather; // Uses the weather constants in weather.h. /* 0xE27C */ Tile unkE27C[8][8]; /* 0xE87C */ u8 unkE87C[8][8]; - u32 fillE8BC; + /* 0xE8BC */ u8 unkE8BC; // Seems to be some tile's room index; /* 0xE8C0 */ Tile *tilePointers[DUNGEON_MAX_SIZE_Y][DUNGEON_MAX_SIZE_X]; u8 unk104C0; /* 0x104C4 */ RoomData roomData[MAX_ROOM_COUNT]; diff --git a/src/dungeon_generation.c b/src/dungeon_generation.c index 79eb6cde0..0f7c1ed2e 100644 --- a/src/dungeon_generation.c +++ b/src/dungeon_generation.c @@ -102,7 +102,7 @@ void GenerateLineFloor(UnkDungeonGlobal_unk1C574 *a0); void GenerateCrossFloor(UnkDungeonGlobal_unk1C574 *a0); void GenerateBeetleFloor(UnkDungeonGlobal_unk1C574 *a0); void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, UnkDungeonGlobal_unk1C574 *unkPtr); -void sub_8051654(UnkDungeonGlobal_unk1C574 *a0); +void sub_8051654(UnkDungeonGlobal_unk1C574 *unkPtr); void GenerateSecondaryTerrainFormations(u32 flag, UnkDungeonGlobal_unk1C574 *unkPtr); void SpawnNonEnemies(UnkDungeonGlobal_unk1C574 *unkPtr, bool8 isEmptyMonsterHouse); void SpawnEnemies(UnkDungeonGlobal_unk1C574 *unkPtr, bool8 isEmptyMonsterHouse); @@ -125,12 +125,6 @@ EWRAM_DATA s32 gUnknown_202F1D0 = 0; static EWRAM_DATA s32 sNumTilesReachableFromStairs = 0; static EWRAM_DATA Position sKecleonShopMiddlePos = {0}; -struct PositionU8 -{ - u8 x; - u8 y; -}; - // Helper functions for terrain flags static inline void SetTerrainType(Tile *tile, u32 terrainType) { @@ -158,6 +152,14 @@ static inline u32 GetTerrainType(Tile *tile) return tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); } +struct FixedRoomsData +{ + u8 x; + u8 y; + u8 unk2; + u8 unk3[0]; // Not sure about the size; +}; + // Some weird-ass regswap prevents the function from being matched - https://decomp.me/scratch/9SUV3 #ifdef NONMATCHING void sub_804AFAC(void) @@ -1647,9 +1649,8 @@ void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, UnkDungeonGlobal_un bool8 GenerateFixedFloor(s32 fixedRoomId, UnkDungeonGlobal_unk1C574 *unkPtr) { - struct PositionU8 **fileData = (void *) gDungeon->unk13568->data; - s32 fixedRoomSizeX = fileData[fixedRoomId]->x; - s32 fixedRoomSizeY = fileData[fixedRoomId]->y; + s32 fixedRoomSizeX = ((struct FixedRoomsData **)(gDungeon->unk13568->data))[fixedRoomId]->x; + s32 fixedRoomSizeY = ((struct FixedRoomsData **)(gDungeon->unk13568->data))[fixedRoomId]->y; s32 gridSizeX, gridSizeY; if (fixedRoomSizeX == 0 || fixedRoomSizeY == 0) { @@ -4577,6 +4578,12 @@ void ResetFloor(void) } } +struct PositionU8 +{ + u8 x; + u8 y; +}; + /* * ShuffleSpawnPositions - Randomly shuffle an array of spawn positions */ @@ -6426,48 +6433,52 @@ void sub_8051288(s32 fixedRoomId) { s32 x, y; Dungeon *dungeon = gDungeon; - struct PositionU8 **fileData = (void *) dungeon->unk13568->data; - s32 fixedRoomSizeX = fileData[fixedRoomId]->x; - s32 fixedRoomSizeY = fileData[fixedRoomId]->y; + s32 fixedRoomSizeX = ((struct FixedRoomsData **)(dungeon->unk13568->data))[fixedRoomId]->x; + s32 fixedRoomSizeY = ((struct FixedRoomsData **)(dungeon->unk13568->data))[fixedRoomId]->y; dungeon->unkE260.x = fixedRoomSizeX; dungeon->unkE260.y = fixedRoomSizeY; - // FIX ME - gUnknown_202F1DC = ((u8 **)(dungeon->unk13568->data))[fixedRoomId] + 3; + gUnknown_202F1DC = ((struct FixedRoomsData **)(dungeon->unk13568->data))[fixedRoomId]->unk3; gUnknown_202F1E1 = 0; - for (x = 5; x < fixedRoomSizeX + 5; x++) { - for (y = 5; y < fixedRoomSizeY + 5; y++) { + + for (y = 5; y < fixedRoomSizeY + 5; y++) { + for (x = 5; x < fixedRoomSizeX + 5; x++) { u8 unk = sub_80511F0(); if (sub_805124C(GetTileSafe(x, y), unk, x, y, 1)) { - dungeon->unkE260.x = x; - dungeon->unkE260.y = y; + dungeon->stairsSpawn.x = x; + dungeon->stairsSpawn.y = y; } } } - for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { - for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { - if (y > 4) - - Tile *tile = GetTileSafe(x, y); - if (GetTerrainType(tile) == TERRAIN_TYPE_WALL) { - tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; - } - } - } - - if (fixedRoomId != 4) { - for (x = 0; x < 17; x++) { - for (y = 0; y < 5; y++) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + if (x <= 4 || x >= fixedRoomSizeX + 5 || y <= 4 || y >= fixedRoomSizeY + 5) { Tile *tile = GetTileSafe(x, y); tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; + if (gUnknown_202F1A8 != 0) { + SetTerrainType(tile, TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + } + else { + SetTerrainWall(tile); + } } } } - if (gDungeon->tileset < 64) { - for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { - for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + if (fixedRoomId == 4) { + for (y = 5; y < 17; y++) { + for (x = 2; x < 5; x++) { + Tile *tile = GetTileSafe(x, y); + tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; + SetTerrainWall(tile); + } + } + } + + if (gDungeon->tileset >= 64) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { Tile *tile = GetTileSafe(x, y); if (GetTerrainType(tile) == TERRAIN_TYPE_WALL) { tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; @@ -6479,4 +6490,65 @@ void sub_8051288(s32 fixedRoomId) sub_804E9DC(); } +void sub_8051438(struct GridCell *gridCell, s32 fixedRoomId) +{ + s32 x, y; + Dungeon *dungeon = gDungeon; + + gUnknown_202F1DC = ((struct FixedRoomsData **)(dungeon->unk13568->data))[fixedRoomId]->unk3; + gUnknown_202F1E1 = 0; + + if (((struct FixedRoomsData **)(dungeon->unk13568->data))[fixedRoomId]->unk2 & 1) { + s32 yIndex; + + dungeon->unkE250.minX = gridCell->start.x; + dungeon->unkE250.minY = gridCell->start.y; + dungeon->unkE250.maxX = gridCell->end.x; + dungeon->unkE250.maxY = gridCell->end.y; + + yIndex = 0; + for (y = gridCell->start.y; y < gridCell->end.y; y++) { + s32 xIndex = 0; + for (x = gridCell->start.x; x < gridCell->end.x; x++) { + u8 roomId; + u8 unk = sub_80511F0(); + Tile *tile = GetTileSafe(x, y); + + dungeon->unkE87C[xIndex][yIndex] = unk; + sub_805124C(&dungeon->unkE27C[xIndex][yIndex], unk, x, y, 0); + roomId = tile->room; + *tile = dungeon->unkE27C[xIndex][yIndex]; + if (x >= gridCell->start.x + 2 && x < gridCell->end.x - 2 && y >= gridCell->start.y + 2 && y < gridCell->end.y - 2) { + tile->terrainType = TERRAIN_TYPE_IMPASSABLE_WALL | TERRAIN_TYPE_UNBREAKABLE; + tile->unkE = 0xE; + } + tile->room = roomId; + dungeon->unkE8BC = roomId; + xIndex++; + } + yIndex++; + } + } + else { + for (y = gridCell->start.y; y < gridCell->end.y; y++) { + for (x = gridCell->start.x; x < gridCell->end.x; x++) { + u8 unk = sub_80511F0(); + Tile *tile = GetTileSafe(x, y); + u8 roomId = tile->room; + + sub_805124C(tile, unk, x, y, 1); + tile->room = roomId; + dungeon->unkE8BC = roomId; + } + } + } +} + +/* +void sub_8051654(UnkDungeonGlobal_unk1C574 *unkPtr) +{ + +} +*/ + //