diff --git a/asm/non_matching/common/DrawDungeonMap.inc b/asm/non_matching/common/DrawDungeonMap.inc deleted file mode 100644 index d71568a1..00000000 --- a/asm/non_matching/common/DrawDungeonMap.inc +++ /dev/null @@ -1,221 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - sub sp, #4 - adds r4, r0, #0 - adds r5, r1, #0 - adds r1, r2, #0 - adds r0, r5, #0 - bl MemClear - movs r0, #1 - strb r0, [r5] - ldr r2, _0801DBE4 @ =gRoomTransition - ldrh r0, [r2, #0x1c] - lsrs r0, r0, #4 - movs r1, #0x7f - ands r0, r1 - strb r0, [r5, #1] - ldrh r0, [r2, #0x1e] - lsrs r0, r0, #4 - ands r0, r1 - strb r0, [r5, #2] - adds r5, #3 - ldr r1, _0801DBE8 @ =gUnk_080C9C50 - ldr r0, _0801DBEC @ =gArea - ldrb r0, [r0, #3] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - lsls r4, r4, #2 - adds r4, r4, r0 - ldr r6, [r4] - b _0801DD3A - .align 2, 0 -_0801DBE4: .4byte gRoomTransition -_0801DBE8: .4byte gUnk_080C9C50 -_0801DBEC: .4byte gArea -_0801DBF0: - ldrb r0, [r6] - ldrb r1, [r6, #1] - movs r2, #3 - bl GetRoomProperty - adds r4, r0, #0 - cmp r4, #0 - bne _0801DC04 - adds r6, #8 - b _0801DD3A -_0801DC04: - adds r0, r6, #0 - bl sub_0801DF10 - mov r8, r0 - bl HasDungeonBigKey - movs r1, #8 - adds r1, r1, r6 - mov sb, r1 - cmp r0, #0 - beq _0801DCAE - ldrb r0, [r4] - cmp r0, #0 - beq _0801DCAE - movs r3, #0xfc - lsls r3, r3, #2 - ldr r7, _0801DC84 @ =0x000007FF -_0801DC26: - ldrb r0, [r4] - cmp r0, #3 - bgt _0801DCA6 - cmp r0, #2 - blt _0801DCA6 - ldrb r1, [r4, #1] - mov r0, r8 - str r3, [sp] - bl CheckLocalFlagByBank - ldr r3, [sp] - cmp r0, #0 - bne _0801DCA6 - ldr r0, _0801DC88 @ =gAreaRoomHeaders - ldrb r2, [r6] - lsls r2, r2, #2 - adds r2, r2, r0 - ldrb r1, [r6, #1] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r1, [r2] - adds r2, r1, r0 - movs r0, #2 - strb r0, [r5] - ldrb r0, [r4] - cmp r0, #2 - bne _0801DC8C - ldrh r0, [r4, #4] - lsls r0, r0, #4 - ands r0, r3 - movs r1, #8 - orrs r0, r1 - ldrh r1, [r2] - ands r1, r7 - adds r0, r0, r1 - asrs r0, r0, #4 - strb r0, [r5, #1] - ldrh r0, [r4, #4] - lsrs r0, r0, #2 - ands r0, r3 - movs r1, #8 - orrs r0, r1 - ldrh r1, [r2, #2] - ands r1, r7 - b _0801DC9E - .align 2, 0 -_0801DC84: .4byte 0x000007FF -_0801DC88: .4byte gAreaRoomHeaders -_0801DC8C: - ldrh r0, [r2] - ands r0, r7 - ldrh r1, [r4, #4] - adds r0, r0, r1 - asrs r0, r0, #4 - strb r0, [r5, #1] - ldrh r0, [r2, #2] - ands r0, r7 - ldrh r1, [r4, #6] -_0801DC9E: - adds r0, r0, r1 - asrs r0, r0, #4 - strb r0, [r5, #2] - adds r5, #3 -_0801DCA6: - adds r4, #8 - ldrb r0, [r4] - cmp r0, #0 - bne _0801DC26 -_0801DCAE: - bl HasDungeonBigKey - cmp r0, #0 - beq _0801DD16 - ldrb r1, [r6, #2] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _0801DD16 - ldr r0, _0801DD4C @ =gArea - ldrb r0, [r0, #3] - adds r0, #1 - bl CheckGlobalFlag - cmp r0, #0 - bne _0801DD16 - ldr r0, _0801DD50 @ =gAreaRoomHeaders - ldrb r2, [r6] - lsls r2, r2, #2 - adds r2, r2, r0 - ldrb r1, [r6, #1] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r1, [r2] - adds r2, r1, r0 - movs r0, #4 - strb r0, [r5] - ldrh r0, [r2, #4] - lsrs r0, r0, #1 - ldrh r1, [r2] - adds r0, r0, r1 - asrs r1, r0, #4 - adds r0, r1, #0 - cmp r1, #0 - bge _0801DCF8 - adds r0, #0x7f -_0801DCF8: - asrs r0, r0, #7 - lsls r0, r0, #7 - subs r0, r1, r0 - strb r0, [r5, #1] - ldrh r0, [r2, #6] - lsrs r0, r0, #1 - ldrh r2, [r2, #2] - adds r0, r0, r2 - asrs r1, r0, #4 - adds r0, r1, #0 - asrs r0, r0, #7 - lsls r0, r0, #7 - subs r0, r1, r0 - strb r0, [r5, #2] - adds r5, #3 -_0801DD16: - ldr r2, _0801DD54 @ =gRoomTransition - ldrh r0, [r6] - ldrh r1, [r2, #0x16] - cmp r0, r1 - bne _0801DD38 - movs r0, #3 - strb r0, [r5] - ldrh r0, [r2, #0x18] - lsrs r0, r0, #4 - movs r1, #0x7f - ands r0, r1 - strb r0, [r5, #1] - ldrh r0, [r2, #0x1a] - lsrs r0, r0, #4 - ands r0, r1 - strb r0, [r5, #2] - adds r5, #3 -_0801DD38: - mov r6, sb -_0801DD3A: - ldrb r0, [r6] - cmp r0, #0 - beq _0801DD42 - b _0801DBF0 -_0801DD42: - add sp, #4 - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0801DD4C: .4byte gArea -_0801DD50: .4byte gAreaRoomHeaders -_0801DD54: .4byte gRoomTransition - .syntax divided diff --git a/src/common.c b/src/common.c index 909dd944..a5f8d2d7 100644 --- a/src/common.c +++ b/src/common.c @@ -85,6 +85,24 @@ u32 sub_0801DF60(u32 a1, u8* p); u32 sub_0801DF78(u32 a1, u32 a2); void sub_0801DF28(u32 x, u32 y, s32 color); +extern void* GetRoomProperty(u32, u32, u32); + +enum DungeonMapObjectTypes { + DMO_TYPE_NONE, + DMO_TYPE_PLAYER, + DMO_TYPE_CHEST, + DMO_TYPE_ENTRY, + DMO_TYPE_BOSS, +}; + +typedef struct { + u8 type; /**< @see DungeonMapObjectTypes */ + u8 x; + u8 y; +} PACKED DungeonMapObject; + +// More like PrepareTileEntitesForDungeonMap or so + u32 DecToHex(u32 value) { u32 result; register u32 r1 asm("r1"); @@ -406,7 +424,74 @@ u32 sub_0801DB94(void) { return gRoomTransition.player_status.dungeon_map_y >> 11; } -ASM_FUNC("asm/non_matching/common/DrawDungeonMap.inc", void DrawDungeonMap(u32 floor, void* data, u32 size)); +void DrawDungeonMap(u32 floor, DungeonMapObject* specialData, u32 size) { + DungeonLayout* floorMapData; + TileEntity* tileEntity; + u32 flagBankOffset; + RoomHeader* roomHeader; + s32 tmp1; + s32 tmp3; + + MemClear(specialData, size); + specialData->type = DMO_TYPE_PLAYER; + specialData->x = (gRoomTransition.player_status.dungeon_map_x >> 4) & 0x7f; + specialData->y = (gRoomTransition.player_status.dungeon_map_y >> 4) & 0x7f; + specialData++; + floorMapData = (DungeonLayout*)gUnk_080C9C50[gArea.dungeon_idx][floor]; + while (floorMapData->area != 0) { + tileEntity = (TileEntity*)GetRoomProperty(floorMapData->area, floorMapData->room, 3); + if (tileEntity == NULL) { + floorMapData++; + } else { + flagBankOffset = sub_0801DF10(floorMapData); + if (HasDungeonBigKey()) { + while (tileEntity->type != 0) { + switch (tileEntity->type) { + case SMALL_CHEST: + case BIG_CHEST: + if (!CheckLocalFlagByBank(flagBankOffset, tileEntity->localFlag)) { + roomHeader = gAreaRoomHeaders[floorMapData->area] + floorMapData->room; + specialData->type = DMO_TYPE_CHEST; + if (tileEntity->type == SMALL_CHEST) { + specialData->x = + ((((tileEntity->tilePos << 4 & 0x3f0) | 8) + (roomHeader->map_x % 0x800)) >> 4); + specialData->y = + ((((tileEntity->tilePos >> 2 & 0x3f0) | 8) + (roomHeader->map_y % 0x800)) >> 4); + } else { + specialData->x = (((roomHeader->map_x % 0x800) + tileEntity->tilePos) >> 4); + specialData->y = (((roomHeader->map_y % 0x800) + (*(u16*)&tileEntity->_6)) >> 4); + } + specialData++; + } + break; + } + tileEntity++; + } + } + if ((HasDungeonBigKey() && ((floorMapData->unk_2 & 2) != 0)) && (!CheckGlobalFlag(gArea.dungeon_idx + 1))) { + roomHeader = gAreaRoomHeaders[floorMapData->area] + floorMapData->room; + specialData->type = DMO_TYPE_BOSS; + tmp1 = ((roomHeader->pixel_width / 2) + roomHeader->map_x) / 16; + if (tmp1 < 0) { + tmp1 = tmp1 + 0x7f; + } + specialData->x = tmp1 + (tmp1 / 128) * -128; + tmp3 = ((roomHeader->pixel_height / 2) + roomHeader->map_y) / 16; + specialData->y = tmp3 + (tmp3 / 128) * -128; + specialData++; + } + if (floorMapData->area == gRoomTransition.player_status.dungeon_area && + floorMapData->room == gRoomTransition.player_status.dungeon_room) { + specialData->type = DMO_TYPE_ENTRY; + // TODO rename dungeon_x and dungeon_y to dungeonEntryX/Y? + specialData->x = ((u16)gRoomTransition.player_status.dungeon_x >> 4) & 0x7f; + specialData->y = ((u16)gRoomTransition.player_status.dungeon_y >> 4) & 0x7f; + specialData++; + } + floorMapData++; + } + } +} void sub_0801DD58(u32 area, u32 room) { RoomHeader* hdr = gAreaRoomHeaders[area] + room;