From 21488796efae93ab7f074d7ad9bfc9d15d82a182 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 29 八月 2025 15:21:49 +0800
Subject: [PATCH] 125 【战斗】战斗系统

---
 Main/System/Battle/UIComp/BasicHeroInfoContainer.cs.meta                                |   11 
 Main/System/Battle/UIComp/BattleBuffLineCell.cs                                         |   25 +
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                     |   37 --
 Main/System/Battle/UIComp/DamageContent.cs                                              |    5 
 Main/System/Battle/UIComp/BattleBuffCell.cs                                             |   17 +
 Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs                       |    9 
 Main/System/Battle/UIComp/DamageLine.cs                                                 |    6 
 Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs.meta                    |   11 
 Main/System/Battle/Buff/BattleObjectBuffMgr.cs                                          |   84 +++++
 Main/Config/Configs/SkillConfig.cs                                                      |   65 ++--
 Main/System/Battle/Define/BattleDmgInfo.cs                                              |   21 +
 Main/System/Battle/BattleField/BattleField.cs                                           |   20 +
 Main/System/Battle/BattleTweenMgr.cs                                                    |   11 
 Main/System/Battle/BattleObject/BattleObject.cs                                         |   16 
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs                                          |  147 ++++++++++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs |    9 
 Main/System/Battle/UIComp/BattleTips.cs                                                 |   47 +++
 Main/System/Battle/BattleEffectMgr.cs                                                   |   18 
 Main/Component/UI/Effect/BattleEffectPlayer.cs                                          |    9 
 Main/System/Battle/UIComp/BattleBuffCell.cs.meta                                        |   11 
 Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB428_tagSCBuffRefresh.cs           |    6 
 Main/Config/Configs/EffectConfig.cs                                                     |   17 +
 Main/System/Battle/UIComp/BattleTips.cs.meta                                            |   11 
 Main/System/Battle/BattleManager.cs                                                     |    6 
 Main/System/Battle/BattleHUDWin.cs                                                      |   10 
 Main/System/Battle/Define/BattleDmgInfo.cs.meta                                         |   11 
 Main/System/Battle/Skill/DirectlyDamageSkill.cs                                         |    1 
 Main/System/Battle/RecordPlayer/RecordActionType.cs                                     |    1 
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs.meta                                     |   11 
 Main/System/Battle/SkillEffect/SkillEffect.cs                                           |   13 
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                     |   29 +
 Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs                         |   48 +++
 Main/System/Battle/UIComp/BasicHeroInfoContainer.cs                                     |    9 
 Main/System/Battle/BattleObject/BattleObjMgr.cs                                         |    9 
 Main/System/Team/TeamHero.cs                                                            |   37 ++
 Main/System/Battle/UIComp/BattleBuffLineCell.cs.meta                                    |   11 
 36 files changed, 678 insertions(+), 131 deletions(-)

diff --git a/Main/Component/UI/Effect/BattleEffectPlayer.cs b/Main/Component/UI/Effect/BattleEffectPlayer.cs
index 2896e8e..177e1fb 100644
--- a/Main/Component/UI/Effect/BattleEffectPlayer.cs
+++ b/Main/Component/UI/Effect/BattleEffectPlayer.cs
@@ -115,6 +115,12 @@
         }
         //  鏈夌壒鏁堝彲鑳藉甫spine鍙堝甫unity鐗规晥鐨勬儏鍐�
         spineComp = gameObject.GetComponentInChildren<SkeletonAnimation>(true);
+
+        if (effectConfig.effectPos != null && effectConfig.effectPos.Length >= 2)
+        {
+            rectTrans.anchoredPosition += new Vector2(effectConfig.effectPos[0], effectConfig.effectPos[1]);
+        }
+
     }
 
     protected virtual void Clear()
@@ -341,6 +347,7 @@
 
     public string sortingLayer;
     public int sortingOrder;
+    private RectTransform rectTrans;
 
     protected void OnSortingChanged(string _sortingLayer, int _sortingOrder)
     {
@@ -409,8 +416,8 @@
 
         GameObject newGo = new GameObject("BattleEffectPlayer_" + effectId);
         newGo.transform.SetParent(parent, false);
-        newGo.AddMissingComponent<RectTransform>();
         battleEffectPlayer = newGo.AddComponent<BattleEffectPlayer>();
+        battleEffectPlayer.rectTrans = newGo.AddMissingComponent<RectTransform>();
         
         battleEffectPlayer.effectId = effectId;
         battleEffectPlayer.SetActive(true);
diff --git a/Main/Config/Configs/EffectConfig.cs b/Main/Config/Configs/EffectConfig.cs
index 2cedfea..e1dd81d 100644
--- a/Main/Config/Configs/EffectConfig.cs
+++ b/Main/Config/Configs/EffectConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Thursday, August 21, 2025
+//    [  Date ]:           2025骞�8鏈�26鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -29,6 +29,7 @@
 	public int isLoop;
 	public int frontBack;
 	public float delayPlay;
+	public int[] effectPos;
 
     public override int LoadKey(string _key)
     {
@@ -77,6 +78,20 @@
 			int.TryParse(tables[11],out frontBack); 
 
 			float.TryParse(tables[12],out delayPlay); 
+
+			if (tables[13].Contains("["))
+			{
+				effectPos = JsonMapper.ToObject<int[]>(tables[13]);
+			}
+			else
+			{
+				string[] effectPosStringArray = tables[13].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				effectPos = new int[effectPosStringArray.Length];
+				for (int i=0;i<effectPosStringArray.Length;i++)
+				{
+					 int.TryParse(effectPosStringArray[i],out effectPos[i]);
+				}
+			}
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/SkillConfig.cs b/Main/Config/Configs/SkillConfig.cs
index 8c60c4e..80a58b0 100644
--- a/Main/Config/Configs/SkillConfig.cs
+++ b/Main/Config/Configs/SkillConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Monday, August 25, 2025
+//    [  Date ]:           2025骞�8鏈�26鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -40,6 +40,9 @@
 	public int CoolDownTime;
 	public int[] EnhanceSkillList;
 	public int FightPower;
+	public string SkillMotionName;
+	public string IconName;
+	public int EffectType;
 	public int StartupFrames;
 	public int[] ActiveFrames;
 	public int RecoveryFrames;
@@ -49,17 +52,13 @@
 	public float CastDistance;
 	public int[][] DamageDivide;
 	public int BulletEffectId;
-	public int BulletPos;
 	public int BulletPath;
 	public float BulletFlyTime;
 	public int ExplosionEffectId;
-	public int ExplosionPos;
-	public string SkillMotionName;
-	public int EffectId;
-	public int EffectPos;
-	public int EffectType;
-	public string IconName;
 	public int ExplosionEffect2;
+	public int EffectId;
+	public int EffectId2;
+	public int MStartEffectId;
 
     public override int LoadKey(string _key)
     {
@@ -167,15 +166,21 @@
 
 			int.TryParse(tables[23],out FightPower); 
 
-			int.TryParse(tables[24],out StartupFrames); 
+			SkillMotionName = tables[24];
 
-			if (tables[25].Contains("["))
+			IconName = tables[25];
+
+			int.TryParse(tables[26],out EffectType); 
+
+			int.TryParse(tables[27],out StartupFrames); 
+
+			if (tables[28].Contains("["))
 			{
-				ActiveFrames = JsonMapper.ToObject<int[]>(tables[25]);
+				ActiveFrames = JsonMapper.ToObject<int[]>(tables[28]);
 			}
 			else
 			{
-				string[] ActiveFramesStringArray = tables[25].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] ActiveFramesStringArray = tables[28].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				ActiveFrames = new int[ActiveFramesStringArray.Length];
 				for (int i=0;i<ActiveFramesStringArray.Length;i++)
 				{
@@ -183,41 +188,33 @@
 				}
 			}
 
-			int.TryParse(tables[26],out RecoveryFrames); 
+			int.TryParse(tables[29],out RecoveryFrames); 
 
-			int.TryParse(tables[27],out LoopCount); 
+			int.TryParse(tables[30],out LoopCount); 
 
-			int.TryParse(tables[28],out CastPosition); 
+			int.TryParse(tables[31],out CastPosition); 
 
-			int.TryParse(tables[29],out CastIndexNum); 
+			int.TryParse(tables[32],out CastIndexNum); 
 
-			float.TryParse(tables[30],out CastDistance); 
+			float.TryParse(tables[33],out CastDistance); 
 
-			DamageDivide = JsonMapper.ToObject<int[][]>(tables[31].Replace("(", "[").Replace(")", "]")); 
+			DamageDivide = JsonMapper.ToObject<int[][]>(tables[34].Replace("(", "[").Replace(")", "]")); 
 
-			int.TryParse(tables[32],out BulletEffectId); 
+			int.TryParse(tables[35],out BulletEffectId); 
 
-			int.TryParse(tables[33],out BulletPos); 
+			int.TryParse(tables[36],out BulletPath); 
 
-			int.TryParse(tables[34],out BulletPath); 
+			float.TryParse(tables[37],out BulletFlyTime); 
 
-			float.TryParse(tables[35],out BulletFlyTime); 
+			int.TryParse(tables[38],out ExplosionEffectId); 
 
-			int.TryParse(tables[36],out ExplosionEffectId); 
+			int.TryParse(tables[39],out ExplosionEffect2); 
 
-			int.TryParse(tables[37],out ExplosionPos); 
+			int.TryParse(tables[40],out EffectId); 
 
-			SkillMotionName = tables[38];
+			int.TryParse(tables[41],out EffectId2); 
 
-			int.TryParse(tables[39],out EffectId); 
-
-			int.TryParse(tables[40],out EffectPos); 
-
-			int.TryParse(tables[41],out EffectType); 
-
-			IconName = tables[42];
-
-			int.TryParse(tables[43],out ExplosionEffect2); 
+			int.TryParse(tables[42],out MStartEffectId); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs
index fb6ab65..e213b0a 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs
@@ -4,8 +4,15 @@
 // B4 28 Buff鍒锋柊 #tagSCBuffRefresh
 
 public class DTCB428_tagSCBuffRefresh : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack) {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
         base.Done(vNetPack);
         HB428_tagSCBuffRefresh vNetData = vNetPack as HB428_tagSCBuffRefresh;
+        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
+
+        if (null != battleField)
+        {
+            battleField.OnRefreshBuff(vNetData);
+        }
     }
 }
diff --git a/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB428_tagSCBuffRefresh.cs b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB428_tagSCBuffRefresh.cs
index 17c98dd..411508b 100644
--- a/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB428_tagSCBuffRefresh.cs
+++ b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB428_tagSCBuffRefresh.cs
@@ -11,6 +11,9 @@
     public uint LastTime;    // 鍓╀綑鏃堕暱姣/鍥炲悎鏁�
     public ushort Layer;    // 灞傛暟锛屼笉闇�瑕侀粯璁�0
     public uint OwnerID;    // buff鏉ユ簮鑰咃紝鍗虫柦娉曟柟
+    public uint Value1;
+    public uint Value2;
+    public uint Value3;
 
     public HB428_tagSCBuffRefresh () {
         _cmd = (ushort)0xB428;
@@ -24,6 +27,9 @@
         TransBytes (out LastTime, vBytes, NetDataType.DWORD);
         TransBytes (out Layer, vBytes, NetDataType.WORD);
         TransBytes (out OwnerID, vBytes, NetDataType.DWORD);
+        TransBytes (out Value1, vBytes, NetDataType.DWORD);
+        TransBytes (out Value2, vBytes, NetDataType.DWORD);
+        TransBytes (out Value3, vBytes, NetDataType.DWORD);
     }
 
 }
diff --git a/Main/System/Battle/BattleEffectMgr.cs b/Main/System/Battle/BattleEffectMgr.cs
index 755757d..f46b090 100644
--- a/Main/System/Battle/BattleEffectMgr.cs
+++ b/Main/System/Battle/BattleEffectMgr.cs
@@ -42,18 +42,18 @@
         }
     }
 
-    public BattleEffectPlayer PlayEffect(int ObjID, int effectId, Transform parent)
+    public BattleEffectPlayer PlayEffect(int ObjID, int effectId, Transform parent, BattleCamp camp)
     {
         if (effectId <= 0)
         {
-            BattleDebug.LogError("effect id <= 0");
+            Debug.LogError("effect id <= 0");
             return null;
         }
 
         var effectCfg = EffectConfig.Get(effectId);
         if (null == effectCfg)
         {
-            BattleDebug.LogError("effect config is null, effectId : " + effectId);
+            Debug.LogError("effect config is null, effectId : " + effectId);
             return null;
         }
 
@@ -62,16 +62,24 @@
             effectDict[effectId] = new List<BattleEffectPlayer>();
         }
 
+        BattleDebug.LogError("鎾斁鐗规晥 " + effectId);
+
         BattleEffectPlayer effectPlayer = BattleEffectPlayer.Create(effectId, battleField.battleRootNode.transform);
+        // 璁剧疆鐗规晥缂╂斁鍜屾柟鍚�
+
         effectPlayer.transform.position = parent.position;
-        float effectScale = parent.transform.localScale.x;
-        effectPlayer.transform.localScale *= effectScale;
+        
         effectPlayer.onDestroy += OnEffectDestroy;
         if (effectPlayer != null)
         {
             effectDict[effectId].Add(effectPlayer);
         }
         effectPlayer.Play(true);
+        
+        var effectScale = effectPlayer.transform.localScale;
+        effectScale.x *= camp == BattleCamp.Red ? 1 : -1;
+        effectPlayer.transform.localScale = effectScale;
+
         return effectPlayer;
     }
 
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 1de9db3..59c2595 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -366,12 +366,13 @@
 
     public void StartBattle(Action onMoveComplete)
     {
-        List<BattleObject> redTeam = battleObjMgr.GetBattleObjList(BattleCamp.Red);
+        List<BattleObject> blueTeam = battleObjMgr.GetBattleObjList(BattleCamp.Blue);
 
         Tween tween = null;
 
-        foreach (var obj in redTeam)
+        foreach (var obj in blueTeam)
         {
+            obj.heroGo.SetActive(true);
             obj.motionBase.PlayAnimation(MotionName.run, true);
             RectTransform trans = obj.heroRectTrans;
             trans.anchoredPosition = new Vector2(-800, 0);
@@ -381,7 +382,7 @@
 
         tween.onComplete = () =>
         {
-            foreach (var obj in redTeam)
+            foreach (var obj in blueTeam)
             {
                 obj.motionBase.PlayAnimation(MotionName.idle, true);
             }
@@ -517,4 +518,17 @@
     {
 
     }
+
+    public void OnRefreshBuff(HB428_tagSCBuffRefresh vNetData)
+    {
+        BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID);
+        if (null != battleObj)
+        {
+            battleObj.buffMgr.RefreshBuff(vNetData);
+        }
+        else
+        {
+            Debug.LogError($"BattleObject with ID {vNetData.ObjID} not found for buff refresh.");
+        }
+    }
 }
diff --git a/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
new file mode 100644
index 0000000..388779d
--- /dev/null
+++ b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
@@ -0,0 +1,48 @@
+using UnityEngine;
+using System.Collections.Generic;
+using System;
+
+public class BuffMountAction : RecordAction
+{
+    protected HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh;
+
+    protected Action onComplete;
+
+    public BuffMountAction(BattleField _battleField, BattleObject _battleObj, HB428_tagSCBuffRefresh vNetData, Action _onComplete)
+        : base(RecordActionType.BuffMount, _battleField, _battleObj)
+    {
+        isFinish = false;
+        hB428_TagSCBuffRefresh = vNetData;
+        onComplete = _onComplete;
+    }
+
+	public override bool IsFinished()
+	{
+		return isFinish;
+	}
+
+
+    public override void Run()
+    {
+        base.Run();
+
+        if (!isRunOnce)
+        {
+            SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID);
+            if (null != skillConfig)
+            {
+                //  椋樺瓧
+                battleObject.heroInfoBar.ShowTips(skillConfig.SkillName);
+            }
+
+
+            //  鍔燽uff(onComplete鍐欎簡)
+            onComplete?.Invoke();
+
+
+            isFinish = true;
+            return;
+        }
+        
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs.meta b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs.meta
new file mode 100644
index 0000000..8c60db5
--- /dev/null
+++ b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 03f12da82f639b04790f1cff4480e17a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index c528332..7377bc6 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -40,7 +40,7 @@
     protected override void OnPreOpen()
     {
         base.OnPreOpen();
-        EventBroadcast.Instance.AddListener<string, BattleObject, List<long>>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
         EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_MOUNTED, OnBuffMounted);
         EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_DISAPEAR, OnBuffDisapear);
         damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("DamageContent"));
@@ -51,7 +51,7 @@
     protected override void OnPreClose()
     {
         base.OnPreClose();
-        EventBroadcast.Instance.RemoveListener<string, BattleObject, List<long>>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
         EventBroadcast.Instance.RemoveListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_MOUNTED, OnBuffMounted);
         EventBroadcast.Instance.RemoveListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_DISAPEAR, OnBuffDisapear);
     }
@@ -84,18 +84,18 @@
         damagePrefabPool.Release(content.gameObject);
     }
 
-    private void OnDamageTaken(string guid, BattleObject bo, List<long> damageList)
+    private void OnDamageTaken(BattleDmgInfo damageInfo)
     {
         GameObject damageContent = damagePrefabPool.Request();
         DamageContent content = damageContent.GetComponent<DamageContent>();
         damageContent.transform.SetParent(damageNode, false);
         damageContent.transform.localPosition = new Vector3(damageContent.transform.localPosition.x, damageContent.transform.localPosition.y, 0);
-        content.SetDamage(damageList, () => RemoveDamageContent(content));
+        content.SetDamage(damageInfo, () => RemoveDamageContent(content));
         damageContentList.Add(content);
 
         // heroGo 鐨� parent 浣滀负鍙傝�冭妭鐐�
 
-        var heroRect = bo.heroRectTrans;
+        var heroRect = damageInfo.hurtObj.heroRectTrans;
         if (heroRect == null)
             return;
 
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index f466f64..45f1010 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -10,7 +10,6 @@
     //  鍚屾椂鍙兘鏈変竴鍦烘垬鏂楀湪杩涜 guid, battlefield
     protected Dictionary<string, BattleField> battleFields = new Dictionary<string, BattleField>();
 
-    protected LogicUpdate logicUpdate = new LogicUpdate();
 
     public Action<string, BattleField> onBattleFieldCreate;
 
@@ -19,14 +18,15 @@
     public override void Init()
     {
         base.Init();
-        logicUpdate.Start(Run);
+
+        LogicEngine.Instance.OnUpdate += Run;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
     }
 
     public override void Release()
     {
         base.Release();
-        logicUpdate.Destroy();
+        LogicEngine.Instance.OnUpdate -= Run;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
     }
 
diff --git a/Main/System/Battle/BattleObject/BattleObjMgr.cs b/Main/System/Battle/BattleObject/BattleObjMgr.cs
index 2ae7298..d539ef7 100644
--- a/Main/System/Battle/BattleObject/BattleObjMgr.cs
+++ b/Main/System/Battle/BattleObject/BattleObjMgr.cs
@@ -20,17 +20,17 @@
     {
         battleField = _battleField;
         ReloadTeam(_redTeam, BattleCamp.Red);
-        ReloadTeam(_blueTeam, BattleCamp.Blue);
+        ReloadTeam(_blueTeam, BattleCamp.Blue, false);
     }
 
-    public void ReloadTeam(TeamBase teamBase, BattleCamp _camp)
+    public void ReloadTeam(TeamBase teamBase, BattleCamp _camp, bool active = true)
     {
         var posNodeList = _camp == BattleCamp.Red ? battleField.battleRootNode.redTeamNodeList : battleField.battleRootNode.blueTeamNodeList;
         var campDict = _camp == BattleCamp.Red ? redCampDict : blueCampDict;
-        CreateTeam(posNodeList, campDict, teamBase, _camp);
+        CreateTeam(posNodeList, campDict, teamBase, _camp, active);
     }
 
-    protected void CreateTeam(List<GameObject> posNodeList, Dictionary<int, BattleObject> campDict, TeamBase teamBase, BattleCamp _Camp)
+    protected void CreateTeam(List<GameObject> posNodeList, Dictionary<int, BattleObject> campDict, TeamBase teamBase, BattleCamp _Camp, bool active)
     {
         DestroyTeam(campDict);
         if (teamBase == null)
@@ -45,6 +45,7 @@
             if (teamHero != null)
             {
                 BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp);
+                battleObj.heroGo.SetActive(active);
                 allBattleObjDict.Add(battleObj.ObjID, battleObj);
                 campDict.Add(teamHero.positionNum, battleObj);
             }
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index e094fb1..f55ee15 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -52,6 +52,8 @@
 
     private RectTransform m_heroRectTrans;
 
+    private BattleHeroInfoBar battleHeroInfoBar;
+
     public RectTransform heroRectTrans
     {
         get
@@ -68,9 +70,8 @@
 
     protected Renderer[] renderers;
 
-    public Transform effectNode;
-
     private List<HB405_tagMCAddExp> hB405_tagMCAddExps = new List<HB405_tagMCAddExp>();
+    public BattleHeroInfoBar heroInfoBar;
 
     public BattleObject(BattleField _battleField)
     {
@@ -89,13 +90,16 @@
         buffMgr.Init(this);
 
         renderers = heroGo.GetComponentsInChildren<Renderer>(true);
-    }
 
+        heroInfoBar = heroGo.GetComponentInChildren<BattleHeroInfoBar>(true);
+        heroInfoBar.SetBattleObject(this);
+    }
 
 
     public virtual void Run()
     {
         motionBase.Run();
+        battleHeroInfoBar.Run();
     }
 
     public virtual void Pause()
@@ -129,6 +133,8 @@
         switch ((PlayerDataType)_refreshInfo.RefreshType)
         {
             case PlayerDataType.HP:
+                long toHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
+                battleHeroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp);
                 teamHero.curHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                 break;
             case PlayerDataType.MaxHP:
@@ -302,8 +308,10 @@
             Debug.Log($"Damage: {damage}");
         }
 
+        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, (int)attackType);
+
         // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
-        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleField.guid, this, damageValues);
+        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
     }
 
     public RectTransform GetAliasTeamNode()
diff --git a/Main/System/Battle/BattleTweenMgr.cs b/Main/System/Battle/BattleTweenMgr.cs
index 182e80e..00cf12f 100644
--- a/Main/System/Battle/BattleTweenMgr.cs
+++ b/Main/System/Battle/BattleTweenMgr.cs
@@ -49,7 +49,16 @@
             tweenList.Remove(tween);
         };
 
-        // tween.Play();
+        tween.Play();
+    }
+
+    public void OnKillTween(Tween tween)
+    {
+        tween.Kill();
+        if (tween != null && tweenList.Contains(tween))
+        {
+            tweenList.Remove(tween);
+        }
     }
 
     public void HaveRest()
diff --git a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
index 9ebda71..8355597 100644
--- a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
+++ b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -1,10 +1,17 @@
+using System;
 using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 
 
 public class BattleObjectBuffMgr
 {
-    // private Dictionary<BuffBase, EffectPlayer> buffDict = new Dictionary<BuffBase, EffectPlayer>();
+    // buffId, effectId, EffectPlayer
+    private Dictionary<uint, Dictionary<int, BattleEffectPlayer>> buffEffectDict = new Dictionary<uint, Dictionary<int, BattleEffectPlayer>>();
+
+
+    //  buffId, buffdata
+    private Dictionary<uint, HB428_tagSCBuffRefresh> buffDataDict = new Dictionary<uint, HB428_tagSCBuffRefresh>();
 
     private BattleObject battleObject;
 
@@ -34,7 +41,80 @@
     //  鍒犻櫎buff
     public void RemoveBuff(HB429_tagSCBuffDel vNetData)
     {
+        HB428_tagSCBuffRefresh buffData = null;
 
-        // buffBase.OnRemove();
+        if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData))
+        {
+            buffDataDict.Remove(vNetData.BuffID);
+        }
+
+        if (buffData != null)
+        {
+            Dictionary<int, BattleEffectPlayer> effectDict = null;
+
+            if (buffEffectDict.TryGetValue(vNetData.BuffID, out effectDict))
+            {
+                SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
+                if (null != skillConfig)
+                {
+                    BattleEffectPlayer effectPlayer = null;
+                    if (effectDict.TryGetValue(skillConfig.EffectId, out effectPlayer))
+                    {
+                        battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.EffectId, effectPlayer);
+                    }
+                }
+            }
+        }
+
+        //  涓嶅仛琛ㄧ幇
+        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
+    }
+
+    public void RefreshBuff(HB428_tagSCBuffRefresh vNetData)
+    {
+        bool isNew = false;
+        if (buffDataDict.ContainsKey(vNetData.BuffID))
+        {
+            buffDataDict[vNetData.BuffID] = vNetData;
+        }
+        else
+        {
+            isNew = true;
+            buffDataDict.Add(vNetData.BuffID, vNetData);
+        }
+
+        if (isNew)
+        {
+            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, battleObject, vNetData, () =>
+            { 
+                SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID);
+                if (null != skillConfig && skillConfig.EffectId > 0)
+                {
+                    // Dictionary<uint, Dictionary<int, BattleEffectPlayer>> buffEffectDict
+                    Dictionary<int, BattleEffectPlayer> effectDict = null;
+                    if (buffEffectDict.TryGetValue(vNetData.BuffID, out effectDict))
+                    {
+                        //  瀛樺湪杩欎釜buffid鐨勭壒鏁堝瓧鍏�
+                        if (effectDict.ContainsKey(skillConfig.EffectId))
+                        {
+                            Debug.LogError("宸插瓨鍦ㄥ悓鏍风殑buff鐗规晥 " + skillConfig.EffectId);
+                        }
+                        else
+                        {
+                            BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject.ObjID, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
+                            effectDict.Add(skillConfig.EffectId, effect);
+                        }
+                    }
+                    else
+                    {
+                        effectDict = new Dictionary<int, BattleEffectPlayer>();
+                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject.ObjID, skillConfig.EffectId, battleObject.heroRectTrans, battleObject.Camp);
+                        effectDict.Add(skillConfig.EffectId, effect);
+                        buffEffectDict.Add(vNetData.BuffID, effectDict);
+                    }
+                }
+            });
+            battleObject.battleField.recordPlayer.PlayRecord(buffMountAction);
+        }
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
new file mode 100644
index 0000000..b9f6a5a
--- /dev/null
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -0,0 +1,21 @@
+
+
+using System.Collections.Generic;
+
+public class BattleDmgInfo
+{
+    public string battleFieldGuid { get; private set; }
+    public List<long> damageList { get; private set; }
+    public int attackType { get; private set; }
+    public BattleObject hurtObj { get; private set; }
+
+    public BattleDmgInfo(string battleFieldGuid, List<long> damageList, BattleObject hurtObj, int attackType)
+    {
+        this.battleFieldGuid = battleFieldGuid;
+        this.damageList = damageList;
+        this.hurtObj = hurtObj;
+        this.attackType = attackType;
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs.meta b/Main/System/Battle/Define/BattleDmgInfo.cs.meta
new file mode 100644
index 0000000..523ddd8
--- /dev/null
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 36e9ba972525e3a469d210dd67ac05b3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/RecordPlayer/RecordActionType.cs b/Main/System/Battle/RecordPlayer/RecordActionType.cs
index 4b0cbda..3cb84d7 100644
--- a/Main/System/Battle/RecordPlayer/RecordActionType.cs
+++ b/Main/System/Battle/RecordPlayer/RecordActionType.cs
@@ -5,6 +5,7 @@
     Guard,//鏍兼尅
     Skill,//鎶�鑳�
     Death,//姝讳骸
+    BuffMount,//鎸傝浇澧炵泭
 
     BattleStart,//鎴樻枟寮�濮�
 }
diff --git a/Main/System/Battle/Skill/DirectlyDamageSkill.cs b/Main/System/Battle/Skill/DirectlyDamageSkill.cs
index ef12c38..5227c71 100644
--- a/Main/System/Battle/Skill/DirectlyDamageSkill.cs
+++ b/Main/System/Battle/Skill/DirectlyDamageSkill.cs
@@ -29,5 +29,4 @@
 
 		OnSkillFinished();
 	}
-
 }
\ No newline at end of file
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
index f67e214..be9d051 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
@@ -33,14 +33,17 @@
         }
 
         elapsed += Time.deltaTime;
-        float t = Mathf.Clamp01(elapsed / 0.3f);
+        float t = Mathf.Clamp01(elapsed / duration);
         Vector2 pos = Vector2.Lerp(start, end, t);
         bulletTrans.anchoredPosition = pos;
 
         Vector2 dir = end - start;
         float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
-        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle);
-
+        bulletTrans.localRotation = Quaternion.Euler(0, bulletTrans.transform.localScale.x < 0f ? 180 : 0, angle);
+        // if (bulletTrans.transform.localScale.x < 0f)
+        // {
+        //     bulletTrans.transform.localRotation *= Quaternion.Euler(0, 180, 0);
+        // }
         if (t >= 1f)
         {
             finished = true;
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index 588a317..0918bfe 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -19,8 +19,10 @@
 
     }
 
+
     public override void OnMiddleFrameStart(int times)
     {
+        base.OnMiddleFrameStart(times);
         //  寮瑰皠 鍙﹀鐨勫仛娉曚簡
         if (skillConfig.effectType == SkillEffectType.Bullet && skillConfig.BulletPath == 4)
         {
@@ -75,16 +77,9 @@
         }
     }
 
-
-    public override void Play(Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
-    {
-        base.Play(_onHit);
-
-    }
-
     protected void ShotToFormation(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
     {
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.effectNode);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
 
         RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
@@ -106,8 +101,8 @@
                     continue;
                 }
 
-                var effect1 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform);
-                var effect2 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform);
+                var effect1 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
+                var effect2 = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
                 if (effect1 != null)
                 {
                     effect1.transform.localRotation = effectTrans.localRotation;
@@ -127,7 +122,7 @@
     protected void ShotToTarget(BattleObject target)
     {
         BattleDebug.LogError("鍙戝皠瀛愬脊 " + skillConfig.BulletEffectId);
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
 
 
         var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, (index, hitList) =>
@@ -151,14 +146,22 @@
 
                 if (skillConfig.ExplosionEffectId > 0)
                 {
-                    var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform);
+                    var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
                     eft.transform.localRotation = effectPlayer.transform.localRotation;
+                    if (eft.transform.localScale.x < 0f)
+                    {
+                        eft.transform.localRotation *= Quaternion.Euler(0, 180, 0);
+                    }
                 }
 
                 if (skillConfig.ExplosionEffect2 > 0)
                 {
-                    var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform);
+                    var eft = caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
                     eft.transform.localRotation = effectPlayer.transform.localRotation;
+                    if (eft.transform.localScale.x < 0f)
+                    {
+                        eft.transform.localRotation *= Quaternion.Euler(0, 180, 0);
+                    }
                 }
             }
 
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index 262720e..3949b1c 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -17,23 +17,6 @@
 
     }
 
-    //  鎶�鑳藉姩浣滅涓�甯�
-    //  涓嶇敤鐞嗕細鍥炶皟
-    public override void Play(Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
-    {
-        // 鎾斁鎶�鑳界壒鏁�
-        BattleEffectPlayer battleEffectPlayer = caster.battleField.battleEffectMgr.PlayEffect(
-            caster.ObjID,
-            skillConfig.EffectId,
-            caster.heroGo.transform
-        );
-    }
-
-
-    public override void Run()
-    {
-        base.Run();
-    }
 
     public override void OnMiddleFrameEnd(int times, int hitIndex)
     {
@@ -48,27 +31,11 @@
                 continue;
             }
 
-            /*var effect1 = */
-            caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffectId, target.heroGo.transform);
-            /*var effect2 = */
-            caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffect2, target.heroGo.transform);
-            // if (effect1 != null)
-            // {
-            //     effect1.transform.localRotation = effectTrans.localRotation;
-            // }
-            // if (effect2 != null)
-            // {
-            //     effect2.transform.localRotation = effectTrans.localRotation;
-            // }
+            caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffectId, target.heroGo.transform, target.Camp);
+            caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffect2, target.heroGo.transform, target.Camp);
         }
 
-        //  涓轰粈涔堟病瑙﹀彂
         onHit?.Invoke(hitIndex, tagUseSkillAttack.HurtList.ToList());
         isFinish = true;
-    }
-
-    public override void OnMiddleFrameStart(int times)
-    {
-        
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/SkillEffect/SkillEffect.cs b/Main/System/Battle/SkillEffect/SkillEffect.cs
index 9bd1416..cb0c311 100644
--- a/Main/System/Battle/SkillEffect/SkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -23,6 +23,14 @@
     public virtual void Play(Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
     {
         onHit = _onHit;
+        if (skillConfig.EffectId > 0)
+        {
+            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.heroRectTrans, caster.Camp);
+        }
+        if (skillConfig.EffectId2 > 0)
+        {
+            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId2, caster.heroRectTrans, caster.Camp);
+        }
     }
 
     public virtual void Run()
@@ -37,7 +45,10 @@
 
     public virtual void OnMiddleFrameStart(int times)
     {
-
+        if (skillConfig.MStartEffectId <= 0)
+            return;
+        //  涓憞鍥哄畾鐗规晥
+        caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.MStartEffectId, caster.heroGo.transform, caster.Camp);
     }
     
     public virtual bool IsFinished()
diff --git a/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs b/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs
new file mode 100644
index 0000000..0ee0b41
--- /dev/null
+++ b/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs
@@ -0,0 +1,9 @@
+using UnityEngine;
+
+public class BasicHeroInfoContainer : MonoBehaviour
+{
+    public void SetHeroInfo(TeamHero teamHero)
+    {
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs.meta b/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs.meta
new file mode 100644
index 0000000..a658b6b
--- /dev/null
+++ b/Main/System/Battle/UIComp/BasicHeroInfoContainer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5c3e5adcdb7b8a74bb4a3561c9eb3a14
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/UIComp/BattleBuffCell.cs b/Main/System/Battle/UIComp/BattleBuffCell.cs
new file mode 100644
index 0000000..d3e5e57
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleBuffCell.cs
@@ -0,0 +1,17 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class BattleBuffCell : CellView
+{
+    public Image imageIcon;
+    public Text textLevel;
+
+    public void Display(HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh)
+    {
+        SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID);
+
+        imageIcon.sprite = ResManager.Instance.LoadAsset<Sprite>("", skillConfig.IconName);
+        textLevel.text = hB428_TagSCBuffRefresh.Layer.ToString();
+    }
+}
+
diff --git a/Main/System/Battle/UIComp/BattleBuffCell.cs.meta b/Main/System/Battle/UIComp/BattleBuffCell.cs.meta
new file mode 100644
index 0000000..b9247ab
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleBuffCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c7e8e099ab9f4874fa6a4bce3cf9b6ab
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/UIComp/BattleBuffLineCell.cs b/Main/System/Battle/UIComp/BattleBuffLineCell.cs
new file mode 100644
index 0000000..e8e4519
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleBuffLineCell.cs
@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+
+public class BattleBuffLineCell : CellView
+{
+    [SerializeField] BattleBuffCell[] buffCellList;
+
+    public void Display(List<HB428_tagSCBuffRefresh> buffList, int index)
+    { 
+        for (int i = 0; i < buffCellList.Length; i++)
+        {
+            if (i + index < buffList.Count)
+            {
+                buffCellList[i].SetActive(true);
+                buffCellList[i].Display(buffList[i + index]);
+            }
+            else
+            {
+                buffCellList[i].SetActive(false);
+            }
+        }
+    }
+}
+
diff --git a/Main/System/Battle/UIComp/BattleBuffLineCell.cs.meta b/Main/System/Battle/UIComp/BattleBuffLineCell.cs.meta
new file mode 100644
index 0000000..eef39d7
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleBuffLineCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ed7bc7d61144495468403b4152a0150f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
new file mode 100644
index 0000000..2f2a30f
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -0,0 +1,147 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using System;
+using DG.Tweening;
+
+
+public class BattleHeroInfoBar : MonoBehaviour
+{
+    protected BattleObject battleObject;
+
+    public Slider sliderHp;
+
+    public Slider sliderXp; //鎬掓皵
+
+    protected float timer = 0f;
+
+    public float PopUpInterval = 0.2f;
+
+
+    // public List<BattleBuffCell> buffCells = new List<BattleBuffCell>();
+
+    protected List<string> messages = new List<string>();
+
+    public BasicHeroInfoContainer heroInfoContainer;
+
+    public BattleTips textTips;
+
+    protected Tween hpTween;
+
+    protected List<BattleTips> tipsList = new List<BattleTips>();
+
+    protected List<HB428_tagSCBuffRefresh> buffList = new List<HB428_tagSCBuffRefresh>();
+
+    public ScrollerController scroller;
+
+    public void SetBattleObject(BattleObject _battleObject)
+    {
+        battleObject = _battleObject;
+        heroInfoContainer.SetHeroInfo(battleObject.teamHero);
+        RefreshBuff(buffList);
+    }
+
+    public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
+    {
+        buffList = datas;
+        //  鏇存柊buff鍥炬爣 or 鍒涘缓鏂扮殑buff鍥炬爣
+        scroller.Refresh();
+        for (int i = 0; i < buffList.Count; i++)
+        {
+            if (i % 5 == 0)
+            {
+                scroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        scroller.Restart();
+    }
+
+    protected void OnEnable()
+    {
+        scroller.OnRefreshCell += OnRefreshCell;        
+    }
+
+    protected void OnDisable()
+    {
+        //  TODO YYL 鑰冭檻姹犲寲
+        messages.Clear();
+        for (int i = 0; i < tipsList.Count; i++)
+        {
+            var tip = tipsList[i];
+            tip.OnFinish = null;
+            GameObject.DestroyImmediate(tip.gameObject);
+        }
+        tipsList.Clear();
+    }
+
+    protected void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as BattleBuffLineCell;
+        _cell.Display(buffList, cell.index);
+    }
+
+    public void ShowTips(string message)
+    {
+        messages.Add(message);
+    }
+
+    public void SetActive(bool active)
+    {
+        gameObject.SetActive(active);
+    }
+
+    public void PopUpTipsDirectly(string message)
+    {
+        GameObject prefab = textTips.gameObject;
+
+        GameObject go = GameObject.Instantiate(prefab, transform);
+
+        BattleTips tips = go.GetComponent<BattleTips>();
+
+        tips.SetText(message);
+
+        tips.OnFinish = () =>
+        {
+            //  TODO YYL 鑰冭檻姹犲寲
+            tipsList.Remove(tips);
+            GameObject.DestroyImmediate(tips.gameObject);
+        };
+
+        tipsList.Add(tips);
+    }
+
+
+    public void UpdateHP(long fromHp, long toHp, long maxHp)
+    {
+        //  鍋歨p澧炲姞鎴栬�呭噺灏戠殑鍔ㄧ敾
+        // sliderHp.value = ((float)fromHp) / ((float)maxHp);
+        if (hpTween != null)
+        {
+            battleObject.battleField.battleTweenMgr.OnKillTween(hpTween);
+        }
+        hpTween = sliderHp.DOValue((float)toHp / maxHp, 0.3f);
+        battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
+    }
+
+
+    public void Run()
+    {
+        for (int i = tipsList.Count - 1; i >= 0; i--)
+        {
+            tipsList[i].Run();
+        }
+
+        timer += Time.deltaTime;
+
+        if (messages.Count > 0 && timer >= PopUpInterval)
+        {
+            // 鎾斁椋樺瓧
+            string message = messages[0];
+            messages.RemoveAt(0);
+
+            PopUpTipsDirectly(message);
+
+            timer = 0f;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs.meta b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs.meta
new file mode 100644
index 0000000..0320275
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 91976c75be6daea45993712cce2f2110
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/UIComp/BattleTips.cs b/Main/System/Battle/UIComp/BattleTips.cs
new file mode 100644
index 0000000..a16ee76
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleTips.cs
@@ -0,0 +1,47 @@
+
+using UnityEngine;
+using System;
+using UnityEngine.UI;
+
+public class BattleTips : MonoBehaviour
+{
+    public Vector2 beginPos = Vector2.zero;
+    public Vector2 endPos = new Vector2(0, 100);
+    public float showTime = 0.4f;
+    public float timer = 0f;
+
+    protected RectTransform rectTransform;
+
+    void Awake()
+    {
+        rectTransform = gameObject.AddMissingComponent<RectTransform>();
+    }
+
+    public Text tipText;
+
+    public Action OnFinish;
+
+    public void SetText(string text)
+    {
+        tipText.text = text;
+        rectTransform.anchoredPosition = Vector2.zero;
+        timer = 0f;
+        gameObject.SetActive(true);
+    }
+
+
+    //  涓嶈浣跨敤update
+    public void Run()
+    {
+        if (timer >= showTime)
+        {
+            OnFinish?.Invoke();
+            OnFinish = null;
+            gameObject.SetActive(false);
+            return;
+        }
+
+        rectTransform.anchoredPosition = Vector2.Lerp(beginPos, endPos, timer / showTime);
+        timer += Time.deltaTime;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/UIComp/BattleTips.cs.meta b/Main/System/Battle/UIComp/BattleTips.cs.meta
new file mode 100644
index 0000000..427c6bf
--- /dev/null
+++ b/Main/System/Battle/UIComp/BattleTips.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ca221a28c4019fa439e674596524bc3d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/UIComp/DamageContent.cs b/Main/System/Battle/UIComp/DamageContent.cs
index 9963eb0..3c5e872 100644
--- a/Main/System/Battle/UIComp/DamageContent.cs
+++ b/Main/System/Battle/UIComp/DamageContent.cs
@@ -18,8 +18,9 @@
 		line.SetActive(false);
 	}
 
-	public void SetDamage(List<long> damages, Action _onComplete)
+	public void SetDamage(BattleDmgInfo damageInfo, Action _onComplete)
 	{
+		var damages = damageInfo.damageList;
 		for (int i = 0; i < damages.Count; i++)
 		{
 			if (i >= damageLineList.Count)
@@ -28,7 +29,7 @@
 				damageLineList.Add(newLine.GetComponent<DamageLine>());
 			}
 			damageLineList[i].SetActive(true);
-			damageLineList[i].SetDamage(damages[i]);
+			damageLineList[i].SetDamage(damageInfo.attackType, damages[i]);
 		}
 
 		for (int i = damages.Count; i < damageLineList.Count; i++)
diff --git a/Main/System/Battle/UIComp/DamageLine.cs b/Main/System/Battle/UIComp/DamageLine.cs
index 45edcab..9d1b1bf 100644
--- a/Main/System/Battle/UIComp/DamageLine.cs
+++ b/Main/System/Battle/UIComp/DamageLine.cs
@@ -9,10 +9,10 @@
 
 	public TextEx damageValueLabel;
 
-    public void SetDamage(DamageType damageType, long damage)
+    public void SetDamage(int damageType, long damage)
     {
-    	damageTypeLabel.SetActive(true);
-    	damageValueLabel.text = damage.ToString();
+    	damageTypeLabel.SetActive(false);
+        damageValueLabel.text = BattleUtility.DisplayDamageNum(damage, damageType);
     }
 
     public void SetDamage(long damage)
diff --git a/Main/System/Team/TeamHero.cs b/Main/System/Team/TeamHero.cs
index ce19457..e8c2ce7 100644
--- a/Main/System/Team/TeamHero.cs
+++ b/Main/System/Team/TeamHero.cs
@@ -11,6 +11,7 @@
 
     public float modelScale = 1f;
 
+    public int level = 0;
 
     public TeamBase teamBase
     {
@@ -18,7 +19,9 @@
     }
     public int positionNum; //娉ㄦ剰鏈嶅姟绔殑1鍙蜂綅鏄�1锛屽鎴风鍦ㄤ娇鐢ㄦ椂鏄�0锛岄�氫俊鍜岀瓥鍒掓矡閫氱敤1
 
-//  鎴樺満鏁版嵁
+
+
+    //  鎴樺満鏁版嵁
     public int ObjID = 0;// 鎴樻枟鍗曚綅鍞竴ID
 
     public int NPCID = 0;// 鎴樻枟NPCID锛屼笉鍚岀殑瀹炰緥ID瀵瑰簲鐨凬PCID鍙兘涓�鏍�
@@ -30,25 +33,41 @@
         //  鍒ゆ柇涓�涓嬫槸npc杩樻槸鐜╁
         heroId = (int)fightObj.HeroID;
 
-        if (fightObj.NPCID > 0)
+        // B4 24 鍥炲悎鎴樻枟鍒濆鍖� #tagSCTurnFightInit 
+        // 灏佸寘涓殑 HeroID銆丼kinID 瀛楁涓嶅啀鏄帺瀹堕樀瀹圭嫭鏈夛紝NPC闃靛涔熷彲鑳芥湁鍊硷紝涓�鑸槸鍏宠仈姝﹀皢鐨凬PC鏈夊��
+        // 濡傛灉 HeroID銆丼kinID 涓嶄负绌猴紝鍒欏彲璁や负鏄叧鑱旀灏嗙殑NPC锛屽瑙傜浉鍏抽粯璁ら�氳繃HeroID璇诲彇姝﹀皢鐩稿叧锛屽鍚嶇О
+        // 鐨偆 SkinID 涓嶄负绌烘椂锛屽垯妯″瀷榛樿浣跨敤璇ョ毊鑲�
+        // 濡傛灉 HeroID銆丼kinID 涓虹┖锛� NPCID涓嶄负绌猴紝鍒欒蛋鍘烴PC榛樿瑙勫垯
+
+        //  琛ュ厖 skinid璺焗eroid瑕佷箞鍚屾椂娌℃湁 瑕佷箞鍚屾椂鏈� 濡傛灉杩欎笁涓猧d閮芥病鏈夌殑璇� 閭e氨鏄厤缃弗閲嶉敊璇� 鏃犳硶寮ヨˉ
+
+        if (fightObj.SkinID > 0 && fightObj.HeroID > 0)
+        {
+            // 璧扮帺瀹堕�昏緫
+            var heroConfig = HeroConfig.Get(heroId);
+            if (null == heroConfig)
+            {
+                Debug.LogError("hero config is null, heroId : " + heroId);
+                return;
+            }
+            Country = (HeroCountry)heroConfig.Country;
+            SkinID = (int)fightObj.SkinID;
+            modelScale = 1f;
+        }
+        else if (fightObj.NPCID > 0)
         {
             //璧癗PC鐨勯�昏緫
             NPCConfig npcConfig = NPCConfig.Get((int)fightObj.NPCID);
             Country = (HeroCountry)npcConfig.Country;
             SkinID = npcConfig.SkinID;
-            BattleDebug.LogError("npc skin id is " + SkinID);
             modelScale = npcConfig.ModelScale;
         }
         else
         {
-            //璧扮帺瀹堕�昏緫
-            var heroConfig = HeroConfig.Get(heroId);
-            Country = (HeroCountry)heroConfig.Country;
-            SkinID = (int)fightObj.SkinID;
-            BattleDebug.LogError("normal hero skin id is " + SkinID);
-            modelScale = 1f;
+            throw new System.Exception("hero id and skin id are both invalid, npc id is invalid too (all <= 0)");
         }
 
+        level = (int)fightObj.LV;
 
         skinConfig = HeroSkinConfig.Get(SkinID);
         teamBase = _teamBase;

--
Gitblit v1.8.0