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); } } }
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; } }