Esempio n. 1
0
        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);
            }
        }