コード例 #1
0
ファイル: Creators.cs プロジェクト: marcAKAmarc/ProcGenTools
        public static void CreateCircuit(IntentionGrid grid, Random random)
        {
            var groundLevels = grid.GetByMeaning(Meaning.GroundLevel).Select(x => x.Y).Distinct().ToArray();

            var verticals = new int[2];

            verticals[0] = (int)Math.Floor(grid.Width / 4.0f);
            verticals[1] = (int)Math.Floor(3.0f * grid.Width / 4.0f);



            for (var x = 0; x < grid.Width; x++)
            {
                for (var y = 0; y < grid.Height; y++)
                {
                    if (
                        !(
                            y >= groundLevels.Min() &&
                            y <= groundLevels.Max() &&
                            x >= verticals[0] &&
                            x <= verticals[1]
                            )
                        )
                    {
                        continue;
                    }

                    if (
                        (y == groundLevels.Min() || y == groundLevels.Max()) ||
                        (x == verticals[0] || x == verticals[1])
                        )
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.CircuitIntention());
                    }

                    if (x == verticals[0] || x == verticals[1])
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.LadderIntention());
                    }
                }
            }


            //Debug
            DebugPrintMeaning(grid, Meaning.Circuit);
        }
コード例 #2
0
ファイル: Creators.cs プロジェクト: marcAKAmarc/ProcGenTools
        public static void CreateCircuitFractured(IntentionGrid grid, Random random)
        {
            var groundLevels = grid.GetByMeaning(Meaning.GroundLevel).Select(x => x.Y).Distinct().ToArray();

            var verticals = new int[2];

            verticals[0] = (int)Math.Floor(grid.Width / 4.0f);
            verticals[1] = (int)Math.Floor(3.0f * grid.Width / 4.0f);

            var        numberOfShiftedLevels = 1;//random.Next(0, groundLevels.Count());
            List <int> shiftedLevels         = new List <int>();
            List <int> shiftedAmount         = new List <int>();

            for (var i = 0; i < numberOfShiftedLevels; i++)
            {
                var shiftLevel = groundLevels.Where(gl => !shiftedLevels.Any(sl => sl == gl)).GetRandomOrDefault(random);
                shiftedLevels.Add(shiftLevel);
                shiftedAmount.Add((new List <int>()
                {
                    1, -1
                }).GetRandomOrDefault(random));
            }

            bool onNormalCircuit     = false;
            bool onFracturedVertical = false;

            bool[,] bufferGrid = new bool[grid.Width, grid.Height];
            for (var x = 0; x < grid.Width; x++)
            {
                for (var y = 0; y < grid.Height; y++)
                {
                    if (
                        !(
                            y >= groundLevels.Min() &&
                            y <= groundLevels.Max() &&
                            x >= verticals[0] &&
                            x <= verticals[1]
                            )
                        )
                    {
                        continue;
                    }

                    if (
                        (y == groundLevels.Min() || y == groundLevels.Max()) ||
                        (x == verticals[0] || x == verticals[1])
                        )
                    {
                        bufferGrid[x, y] = true;
                    }

                    if (x == verticals[0] || x == verticals[1])
                    {
                        bufferGrid[x, y] = true;
                    }
                }
            }

            //shift
            for (var y = 0; y < grid.Height; y++)
            {
                var index = shiftedLevels.IndexOf(y);
                if (index == -1 && groundLevels.ToList().IndexOf(y) == -1)
                {
                    index = shiftedLevels.IndexOf(y + 1);
                }

                if (index == -1)
                {
                    continue;
                }

                var xStart = (int)Math.Round((Math.Sign(shiftedAmount[index]) / 2.0) + 0.5) * (bufferGrid.GetLength(0) - 1);
                var xDir   = Math.Sign(shiftedAmount[index]) * -1;
                var xStop  = grid.Width;
                if (Math.Sign(shiftedAmount[index]) == 1)
                {
                    xStop = -1;
                }
                for (var x = xStart; x != xStop; x += xDir)
                {
                    bool readValues = false;
                    int  readFrom   = x - shiftedAmount[index];
                    if (readFrom >= 0 && readFrom < grid.Width)
                    {
                        readValues = bufferGrid[readFrom, y];
                    }
                    bufferGrid[x, y] = readValues;
                }
            }

            ////debug
            //Console.WriteLine("shift debug");
            //for (var y = 0; y < grid.Height; y++)
            //{
            //    var str = "";
            //    for (var x = 0; x < grid.Width; x++)
            //    {
            //        if (bufferGrid[x, y])
            //            str += "X";
            //        else
            //            str += "-";

            //    }
            //    Console.WriteLine(str);
            //}
            //Console.WriteLine();

            //corners
            for (var y = 0; y < groundLevels.Max() - 1; y++)
            {
                for (var x = 0; x < grid.Width; x++)
                {
                    if (
                        bufferGrid[x, y] == false
                        &&
                        (
                            (x >= 1 && bufferGrid[x - 1, y])
                            ||
                            (x < grid.Width - 1 && bufferGrid[x + 1, y])
                        )
                        &&
                        (
                            y < grid.Height - 1
                            &&
                            bufferGrid[x, y + 1]
                        )
                        )
                    {
                        bufferGrid[x, y] = true;
                    }
                }
            }

            for (var y = 0; y < grid.Height; y++)
            {
                for (var x = 0; x < grid.Width; x++)
                {
                    if (!bufferGrid[x, y])
                    {
                        continue;
                    }
                    bool isLadder = false;
                    if (
                        (
                            y > 0
                            &&
                            bufferGrid[x, y - 1]
                        ) || (
                            y < grid.Height - 1
                            &&
                            bufferGrid[x, y + 1]
                            )
                        )
                    {
                        isLadder = true;
                    }

                    if (isLadder)
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.LadderIntention());
                    }
                    grid.Positions[x, y].Intentions.Add(Intention.CircuitIntention());
                }
            }

            //Debug
            DebugPrintMeaning(grid, Meaning.Circuit);
            DebugPrintMeaning(grid, Meaning.Ladder);
        }