private static ArenaState BuildArena(int width, int height, string mapID, IEnumerable <Entity> entities, int level) { if (!seedsToMaps.ContainsKey(mapID)) { var map = Map.Create(new RogueSharp.MapCreation.RandomRoomsMapCreationStrategy <Map>(width, height, 2000, 9, 5, new DotNetRandom(Int32.Parse(mapID)))); var pathFinder = new PathFinder(map); seedsToMaps[mapID] = new Tuple <IMap, PathFinder>(map, pathFinder); } var mapEntities = new List <Entity>(); foreach (var e in entities) { mapEntities.Add(e.DeepCopy()); } ArenaState arena = new ArenaState(mapEntities, mapID, seedsToMaps[mapID].Item1, seedsToMaps[mapID].Item2, level); var openCells = arena.ArenaMap.GetAllCells().Where(c => c.IsWalkable).ToList(); var placementRand = new DotNetRandom(Int32.Parse(mapID)); foreach (var e in mapEntities) { while (!e.HasComponentOfType <Component_Position>()) { var cell = openCells[placementRand.Next(openCells.Count - 1)]; Component_AI ai = e.GetComponentOfType <Component_AI>(); if (ai != null && !ArenaBuilder.InScanRangeOfPlayer(arena.Player, e, cell)) { arena.PlaceEntityNear(e, cell.X, cell.Y); ai.DeterminePatrolPath(arena, placementRand); } else if (ai == null) { arena.PlaceEntityNear(e, cell.X, cell.Y); } } } return(arena); }
public static ArenaState BuildArena(int width, int height, string mapID, Entity player, int level) { var distributions = ArenaBuilder.levelDefinitions[level]; List <Entity> mapEntities = new List <Entity>() { player }; var placementRand = new DotNetRandom(Int32.Parse(mapID)); int d = 0; foreach (var dist in distributions) { var numToAdd = placementRand.Next(dist.Min, dist.Max); for (int i = 0; i < numToAdd; i++) { mapEntities.Add(EntityBuilderEnemies.BuildRandomLevelledEntity(placementRand, d.ToString(), dist.EntityLevel)); d++; } } return(ArenaBuilder.BuildArena(width, height, mapID, mapEntities, level)); }