@@ -103,6 +103,23 @@ std::map<SceneID, RandomizerCheckArea> DungeonRCAreasBySceneID = {
103
103
{SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE},
104
104
};
105
105
106
+ // Dungeon entrances with obvious visual differences between MQ and vanilla qualifying as spoiling on sight
107
+ std::vector<uint32_t > spoilingEntrances = {
108
+ 0x0000 , // ENTR_DEKU_TREE_0
109
+ 0x0467 , // ENTR_DODONGOS_CAVERN_1
110
+ 0x0028 , // ENTR_JABU_JABU_0
111
+ 0x0407 , // ENTR_JABU_JABU_1
112
+ 0x0169 , // ENTR_FOREST_TEMPLE_0
113
+ 0x0165 , // ENTR_FIRE_TEMPLE_0
114
+ 0x0175 , // ENTR_FIRE_TEMPLE_1
115
+ 0x0423 , // ENTR_WATER_TEMPLE_1
116
+ 0x0082 , // ENTR_SPIRIT_TEMPLE_0
117
+ 0x02B2 , // ENTR_SHADOW_TEMPLE_1
118
+ 0x0088 , // ENTR_ICE_CAVERN_0
119
+ 0x0008 , // ENTR_GERUDO_TRAINING_GROUNDS_0
120
+ 0x0467 // ENTR_INSIDE_GANONS_CASTLE_0
121
+ };
122
+
106
123
std::map<RandomizerCheckArea, std::vector<RandomizerCheckObject>> checksByArea;
107
124
bool areasFullyChecked[RCAREA_INVALID];
108
125
u32 areasSpoiled = 0 ;
@@ -263,6 +280,10 @@ void SetCheckCollected(RandomizerCheck rc) {
263
280
}
264
281
SaveManager::Instance->SaveSection (gSaveContext .fileNum , sectionId, true );
265
282
283
+ if (!IsAreaSpoiled (rcObj.rcArea )) {
284
+ SetAreaSpoiled (rcObj.rcArea );
285
+ }
286
+
266
287
doAreaScroll = true ;
267
288
UpdateOrdering (rcObj.rcArea );
268
289
UpdateInventoryChecks ();
@@ -467,9 +488,14 @@ void CheckTrackerLoadGame(int32_t fileNum) {
467
488
areaChecksGotten[realRcObj.rcArea ]++;
468
489
}
469
490
}
470
-
471
- if (areaChecksGotten[realRcObj.rcArea ] != 0 || RandomizerCheckObjects::AreaIsOverworld (realRcObj.rcArea )) {
472
- areasSpoiled |= (1 << realRcObj.rcArea );
491
+ }
492
+ for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) {
493
+ if (!IsAreaSpoiled (static_cast <RandomizerCheckArea>(i)) && (RandomizerCheckObjects::AreaIsOverworld (static_cast <RandomizerCheckArea>(i)) || !IS_RANDO ||
494
+ OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE ||
495
+ OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION ||
496
+ (OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER &&
497
+ OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_MQ_DUNGEON_COUNT) == 12 ))) {
498
+ SetAreaSpoiled (static_cast <RandomizerCheckArea>(i));
473
499
}
474
500
}
475
501
if (OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) {
@@ -539,6 +565,9 @@ void CheckTrackerTransition(uint32_t sceneNum) {
539
565
SetShopSeen (sceneNum, false );
540
566
break ;
541
567
}
568
+ if (!IsAreaSpoiled (currentArea) && (RandomizerCheckObjects::AreaIsOverworld (currentArea) || std::find (spoilingEntrances.begin (), spoilingEntrances.end (), gPlayState ->nextEntranceIndex ) != spoilingEntrances.end ())) {
569
+ SetAreaSpoiled (currentArea);
570
+ }
542
571
}
543
572
544
573
void CheckTrackerFrame () {
@@ -756,6 +785,7 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) {
756
785
757
786
void InitTrackerData (bool isDebug) {
758
787
TrySetAreas ();
788
+ areasSpoiled = 0 ;
759
789
for (auto & [rc, rco] : RandomizerCheckObjects::GetAllRCObjects ()) {
760
790
if (rc != RC_UNKNOWN_CHECK && rc != RC_MAX) {
761
791
DefaultCheckData (rc);
@@ -782,6 +812,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool gameSave) {
782
812
SaveManager::Instance->SaveData (" hintItem" , saveContext->checkTrackerData [i].hintItem );
783
813
});
784
814
});
815
+ SaveManager::Instance->SaveData (" areasSpoiled" , areasSpoiled);
785
816
}
786
817
787
818
void SaveFile (SaveContext* saveContext, int sectionID, bool fullSave) {
@@ -797,6 +828,7 @@ void LoadFile() {
797
828
SaveManager::Instance->LoadData (" hintItem" , gSaveContext .checkTrackerData [i].hintItem );
798
829
});
799
830
});
831
+ SaveManager::Instance->LoadData (" areasSpoiled" , areasSpoiled);
800
832
}
801
833
802
834
void Teardown () {
@@ -808,6 +840,15 @@ void Teardown() {
808
840
lastLocationChecked = RC_UNKNOWN_CHECK;
809
841
}
810
842
843
+ bool IsAreaSpoiled (RandomizerCheckArea rcArea) {
844
+ return areasSpoiled & (1 << rcArea);
845
+ }
846
+
847
+ void SetAreaSpoiled (RandomizerCheckArea rcArea) {
848
+ areasSpoiled |= (1 << rcArea);
849
+ SaveManager::Instance->SaveSection (gSaveContext .fileNum , sectionId, true );
850
+ }
851
+
811
852
void UpdateCheck (uint32_t check, RandomizerCheckTrackerData data) {
812
853
auto area = RandomizerCheckObjects::GetAllRCObjects ().find (static_cast <RandomizerCheck>(check))->second .rcArea ;
813
854
if ((!gSaveContext .checkTrackerData [check].skipped && data.skipped ) ||
@@ -826,10 +867,6 @@ void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) {
826
867
void CheckTrackerWindow::DrawElement () {
827
868
ImGui::SetNextWindowSize (ImVec2 (400 , 540 ), ImGuiCond_FirstUseEver);
828
869
829
- if (!initialized && (gPlayState == nullptr || gSaveContext .fileNum < 0 || gSaveContext .fileNum > 2 )) {
830
- return ;
831
- }
832
-
833
870
if (CVarGetInteger (" gCheckTrackerWindowType" , TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) {
834
871
if (CVarGetInteger (" gCheckTrackerShowOnlyPaused" , 0 ) && (gPlayState == nullptr || gPlayState ->pauseCtx .state == 0 )) {
835
872
return ;
@@ -850,7 +887,7 @@ void CheckTrackerWindow::DrawElement() {
850
887
851
888
BeginFloatWindows (" Check Tracker" , mIsVisible , ImGuiWindowFlags_NoScrollbar);
852
889
853
- if (!GameInteractor::IsSaveLoaded ()) {
890
+ if (!GameInteractor::IsSaveLoaded () || !initialized ) {
854
891
ImGui::Text (" Waiting for file load..." ); // TODO Language
855
892
EndFloatWindows ();
856
893
return ;
@@ -861,8 +898,6 @@ void CheckTrackerWindow::DrawElement() {
861
898
sceneId = (SceneID)gPlayState ->sceneNum ;
862
899
}
863
900
864
- areasSpoiled |= (1 << currentArea);
865
-
866
901
// Quick Options
867
902
#ifdef __WIIU__
868
903
float headerHeight = 40 .0f ;
@@ -924,7 +959,6 @@ void CheckTrackerWindow::DrawElement() {
924
959
Color_RGBA8 mainColor;
925
960
Color_RGBA8 extraColor;
926
961
std::string stemp;
927
- s32 areaMask = 1 ;
928
962
929
963
for (auto & [rcArea, objs] : checksByArea) {
930
964
RandomizerCheckArea thisArea = currentArea;
@@ -977,11 +1011,7 @@ void CheckTrackerWindow::DrawElement() {
977
1011
ImGui::PushStyleColor (ImGuiCol_Text, ImVec4 (extraColor.r / 255 .0f , extraColor.g / 255 .0f ,
978
1012
extraColor.b / 255 .0f , extraColor.a / 255 .0f ));
979
1013
980
- isThisAreaSpoiled = areasSpoiled & areaMask || CVarGetInteger (" gCheckTrackerOptionMQSpoilers" , 0 ) || !IS_RANDO ||
981
- OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE ||
982
- OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION ||
983
- (OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER &&
984
- OTRGlobals::Instance->gRandomizer ->GetRandoSettingValue (RSK_MQ_DUNGEON_COUNT) == 12 );
1014
+ isThisAreaSpoiled = IsAreaSpoiled (rcArea) || CVarGetInteger (" gCheckTrackerOptionMQSpoilers" , 0 );
985
1015
986
1016
if (isThisAreaSpoiled) {
987
1017
if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon (rcArea)) {
@@ -1014,7 +1044,6 @@ void CheckTrackerWindow::DrawElement() {
1014
1044
ImGui::TreePop ();
1015
1045
}
1016
1046
}
1017
- areaMask <<= 1 ;
1018
1047
}
1019
1048
1020
1049
ImGui::EndTable (); // Checks Lead-out
@@ -1218,10 +1247,10 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) {
1218
1247
}
1219
1248
1220
1249
void UpdateInventoryChecks () {
1221
- // For all the areas with compasses , if you have one, spoil the area
1250
+ // For all the areas with maps , if you have one, spoil the area
1222
1251
for (auto [scene, area] : DungeonRCAreasBySceneID) {
1223
1252
if (CHECK_DUNGEON_ITEM (DUNGEON_MAP, scene)) {
1224
- areasSpoiled |= ( 1 << area);
1253
+ SetAreaSpoiled ( area);
1225
1254
}
1226
1255
}
1227
1256
}
@@ -1231,9 +1260,6 @@ void UpdateAreaFullyChecked(RandomizerCheckArea area) {
1231
1260
1232
1261
void UpdateAreas (RandomizerCheckArea area) {
1233
1262
areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find (area)->second .size ();
1234
- if (areaChecksGotten[area] != 0 || RandomizerCheckObjects::AreaIsOverworld (area)) {
1235
- areasSpoiled |= (1 << area);
1236
- }
1237
1263
}
1238
1264
1239
1265
void UpdateAllOrdering () {
0 commit comments