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); }
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(); }