示例#1
0
        public void ResetRoom(List <RoomInfo> removeList, List <RoomInfo> addList, DoorPairingsTracker tracker)
        {
            foreach (DoorInfo door in doorList)
            {
                tracker.DisconnectDoor(door);
            }
            if (removeList != null)
            {
                removeList.Remove(this);
            }
            if (addList != null && !addList.Contains(this) && doorList.Count > 0)
            {
                addList.Add(this);
            }

            //Program.DebugLog("Clearing room " + roomName);
        }
示例#2
0
        public static void CreatePath(int passage, int level, XmlNode levelNode)
        {
            if (passage == 5)
            {
                hasEntities = false;
            }

            Console.WriteLine("--- Randomizing level {0};{1} ---", PassageName(passage), level + 1);
            int levelHeaderPointer = LevelHeadersLocation + Program.GetLevelHeaderIndex(passage, level) * 12;
            int roomMax            = Program.romBuffer[levelHeaderPointer + 1];

            for (int i = 0; i < roomMax; i++)
            {
                FillVanillaEntities(passage, level, i);
            }

            foreach (XmlNode node in levelNode.ChildNodes)
            {
                if (node.Name == "roomConnection")
                {
                    LoadRoomConnection(node);
                }
                else
                {
                    switch (node.Name.Split('_')[0])
                    {
                    case "room":
                        LoadRoom(node);
                        break;
                    }
                }
            }

            portalRoom = roomList[0];
            List <EntityInfo> levelEntities = new List <EntityInfo>();

            foreach (List <EntityInfo> info in vanillaEntities)
            {
                levelEntities.AddRange(info);
            }

            List <RoomInfo> inLogic = new List <RoomInfo>();

            roomsNotInLogic.AddRange(roomList);

            doorPairs.FinalizeDoors();

RestartLogic:

            BranchLogic(inLogic, portalRoom);

            List <RoomInfo> checkedRooms = new List <RoomInfo>();

            /// While there are still rooms not in logic yet
            ///     Get two empty pointers, one for door in logic, one out of logic
            ///     while failed
            ///         Pick random room in and out of logic.
            ///         Pick random door from out of logic room.
            ///         Save door type
            ///         Save all doors of the opposite type from in logic room in array
            ///         Pick two random doors.  If second array is empty, repick rooms from in and out of logic
            ///     (We don't need in logic room anymore)
            ///     Save the two rooms on each side of the in logic door
            ///     Save the two connected doors
            ///     Disconnect doors
            ///     if one of the two in logic room isn't connected to portal
            ///         reset all rooms on that branch
            ///     Set a pointer to one of the rooms still in logic
            ///     Connect the new doors
            ///     Redo before logic path on the once out of logic door's base room
            ///
            /// Connect up the rest of the doors
            count = 0;
            /// While there are still rooms not in logic yet
            while (roomsNotInLogic.Count > 0)
            {
                Program.DebugLog("StartOfLoop");
                for (int i = roomsNotInLogic.Count; i > 0; i--)
                {
                    if (roomsNotInLogic[i - 1].doorList.Count == 0)
                    {
                        roomsNotInLogic.RemoveAt(i - 1);
                    }
                }
                /// Get two empty pointers, one for door in logic, one out of logic
                DoorInfo inLogicDoor = null, outOfLogicDoor;

                /// Get all possible door pairings between out of logic doors and in logic doors that are already connected.
                {
                    DoorPairing[] pairs = FindPossiblePairs(roomsNotInLogic.ToArray(), inLogic.ToArray(), true);

                    if (pairs.Length == 0)
                    {
                        inLogic[Program.GetRandomInt(inLogic.Count)].ResetRoom(inLogic, roomsNotInLogic, doorPairs);
                        goto RestartLogic;
                    }
                    DoorPairing pair = pairs[Program.GetRandomInt(pairs.Length)];
                    /// Pick a random pair.
                    /// If no pairs exist, throw error
                    ///
                }
                /// while failed
                do
                {
                    /// Pick random room in logic...
                    int v = Program.GetRandomInt(inLogic.Count);
                    Program.DebugLog("Index {0}", v);
                    outOfLogicDoor = null;

                    RoomInfo inLogicRoom = inLogic[v], outofLogicRoom;

                    /// ...and out of logic.
                    /// Pick random door from out of logic room.
                    while (outOfLogicDoor == null || !outOfLogicDoor.CanWalkInto(Program.pathingLogicBefore))
                    {
                        outofLogicRoom = roomsNotInLogic[Program.GetRandomInt(roomsNotInLogic.Count)];
                        if (outofLogicRoom.doorList.Count > 0)
                        {
                            outOfLogicDoor = outofLogicRoom.doorList[Program.GetRandomInt(outofLogicRoom.doorList.Count)];
                        }
                    }

                    /// Save door type
                    DoorType type = outOfLogicDoor.doorType;

                    List <DoorInfo> inLogicDoors = new List <DoorInfo>();
                    /// Save all doors of the opposite type from in logic room in array
                    foreach (DoorInfo door in inLogicRoom.doorList)
                    {
                        if ((int)door.doorType == -(int)type && door.connectedDoor != null)
                        {
                            inLogicDoors.Add(door);
                        }
                    }
                    /// If second array is empty, redo loop
                    if (inLogicDoors.Count == 0)
                    {
                        continue;
                    }
                    /// Pick two random doors.
                    inLogicDoor = inLogicDoors[Program.GetRandomInt(inLogicDoors.Count)];

                    break;
                } while (true);

                /// Save the two connected doors
                DoorInfo firstDoor = inLogicDoor, secondDoor = inLogicDoor.connectedDoor;
                /// Save the two rooms on each side of the in logic door
                RoomInfo roomOne = firstDoor.BaseRoom, roomTwo = secondDoor.BaseRoom;

                /// Disconnect doors

                doorPairs.DisconnectDoor(firstDoor);

                /// if one of the two in logic room isn't connected to portal

                checkedRooms.Clear();
                if (!IsConnectedToFirstRoom(roomOne, checkedRooms))
                {
                    ClearRoom(inLogic, roomsNotInLogic, doorPairs);
                    checkedRooms.Clear();
                    ClearRoom = null;
                }
                if (!IsConnectedToFirstRoom(roomTwo, checkedRooms))
                {
                    ClearRoom = null;
                    checkedRooms.Clear();

                    BranchLogic(inLogic, outOfLogicDoor.BaseRoom);

                    doorPairs.ConnectDoors(firstDoor, secondDoor);

                    continue;
                }

                doorPairs.ConnectDoors(inLogicDoor, outOfLogicDoor);

                BranchLogic(inLogic, outOfLogicDoor.BaseRoom);
            }
            Program.DebugLog("NoMoreRooms out of Logic");

            //List<RoomInfo> tempRooms = new List<RoomInfo>();
            //checkedRooms.Clear();
            //foreach (RoomInfo info in roomList)
            //{
            //    if (checkedRooms.Contains(info))
            //        continue;
            //    if (!CanEnterFirstRoom(info, tempRooms, true))
            //    {
            //        foreach (RoomInfo roomBad in tempRooms)
            //        {
            //            roomBad.ResetRoom(inLogic, roomsNotInLogic, doorPairs);
            //        }
            //        goto RestartLogic;
            //    }
            //    checkedRooms.AddRange(tempRooms);
            //}

            //checkedRooms.Clear();
            //tempRooms.Clear();
            //foreach (RoomInfo info in roomList)
            //{
            //    if (checkedRooms.Contains(info))
            //        continue;
            //    if (!CanEnterFirstRoom(info, tempRooms, false))
            //    {
            //        foreach (RoomInfo roomBad in tempRooms)
            //        {
            //            roomBad.ResetRoom(inLogic, roomsNotInLogic, doorPairs);
            //        }
            //        goto RestartLogic;
            //    }
            //    checkedRooms.AddRange(tempRooms);
            //}

            doorPairs.ConnectLeftoverDoors();

            RandomizeEntities(inLogic);

            int levelID        = Program.GetLevelID(passage, level);
            int doorArrayStart = Program.GetPointer(DoorTableLocation + levelID * 4);

            foreach (RoomInfo room in inLogic)
            {
                foreach (DoorInfo door in room.doorList)
                {
                    door.SetRomInfo(doorArrayStart);
                }
                foreach (EntityInfo entity in room.entityList)
                {
                    entity.ChangeRom();
                }
            }

            Clear();
        }