diff --git a/Assets/Scripts/Core/Settings/SettingsInterfaces.cs b/Assets/Scripts/Core/Settings/SettingsInterfaces.cs index 98c8dfcf..c3c0ac69 100644 --- a/Assets/Scripts/Core/Settings/SettingsInterfaces.cs +++ b/Assets/Scripts/Core/Settings/SettingsInterfaces.cs @@ -272,6 +272,7 @@ namespace Core.Settings // Physics Layers int FortBlockLayer { get; } // Layer index for fort blocks int ProjectileLayer { get; } // Layer index for projectiles + int GroundLayer { get; } // Layer index for ground/floor (used by vacuum projectile) // Projectile Abilities float VacuumSlideSpeed { get; } // Constant velocity for vacuum sliding (m/s) diff --git a/Assets/Scripts/Minigames/FortFight/Core/FortFightSettings.cs b/Assets/Scripts/Minigames/FortFight/Core/FortFightSettings.cs index 30f80c46..c51b3fe9 100644 --- a/Assets/Scripts/Minigames/FortFight/Core/FortFightSettings.cs +++ b/Assets/Scripts/Minigames/FortFight/Core/FortFightSettings.cs @@ -126,6 +126,10 @@ namespace Minigames.FortFight.Core [AppleHills.Core.Settings.Layer] [SerializeField] private int projectileLayer = 9; + [Tooltip("Layer for ground/floor - vacuum projectile activates sliding when hitting this layer (Default: Layer 0 'Default')")] + [AppleHills.Core.Settings.Layer] + [SerializeField] private int groundLayer = 0; + [Header("Visual Settings")] [Tooltip("Color tint applied to damaged blocks")] [SerializeField] private Color damageColorTint = new Color(0.5f, 0.5f, 0.5f); @@ -152,6 +156,7 @@ namespace Minigames.FortFight.Core public int FortBlockLayer => fortBlockLayer; public int ProjectileLayer => projectileLayer; + public int GroundLayer => groundLayer; public Color DamageColorTint => damageColorTint; diff --git a/Assets/Scripts/Minigames/FortFight/Projectiles/VacuumProjectile.cs b/Assets/Scripts/Minigames/FortFight/Projectiles/VacuumProjectile.cs index 6c0aeb39..585649d8 100644 --- a/Assets/Scripts/Minigames/FortFight/Projectiles/VacuumProjectile.cs +++ b/Assets/Scripts/Minigames/FortFight/Projectiles/VacuumProjectile.cs @@ -6,7 +6,8 @@ namespace Minigames.FortFight.Projectiles { /// /// Vacuum projectile - high mass, slides along ground after landing. - /// On floor/block impact: applies constant force to the right and destroys blocks. + /// Maintains normal physics until it hits the ground layer, then activates sliding mode. + /// While sliding, destroys blocks it encounters. /// public class VacuumProjectile : ProjectileBase { @@ -17,7 +18,10 @@ namespace Minigames.FortFight.Projectiles protected override void OnHit(Collision2D collision) { - // If already sliding, count block destruction + // Get settings once for all checks + var settings = GameManager.GetSettingsObject(); + + // If already sliding, handle block destruction if (isSliding) { var block = collision.gameObject.GetComponent(); @@ -27,7 +31,6 @@ namespace Minigames.FortFight.Projectiles SpawnImpactEffect(collision.contacts[0].point); // Get damage from settings - var settings = GameManager.GetSettingsObject(); float blockDamage = settings?.VacuumBlockDamage ?? 999f; // Deal high damage to destroy block instantly @@ -46,15 +49,36 @@ namespace Minigames.FortFight.Projectiles return; } - // First hit - spawn impact effect and start sliding - SpawnImpactEffect(collision.contacts[0].point); - Logging.Debug("[VacuumProjectile] Hit surface - starting slide"); - StartSliding(); - // Don't destroy - keep sliding! + // Check if we hit the ground layer to activate sliding + int groundLayer = settings?.GroundLayer ?? 0; + + if (collision.gameObject.layer == groundLayer) + { + // Hit ground - start sliding behavior + SpawnImpactEffect(collision.contacts[0].point); + Logging.Debug($"[VacuumProjectile] Hit ground (layer {groundLayer}) - starting slide"); + StartSliding(); + // Don't destroy - keep sliding + return; + } + + // Hit something else (fort block, etc.) while not sliding - use normal projectile behavior + Logging.Debug($"[VacuumProjectile] Hit {collision.gameObject.name} (layer {collision.gameObject.layer}) - normal impact"); + + // Deal damage if it's a fort block + var hitBlock = collision.gameObject.GetComponent(); + if (hitBlock != null) + { + hitBlock.TakeDamage(Damage); + SpawnImpactEffect(collision.contacts[0].point); + } + + // Normal projectile destruction + DestroyProjectile(); } /// - /// Start sliding behavior after hitting surface + /// Start sliding behavior after hitting ground surface /// private void StartSliding() { diff --git a/Assets/Settings/FortFightSettings.asset b/Assets/Settings/FortFightSettings.asset index 04b20c4d..0b4402c7 100644 --- a/Assets/Settings/FortFightSettings.asset +++ b/Assets/Settings/FortFightSettings.asset @@ -21,26 +21,6 @@ MonoBehaviour: trajectoryTimeStep: 0.1 trajectoryLockDuration: 2 autoRegisterInput: 0 - materialConfigs: - - material: 0 - baseHp: 20 - baseMass: 0.5 - - material: 1 - baseHp: 50 - baseMass: 2 - - material: 2 - baseHp: 15 - baseMass: 0.8 - sizeConfigs: - - size: 0 - hpMultiplier: 1 - massMultiplier: 0.5 - - size: 1 - hpMultiplier: 1.5 - massMultiplier: 1 - - size: 2 - hpMultiplier: 2 - massMultiplier: 2 aiDifficultyConfigs: - difficulty: 0 data: @@ -61,6 +41,7 @@ MonoBehaviour: thinkTimeMin: 0.2 thinkTimeMax: 0.8 defaultAIDifficulty: 1 + aiAllowedProjectiles: 000000000100000003000000 weakPointExplosionRadius: 6 weakPointExplosionDamage: 30 weakPointExplosionForce: 30 @@ -119,4 +100,5 @@ MonoBehaviour: ceilingFanDropSpeed: 30 fortBlockLayer: 16 projectileLayer: 15 + groundLayer: 14 damageColorTint: {r: 1, g: 0, b: 0, a: 1}