230 lines
8.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: 白哉
* @Description:
* @Date: 2025年07月01日 星期二 14:07:05
* @Modify:
*/
using RuntimeData;
using TH1Renderer;
using UnityEngine;
namespace Logic.Timeline
{
public class MoveKill : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg;
public override void OnStart()
{
//立刻死亡并播放受伤动画,必须先处理死亡再处理移动不然gridToUnit的dict会出错
// 这里改成直接结算,包含了死亡,包含了经验增长和权利奇观记录
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
//移动过去并更新视野
Main.UnitLogic.MoveTo(Map, Origin, TargetGrid, MoveType.AttackMove);
}
public override void OnFinished()
{
var main = GameObject.Find("Main").GetComponent<Main>();
MapRenderer.Instance.ROGridMap[TargetGrid.Id].SetBounceAnim();
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg;
TargetGrid.SetGridVFXRenderMark(t);
TargetGrid.VFXRenderMarkDie = true;
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
main.MapInteractionLogic.CheckContinuousAction(Map, OriginPlayer, Origin, TargetGrid);
}
public override void Excute()
{
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
Main.UnitLogic.MoveTo(Map, Origin, TargetGrid, MoveType.AttackMove);
}
public override void OnUpdate(float progressTime)
{
}
}
public class NotMoveKill : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg;
public float AttackTime;
public float AttackBackTime;
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void Excute()
{
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
}
public override void OnUpdate(float progressTime)
{
if (Target == null)
return;
if (progressTime >= AttackTime)
{
AttackTime = float.MaxValue;
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg, DamageType.ActiveAttack);
Target.RenderMark = true;
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg;
TargetGrid.SetGridVFXRenderMark(t);
TargetGrid.VFXRenderMarkDie = true;
var main = GameObject.Find("Main").GetComponent<Main>();
MapRenderer.Instance.ROGridMap[TargetGrid.Id].SetBounceAnim();
}
if (progressTime >= AttackBackTime)
{
AttackBackTime = float.MaxValue;
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (OriginPlayer.Id != Map.PlayerMap.SelfPlayerId) return;
if (!MapRenderer.Instance.CheckUnitHasMoveAttackTarget(Origin.Id)) return;
Debug.Log("!!!!!");
main.MapInteractionLogic.OnTileClicked(Map, TargetGrid);
}
}
}
public class AttackAndCounter : FragmentBase
{
public MapData Map;
public UnitData Origin;
public UnitData Target;
public GridData OriginGrid;
public GridData TargetGrid;
public PlayerData OriginPlayer;
public PlayerData TargetPlayer;
public int Dmg1;
public int Dmg2;
public bool CanCounter;
public float AttackAnimTime;
public float CounterAttackStart;
public float CounterAttackWait;
public float CounterAttackBack;
public override void OnStart()
{
}
public override void OnFinished()
{
}
public override void Excute()
{
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg1, DamageType.ActiveAttack);
Main.UnitLogic.DamageSettlement(Map, Target, Origin, Dmg2, DamageType.CounterAttack);
}
public override void OnUpdate(float progressTime)
{
if (Target == null)
return;
if (progressTime >= AttackAnimTime)
{
AttackAnimTime = float.MaxValue;
Main.UnitLogic.DamageSettlement(Map, Origin, Target, Dmg1, DamageType.ActiveAttack);
Target.RenderMark = true;
Target.BounceRenderMark = true;
Target.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg1;
TargetGrid.SetGridVFXRenderMark(t);
}
if (CanCounter && progressTime >= CounterAttackStart)
{
CounterAttackStart = float.MaxValue;
Target.AttackRenderMark = CanCounter;
Target.AttackRenderMarkAttackAnimType = Target.GetAttackRange() switch
{
1 => AttackAnimType.Melee, 2 => AttackAnimType.Arrow, 3 => AttackAnimType.Bomb,
_ => AttackAnimType.None
};
Target.AttackRenderMarkTargetPos = Table.Instance.GridToWorld(OriginGrid,"isUnit");
Target.AttackRenderMarkNeedBack = true;
}
if (CanCounter && progressTime >= CounterAttackWait)
{
CounterAttackWait = float.MaxValue;
var settlement = Main.UnitLogic.DamageSettlement(Map, Target, Origin, Dmg2, DamageType.CounterAttack);
if (settlement.IsKill)
{
OriginGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg2;
OriginGrid.SetGridVFXRenderMark(t);
OriginGrid.VFXRenderMarkFog = true;
OriginGrid.VFXRenderMarkDie = true;
}
else
{
Origin.RenderMark = true;
Origin.BounceRenderMark = true;
Origin.BounceRenderMakrWaitTime = Table.Instance.AnimDataAssets.AttackBounceWaitAnimTime;
OriginGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Dmg2;
OriginGrid.SetGridVFXRenderMark(t);
OriginGrid.VFXRenderMarkFog = true;
}
}
if (progressTime >= CounterAttackBack)
{
CounterAttackBack = float.MaxValue;
var main = GameObject.Find("Main").GetComponent<Main>();
//处理玩家攻击后自动再次点击unit从而连续处理移动或者攻击的情况for MapInteraction
if (OriginPlayer.Id == Map.PlayerMap.SelfPlayerId && Origin.Alive &&
MapRenderer.Instance.CheckUnitHasMoveAttackTarget(Origin.Id))
{
main.MapInteractionLogic.OnTileClicked(Map, OriginGrid);
}
}
}
}
}