diff --git a/asm/dungeon_map_access.s b/asm/dungeon_map_access.s index b5af22572..738ac1a2b 100644 --- a/asm/dungeon_map_access.s +++ b/asm/dungeon_map_access.s @@ -5,431 +5,6 @@ .text - thumb_func_start sub_8049BB0 -sub_8049BB0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x44 - mov r10, r0 - str r1, [sp, 0x40] - movs r0, 0 - str r0, [sp] - str r0, [sp, 0x4] - str r0, [sp, 0x8] - str r0, [sp, 0xC] - adds r0, r1, 0 - adds r0, 0x1 - mov r9, r0 - mov r0, r10 - mov r1, r9 - bl GetTile - ldrh r1, [r0] - movs r4, 0x3 - adds r0, r4, 0 - ands r0, r1 - add r6, sp, 0x18 - str r0, [sp, 0x18] - mov r5, r10 - adds r5, 0x1 - adds r0, r5, 0 - mov r1, r9 - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0x4] - adds r0, r5, 0 - ldr r1, [sp, 0x40] - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0x8] - ldr r0, [sp, 0x40] - subs r0, 0x1 - mov r8, r0 - adds r0, r5, 0 - mov r1, r8 - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0xC] - mov r0, r10 - mov r1, r8 - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0x10] - subs r5, 0x2 - adds r0, r5, 0 - mov r1, r8 - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0x14] - adds r0, r5, 0 - ldr r1, [sp, 0x40] - bl GetTile - ldrh r1, [r0] - adds r0, r4, 0 - ands r0, r1 - str r0, [r6, 0x18] - adds r0, r5, 0 - mov r1, r9 - bl GetTile - ldrh r0, [r0] - ands r4, r0 - str r4, [r6, 0x1C] - ldr r1, [sp, 0x18] - cmp r1, 0x1 - bne _08049C6A - ldr r0, [sp] - orrs r0, r1 - str r0, [sp] -_08049C6A: - ldr r0, [r6, 0x8] - cmp r0, 0x1 - bne _08049C78 - ldr r0, [sp] - movs r1, 0x4 - orrs r0, r1 - str r0, [sp] -_08049C78: - ldr r0, [r6, 0x10] - cmp r0, 0x1 - bne _08049C86 - ldr r0, [sp] - movs r1, 0x10 - orrs r0, r1 - str r0, [sp] -_08049C86: - ldr r0, [r6, 0x18] - cmp r0, 0x1 - bne _08049C94 - ldr r0, [sp] - movs r1, 0x40 - orrs r0, r1 - str r0, [sp] -_08049C94: - ldr r2, [sp, 0x18] - cmp r2, 0 - beq _08049CAE - ldr r0, [r6, 0x4] - cmp r0, 0x1 - bne _08049CAE - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049CC8 - ldr r0, [sp] - movs r1, 0x2 - orrs r0, r1 - str r0, [sp] -_08049CAE: - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049CC8 - ldr r0, [r6, 0xC] - cmp r0, 0x1 - bne _08049CC8 - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049CE2 - ldr r0, [sp] - movs r1, 0x8 - orrs r0, r1 - str r0, [sp] -_08049CC8: - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049CE2 - ldr r0, [r6, 0x14] - cmp r0, 0x1 - bne _08049CE2 - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049CFA - ldr r0, [sp] - movs r1, 0x20 - orrs r0, r1 - str r0, [sp] -_08049CE2: - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049CFA - ldr r0, [r6, 0x1C] - cmp r0, 0x1 - bne _08049CFA - cmp r2, 0 - beq _08049CFA - ldr r0, [sp] - movs r1, 0x80 - orrs r0, r1 - str r0, [sp] -_08049CFA: - add r4, sp, 0x38 - movs r7, 0x1 - adds r2, r4, 0 - adds r1, r6, 0 - movs r5, 0 - movs r3, 0x7 -_08049D06: - ldr r0, [r1] - subs r0, 0x1 - cmp r0, 0x1 - bhi _08049D12 - strb r7, [r2] - b _08049D14 -_08049D12: - strb r5, [r2] -_08049D14: - adds r2, 0x1 - adds r1, 0x4 - subs r3, 0x1 - cmp r3, 0 - bge _08049D06 - ldrb r0, [r4] - cmp r0, 0 - beq _08049D2C - ldr r0, [sp, 0x4] - movs r1, 0x1 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D2C: - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _08049D3A - ldr r0, [sp, 0x4] - movs r1, 0x4 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D3A: - ldrb r0, [r4, 0x4] - cmp r0, 0 - beq _08049D48 - ldr r0, [sp, 0x4] - movs r1, 0x10 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D48: - ldrb r0, [r4, 0x6] - cmp r0, 0 - beq _08049D56 - ldr r0, [sp, 0x4] - movs r1, 0x40 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D56: - ldr r2, [sp, 0x18] - cmp r2, 0 - beq _08049D70 - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _08049D70 - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049D8A - ldr r0, [sp, 0x4] - movs r1, 0x2 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D70: - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049D8A - ldrb r0, [r4, 0x3] - cmp r0, 0 - beq _08049D8A - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049DA4 - ldr r0, [sp, 0x4] - movs r1, 0x8 - orrs r0, r1 - str r0, [sp, 0x4] -_08049D8A: - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049DA4 - ldrb r0, [r4, 0x5] - cmp r0, 0 - beq _08049DA4 - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049DBC - ldr r0, [sp, 0x4] - movs r1, 0x20 - orrs r0, r1 - str r0, [sp, 0x4] -_08049DA4: - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049DBC - ldrb r0, [r4, 0x7] - cmp r0, 0 - beq _08049DBC - cmp r2, 0 - beq _08049DC8 - ldr r0, [sp, 0x4] - movs r1, 0x80 - orrs r0, r1 - str r0, [sp, 0x4] -_08049DBC: - cmp r2, 0 - beq _08049DC8 - ldr r0, [sp, 0x8] - movs r1, 0x1 - orrs r0, r1 - str r0, [sp, 0x8] -_08049DC8: - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049DD6 - ldr r0, [sp, 0x8] - movs r1, 0x4 - orrs r0, r1 - str r0, [sp, 0x8] -_08049DD6: - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049DE4 - ldr r0, [sp, 0x8] - movs r1, 0x10 - orrs r0, r1 - str r0, [sp, 0x8] -_08049DE4: - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049DF2 - ldr r0, [sp, 0x8] - movs r1, 0x40 - orrs r0, r1 - str r0, [sp, 0x8] -_08049DF2: - cmp r2, 0 - beq _08049E0A - ldr r0, [r6, 0x4] - cmp r0, 0 - beq _08049E0A - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049E24 - ldr r0, [sp, 0x8] - movs r1, 0x2 - orrs r0, r1 - str r0, [sp, 0x8] -_08049E0A: - ldr r0, [r6, 0x8] - cmp r0, 0 - beq _08049E24 - ldr r0, [r6, 0xC] - cmp r0, 0 - beq _08049E24 - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049E3E - ldr r0, [sp, 0x8] - movs r1, 0x8 - orrs r0, r1 - str r0, [sp, 0x8] -_08049E24: - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08049E3E - ldr r0, [r6, 0x14] - cmp r0, 0 - beq _08049E3E - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049E56 - ldr r0, [sp, 0x8] - movs r1, 0x20 - orrs r0, r1 - str r0, [sp, 0x8] -_08049E3E: - ldr r0, [r6, 0x18] - cmp r0, 0 - beq _08049E56 - ldr r0, [r6, 0x1C] - cmp r0, 0 - beq _08049E56 - cmp r2, 0 - beq _08049E56 - ldr r0, [sp, 0x8] - movs r1, 0x80 - orrs r0, r1 - str r0, [sp, 0x8] -_08049E56: - movs r0, 0xFF - str r0, [sp, 0xC] - mov r0, r10 - cmp r0, 0x1 - bgt _08049E64 - movs r0, 0x1F - str r0, [sp, 0xC] -_08049E64: - ldr r0, [sp, 0x40] - cmp r0, 0x1 - bgt _08049E74 - ldr r0, [sp, 0xC] - movs r1, 0x39 - negs r1, r1 - ands r0, r1 - str r0, [sp, 0xC] -_08049E74: - mov r0, r10 - cmp r0, 0x35 - ble _08049E84 - ldr r0, [sp, 0xC] - movs r1, 0xF - negs r1, r1 - ands r0, r1 - str r0, [sp, 0xC] -_08049E84: - ldr r0, [sp, 0x40] - cmp r0, 0x1D - ble _08049E94 - ldr r0, [sp, 0xC] - movs r1, 0x84 - negs r1, r1 - ands r0, r1 - str r0, [sp, 0xC] -_08049E94: - mov r0, r10 - ldr r1, [sp, 0x40] - bl GetTileSafe - ldr r1, [sp] - strb r1, [r0, 0xA] - mov r0, r10 - ldr r1, [sp, 0x40] - bl GetTileSafe - ldr r1, [sp, 0x4] - strb r1, [r0, 0xB] - mov r0, r10 - ldr r1, [sp, 0x40] - bl GetTileSafe - ldr r1, [sp, 0x8] - strb r1, [r0, 0xC] - mov r0, r10 - ldr r1, [sp, 0x40] - bl GetTileSafe - ldr r1, [sp, 0xC] - strb r1, [r0, 0xD] - add sp, 0x44 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8049BB0 - thumb_func_start sub_8049ED4 sub_8049ED4: push {r4-r7,lr} diff --git a/src/dungeon_map_access.c b/src/dungeon_map_access.c index 1a1911f75..da9ec46f9 100644 --- a/src/dungeon_map_access.c +++ b/src/dungeon_map_access.c @@ -57,7 +57,7 @@ void sub_80495E4(void) { s32 YCoord; s32 XCoord; - + for(YCoord = 0; YCoord < DUNGEON_MAX_SIZE_Y; YCoord++) { for(XCoord = 0; XCoord < DUNGEON_MAX_SIZE_X; XCoord++) @@ -75,7 +75,7 @@ void LoadDungeonTilesetAssets(void) OpenedFile *file; OpenedFile *file_1; u8 fileName [12]; - + sprintf(fileName,gUnknown_80F6A04,gUnknown_8108EC0[gDungeon->tileset]); // b%02dfon file = OpenFileAndGetFileDataPtr(fileName,&gDungeonFileArchive); DecompressATGlobalFile((u32 *)0x06008000,0,file); @@ -142,7 +142,7 @@ void sub_8049884(void) { s32 XCoord; s32 YCoord; - + for(YCoord = 0; YCoord < DUNGEON_MAX_SIZE_Y; YCoord++) { for(XCoord = 0; XCoord < DUNGEON_MAX_SIZE_X; XCoord++) { @@ -165,7 +165,7 @@ void sub_80498A8(int x,int y) u16 sp_0x20; // sp 0x20 int r4; s32 r7; // r7 - + if (x < 0) { return; } @@ -325,7 +325,7 @@ void sub_8049B8C(void) { s32 XCoord; s32 YCoord; - + for(YCoord = 0; YCoord < DUNGEON_MAX_SIZE_Y; YCoord++) { for(XCoord = 0; XCoord < DUNGEON_MAX_SIZE_X; XCoord++) { @@ -333,3 +333,103 @@ void sub_8049B8C(void) } } } + +void sub_8049BB0(s32 x, s32 y) +{ + s32 terrainFlags; + s32 i; + s32 flags[6]; + s32 var_4C[8]; + bool8 var_2C[8]; + + flags[0] = 0; + flags[1] = 0; + flags[2] = 0; + flags[3] = 0; + + terrainFlags = GetTile(x, y+1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[0] = terrainFlags; + var_4C[1] = GetTile(x+1, y+1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[2] = GetTile(x+1, y)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[3] = GetTile(x+1, y-1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[4] = GetTile(x, y-1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[5] = GetTile(x-1, y-1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[6] = GetTile(x-1, y)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + var_4C[7] = GetTile(x-1, y+1)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + + if (var_4C[0] == TERRAIN_TYPE_NORMAL) + flags[CROSSABLE_TERRAIN_REGULAR] |= 1; + if (var_4C[2] == TERRAIN_TYPE_NORMAL) + flags[CROSSABLE_TERRAIN_REGULAR] |= 4; + if (var_4C[4] == TERRAIN_TYPE_NORMAL) + flags[CROSSABLE_TERRAIN_REGULAR] |= 0x10; + if (var_4C[6] == TERRAIN_TYPE_NORMAL) + flags[CROSSABLE_TERRAIN_REGULAR] |= 0x40; + + if (var_4C[0] != 0 && var_4C[1] == TERRAIN_TYPE_NORMAL && var_4C[2] != 0) + flags[CROSSABLE_TERRAIN_REGULAR] |= 2; + if (var_4C[2] != 0 && var_4C[3] == TERRAIN_TYPE_NORMAL && var_4C[4] != 0) + flags[CROSSABLE_TERRAIN_REGULAR] |= 8; + if (var_4C[4] != 0 && var_4C[5] == TERRAIN_TYPE_NORMAL && var_4C[6] != 0) + flags[CROSSABLE_TERRAIN_REGULAR] |= 0x20; + if (var_4C[6] != 0 && var_4C[7] == TERRAIN_TYPE_NORMAL && var_4C[0] != 0) + flags[CROSSABLE_TERRAIN_REGULAR] |= 0x80; + + for (i = 0; i < 8; i++) { + if (var_4C[i] == TERRAIN_TYPE_NORMAL || var_4C[i] == TERRAIN_TYPE_SECONDARY) + var_2C[i] = TRUE; + else + var_2C[i] = FALSE; + } + + if (var_2C[0]) + flags[CROSSABLE_TERRAIN_LIQUID] |= 1; + if (var_2C[2]) + flags[CROSSABLE_TERRAIN_LIQUID] |= 4; + if (var_2C[4]) + flags[CROSSABLE_TERRAIN_LIQUID] |= 0x10; + if (var_2C[6]) + flags[CROSSABLE_TERRAIN_LIQUID] |= 0x40; + + if (var_4C[0] != 0 && var_2C[1] && var_4C[2] != 0) + flags[CROSSABLE_TERRAIN_LIQUID] |= 2; + if (var_4C[2] != 0 && var_2C[3] && var_4C[4] != 0) + flags[CROSSABLE_TERRAIN_LIQUID] |= 8; + if (var_4C[4] != 0 && var_2C[5] && var_4C[6] != 0) + flags[CROSSABLE_TERRAIN_LIQUID] |= 0x20; + if (var_4C[6] != 0 && var_2C[7] && var_4C[0] != 0) + flags[CROSSABLE_TERRAIN_LIQUID] |= 0x80; + + if (var_4C[0] != 0) + flags[2] |= 1; + if (var_4C[2] != 0) + flags[2] |= 4; + if (var_4C[4] != 0) + flags[2] |= 0x10; + if (var_4C[6] != 0) + flags[2] |= 0x40; + + if (var_4C[0] != 0 && var_4C[1] != 0 && var_4C[2] != 0) + flags[CROSSABLE_TERRAIN_CREVICE] |= 2; + if (var_4C[2] != 0 && var_4C[3] != 0 && var_4C[4] != 0) + flags[CROSSABLE_TERRAIN_CREVICE] |= 8; + if (var_4C[4] != 0 && var_4C[5] != 0 && var_4C[6] != 0) + flags[CROSSABLE_TERRAIN_CREVICE] |= 0x20; + if (var_4C[6] != 0 && var_4C[7] != 0 && var_4C[0] != 0) + flags[CROSSABLE_TERRAIN_CREVICE] |= 0x80; + + flags[3] = 0xFF; + if (x <= 1) + flags[CROSSABLE_TERRAIN_WALL] = 0x1F; + if (y <= 1) + flags[CROSSABLE_TERRAIN_WALL] &= ~(0x8 | 0x10 | 0x20); + if (x > 53) + flags[CROSSABLE_TERRAIN_WALL] &= ~(0x2 | 0x4 | 0x8); + if (y > 29) + flags[CROSSABLE_TERRAIN_WALL] &= ~(0x80 | 0x1 | 0x2); + + GetTileSafe(x, y)->walkableNeighborFlags[CROSSABLE_TERRAIN_REGULAR] = flags[CROSSABLE_TERRAIN_REGULAR]; + GetTileSafe(x, y)->walkableNeighborFlags[CROSSABLE_TERRAIN_LIQUID] = flags[CROSSABLE_TERRAIN_LIQUID]; + GetTileSafe(x, y)->walkableNeighborFlags[CROSSABLE_TERRAIN_CREVICE] = flags[CROSSABLE_TERRAIN_CREVICE]; + GetTileSafe(x, y)->walkableNeighborFlags[CROSSABLE_TERRAIN_WALL] = flags[CROSSABLE_TERRAIN_WALL]; +}