예제 #1
0
    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;
        }
    }
예제 #2
0
    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);
            }
        }
    }