Beispiel #1
0
        public async Task Genrate()
        {
            _startingpos = (StartingPosition)NumGen.Next(0, 5) /*StartingPosition.Center*/;
            LogToUiThread($"Starting position : {_startingpos}");

            int roomcount = _dp.RoomNumber.Next();

            LogToUiThread($"Generating {roomcount} rooms");
            for (int i = 0; i < roomcount; i++)
            {
                bool      isFirst = i == 0;
                Direction dir     = Direction.North;
                if (isFirst)
                {
                    dir = GetDirByStartupPos();
                }
                else
                {
                    dir = (Direction)NumGen.Next(0, 4);
                }


                var r = await GenerateRoom(dir, (Corridors.Count > 0)?Corridors[i - 1] : null, (isFirst));

                Rooms.Add(r);

                //si dernière salle, pas couloir
                if (i < roomcount - 1)
                {
                    var c = await GenerateCorridor(r);

                    Corridors.Add(c);
                }
            }
        }
Beispiel #2
0
        public void GetAllRoomsAndCorridors()
        {
            Rooms.Clear();
            Corridors.Clear();
            ClearAllSpaces(TileMap, NumColumns, NumRows);
            DetermineSpaceTypes();


            for (int column = 0; column < NumColumns; column++)
            {
                for (int row = 0; row < NumRows; row++)
                {
                    Tile activeSpace = GetFloorSpace(column, row);
                    if (activeSpace == null)
                    {
                        continue;
                    }

                    if (activeSpace.SpaceType == SpaceType.Room)
                    {
                        if (activeSpace.Parent == null)
                        {
                            Rooms.Add(CreateRoomFromSpace(activeSpace));
                        }
                    }
                    else if (activeSpace.SpaceType == SpaceType.Corridor)
                    {
                        if (activeSpace.Parent == null)
                        {
                            Corridors.Add(CreateCorridorFromSpace(activeSpace));
                        }
                    }
                }
            }
        }
        private void Window_Initialized(object sender, EventArgs e)
        {
            Dispatcher.Invoke(new Action(() => {
                cmbPair.ResetText();
                cmbLotsToTradeBuy.ResetText();
                cmbLotsToTradeSell.ResetText();
                if (pair == "")
                {
                    MessageBox.Show("Pair is not selected!");
                    return;
                }
                if (isMainWindow)
                {
                    System.IO.File.Delete(logFileName);
                }
                fw                               = new Order2GoAddIn.FXCoreWrapper(app.FXCM);
                chartingWindow                   = new HedgeHog.Charting(this.Name, fw);
                corridorsWindow                  = new Corridors(this.Name);
                chartingWindow.TicksChanged     += chartingWindow_TicksChanged;
                chartingWindow.PriceGridChanged += ProcessPrice;
                chartingWindow.PriceGridError   += chartingWindow_PriceGridError;
                dataGrid1.AutoGeneratingColumn  += new EventHandler <Microsoft.Windows.Controls.DataGridAutoGeneratingColumnEventArgs>(dataGrid1_AutoGeneratingColumn);
                RaisePropertyChanged(() => title);
            }));

            //Window w = sender as Window;
            //w.Height = Properties.Settings.Default.MainWindowSize.Height;
            //w.Width = Properties.Settings.Default.MainWindowSize.Width;
            //w.Top = Properties.Settings.Default.MainWindowPos.Y;
            //w.Left = Properties.Settings.Default.MainWindowPos.X;
        }
Beispiel #4
0
        void GetTilesAndRoomsFromFlyweights()
        {
            foreach (Guid guid in flyweights.Keys)
            {
                JObject jObject       = flyweights[guid] as JObject;
                JToken  typeNameToken = jObject.GetValue("TypeName");
                string  typeName      = typeNameToken.ToString();
                switch (typeName)
                {
                case "MapCore.Tile":
                    Tile tile = jObject.ToObject <Tile>();
                    Tiles.Add(tile);
                    reconstitutedFlyweights[guid] = tile;
                    break;

                case "MapCore.MapRegion":
                    MapRegion mapRegion = jObject.ToObject <MapRegion>();
                    reconstitutedFlyweights[guid] = mapRegion;
                    if (mapRegion.RegionType == RegionType.Room)
                    {
                        Rooms.Add(mapRegion);
                    }
                    else if (mapRegion.RegionType == RegionType.Corridor)
                    {
                        Corridors.Add(mapRegion);
                    }
                    break;
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// Private function conforming the Corridors to other Story Room lists.
        /// </summary>
        private void FitCorridors()
        {
            var corridors = Corridors.ToList();

            Corridors.Clear();
            foreach (var corridor in corridors)
            {
                AddCorridor(corridor);
            }
        }
Beispiel #6
0
        /// <summary>
        /// Adds a Room to the Corridors list.
        /// </summary>
        /// <param name="room">Room to add.</param>
        /// <param name="fit">Indicates whether the new corridor should mutually fit to other Story features.</param>
        /// <param name="merge">Indicates whether the new corridor should merge with other corridors.</param>
        /// <returns>
        /// True if one or more rooms were added to the Story.
        /// </returns>
        public bool AddCorridor(Room room, bool fit = true, bool merge = true)
        {
            if (Perimeter == null || room.Perimeter == null || !Perimeter.Covers(perimeter))
            {
                return(false);
            }
            var newRoom =
                new Room()
            {
                Color     = room.Color,
                Elevation = Elevation,
                Height    = room.Height,
                Name      = room.Name,
                Perimeter = room.Perimeter
            };
            var fitRooms = new List <Room> {
                newRoom
            };

            if (fit)
            {
                var toRooms = new List <Room>(Exclusions);
                toRooms.AddRange(Services);
                fitRooms = FitRooms(fitRooms, toRooms, false);
                Rooms    = FitRooms(Rooms, fitRooms);
            }
            if (fitRooms.Count == 0)
            {
                return(false);
            }
            Corridors.AddRange(fitRooms);
            var merged = Shaper.Merge(CorridorsAsPolygons);

            if (merge && merged.Count < Corridors.Count)
            {
                Corridors.Clear();
                foreach (var corridor in merged)
                {
                    Corridors.Add(
                        new Room()
                    {
                        Color     = room.Color,
                        Elevation = Elevation,
                        Height    = room.Height,
                        Name      = room.Name,
                        Perimeter = corridor
                    });
                }
            }
            return(true);
        }
Beispiel #7
0
        public void AddCorridor(string firstName, string secondName)
        {
            var nodeFirst  = FindNode(firstName);
            var nodeSecond = FindNode(secondName);

            if (nodeFirst == null || nodeSecond == null)
            {
                return;
            }
            nodeFirst.AddCorridor(nodeSecond);
            nodeSecond.AddCorridor(nodeFirst);

            Corridors.Add(new GraphCorridor(LastIdCorridor, nodeFirst, nodeSecond));
            LastIdCorridor++;
        }
Beispiel #8
0
        public void ConnectRooms()
        {
            var rooms = AllRooms;

            Corridors.Add(1, 2, rooms);
            Corridors.Add((1), (3), rooms);
            Corridors.Add((1), (4), rooms);
            Corridors.Add((2), (6), rooms);
            Corridors.Add((2), (999), rooms, 2, true);
            Corridors.Add((3), (7), rooms, 2);
            Corridors.Add((4), (8), rooms);
            Corridors.Add((4), (999), rooms, 2, true);
            Corridors.Add((5), (999), rooms, 2, true);
            Corridors.Add((5), (6), rooms);
            Corridors.Add((5), (10), rooms, 2);
            Corridors.Add((6), (7), rooms);
            Corridors.Add((6), (11), rooms);
            Corridors.Add((7), (8), rooms);
            Corridors.Add((8), (9), rooms);
            Corridors.Add((8), (11), rooms);
            Corridors.Add((9), (12), rooms, 2);
            Corridors.Add((9), (999), rooms, 1, true);
            Corridors.Add((10), (13), rooms, 2);
            Corridors.Add((11), (14), rooms);
            Corridors.Add((11), (15), rooms);
            Corridors.Add((12), (16), rooms, 2);
            ;
            Corridors.Add((13), (14), rooms);
            Corridors.Add((13), (19), rooms);
            ;
            Corridors.Add((14), (17), rooms);
            Corridors.Add((14), (999), rooms, 1, true);
            Corridors.Add((15), (18), rooms);
            Corridors.Add((15), (16), rooms);
            Corridors.Add((15), (999), rooms, 1, true);
            ;
            ;
            Corridors.Add((16), (21), rooms);
            Corridors.Add((17), (19), rooms);
            Corridors.Add((17), (20), rooms, 2);
            Corridors.Add((18), (20), rooms, 2);
            Corridors.Add((18), (21), rooms);
            ;
            Corridors.Add((19), (999), rooms, 2, true);
            Corridors.Add((21), (999), rooms, 2, true);
        }
Beispiel #9
0
 /// <summary>
 /// Private function configuring all Corridor perimeters to conform to all Service perimeters.
 /// </summary>
 /// <returns>
 /// None.
 /// </returns>
 private void FitCorridorsToServices()
 {
     foreach (Room service in Services)
     {
         if (service.Perimeter == null)
         {
             continue;
         }
         int        index    = 0;
         List <int> indices  = new List <int>();
         var        addRooms = new List <Room>();
         foreach (Room room in Corridors)
         {
             var perimeters = room.Perimeter.Difference(service.Perimeter);
             if (perimeters != null && perimeters.Count > 0)
             {
                 room.Perimeter = perimeters.First();
                 for (int i = 1; i < perimeters.Count; i++)
                 {
                     var addRoom = new Room()
                     {
                         Color     = room.Color,
                         Elevation = room.Elevation,
                         Height    = room.Height,
                         Name      = room.Name,
                         Perimeter = perimeters[i]
                     };
                     addRooms.Add(addRoom);
                 }
             }
             else
             {
                 indices.Add(index);
             }
             index++;
         }
         foreach (int remove in indices)
         {
             Corridors.RemoveAt(remove);
         }
         if (addRooms.Count > 0)
         {
             Corridors.AddRange(addRooms);
         }
     }
 }
Beispiel #10
0
        /// <summary>
        /// Attempt to build a corridor at the end of a random corridor.
        /// </summary>
        /// <returns>
        /// True if a corridor was built. Otherwise, false.
        /// </returns>
        private bool BuildCorridorOnCorridorEnd()
        {
            for (int attempt = 0; attempt < MaximumAttempts; attempt++)
            {
                int     directionAwayFromCorridor;
                Vector2 corridorEndpoint = GetEndOfCorridor(out directionAwayFromCorridor);

                Rect corridor = GetCorridor(corridorEndpoint, directionAwayFromCorridor);
                if (RectangleFits(corridor))
                {
                    Corridors.Add(corridor);
                    BuildRectangle(corridor);
                    return(true);
                }
            }

            return(false);
        }
Beispiel #11
0
        /// <summary>
        /// Creates a rectangular corridor Room from a centerline axis, width, and height, at the Story elevation.
        /// Adds the new Room to the Corrdors list.
        /// Corridors conform to Service perimeters.
        /// Corridors change intersecting Room perimeters to conform to the corridor's perimeter.
        /// </summary>
        /// <param name="axis">Center Line of the corridor.</param>
        /// <param name="width">Width of the corridor.</param>
        /// <param name="height">Height of the corridor.</param>
        /// <param name="name">String identifier.</param>
        /// <param name="color">Rendering color of the Room as a Space.</param>
        /// <returns>
        /// None.
        /// </returns>
        public void AddCorridor(Line axis,
                                double width  = 2.0,
                                double height = 3.0,
                                string name   = "",
                                Color color   = null)
        {
            var corridor = new Room()
            {
                Color     = color,
                Elevation = Elevation,
                Height    = height,
                Name      = name
            };

            corridor.MakePerimeter(axis, width);
            Corridors.Add(corridor);
            FitCorridorsToServices();
            FitRoomsToCorridors();
        }
Beispiel #12
0
        /// <summary>
        /// Attempt to build a corridor on the side of a room.
        /// </summary>
        /// <returns>
        /// True if a corridor was built. Otherwise, false.
        /// </returns>
        private bool BuildCorridorOnRoomEdge()
        {
            for (int attempt = 0; attempt < MaximumAttempts; attempt++)
            {
                int     direction;
                Vector2 door = GetRoomEdge(out direction);

                Rect corridor = GetCorridor(door, direction);
                if (RectangleFits(corridor))
                {
                    Corridors.Add(corridor);
                    BuildRectangle(corridor);
                    Map[(int)door.x, (int)door.y] = (int)MapElements.Door;
                    Doors.Add(door);
                    return(true);
                }
            }

            return(false);
        }
Beispiel #13
0
        /// <summary>
        /// Adds a Room to the Corridors list.
        /// </summary>
        /// <param name="room">Room to add.</param>
        /// <returns>
        /// True if one or more Rooms were added.
        /// </returns>
        public bool AddCorridor(Room room,
                                bool merge       = true,
                                double tolerance = 0.0,
                                double minLength = 0.0)
        {
            var perimeters = Shaper.FitWithin(room.Perimeter, Perimeter);

            if (perimeters.Count == 0)
            {
                return(false);
            }
            var fitAmong = new List <Polygon>(OpeningsAsPolygons);

            fitAmong.AddRange(ExclusionsAsPolygons);
            fitAmong.AddRange(ServicesAsPolygons);
            var corridors = Shaper.Differences(perimeters, fitAmong).ToList();

            if (corridors.Count() == 0)
            {
                return(false);
            }
            corridors.AddRange(CorridorsAsPolygons);
            if (merge)
            {
                corridors = Shaper.Merge(corridors);
            }
            Corridors.Clear();
            foreach (var corridor in corridors)
            {
                Corridors.Add(
                    new Room(room)
                {
                    Elevation = Elevation,
                    Height    = room.Height,
                    Perimeter = corridor
                });
            }
            FitRooms();
            return(true);
        }
Beispiel #14
0
        /// <summary>
        /// Creates a corridor Room from a perimeter and height, at the Story elevation.
        /// Adds the new Room to the Corrdors list.
        /// Corridors conform to Service perimeters.
        /// Corridors change intersecting Room perimeters to conform to the corridor's perimeter.
        /// </summary>
        /// <param name="perimeter">Polygon perimeter of the corridor.</param>
        /// <param name="height">Height of the corridor.</param>
        /// <param name="name">String identifier.</param>
        /// <param name="color">Rendering color of the Room as a Space.</param>
        /// <returns>
        /// None.
        /// </returns>
        public void AddCorridor(Polygon perimeter,
                                double height = 3.0,
                                string name   = "",
                                Color color   = null)
        {
            if (Perimeter == null)
            {
                throw new ArgumentNullException(Messages.PERIMETER_NULL_EXCEPTION);
            }
            var corridor = new Room()
            {
                Color     = color,
                Elevation = elevation,
                Height    = height,
                Name      = name,
                Perimeter = perimeter
            };

            Corridors.Add(corridor);
            FitCorridorsToServices();
            FitRoomsToCorridors();
        }
Beispiel #15
0
        /// <summary>
        /// Adds a Room to the Corridors list.
        /// </summary>
        /// <param name="room">Room to add.</param>
        /// <param name="fit">Indicates whether the new room should mutually fit to other Story features. Default is true.</param>
        /// <returns>
        /// True if one or more rooms were added to the Story.
        /// </returns>
        public bool AddCorridor(Room room, bool fit = true)
        {
            if (Perimeter == null || room.Perimeter == null)
            {
                throw new ArgumentNullException(Messages.PERIMETER_NULL_EXCEPTION);
            }
            if (!Perimeter.Covers(perimeter))
            {
                throw new ArgumentNullException(Messages.PERIMETER_PLACEMENT_EXCEPTION);
            }
            var newRoom =
                new Room()
            {
                Color     = room.Color,
                Elevation = Elevation,
                Height    = room.Height,
                Name      = room.Name,
                Perimeter = room.Perimeter
            };
            var fitRooms = new List <Room> {
                newRoom
            };

            if (fit)
            {
                var toRooms = new List <Room>(Exclusions);
                toRooms.AddRange(Services);
                fitRooms = FitRooms(fitRooms, toRooms, false);
                Rooms    = FitRooms(Rooms, fitRooms);
            }
            if (fitRooms.Count == 0)
            {
                return(false);
            }
            Corridors.AddRange(fitRooms);
            return(true);
        }
        private static void Aux_MakeRandomCorridor(ref char[][] map, MapMeta meta, Point coord, List <Corridors> corridors)
        {
            int           headTo = RandomNumber.Between(0, 4);
            int           direction = RandomNumber.Between(0, 3); // +/- , + , -
            int           lengthPositive = 0, lengthNegative = 0;
            Stack <Point> path      = new Stack <Point>();
            Point         baseCoord = new Point(coord.X, coord.Y);

            if (direction == 0)
            {
                lengthPositive = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);
                lengthNegative = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);
            }
            else if (direction == 1)
            {
                lengthPositive = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);
            }
            else
            {
                lengthNegative = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);
            }

            for (int i = 0; i < lengthPositive; i++)
            {
                switch (headTo)
                {
                case N:
                case S:
                    coord.Y++; break;

                case W:
                case E:
                    coord.X++; break;

                default:
                    break;
                }

                if (coord.X + 1 > meta.MapSizeX)
                {
                    coord.X--; continue;
                }
                else if (coord.Y + 1 > meta.MapSizeY)
                {
                    coord.Y--; continue;
                }

                if (map[(int)coord.X][(int)coord.Y] != (char)TileType.FLOOR_START)
                {
                    map[(int)coord.X][(int)coord.Y] = (char)TileType.FLOOR;
                }

                path.Push(coord);
            }

            coord = baseCoord;

            for (int i = 0; i < lengthNegative; i++)
            {
                switch (headTo)
                {
                case N:
                case S:
                    coord.Y--; break;

                case W:
                case E:
                    coord.X--; break;

                default:
                    break;
                }

                if (coord.X - 1 < 0)
                {
                    coord.X++; continue;
                }
                else if (coord.Y - 1 < 0)
                {
                    coord.Y++; continue;
                }

                if (map[(int)coord.X][(int)coord.Y] != (char)TileType.FLOOR_START)
                {
                    map[(int)coord.X][(int)coord.Y] = (char)TileType.FLOOR;
                }

                path.Push(coord);
            }

            Corridors crd = new Corridors
            {
                CorridorData    = path,
                IsBranch        = true,
                CorridorStartAt = -1,
                CorridorEndAt   = -1,
            };

            corridors.Add(crd);
        }
        private static void Stage4_ConnectRooms(
            ref char[][] map,
            MapMeta meta,
            List <RoomMeta> rooms,
            List <Corridors> corridors,
            int overrideRoomStart,
            int overrideRoomTarget)
        {
            bool completeFlag = false;
            bool overrideFlag = false;

            if (overrideRoomStart != 0 || overrideRoomTarget != 0)
            {
                overrideFlag = true;
            }

            if (meta.MaxRoomNumber != rooms.Count)
            {
                meta.MaxRoomNumber = rooms.Count;
            }

            while (completeFlag == false)
            {
                Stack <Point> stack      = new Stack <Point>();
                int           targetRoom = RandomNumber.Between(1, meta.MaxRoomNumber - 1);
                int           startRoom  = 0;
                int           maxConn    = RandomNumber.Between(1, meta.MaxRoomConnection);

                for (int i = 0; i < rooms.Count; i++)
                {
                    if (rooms[i].Connections < maxConn)
                    {
                        startRoom = i;
                        break;
                    }

                    // there is no more room that 0 connection
                    if (i == rooms.Count - 1)
                    {
                        completeFlag = true;
                    }
                }

                if (overrideFlag)
                {
                    startRoom    = overrideRoomStart;
                    targetRoom   = overrideRoomTarget;
                    completeFlag = true;
                }

                // starting position
                stack.Push(new Point {
                    X = rooms[startRoom].X, Y = rooms[startRoom].Y
                });

                Point  start  = stack.Pop();
                int    curX   = (int)start.X;
                int    curY   = (int)start.Y;
                double dist   = double.MaxValue;
                int    cs     = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);
                int    headTo = 0;

                while (dist > 1.412)
                {
                    // Readjust point that out of bound
                    double distN = (new Point(curX, curY + 1) - new Point(rooms[targetRoom].X, rooms[targetRoom].Y)).LengthSquared;
                    double distS = (new Point(curX, curY - 1) - new Point(rooms[targetRoom].X, rooms[targetRoom].Y)).LengthSquared;
                    double distW = (new Point(curX - 1, curY) - new Point(rooms[targetRoom].X, rooms[targetRoom].Y)).LengthSquared;
                    double distE = (new Point(curX + 1, curY) - new Point(rooms[targetRoom].X, rooms[targetRoom].Y)).LengthSquared;

                    double min = Math.Min(distE, Math.Min(distW, Math.Min(distN, distS)));

                    // Corridor twister here (set on meta) - 0, 4 = 25%
                    int rb = RandomNumber.Between(0, meta.RouteTwistFactor);

                    if (rb == 0)
                    {
                        int rc = RandomNumber.Between(0, 4);

                        if (rc == N)
                        {
                            min = distN;
                        }
                        else if (rc == S)
                        {
                            min = distS;
                        }
                        else if (rc == W)
                        {
                            min = distW;
                        }
                        else if (rc == E)
                        {
                            min = distE;
                        }
                    }

                    dist = min;

                    // Boundary check
                    if (curX > meta.MapSizeX)
                    {
                        curX--; continue;
                    }
                    else if (curY > meta.MapSizeY)
                    {
                        curY--; continue;
                    }
                    else if (curX - 1 < 0)
                    {
                        curX++; continue;
                    }
                    else if (curY - 1 < 0)
                    {
                        curY++; continue;
                    }

                    // Push cursor
                    if (min == distN)
                    {
                        stack.Push(new Point {
                            X = curX, Y = ++curY
                        }); headTo = N;
                    }
                    if (min == distS)
                    {
                        stack.Push(new Point {
                            X = curX, Y = --curY
                        }); headTo = S;
                    }
                    if (min == distW)
                    {
                        stack.Push(new Point {
                            X = --curX, Y = curY
                        }); headTo = W;
                    }
                    if (min == distE)
                    {
                        stack.Push(new Point {
                            X = ++curX, Y = curY
                        }); headTo = E;
                    }

                    // Make corridor straight
                    int straight = RandomNumber.Between(0, meta.RouteDirectFactor);

                    if (straight == 0)
                    {
                        cs = RandomNumber.Between(meta.MinCorridorStraight, meta.MaxCorridorStraight);

                        switch (headTo)
                        {
                        case N:
                            for (int i = 0; i < cs; i++)
                            {
                                stack.Push(new Point {
                                    X = curX, Y = ++curY
                                });
                            }
                            break;

                        case S:
                            for (int i = 0; i < cs; i++)
                            {
                                stack.Push(new Point {
                                    X = curX, Y = --curY
                                });
                            }
                            break;

                        case W:
                            for (int i = 0; i < cs; i++)
                            {
                                stack.Push(new Point {
                                    X = --curX, Y = curY
                                });
                            }
                            break;

                        case E:
                            for (int i = 0; i < cs; i++)
                            {
                                stack.Push(new Point {
                                    X = ++curX, Y = curY
                                });
                            }
                            break;

                        default:
                            break;
                        }
                    }
                }

                // Save corridors data
                Stack <Point> tmp = new Stack <Point>();
                tmp = CopyStack.Clone(stack);
                Corridors crd = new Corridors
                {
                    CorridorData    = tmp,
                    IsBranch        = false,
                    CorridorStartAt = startRoom,
                    CorridorEndAt   = targetRoom,
                };
                corridors.Add(crd);

                // Draw path
                while (stack.Count > 0)
                {
                    Point pt = stack.Pop();

                    if (pt.X < meta.MapSizeX &&
                        pt.X >= 0 &&
                        pt.Y < meta.MapSizeY &&
                        pt.Y >= 0)
                    {
                        if (map[(int)pt.X][(int)pt.Y] != (char)TileType.FLOOR_START)
                        {
                            map[(int)pt.X][(int)pt.Y] = (char)TileType.FLOOR;
                        }
                    }
                }

                // Add connections
                rooms[startRoom].Connections++;
                rooms[targetRoom].Connections++;
            }
        }
Beispiel #18
0
    public void AddCorridors()
    {
        VectQuater aux;
        bool       canCreate;
        int        cardinal;

        foreach (Room room in rooms)
        {
            //Main Corridor
            cardinal  = 0;
            canCreate = true;

            if (room is Triangle)
            {
                while (!room.PrevRoom[cardinal])
                {
                    cardinal++;
                }
                aux = room.CorridorCreator(cardinal);

                for (int j = 0; j < nCInitialized; j++)
                {
                    if (aux.vector3 == posNoCorr[j])
                    {
                        continue;
                    }
                }

                posCorr[cInitialized]    = aux.vector3;
                posNoCorr[nCInitialized] = aux.vector3;
                cInitialized++;
                nCInitialized++;

                if (aux.quaternion.eulerAngles.y == 90 ||
                    aux.quaternion.eulerAngles.y == 270)
                {
                    Corridors.Add(new CorrH(aux.vector3, aux.quaternion, cInitialized));
                }
                else
                {
                    Corridors.Add(new CorrV(aux.vector3, aux.quaternion, cInitialized));
                }

                continue;
            }

            if (!(room is Octagon))
            {
                room.ActualizeCanCreate(ref posRooms, rInitialized);
            }

            while (!room.PrevRoom[cardinal])
            {
                cardinal++;
            }
            aux = room.CorridorCreator(cardinal);

            for (int j = 0; j < nCInitialized; j++)
            {
                if (canCreate && aux.vector3 == posNoCorr[j])
                {
                    canCreate = false;
                }
            }

            if (canCreate)
            {
                room.Corridors[cardinal] = true;
                posCorr[cInitialized]    = aux.vector3;
                posNoCorr[nCInitialized] = aux.vector3;
                cInitialized++;
                nCInitialized++;
                if (aux.quaternion.eulerAngles.y == 90 ||
                    aux.quaternion.eulerAngles.y == 270)
                {
                    Corridors.Add(new CorrH(aux.vector3, aux.quaternion, cInitialized));
                }
                else
                {
                    Corridors.Add(new CorrV(aux.vector3, aux.quaternion, cInitialized));
                }
            }
            if (room is Octagon)
            {
                continue;
            }

            //Other Corridors

            for (int i = 0; i < room.CanCreateSq.Length; i++)
            {
                if (!room.CanCreateSq[i] && i != cardinal &&
                    Random.Range(0, 10) < properties.ProbCorrid)
                {
                    aux = room.CorridorCreator(i);

                    for (int j = 0; j < nCInitialized; j++)
                    {
                        if (canCreate && aux.vector3 == posNoCorr[j])
                        {
                            canCreate = false;
                        }
                    }

                    if (canCreate)
                    {
                        room.Corridors[i]        = true;
                        posCorr[cInitialized]    = aux.vector3;
                        posNoCorr[nCInitialized] = aux.vector3;
                        cInitialized++;
                        nCInitialized++;

                        if (aux.quaternion.eulerAngles.y == 90 ||
                            aux.quaternion.eulerAngles.y == 270)
                        {
                            Corridors.Add(new CorrH(aux.vector3, aux.quaternion, cInitialized));
                        }
                        else
                        {
                            Corridors.Add(new CorrV(aux.vector3, aux.quaternion, cInitialized));
                        }
                    }
                }
            }
        } //foreach ends
    }
Beispiel #19
0
        /// <summary>
        /// Creates a grid network of corridors within the Story and returns a list of spatially sorted RoomRows ready for population.
        /// </summary>
        /// <param name="rowLength">Distance between cross corridors.</param>
        /// <param name="roomDepth">Desired depth of Rooms.</param>
        /// <param name="corridorWidth">Width of all corridors.</param>
        /// <returns>A List of RoomRow</returns>
        public List <RoomRow> PlanGrid(double rowLength, double rowDepth, double corridorWidth = 3.0, bool split = true)
        {
            Corridors.Clear();
            Rooms.Clear();
            rowLength     = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowLength);
            rowDepth      = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowDepth);
            corridorWidth = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(corridorWidth);

            var row          = Perimeter.Segments().OrderByDescending(s => s.Length()).First();
            var ang          = Math.Atan2(row.End.Y - row.Start.Y, row.End.X - row.Start.X) * (180 / Math.PI);
            var perimeterJig = Perimeter.Rotate(Vector3.Origin, ang * -1);
            var grid         = new Grid2d(perimeterJig);

            grid.U.DivideByFixedLength(rowLength, FixedDivisionMode.RemainderAtBothEnds);
            grid.V.DivideByFixedLength(rowDepth, FixedDivisionMode.RemainderAtBothEnds);
            var uLines   = grid.GetCellSeparators(GridDirection.U).Skip(1).Reverse().Skip(1).Reverse();
            var vLines   = grid.GetCellSeparators(GridDirection.V).Skip(1).Reverse().Skip(1).Reverse();
            var ctrLines = new List <Line>();

            foreach (var curve in uLines)
            {
                ctrLines.Add((Line)curve);
            }
            foreach (var curve in vLines)
            {
                ctrLines.Add((Line)curve);
            }
            foreach (var line in ctrLines)
            {
                var corridor = line.Thicken(corridorWidth);
                if (perimeterJig.Compass().Box.Covers(corridor))
                {
                    AddCorridor(new Room(corridor.Rotate(Vector3.Origin, ang), Height));
                }
            }
            foreach (var cell in grid.CellsFlat)
            {
                var polygon = (Polygon)cell.GetCellGeometry();
                var compass = polygon.Compass();
                if (split)
                {
                    var north = Polygon.Rectangle(compass.W, compass.NE).Rotate(Vector3.Origin, ang);
                    var south = Polygon.Rectangle(compass.SW, compass.E).Rotate(Vector3.Origin, ang);
                    AddRoom(new Room(north, Height));
                    AddRoom(new Room(south, Height));
                    continue;
                }
                else if (Math.Abs(compass.SizeY - rowDepth) <= 0.0001)
                {
                    AddRoom(new Room(polygon.Rotate(Vector3.Origin, ang), Height));
                }
            }
            var roomRows = new List <RoomRow>();

            foreach (var room in Rooms)
            {
                roomRows.Add(new RoomRow(room.Perimeter));
            }
            Rooms.Clear();
            return(roomRows);
        }