public static MapData GenerateFloor(uint floorNumber, int widthInTiles, int heightInTiles) { // Generate a walkable map, complete with stairs down var isWalkableMap = new ArrayMap <bool>(widthInTiles, heightInTiles); CellularAutomataGenerator.Generate(isWalkableMap); // Randomly positioned on a ground tile! True = walkable var playerPosition = isWalkableMap.RandomPosition(true); var stairsDownPosition = playerPosition; while (Math.Abs(playerPosition.X - stairsDownPosition.X) + Math.Abs(playerPosition.Y - stairsDownPosition.Y) <= MinimumPlayerStairsDistance) { stairsDownPosition = isWalkableMap.RandomPosition(true); } System.Console.WriteLine($"Stairs are at {stairsDownPosition}"); var mapData = new MapData() { Map = isWalkableMap, PlayerPosition = playerPosition, StairsDownPosition = stairsDownPosition }; return(mapData); }
private static void Pathing() { /* AStar */ var timeAStar = PathingTests.TimeForAStar(Runner.MAP_WIDTH, Runner.MAP_HEIGHT, Runner.ITERATIONS_FOR_TIMING); var timeFastAStar = PathingTests.TimeForFastAStar(Runner.MAP_WIDTH, Runner.MAP_HEIGHT, Runner.ITERATIONS_FOR_TIMING); Console.WriteLine($"Time for {Runner.ITERATIONS_FOR_TIMING} paths, on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map:"); Console.WriteLine($"\tAStar : {timeAStar}"); Console.WriteLine($"\tFastAStar: {timeFastAStar}"); /* Single-Goal GoalMap */ var map = new ArrayMap <bool>(Runner.MAP_WIDTH, Runner.MAP_HEIGHT); QuickGenerators.GenerateCellularAutomataMap(map); Coord goal = map.RandomPosition(true); var timeGoalMap = PathingTests.TimeForGoalMap(map, goal.Yield(), Runner.ITERATIONS_FOR_TIMING); var timeFleeMap = PathingTests.TimeForFleeMap(map, goal.Yield(), Runner.ITERATIONS_FOR_TIMING); Console.WriteLine(); Console.WriteLine($"Time to calculate single-source goal map on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map {Runner.ITERATIONS_FOR_TIMING} times:"); Console.WriteLine($"\tGoal-Map : {timeGoalMap}"); Console.WriteLine($"\tFlee-Map : {timeFleeMap}"); /* Multi-Goal GoalMap */ var goals = new List <Coord>(); for (int i = 0; i < Runner.NUM_GOALS; i++) { goals.Add(map.RandomPosition(true)); } var timeMGoalMap = PathingTests.TimeForGoalMap(map, goals, Runner.ITERATIONS_FOR_TIMING); var timeMFleeMap = PathingTests.TimeForFleeMap(map, goals, Runner.ITERATIONS_FOR_TIMING); Console.WriteLine(); Console.WriteLine($"Time to calculate multi-source goal map on {Runner.MAP_WIDTH}x{Runner.MAP_HEIGHT} map {Runner.ITERATIONS_FOR_TIMING} times:"); Console.WriteLine($"\tGoal-Map : {timeMGoalMap}"); Console.WriteLine($"\tFlee-Map : {timeMFleeMap}"); }
public void FOVSenseMapEquivalency() { ArrayMap <bool> map = new ArrayMap <bool>(100, 100); QuickGenerators.GenerateRectangleMap(map); var positions = Enumerable.Range(0, 100).Select(x => map.RandomPosition(true)).ToList(); // Make 2-layer thick walls to verify wall-lighting is working properly foreach (var pos in map.Positions()) { if (pos.X == 1 || pos.Y == 1 || pos.X == map.Width - 2 || pos.Y == map.Height - 2) { map[pos] = false; } } var fov = new FOV(map); var senseMap = new SenseMap(new LambdaTranslationMap <bool, double>(map, x => x ? 0.0 : 1.0)); var senseSource = new SenseSource(SourceType.SHADOW, map.RandomPosition(true), 5, Distance.EUCLIDEAN); senseMap.AddSenseSource(senseSource); foreach (var curPos in positions) { if (!map[curPos]) { continue; } senseSource.Position = curPos; fov.Calculate(senseSource.Position, senseSource.Radius, senseSource.DistanceCalc); senseMap.Calculate(); foreach (var pos in map.Positions()) { bool success = fov.BooleanFOV[pos] == (senseMap[pos] > 0.0 ? true : false); if (!success) { Console.WriteLine($"Failed on pos {pos} with source at {senseSource.Position}."); Console.WriteLine($"FOV: {fov[pos]}, SenseMap: {senseMap[pos]}"); Console.WriteLine($"Distance between source and fail point: {Distance.EUCLIDEAN.Calculate(senseSource.Position, pos)}, source radius: {senseSource.Radius}"); } Assert.AreEqual(true, success); } } var degreesList = Enumerable.Range(0, 360).ToList(); degreesList.FisherYatesShuffle(); var spanList = Enumerable.Range(1, 359).ToList(); spanList.FisherYatesShuffle(); var degrees = degreesList.Take(30).ToList(); var spans = spanList.Take(30).ToList(); senseSource.IsAngleRestricted = true; // Test angle-based shadowcasting foreach (var curPos in positions.Take(1)) { if (!map[curPos]) { continue; } foreach (var degree in degrees) { foreach (var span in spans) { senseSource.Angle = degree; senseSource.Span = span; senseSource.Position = curPos; fov.Calculate(senseSource.Position, senseSource.Radius, senseSource.DistanceCalc, senseSource.Angle, senseSource.Span); senseMap.Calculate(); foreach (var pos in map.Positions()) { bool success = fov.BooleanFOV[pos] == (senseMap[pos] > 0.0 ? true : false); if (!success) { Console.WriteLine($"Failed on pos {pos} with source at {senseSource.Position}, angle: {senseSource.Angle}, span: {senseSource.Span}."); Console.WriteLine($"FOV: {fov[pos]}, SenseMap: {senseMap[pos]}"); Console.WriteLine($"Distance between source and fail point: {Distance.EUCLIDEAN.Calculate(senseSource.Position, pos)}, source radius: {senseSource.Radius}"); } Assert.AreEqual(true, success); } } } } }
private Player GeneratePlayer() { GoRogue.Coord playerPos = map.RandomPosition(true); return(new Player(playerPos.X, playerPos.Y, '@', new Energy(100, 20))); }