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; } } } }