public void UpdateReachableLocations(string newThing = null) { if (newThing != null) { pm.Add(newThing); updateQueue.Enqueue(newThing); } while (updateQueue.Any()) { string item = updateQueue.Dequeue(); foreach (string location in LogicManager.GetItemsByProgression(item)) { if (pm.CanGet(location)) { reachableLocations.Add(location); if (vm.progressionLocations.Contains(location)) { vm.UpdateVanillaLocations(location); } } } if (RandomizerMod.Instance.Settings.RandomizeTransitions) { if (TransitionManager.transitionPlacements.TryGetValue(item, out string transition1) && !pm.Has(transition1)) { pm.Add(transition1); updateQueue.Enqueue(transition1); } foreach (string transition in LogicManager.GetTransitionsByProgression(item)) { if (!pm.Has(transition) && pm.CanGet(transition)) { pm.Add(transition); updateQueue.Enqueue(transition); if (TransitionManager.transitionPlacements.TryGetValue(transition, out string transition2) && !pm.Has(transition2)) { pm.Add(transition2); updateQueue.Enqueue(transition2); } } } } } }
public string ForceItem() { Queue <string> progressionQueue = new Queue <string>(); List <string> tempProgression = new List <string>(); void UpdateTransitions(string item) { foreach (string transition in LogicManager.GetTransitionsByProgression(item)) { if (!pm.Has(transition) && pm.CanGet(transition)) { tempProgression.Add(transition); progressionQueue.Enqueue(transition); pm.Add(transition); if (TransitionManager.transitionPlacements.TryGetValue(transition, out string transition2)) { tempProgression.Add(transition2); progressionQueue.Enqueue(transition2); pm.Add(transition2); } } } } bool CheckForNewLocations(string item) { foreach (string location in LogicManager.GetItemsByProgression(item)) { if (!randomizedLocations.Contains(location)) { continue; } if (!reachableLocations.Contains(location) && pm.CanGet(location)) { return(true); } } return(false); } for (int i = 0; i < unplacedProgression.Count; i++) { string item = unplacedProgression[i]; pm.Add(item); if (CheckForNewLocations(item)) { return(item); } else if (RandomizerMod.Instance.Settings.RandomizeTransitions) { bool found = false; UpdateTransitions(item); while (progressionQueue.Any()) { string t = progressionQueue.Dequeue(); UpdateTransitions(t); found = found || CheckForNewLocations(t); } if (found) { return(item); } foreach (string transition in tempProgression) { pm.Remove(transition); } } pm.Remove(item); } return(null); }