Update the vacuum projectile logic

This commit is contained in:
Michal Pikulski
2025-12-16 19:42:48 +01:00
parent c5f37a5df4
commit aaaeef19d7
4 changed files with 41 additions and 29 deletions

View File

@@ -272,6 +272,7 @@ namespace Core.Settings
// Physics Layers // Physics Layers
int FortBlockLayer { get; } // Layer index for fort blocks int FortBlockLayer { get; } // Layer index for fort blocks
int ProjectileLayer { get; } // Layer index for projectiles int ProjectileLayer { get; } // Layer index for projectiles
int GroundLayer { get; } // Layer index for ground/floor (used by vacuum projectile)
// Projectile Abilities // Projectile Abilities
float VacuumSlideSpeed { get; } // Constant velocity for vacuum sliding (m/s) float VacuumSlideSpeed { get; } // Constant velocity for vacuum sliding (m/s)

View File

@@ -126,6 +126,10 @@ namespace Minigames.FortFight.Core
[AppleHills.Core.Settings.Layer] [AppleHills.Core.Settings.Layer]
[SerializeField] private int projectileLayer = 9; [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")] [Header("Visual Settings")]
[Tooltip("Color tint applied to damaged blocks")] [Tooltip("Color tint applied to damaged blocks")]
[SerializeField] private Color damageColorTint = new Color(0.5f, 0.5f, 0.5f); [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 FortBlockLayer => fortBlockLayer;
public int ProjectileLayer => projectileLayer; public int ProjectileLayer => projectileLayer;
public int GroundLayer => groundLayer;
public Color DamageColorTint => damageColorTint; public Color DamageColorTint => damageColorTint;

View File

@@ -6,7 +6,8 @@ namespace Minigames.FortFight.Projectiles
{ {
/// <summary> /// <summary>
/// Vacuum projectile - high mass, slides along ground after landing. /// 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.
/// </summary> /// </summary>
public class VacuumProjectile : ProjectileBase public class VacuumProjectile : ProjectileBase
{ {
@@ -17,7 +18,10 @@ namespace Minigames.FortFight.Projectiles
protected override void OnHit(Collision2D collision) protected override void OnHit(Collision2D collision)
{ {
// If already sliding, count block destruction // Get settings once for all checks
var settings = GameManager.GetSettingsObject<IFortFightSettings>();
// If already sliding, handle block destruction
if (isSliding) if (isSliding)
{ {
var block = collision.gameObject.GetComponent<Fort.FortBlock>(); var block = collision.gameObject.GetComponent<Fort.FortBlock>();
@@ -27,7 +31,6 @@ namespace Minigames.FortFight.Projectiles
SpawnImpactEffect(collision.contacts[0].point); SpawnImpactEffect(collision.contacts[0].point);
// Get damage from settings // Get damage from settings
var settings = GameManager.GetSettingsObject<IFortFightSettings>();
float blockDamage = settings?.VacuumBlockDamage ?? 999f; float blockDamage = settings?.VacuumBlockDamage ?? 999f;
// Deal high damage to destroy block instantly // Deal high damage to destroy block instantly
@@ -46,15 +49,36 @@ namespace Minigames.FortFight.Projectiles
return; return;
} }
// First hit - spawn impact effect and start 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); SpawnImpactEffect(collision.contacts[0].point);
Logging.Debug("[VacuumProjectile] Hit surface - starting slide"); Logging.Debug($"[VacuumProjectile] Hit ground (layer {groundLayer}) - starting slide");
StartSliding(); StartSliding();
// Don't destroy - keep sliding! // 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<Fort.FortBlock>();
if (hitBlock != null)
{
hitBlock.TakeDamage(Damage);
SpawnImpactEffect(collision.contacts[0].point);
}
// Normal projectile destruction
DestroyProjectile();
} }
/// <summary> /// <summary>
/// Start sliding behavior after hitting surface /// Start sliding behavior after hitting ground surface
/// </summary> /// </summary>
private void StartSliding() private void StartSliding()
{ {

View File

@@ -21,26 +21,6 @@ MonoBehaviour:
trajectoryTimeStep: 0.1 trajectoryTimeStep: 0.1
trajectoryLockDuration: 2 trajectoryLockDuration: 2
autoRegisterInput: 0 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: aiDifficultyConfigs:
- difficulty: 0 - difficulty: 0
data: data:
@@ -61,6 +41,7 @@ MonoBehaviour:
thinkTimeMin: 0.2 thinkTimeMin: 0.2
thinkTimeMax: 0.8 thinkTimeMax: 0.8
defaultAIDifficulty: 1 defaultAIDifficulty: 1
aiAllowedProjectiles: 000000000100000003000000
weakPointExplosionRadius: 6 weakPointExplosionRadius: 6
weakPointExplosionDamage: 30 weakPointExplosionDamage: 30
weakPointExplosionForce: 30 weakPointExplosionForce: 30
@@ -119,4 +100,5 @@ MonoBehaviour:
ceilingFanDropSpeed: 30 ceilingFanDropSpeed: 30
fortBlockLayer: 16 fortBlockLayer: 16
projectileLayer: 15 projectileLayer: 15
groundLayer: 14
damageColorTint: {r: 1, g: 0, b: 0, a: 1} damageColorTint: {r: 1, g: 0, b: 0, a: 1}