public static void CreateVerticalExitPath(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.ExitPathIntention()); if (y != yStop - yDir)//not the last one { grid.Positions[exitX, y].Intentions.Add(Intention.VerticalExitIntention()); } } DebugPrintMeaning(grid, Meaning.ExitPath); }
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); }