Update the vacuum projectile logic
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
SpawnImpactEffect(collision.contacts[0].point);
|
int groundLayer = settings?.GroundLayer ?? 0;
|
||||||
Logging.Debug("[VacuumProjectile] Hit surface - starting slide");
|
|
||||||
StartSliding();
|
if (collision.gameObject.layer == groundLayer)
|
||||||
// Don't destroy - keep sliding!
|
{
|
||||||
|
// 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<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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user