Exemplo n.º 1
0
    private void FloodAll()
    {
        _flood = false;
        var blockHeight  = _block.GetGridPosition().y;
        var nearbyBlocks = _worldPlane
                           .GetNearbyLand(_block.GetGridPosition())
                           .Where(otherBlock => otherBlock.GetGridPosition().y < blockHeight);
        var nearbyEmptyBlocks = CreateWaterForNearbyEmptyPositions();
        var allNearbyBlocks   = nearbyBlocks.Concat(nearbyEmptyBlocks);

        foreach (var nearbyBlock in allNearbyBlocks)
        {
            if (nearbyBlock.HasOccupant() && !nearbyBlock.OccupiedByBlock())
            {
                nearbyBlock.DestroyOccupant();
            }

            if (nearbyBlock.IsVacant())
            {
                Block lowestBlock = nearbyBlock;

                if (!nearbyBlock.IsWater())
                {
                    var waterBlockBelow = NewFullHeightWaterBlock().GetComponentInChildren <Block>();
                    _worldPlane.ReplaceBlock(nearbyBlock, waterBlockBelow);

                    lowestBlock = waterBlockBelow;
                }

                for (var y = lowestBlock.GetGridPosition().y + 1; y <= blockHeight; y++)
                {
                    var useFullHeightWater = Math.Abs(y - blockHeight) > .5f;
                    var water      = useFullHeightWater ? NewFullHeightWaterBlock() : NewShallowWater();
                    var waterBlock = water.GetComponentInChildren <Block>();
                    _worldPlane.AddBlockOnTopOf(waterBlock, water, lowestBlock);

                    lowestBlock = waterBlock;
                }
            }
        }
    }