From 61b188e1d59af9a1e3b4f005bd4b9211b2db97d8 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 09 十月 2025 15:46:31 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/Battle/Skill/SkillBase.cs |  821 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 557 insertions(+), 264 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 4325c92..a10eec9 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,15 +1,20 @@
 using System.Collections.Generic;
 using UnityEngine;
-using System;
 using DG.Tweening;
 using Spine;
+using System.Linq;
+using System;
 
 
 public class SkillBase
 {
+	const float moveTime = 0.5f;
+
+	protected SkillEffect skillEffect;
+
 	protected HB427_tagSCUseSkill tagUseSkillAttack;
 
-	protected SkillConfig skillConfig;
+	public SkillConfig skillConfig;
 
 	protected bool isFinished = false;
 
@@ -19,12 +24,6 @@
 
 	protected BattleObject caster = null; // 鏂芥硶鑰�
 
-	protected bool startCounting = false;
-
-	protected bool pauseState = false;
-
-	protected int curFrame = 0;
-
 	protected List<GameNetPackBasic> packList;
 
 	protected SkillRecordAction otherSkillAction;
@@ -33,21 +32,42 @@
 
 	protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
 
-	public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
+	protected bool moveFinished = false;
+
+    public int fromSkillId;
+
+	public bool isPlay = false;
+
+    public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
 	{
 		caster = _caster;
+		if (null == caster)
+		{
+			throw new Exception("SkillBase caster is null ");
+		}
 		skillConfig = _skillCfg;
 		tagUseSkillAttack = vNetData;
 		battleField = _battleField;
 		packList = _packList;
 
+		// Debug.LogError("start a skill id " + skillConfig.SkillID + " caster " + caster.teamHero.heroId + " pos " + caster.teamHero.positionNum + " camp " + caster.Camp);
+
 	}
 
 	public virtual void Run()
 	{
-		if (startCounting)
+		if (null != skillEffect)
 		{
-			curFrame++;
+			if (skillEffect.IsFinished())
+			{
+				skillEffect = null;
+				OnSkillFinished();
+			}
+			else
+			{
+				skillEffect.Run();
+			}
+			return;
 		}
 
 		if (otherSkillAction != null)
@@ -59,175 +79,341 @@
 			}
 			else
 			{
-				otherSkillAction.Run();
+				if (moveFinished)
+				{
+					otherSkillAction.Run();
+				}
 			}
+			return;
 		}
-	}
-
-
-	protected virtual void OnActiveSkillFrame()
-	{
-
-	}
-
-	protected virtual void OnStartSkillFrame()
-	{
-
-	}
-
-	protected virtual void OnEndSkillFrame()
-	{
-		
-	}
-
-	public void Pause()
-	{
-		pauseState = startCounting;
-		startCounting = false;
-	}
-
-	public void Resume()
-	{
-		startCounting = pauseState;
 	}
 
 	// 0路绉诲姩鍒拌窛绂荤洰鏍噉鐮侊紝鐨勮窛绂婚噴鏀撅紙鍙厤缃紝9999鍗冲師鍦伴噴鏀撅紝璐熸暟鍒欐槸绉诲姩鍒颁汉鐗╄儗闈紝浜虹墿瑕佽浆韬級
 	// 1路绉诲姩鍒拌窛绂婚樀瀹逛綅缃畁鐮佺殑璺濈锛堝2鍙蜂綅锛�5鍙蜂綅锛夐噴鏀撅紙鍗虫垬鍦轰腑澶绫伙級
 	public virtual void Cast()
 	{
+		// Debug.LogError("Cast skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode); 
+		string guid = battleField.guid;
+		TeamHero teamHero = caster.teamHero;
+		EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
+
 		//	楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
 		HighLightAllTargets();
 
 		//	璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
-
 		switch (skillConfig.castMode)
 		{
 			case SkillCastMode.Self:
-				PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
+				CastImpl(OnAttackFinish);
 				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;
+			case SkillCastMode.DashCast:
+				DashCast(OnAttackFinish);
+				break;
 			default:
-				Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝" + skillConfig.SkillID);
-				OnSkillFinished();
+				Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+				ForceFinished();
 				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 void DashCast(Action _onComplete)
 	{
-		
+		Debug.LogError("DashCast 杩樻病瀹炵幇");
+		ForceFinished();
+		//	YYL TODO
+
+		// var entry = caster.motionBase.PlayAnimation(skillConfig.GetMotionName(), false);
+		// float animationTime = entry.AnimationTime;
+
+		// int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
+
+		// BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+		// RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+		// var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, targetTrans, new Vector2(skillConfig.CastDistance, 0), animationTime * 0.9f, () =>
+		// {
+		// 	caster.motionBase.PlayAnimation(MotionName.idle, true);
+		// 	_onComplete?.Invoke();
+		// });
+		// battleField.battleTweenMgr.OnPlayTween(tweener);
 	}
 
-	protected TrackEntry PlayCastAnimation(Action onComplete = null)
+	protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 500f)
 	{
-		// 鎾斁鏂芥硶鍔ㄤ綔
-		return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
-				OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
-				OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
-	}
+		//	鍘熷湴閲婃斁
+		if (skillConfig.CastDistance >= 9999)
+		{
+			_onComplete?.Invoke();
+			return;
+		}
 
-	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, () =>
+		{
+			caster.motionBase.PlayAnimation(MotionName.idle, true);
+			_onComplete?.Invoke();
+		}, speed);
 		battleField.battleTweenMgr.OnPlayTween(tweener);
+
+		// Debug.LogError("move to tarrget " + target.name + " offset " + offset + " speed " + speed + " time " + tweener.Duration());
 	}
 
-	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();
-			});
 
-		battleField.battleTweenMgr.OnPlayTween(tween);
+		RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
+
+		MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
+		{
+			//	鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+			TurnBack(() =>
+			{
+				//	鍒拌揪鐩爣浣嶇疆
+				CastImpl(() =>
+				{
+					TurnBack(
+						() =>
+						{
+							//	鍥炲埌鍘熸潵鐨勪綅缃�
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, 
+								OnAttackFinish, 750F);
+						}
+					, -1f);
+				});
+			}, -1f);
+		});
 	}
+
+
+
+	protected void CastToTarget()
+	{
+		// 鐩爣鏄晫鏂逛富鐩爣
+		if (tagUseSkillAttack.HurtCount <= 0)
+		{
+			Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
+			OnSkillFinished();
+			return;
+		}
+
+		int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
+
+		BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+		RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+		MoveToTarget(targetTrans, new Vector2(skillConfig.CastDistance, 0), () =>
+		{
+			//	鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+			TurnBack(() =>
+			{
+				//	鍒拌揪鐩爣浣嶇疆
+				CastImpl(() =>
+				{
+					TurnBack(
+						() =>
+						{
+							RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
+							//	鍥炲埌鍘熸潵鐨勪綅缃�
+							MoveToTarget(rectTransform, Vector2.zero, OnAttackFinish, 750F);
+						}
+					, -1f);
+				});
+			}, -1f);
+		});
+	}
+
+	protected virtual void OnAllAttackMoveFinished()
+	{
+		moveFinished = true;
+		List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
+		for (int i = 0; i < allList.Count; i++)
+		{
+			BattleObject bo = allList[i];
+			bo.layerMgr.SetFront();
+			// bo.heroRectTrans.SetParent(battleField.GetTeamNode(bo.Camp, bo.teamHero.positionNum), true);
+			bo.heroInfoBar.SetActive(true);
+		}
+		battleField.battleRootNode.skillMaskNode.SetActive(false);
+		// Debug.LogError("OnAllAttackMoveFinished skill " + skillConfig.SkillID + " cast position " + skillConfig.CastPosition + " cast mode " + skillConfig.castMode); 
+	}
+
+	protected void CastToAllies()
+	{
+		RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig);
+
+		MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
+		{
+			//	鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
+			TurnBack(() =>
+			{
+				//	鍒拌揪鐩爣浣嶇疆
+				CastImpl(() =>
+				{
+					TurnBack(
+						() =>
+						{
+							//	鍥炲埌鍘熸潵鐨勪綅缃�
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum),
+								Vector2.zero, OnAttackFinish, 750F);
+						}
+					, -1f);
+				});
+			}, -1f);
+		});
+	}
+
+	protected void OnAttackFinish()
+	{
+		TurnBack(null, 1f);
+		OnAllAttackMoveFinished();
+		caster.motionBase.PlayAnimation(MotionName.idle, true);
+	}
+
+
+	//	鎵胯浇鎶�鑳藉ぇ閮ㄥ垎鐨勯�昏緫
+	protected TrackEntry CastImpl(Action onComplete = null)
+	{
+		// 鎾斁鏂芥硶鍔ㄤ綔
+		//	onComplete鏄寚鏂芥硶鍔ㄤ綔鎾斁瀹岀殑鍥炶皟 涓嶄唬琛ㄦ槸鎶�鑳界粨鏉�
+		//	鍏蜂綋鎶�鑳界粨鏉熺殑鏃堕棿搴旇鐪嬫妧鑳藉搴旂殑閫昏緫
+		//	杩欓噷鍙彁渚�6涓姩浣滅浉鍏崇殑鍑芥暟
+		// OnSkillStart 鍔ㄤ綔绗竴甯�
+		// OnStartSkillFrameEnd 鍓嶆憞缁撴潫
+		// OnMiddleFrameStart 涓憞寮�濮�
+		// OnMiddleFrameEnd 涓憞缁撴潫
+		// OnFinalFrameStart 鍚庢憞寮�濮�
+		// OnFinalFrameEnd 鍚庢憞缁撴潫
+
+		return caster.motionBase.PlaySkillAnimation(skillConfig, this, onComplete);
+	}
+
+	//	鎶�鑳藉紑濮�
+	public void OnSkillStart()
+	{
+		skillEffect = SkillEffectFactory.CreateSkillEffect(
+				caster,
+				skillConfig,
+				tagUseSkillAttack
+			);
+
+		skillEffect.Play(OnHitTargets);
+		isPlay = true;
+
+	}
+
+	//	鎶�鑳藉墠鎽囧抚缁撴潫
+	public virtual void OnStartSkillFrameEnd()
+	{
+	
+	}
+
+	/// <summary>
+	/// 涓憞寮�濮� times=绗嚑娆″惊鐜� 浠�0寮�濮�
+	/// </summary>
+	/// <param name="times"></param>
+	public virtual void OnMiddleFrameStart(int times)
+	{
+		skillEffect.OnMiddleFrameStart(times);
+	}
+
+	public virtual void OnMiddleFrameEnd(int times, int hitIndex)
+	{
+		skillEffect.OnMiddleFrameEnd(times, hitIndex);
+	}
+
+	/// <summary>
+	/// 鍚庢憞寮�濮�
+	/// </summary>
+	public virtual void OnFinalFrameStart()
+	{
+		skillEffect.OnFinalFrameStart();
+	}
+
+	/// <summary>
+	/// 鍚庢憞缁撴潫
+	/// </summary>
+	public virtual void OnFinalFrameEnd()
+	{	
+		skillEffect.OnFinalFrameEnd();
+
+		HandleDead();
+	}
+
+
+
 
 	protected void HighLightAllTargets()
 	{
+		caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
+
+		if (skillConfig.FuncType != 2)
+			return;
+
 		// 楂樹寒鎵�鏈夌洰鏍�
-		HashSet<BattleObject> highlightList = new HashSet<BattleObject>(battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack));
+		List<BattleObject> targetList = battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
+		List<BattleObject> highlightList = new List<BattleObject>(targetList);
 		highlightList.Add(caster);
+
+		List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
+
+		caster.heroInfoBar.SetActive(false);
+
 		
 
+		for (int i = 0; i < allList.Count; i++)
+		{
+			BattleObject bo = allList[i];
+			if (highlightList.Contains(bo))
+			{
+				bo.layerMgr.SetFront();
+				bo.heroInfoBar.SetActive(true);
+				// bo.heroRectTrans.SetParent(battleField.battleRootNode.skillFrontNode, true);
+			}
+			else
+			{
+				bo.layerMgr.SetBack();
+				// bo.heroRectTrans.SetParent(battleField.battleRootNode.skillBackNode, true);
+			}
+
+			if (targetList.Contains(bo))
+			{
+				bo.heroInfoBar.SetActive(true);
+			}
+			else
+			{
+				bo.heroInfoBar.SetActive(false);
+			}
+		}
+
+
+		battleField.battleRootNode.skillMaskNode.SetActive(true);
+		battleField.battleRootNode.SetSortingOrder();
+		// caster.battleField.skillMask
 		//	鎶婅繖浜汢O鍏ㄩ珮浜� 鎴栬�呰鎶婇櫎浜嗚繖浜涚殑閮芥斁鍦ㄩ伄缃╁悗闈�
 		//	YYL TODO
 	}
@@ -246,163 +432,157 @@
 				continue;
 			}
 
-			// 浼ゅ鍒嗗竷 (涓囧垎姣�)
-			int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
-
-			long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
-
-			// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
-			List<long> damageList = DivideDamageToList(damageDivide, totalDamage);
-
-			OnHitEachTarget(target, totalDamage, damageList, ref hurt);
+			OnHitEachTarget(_hitIndex, target, hurt);
 		}
-	} 
-
-	/// <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)
+
+	protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
 	{
-		target.Hurt(damageList, totalDamage, hurt.AttackTypes);
+		// 浼ゅ鍒嗗竷 (涓囧垎姣�)
+		// Debug.LogError("skillConfig.DamageDivide.Count " + skillConfig.DamageDivide.Length + " _hitIndex " + _hitIndex);
+		bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
+		int[] damageDivide = skillConfig.DamageDivide[_hitIndex];
 
-		//	鍑讳腑鐩爣鐨勬椂鍊�,涓嶇杩戞垬杩滅▼ 閮界‘璁や竴涓嬫槸鍚︽湁鐖嗙偢鐗规晥 鐒跺悗鎾斁
-		if (skillConfig.ExplosionEffectId > 0)
-		{
-			// 鎾斁鐖嗙偢鐗规晥
-			target.battleField.battleEffectMgr.PlayEffect(
-				target.ObjID,
-				skillConfig.ExplosionEffectId,
-				target.heroGo.transform
-			);
-		}
+		long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
 
-		//	鍙椾激涔嬪悗杈ㄥ埆姝讳骸鐘舵�� 姝讳骸鍖呭叾瀹炲墠鍚庡抚浼氬娆¤Е鍙� 搴旇瑕佸嵆鏃秗emove鍏朵粬鐨勫寘鏉ヤ繚璇佷笉閲嶅
-		if (target.IsDead())
-		{
-			// SkillRecordAction閲岀殑drop浜嬩欢鍓嶇Щ鍒癲ead涔嬪悗
-			HB422_tagMCTurnFightObjDead deadPack = FindDeadPack(target);
-			CheckAfterDeadhPack(target, deadPack);
-			if (deadPack != null)
-			{
-				//	澶勭悊鎺夎惤鍖�
-				for (int i = 0; i < dropPackList.Count; i++)
-				{
-					PackageRegedit.Distribute(dropPackList[i]);
-				}
+		// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
+		List<long> damageList = BattleUtility.DivideDamageToList(damageDivide, totalDamage);
+		// public uint ObjID;
+		// public uint AttackTypes;        // 椋樿绫诲瀷姹囨�伙紝鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
+		// public uint HurtHP;        // 椋樿鍊硷紝姹備綑浜块儴鍒�
+		// public uint HurtHPEx;        // 椋樿鍊硷紝鏁撮櫎浜块儴鍒�
+		// public uint CurHP;        // 鏇存柊鍓╀綑琛�閲忥紝姹備綑浜块儴鍒�
+		// public uint CurHPEx;        // 鏇存柊鍓╀綑琛�閲忥紝鏁撮櫎浜块儴鍒�
+		// public uint SuckHP;        // 鏈浼ゅ杞寲鐨勫惛琛�閲�
+		// public uint BounceHP;        // 鏈浼ゅ鍙嶅脊鐨勪激瀹抽噺
 
-				dropPackList.Clear();
 
-				target.PushExpPackList(new List<HB405_tagMCAddExp>(expPackList));
+		//	TODO YYL AttackTypes  瑕佽〃鐜版垚浠�涔堟牱鍛紵 鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
 
-				expPackList.Clear();
+		List<HB422_tagMCTurnFightObjDead> deadPacks = BattleUtility.FindDeadPack(packList);
+		bool isTargetDead = deadPacks.Exists(p => p.ObjID == target.ObjID);
 
-				// 澶勭悊姝讳骸鍖�
-				PackageRegedit.Distribute(deadPack);
-				packList.Remove(deadPack);
-			}
-			
-			//	澶嶆椿鍖呮殏鏃朵笉绠� 鍙兘鏄妧鑳界殑鍖�
-			// HB423_tagMCTurnFightObjReborn rebornPack = FindRebornPack(target);
-			// if (rebornPack != null)
-			// {
-			// 	//	澶勭悊澶嶆椿鍖�
-			// 	PackageRegedit.Distribute(rebornPack);
-			// 	packList.Remove(rebornPack);
-			// }
-		}
+		bool playAnimation = !(isLastHit && isTargetDead);
+		target.Hurt(damageList, totalDamage, hurt, skillConfig, playAnimation);
+
+		//	TODO YYL 杩欓噷鏄鍋氱粺涓�璁$畻鍚庡啀hurt璺焥uckhp杩樻槸鎬庢牱
+		caster.SuckHp(hurt.SuckHP, skillConfig);//	鍚歌
+		caster.HurtByReflect(hurt.BounceHP, skillConfig);// 鍙嶅脊浼ゅ
 	}
 
-	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 HB422_tagMCTurnFightObjDead FindDeadPack(BattleObject target)
+	protected void HandleDead()
 	{
-		HB422_tagMCTurnFightObjDead deadPack = null;
-		for (int i = 0; i < packList.Count; i++)
-		{
-			var pack = packList[i];
-			//	瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
-			if (pack is HB422_tagMCTurnFightObjDead)
-			{
-				deadPack = pack as HB422_tagMCTurnFightObjDead;
-				if (deadPack.ObjID == target.ObjID)
-				{
-					return deadPack;
-				}
-			}
-			else if (pack is CustomHB426CombinePack)
-			{
-				//	鎵炬浜″寘涓嶈瓒婅繃鎶�鑳藉寘
-				var combinePack = pack as CustomHB426CombinePack;
-				if (combinePack.startTag.Tag.StartsWith("Skill_"))
-				{
-					break;
-				}
-			}
-		}
-		return null;
-	}
+		var deadPackList = BattleUtility.FindDeadPack(packList);
+		int deadCount = deadPackList.Count;
 
-	protected void CheckAfterDeadhPack(BattleObject target, HB422_tagMCTurnFightObjDead deadPack)
-	{
-		if (null == deadPack)
+		if (deadCount <= 0)
 		{
+			//	濡傛灉娌℃浜″氨涓嶇敤绠�
 			return;
 		}
-		var deadPackIndex = packList.IndexOf(deadPack);
-		if (deadPackIndex < 0)
+
+		CheckAfterDeadhPack();
+
+		// 澶勭悊鎺夎惤鍖� 鎻愬墠distribute涔嬪悗 PackManager鎵嶆湁鎺夎惤鐗� 鎵�浠ヤ笉璺焌ssignexp涓�鏍穌istribute
+		foreach (var _dropPack in dropPackList)
 		{
-			return;
+			PackageRegedit.Distribute(_dropPack);
+			packList.Remove(_dropPack);
 		}
+
+		// 鑾峰彇鎺夎惤鐗╁搧
+		var dropPack = PackManager.Instance.GetSinglePack(PackType.DropItem);
+		var itemDict = dropPack.GetAllItems();
+		List<ItemModel> itemList = new List<ItemModel>(
+			from item in itemDict.Values
+			where item != null && item.isAuction
+			select item);
+
+
+
+		// 鍒嗛厤鎺夎惤鍜岀粡楠�
+		var dropAssign = AssignDrops(itemList, deadCount);
+		var expAssign = AssignExp(expPackList, deadCount);
+
+		// 鏋勯�� BattleDrops 骞跺垎閰�
+		for (int i = 0; i < deadCount; i++)
+		{
+			BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject((int)deadPackList[i].ObjID);
+			List<ItemModel> itemModelDrops = dropAssign[i];
+			List<int> itemModelDropsIndexList = new List<int>(
+				from item in itemModelDrops select item.gridIndex);
+			BattleDrops battleDrops = new BattleDrops()
+			{
+				rectTransform = deadTarget.heroRectTrans,
+				dropItemPackIndex = itemModelDropsIndexList,
+				expDrops = expAssign[i]
+			};
+			deadTarget.PushDropItems(battleDrops);
+		}
+
+		// 鍒嗗彂姝讳骸鍖�
+
+		battleField.OnObjsDead(new List<HB422_tagMCTurnFightObjDead>(deadPackList));
+		foreach (var deadPack in deadPackList)
+		{
+			packList.Remove(deadPack);
+		}
+		deadPackList.Clear();
+	}
+
+
+
+	// 鍒嗛厤鎺夎惤
+	protected List<List<ItemModel>> AssignDrops(List<ItemModel> itemList, int deadCount)
+	{
+		var dropAssign = new List<List<ItemModel>>(deadCount);
+		for (int i = 0; i < deadCount; i++)
+			dropAssign.Add(new List<ItemModel>());
+		for (int i = 0; i < itemList.Count; i++)
+			dropAssign[i % deadCount].Add(itemList[i]);
+		return dropAssign;
+	}
+
+	// 鍒嗛厤缁忛獙锛氭瘡涓師濮嬪寘閮藉钩鍧囧垎閰嶅埌姣忎釜姝讳骸瀵硅薄
+	protected List<List<HB405_tagMCAddExp>> AssignExp(List<HB405_tagMCAddExp> expList, int deadCount)
+	{
+		var expAssign = new List<List<HB405_tagMCAddExp>>(deadCount);
+		for (int i = 0; i < deadCount; i++)
+			expAssign.Add(new List<HB405_tagMCAddExp>());
+
+		foreach (var expPack in expList)
+		{
+			long totalExp = GeneralDefine.GetFactValue(expPack.Exp, expPack.ExpPoint);
+			long avgExp = totalExp / deadCount;
+			long remain = totalExp % deadCount;
+
+			for (int i = 0; i < deadCount; i++)
+			{
+				long assignExp = avgExp + (i < remain ? 1 : 0);
+				long expPoint = assignExp / 100000000;
+				long exp = assignExp % 100000000;
+				var newPack = new HB405_tagMCAddExp
+				{
+					Exp = (uint)exp,
+					ExpPoint = (uint)expPoint,
+					Source = expPack.Source // 淇濇寔鍘熷寘鏉ユ簮
+				};
+				expAssign[i].Add(newPack);
+			}
+			packList.Remove(expPack);
+		}
+		return expAssign;
+	}
+
+
+
+	protected void CheckAfterDeadhPack()
+	{
 		List<int> removeIndexList = new List<int>();
-		for (int i = deadPackIndex + 1; i < packList.Count; i++)
+		for (int i = 0; i < packList.Count; i++)
 		{
 			var pack = packList[i];
 
@@ -455,16 +635,122 @@
 	}
 	public virtual bool IsFinished()
 	{
-		return isFinished;
+		if (!isPlay)
+		{
+			return false;
+		}
+
+		if (skillEffect != null)
+		{
+			if (!skillEffect.IsFinished())
+			{
+				return false;
+			}
+			else
+			{
+				skillEffect = null;
+				OnSkillFinished();	
+				return false;		
+			}
+		}
+
+		if (otherSkillAction != null)
+		{
+			if (!otherSkillAction.IsFinished())
+			{
+				return false;
+			}
+			else
+			{
+				otherSkillAction = null;
+				OnSkillFinished();
+				return false;
+			}
+		}
+
+
+		if (isFinished && moveFinished)
+		{
+			if (packList.Count > 0)
+			{
+				OnSkillFinished();
+				return false;
+			}
+
+			return true;
+		}
+		else
+		{
+			return false;
+		}
 	}
 
 	public virtual void ForceFinished()
 	{
+		skillEffect?.ForceFinished();
+		if (otherSkillAction != null)
+		{
+			otherSkillAction.ForceFinish();
+			otherSkillAction = null;
+		}
+		HandleDead();
 		isFinished = true;
+		moveFinished = true;
+		isPlay = true;
+
+		while (packList.Count > 0)
+		{
+			var pack = packList[0];
+			packList.RemoveAt(0);
+
+			if (pack is CustomHB426CombinePack combinePack)
+			{
+				if (combinePack.startTag.Tag.StartsWith("Skill_"))
+				{
+					otherSkillAction = combinePack.CreateSkillAction();
+					otherSkillAction.fromSkillId = skillConfig.SkillID;
+					//	寮哄埗缁撴潫鍏朵粬鎶�鑳�
+					otherSkillAction.ForceFinish();
+					continue;
+				}
+			}
+			else if (pack is CustomB421ActionPack actionPack)
+			{
+				actionPack.Distribute();
+			}
+			PackageRegedit.Distribute(pack);
+		}
 	}
 
 	public void OnSkillFinished()
 	{
+		if (skillEffect != null)
+		{
+			if (!skillEffect.IsFinished())
+			{
+				return;
+			}
+			else
+			{
+				skillEffect = null;
+				OnSkillFinished();
+			}
+			
+		}
+
+		if (otherSkillAction != null)
+		{
+			if (!otherSkillAction.IsFinished())
+			{
+				return;
+			}
+			else
+			{
+				otherSkillAction = null;
+				OnSkillFinished();
+			}
+		}
+
 		while (packList.Count > 0)
 		{
 			var pack = packList[0];
@@ -475,11 +761,18 @@
 				var combinePack = pack as CustomHB426CombinePack;
 				if (combinePack.startTag.Tag.StartsWith("Skill_"))
 				{
+					BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
 					otherSkillAction = combinePack.CreateSkillAction();
+					otherSkillAction.fromSkillId = skillConfig.SkillID;
 					return;
 				}
 			}
+			else if (pack is CustomB421ActionPack actionPack)
+			{
+				actionPack.Distribute();
+			}
 
+			// Debug.LogError("Distribute pack " + pack.GetType().ToString());
 			PackageRegedit.Distribute(pack);
 		}
 

--
Gitblit v1.8.0