Working airplane ability revamp

This commit is contained in:
Michal Pikulski
2025-12-18 12:05:29 +01:00
parent ca56e748ba
commit dece09c45a
12 changed files with 407 additions and 99 deletions

View File

@@ -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