You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
6.0 KiB
183 lines
6.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Numerics;
|
|
using UnityEngine;
|
|
|
|
namespace Skill_V2
|
|
{
|
|
public abstract class SkillSequence : ScriptableObject
|
|
{
|
|
public Skill Owner { get; private set; }
|
|
public bool IsDone { get; protected set; }
|
|
|
|
public void Initialize(Skill owner)
|
|
{
|
|
Owner = owner;
|
|
OnInitialize();
|
|
}
|
|
|
|
public virtual void OnInitialize() { }
|
|
public virtual void Enter() { }
|
|
public virtual void Excute() { }
|
|
public virtual void Exit() { }
|
|
public virtual void Stop() { }
|
|
}
|
|
|
|
[Serializable]
|
|
public class SendDmgInCollideEvent : EffectEventHandler
|
|
{
|
|
public override void HandleEvent(Effect effect)
|
|
{
|
|
var animEffect = effect as AnimatorTypeEffect;
|
|
Debug.Assert(animEffect != null, Logger.LogMessage(LogType.Assert, nameof(animEffect), "animEffect is null"));
|
|
|
|
var skill = animEffect.GetOwner<Skill>();
|
|
Debug.Assert(skill != null, Logger.LogMessage(LogType.Assert, nameof(skill), "skill is null"));
|
|
|
|
BigInteger skillDmg = skill.GetSkillDamage();
|
|
|
|
animEffect.CheckColliding((target) =>
|
|
{
|
|
if (target.TryGetComponent(out IBattleEntity entity) && (entity as Entity).HasTagsAny(skill.TargetTags))
|
|
{
|
|
BattleMgr.Instance.SendDamage(entity, skillDmg, 0, 0);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class SendDmgAllEvent : EffectEventHandler
|
|
{
|
|
public override void HandleEvent(Effect effect)
|
|
{
|
|
var animEffect = effect as AnimatorTypeEffect;
|
|
Debug.Assert(animEffect != null, Logger.LogMessage(LogType.Assert, nameof(animEffect), "animEffect is null"));
|
|
|
|
var skill = animEffect.GetOwner<Skill>();
|
|
Debug.Assert(skill != null, Logger.LogMessage(LogType.Assert, nameof(skill), "skill is null"));
|
|
|
|
BigInteger skillDmg = skill.GetSkillDamage();
|
|
|
|
BattleMgr.Instance.LoopAllBattleEntities((target) =>
|
|
{
|
|
if ((target as Entity).HasTagsAny(skill.TargetTags))
|
|
{
|
|
BattleMgr.Instance.SendDamage(target, skillDmg, 0, 0);
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class AddBuffToPlayerEvent : EffectEventHandler
|
|
{
|
|
public override void HandleEvent(Effect effect)
|
|
{
|
|
var animEffect = effect as AnimatorTypeEffect;
|
|
Debug.Assert(animEffect != null, Logger.LogMessage(LogType.Assert, nameof(animEffect), "animEffect is null"));
|
|
|
|
var skill = animEffect.GetOwner<Skill>();
|
|
Debug.Assert(skill != null, Logger.LogMessage(LogType.Assert, nameof(skill), "skill is null"));
|
|
|
|
for (int i = 0; i < skill.Data.Buffs.Count; i++)
|
|
{
|
|
var buff = skill.Data.Buffs[i];
|
|
buff.ResetDuration();
|
|
|
|
GamePlayBuffMgr.Instance.BuffGroup.AddBuff(buff);
|
|
}
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class ResetPlayerSkillCoolEvent : EffectEventHandler
|
|
{
|
|
public override void HandleEvent(Effect _) => BattleMgr.Instance.ResetSkillCooltime();
|
|
}
|
|
|
|
[Serializable]
|
|
public class SendDamageRepeatly : EffectUpdateHandler
|
|
{
|
|
[SerializeField] bool damageImediatelyWhenEnter = true;
|
|
[SerializeField] float damageInterval = 0.5f;
|
|
|
|
class CollideInfo
|
|
{
|
|
public Collider2D collider;
|
|
public IBattleEntity entity;
|
|
public float prevDamageTime;
|
|
}
|
|
|
|
class CollideInfoComparer : IEqualityComparer<CollideInfo>
|
|
{
|
|
public bool Equals(CollideInfo x, CollideInfo y) => x.collider == y.collider;
|
|
public int GetHashCode(CollideInfo obj) => obj.collider.GetHashCode();
|
|
}
|
|
|
|
AnimatorTypeEffect animEffect;
|
|
Skill skill;
|
|
BigInteger skillDmg;
|
|
|
|
HashSet<CollideInfo> collideInfos = new(new CollideInfoComparer());
|
|
|
|
public override void OnStart(Effect effect)
|
|
{
|
|
animEffect = effect as AnimatorTypeEffect;
|
|
Debug.Assert(animEffect != null, Logger.LogMessage(LogType.Assert, nameof(animEffect), "animEffect is null"));
|
|
|
|
skill = animEffect.GetOwner<Skill>();
|
|
Debug.Assert(skill != null, Logger.LogMessage(LogType.Assert, nameof(skill), "skill is null"));
|
|
|
|
animEffect.OnEnterCollide += HandleEnterCollide;
|
|
animEffect.OnExitCollide += HandleExitCollide;
|
|
|
|
skillDmg = skill.GetSkillDamage();
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
foreach (var collideInfo in collideInfos)
|
|
{
|
|
if (Time.time - collideInfo.prevDamageTime > damageInterval)
|
|
{
|
|
BattleMgr.Instance.SendDamage(collideInfo.entity, skillDmg, 0, 0);
|
|
collideInfo.prevDamageTime = Time.time;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnEnd()
|
|
{
|
|
animEffect.OnEnterCollide -= HandleEnterCollide;
|
|
animEffect.OnExitCollide -= HandleExitCollide;
|
|
animEffect = null;
|
|
}
|
|
|
|
private void HandleEnterCollide(Collider2D collider)
|
|
{
|
|
if (!collider.gameObject.TryGetComponent(out IBattleEntity entity) || !(entity as Entity).HasTagsAny(skill.TargetTags))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var collideInfo = new CollideInfo();
|
|
collideInfo.collider = collider;
|
|
collideInfo.entity = entity;
|
|
collideInfo.prevDamageTime = Time.time;
|
|
|
|
if(damageImediatelyWhenEnter)
|
|
{
|
|
BattleMgr.Instance.SendDamage(collideInfo.entity, skillDmg, 0, 0);
|
|
}
|
|
|
|
collideInfos.Add(collideInfo);
|
|
}
|
|
|
|
private void HandleExitCollide(Collider2D collider)
|
|
{
|
|
collideInfos.Remove(new CollideInfo { collider = collider });
|
|
}
|
|
}
|
|
}
|