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

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 });
}
}
}