mirror of
https://github.com/zeldaret/oot.git
synced 2024-11-15 06:06:04 +00:00
b010db7c19
* Decompile z_sram.c * rename Sram_CalcChecksum to Sram_WriteSaveSlot * progress * done i think * add original name comments * temp substructs * minor fixes * review * review 2 * fix Co-authored-by: fig <fig02srl@gmail.com>
584 lines
25 KiB
C
584 lines
25 KiB
C
#include "global.h"
|
||
#include "vt.h"
|
||
|
||
MapData* gMapData;
|
||
|
||
s16 sPlayerInitialPosX = 0;
|
||
s16 sPlayerInitialPosZ = 0;
|
||
s16 sPlayerInitialDirection = 0;
|
||
s16 sEntranceIconMapIndex = 0;
|
||
|
||
void Map_SavePlayerInitialInfo(GlobalContext* globalCtx) {
|
||
Player* player = PLAYER;
|
||
|
||
sPlayerInitialPosX = player->actor.posRot.pos.x;
|
||
sPlayerInitialPosZ = player->actor.posRot.pos.z;
|
||
sPlayerInitialDirection = (s16)((0x7FFF - player->actor.shape.rot.y) / 0x400);
|
||
}
|
||
|
||
void Map_SetPaletteData(GlobalContext* globalCtx, s16 room) {
|
||
s32 mapIndex = gSaveContext.mapIndex;
|
||
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
|
||
s16 paletteNum = gMapData->roomPalette[mapIndex][room];
|
||
|
||
if (interfaceCtx->mapRoomNum == room) {
|
||
interfaceCtx->mapPaletteNum = paletteNum;
|
||
}
|
||
|
||
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);
|
||
|
||
interfaceCtx->unk_140[paletteNum * 2] = 2;
|
||
interfaceCtx->unk_140[paletteNum * 2 + 1] = 0xBF;
|
||
}
|
||
|
||
void Map_SetFloorPalettesData(GlobalContext* globalCtx, s16 floor) {
|
||
s32 mapIndex = gSaveContext.mapIndex;
|
||
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
|
||
s16 room;
|
||
s16 i;
|
||
|
||
for (i = 0; i < 16; i++) {
|
||
interfaceCtx->unk_140[i] = 0;
|
||
interfaceCtx->unk_140[i + 16] = 0;
|
||
}
|
||
|
||
if (gSaveContext.inventory.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 = GameState_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;
|
||
}
|
||
}
|
||
|
||
void Minimap_DrawCompassIcons(GlobalContext* globalCtx) {
|
||
s32 pad;
|
||
Player* player = PLAYER;
|
||
s16 tempX, tempZ;
|
||
|
||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_map_exp.c", 565);
|
||
|
||
if (globalCtx->interfaceCtx.minimapAlpha >= 0xAA) {
|
||
func_80094A14(globalCtx->state.gfxCtx);
|
||
|
||
gSPMatrix(oGfxCtx->overlay.p++, &gMtxClear, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||
gDPSetCombineLERP(oGfxCtx->overlay.p++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
|
||
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
||
gDPSetEnvColor(oGfxCtx->overlay.p++, 0, 0, 0, 255);
|
||
gDPSetCombineMode(oGfxCtx->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);
|
||
tempX = (0x7FFF - player->actor.shape.rot.y) / 0x400;
|
||
Matrix_RotateY(tempX / 10.0f, MTXMODE_APPLY);
|
||
gSPMatrix(oGfxCtx->overlay.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_map_exp.c", 585),
|
||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||
|
||
gDPSetPrimColor(oGfxCtx->overlay.p++, 0, 0, 200, 255, 0, 255);
|
||
gSPDisplayList(oGfxCtx->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(oGfxCtx->overlay.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_map_exp.c", 603),
|
||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||
|
||
gDPSetPrimColor(oGfxCtx->overlay.p++, 0, 0xFF, 200, 0, 0, 255);
|
||
gSPDisplayList(oGfxCtx->overlay.p++, D_0400C820);
|
||
}
|
||
|
||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_map_exp.c", 607);
|
||
}
|
||
|
||
void Minimap_Draw(GlobalContext* globalCtx) {
|
||
s32 pad[2];
|
||
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
|
||
s32 mapIndex = gSaveContext.mapIndex;
|
||
|
||
OPEN_DISPS(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(oGfxCtx->overlay.p++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0,
|
||
PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0);
|
||
|
||
if (gSaveContext.inventory.dungeonItems[mapIndex] & gBitFlags[DUNGEON_MAP]) {
|
||
gDPSetPrimColor(oGfxCtx->overlay.p++, 0, 0, 100, 255, 255, interfaceCtx->minimapAlpha);
|
||
|
||
gDPLoadTextureBlock_4b(oGfxCtx->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(oGfxCtx->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.inventory.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 (CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_L) && !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(oGfxCtx->overlay.p++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
||
gDPSetPrimColor(oGfxCtx->overlay.p++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1),
|
||
R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha);
|
||
|
||
gDPLoadTextureBlock_4b(oGfxCtx->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(oGfxCtx->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(oGfxCtx->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(oGfxCtx->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(oGfxCtx->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(oGfxCtx->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 (CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_L) && !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;
|
||
}
|
||
}
|
||
|
||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_map_exp.c", 782);
|
||
}
|
||
|
||
s16 Map_GetFloorTextIndexOffset(s32 mapIndex, s32 floor) {
|
||
return gMapData->floorTexIndexOffset[mapIndex][floor];
|
||
}
|
||
|
||
void Map_Update(GlobalContext* globalCtx) {
|
||
static s16 sLastRoomNum = 99;
|
||
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:
|
||
interfaceCtx->unk_140[30] = 0;
|
||
if (gSaveContext.inventory.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]);
|
||
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;
|
||
}
|
||
}
|
||
}
|