From 70db368a342f0449f02792e3e4e70c9d14d6fa82 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 31 Dec 2023 10:06:19 -0800 Subject: [PATCH] nonmatch sub_804FD30 --- asm/code_804FD30.s | 234 --------------------------- include/structs/str_dungeon.h | 8 +- src/code_804AFAC.c | 293 ++++++++++++++++++++++++++++++++++ 3 files changed, 299 insertions(+), 236 deletions(-) diff --git a/asm/code_804FD30.s b/asm/code_804FD30.s index f92d82837..cabeb6f03 100644 --- a/asm/code_804FD30.s +++ b/asm/code_804FD30.s @@ -5,240 +5,6 @@ .text - thumb_func_start sub_804FD30 -sub_804FD30: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - movs r6, 0 -_0804FD3A: - movs r7, 0 - adds r4, r6, 0x1 -_0804FD3E: - adds r0, r6, 0 - adds r1, r7, 0 - bl GetTileSafe - bl sub_804FD10 - subs r3, r7, 0x1 - cmp r6, 0 - blt _0804FD5C - cmp r3, 0 - blt _0804FD5C - cmp r6, 0x37 - bgt _0804FD5C - cmp r3, 0x1F - ble _0804FD60 -_0804FD5C: - movs r0, 0x1 - b _0804FD62 -_0804FD60: - movs r0, 0 -_0804FD62: - cmp r0, 0 - bne _0804FE24 - cmp r4, 0 - blt _0804FD76 - cmp r3, 0 - blt _0804FD76 - cmp r4, 0x37 - bgt _0804FD76 - cmp r3, 0x1F - ble _0804FD7A -_0804FD76: - movs r0, 0x1 - b _0804FD7C -_0804FD7A: - movs r0, 0 -_0804FD7C: - cmp r0, 0 - bne _0804FE24 - cmp r4, 0 - blt _0804FD90 - cmp r3, 0 - blt _0804FD90 - cmp r4, 0x37 - bgt _0804FD90 - cmp r3, 0x1F - ble _0804FD94 -_0804FD90: - movs r0, 0x1 - b _0804FD96 -_0804FD94: - movs r0, 0 -_0804FD96: - cmp r0, 0 - bne _0804FE24 - adds r2, r7, 0x1 - cmp r4, 0 - blt _0804FDAC - cmp r2, 0 - blt _0804FDAC - cmp r4, 0x37 - bgt _0804FDAC - cmp r2, 0x1F - ble _0804FDB0 -_0804FDAC: - movs r0, 0x1 - b _0804FDB2 -_0804FDB0: - movs r0, 0 -_0804FDB2: - cmp r0, 0 - bne _0804FE24 - cmp r6, 0 - blt _0804FDC6 - cmp r2, 0 - blt _0804FDC6 - cmp r6, 0x37 - bgt _0804FDC6 - cmp r2, 0x1F - ble _0804FDCA -_0804FDC6: - movs r0, 0x1 - b _0804FDCC -_0804FDCA: - movs r0, 0 -_0804FDCC: - cmp r0, 0 - bne _0804FE24 - adds r0, r2, 0 - subs r1, r6, 0x1 - cmp r1, 0 - blt _0804FDE4 - cmp r0, 0 - blt _0804FDE4 - cmp r1, 0x37 - bgt _0804FDE4 - cmp r2, 0x1F - ble _0804FDE8 -_0804FDE4: - movs r0, 0x1 - b _0804FDEA -_0804FDE8: - movs r0, 0 -_0804FDEA: - cmp r0, 0 - bne _0804FE24 - cmp r1, 0 - blt _0804FDFE - cmp r7, 0 - blt _0804FDFE - cmp r1, 0x37 - bgt _0804FDFE - cmp r7, 0x1F - ble _0804FE02 -_0804FDFE: - movs r0, 0x1 - b _0804FE04 -_0804FE02: - movs r0, 0 -_0804FE04: - cmp r0, 0 - bne _0804FE24 - adds r0, r3, 0 - cmp r1, 0 - blt _0804FE1A - cmp r0, 0 - blt _0804FE1A - cmp r1, 0x37 - bgt _0804FE1A - cmp r3, 0x1F - ble _0804FE1E -_0804FE1A: - movs r0, 0x1 - b _0804FE20 -_0804FE1E: - movs r0, 0 -_0804FE20: - cmp r0, 0 - beq _0804FE34 -_0804FE24: - adds r0, r6, 0 - adds r1, r7, 0 - bl GetTileSafe - ldrh r2, [r0] - movs r1, 0x10 - orrs r1, r2 - strh r1, [r0] -_0804FE34: - adds r7, 0x1 - cmp r7, 0x1F - ble _0804FD3E - adds r6, 0x1 - cmp r6, 0x37 - bgt _0804FE42 - b _0804FD3A -_0804FE42: - ldr r3, _0804FEB4 - ldr r1, [r3] - ldr r0, _0804FEB8 - adds r2, r1, r0 - ldr r0, _0804FEBC - strh r0, [r2] - ldr r2, _0804FEC0 - adds r1, r2 - movs r0, 0x1 - negs r0, r0 - strh r0, [r1] - movs r6, 0 - mov r8, r3 - ldr r1, _0804FEC4 -_0804FE5E: - adds r5, r1, 0 - movs r4, 0 - movs r7, 0x7 -_0804FE64: - mov r2, r8 - ldr r0, [r2] - adds r0, r5 - adds r0, r4 - str r1, [sp] - bl sub_804FD10 - adds r4, 0x18 - subs r7, 0x1 - ldr r1, [sp] - cmp r7, 0 - bge _0804FE64 - adds r1, 0xC0 - adds r6, 0x1 - cmp r6, 0x7 - ble _0804FE5E - ldr r0, _0804FEB4 - ldr r1, [r0] - ldr r2, _0804FEC8 - adds r1, r2 - movs r2, 0 - strh r2, [r1] - movs r6, 0 - adds r4, r0, 0 - ldr r3, _0804FECC -_0804FE96: - ldr r0, [r4] - lsls r1, r6, 2 - adds r0, r3 - adds r0, r1 - ldr r0, [r0] - str r2, [r0] - adds r6, 0x1 - cmp r6, 0x3F - ble _0804FE96 - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804FEB4: .4byte gDungeon -_0804FEB8: .4byte 0x0000e21c -_0804FEBC: .4byte 0x0000ffff -_0804FEC0: .4byte 0x0000e21e -_0804FEC4: .4byte 0x0000e27c -_0804FEC8: .4byte 0x00003904 -_0804FECC: .4byte 0x0001371c - thumb_func_end sub_804FD30 - thumb_func_start sub_804FED0 sub_804FED0: push {r4-r7,lr} diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 93c600c6e..0cf9ae4b7 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -150,7 +150,9 @@ typedef struct Dungeon u8 fill3A10[0x3A14 - 0x3A12]; /* 0x3A14 */ s16 bossBattleIndex; /* 0x3A18 */ Tile tiles[DUNGEON_MAX_SIZE_Y][DUNGEON_MAX_SIZE_X]; - u8 fillE218[0xE220 - 0xE218]; + u8 fillE218[0xE21C - 0xE218]; + u16 unkE21C; + u16 unkE21E; Position unkE220[4]; u8 unkE230[0xE23C - 0xE230]; s16 unkE23C; // x coord of some kind @@ -169,7 +171,9 @@ typedef struct Dungeon /* 0xE277 */ u8 mudSportTurns; /* 0xE278 */ u8 waterSportTurns; /* 0xE279 */ bool8 nullifyWeather; // Air Lock and Cloud Nine toggle this to disable weather effects - u8 fillE27A[0xE8C0 - 0xE27A]; + u8 fillE27A[0xE27C - 0xE27A]; + /* 0xE27C */ Tile unkE27C[8][8]; + /* 0xE87C */ u8 fillE87C[68]; /* 0xE8C0 */ Tile *tilePointers[DUNGEON_MAX_SIZE_Y][DUNGEON_MAX_SIZE_X]; u8 unk104C0; /* 0x104C4 */ RoomData roomData[MAX_ROOM_COUNT]; diff --git a/src/code_804AFAC.c b/src/code_804AFAC.c index a0fd88396..1e4eca2f9 100644 --- a/src/code_804AFAC.c +++ b/src/code_804AFAC.c @@ -82,3 +82,296 @@ void sub_804FD10(Tile *tile) tile->monster = NULL; tile->object = NULL; } + +bool8 static inline boundsCheck(s32 x, s32 y) +{ + if ((((x < 0 || (y < 0)) || (DUNGEON_MAX_SIZE_X <= x)) || (DUNGEON_MAX_SIZE_Y <= y))) + { + return TRUE; + } + else + return FALSE; +} + +// https://decomp.me/scratch/w591w (98.17% matching - Seth) +// r6 and r7 are swapped +#ifdef NONMATCHING +void sub_804FD30(void) +{ + int x; + int y; + + for(x = 0; x < DUNGEON_MAX_SIZE_X; x++) + { + for(y = 0; y < DUNGEON_MAX_SIZE_Y; y++) + { + sub_804FD10(GetTileSafe(x,y)); + + if ((boundsCheck(x, y - 1)) || + (boundsCheck(x + 1, y - 1)) || + (boundsCheck(x + 1, y - 1)) || + (boundsCheck(x + 1, y + 1)) || + (boundsCheck(x, y + 1)) || + (boundsCheck(x - 1, y + 1)) || + (boundsCheck(x - 1, y)) || + (boundsCheck(x - 1, y - 1))) + { + GetTileSafe(x,y)->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; + } + } + } + + gDungeon->unkE21C = -1; + gDungeon->unkE21E = -1; + + for(x = 0; x < 8; x++) + { + for(y = 0; y < 8; y++) + { + sub_804FD10(&gDungeon->unkE27C[x][y]); + } + } + + gDungeon->unk3904 = 0; + for(x = 0; x < 0x40; x++) + { + gDungeon->unk1371C[x]->type = 0; + } +} + #else +NAKED +void sub_804FD30(void) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x4\n" + "\tmovs r6, 0\n" +"_0804FD3A:\n" + "\tmovs r7, 0\n" + "\tadds r4, r6, 0x1\n" +"_0804FD3E:\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r7, 0\n" + "\tbl GetTileSafe\n" + "\tbl sub_804FD10\n" + "\tsubs r3, r7, 0x1\n" + "\tcmp r6, 0\n" + "\tblt _0804FD5C\n" + "\tcmp r3, 0\n" + "\tblt _0804FD5C\n" + "\tcmp r6, 0x37\n" + "\tbgt _0804FD5C\n" + "\tcmp r3, 0x1F\n" + "\tble _0804FD60\n" +"_0804FD5C:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FD62\n" +"_0804FD60:\n" + "\tmovs r0, 0\n" +"_0804FD62:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tcmp r4, 0\n" + "\tblt _0804FD76\n" + "\tcmp r3, 0\n" + "\tblt _0804FD76\n" + "\tcmp r4, 0x37\n" + "\tbgt _0804FD76\n" + "\tcmp r3, 0x1F\n" + "\tble _0804FD7A\n" +"_0804FD76:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FD7C\n" +"_0804FD7A:\n" + "\tmovs r0, 0\n" +"_0804FD7C:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tcmp r4, 0\n" + "\tblt _0804FD90\n" + "\tcmp r3, 0\n" + "\tblt _0804FD90\n" + "\tcmp r4, 0x37\n" + "\tbgt _0804FD90\n" + "\tcmp r3, 0x1F\n" + "\tble _0804FD94\n" +"_0804FD90:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FD96\n" +"_0804FD94:\n" + "\tmovs r0, 0\n" +"_0804FD96:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tadds r2, r7, 0x1\n" + "\tcmp r4, 0\n" + "\tblt _0804FDAC\n" + "\tcmp r2, 0\n" + "\tblt _0804FDAC\n" + "\tcmp r4, 0x37\n" + "\tbgt _0804FDAC\n" + "\tcmp r2, 0x1F\n" + "\tble _0804FDB0\n" +"_0804FDAC:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FDB2\n" +"_0804FDB0:\n" + "\tmovs r0, 0\n" +"_0804FDB2:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tcmp r6, 0\n" + "\tblt _0804FDC6\n" + "\tcmp r2, 0\n" + "\tblt _0804FDC6\n" + "\tcmp r6, 0x37\n" + "\tbgt _0804FDC6\n" + "\tcmp r2, 0x1F\n" + "\tble _0804FDCA\n" +"_0804FDC6:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FDCC\n" +"_0804FDCA:\n" + "\tmovs r0, 0\n" +"_0804FDCC:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tadds r0, r2, 0\n" + "\tsubs r1, r6, 0x1\n" + "\tcmp r1, 0\n" + "\tblt _0804FDE4\n" + "\tcmp r0, 0\n" + "\tblt _0804FDE4\n" + "\tcmp r1, 0x37\n" + "\tbgt _0804FDE4\n" + "\tcmp r2, 0x1F\n" + "\tble _0804FDE8\n" +"_0804FDE4:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FDEA\n" +"_0804FDE8:\n" + "\tmovs r0, 0\n" +"_0804FDEA:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tcmp r1, 0\n" + "\tblt _0804FDFE\n" + "\tcmp r7, 0\n" + "\tblt _0804FDFE\n" + "\tcmp r1, 0x37\n" + "\tbgt _0804FDFE\n" + "\tcmp r7, 0x1F\n" + "\tble _0804FE02\n" +"_0804FDFE:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FE04\n" +"_0804FE02:\n" + "\tmovs r0, 0\n" +"_0804FE04:\n" + "\tcmp r0, 0\n" + "\tbne _0804FE24\n" + "\tadds r0, r3, 0\n" + "\tcmp r1, 0\n" + "\tblt _0804FE1A\n" + "\tcmp r0, 0\n" + "\tblt _0804FE1A\n" + "\tcmp r1, 0x37\n" + "\tbgt _0804FE1A\n" + "\tcmp r3, 0x1F\n" + "\tble _0804FE1E\n" +"_0804FE1A:\n" + "\tmovs r0, 0x1\n" + "\tb _0804FE20\n" +"_0804FE1E:\n" + "\tmovs r0, 0\n" +"_0804FE20:\n" + "\tcmp r0, 0\n" + "\tbeq _0804FE34\n" +"_0804FE24:\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r7, 0\n" + "\tbl GetTileSafe\n" + "\tldrh r2, [r0]\n" + "\tmovs r1, 0x10\n" + "\torrs r1, r2\n" + "\tstrh r1, [r0]\n" +"_0804FE34:\n" + "\tadds r7, 0x1\n" + "\tcmp r7, 0x1F\n" + "\tble _0804FD3E\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x37\n" + "\tbgt _0804FE42\n" + "\tb _0804FD3A\n" +"_0804FE42:\n" + "\tldr r3, _0804FEB4\n" + "\tldr r1, [r3]\n" + "\tldr r0, _0804FEB8\n" + "\tadds r2, r1, r0\n" + "\tldr r0, _0804FEBC\n" + "\tstrh r0, [r2]\n" + "\tldr r2, _0804FEC0\n" + "\tadds r1, r2\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tstrh r0, [r1]\n" + "\tmovs r6, 0\n" + "\tmov r8, r3\n" + "\tldr r1, _0804FEC4\n" +"_0804FE5E:\n" + "\tadds r5, r1, 0\n" + "\tmovs r4, 0\n" + "\tmovs r7, 0x7\n" +"_0804FE64:\n" + "\tmov r2, r8\n" + "\tldr r0, [r2]\n" + "\tadds r0, r5\n" + "\tadds r0, r4\n" + "\tstr r1, [sp]\n" + "\tbl sub_804FD10\n" + "\tadds r4, 0x18\n" + "\tsubs r7, 0x1\n" + "\tldr r1, [sp]\n" + "\tcmp r7, 0\n" + "\tbge _0804FE64\n" + "\tadds r1, 0xC0\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x7\n" + "\tble _0804FE5E\n" + "\tldr r0, _0804FEB4\n" + "\tldr r1, [r0]\n" + "\tldr r2, _0804FEC8\n" + "\tadds r1, r2\n" + "\tmovs r2, 0\n" + "\tstrh r2, [r1]\n" + "\tmovs r6, 0\n" + "\tadds r4, r0, 0\n" + "\tldr r3, _0804FECC\n" +"_0804FE96:\n" + "\tldr r0, [r4]\n" + "\tlsls r1, r6, 2\n" + "\tadds r0, r3\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tstr r2, [r0]\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x3F\n" + "\tble _0804FE96\n" + "\tadd sp, 0x4\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0804FEB4: .4byte gDungeon\n" +"_0804FEB8: .4byte 0x0000e21c\n" +"_0804FEBC: .4byte 0x0000ffff\n" +"_0804FEC0: .4byte 0x0000e21e\n" +"_0804FEC4: .4byte 0x0000e27c\n" +"_0804FEC8: .4byte 0x00003904\n" +"_0804FECC: .4byte 0x0001371c\n"); + #endif +}