Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion soh/soh/Enhancements/randomizer/3drando/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,10 @@ bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals
(quest == RCQUEST_VANILLA && ctx->GetDungeons()->GetDungeonFromScene(parentRegion->scene)->IsVanilla()) ||
(quest == RCQUEST_MQ && ctx->GetDungeons()->GetDungeonFromScene(parentRegion->scene)->IsMQ()));

if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, logic->CalculatingAvailableChecks)) {
// Always evaluate the conditions for Age Availability
bool conditionsMet = locPair.ConditionsMet(parentRegion);

if (!location->IsAddedToPool() && conditionsMet) {
location->AddToPool();

if (locItem == RG_NONE || logic->CalculatingAvailableChecks) {
Expand Down Expand Up @@ -1446,3 +1449,42 @@ int Fill() {
// All retries failed
return -1;
}

void CalculateCheckAges() {
SaveContext* previousSaveContext = logic->mSaveContext;

SaveContext* tempSaveContext = new SaveContext();
logic->mSaveContext = tempSaveContext;
logic->InitSaveContext();

std::array<RandomizerGet, RC_MAX> placedItems{};
for (int i = 0; i < RC_MAX; i++) {
auto rc = static_cast<RandomizerCheck>(i);
Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc);
placedItems[rc] = itemLoc->GetPlacedRandomizerGet();
itemLoc->SetPlacedItem(RG_NONE);
}

ctx->ItemReset();
ctx->GenerateLocationPool();
GenerateItemPool();

for (int i = 0; i < RC_MAX; i++) {
auto rc = static_cast<RandomizerCheck>(i);
Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc);
itemLoc->SetPlacedItem(placedItems[rc]);
}

ApplyAllAdvancmentItems();
ReachabilitySearch({}, RG_NONE, false);

for (int i = 0; i < RC_MAX; i++) {
auto rc = static_cast<RandomizerCheck>(i);
Rando::ItemLocation* itemLoc = ctx->GetItemLocation(rc);
itemLoc->SetChildAvailable(itemLoc->IsChildAvailable(), true);
itemLoc->SetAdultAvailable(itemLoc->IsAdultAvailable(), true);
}

logic->mSaveContext = previousSaveContext;
free(tempSaveContext);
}
4 changes: 3 additions & 1 deletion soh/soh/Enhancements/randomizer/3drando/fill.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,6 @@ bool CheckBeatable(RandomizerGet ignore = RG_NONE);

void ValidateEntrances(bool checkOtherEntranceAccess);

void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess);
void ValidateEntrances(bool checkPoeCollectorAccess, bool checkOtherEntranceAccess);

void CalculateCheckAges();
2 changes: 2 additions & 0 deletions soh/soh/Enhancements/randomizer/SeedContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ void Context::ItemReset() {

void Context::LocationReset() {
for (auto& il : itemLocationTable) {
il.SetChildAvailable(false);
il.SetAdultAvailable(false);
il.RemoveFromPool();
}
}
Expand Down
39 changes: 33 additions & 6 deletions soh/soh/Enhancements/randomizer/item_location.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,14 +232,41 @@ void ItemLocation::ResetVariables() {
areas = {};
status = RCSHOW_UNCHECKED;
isSkipped = false;
isAvailable = false;
isChildAvailable = false;
isFinalChildAvailable = false;
isAdultAvailable = false;
isFinalAdultAvailable = false;
}

bool ItemLocation::IsAvailable() const {
return isAvailable;
bool ItemLocation::IsChildAvailable(bool final /*= false*/) const {
if (final) {
return isFinalChildAvailable;
} else {
return isChildAvailable;
}
}

void ItemLocation::SetChildAvailable(bool isChildAvailable_, bool final /*= false*/) {
if (final) {
isFinalChildAvailable = isChildAvailable_;
} else {
isChildAvailable = isChildAvailable_;
}
}

void ItemLocation::SetAvailable(bool isAvailable_) {
isAvailable = isAvailable_;
bool ItemLocation::IsAdultAvailable(bool final /*= false*/) const {
if (final) {
return isFinalAdultAvailable;
} else {
return isAdultAvailable;
}
}

void ItemLocation::SetAdultAvailable(bool isAdultAvailable_, bool final /*= false*/) {
if (final) {
isFinalAdultAvailable = isAdultAvailable_;
} else {
isAdultAvailable = isAdultAvailable_;
}
}
} // namespace Rando
} // namespace Rando
11 changes: 8 additions & 3 deletions soh/soh/Enhancements/randomizer/item_location.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,10 @@ class ItemLocation {
bool IsFoolishCandidate() const;
void SetBarrenCandidate();
void ResetVariables();
bool IsAvailable() const;
void SetAvailable(bool isAvailable_);
bool IsChildAvailable(bool final = false) const;
void SetChildAvailable(bool isAvailable_, bool final = false);
bool IsAdultAvailable(bool final = false) const;
void SetAdultAvailable(bool isAvailable_, bool final = false);

private:
RandomizerCheck rc;
Expand All @@ -78,6 +80,9 @@ class ItemLocation {
bool barrenCandidate = false;
RandomizerCheckStatus status = RCSHOW_UNCHECKED;
bool isSkipped = false;
bool isAvailable = false;
bool isChildAvailable = false;
bool isFinalChildAvailable = false;
bool isAdultAvailable = false;
bool isFinalAdultAvailable = false;
};
} // namespace Rando
17 changes: 11 additions & 6 deletions soh/soh/Enhancements/randomizer/location_access.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,25 @@ bool LocationAccess::CheckConditionAtAgeTime(bool& age, bool& time) const {
return GetConditionsMet();
}

bool LocationAccess::ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const {
bool LocationAccess::ConditionsMet(Region* parentRegion) const {
// WARNING enterance validation can run this after resetting the access for sphere 0 validation
// When refactoring ToD access, either fix the above or do not assume that we
// have any access at all just because this is being run
bool conditionsMet = false;
auto itemLocation = Rando::Context::GetInstance()->GetItemLocation(location);

if ((parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) ||
(parentRegion->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight)) ||
if (itemLocation->IsChildAvailable() ||
(parentRegion->childDay && CheckConditionAtAgeTime(logic->IsChild, logic->AtDay)) ||
(parentRegion->childNight && CheckConditionAtAgeTime(logic->IsChild, logic->AtNight))) {
itemLocation->SetChildAvailable(true);
}

if (itemLocation->IsAdultAvailable() ||
(parentRegion->adultDay && CheckConditionAtAgeTime(logic->IsAdult, logic->AtDay)) ||
(parentRegion->adultNight && CheckConditionAtAgeTime(logic->IsAdult, logic->AtNight))) {
conditionsMet = true;
itemLocation->SetAdultAvailable(true);
}

return conditionsMet;
return itemLocation->IsChildAvailable() || itemLocation->IsAdultAvailable();
}

static uint16_t GetMinimumPrice(const Rando::Location* loc) {
Expand Down
2 changes: 1 addition & 1 deletion soh/soh/Enhancements/randomizer/location_access.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class LocationAccess {

bool CheckConditionAtAgeTime(bool& age, bool& time) const;

bool ConditionsMet(Region* parentRegion, bool calculatingAvailableChecks) const;
bool ConditionsMet(Region* parentRegion) const;

RandomizerCheck GetLocation() const {
return location;
Expand Down
Loading
Loading