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; } }
void Update() { if (CanWorkThisFrame() && Random.value < .01f) { var docks = _worldPlane.GetBlocksWithDocks().Count(); if (docks > 0) { if (Random.value < .01f) { TrySpawnBoat(); } } } if (!_featureToggles.docksSpawn) { return; } if (CanWorkThisFrame() && Random.value < .01f) { var houseCount = _worldPlane .GetBlocksWithHouses() .Count(blockWithHouse => blockWithHouse.GetOccupantHouse().IsBig()); if (houseCount < 1) { return; } var docks = _worldPlane.GetBlocksWithDocks().Count(); if (docks > 0) { var docksToHouseRatio = (float)Mathf.Max(docks, 1) / (float)houseCount; if (docksToHouseRatio > .05f) { return; } } var candidate = _worldPlane.GetWaterBlocks() .Where(waterBlock => waterBlock.IsGroundLevel()) .OrderBy(_ => Random.value) .Take(2) .Where(waterBlock => _worldPlane.GetMajorityBlockTypeWithinRange(waterBlock.GetGridPosition(), 1f) == Block.BlockType.Lake && _worldPlane.NoNearby(waterBlock.GetGridPosition(), 3f, BlockHasDocksSpawn)) .SelectMany(waterBlock => { return(_worldPlane .GetNearbyBlocks(waterBlock.GetGridPosition()) .Where(block => Math.Abs(block.GetGridPosition().y - waterBlock.GetGridPosition().y) < .5f && block.IsGrass() && block.IsVacant()) .Select(block => new Tuple <Block, Block>(waterBlock, block))); }) .OrderBy(_ => Random.value) .FirstOrDefault(); if (candidate != null) { var(waterBlock, vacantLot) = candidate; var dockSpawn = Instantiate(dockSpawnTemplate); vacantLot.Occupy(dockSpawn); var target = waterBlock.transform.position; target.y = dockSpawn.transform.position.y; dockSpawn.transform.LookAt(target); } } }