Files
AppleHillsProduction/Assets/Scripts/Minigames/Airplane/Abilities/JetAbility.cs
2025-12-18 12:09:58 +01:00

124 lines
4.1 KiB
C#

using Core;
using UnityEngine;
namespace Minigames.Airplane.Abilities
{
/// <summary>
/// Jet Plane Ability: Hold to fly straight without gravity.
/// Sustained ability - active while button held, deactivates on release.
/// </summary>
public class JetAbility : BaseAirplaneAbility
{
#region Configuration
private readonly float jetSpeed;
private readonly float jetAngle;
private readonly float cooldownMultiplier;
#endregion
#region Constructor
/// <summary>
/// Create jet ability with configuration from settings.
/// </summary>
public JetAbility(string name, Sprite icon, float cooldown, float speed, float angle, float maxActiveDuration, float cooldownMult)
: base(name, icon, cooldown, reusable: true, activeDuration: maxActiveDuration)
{
jetSpeed = speed;
jetAngle = angle;
cooldownMultiplier = cooldownMult;
}
#endregion
#region State
private float originalGravityScale;
private bool originalRotateToVelocity;
#endregion
#region Override Methods
public override void Execute()
{
if (!ValidateAirplane()) return;
if (!CanActivate) return;
StartActivation();
// Store original physics values
var rb = currentAirplane.GetComponent<Rigidbody2D>();
if (rb != null)
{
originalGravityScale = rb.gravityScale;
// Disable gravity
rb.gravityScale = 0f;
// Set constant velocity in forward direction
Vector2 direction = Quaternion.Euler(0, 0, jetAngle) * Vector2.right;
rb.linearVelocity = direction.normalized * jetSpeed;
}
// Disable rotation to velocity (maintain straight angle)
originalRotateToVelocity = currentAirplane.RotateToVelocity;
currentAirplane.RotateToVelocity = false;
if (showDebugLogs)
{
Logging.Debug($"[JetAbility] Activated - Speed: {jetSpeed}, Angle: {jetAngle}");
}
}
public override void Deactivate()
{
if (!isActive) return;
// Restore original physics
if (currentAirplane != null)
{
var rb = currentAirplane.GetComponent<Rigidbody2D>();
if (rb != null)
{
rb.gravityScale = originalGravityScale;
}
// Restore rotation behavior
currentAirplane.RotateToVelocity = originalRotateToVelocity;
}
if (showDebugLogs)
{
Logging.Debug($"[JetAbility] Deactivating after {activeDurationUsed:F2}s usage");
}
// Base.Deactivate() will call CalculateDynamicCooldown and start cooldown
base.Deactivate();
}
/// <summary>
/// Calculate dynamic cooldown based on usage time.
/// Full duration (maxActiveDuration) = maxActiveDuration * cooldownMultiplier cooldown.
/// Partial usage = proportional cooldown.
/// </summary>
protected override float CalculateDynamicCooldown()
{
// Calculate proportional cooldown: usedTime * multiplier
// Example: 5s max, 2x multiplier -> full use = 10s cooldown, 2.5s use = 5s cooldown
float dynamicCooldown = activeDurationUsed * cooldownMultiplier;
if (showDebugLogs)
{
Logging.Debug($"[JetAbility] CalculateDynamicCooldown: used={activeDurationUsed:F2}s, multiplier={cooldownMultiplier}, result={dynamicCooldown:F2}s");
}
return dynamicCooldown;
}
#endregion
}
}