public static void CheckSeed(LogicObjects.TrackerInstance Instance, bool InitialRun, List <int> Ignored) { if (InitialRun) { LogicEditing.ForceFreshCalculation(Instance.Logic); } bool recalculate = false; foreach (var item in Instance.Logic) { item.Available = LogicEditing.RequirementsMet(item.Required, Instance.Logic) && LogicEditing.CondtionalsMet(item.Conditionals, Instance.Logic); Console.WriteLine($"{item.DictionaryName} Avalable {item.Available}"); int Special = LogicEditing.SetAreaClear(item, Instance); if (Special == 2) { recalculate = true; } if (item.Aquired != item.Available && Special == 0 && item.IsFake) { item.Aquired = item.Available; recalculate = true; } if (!item.IsFake && item.RandomizedItem > -1 && item.Available != Instance.Logic[item.RandomizedItem].Aquired && !Ignored.Contains(item.ID)) { Instance.Logic[item.RandomizedItem].Aquired = item.Available; recalculate = true; } } if (recalculate) { CheckSeed(Instance, false, Ignored); } }
public static LogicObjects.ItemUnlockData FindRequirements(LogicObjects.LogicEntry Item, List <LogicObjects.LogicEntry> logic) { List <int> ImportantItems = new List <int>(); List <LogicObjects.PlaythroughItem> playthrough = new List <LogicObjects.PlaythroughItem>(); var LogicCopy = Utility.CloneLogicList(logic); foreach (var i in LogicCopy) { if (i.Unrandomized()) { i.IsFake = true; } } var ItemCopy = LogicCopy[Item.ID]; LogicEditing.ForceFreshCalculation(LogicCopy); foreach (var i in LogicCopy) { ImportantItems.Add(i.ID); if (i.IsFake) { i.SpoilerRandom = i.ID; } } PlaythroughGenerator.UnlockAllFake(LogicCopy, ImportantItems, 0, playthrough); List <int> UsedItems = new List <int>(); bool isAvailable = (LogicEditing.RequirementsMet(ItemCopy.Required, LogicCopy, UsedItems) && LogicEditing.CondtionalsMet(ItemCopy.Conditionals, LogicCopy, UsedItems)); if (!isAvailable) { return(new LogicObjects.ItemUnlockData()); } List <int> NeededItems = Tools.ResolveFakeToRealItems(new LogicObjects.PlaythroughItem { SphereNumber = 0, Check = ItemCopy, ItemsUsed = UsedItems }, playthrough, LogicCopy); List <int> FakeItems = Tools.FindAllFakeItems(new LogicObjects.PlaythroughItem { SphereNumber = 0, Check = ItemCopy, ItemsUsed = UsedItems }, playthrough, LogicCopy); NeededItems = NeededItems.Distinct().ToList(); return(new LogicObjects.ItemUnlockData { playthrough = playthrough, FakeItems = FakeItems, ResolvedRealItems = NeededItems, UsedItems = UsedItems }); }