private static void ConnectRoom(RoomPos roomPos, RoomPos foundPos, List <RoomPos> currentRoad, List <RoomPos> foundRoad) { if (roomPos.X == foundPos.X) { int direction = foundPos.Y - roomPos.Y; direction = direction / Math.Abs(direction); while (true) { RoomPos newRoomPos = new RoomPos(roomPos.X, roomPos.Y + direction); { currentRoad.Add(newRoomPos); roomPos = newRoomPos; if (foundRoad.FirstOrDefault(i => i.X == roomPos.X && i.Y == roomPos.Y) != null) { break; } } } } else { int direction = foundPos.X - roomPos.X; direction = direction / Math.Abs(direction); while (true) { RoomPos newRoomPos = new RoomPos(roomPos.X + direction, roomPos.Y); { currentRoad.Add(newRoomPos); roomPos = newRoomPos; if (foundRoad.FirstOrDefault(i => i.X == roomPos.X && i.Y == roomPos.Y) != null) { break; } } } } }
private static bool SearchForRoadMatch(RoomPos roomPos, List <RoomPos> listRoad, List <List <RoomPos> > allRoads) { bool matchPos = false; foreach (List <RoomPos> road in allRoads) { if (road == listRoad) { continue; } else { RoomPos foundPos = road.FirstOrDefault(i => i.X == roomPos.X || i.Y == roomPos.Y); if (foundPos != null) { ConnectRoom(roomPos, foundPos, listRoad, road); return(true); } } } return(matchPos); }
private IRoom GetRoom(RoomPos roomPosition, IZone zone) { int roomId = roomPosition.Y * Width + roomPosition.X + 1; return(zone.Rooms[roomId]); }
public IZone AddRoad(IZone zone, ZoneConnection northZoneId, ZoneConnection eastZoneId, ZoneConnection southZoneId, ZoneConnection westZoneId) { RoomPos northPos = null; RoomPos eastPos = null; RoomPos southPos = null; RoomPos westPos = null; bool northContinue = false; bool eastContinue = false; bool southContinue = false; bool westContinue = false; List <RoomPos> northRoad = new List <RoomPos>(); List <RoomPos> eastRoad = new List <RoomPos>(); List <RoomPos> southRoad = new List <RoomPos>(); List <RoomPos> westRoad = new List <RoomPos>(); List <List <RoomPos> > allRoads = new List <List <RoomPos> >() { northRoad, eastRoad, southRoad, westRoad }; #region Setup if (northZoneId != null) { northPos = new RoomPos(_exits[0], 0); northContinue = true; northRoad.Add(northPos); IRoom room = GetRoom(northPos, zone); ZoneHelper.ConnectZone(room, Direction.North, northZoneId.ZoneId, northZoneId.RoomId); } if (eastZoneId != null) { eastPos = new RoomPos(Width - 1, _exits[1]); eastContinue = true; eastRoad.Add(eastPos); IRoom room = GetRoom(eastPos, zone); ZoneHelper.ConnectZone(room, Direction.East, eastZoneId.ZoneId, eastZoneId.RoomId); } if (southZoneId != null) { southPos = new RoomPos(_exits[2], Height - 1); southContinue = true; southRoad.Add(southPos); IRoom room = GetRoom(southPos, zone); ZoneHelper.ConnectZone(room, Direction.South, southZoneId.ZoneId, southZoneId.RoomId); } if (westZoneId != null) { westPos = new RoomPos(0, _exits[3]); westContinue = true; westRoad.Add(westPos); IRoom room = GetRoom(westPos, zone); ZoneHelper.ConnectZone(room, Direction.West, westZoneId.ZoneId, westZoneId.RoomId); } #endregion Setup while (MultipleRoadsContinue(northContinue, eastContinue, southContinue, westContinue)) { if (northContinue) { bool matchPos = SearchForRoadMatch(northPos, northRoad, allRoads); if (matchPos) { northContinue = false; } else { RoomPos newPos = new RoomPos(northPos.X, northPos.Y - 1); northRoad.Add(newPos); northPos = newPos; } } if (eastContinue) { bool matchPos = SearchForRoadMatch(eastPos, eastRoad, allRoads); if (matchPos) { eastContinue = false; } else { RoomPos newPos = new RoomPos(eastPos.X - 1, eastPos.Y); eastRoad.Add(newPos); eastPos = newPos; } } if (southContinue) { bool matchPos = SearchForRoadMatch(southPos, southRoad, allRoads); if (matchPos) { southContinue = false; } else { RoomPos newPos = new RoomPos(southPos.X, southPos.Y - 1); southRoad.Add(newPos); southPos = newPos; } } if (westContinue) { bool matchPos = SearchForRoadMatch(westPos, westRoad, allRoads); if (matchPos) { westContinue = false; } else { RoomPos newPos = new RoomPos(westPos.X + 1, westPos.Y); westRoad.Add(newPos); westPos = newPos; } } } foreach (List <RoomPos> road in allRoads) { foreach (RoomPos roomPos in road) { IRoom room = GetRoom(roomPos, zone); room.LongDescription = RoadDescription.LongDescription; room.ShortDescription = RoadDescription.ShortDescription; room.ExamineDescription = RoadDescription.ExamineDescription; } } return(zone); }