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}