private void TrySpawnFort() { if (CheckIfThereAreEnoughMountainToSpawnFort()) { return; } var potentialFortBottoms = _worldPlane.GetVacantBlocksStream() .Where(vacantBlock => { return(vacantBlock.IsGroundLevel() && _worldPlane .GetMajorityBlockTypeWithinRange(vacantBlock.GetGridPosition(), 1f) == Block.BlockType.Grass && _worldPlane.NoNearby( vacantBlock.GetGridPosition(), 2f, block => block.blockType == Block.BlockType.Lake )); }); var candidates = new List <Tuple <Block, Block> >(); foreach (var fortBottom in potentialFortBottoms) { var nearbyHighlands = _worldPlane.GetNearbyVacantLotsStream(fortBottom.GetGridPosition()) .Where(block => { var highlandIsOneBlockAboveFortBottomLevel = Math.Abs(block.GetGridPosition().y - (fortBottom.GetGridPosition().y + 1f)) < .5f; return(highlandIsOneBlockAboveFortBottomLevel && block.IsGrass() && block.IsVacant()); }); foreach (var highland in nearbyHighlands) { candidates.Add( new Tuple <Block, Block>(fortBottom, highland) ); } } var candidateCount = candidates.Count; if (candidateCount > 0) { var(fortBottom, highlands) = candidates.ElementAt(Random.Range(0, candidateCount)); var fortSpawn = Instantiate(fortSpawnTemplate); fortBottom.Occupy(fortSpawn); highlands.SetOccupantThatIsTailFromOtherBase(fortSpawn); var target = highlands.transform.position; target.y = fortSpawn.transform.position.y; fortSpawn.transform.LookAt(target); _fortCount += 1; } }
private void SpawnSandBlock() { var sandBlockRoot = Instantiate(sandBlockTemplate); var block = _worldPlane .GetVacantBlocksStream() .Where(vacantBlock => _worldPlane.BlockCanBeReplacedBySandBlock(vacantBlock)) .OrderBy(_ => Random.value) .First(); var sandBlock = sandBlockRoot.GetComponentInChildren <Block>(); _worldPlane.ReplaceBlock(block, sandBlock); }