Added Randomizer_EntranceDiscovered.

This commit is contained in:
Anthony Stewart 2025-04-08 19:57:09 -05:00
commit 8738c1f936
6 changed files with 37 additions and 25 deletions

View file

@ -4,6 +4,7 @@
#include "3drando/pool_functions.hpp" #include "3drando/pool_functions.hpp"
#include "3drando/item_pool.hpp" #include "3drando/item_pool.hpp"
#include "../debugger/performanceTimer.h" #include "../debugger/performanceTimer.h"
#include "randomizer_check_tracker.h"
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
@ -250,6 +251,8 @@ std::string EntranceNameByRegions(RandomizerRegion parentRegion, RandomizerRegio
return RegionTable(parentRegion)->regionName + " -> " + RegionTable(connectedRegion)->regionName; return RegionTable(parentRegion)->regionName + " -> " + RegionTable(connectedRegion)->regionName;
} }
std::unordered_map<int16_t, Entrance*> entranceMap;
void SetAllEntrancesData(std::vector<EntranceInfoPair>& entranceShuffleTable) { void SetAllEntrancesData(std::vector<EntranceInfoPair>& entranceShuffleTable) {
auto ctx = Rando::Context::GetInstance(); auto ctx = Rando::Context::GetInstance();
for (auto& entrancePair : entranceShuffleTable) { for (auto& entrancePair : entranceShuffleTable) {
@ -262,6 +265,7 @@ void SetAllEntrancesData(std::vector<EntranceInfoPair>& entranceShuffleTable) {
forwardEntrance->SetIndex(forwardEntry.index); forwardEntrance->SetIndex(forwardEntry.index);
forwardEntrance->SetType(forwardEntry.type); forwardEntrance->SetType(forwardEntry.type);
forwardEntrance->SetAsPrimary(); forwardEntrance->SetAsPrimary();
entranceMap[forwardEntry.index] = forwardEntrance;
// When decouple entrances is on, mark the forward entrance // When decouple entrances is on, mark the forward entrance
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
@ -273,6 +277,7 @@ void SetAllEntrancesData(std::vector<EntranceInfoPair>& entranceShuffleTable) {
returnEntrance->SetIndex(returnEntry.index); returnEntrance->SetIndex(returnEntry.index);
returnEntrance->SetType(returnEntry.type); returnEntrance->SetType(returnEntry.type);
forwardEntrance->BindTwoWay(returnEntrance); forwardEntrance->BindTwoWay(returnEntrance);
entranceMap[returnEntry.index] = returnEntrance;
// Mark reverse entrance as decoupled // Mark reverse entrance as decoupled
if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) {
@ -1667,21 +1672,11 @@ void EntranceShuffler::ParseJson(nlohmann::json spoilerFileJson) {
void EntranceShuffler::ApplyEntranceOverrides() { void EntranceShuffler::ApplyEntranceOverrides() {
SetAllEntrancesData(entranceShuffleTable); SetAllEntrancesData(entranceShuffleTable);
std::unordered_map<int16_t, Entrance*> entrances;
for (uint32_t rr = RR_NONE; rr < RR_MAX; rr++) {
for (auto& exit : areaTable[rr].exits) {
int16_t index = exit.GetIndex();
if (index != -1) {
entrances[index] = &exit;
}
}
}
for (size_t i = 0; i < entranceOverrides.size(); i++) { for (size_t i = 0; i < entranceOverrides.size(); i++) {
EntranceOverride entranceOverride = entranceOverrides[i]; EntranceOverride entranceOverride = entranceOverrides[i];
Entrance* entrance = entrances[entranceOverride.index]; Entrance* entrance = entranceMap[entranceOverride.index];
Entrance* overrideEntrance = entrances[entranceOverride.override]; Entrance* overrideEntrance = entranceMap[entranceOverride.override];
entrance->Disconnect(); entrance->Disconnect();
entrance->Connect(overrideEntrance->GetOriginalConnectedRegionKey()); entrance->Connect(overrideEntrance->GetOriginalConnectedRegionKey());
@ -1689,6 +1684,23 @@ void EntranceShuffler::ApplyEntranceOverrides() {
} }
} // namespace Rando } // namespace Rando
extern "C" EntranceOverride* Randomizer_GetEntranceOverrides() { extern "C" {
EntranceOverride* Randomizer_GetEntranceOverrides() {
return Rando::Context::GetInstance()->GetEntranceShuffler()->entranceOverrides.data(); return Rando::Context::GetInstance()->GetEntranceShuffler()->entranceOverrides.data();
} }
void Randomizer_DiscoverRegion(Region* region) {
region->IsDiscovered = true;
// RANDOTODO: Discover other regions that will be known based on rando settings
}
void Randomizer_EntranceDiscovered(s16 index) {
Rando::Entrance* entrance = Rando::entranceMap[index];
Region* region = entrance->GetConnectedRegion();
Randomizer_DiscoverRegion(region);
CheckTracker::RecalculateAvailableChecks();
}
}

View file

@ -153,6 +153,7 @@ class EntranceShuffler {
extern "C" { extern "C" {
#endif #endif
EntranceOverride* Randomizer_GetEntranceOverrides(); EntranceOverride* Randomizer_GetEntranceOverrides();
void Randomizer_EntranceDiscovered(s16 index);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -138,6 +138,8 @@ class Region {
bool addedToPool = false; bool addedToPool = false;
; ;
bool IsDiscovered = false;
void ApplyTimePass(); void ApplyTimePass();
bool UpdateEvents(); bool UpdateEvents();

View file

@ -1967,11 +1967,13 @@ void RecalculateAvailableChecks() {
ResetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); ResetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS);
StartPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); StartPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS);
const auto& ctx = Rando::Context::GetInstance();
std::vector<RandomizerCheck> targetLocations; std::vector<RandomizerCheck> targetLocations;
targetLocations.reserve(RR_MAX); targetLocations.reserve(RR_MAX);
for (auto& location : Rando::StaticData::GetLocationTable()) { for (auto& location : Rando::StaticData::GetLocationTable()) {
RandomizerCheck rc = location.GetRandomizerCheck(); RandomizerCheck rc = location.GetRandomizerCheck();
Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc);
itemLocation->SetAvailable(false); itemLocation->SetAvailable(false);
if (!itemLocation->HasObtained()) { if (!itemLocation->HasObtained()) {
targetLocations.emplace_back(rc); targetLocations.emplace_back(rc);
@ -1981,17 +1983,10 @@ void RecalculateAvailableChecks() {
std::vector<RandomizerCheck> availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true); std::vector<RandomizerCheck> availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true);
for (auto& rc : availableChecks) { for (auto& rc : availableChecks) {
const auto& location = Rando::StaticData::GetLocation(rc); const auto& location = Rando::StaticData::GetLocation(rc);
const auto& itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); const auto& itemLocation = ctx->GetItemLocation(rc);
const auto& region = areaTable[itemLocation->GetParentRegionKey()];
bool regionDiscovered = false; if (ctx->GetOption(RSK_SHUFFLE_ENTRANCES).Get() && !region.IsDiscovered) {
const auto& entrances = areaTable[itemLocation->GetParentRegionKey()].entrances;
for (const auto& entrance : entrances) {
if (IsEntranceDiscovered(entrance->GetIndex())) {
regionDiscovered = true;
break;
}
}
if (!regionDiscovered) {
continue; continue;
} }
@ -2008,7 +2003,7 @@ void RecalculateAvailableChecks() {
for (auto& [rcArea, vec] : checksByArea) { for (auto& [rcArea, vec] : checksByArea) {
areaChecksAvailable[rcArea] = 0; areaChecksAvailable[rcArea] = 0;
for (auto& rc : vec) { for (auto& rc : vec) {
Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc);
if (itemLocation->IsAvailable() && IsVisibleInCheckTracker(rc) && !IsCheckHidden(rc)) { if (itemLocation->IsAvailable() && IsVisibleInCheckTracker(rc) && !IsCheckHidden(rc)) {
areaChecksAvailable[rcArea]++; areaChecksAvailable[rcArea]++;
} }

View file

@ -809,6 +809,7 @@ void Entrance_SetEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) {
if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) {
u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex)); u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex));
gSaveContext.ship.stats.entrancesDiscovered[idx] |= entranceBit; gSaveContext.ship.stats.entrancesDiscovered[idx] |= entranceBit;
Randomizer_EntranceDiscovered(entranceIndex);
// Set reverse entrance when not decoupled // Set reverse entrance when not decoupled
if (!Randomizer_GetSettingValue(RSK_DECOUPLED_ENTRANCES) && !isReversedEntrance) { if (!Randomizer_GetSettingValue(RSK_DECOUPLED_ENTRANCES) && !isReversedEntrance) {

View file

@ -90,6 +90,7 @@ void InitEntranceTrackingData();
s16 GetLastEntranceOverride(); s16 GetLastEntranceOverride();
s16 GetCurrentGrottoId(); s16 GetCurrentGrottoId();
const EntranceData* GetEntranceData(s16); const EntranceData* GetEntranceData(s16);
void EntranceDiscovered(s16 index);
bool IsEntranceDiscovered(s16 index); bool IsEntranceDiscovered(s16 index);
class EntranceTrackerSettingsWindow : public Ship::GuiWindow { class EntranceTrackerSettingsWindow : public Ship::GuiWindow {