Beispiel #1
0
 public TaskPathwayPlaceKey(RandoLogic logic, LinkedNode node, int keyholeID, LinkedNode originalNode = null, bool internalOnly = false, int tries = 0) : base(logic)
 {
     // TODO: advance forward through any obligatory edges
     this.Node         = node;
     this.InternalOnly = internalOnly;
     this.KeyholeID    = keyholeID;
     this.OriginalNode = originalNode ?? node;
     this.Tries        = tries;
 }
 public TaskPathwaySatisfyRequirement(RandoLogic logic, LinkedNode node, Requirement req, FlagSet state, LinkedNode originalNode = null, bool internalOnly = false, int tries = 0) : base(logic)
 {
     this.Node         = node;
     this.InternalOnly = internalOnly;
     this.Req          = req;
     this.OriginalNode = originalNode ?? node;
     this.Tries        = this.BaseTries = tries;
     this.State        = state;
 }
Beispiel #3
0
        public static LinkedNodeSet Closure(LinkedNode start, Capabilities capsForward, Capabilities capsReverse, bool internalOnly, int maxDistance = 9999)
        {
            var result = new LinkedNodeSet(new List <LinkedNode> {
                start
            });

            result.Extend(capsForward, capsReverse, internalOnly, maxDistance);
            return(result);
        }
Beispiel #4
0
            public static PlaceCollectableReceipt Do(LinkedNode node, StaticCollectable place, LinkedCollectable item, bool autoBubble, int keyholeID, LinkedRoom keyholeRoom)
            {
                var result = Do(node, place, item, autoBubble);

                keyholeRoom.UsedKeyholes.Add(keyholeID);
                result.KeyholeID   = keyholeID;
                result.KeyholeRoom = keyholeRoom;
                return(result);
            }
Beispiel #5
0
 public static PlaceCollectableReceipt Do(LinkedNode node, StaticCollectable place, LinkedCollectable item, bool autoBubble)
 {
     Logger.Log("randomizer", $"Placing collectable {item} in {node.Room.Static.Name}:{node.Static.Name}");
     node.Collectables[place] = Tuple.Create(item, autoBubble);
     return(new PlaceCollectableReceipt {
         Node = node,
         Place = place,
     });
 }
Beispiel #6
0
 public static PlaceCollectableReceipt Do(LinkedNode node, StaticCollectable place, LinkedNode.LinkedCollectable item)
 {
     Logger.Log("randomizer", $"Placing collectable {item} in {node.Room.Static.Name}:{node.Static.Name}");
     node.Collectables[place] = item;
     return(new PlaceCollectableReceipt {
         Node = node,
         Place = place
     });
 }
Beispiel #7
0
 public ref Requirement ExtraReqsTo(LinkedNode One)
 {
     if (One == this.NodeA)
     {
         return(ref this.ExtraReqsToA);
     }
     else if (One == this.NodeB)
     {
         return(ref this.ExtraReqsToB);
     }
     throw new Exception("Misplaced LinkedEdge call");
 }
Beispiel #8
0
        public Requirement ReqsTo(LinkedNode one)
        {
            var extra = this.ExtraReqsFrom(one);
            var total = new List <Requirement> {
                this.CorrespondingEdge(one).ReqIn,
                this.OtherEdge(one).ReqOut,
            };

            if (extra != null)
            {
                total.Add(extra);
            }
            return(Requirement.And(total));
        }
Beispiel #9
0
 public LinkedRoom(StaticRoom Room, Vector2 Position)
 {
     this.Static      = Room;
     this.Bounds      = new Rectangle((int)Position.X, (int)Position.Y, Room.Level.Bounds.Width, Room.Level.Bounds.Height);
     this.ExtraBounds = new List <Rectangle>();
     foreach (var r in Room.ExtraSpace)
     {
         this.ExtraBounds.Add(new Rectangle((int)Position.X + r.X, (int)Position.Y + r.Y, r.Width, r.Height));
     }
     foreach (var staticnode in Room.Nodes.Values)
     {
         var node = new LinkedNode()
         {
             Static = staticnode, Room = this
         };
         this.Nodes.Add(staticnode.Name, node);
     }
 }
Beispiel #10
0
 public StaticEdge CorrespondingEdge(LinkedNode One)
 {
     return(One == NodeA ? StaticA : One == NodeB ? StaticB : null);
 }
Beispiel #11
0
 public LinkedNode OtherNode(LinkedNode One)
 {
     return(One == NodeA ? NodeB : One == NodeB ? NodeA : null);
 }
Beispiel #12
0
 public LinkedNode OtherNode(LinkedNode One)
 {
     return(One == NodeA ? NodeB : One == NodeB ? NodeA : throw new Exception("Misplaced LinkedEdge call"));
 }
Beispiel #13
0
 public UnlinkedEdge(LinkedNode node, StaticEdge edge)
 {
     this.Static = edge;
     this.Node   = node;
 }
 public TaskPathwayBerryOffshoot(RandoLogic logic, LinkedNode node, FlagSet state) : base(logic)
 {
     this.Node  = node;
     this.State = state;
 }
Beispiel #15
0
 public StaticEdge OtherEdge(LinkedNode One)
 {
     return(One == NodeA ? StaticB : One == NodeB ? StaticA : null);
 }
Beispiel #16
0
 public StaticEdge CorrespondingEdge(LinkedNode One)
 {
     return(One == NodeA ? StaticA : One == NodeB ? StaticB : throw new Exception("Misplaced LinkedEdge call"));
 }
Beispiel #17
0
        public static Requirement TraversalRequires(LinkedNode start, Capabilities capsForward, bool internalOnly, LinkedNode end)
        {
            var queue = new PriorityQueue <Tuple <Requirement, LinkedNode> >();
            var seen  = new Dictionary <LinkedNode, List <Requirement> >();

            Requirement p = new Possible();

            queue.Enqueue(Tuple.Create(p, start));
            seen[start] = new List <Requirement> {
                p
            };

            // implementation question: should this loop break as soon as one path to end is found, or should it exhaust the queue?
            // for now, let's go with exhaust the queue so if there's a Possible we don't miss it

            while (queue.Count != 0)
            {
                var entry     = queue.Dequeue();
                var entryReq  = entry.Item1;
                var entryNode = entry.Item2;

                foreach (var where in entryNode.SuccessorsRequires(capsForward))
                {
                    var realReq = Requirement.And(new List <Requirement> {
                        entryReq, where.Item2
                    });
                    var nextNode = where.Item1;

                    if (!seen.TryGetValue(nextNode, out var seenLst))
                    {
                        seenLst        = new List <Requirement>();
                        seen[nextNode] = seenLst;
                    }

                    // search for any requirement already seen which obsoletes this new requirement
                    var found = false;
                    foreach (var req in seenLst)
                    {
                        if (req.Equals(realReq) || req.StrictlyBetterThan(realReq))
                        {
                            found = true;
                            break;
                        }
                    }
                    if (!found)
                    {
                        seenLst.Add(realReq);
                        queue.Enqueue(Tuple.Create(realReq, nextNode));
                    }
                }
            }

            if (!seen.TryGetValue(end, out var disjunct))
            {
                return(new Impossible());
            }

            return(Requirement.Or(disjunct));
        }
Beispiel #18
0
 public StaticEdge OtherEdge(LinkedNode One)
 {
     return(One == NodeA ? StaticB : One == NodeB ? StaticA : throw new Exception("Misplaced LinkedEdge call"));
 }
Beispiel #19
0
 public TaskPathwayPickEdge(RandoLogic logic, LinkedNode node) : base(logic)
 {
     // TODO: advance forward through any obligatory edges
     this.Node = node;
 }
 public TaskPathwayBerryOffshoot(RandoLogic logic, LinkedNode node) : base(logic)
 {
     this.Node = node;
 }