SharedEnumerateExplosionBombermanDirectionTilesWithTargets( Vector2D positionEpicenter, int damageDistanceFullDamage, int damageDistanceMax, IWorldService world, int xOffset, int yOffset) { var fromPosition = positionEpicenter.ToVector2Ushort(); for (var offsetIndex = 1; offsetIndex <= damageDistanceMax; offsetIndex++) { var tile = world.GetTile(fromPosition.X + offsetIndex * xOffset, fromPosition.Y + offsetIndex * yOffset, logOutOfBounds: false); if (!tile.IsValidTile || tile.IsCliff) { yield break; } var tileStaticObjects = tile.StaticObjects; IStaticWorldObject damagedObject = null; foreach (var staticWorldObject in tileStaticObjects) { if (staticWorldObject.ProtoGameObject is IProtoObjectWall || staticWorldObject.ProtoGameObject is IProtoObjectDoor) { // damage only walls and doors damagedObject = staticWorldObject; break; } } if (damagedObject is null && offsetIndex > damageDistanceFullDamage) { // no wall or door there // stop damage propagation yield break; } yield return(damagedObject, offsetIndex); } }