diff options
| author | Roman971 <32455037+Roman971@users.noreply.github.com> | 2020-05-01 17:09:20 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-01 11:09:20 -0400 |
| commit | 9f98210488073f1b5c8136152b95e3fc8970b6e4 (patch) | |
| tree | 9793615dfb0a6580cfb93bfbb9f8f5d6412f3a3e /src/code | |
| parent | 9f1c996db5590edf0d612aeaeb10492f4391e8dc (diff) | |
Decompile z_map_exp.c (2 non matchings left) (#104)
Also documented the map data table (not decompiled yet however), and added a DungeonItem enum to use with gSaveContext.dungeonItems reads/writes.
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/z_actor.c | 9 | ||||
| -rw-r--r-- | src/code/z_construct.c | 28 | ||||
| -rw-r--r-- | src/code/z_elf_message.c | 2 | ||||
| -rw-r--r-- | src/code/z_lifemeter.c | 2 | ||||
| -rw-r--r-- | src/code/z_map_exp.c | 605 | ||||
| -rw-r--r-- | src/code/z_map_mark.c | 34 | ||||
| -rw-r--r-- | src/code/z_parameter.c | 30 | ||||
| -rw-r--r-- | src/code/z_room.c | 4 |
8 files changed, 646 insertions, 68 deletions
diff --git a/src/code/z_actor.c b/src/code/z_actor.c index aa3b4999c..decdcc605 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -2753,11 +2753,10 @@ Actor* Actor_Spawn(ActorContext* actorCtx, GlobalContext* globalCtx, s16 actorId overlayEntry->nbLoaded = 0; } - actorInit = - (ActorInit*)((u32)(overlayEntry->initInfo != NULL - ? (ActorInit*)((u32)overlayEntry->initInfo - (s32)((u32)overlayEntry->vramStart - - (u32)overlayEntry->loadedRamAddr)) - : NULL)); + actorInit = (void*)(u32)((overlayEntry->initInfo != NULL) + ? (void*)((u32)overlayEntry->initInfo - + (s32)((u32)overlayEntry->vramStart - (u32)overlayEntry->loadedRamAddr)) + : NULL); } objBankIndex = Object_GetIndex(&globalCtx->objectCtx, actorInit->objectId); diff --git a/src/code/z_construct.c b/src/code/z_construct.c index 75ac3d50a..e6788647a 100644 --- a/src/code/z_construct.c +++ b/src/code/z_construct.c @@ -2,7 +2,7 @@ #include <global.h> void func_80110990(GlobalContext* globalCtx) { - func_80080F44(globalCtx); + Map_Destroy(globalCtx); } #ifdef NON_MATCHING @@ -165,7 +165,7 @@ void func_801109B0(GlobalContext* globalCtx) { osSyncPrintf("PARAMETER領域=%x\n", parameterSize + 0x5300); Health_InitData(globalCtx); - func_80080F68(globalCtx); + Map_Init(globalCtx); interfaceCtx->unk_242 = 0; interfaceCtx->unk_23C = 0; @@ -483,9 +483,9 @@ void func_80111070(void) { WREG(26) = -0x28; WREG(27) = 0; WREG(28) = 0; - WREG(29) = 0xEE; - WREG(30) = 0xA4; - WREG(31) = 0; + R_OW_MINIMAP_X = 0xEE; + R_OW_MINIMAP_Y = 0xA4; + R_MINIMAP_TOGGLED = 0; WREG(32) = 0x7A; WREG(33) = 0x3C; WREG(35) = 0; @@ -520,8 +520,8 @@ void func_80111070(void) { WREG(64) = -0x25; WREG(65) = 0x1E; WREG(66) = -0x32; - WREG(68) = 0xCC; - WREG(69) = 0x8C; + R_DGN_MINIMAP_X = 0xCC; + R_DGN_MINIMAP_Y = 0x8C; WREG(87) = 0x50; WREG(88) = 0x46; WREG(89) = 0x28; @@ -543,13 +543,13 @@ void func_80111070(void) { VREG(7) = 0x4E; VREG(8) = 0xA6; VREG(9) = 0x28; - VREG(14) = 0x20; - VREG(15) = 0x20; - VREG(16) = 0x6E; - VREG(17) = -0x2E4; - VREG(18) = 0; - VREG(19) = 0xFF; - VREG(20) = 0xFF; + R_COMPASS_SCALE_X = 0x20; + R_COMPASS_SCALE_Y = 0x20; + R_COMPASS_OFFSET_X = 0x6E; + R_COMPASS_OFFSET_Y = -0x2E4; + R_MINIMAP_COLOR(0) = 0; + R_MINIMAP_COLOR(1) = 0xFF; + R_MINIMAP_COLOR(2) = 0xFF; } VREG(21) = 0; diff --git a/src/code/z_elf_message.c b/src/code/z_elf_message.c index e37756c6d..0342e8468 100644 --- a/src/code/z_elf_message.c +++ b/src/code/z_elf_message.c @@ -25,7 +25,7 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) { return ((msg->byte0 & 1) == 1) == !!(gSaveContext.eventChkInf[(msg->byte1 & 0xF0) >> 4] & temp); case 2: return ((msg->byte0 & 1) == 1) == - !!(gBitFlags[msg->byte1 - ITEM_KEY_BOSS] & gSaveContext.dungeonItems[gSaveContext.dungeonIndex]); + !!(gBitFlags[msg->byte1 - ITEM_KEY_BOSS] & gSaveContext.dungeonItems[gSaveContext.mapIndex]); case 4: return ((msg->byte0 & 1) == 1) == (msg->byte3 == INV_CONTENT(msg->byte1)); case 6: diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c index 9cc05db1c..63c328ce6 100644 --- a/src/code/z_lifemeter.c +++ b/src/code/z_lifemeter.c @@ -184,7 +184,7 @@ s32 func_80078E84(GlobalContext* globalCtx) { return 0; } -void Interface_DrawHealth(GlobalContext* globalCtx) { +void Health_Draw(GlobalContext* globalCtx) { s32 pad[5]; u8* heartBgImg; u32 curColorSet; diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c index b740bba3c..6505d207d 100644 --- a/src/code/z_map_exp.c +++ b/src/code/z_map_exp.c @@ -1,24 +1,607 @@ #include <ultra64.h> #include <global.h> +#include <vt.h> -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_800807A0.s") +MapData* gMapData; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_800807FC.s") +s16 sPlayerInitialPosX = 0; +s16 sPlayerInitialPosZ = 0; +s16 sPlayerInitialDirection = 0; +s16 sEntranceIconMapIndex = 0; +s16 sLastRoomNum = 99; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_800808FC.s") +void Map_SavePlayerInitialInfo(GlobalContext* globalCtx) { + Player* player = PLAYER; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80080AB4.s") + sPlayerInitialPosX = player->actor.posRot.pos.x; + sPlayerInitialPosZ = player->actor.posRot.pos.z; + sPlayerInitialDirection = (s16)((0x7FFF - player->actor.shape.rot.y) / 0x400); +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80080E04.s") +void Map_SetPaletteData(GlobalContext* globalCtx, s16 room) { + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + s16 paletteNum = gMapData->roomPalette[mapIndex][room]; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80080F44.s") + if (interfaceCtx->mapRoomNum == room) { + interfaceCtx->mapPaletteNum = paletteNum; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80080F68.s") + osSyncPrintf(VT_FGCOL(YELLOW)); + // Translates to: "PALETE Set" + osSyncPrintf("PALETEセット 【 i=%x : room=%x 】Room_Inf[%d][4]=%x ( map_palete_no = %d )\n", paletteNum, + room, mapIndex, gSaveContext.sceneFlags[mapIndex].rooms, interfaceCtx->mapPaletteNum); + osSyncPrintf(VT_RST); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80081240.s") + interfaceCtx->unk_140[paletteNum * 2] = 2; + interfaceCtx->unk_140[paletteNum * 2 + 1] = 0xBF; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/Interface_DrawMinimap.s") +void Map_SetFloorPalettesData(GlobalContext* globalCtx, s16 floor) { + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + s16 room; + s16 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_80082248.s") + for (i = 0; i < 16; i++) { + interfaceCtx->unk_140[i] = 0; + interfaceCtx->unk_140[i + 16] = 0; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/func_8008226C.s") + if (gSaveContext.dungeonItems[mapIndex] & gBitFlags[DUNGEON_MAP]) { + interfaceCtx->unk_140[30] = 0; + interfaceCtx->unk_140[31] = 1; + } + + switch (globalCtx->sceneNum) { + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_YDAN_BOSS: + case SCENE_DDAN_BOSS: + case SCENE_BDAN_BOSS: + case SCENE_MORIBOSSROOM: + case SCENE_FIRE_BS: + case SCENE_MIZUSIN_BS: + case SCENE_JYASINBOSS: + case SCENE_HAKADAN_BS: + for (i = 0; i < gMapData->maxPaletteCount[mapIndex]; i++) { + room = gMapData->paletteRoom[mapIndex][floor][i]; + if ((room != 0xFF) && (gSaveContext.sceneFlags[mapIndex].rooms & gBitFlags[room])) { + Map_SetPaletteData(globalCtx, room); + } + } + break; + } +} + +void Map_InitData(GlobalContext* globalCtx, s16 room) { + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + s16 extendedMapIndex; + + switch (globalCtx->sceneNum) { + case SCENE_SPOT00: + case SCENE_SPOT01: + case SCENE_SPOT02: + case SCENE_SPOT03: + case SCENE_SPOT04: + case SCENE_SPOT05: + case SCENE_SPOT06: + case SCENE_SPOT07: + case SCENE_SPOT08: + case SCENE_SPOT09: + case SCENE_SPOT10: + case SCENE_SPOT11: + case SCENE_SPOT12: + case SCENE_SPOT13: + case SCENE_SPOT15: + case SCENE_SPOT16: + case SCENE_SPOT17: + case SCENE_SPOT18: + case SCENE_SPOT20: + case SCENE_GANON_TOU: + extendedMapIndex = mapIndex; + if (globalCtx->sceneNum == SCENE_SPOT02) { + if (CHECK_QUEST_ITEM(QUEST_SONG_NOCTURNE)) { + extendedMapIndex = 0x14; + } + } else if (globalCtx->sceneNum == SCENE_SPOT06) { + if ((LINK_AGE_IN_YEARS == YEARS_ADULT) && !CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) { + extendedMapIndex = 0x15; + } + } else if (globalCtx->sceneNum == SCENE_SPOT09) { + if ((LINK_AGE_IN_YEARS == YEARS_ADULT) && !((gSaveContext.eventChkInf[9] & 0xF) == 0xF)) { + extendedMapIndex = 0x16; + } + } else if (globalCtx->sceneNum == SCENE_SPOT12) { + if ((gSaveContext.eventChkInf[9] & 0xF) == 0xF) { + extendedMapIndex = 0x17; + } + } + osSyncPrintf(VT_FGCOL(BLUE)); + osSyncPrintf("KKK=%d\n", extendedMapIndex); + osSyncPrintf(VT_RST); + sEntranceIconMapIndex = extendedMapIndex; + DmaMgr_SendRequest1(interfaceCtx->mapSegment, + (u32)_map_grand_staticSegmentRomStart + gMapData->owMinimapTexOffset[extendedMapIndex], + gMapData->owMinimapTexSize[mapIndex], "../z_map_exp.c", 309); + interfaceCtx->unk_258 = mapIndex; + break; + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_YDAN_BOSS: + case SCENE_DDAN_BOSS: + case SCENE_BDAN_BOSS: + case SCENE_MORIBOSSROOM: + case SCENE_FIRE_BS: + case SCENE_MIZUSIN_BS: + case SCENE_JYASINBOSS: + case SCENE_HAKADAN_BS: + osSyncPrintf(VT_FGCOL(YELLOW)); + // Translates to: "Deku Tree Dungeon MAP Texture DMA" + osSyncPrintf("デクの樹ダンジョンMAP テクスチャDMA(%x) scene_id_offset=%d VREG(30)=%d\n", room, + mapIndex, VREG(30)); + osSyncPrintf(VT_RST); + DmaMgr_SendRequest1(globalCtx->interfaceCtx.mapSegment, + (u32)_map_i_staticSegmentRomStart + + ((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0), + 0xFF0, "../z_map_exp.c", 346); + R_COMPASS_OFFSET_X = gMapData->roomCompassOffsetX[mapIndex][room]; + R_COMPASS_OFFSET_Y = gMapData->roomCompassOffsetY[mapIndex][room]; + Map_SetFloorPalettesData(globalCtx, VREG(30)); + // Translates to: "MAP Individual Floor ON Check" + osSyncPrintf("MAP 各階ONチェック\n"); + break; + } +} + +void Map_InitRoomData(GlobalContext* globalCtx, s16 room) { + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + + osSyncPrintf("*******\n*******\nroom_no=%d (%d)(%d)\n*******\n*******\n", room, + mapIndex, globalCtx->sceneNum); + + if (room >= 0) { + switch (globalCtx->sceneNum) { + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_YDAN_BOSS: + case SCENE_DDAN_BOSS: + case SCENE_BDAN_BOSS: + case SCENE_MORIBOSSROOM: + case SCENE_FIRE_BS: + case SCENE_MIZUSIN_BS: + case SCENE_JYASINBOSS: + case SCENE_HAKADAN_BS: + gSaveContext.sceneFlags[mapIndex].rooms |= gBitFlags[room]; + osSyncPrintf("ROOM_INF=%d\n", gSaveContext.sceneFlags[mapIndex].rooms); + interfaceCtx->mapRoomNum = room; + interfaceCtx->unk_25A = mapIndex; + Map_SetPaletteData(globalCtx, room); + osSyncPrintf(VT_FGCOL(YELLOW)); + osSyncPrintf("部屋部屋=%d\n", room); // "Room Room = %d" + osSyncPrintf(VT_RST); + Map_InitData(globalCtx, room); + break; + } + } else { + interfaceCtx->mapRoomNum = 0; + } + + if (gSaveContext.unk_1422 != 2) { + gSaveContext.unk_1422 = 0; + } +} + +void Map_Destroy(GlobalContext* globalCtx) { + MapMark_ClearPointers(globalCtx); + gMapData = NULL; +} + +void Map_Init(GlobalContext* globalCtx) { + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + + gMapData = &gMapDataTable; + + interfaceCtx->unk_258 = -1; + interfaceCtx->unk_25A = -1; + + interfaceCtx->mapSegment = Game_Alloc(&globalCtx->state, 0x1000, "../z_map_exp.c", 457); + // Translates to "MAP TEXTURE INITIALIZATION scene_data_ID=%d mapSegment=%x" + osSyncPrintf("\n\n\nMAP テクスチャ初期化 scene_data_ID=%d\nmapSegment=%x\n\n", globalCtx->sceneNum, + interfaceCtx->mapSegment, globalCtx); + if (interfaceCtx->mapSegment == NULL) { + __assert("parameter->mapSegment != NULL", "../z_map_exp.c", 459); + } + + switch (globalCtx->sceneNum) { + case SCENE_SPOT00: + case SCENE_SPOT01: + case SCENE_SPOT02: + case SCENE_SPOT03: + case SCENE_SPOT04: + case SCENE_SPOT05: + case SCENE_SPOT06: + case SCENE_SPOT07: + case SCENE_SPOT08: + case SCENE_SPOT09: + case SCENE_SPOT10: + case SCENE_SPOT11: + case SCENE_SPOT12: + case SCENE_SPOT13: + case SCENE_SPOT15: + case SCENE_SPOT16: + case SCENE_SPOT17: + case SCENE_SPOT18: + case SCENE_SPOT20: + case SCENE_GANON_TOU: + mapIndex = globalCtx->sceneNum - SCENE_SPOT00; + R_MAP_INDEX = gSaveContext.mapIndex = mapIndex; + R_COMPASS_SCALE_X = gMapData->owCompassInfo[mapIndex][0]; + R_COMPASS_SCALE_Y = gMapData->owCompassInfo[mapIndex][1]; + R_COMPASS_OFFSET_X = gMapData->owCompassInfo[mapIndex][2]; + R_COMPASS_OFFSET_Y = gMapData->owCompassInfo[mapIndex][3]; + Map_InitData(globalCtx, mapIndex); + R_OW_MINIMAP_X = gMapData->owMinimapPosX[mapIndex]; + R_OW_MINIMAP_Y = gMapData->owMinimapPosY[mapIndex]; + break; + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_GANON: + case SCENE_MEN: + case SCENE_GERUDOWAY: + case SCENE_GANONTIKA: + case SCENE_GANON_SONOGO: + case SCENE_GANONTIKA_SONOGO: + case SCENE_TAKARAYA: + case SCENE_YDAN_BOSS: + case SCENE_DDAN_BOSS: + case SCENE_BDAN_BOSS: + case SCENE_MORIBOSSROOM: + case SCENE_FIRE_BS: + case SCENE_MIZUSIN_BS: + case SCENE_JYASINBOSS: + case SCENE_HAKADAN_BS: + mapIndex = + (globalCtx->sceneNum >= SCENE_YDAN_BOSS) ? globalCtx->sceneNum - SCENE_YDAN_BOSS : globalCtx->sceneNum; + R_MAP_INDEX = gSaveContext.mapIndex = mapIndex; + if ((globalCtx->sceneNum <= SCENE_ICE_DOUKUTO) || (globalCtx->sceneNum >= SCENE_YDAN_BOSS)) { + R_COMPASS_SCALE_X = gMapData->dgnCompassInfo[mapIndex][0]; + R_COMPASS_SCALE_Y = gMapData->dgnCompassInfo[mapIndex][1]; + R_COMPASS_OFFSET_X = gMapData->dgnCompassInfo[mapIndex][2]; + R_COMPASS_OFFSET_Y = gMapData->dgnCompassInfo[mapIndex][3]; + R_MAP_TEX_INDEX = R_MAP_TEX_INDEX_BASE = gMapData->dgnMinimapTexIndexBase[mapIndex]; + Map_InitRoomData(globalCtx, globalCtx->roomCtx.curRoom.num); + MapMark_Init(globalCtx); + } + break; + } +} + +#ifdef NON_MATCHING +// regalloc and minor ordering differences +void Minimap_DrawCompassIcons(GlobalContext* globalCtx) { + GraphicsContext* gfxCtx; + Player* player = PLAYER; + s16 tempX, tempY, tempZ; + Gfx* dispRefs[4]; + + gfxCtx = globalCtx->state.gfxCtx; + Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_map_exp.c", 565); + + if (globalCtx->interfaceCtx.minimapAlpha >= 0xAA) { + func_80094A14(globalCtx->state.gfxCtx); + + gSPMatrix(gfxCtx->overlay.p++, &gMtxClear, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetCombineLERP(gfxCtx->overlay.p++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetEnvColor(gfxCtx->overlay.p++, 0x00, 0x00, 0x00, 0xFF); + gDPSetCombineMode(gfxCtx->overlay.p++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + + tempX = player->actor.posRot.pos.x; + tempZ = player->actor.posRot.pos.z; + tempX /= R_COMPASS_SCALE_X; + tempZ /= R_COMPASS_SCALE_Y; + Matrix_Translate((R_COMPASS_OFFSET_X + tempX) / 10.0f, (R_COMPASS_OFFSET_Y - tempZ) / 10.0f, 0.0f, MTXMODE_NEW); + Matrix_Scale(0.4f, 0.4f, 0.4f, MTXMODE_APPLY); + Matrix_RotateX(-1.6f, MTXMODE_APPLY); + tempY = (0x7FFF - player->actor.shape.rot.y) / 0x400; + Matrix_RotateY(tempY / 10.0f, MTXMODE_APPLY); + gSPMatrix(gfxCtx->overlay.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_map_exp.c", 585), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xC8, 0xFF, 0x00, 0xFF); + gSPDisplayList(gfxCtx->overlay.p++, D_0400C820); + + tempX = sPlayerInitialPosX; + tempZ = sPlayerInitialPosZ; + tempX /= R_COMPASS_SCALE_X; + tempZ /= R_COMPASS_SCALE_Y; + Matrix_Translate((R_COMPASS_OFFSET_X + tempX) / 10.0f, (R_COMPASS_OFFSET_Y - tempZ) / 10.0f, 0.0f, MTXMODE_NEW); + Matrix_Scale(VREG(9) / 100.0f, VREG(9) / 100.0f, VREG(9) / 100.0f, MTXMODE_APPLY); + Matrix_RotateX(VREG(52) / 10.0f, MTXMODE_APPLY); + Matrix_RotateY(sPlayerInitialDirection / 10.0f, MTXMODE_APPLY); + gSPMatrix(gfxCtx->overlay.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_map_exp.c", 603), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0xFF, 0xC8, 0x00, 0x00, 0xFF); + gSPDisplayList(gfxCtx->overlay.p++, D_0400C820); + } + + Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_map_exp.c", 607); +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/Minimap_DrawCompassIcons.s") +#endif + +void Minimap_Draw(GlobalContext* globalCtx) { + s32 pad[2]; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + s32 mapIndex = gSaveContext.mapIndex; + GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; + Gfx* dispRefs[4]; + + Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_map_exp.c", 626); + + if (globalCtx->pauseCtx.state < 4) { + switch (globalCtx->sceneNum) { + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + if (!R_MINIMAP_TOGGLED) { + func_80094520(globalCtx->state.gfxCtx); + gDPSetCombineLERP(gfxCtx->overlay.p++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, + 0, TEXEL0, 0, PRIMITIVE, 0); + + if (gSaveContext.dungeonItems[mapIndex] & gBitFlags[DUNGEON_MAP]) { + gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0x64, 0xFF, 0xFF, interfaceCtx->minimapAlpha); + + gDPLoadTextureBlock_4b(gfxCtx->overlay.p++, interfaceCtx->mapSegment, G_IM_FMT_I, 96, 85, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle(gfxCtx->overlay.p++, R_DGN_MINIMAP_X << 2, R_DGN_MINIMAP_Y << 2, + (R_DGN_MINIMAP_X + 96) << 2, (R_DGN_MINIMAP_Y + 85) << 2, G_TX_RENDERTILE, + 0, 0, 1024, 1024); + } + + if (gSaveContext.dungeonItems[mapIndex] & gBitFlags[DUNGEON_COMPASS]) { + Minimap_DrawCompassIcons(globalCtx); // Draw icons for the player spawn and current position + func_80094520(globalCtx->state.gfxCtx); + MapMark_DrawConditionally(globalCtx); + } + } + + if (!~(globalCtx->state.input[0].press.in.button | ~L_TRIG) && !Gameplay_InCsMode(globalCtx)) { + osSyncPrintf("Game_play_demo_mode_check=%d\n", Gameplay_InCsMode(globalCtx)); + // clang-format off + if (!R_MINIMAP_TOGGLED) { Audio_PlaySoundGeneral(NA_SE_SY_CAMERA_ZOOM_UP, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); } + else { Audio_PlaySoundGeneral(NA_SE_SY_CAMERA_ZOOM_DOWN, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); } + // clang-format on + R_MINIMAP_TOGGLED ^= 1; + } + + break; + case SCENE_SPOT00: + case SCENE_SPOT01: + case SCENE_SPOT02: + case SCENE_SPOT03: + case SCENE_SPOT04: + case SCENE_SPOT05: + case SCENE_SPOT06: + case SCENE_SPOT07: + case SCENE_SPOT08: + case SCENE_SPOT09: + case SCENE_SPOT10: + case SCENE_SPOT11: + case SCENE_SPOT12: + case SCENE_SPOT13: + case SCENE_SPOT15: + case SCENE_SPOT16: + case SCENE_SPOT17: + case SCENE_SPOT18: + case SCENE_SPOT20: + case SCENE_GANON_TOU: + if (!R_MINIMAP_TOGGLED) { + func_80094520(globalCtx->state.gfxCtx); + + gDPSetCombineMode(gfxCtx->overlay.p++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), + R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha); + + gDPLoadTextureBlock_4b(gfxCtx->overlay.p++, interfaceCtx->mapSegment, G_IM_FMT_IA, + gMapData->owMinimapWidth[mapIndex], gMapData->owMinimapHeight[mapIndex], 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle(gfxCtx->overlay.p++, R_OW_MINIMAP_X << 2, R_OW_MINIMAP_Y << 2, + (R_OW_MINIMAP_X + gMapData->owMinimapWidth[mapIndex]) << 2, + (R_OW_MINIMAP_Y + gMapData->owMinimapHeight[mapIndex]) << 2, G_TX_RENDERTILE, 0, + 0, 1024, 1024); + + if (((globalCtx->sceneNum != SCENE_SPOT01) && (globalCtx->sceneNum != SCENE_SPOT04) && + (globalCtx->sceneNum != SCENE_SPOT08)) || + (LINK_AGE_IN_YEARS != YEARS_ADULT)) { + if ((gMapData->owEntranceFlag[sEntranceIconMapIndex] == 0xFFFF) || + ((gMapData->owEntranceFlag[sEntranceIconMapIndex] != 0xFFFF) && + (gSaveContext.infTable[26] & gBitFlags[gMapData->owEntranceFlag[mapIndex]]))) { + + gDPLoadTextureBlock(gfxCtx->overlay.p++, D_02002500, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 8, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle(gfxCtx->overlay.p++, + gMapData->owEntranceIconPosX[sEntranceIconMapIndex] << 2, + gMapData->owEntranceIconPosY[sEntranceIconMapIndex] << 2, + (gMapData->owEntranceIconPosX[sEntranceIconMapIndex] + 8) << 2, + (gMapData->owEntranceIconPosY[sEntranceIconMapIndex] + 8) << 2, + G_TX_RENDERTILE, 0, 0, 1024, 1024); + } + } + + if ((globalCtx->sceneNum == SCENE_SPOT08) && (gSaveContext.infTable[26] & gBitFlags[9])) { + gDPLoadTextureBlock(gfxCtx->overlay.p++, D_02002500, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 8, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + gSPTextureRectangle(gfxCtx->overlay.p++, 1080, 616, 1112, 648, G_TX_RENDERTILE, 0, 0, 1024, + 1024); + } + + Minimap_DrawCompassIcons(globalCtx); // Draw icons for the player spawn and current position + } + + if (!~(globalCtx->state.input[0].press.in.button | ~L_TRIG) && !Gameplay_InCsMode(globalCtx)) { + // clang-format off + if (!R_MINIMAP_TOGGLED) { Audio_PlaySoundGeneral(NA_SE_SY_CAMERA_ZOOM_UP, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); } + else { Audio_PlaySoundGeneral(NA_SE_SY_CAMERA_ZOOM_DOWN, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); } + // clang-format on + R_MINIMAP_TOGGLED ^= 1; + } + + break; + } + } + + Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_map_exp.c", 782); +} + +s16 Map_GetFloorTextIndexOffset(s32 mapIndex, s32 floor) { + return gMapData->floorTexIndexOffset[mapIndex][floor]; +} + +#ifdef NON_MATCHING +// single extra load instruction +void Map_Update(GlobalContext* globalCtx) { + Player* player = PLAYER; + s32 mapIndex = gSaveContext.mapIndex; + InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; + s16 floor; + s16 i; + + if ((globalCtx->pauseCtx.state == 0) && (globalCtx->pauseCtx.flag == 0)) { + switch (globalCtx->sceneNum) { + case SCENE_YDAN: + case SCENE_DDAN: + case SCENE_BDAN: + case SCENE_BMORI1: + case SCENE_HIDAN: + case SCENE_MIZUSIN: + case SCENE_JYASINZOU: + case SCENE_HAKADAN: + case SCENE_HAKADANCH: + case SCENE_ICE_DOUKUTO: + case SCENE_GANON: + case SCENE_MEN: + case SCENE_GERUDOWAY: + case SCENE_GANONTIKA: + case SCENE_GANON_SONOGO: + case SCENE_GANONTIKA_SONOGO: + case SCENE_TAKARAYA: + interfaceCtx->unk_140[30] = 0; + if (gSaveContext.dungeonItems[mapIndex] & gBitFlags[DUNGEON_MAP]) { + interfaceCtx->unk_140[31] = 1; + } else { + interfaceCtx->unk_140[31] = 0; + } + + for (floor = 0; floor < 8; floor++) { + if (player->actor.posRot.pos.y > gMapData->floorCoordY[mapIndex][floor]) { + break; + } + } + + if (1) { // Appears to be necessary to match + gSaveContext.sceneFlags[mapIndex].floors |= gBitFlags[floor]; + VREG(30) = floor; + if (R_MAP_TEX_INDEX != (R_MAP_TEX_INDEX_BASE + Map_GetFloorTextIndexOffset(mapIndex, floor))) { + R_MAP_TEX_INDEX = R_MAP_TEX_INDEX_BASE + Map_GetFloorTextIndexOffset(mapIndex, floor); + } + } + + if (interfaceCtx->mapRoomNum != sLastRoomNum) { + // Translates to "Current floor = %d Current room = %x Number of rooms = %d" + osSyncPrintf("現在階=%d 現在部屋=%x 部屋数=%d\n", floor, interfaceCtx->mapRoomNum, + gMapData->switchEntryCount[mapIndex]); + if (interfaceCtx->mapRoomNum) {} // Improves codegen but may not be necessary + sLastRoomNum = interfaceCtx->mapRoomNum; + } + + for (i = 0; i < gMapData->switchEntryCount[mapIndex]; i++) { + if ((interfaceCtx->mapRoomNum == gMapData->switchFromRoom[mapIndex][i]) && + (floor == gMapData->switchFromFloor[mapIndex][i])) { + interfaceCtx->mapRoomNum = gMapData->switchToRoom[mapIndex][i]; + osSyncPrintf(VT_FGCOL(YELLOW)); + osSyncPrintf("階層切替=%x\n", interfaceCtx->mapRoomNum); // "Layer switching = %x" + osSyncPrintf(VT_RST); + Map_InitData(globalCtx, interfaceCtx->mapRoomNum); + gSaveContext.unk_1422 = 0; + Map_SavePlayerInitialInfo(globalCtx); + } + } + + VREG(10) = interfaceCtx->mapRoomNum; + break; + case SCENE_YDAN_BOSS: + case SCENE_DDAN_BOSS: + case SCENE_BDAN_BOSS: + case SCENE_MORIBOSSROOM: + case SCENE_FIRE_BS: + case SCENE_MIZUSIN_BS: + case SCENE_JYASINBOSS: + case SCENE_HAKADAN_BS: + VREG(30) = gMapData->bossFloor[globalCtx->sceneNum - SCENE_YDAN_BOSS]; + R_MAP_TEX_INDEX = R_MAP_TEX_INDEX_BASE + + gMapData->floorTexIndexOffset[globalCtx->sceneNum - SCENE_YDAN_BOSS][VREG(30)]; + break; + } + } +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/z_map_exp/Map_Update.s") +#endif diff --git a/src/code/z_map_mark.c b/src/code/z_map_mark.c index 8fdef5d0c..798ec5874 100644 --- a/src/code/z_map_mark.c +++ b/src/code/z_map_mark.c @@ -18,9 +18,9 @@ typedef struct { /* 0x00 */ void* loadedRamAddr; // original name: "allocp" /* 0x04 */ u32 vromStart; /* 0x08 */ u32 vromEnd; - /* 0x0C */ u32 vramStart; - /* 0x10 */ u32 vramEnd; - /* 0x14 */ u32 vramTable; + /* 0x0C */ void* vramStart; + /* 0x10 */ void* vramEnd; + /* 0x14 */ void* vramTable; } MapMarkDataOverlay; // size = 0x18 static u32 sBaseImageSizes[] = { 0, 1, 2, 3 }; @@ -46,18 +46,16 @@ static MapMarkDataOverlay sMapMarkDataOvl = { NULL, (u32)_ovl_map_mark_dataSegmentRomStart, (u32)_ovl_map_mark_dataSegmentRomEnd, - (u32)_ovl_map_mark_dataSegmentStart, - (u32)_ovl_map_mark_dataSegmentEnd, - (u32)gMapMarkDataTable, + _ovl_map_mark_dataSegmentStart, + _ovl_map_mark_dataSegmentEnd, + gMapMarkDataTable, }; static MapMarksData** sLoadedMarkDataTable; -extern u8** D_8015FFD0; - void MapMark_Init(GlobalContext* globalCtx) { MapMarkDataOverlay* overlay = &sMapMarkDataOvl; - u32 overlaySize = overlay->vramEnd - overlay->vramStart; + u32 overlaySize = (u32)overlay->vramEnd - (u32)overlay->vramStart; overlay->loadedRamAddr = Game_Alloc(&globalCtx->state, overlaySize, "../z_map_mark.c", 235); LogUtils_CheckNullPointer("dlftbl->allocp", overlay->loadedRamAddr, "../z_map_mark.c", 236); @@ -65,10 +63,10 @@ void MapMark_Init(GlobalContext* globalCtx) { Overlay_Load(overlay->vromStart, overlay->vromEnd, overlay->vramStart, overlay->vramEnd, overlay->loadedRamAddr); sLoadedMarkDataTable = gMapMarkDataTable; - sLoadedMarkDataTable = - (void*)(s32)((overlay->vramTable != 0) - ? (void*)(overlay->vramTable - (s32)(overlay->vramStart - (s32)overlay->loadedRamAddr)) - : NULL); + sLoadedMarkDataTable = (void*)(u32)( + (overlay->vramTable != NULL) + ? (void*)((u32)overlay->vramTable - (s32)((u32)overlay->vramStart - (u32)overlay->loadedRamAddr)) + : NULL); } void MapMark_ClearPointers(GlobalContext* globalCtx) { @@ -81,24 +79,24 @@ void MapMark_Draw(GlobalContext* globalCtx) { MapMarkData* mapMarkData; MapMarkPoint* markPoint; MapMarkInfo* markInfo; - u16 dungeonId; + u16 dungeon; s32 i; s32 rectLeft; s32 rectTop; GraphicsContext* gfxCtx; Gfx* dispRefs[4]; - dungeonId = gSaveContext.dungeonIndex; + dungeon = gSaveContext.mapIndex; interfaceCtx = &globalCtx->interfaceCtx; - if ((D_8015FFD0 != NULL) && (globalCtx->interfaceCtx.roomNum >= D_8015FFD0[7][dungeonId])) { + if ((gMapData != NULL) && (globalCtx->interfaceCtx.mapRoomNum >= gMapData->dgnMinimapCount[dungeon])) { // Translates to: "ROOM NUMBER EXCEEDED, YIKES %d/%d MapMarkDraw PROCESSING INTERRUPTED" osSyncPrintf(VT_COL(RED, WHITE) "部屋番号がオーバーしてるで,ヤバイで %d/%d \nMapMarkDraw の処理を中断します\n", - VT_RST, globalCtx->interfaceCtx.roomNum, D_8015FFD0[7][dungeonId]); + VT_RST, globalCtx->interfaceCtx.mapRoomNum, gMapData->dgnMinimapCount[dungeon]); return; } - mapMarkData = &sLoadedMarkDataTable[dungeonId][interfaceCtx->roomNum][0]; + mapMarkData = &sLoadedMarkDataTable[dungeon][interfaceCtx->mapRoomNum][0]; gfxCtx = globalCtx->state.gfxCtx; Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_map_mark.c", 303); diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 860678a28..5c32f70c2 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -1413,14 +1413,14 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) { gSaveContext.equipment |= (gBitFlags[item - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]); return ITEM_NONE; } else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) { - gSaveContext.dungeonItems[gSaveContext.dungeonIndex] |= gBitFlags[item - ITEM_KEY_BOSS]; + gSaveContext.dungeonItems[gSaveContext.mapIndex] |= gBitFlags[item - ITEM_KEY_BOSS]; return ITEM_NONE; } else if (item == ITEM_KEY_SMALL) { - if (gSaveContext.dungeonKeys[gSaveContext.dungeonIndex] < 0) { - gSaveContext.dungeonKeys[gSaveContext.dungeonIndex] = 1; + if (gSaveContext.dungeonKeys[gSaveContext.mapIndex] < 0) { + gSaveContext.dungeonKeys[gSaveContext.mapIndex] = 1; return ITEM_NONE; } else { - gSaveContext.dungeonKeys[gSaveContext.dungeonIndex]++; + gSaveContext.dungeonKeys[gSaveContext.mapIndex]++; return ITEM_NONE; } } else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) { @@ -2130,9 +2130,8 @@ void Interface_SetNaviCall(GlobalContext* globalCtx, u16 naviCallState) { if (((naviCallState == 0x1D) || (naviCallState == 0x1E)) && !interfaceCtx->naviCalling && (globalCtx->csCtx.state == 0)) { // clang-format off - // NOLINTNEXTLINE - if (naviCallState == 0x1E) Audio_PlaySoundGeneral(NA_SE_VO_NAVY_CALL, &D_801333D4, 4, - &D_801333E0, &D_801333E0, &D_801333E8); + if (naviCallState == 0x1E) { Audio_PlaySoundGeneral(NA_SE_VO_NAVY_CALL, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); } // clang-format on if (naviCallState == 0x1D) { @@ -2178,10 +2177,9 @@ s32 Health_ChangeBy(GlobalContext* globalCtx, s16 healthChange) { gSaveContext.healthCapacity); // clang-format off - // NOLINTNEXTLINE - if (healthChange > 0) Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, - &D_801333E0, &D_801333E0, &D_801333E8); - else if ((gSaveContext.doubleDefense != 0) && (healthChange < 0)) { + if (healthChange > 0) { Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, + &D_801333E0, &D_801333E0, &D_801333E8); + } else if ((gSaveContext.doubleDefense != 0) && (healthChange < 0)) { healthChange >>= 1; // Translates to: "Heart decrease halved!!=%d" osSyncPrintf("ハート減少半分!!=%d\n", healthChange); @@ -3161,7 +3159,7 @@ void Interface_Draw(GlobalContext* globalCtx) { if (pauseCtx->flag == 0) { Interface_InitVertices(globalCtx); func_8008A994(interfaceCtx); - Interface_DrawHealth(globalCtx); + Health_Draw(globalCtx); func_80094520(globalCtx->state.gfxCtx); @@ -3185,7 +3183,7 @@ void Interface_Draw(GlobalContext* globalCtx) { case SCENE_GANON_SONOGO: case SCENE_GANONTIKA_SONOGO: case SCENE_TAKARAYA: - if (gSaveContext.dungeonKeys[gSaveContext.dungeonIndex] >= 0) { + if (gSaveContext.dungeonKeys[gSaveContext.mapIndex] >= 0) { // Small Key Icon gDPPipeSync(gfxCtx->overlay.p++); gDPSetPrimColor(gfxCtx->overlay.p++, 0, 0, 0xC8, 0xE6, 0xFF, interfaceCtx->magicAlpha); @@ -3200,7 +3198,7 @@ void Interface_Draw(GlobalContext* globalCtx) { PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); interfaceCtx->counterDigits[2] = 0; - interfaceCtx->counterDigits[3] = gSaveContext.dungeonKeys[gSaveContext.dungeonIndex]; + interfaceCtx->counterDigits[3] = gSaveContext.dungeonKeys[gSaveContext.mapIndex]; while (interfaceCtx->counterDigits[3] >= 10) { interfaceCtx->counterDigits[2]++; @@ -3268,7 +3266,7 @@ void Interface_Draw(GlobalContext* globalCtx) { } Interface_DrawMagicBar(globalCtx); - Interface_DrawMinimap(globalCtx); + Minimap_Draw(globalCtx); if ((R_PAUSE_MENU_MODE != 2) && (R_PAUSE_MENU_MODE != 3)) { func_8002C124(&globalCtx->actorCtx.targetCtx, globalCtx); // Draw Z-Target @@ -4099,7 +4097,7 @@ void Interface_Update(GlobalContext* globalCtx) { break; } - func_8008226C(globalCtx); + Map_Update(globalCtx); if (gSaveContext.healthAccumulator != 0) { gSaveContext.healthAccumulator -= 4; diff --git a/src/code/z_room.c b/src/code/z_room.c index 600f4e014..9fcd433f8 100644 --- a/src/code/z_room.c +++ b/src/code/z_room.c @@ -655,9 +655,9 @@ void func_80097534(GlobalContext* globalCtx, RoomContext* roomCtx) { roomCtx->prevRoom.segment = NULL; func_80031B14(globalCtx, &globalCtx->actorCtx); Actor_SpawnTransitionActors(globalCtx, &globalCtx->actorCtx); - func_80080E04(globalCtx, roomCtx->curRoom.num); + Map_InitRoomData(globalCtx, roomCtx->curRoom.num); if (!((globalCtx->sceneNum >= SCENE_SPOT00) && (globalCtx->sceneNum <= SCENE_SPOT20))) { - func_800807A0(globalCtx); + Map_SavePlayerInitialInfo(globalCtx); } func_800F66C0(globalCtx->roomCtx.curRoom.echo); } |
