public void InitalSpawn(int seed)
    {
        if (!forestContainer)
        {
            forestContainer        = new GameObject("Forest Container").transform;
            forestContainer.parent = transform;
        }

        foliageObjects          = new List <FoliageObject>();
        terrainObjects          = new List <TerrainObject>();
        terrainObjectContainers = new Transform[foliageTypes.Length];

        CancelInvoke();
        Vector2 sampleOffset = new Vector2(-mapSize.x / 2f, -mapSize.z / 2f);

        for (int foliageObjectType = 0; foliageObjectType < foliageTypes.Length; foliageObjectType++)
        {
            TerrainObjectType foliageObjectSettings = foliageTypes[foliageObjectType];
            terrainObjectContainers[foliageObjectType]        = new GameObject(foliageObjectSettings.name + " Container").transform;
            terrainObjectContainers[foliageObjectType].parent = forestContainer;
            foliageObjectSettings.Initialize(terrainLayerMask, objectLayerMask, terrainObjectContainers[foliageObjectType], LevelController.Instance.yearLength);
            foreach (Vector2 sample in new PoissonDiscSampler((int)mapSize.x, (int)mapSize.z, foliageObjectSettings.initialSpawnSampleRadius, foliageObjectSettings.poissonClusterRange, seed).Samples())
            {
                Vector3 position = new Vector3(sample.x + sampleOffset.x, maxTerrainHeight + 5f, sample.y + sampleOffset.x);
                AttemptSpawn(position, foliageObjectSettings, true, foliageObjectType > 0);
            }
        }

        InvokeRepeating("UpdateScores", .1f, scoreUpdateInterval);
        if (reproduceAnnually)
        {
            InvokeRepeating("NewYear", 0.0f, LevelController.Instance.yearLength);
        }
    }