Files
beyond/Assets/Scripts/Characters/Skills/DurationSpell.cs

81 lines
2.9 KiB
C#

using System.Collections;
using UnityEngine;
namespace Beyond
{
[CreateAssetMenu(menuName = "Magic/Spells/Duration Effect (Shield, Push, Flame)")]
public class DurationSpell : SpellDefinition
{
public enum DurationType { Simple, Shield, Flamethrower }
public DurationType type = DurationType.Simple;
public GameObject effectPrefab;
public float preCastDelay = 0f; // Matches 'startTime'
public float duration = 2f; // Matches 'endTime'
public float postEndDelay = 0f; // Matches 'delay'
public override void Cast(MagicAttacks caster, Transform target)
{
caster.StartCoroutine(CastRoutine(caster, target));
}
private IEnumerator CastRoutine(MagicAttacks caster, Transform target)
{
// ... (Rotation and Pre-Cast Delay logic) ...
// 3. Instantiate
GameObject instance = Instantiate(effectPrefab, caster.transform);
instance.transform.localPosition = Vector3.zero;
instance.transform.localRotation = Quaternion.identity;
// Register Events (for Barks)
caster.RegisterSpellDamageEvents(instance, this);
// 4. Initialize Specific Logic
if (type == DurationType.Shield)
{
var shieldCtrl = instance.GetComponent<ShieldEffectController>();
if (shieldCtrl) shieldCtrl.InitializeEffect();
// --- TOGGLE FLAG ON ---
caster.IsShieldActive = true;
}
else if (type == DurationType.Flamethrower)
{
var ps = instance.GetComponent<ParticleSystem>();
if (ps) ps.Play();
}
caster.ApplyDamageModifiers(instance);
// 5. Wait Duration (With Trinket Mods)
float finalDuration = duration;
if (type == DurationType.Shield && Player.Instance.CurrentTrinketStats.effectCalmness)
{
finalDuration *= 1.5f;
}
yield return new WaitForSeconds(finalDuration);
// 6. Cleanup Logic
if (type == DurationType.Flamethrower)
{
var ps = instance.GetComponent<ParticleSystem>();
if (ps) ps.Stop();
}
else if (type == DurationType.Shield)
{
var shieldCtrl = instance.GetComponent<ShieldEffectController>();
if (shieldCtrl) shieldCtrl.DisableEffect();
// --- TOGGLE FLAG OFF ---
caster.IsShieldActive = false;
}
// 7. Post Delay
if (postEndDelay > 0) yield return new WaitForSeconds(postEndDelay);
Destroy(instance);
}
}
}