/* * @Author: 白哉 * @Description: * @Date: 2025年07月01日 星期二 14:07:05 * @Modify: */ using Logic.CrashSight; using RuntimeData; using TH1_Logic.Core; 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() { if (Origin == null || Target == null) { LogSystem.LogError($"MoveKill Origin:{Origin} or Target:{Target} is null"); return; } //立刻死亡并播放受伤动画,必须先处理死亡,再处理移动,不然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
(); 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 (Origin == null || Target == null) { LogSystem.LogError($"NotMoveKill Origin:{Origin} or Target:{Target} is 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
(); MapRenderer.Instance.ROGridMap[TargetGrid.Id].SetBounceAnim(); } if (progressTime >= AttackBackTime) { AttackBackTime = float.MaxValue; var main = GameObject.Find("Main").GetComponent
(); //处理玩家攻击后自动再次点击unit,从而连续处理移动或者攻击的情况,for MapInteraction if (OriginPlayer.Id != Map.PlayerMap.SelfPlayerId) return; if (!MapRenderer.Instance.CheckUnitHasMoveAttackTarget(Origin.Id)) return; 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); if (Target.Health == 0) return; Main.UnitLogic.DamageSettlement(Map, Target, Origin, Dmg2, DamageType.CounterAttack); } public override void OnUpdate(float progressTime) { if (Origin == null || Target == null || Origin.Health == 0 || Target.Health == 0) { LogSystem.LogError($"AttackAndCounter Origin:{Origin} or Target:{Target} is null"); Duration = 0; 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 == null) return; 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
(); //处理玩家攻击后自动再次点击unit,从而连续处理移动或者攻击的情况,for MapInteraction if (OriginPlayer.Id == Map.PlayerMap.SelfPlayerId && Origin.Alive && MapRenderer.Instance.CheckUnitHasMoveAttackTarget(Origin.Id)) { main.MapInteractionLogic.OnTileClicked(Map, OriginGrid); } } } } }