From 80dddf17d8edba62f002d1237a604a509669340e Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 29 七月 2025 16:59:04 +0800
Subject: [PATCH] 125 【战斗】战斗系统

---
 Main/System/Battle/Skill/SkillBase.cs |  242 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 224 insertions(+), 18 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 6c8a691..64964ac 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,26 +1,244 @@
 using System.Collections.Generic;
 using UnityEngine;
+using System;
+using DG.Tweening;
+using Spine;
 
 
 public class SkillBase
 {
+	protected H0604_tagUseSkillAttack tagUseSkillAttack;
+
 	protected SkillConfig skillConfig;
 
 	protected bool isFinished = false;
 
-	public SkillBase(SkillConfig _skillCfg)
+	protected BattleField battleField = null; // 鎴樺満
+
+	protected RectTransform targetNode = null; // 鐩爣鑺傜偣
+
+	protected BattleObject caster = null; // 鏂芥硶鑰�
+
+	protected bool startCounting = false;
+
+	protected bool pauseState = false;
+
+	protected int curFrame = 0;
+
+	protected List<GameNetPackBasic> packList;
+
+	protected SkillBase otherSkill;
+
+	public SkillBase(BattleObject _caster, SkillConfig _skillCfg, H0604_tagUseSkillAttack vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
 	{
+		caster = _caster;
 		skillConfig = _skillCfg;
-	}
+		tagUseSkillAttack = vNetData;
+		battleField = _battleField;
+		packList = _packList;
+
+	}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
 
 	public virtual void Run()
+	{
+		if (startCounting)
+		{
+			curFrame++;
+		}
+	}
+
+	protected virtual void OnActiveSkillFrame()
+	{
+
+	}
+
+	protected virtual void OnStartSkillFrame()
+	{
+
+	}
+
+	protected virtual void OnEndSkillFrame()
 	{
 		
 	}
 
-	public virtual void Cast(BattleObject _caster, BattleField battleField, List<Dictionary<int, List<int>>> damageList)
+	public void Pause()
 	{
-		Debug.LogError("SkillBase Cast should be overridden by derived class");
+		pauseState = startCounting;
+		startCounting = false;
+	}
+
+	public void Resume()
+	{
+		startCounting = pauseState;
+	}
+
+	// 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
+	// 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
+	public virtual void Cast()
+	{
+		//	楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
+		HighLightAllTargets();
+
+		//	璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
+
+		switch (skillConfig.castMode)
+		{
+			case SkillCastMode.Self:
+				PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
+				break;
+			case SkillCastMode.Enemy:
+				MoveToTarget(caster.GetEnemyCamp(), skillConfig.CastIndexNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				break;
+			case SkillCastMode.Target:
+				// 鐩爣鏄晫鏂逛富鐩爣
+				BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
+				if (mainTarget == null)
+				{
+					Debug.LogError("鐩爣涓虹┖ mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
+					OnSkillFinished();
+					return;
+				}
+				MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				break;
+			case SkillCastMode.Allies:
+				MoveToTarget(caster.Camp, skillConfig.CastIndexNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+				break;
+			// case SkillCastMode.DashCast:
+			// 	DashToTarget(() => BackToOrigin(OnSkillFinished));
+			// 	break;
+			default:
+				Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝");
+				break;
+		}
+	}
+
+	//	鍐插埡鐨勬妧鑳� 鍔ㄤ綔 璺熺Щ鍔� 鏄悓鏃惰繘琛岀殑 绉诲姩鍒扮洰鏍囩殑涓�鐬棿灏辫杩涜鎶�鑳介�昏緫
+	// protected void DashToTarget(Action _onComplete)
+	// {
+	// 	TrackEntry entry = PlayCastAnimation();
+	// 	BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
+	// 	if (mainTarget == null)
+	// 	{
+	// 		Debug.LogError("鐩爣涓虹┖ mainTarget == null AttackID : " + tagUseSkillAttack.AttackID);
+	// 		_onComplete?.Invoke();
+	// 		return;
+	// 	}
+
+	// 	//	鍋氫竴涓井寰殑鎻愬墠
+	// 	MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, entry.AnimationEnd - 0.05f, () => DoSkillLogic(_onComplete));
+	// }
+
+	//	杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟
+	protected virtual void DoSkillLogic(Action _onComplete = null)
+	{
+		
+	}
+
+	protected TrackEntry PlayCastAnimation(Action onComplete = null)
+	{
+		// 鎾斁鏂芥硶鍔ㄤ綔
+		return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
+				OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
+				OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
+	}
+
+	public void MoveToTarget(BattleCamp camp, int index, float duration = 0.2f, Action _onComplete = null)
+	{
+		// GetTargetNode();
+		targetNode = battleField.GetTeamNode(camp, index);
+
+		Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
+		RectTransform selfRect = caster.heroGo.transform as RectTransform;
+		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.heroGo.transform as RectTransform;
+		Vector2 targetAnchoredPos = Vector2.zero;
+		var tween = selfRect.DOAnchorPos(targetAnchoredPos, 0.2f)
+			.SetEase(Ease.Linear)
+			.OnComplete(() =>
+			{
+				//	杞垚姝g‘鏂瑰悜
+				caster.heroGo.transform.localScale = Vector3.one;
+				_onComplete?.Invoke();
+			});
+
+		battleField.battleTweenMgr.OnPlayTween(tween);
+	}
+
+	protected void HighLightAllTargets()
+	{
+		// 楂樹寒鎵�鏈夌洰鏍�
+		HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
+		highlightList.Add(caster);
+
+		
+
+		//	鎶婅繖浜汢O鍏ㄩ珮浜� 鎴栬�呰鎶婇櫎浜嗚繖浜涚殑閮芥斁鍦ㄩ伄缃╁悗闈�
+		//	YYL TODO
+	}
+
+	//	鍛戒腑鐩爣鍚庣殑鍥炶皟 姝e父鏄互鍚勬妧鑳界殑鏂瑰紡鏉ュ鐞嗙殑
+	protected virtual void OnHitTargets(int _hitIndex, List<H0604_tagUseSkillAttack.tagSkillHurtObj> hitList)
+	{
+		for (int i = 0; i < hitList.Count; i++)
+		{
+			H0604_tagUseSkillAttack.tagSkillHurtObj hurt = hitList[i];
+
+			BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+			if (target == null)
+			{
+				Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+				continue;
+			}
+
+			// 浼ゅ缁撶畻
+			int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
+
+			List<long> damageList = new List<long>();
+
+			long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
+
+			for (int j = 0; j < damageDivide.Length; j++)
+			{
+				long damage = totalDamage * damageDivide[j] / 10000;
+				damageList.Add(damage);
+			}
+
+			OnHitEachTarget(target, damageList, ref hurt);
+		}
+	}
+
+	protected virtual void OnHitEachTarget(BattleObject target, List<long> damageList, ref H0604_tagUseSkillAttack.tagSkillHurtObj hurt)
+	{
+		target.Hurt(damageList, hurt.AttackType);
+
+				//	鍑讳腑鐩爣鐨勬椂鍊�,涓嶇杩戞垬杩滅▼ 閮界‘璁や竴涓嬫槸鍚︽湁鐖嗙偢鐗规晥 鐒跺悗鎾斁
+		if (skillConfig.ExplosionEffectId > 0)
+		{
+			// 鎾斁鐖嗙偢鐗规晥
+			target.battleField.battleEffectMgr.PlayEffect(
+				target.ObjID,
+				skillConfig.ExplosionEffectId,
+				target.heroGo.transform
+			);
+		}
 	}
 
 	public virtual bool IsFinished()
@@ -33,20 +251,8 @@
 		isFinished = true;
 	}
 
-#if UNITY_EDITOR
-	public virtual List<BattleObject> GetTargetList(BattleObject _caster, BattleField battleField)
+	public void OnSkillFinished()
 	{
-		SkillTargetType targetType = SkillTargetType.Enemy;
-		SkillTargetRangeType rangeType = SkillTargetRangeType.LowestHP;
-
-		List<BattleObject> affectList = battleField.battleObjMgr.GetTargetList(_caster, targetType, rangeType);
-		return affectList;
+		isFinished = true;
 	}
-	
-	public virtual List<Dictionary<int, List<int>>> GetDamageList(BattleObject _caster, BattleField battleField)
-	{
-		Debug.LogError("SkillBase GetDamageList should be overridden by derived class");
-		return null;
-	}
-#endif
 }
\ No newline at end of file

--
Gitblit v1.8.0