Working airplane ability revamp
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
using System.Collections;
|
||||
using Core;
|
||||
using Core;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Minigames.Airplane.Abilities
|
||||
{
|
||||
/// <summary>
|
||||
/// Drop Plane Ability: Swipe down to drop straight down.
|
||||
/// Sustained ability - drops for fixed duration/distance.
|
||||
/// Drop Plane Ability: Press to drop straight down with strong downward force.
|
||||
/// Sustained ability - active for up to N seconds, can be interrupted early.
|
||||
/// Cooldown is proportional to usage time (full duration = N*2 cooldown).
|
||||
/// Good for precision strikes on targets.
|
||||
/// Configuration loaded from settings at runtime.
|
||||
/// </summary>
|
||||
@@ -15,8 +15,8 @@ namespace Minigames.Airplane.Abilities
|
||||
#region Configuration
|
||||
|
||||
private readonly float dropForce;
|
||||
private readonly float dropDistance;
|
||||
private readonly bool zeroHorizontalVelocity;
|
||||
private readonly float cooldownMultiplier;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -25,12 +25,12 @@ namespace Minigames.Airplane.Abilities
|
||||
/// <summary>
|
||||
/// Create drop ability with configuration from settings.
|
||||
/// </summary>
|
||||
public DropAbility(string name, Sprite icon, float cooldown, float force, float distance, bool zeroHorizontal = true)
|
||||
: base(name, icon, cooldown)
|
||||
public DropAbility(string name, Sprite icon, float cooldown, float force, float maxActiveDuration, float cooldownMult, bool zeroHorizontal = true)
|
||||
: base(name, icon, cooldown, reusable: true, activeDuration: maxActiveDuration)
|
||||
{
|
||||
dropForce = force;
|
||||
dropDistance = distance;
|
||||
zeroHorizontalVelocity = zeroHorizontal;
|
||||
cooldownMultiplier = cooldownMult;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -38,8 +38,6 @@ namespace Minigames.Airplane.Abilities
|
||||
#region State
|
||||
|
||||
private float originalXVelocity;
|
||||
private Vector3 dropStartPosition;
|
||||
private Coroutine dropCoroutine;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -66,17 +64,11 @@ namespace Minigames.Airplane.Abilities
|
||||
|
||||
// Apply strong downward force
|
||||
rb.AddForce(Vector2.down * dropForce, ForceMode2D.Impulse);
|
||||
|
||||
// Track drop distance
|
||||
dropStartPosition = currentAirplane.transform.position;
|
||||
|
||||
// Start monitoring drop distance
|
||||
dropCoroutine = currentAirplane.StartCoroutine(MonitorDropDistance());
|
||||
}
|
||||
|
||||
if (showDebugLogs)
|
||||
{
|
||||
Logging.Debug($"[DropAbility] Activated - Force: {dropForce}, Distance: {dropDistance}");
|
||||
Logging.Debug($"[DropAbility] Activated - Force: {dropForce}, Max Duration: {maxActiveDuration}s");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,13 +76,6 @@ namespace Minigames.Airplane.Abilities
|
||||
{
|
||||
if (!isActive) return;
|
||||
|
||||
// Stop monitoring
|
||||
if (dropCoroutine != null && currentAirplane != null)
|
||||
{
|
||||
currentAirplane.StopCoroutine(dropCoroutine);
|
||||
dropCoroutine = null;
|
||||
}
|
||||
|
||||
// Restore horizontal velocity (optional)
|
||||
if (currentAirplane != null)
|
||||
{
|
||||
@@ -102,36 +87,32 @@ namespace Minigames.Airplane.Abilities
|
||||
}
|
||||
}
|
||||
|
||||
base.Deactivate();
|
||||
if (showDebugLogs)
|
||||
{
|
||||
Logging.Debug($"[DropAbility] Deactivating after {activeDurationUsed:F2}s usage");
|
||||
}
|
||||
|
||||
// Start cooldown
|
||||
StartCooldown();
|
||||
// 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: 3s max, 2x multiplier -> full use = 6s cooldown, 1.5s use = 3s cooldown
|
||||
float dynamicCooldown = activeDurationUsed * cooldownMultiplier;
|
||||
|
||||
if (showDebugLogs)
|
||||
{
|
||||
Logging.Debug("[DropAbility] Deactivated, cooldown started");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Drop Monitoring
|
||||
|
||||
private IEnumerator MonitorDropDistance()
|
||||
{
|
||||
while (isActive && currentAirplane != null)
|
||||
{
|
||||
float distanceDropped = Mathf.Abs(dropStartPosition.y - currentAirplane.transform.position.y);
|
||||
|
||||
if (distanceDropped >= dropDistance)
|
||||
{
|
||||
// Drop distance reached - deactivate
|
||||
Deactivate();
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return null;
|
||||
Logging.Debug($"[DropAbility] CalculateDynamicCooldown: used={activeDurationUsed:F2}s, multiplier={cooldownMultiplier}, result={dynamicCooldown:F2}s");
|
||||
}
|
||||
|
||||
return dynamicCooldown;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user