Exemple #1
0
        public static void CreateVerticalEntrancePath(IntentionGrid grid, int exitX, int exitY)
        {
            var circuits   = grid.GetByMeaning(Meaning.Circuit);
            var topMost    = circuits.Select(x => x.Y).Min();
            var bottomMost = circuits.Select(x => x.Y).Max();

            var yDir   = 0;
            var yStart = 0;
            var yStop  = topMost + 1;

            if (exitY <= 0)
            {
                yDir = 1;
            }
            else
            {
                yDir   = -1;
                yStart = grid.Width - 1;
                yStop  = bottomMost - 1;
            }

            for (var y = yStart; y != yStop; y += yDir)
            {
                grid.Positions[exitX, y].Intentions.Add(Intention.EntrancePathIntention());
                if (y != yStop - yDir)
                {
                    grid.Positions[exitX, y].Intentions.Add(Intention.VerticalExitIntention());
                }
            }

            DebugPrintMeaning(grid, Meaning.ExitPath);
        }
Exemple #2
0
        public static int[] CreateGroundLevels(IntentionGrid grid)
        {
            var floorHeight  = 2.0;
            var groundLevels = new int[(int)Math.Floor((grid.Height - 2) / floorHeight)];

            for (var i = 0; i < groundLevels.Count(); i++)
            {
                groundLevels[i]  = (int)Math.Floor((i) * (grid.Height - 2) / (float)groundLevels.Count());
                groundLevels[i] += (int)floorHeight;
            }

            for (var x = 1; x < grid.Width - 1; x++)
            {
                for (var y = 0; y < grid.Height; y++)
                {
                    if (groundLevels.Any(gl => gl == y))
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.GroundLevelIntention());
                    }
                }
            }

            DebugPrintMeaning(grid, Meaning.GroundLevel);

            return(groundLevels);
        }
Exemple #3
0
        public static void CreateShooterSection(IntentionGrid grid, Random random)
        {
            //counts on having a border of width of 1

            //get a humble groundlevel tile at edge
            var tile = grid.GetByMeaning(Meaning.GroundLevel).Where(t =>
                                                                    (t.X == grid.Width - 2 || t.X == 1) &&
                                                                    grid.Positions[t.X, t.Y].Intentions.Count == 1
                                                                    )
                       //not next to exit or entrance path
                       .Where(t =>
                              !grid.Positions[t.X + 1, t.Y].Intentions.Any(n => n.Meaning == Meaning.EntrancePath || n.Meaning == Meaning.ExitPath)
                              &&
                              !grid.Positions[t.X - 1, t.Y].Intentions.Any(n => n.Meaning == Meaning.EntrancePath || n.Meaning == Meaning.ExitPath)
                              )
                       .ToList().GetRandomOrDefault(random);

            if (tile != null)
            {
                grid.Positions[tile.X, tile.Y].Intentions.Clear();
                grid.Positions[tile.X, tile.Y].Intentions.Add(Intention.ShooterIntention());
            }

            DebugPrintMeaning(grid, Meaning.Shooter);
        }
Exemple #4
0
        public static void CreateToggleExitDoor(IntentionGrid grid)
        {
            var tile = grid.GetByMeaning(Meaning.ExitPath).Where(t => t.X == grid.Width - 1 || t.X == 0 || t.Y == 0 || t.Y == grid.Height - 1).FirstOrDefault();

            grid.Positions[tile.X, tile.Y].Intentions.Add(Intention.ToggleDoorIntention());

            DebugPrintMeaning(grid, Meaning.ToggleDoor);
        }
Exemple #5
0
            public override void Init(Random random, IntentionGrid grid, TilesetConfiguration tilesConfig)
            {
                Grid        = grid;
                Random      = random;
                TilesConfig = tilesConfig;

                Converter = new MyMeaningConverter();

                WcfGrid = Helpers.InitWcfGrid(random, grid, TilesConfig);
            }
Exemple #6
0
        public void DoIt(Bitmap InputBitmap, IntentionGrid Intentions)
        {
            Input         = InputBitmap;
            IntentionGrid = Intentions;
            GetBitmapGrid();

            TypeGrid = new TileType[TileGrid.Count, TileGrid[0].Count];
            GetTypeGrid();
            GetGameElements();
        }
Exemple #7
0
            public override void Init(Random random, IntentionGrid grid, TilesetConfiguration tilesConfig)
            {
                Grid        = grid;
                Random      = random;
                TilesConfig = tilesConfig;

                Converter = new BasicCircuitProcess.MyMeaningConverter();

                WcfGrid = Helpers.InitWcfGrid(random, grid, TilesConfig);
                WcfGrid.eventHandler = this;
            }
Exemple #8
0
        public static void CreateHorizontalExitPath(IntentionGrid grid, int exitX, int exitY)
        {
            var onGroundLevel = grid.GetByMeaning(Meaning.GroundLevel).Any(t => t.Y == exitY);
            var circuits      = grid.GetByMeaning(Meaning.Circuit);
            var leftMost      = circuits.Select(x => x.X).Min();
            var rightMost     = circuits.Select(x => x.X).Max();

            var xDir   = 0;
            var xStart = 0;
            var xStop  = leftMost;

            if (exitX <= 0)
            {
                xDir = 1;
            }
            else
            {
                xDir   = -1;
                xStart = grid.Width - 1;
                xStop  = rightMost;
            }

            for (var x = xStart; x != xStop; x += xDir)
            {
                if (x != xStart)
                {
                    grid.Positions[xStop, exitY].Intentions.Add(Intention.NonDynamic());
                }

                if (!onGroundLevel && exitY - 1 >= 0)
                {
                    grid.Positions[x, exitY - 1].Intentions.Clear();
                    grid.Positions[x, exitY - 1].Intentions.Add(Intention.SolidIntention());
                }
                if (!onGroundLevel && exitY + 1 < grid.Height)
                {
                    grid.Positions[x, exitY + 1].Intentions.Clear();
                    grid.Positions[x, exitY + 1].Intentions.Add(Intention.SolidIntention());
                }
                grid.Positions[x, exitY].Intentions.Add(Intention.ExitPathIntention());
            }
            if (exitY > circuits.Select(t => t.Y).Max() || exitY < circuits.Select(t => t.Y).Min())
            {
                grid.Positions[xStop, exitY].Intentions.Add(Intention.LadderIntention());
                grid.Positions[xStop, exitY].Intentions.Add(Intention.NonDynamic());
            }

            DebugPrintMeaning(grid, Meaning.ExitPath);
        }
Exemple #9
0
        public static void CreateToggleExitDoorButton(IntentionGrid grid, Random random)
        {
            //get a humble GroundLevel Tile
            var tile            = grid.GetByMeaning(Meaning.GroundLevel).Where(t => grid.Positions[t.X, t.Y].Intentions.Count == 1).GetRandomOrDefault(random);
            var buttonIntention = Intention.ButtonIntention();

            buttonIntention.Info = "toggle";
            var exit = grid.GetByMeaning(Meaning.ExitPath).Where(t => grid.Positions[t.X, t.Y].Intentions.Any(i => i.Meaning == Meaning.ToggleDoor)).First().Intentions.Where(i => i.Meaning == Meaning.ToggleDoor).First();

            buttonIntention.RelatedTileMeaning = exit;
            exit.RelatedTileMeaning            = buttonIntention;
            grid.Positions[tile.X, tile.Y].Intentions.Add(Intention.ButtonIntention());

            DebugPrintMeaning(grid, Meaning.Button);
        }
Exemple #10
0
        public static void BlanketNonDynamic(IntentionGrid grid, Random random)
        {
            for (var y = 0; y < grid.Height; y++)
            {
                for (var x = 0; x < grid.Width; x++)
                {
                    if (grid.Positions[x, y].Intentions.Count == 0 ||
                        (grid.Positions[x, y].Intentions.Count == 1 && grid.Positions[x, y].Intentions.Any(i => i.Meaning == Meaning.GroundLevel))
                        )
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.NonDynamic());
                    }
                }
            }

            DebugPrintMeaning(grid, Meaning.NonDynamnic);
        }
Exemple #11
0
        public static void CreateRopeSection(IntentionGrid grid, Random random)
        {
            //TODO - RANDOMIZE THIS

            //get a humble groundlevel tile
            var tiles = grid.GetByMeaning(Meaning.GroundLevel).Where(t => grid.Positions[t.X, t.Y].Intentions.Count == 1).ToList();

            //find 3 in a row
            var middle = tiles.Where(t => tiles.Any(tleft => tleft.Y == t.Y && tleft.X == t.X - 1) && tiles.Any(tright => tright.Y == t.Y && tright.X == t.X + 1)).GetRandomOrDefault(random);

            if (middle != null)
            {
                grid.Positions[middle.X, middle.Y].Intentions.Add(Intention.RopeIntention());
            }

            DebugPrintMeaning(grid, Meaning.Rope);
        }
Exemple #12
0
        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);
        }
Exemple #13
0
 private static void DebugPrintMeaning(IntentionGrid grid, Meaning meaning)
 {
     //Debug
     Console.WriteLine(meaning.ToString() + ":  ");
     for (var y = 0; y < grid.Height; y++)
     {
         var str = "";
         for (var x = 0; x < grid.Width; x++)
         {
             if (grid.Positions[x, y].Intentions.Any(i => i.Meaning == meaning))
             {
                 str = str + "X";
             }
             else
             {
                 str = str + "-";
             }
         }
         Console.WriteLine(str);
     }
     Console.WriteLine("");
 }
Exemple #14
0
        public static void CreateBorder(IntentionGrid grid, Random random)
        {
            var groundLevelMax = grid.GetByMeaning(Meaning.GroundLevel).Select(t => t.Y).Max();

            for (var y = 0; y < grid.Height; y++)
            {
                for (var x = 0; x < grid.Width; x++)
                {
                    if (

                        (x == 0 || y == 0 || x == grid.Width - 1 || y > groundLevelMax)
                        &&
                        grid.Positions[x, y].Intentions.Count() == 0
                        )
                    {
                        grid.Positions[x, y].Intentions.Add(Intention.SolidIntention());
                    }
                }
            }

            DebugPrintMeaning(grid, Meaning.Solid);
        }
Exemple #15
0
        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);
        }
Exemple #16
0
 private List <Portal> GetVerticalPortals(List <Portal> Portals, IntentionGrid grid)
 {
     return(Portals.Where(p => p.point.Y == 0 || p.point.Y == grid.Height - 1).ToList());
 }
Exemple #17
0
            private bool PortalsOnGroundLevels(List <Portal> Portals, IntentionGrid grid)
            {
                var groundlevels = grid.GetByMeaning(Meaning.GroundLevel);

                return(!Portals.Any(p => !groundlevels.Any(gl => gl.Y == p.point.Y)));
            }
Exemple #18
0
 public PuzzleProcess(Random random, IntentionGrid grid, TilesetConfiguration tilesConfig)
 {
     Init(random, grid, tilesConfig);
 }
Exemple #19
0
 private List <Portal> GetHorizontalPortals(List <Portal> Portals, IntentionGrid grid)
 {
     return(Portals.Where(p => p.point.X == 0 || p.point.X == grid.Width - 1).ToList());
 }
Exemple #20
0
 public abstract Intention Execute(IntentionGrid grid, Random random, Intention inputIntention = null);
Exemple #21
0
 public abstract void Init(Random random, IntentionGrid grid, TilesetConfiguration tilesConfig);
Exemple #22
0
 public List <GameElement> GetGameElements(Bitmap input, IntentionGrid grid)
 {
     myProcessor.ClearForReuse();
     myProcessor.DoIt(input, grid);
     return(myProcessor.GameElements);
 }