private void SpawnMegaHouse() { var candidates = _worldPlane.GetVacantBlocks() .Where(block => { var waterBlocks = _worldPlane.GetWaterBlocks(); return(waterBlocks.Count(waterBlock => block.DistanceToOtherBlock(waterBlock) < 3) == 0); }) .Where(block => { var blocksWithHouse = _worldPlane .GetBlocksWithHouses(); return(!blocksWithHouse.Any(houseBlock => block.DistanceToOtherBlock(houseBlock) <= 1 && houseBlock.GetOccupantHouse().IsSmall()) && blocksWithHouse.Count(houseBlock => block.DistanceToOtherBlock(houseBlock) <= 1 && houseBlock.GetOccupantHouse().IsBig()) >= 2 && !blocksWithHouse.Any(houseBlock => block.DistanceToOtherBlock(houseBlock) <= 1 && houseBlock.GetOccupantHouse().IsMegaBig())); }) .ToList(); var candidatesCount = candidates.Count; if (candidatesCount > 0) { var vacantLot = candidates[Random.Range(0, candidatesCount)]; var house = Instantiate(tinyHouseTemplate); house.GetComponent <HouseSpawn>().SetToMegaBig(); vacantLot.Occupy(house); _lastPlacedHouse = Time.fixedTime; } }
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); } } }