Ejemplo n.º 1
0
    public void RunRound()
    {
        round_count++;

        Debug.Log(herbies.Count);

        float current_total_nutrition    = 0;
        float current_minimium_nutrition = 100000;
        int   i_max = world.GetLength(0);
        int   j_max = world.GetLength(1);

        for (int i = 0; i < i_max; i++)
        {
            for (int j = 0; j < j_max; j++)
            {
                world[i, j].Reset();
                if (round_count % seed_round == seed_round - 1)
                {
                    SpreadPlants(new Vector2(i, j));
                }
                world[i, j].GrowPlants();
                current_total_nutrition += world[i, j].nutrition;
                if (world[i, j].nutrition > 0 && world[i, j].nutrition < current_minimium_nutrition)
                {
                    current_minimium_nutrition = world[i, j].nutrition;
                }
            }
        }

        for (int i = 0; i < herbies.Count; i++)
        {
            if (herbies[i].isAlive)
            {
                Vector2 best_spot           = herbies[i].Search(SliceOfWorld(herbies[i].GetPerceptionRange()));
                Vector2 new_sprite_location = new Vector2((best_spot.x - world.GetLength(0) / 2) * StaticData.size_increment, (best_spot.y - world.GetLength(1) / 2) * StaticData.size_increment);
                herbies[i].MoveTo(best_spot, new_sprite_location);
            }
            else
            {
                GameObject.Destroy(herbies[i].sprite);
                herbies.RemoveAt(i);
                i--;
            }
        }

        List <TerrainTile> occupiedTiles = new List <TerrainTile>();

        for (int i = 0; i < herbies.Count; i++)
        {
            Herbivore herb = herbies[i];
            if (!occupiedTiles.Contains(world[(int)herb.location.x, (int)herb.location.y]))
            {
                occupiedTiles.Add(world[(int)herb.location.x, (int)herb.location.y]);
            }
            herb.Feed(world[(int)herb.location.x, (int)herb.location.y].EatPlants(herb.GetAppetite()));
            world[(int)herb.location.x, (int)herb.location.y].grazers.Add(herbies[i]);
        }

        for (int i = 0; i < carnies.Count; i++)
        {
            if (carnies[i].isAlive)
            {
                Vector2 best_spot           = carnies[i].Search(SliceOfWorld(carnies[i].GetPerceptionRange()));
                Vector2 new_sprite_location = new Vector2((best_spot.x - world.GetLength(0) / 2) * StaticData.size_increment, (best_spot.y - world.GetLength(1) / 2) * StaticData.size_increment);
                carnies[i].MoveTo(best_spot, new_sprite_location);
            }
            else
            {
                GameObject.Destroy(carnies[i].sprite);
                carnies.RemoveAt(i);
                i--;
            }
        }

        for (int i = 0; i < carnies.Count; i++)
        {
            Carnivore carn = carnies[i];
            if (!occupiedTiles.Contains(world[(int)carn.location.x, (int)carn.location.y]))
            {
                occupiedTiles.Add(world[(int)carn.location.x, (int)carn.location.y]);
            }
            float meal_size = 0;
            if (carn.SucessfulHunt())
            {
                meal_size = world[(int)carn.location.x, (int)carn.location.y].EatAnimal();
            }
            carn.Eat(meal_size);
        }

        for (int i = 0; i < herbies.Count; i++)
        {
            int babies = herbies[i].Reproduce();
            for (int b = 0; b < babies; b++)
            {
                herbies.Add(herbies[i].CreateBaby(transform, sprite_offset));
            }
        }

        for (int i = 0; i < carnies.Count; i++)
        {
            int babies = carnies[i].Reproduce();
            for (int b = 0; b < babies; b++)
            {
                carnies.Add(carnies[i].CreateBaby(transform, sprite_offset));
            }
        }

        max_carnivores.FeedValue(carnies.Count);
        current_carnivores.FeedValue(carnies.Count);
        max_plants.FeedValue(current_total_nutrition);
        current_plants.FeedValue(current_total_nutrition);
        max_herbivores.FeedValue(herbies.Count);
        current_herbivores.FeedValue(herbies.Count);
    }