public MapTile GetRandomTileSpace(MapTile[,] tiles) { Random randgen = new Random(); var blanks = (from t in tiles.Cast<MapTile>() where t.GetType() == typeof(MapTileSpace) && t.IsWalkable select t).ToArray(); var blank = blanks[randgen.Next(blanks.Length)]; return blank; }
internal void AddMonster(MapTile[,] tiles, int howMany) { Random randgen = new Random(); for (int i = 0; i < howMany; i++) { //we look for blanks every time so that we don't put a monster on top of another monster var blanks = (from t in tiles.Cast <MapTile>() where t.GetType() == typeof(MapTileSpace) select t).ToArray(); var blank = blanks[randgen.Next(blanks.Length)]; var newmonster = new Monster(MonstersDB.GetRandom()); newmonster.MoveTo(blank.X, blank.Y); Monsters.Add(newmonster); //Monsters.Add(new Monster() { Name = "Ogre", Life = 5, X = blank.X, Y = blank.Y, LastY = blank.X, LastX = blank.Y, Speed = randgen.Next(6)+2 }); tiles[blank.Y, blank.X].IsWalkable = false; } }
public IEnumerator <MapTile> GetEnumerator() { return(_tiles.Cast <MapTile>().GetEnumerator()); }
/// <summary> /// Function which finds spawnpoints for one or more troops /// </summary> /// <param name="playerNumber">Determines how many co-ordinates should be returned</param> /// <param name="spawnType">Deterines how the co-ordinates should relate to each other and the map</param> /// <returns></returns> public List <Point> DeterminSpawnPoint(int playerNumber, SpawnType spawnType) { List <Point> toReturn = new List <Point>(); switch (spawnType) { case SpawnType.road: { if (goals.Count <= 1) { for (int i = 0; i < playerNumber; i++) { int x; int y; int n = World.World.random.Next(4); if (n == 0) { x = 0; y = World.World.random.Next(map.GetUpperBound(1)); } else if (n == 1) { x = World.World.random.Next(map.GetUpperBound(0)); y = 0; } else if (n == 2) { x = map.GetUpperBound(0); y = World.World.random.Next(map.GetUpperBound(1)); } else { x = World.World.random.Next(map.GetUpperBound(0)); y = map.GetUpperBound(1); } toReturn.Add(new Point(x, y)); } break; } } //Determin which road spawn point to start List <MapTile> _goals = new List <MapTile>(goals); while (_goals.Count != 0 && playerNumber != 0) { MapTile pathPoint = _goals[World.World.random.Next(_goals.Count)]; _goals.Remove(pathPoint); toReturn.Add(pathPoint.position); playerNumber--; if (playerNumber == 0) { break; } foreach (MapTile possible in pathPoint.neighbours.rawMaptiles.Where(m => m.type.type == MapTileTypeEnum.road)) { toReturn.Add(possible.position); playerNumber--; if (playerNumber == 0) { break; } } } break; case SpawnType.random: for (int i = 0; i < playerNumber; i++) { Point p = new Point(); while (true) { p = new Point(World.World.random.Next(map.GetUpperBound(0)), World.World.random.Next(map.GetUpperBound(1))); //Determine is viable if (!troops.Exists(t => t.Position.X == p.X && t.Position.Y == p.Y) && !toReturn.Exists(c => c.X == p.X && c.Y == p.Y)) { break; } } toReturn.Add(p); } break; case SpawnType.randomLand: FindRandomLandTile(playerNumber, ref toReturn); break; case SpawnType.heighestField: var ordered = from field in map.Cast <MapTile>() orderby field.Height descending select field; toReturn = ordered.Take(playerNumber).ToList().ConvertAll(f => f.position); break; case SpawnType.centralRoad: { int x, y, count = 50; for (int i = 0; i < playerNumber; i++) { do { x = World.World.random.Next((int)(0.2 * map.GetUpperBound(0)), (int)(0.8 * map.GetUpperBound(0))); y = World.World.random.Next((int)(0.2 * map.GetUpperBound(1)), (int)(0.8 * map.GetUpperBound(1))); count--; if (count == 0) { count = 100; do { x = World.World.random.Next(0, map.GetUpperBound(0)); y = World.World.random.Next(0, map.GetUpperBound(1)); count--; } while (map[x, y].type.type != MapTileTypeEnum.road && count > 0 && toReturn.Contains(new Point(x, y))); break; } } while (map[x, y].type.type != MapTileTypeEnum.road && toReturn.Contains(new Point(x, y))); toReturn.Add(new Point(x, y)); } break; } case SpawnType.randomRoughCircle: { int x, y; x = World.World.random.Next((int)(0.2 * map.GetUpperBound(0)), (int)(0.8 * map.GetUpperBound(0))); y = World.World.random.Next((int)(0.2 * map.GetUpperBound(1)), (int)(0.8 * map.GetUpperBound(1))); for (int i = 0; i < playerNumber; i++) { int _x = 0, _y = 0, tempX, tempY, minDistance = 100; for (int t = 0; t < 10; t++) { tempX = World.World.random.Next((int)(0.2 * map.GetUpperBound(0)), (int)(0.8 * map.GetUpperBound(0))); tempY = World.World.random.Next((int)(0.2 * map.GetUpperBound(1)), (int)(0.8 * map.GetUpperBound(1))); int distance = Math.Abs(tempX - x) + Math.Abs(tempY - y); if (distance < minDistance && !toReturn.Contains(new Point(tempX, tempY))) { _x = tempX; _y = tempY; minDistance = distance; } } toReturn.Add(new Point(_x, _y)); } break; } case SpawnType.randomRoughRoadCircle: { int x, y, count = 100; do { x = World.World.random.Next((int)(0.2 * map.GetUpperBound(0)), (int)(0.8 * map.GetUpperBound(0))); y = World.World.random.Next((int)(0.2 * map.GetUpperBound(1)), (int)(0.8 * map.GetUpperBound(1))); count--; } while (map[x, y].type.type != MapTileTypeEnum.road && count > 0); toReturn.Add(new Point(x, y)); for (int i = 0; i < playerNumber; i++) { int _x = 0, _y = 0, tempX, tempY, minDistance = 100; for (int t = 0; t < 10; t++) { tempX = World.World.random.Next((int)(0.2 * map.GetUpperBound(0)), (int)(0.8 * map.GetUpperBound(0))); tempY = World.World.random.Next((int)(0.2 * map.GetUpperBound(1)), (int)(0.8 * map.GetUpperBound(1))); int distance = Math.Abs(tempX - x) + Math.Abs(tempY - y); if (distance < minDistance && !toReturn.Contains(new Point(tempX, tempY))) { _x = tempX; _y = tempY; minDistance = distance; } } toReturn.Add(new Point(_x, _y)); } break; } default: break; } return(toReturn); }