From de12d277d0a75fe670ffac01e32ea1b880ff1e84 Mon Sep 17 00:00:00 2001 From: gymnast86 Date: Fri, 29 May 2026 11:31:29 -0700 Subject: [PATCH] restricted fills cleanup --- src/dusk/randomizer/generator/logic/fill.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/dusk/randomizer/generator/logic/fill.cpp b/src/dusk/randomizer/generator/logic/fill.cpp index 4aeb85e830..82e29349e8 100644 --- a/src/dusk/randomizer/generator/logic/fill.cpp +++ b/src/dusk/randomizer/generator/logic/fill.cpp @@ -213,10 +213,6 @@ namespace randomizer::logic::fill PlaceOwnDungeonItems(world, worlds); PlacePrologueItems(world, worlds); PlaceAnywhereDungeonRewards(world, worlds); - - // Determine required dungeons now so that we can place "any dungeon" items appropriately - world->DetermineRequiredDungeons(); - PlaceAnyDungeonItems(world, worlds); PlaceOverworldItems(world, worlds); } @@ -275,6 +271,9 @@ namespace randomizer::logic::fill // Place goal items at goal locations auto completeItemPool = item_pool::GetCompleteItemPool(worlds); AssumedFill(worlds, goalItems, completeItemPool, goalLocations); + + // Determine required dungeons now that we placed goal location items + world->DetermineRequiredDungeons(); } void PlaceOwnDungeonItems(std::unique_ptr& world, world::WorldPool& worlds) @@ -287,6 +286,13 @@ namespace randomizer::logic::fill return location->HasCategories("Hint Sign"); }); + // Filter out excluded locations if this dungeon is required + if (dungeon->IsRequired()) { + utility::container::FilterAndEraseFromVector(dungeonLocations, [](const auto& location) { + return !location->IsProgression(); + }); + } + // Clang doesn't like passing structured binding variables to lambda functions via reference, so we create these // temporary variables to serve the purpose auto& dungeon_ = dungeon; @@ -353,6 +359,9 @@ namespace randomizer::logic::fill // Place the items auto completeItemPool = item_pool::GetCompleteItemPool(worlds); AssumedFill(worlds, goalItems, completeItemPool, allLocations); + + // Determine required dungeons now that we placed goal location items + world->DetermineRequiredDungeons(); } void PlaceAnyDungeonItems(std::unique_ptr& world, world::WorldPool& worlds)