コード例 #1
0
    private void Update()
    {
        if (_featureToggles.desertsAreBeaches)
        {
            return;
        }

        var sandSpreadController = _sandSpreadController;

        if (Random.value < sandSpreadController.chance)
        {
            var block = _worldPlane.GetNearbyBlocks(_block.GetGridPosition())
                        .Where(b => _worldPlane.BlockCanBeReplacedBySandBlock(b))
                        .ToList()
                        .OrderBy(_ => Random.value)
                        .First();

            var score = _worldPlane.NatureScore(block.GetGridPosition(), sandSpreadController.natureScoreRadius);
            if (score < _sandSpreadController.spreadResistanceThreshold)
            {
                var sandBlockRoot = Instantiate(sandBlockTemplate);
                var sandBlock     = sandBlockRoot.GetComponentInChildren <Block>();
                _worldPlane.ReplaceBlock(block, sandBlock);
            }
            else if (score > _sandSpreadController.spreadCombatThreshold)
            {
                var grassBlockRoot = Instantiate(grassBlockTemplate);
                var grassBlock     = grassBlockRoot.GetComponentInChildren <Block>();
                _worldPlane.ReplaceBlock(_block, grassBlock);
            }
        }
    }
コード例 #2
0
    private void SpawnBigHouse()
    {
        List <Block> candidates = null;

        foreach (var block in _worldPlane
                 .GetBlocksWithHousesStream()
                 .OrderBy(_ => Random.value)
                 .Take(2))
        {
            var occupantHouse = block.GetOccupantHouse();
            if (!occupantHouse.IsSmall())
            {
                continue;
            }
            if (!occupantHouse.GoodTimeToUpgrade())
            {
                continue;
            }

            // var blocksWithHouse = _worldPlane
            // .GetBlocksWithHouses();

            // var hasLargeEnoughClosePopulation = blocksWithHouse.Count(houseBlock => block.DistanceToOtherBlock(houseBlock) <= 1.5f) >= 3;
            // if (!hasLargeEnoughClosePopulation) return false;

            var hasEnoughSurroundingNature = _worldPlane.NatureScore(block.GetGridPosition(), 8f) > 20;

            if (hasEnoughSurroundingNature)
            {
                if (candidates == null)
                {
                    candidates = new List <Block>();
                }

                candidates.Add(block);
            }
        }

        if (candidates != null)
        {
            var houseToUpgrade = candidates[Random.Range(0, candidates.Count)];
            houseToUpgrade.GetOccupantHouse().Upgrade();
            _lastPlacedHouse = Time.fixedTime;
        }
    }