From e58b122fb00a337748df2de2451679f53b092d42 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 22 Feb 2025 10:43:41 -0500 Subject: Mapped out most of the game --- Requirements.cs | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 Requirements.cs (limited to 'Requirements.cs') diff --git a/Requirements.cs b/Requirements.cs new file mode 100644 index 0000000..987a299 --- /dev/null +++ b/Requirements.cs @@ -0,0 +1,288 @@ +using System.Collections.Generic; +using System.Linq; + +namespace ManifoldGardenArchipelago +{ + public struct RequirementReferences + { + public RequirementReferences() { } + + public readonly HashSet scenes = []; + public readonly HashSet buttons = []; + public readonly HashSet sockets = []; + public readonly HashSet pads = []; + public readonly HashSet waterwheels = []; + public readonly HashSet spheres = []; + public readonly HashSet items = []; + + public void Merge(RequirementReferences other) + { + foreach (var item in other.scenes) + { + scenes.Add(item); + } + foreach (var item in other.buttons) + { + buttons.Add(item); + } + foreach (var item in other.sockets) + { + sockets.Add(item); + } + foreach (var item in other.pads) + { + pads.Add(item); + } + foreach (var item in other.waterwheels) + { + waterwheels.Add(item); + } + foreach (var item in other.spheres) + { + spheres.Add(item); + } + foreach (var item in other.items) + { + items.Add(item); + } + } + } + + public abstract class Requirement + { + public RequirementReferences references = new(); + + public abstract bool Check(); + } + + public class AndRequirement : Requirement + { + private readonly List _requirements; + + public AndRequirement(List requirements) + { + _requirements = requirements; + + foreach (var subreq in _requirements) + { + references.Merge(subreq.references); + } + } + + public override bool Check() + { + return _requirements.All(x => x.Check()); + } + + public override string ToString() + { + return "And(" + string.Join(", ", _requirements.Select((req) => req.ToString())) + ")"; + } + } + + public class OrRequirement : Requirement + { + private readonly List _requirements; + + public OrRequirement(List requirements) + { + _requirements = requirements; + + foreach (var subreq in _requirements) + { + references.Merge(subreq.references); + } + } + + public override bool Check() + { + return _requirements.Any(x => x.Check()); + } + + public override string ToString() + { + return "Or(" + string.Join(", ", _requirements.Select((req) => req.ToString())) + ")"; + } + } + + public class ItemRequirement : Requirement + { + private readonly string _itemName; + + public ItemRequirement(string itemName) + { + _itemName = itemName; + + references.items.Add(itemName); + } + + public override bool Check() + { + return Plugin.archipelagoManager.HasItem(_itemName); + } + + public override string ToString() + { + return $"Item({_itemName})"; + } + } + + public class EntryRequirement : Requirement + { + private readonly string _sceneName; + + public EntryRequirement(string sceneName) + { + _sceneName = sceneName; + + references.scenes.Add(sceneName); + } + + public override bool Check() + { + return Plugin.slotSave.VisitedScenes.Contains(_sceneName); + } + + public override string ToString() + { + return $"Entry({_sceneName})"; + } + } + + public class ButtonRequirement : Requirement + { + private readonly SceneItemReference _button; + + public ButtonRequirement(SceneItemReference button) + { + _button = button; + + references.scenes.Add(button.scene); + references.buttons.Add(button); + } + + public override bool Check() + { + return Plugin.slotSave.ActivatedButtons.Contains(_button); + } + + public override string ToString() + { + return $"Button{_button}"; + } + } + + public class SocketRequirement : Requirement + { + private readonly SceneItemReference _socket; + + public SocketRequirement(SceneItemReference socket) + { + _socket = socket; + + references.scenes.Add(socket.scene); + references.sockets.Add(socket); + } + + public override bool Check() + { + return Plugin.slotSave.ActivatedSockets.Contains(_socket); + } + + public override string ToString() + { + return $"Socket{_socket}"; + } + } + + public class PadRequirement : Requirement + { + private readonly SceneItemReference _pad; + + public PadRequirement(SceneItemReference pad) + { + _pad = pad; + + references.scenes.Add(pad.scene); + references.pads.Add(pad); + } + + public override bool Check() + { + return Plugin.slotSave.ActivatedPads.Contains(_pad); + } + + public override string ToString() + { + return $"Pad{_pad}"; + } + } + + public class WaterwheelRequirement : Requirement + { + private readonly SceneItemReference _waterwheel; + + public WaterwheelRequirement(SceneItemReference waterwheel) + { + _waterwheel = waterwheel; + + references.scenes.Add(waterwheel.scene); + references.waterwheels.Add(waterwheel); + } + + public override bool Check() + { + return Plugin.slotSave.ActivatedWaterwheels.Contains(_waterwheel); + } + + public override string ToString() + { + return $"Waterwheel{_waterwheel}"; + } + } + + public class SphereRequirement : Requirement + { + private readonly SceneItemReference _sphere; + + public SphereRequirement(SceneItemReference sphere) + { + _sphere = sphere; + + references.scenes.Add(sphere.scene); + references.spheres.Add(sphere); + } + + public override bool Check() + { + return Plugin.slotSave.ActivatedSpheres.Contains(_sphere); + } + + public override string ToString() + { + return $"Sphere{_sphere}"; + } + } + + public class InvertedRequirement : Requirement + { + private readonly Requirement _requirement; + + public InvertedRequirement(Requirement requirement) + { + _requirement = requirement; + + references = requirement.references; + } + + public override bool Check() + { + return !_requirement.Check(); + } + + public override string ToString() + { + return $"Not({_requirement})"; + } + } +} -- cgit 1.4.1