Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
 public IEnumerator <MapTile> GetEnumerator()
 {
     return(_tiles.Cast <MapTile>().GetEnumerator());
 }
Ejemplo n.º 4
0
        /// <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);
        }