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