From 8f983d0dab26becb6b85dbbb616fde21c3ad8f02 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 20 八月 2025 18:40:23 +0800
Subject: [PATCH] 125 【战斗】战斗系统

---
 Main/System/Battle/Skill/SkillBase.cs |  359 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 191 insertions(+), 168 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index a0604ba..d74d76d 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -9,6 +9,8 @@
 
 public class SkillBase
 {
+	protected SkillEffect skillEffect;
+
 	protected HB427_tagSCUseSkill tagUseSkillAttack;
 
 	protected SkillConfig skillConfig;
@@ -68,7 +70,6 @@
 
 
 
-
 	public void Pause()
 	{
 		pauseState = startCounting;
@@ -80,119 +81,231 @@
 		startCounting = pauseState;
 	}
 
+
 	// 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
 	// 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
 	public virtual void Cast()
 	{
+		Debug.LogError(GetType().Name + " Skill Cast Start");
 		//	楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
 		HighLightAllTargets();
 
 		//	璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
-
+		Debug.LogError(GetType().Name + " Skill CastMode : " + skillConfig.castMode);
 		switch (skillConfig.castMode)
 		{
 			case SkillCastMode.Self:
-				PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
+				CastImpl();
 				break;
 			case SkillCastMode.Enemy:
-				MoveToTarget(caster.GetEnemyCamp(), skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				CastToEnemy();
 				break;
 			case SkillCastMode.Target:
-				// 鐩爣鏄晫鏂逛富鐩爣
-				if (tagUseSkillAttack.HurtCount <= 0)
-				{
-					Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
-					OnSkillFinished();
-					return;
-				}
-
-				var mainHurt = tagUseSkillAttack.HurtList[0];
-
-				BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID);
-				if (mainTarget == null)
-				{
-					Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID);
-					OnSkillFinished();
-					return;
-				}
-				MoveToTarget(mainTarget.Camp, mainTarget, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				CastToTarget();
 				break;
 			case SkillCastMode.Allies:
-				MoveToTarget(caster.Camp, skillConfig, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				CastToAllies();
 				break;
 			// case SkillCastMode.DashCast:
 			// 	DashToTarget(() => BackToOrigin(OnSkillFinished));
 			// 	break;
 			default:
-				Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝" + skillConfig.SkillID);
+				Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
 				OnSkillFinished();
 				break;
 		}
 	}
 
-	//	杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟
-	protected virtual void DoSkillLogic(Action _onComplete = null)
+	protected void MoveToTarget(RectTransform target, Vector2 offset, float duration, Action onComplete = null)
 	{
-
-	}
-
-	protected TrackEntry PlayCastAnimation(Action onComplete = null)
-	{
-		// 鎾斁鏂芥硶鍔ㄤ綔
-		return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
-				OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
-				OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
-	}
-
-	public void MoveToTarget(BattleCamp camp, BattleObject target, float duration = 0.2f, Action _onComplete = null)
-	{
-		targetNode = battleField.GetTeamNode(camp, target);
-
-		Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
-		RectTransform selfRect = caster.heroRectTrans;
-		RectTransform targetRect = targetNode;
-
-		var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
+		caster.motionBase.PlayAnimation(MotionName.run, true);
+		var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, duration, () =>
+		{
+			caster.motionBase.PlayAnimation(MotionName.idle, true);
+			onComplete?.Invoke();
+		});
 		battleField.battleTweenMgr.OnPlayTween(tweener);
 	}
 
-	public void MoveToTarget(BattleCamp camp, SkillConfig skillCfg, float duration = 0.2f, Action _onComplete = null)
-	{
-		targetNode = battleField.GetTeamNode(camp, skillCfg);
-
-		Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
-		RectTransform selfRect = caster.heroRectTrans;
-		RectTransform targetRect = targetNode;
-
-		var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
-		battleField.battleTweenMgr.OnPlayTween(tweener);
-	}
-
-	public void TurnBack(Action _onComplete)
+	protected void TurnBack(Action _onComplete, float forward)
 	{
 		if (skillConfig.CastDistance < 0)
 		{
 			//	杞韩
-			caster.heroGo.transform.localScale = new Vector3(-1, 1, 1);
+			Vector3 scale = caster.heroGo.transform.localScale;
+			scale.x = Mathf.Abs(scale.x) * forward;
+			caster.heroGo.transform.localScale = scale;
 		}
 		_onComplete?.Invoke();
 	}
 
-	public void BackToOrigin(Action _onComplete = null)
+	protected void CastToEnemy()
 	{
-		RectTransform selfRect = caster.heroRectTrans;
-		Vector2 targetAnchoredPos = Vector2.zero;
-		var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f)
-			.SetEase(Ease.Linear)
-			.OnComplete(() =>
-			{
-				//	杞垚姝g‘鏂瑰悜
-				caster.heroGo.transform.localScale = Vector3.one;
-				_onComplete?.Invoke();
-			});
+		const float moveTime = 0.5f;
 
-		battleField.battleTweenMgr.OnPlayTween(tween);
+		RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
+
+		MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
+		{
+			//	鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+			TurnBack(() =>
+			{
+				//	鍒拌揪鐩爣浣嶇疆
+				CastImpl(() =>
+				{
+					TurnBack(
+						() =>
+						{
+							//	鍥炲埌鍘熸潵鐨勪綅缃�
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
+							{
+								TurnBack(null, 1f);
+								caster.motionBase.PlayAnimation(MotionName.idle, true);
+							});
+						}
+					, -1f);
+				});
+			}, -1f);
+		});
 	}
+
+
+
+	protected void CastToTarget()
+	{
+		// 鐩爣鏄晫鏂逛富鐩爣
+		if (tagUseSkillAttack.HurtCount <= 0)
+		{
+			Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
+			OnSkillFinished();
+			return;
+		}
+
+		var mainHurt = tagUseSkillAttack.HurtList[0];
+
+		BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID);
+		if (mainTarget == null)
+		{
+			Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID);
+			OnSkillFinished();
+			return;
+		}
+		// MoveToTarget(mainTarget.Camp, mainTarget, _onComplete: () => TurnBack(() => CastImpl(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+	}
+
+	protected void CastToAllies()
+	{
+		// MoveToTarget(caster.Camp, skillConfig, _onComplete: () => TurnBack(() => CastImpl(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+	}
+
+	protected TrackEntry CastImpl(Action onComplete = null)
+	{
+		// 鎾斁鏂芥硶鍔ㄤ綔
+		return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);//鏀诲嚮涓憞缁撴潫
+	}
+
+	//	鎶�鑳藉紑濮�
+	public virtual void OnSkillStart()
+	{
+		skillEffect = SkillEffectFactory.CreateSkillEffect(
+				caster,
+				skillConfig,
+				tagUseSkillAttack
+			);
+		if (skillEffect != null)
+		{
+			skillEffect.Play(OnHitTargets);
+		}
+	}
+
+	//	鎶�鑳藉墠鎽囧抚缁撴潫
+	public virtual void OnStartSkillFrameEnd()
+	{
+
+	}
+
+	/// <summary>
+	/// 涓憞寮�濮� times=绗嚑娆″惊鐜� 浠�0寮�濮�
+	/// </summary>
+	/// <param name="times"></param>
+	public virtual void OnMiddleFrameStart(int times)
+	{
+
+	}
+
+	public virtual void OnMiddleFrameEnd(int times, int hitIndex)
+	{
+
+	}
+
+	/// <summary>
+	/// 鍚庢憞寮�濮�
+	/// </summary>
+	public virtual void OnFinalFrameStart()
+	{
+
+	}
+
+	/// <summary>
+	/// 鍚庢憞缁撴潫
+	/// </summary>
+	public virtual void OnFinalFrameEnd()
+	{
+
+	}
+
+
+
+	// public void MoveToTarget(BattleCamp camp, BattleObject target, float duration = 0.2f, Action _onComplete = null)
+	// {
+	// 	targetNode = battleField.GetTeamNode(camp, target);
+
+	// 	Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
+	// 	RectTransform selfRect = caster.heroRectTrans;
+	// 	RectTransform targetRect = targetNode;
+
+	// 	var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
+	// 	battleField.battleTweenMgr.OnPlayTween(tweener);
+	// }
+
+	// public void MoveToTarget(BattleCamp camp, SkillConfig skillCfg, float duration = 0.2f, Action _onComplete = null)
+	// {
+	// 	targetNode = battleField.GetTeamNode(camp, skillCfg);
+
+	// 	Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
+	// 	RectTransform selfRect = caster.heroRectTrans;
+	// 	RectTransform targetRect = targetNode;
+
+	// 	var tweener = BattleUtility.MoveToTarget(selfRect, targetRect, offset, duration, _onComplete);
+	// 	battleField.battleTweenMgr.OnPlayTween(tweener);
+	// }
+
+	// public void TurnBack(Action _onComplete)
+	// {
+	// 	if (skillConfig.CastDistance < 0)
+	// 	{
+	// 		//	杞韩
+	// 		caster.heroGo.transform.localScale = new Vector3(-1, 1, 1);
+	// 	}
+	// 	_onComplete?.Invoke();
+	// }
+
+	// public void BackToOrigin(Action _onComplete = null)
+	// {
+	// 	RectTransform selfRect = caster.heroRectTrans;
+	// 	Vector2 targetAnchoredPos = Vector2.zero;
+	// 	var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f)
+	// 		.SetEase(Ease.Linear);
+
+	// 	tween.onComplete += () =>
+	// 	{
+	// 		//	杞垚姝g‘鏂瑰悜
+	// 		caster.heroGo.transform.localScale = Vector3.one;
+	// 		_onComplete?.Invoke();
+	// 	};
+
+	// 	battleField.battleTweenMgr.OnPlayTween(tween);
+	// }
 
 	protected void HighLightAllTargets()
 	{
@@ -225,7 +338,7 @@
 			long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
 
 			// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
-			List<long> damageList = DivideDamageToList(damageDivide, totalDamage);
+			List<long> damageList = BattleUtility.DivideDamageToList(damageDivide, totalDamage);
 
 			OnHitEachTarget(target, totalDamage, damageList, ref hurt);
 		}
@@ -235,7 +348,7 @@
 
 	protected void HandleDead()
 	{
-		var deadPackList = FindDeadPack();
+		var deadPackList = BattleUtility.FindDeadPack(packList);
 		CheckAfterDeadhPack();
 
 		// 澶勭悊鎺夎惤鍖� 鎻愬墠distribute涔嬪悗 PackManager鎵嶆湁鎺夎惤鐗� 鎵�浠ヤ笉璺焌ssignexp涓�鏍穌istribute
@@ -276,13 +389,14 @@
 		}
 
 		// 鍒嗗彂姝讳骸鍖�
+		battleField.OnObjsDead(deadPackList);
 		foreach (var deadPack in deadPackList)
 		{
-			PackageRegedit.Distribute(deadPack);
 			packList.Remove(deadPack);
 		}
 		deadPackList.Clear();
 	}
+
 
 
 	// 鍒嗛厤鎺夎惤
@@ -327,32 +441,7 @@
 		return expAssign;
 	}
 
-	/// <summary>
-	/// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
-	/// </summary>
-	protected List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
-	{
-		List<long> fixedDamageList = new List<long>();
-		long assigned = 0;
-		int count = damageDivide.Length;
 
-		for (int i = 0; i < count; i++)
-		{
-			long damage;
-			if (i == count - 1)
-			{
-				// 鏈�鍚庝竴涓垎閰嶉」淇涓哄墿浣�
-				damage = totalDamage - assigned;
-			}
-			else
-			{
-				damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 鍥涜垗浜斿叆
-				assigned += damage;
-			}
-			fixedDamageList.Add(damage);
-		}
-		return fixedDamageList;
-	}
 
 	protected virtual void OnHitEachTarget(BattleObject target, long totalDamage, List<long> damageList, ref HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
 	{
@@ -368,57 +457,6 @@
 				target.heroGo.transform
 			);
 		}
-	}
-
-	protected HB423_tagMCTurnFightObjReborn FindRebornPack(BattleObject target)
-	{
-		HB423_tagMCTurnFightObjReborn rebornPack = null;
-		for (int i = 0; i < packList.Count; i++)
-		{
-			var pack = packList[i];
-			if (pack is HB423_tagMCTurnFightObjReborn)
-			{
-				rebornPack = pack as HB423_tagMCTurnFightObjReborn;
-				if (rebornPack.ObjID == target.ObjID)
-				{
-					return rebornPack;
-				}
-			}
-			else if (pack is CustomHB426CombinePack)
-			{
-				var combinePack = pack as CustomHB426CombinePack;
-				if (combinePack.startTag.Tag.StartsWith("Skill_"))
-				{
-					break; // 鎵惧埌鎶�鑳藉寘灏变笉闇�瑕佸啀澶勭悊浜�
-				}
-			}
-		}
-		return null;
-	}
-
-	protected List<HB422_tagMCTurnFightObjDead> FindDeadPack()
-	{
-		List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>();
-		for (int i = 0; i < packList.Count; i++)
-		{
-			var pack = packList[i];
-			//	瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
-			if (pack is HB422_tagMCTurnFightObjDead)
-			{
-				var deadPack = pack as HB422_tagMCTurnFightObjDead;
-				deadPacks.Add(deadPack);
-			}
-			else if (pack is CustomHB426CombinePack)
-			{
-				//	鎵炬浜″寘涓嶈瓒婅繃鎶�鑳藉寘
-				var combinePack = pack as CustomHB426CombinePack;
-				if (combinePack.startTag.Tag.StartsWith("Skill_"))
-				{
-					break;
-				}
-			}
-		}
-		return deadPacks;
 	}
 
 	protected void CheckAfterDeadhPack()
@@ -487,7 +525,8 @@
 
 	public void OnSkillFinished()
 	{
-		while (packList.Count > 0)
+		Debug.LogError(GetType().Name + " Skill Finished");
+		if (packList.Count > 0)
 		{
 			var pack = packList[0];
 			packList.RemoveAt(0);
@@ -506,21 +545,5 @@
 		}
 
 		isFinished = true;
-	}
-	
-
-	protected virtual void OnActiveSkillFrame()
-	{
-
-	}
-
-	protected virtual void OnStartSkillFrame()
-	{
-
-	}
-
-	protected virtual void OnEndSkillFrame()
-	{
-		
 	}
 }
\ No newline at end of file

--
Gitblit v1.8.0