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

---
 Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs.meta                       |    2 
 Main/System/Battle/Motion/MotionBase.cs                                                       |  130 +++
 Main/Config/Configs/SkillConfig.cs                                                            |  341 +++-----
 Main/System/Battle/SkillEffect/SkillEffectFactory.cs                                          |   28 
 Main/System/MainLevel/MainLevelManager.cs                                                     |   21 
 Main/System/Battle/BattleObject/BattleObject.cs                                               |   14 
 Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs                            |   70 +
 Main/System/Hero/HeroFetterInfo.cs                                                            |    4 
 Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs.meta                        |    2 
 Main/System/Battle/Skill/SkillFactory.cs                                                      |    5 
 Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs.meta                        |    2 
 Main/System/Battle/RecordPlayer/RecordActionType.cs                                           |    2 
 Main/Core/NetworkPackage/CustomServerPack.meta                                                |    8 
 Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs                           |  150 +++
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                           |  141 ++-
 Main/System/Battle/Skill/SkillEffectType.cs                                                   |   11 
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs.meta                                |    2 
 Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs.meta           |    2 
 Main/System/Battle/Skill/SkillEffectType.cs.meta                                              |    2 
 Main/System/Battle/Skill/SkillBase.cs                                                         |  197 ++--
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs.meta                         |    2 
 Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs.meta                          |    2 
 Main/System/Battle/Skill/SkillCastMode.cs                                                     |   19 
 Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs.meta                          |    2 
 Main/System/Battle/BattleConst.cs.meta                                                        |    2 
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                             |    4 
 Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs.meta                        |    2 
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                           |   96 +-
 Main/System/Battle/BattleConst.cs                                                             |    8 
 Main/Common/EventName.cs                                                                      |    4 
 Main/Config/ConfigManager.cs                                                                  |  131 ---
 Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs                               |   77 +
 Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs                             |   38 
 Main/System/Battle/SkillEffect/BulletCurve.meta                                               |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs.meta |    2 
 Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs.meta                      |    2 
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs                              |   35 
 Main/System/MainLevel.meta                                                                    |    8 
 Main/System/Battle/BattleField/BattleField.cs                                                 |   86 ++
 Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs                             |   25 
 Main/System/Message/RichTableEvent.cs                                                         |    2 
 Main/System/Team/TeamManager.cs                                                               |   45 
 Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs                             |   39 
 Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs                               |   40 +
 Main/Config/PartialConfigs/SkillConfig.Partial.cs                                             |   11 
 Main/Component/UI/Effect/EffectPlayer.cs                                                      |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs      |   11 
 Main/System/Battle/BattleEffectMgr.cs                                                         |    2 
 Main/System/Team/TeamBase.cs                                                                  |   56 
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs                                     |   63 +
 Main/System/KnapSack/PackManager.cs                                                           |   34 
 Main/System/Battle/BattleManager.cs                                                           |  117 ++
 Main/System/Battle/Skill/DirectlyDamageSkill.cs                                               |  146 +--
 Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs                |   21 
 Main/System/Battle/SkillEffect/SkillEffect.cs                                                 |   27 
 Main/System/MainLevel/MainLevelManager.cs.meta                                                |    2 
 /dev/null                                                                                     |   11 
 Main/System/Battle/BattleObject/BattleObjMgr.cs                                               |   53 +
 Main/System/Team/TeamHero.cs                                                                  |    4 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs            |    2 
 60 files changed, 1,581 insertions(+), 794 deletions(-)

diff --git a/Main/Common/EventName.cs b/Main/Common/EventName.cs
index 68165bb..ad3cc1f 100644
--- a/Main/Common/EventName.cs
+++ b/Main/Common/EventName.cs
@@ -7,6 +7,6 @@
 	public const string BATTLE_BUFF_DISAPEAR = "BATTLE_BUFF_DISAPEAR";//BUFF DISAPEAR
 
 	public const string BATTLE_DAMAGE_TAKEN = "BATTLE_DAMAGE_TAKEN";//閫犳垚浼ゅ
-
-
+	
+    public const string DISPLAY_BATTLE_UI = "DISPLAY_BATTLE_UI";//鏄剧ず鎴樻枟UI
 }
\ No newline at end of file
diff --git a/Main/Component/UI/Effect/EffectPlayer.cs b/Main/Component/UI/Effect/EffectPlayer.cs
index 26427fa..7e5122f 100644
--- a/Main/Component/UI/Effect/EffectPlayer.cs
+++ b/Main/Component/UI/Effect/EffectPlayer.cs
@@ -154,7 +154,7 @@
         // 鑷姩閿�姣�
         if (effectConfig.autoDestroy != 0)
         {
-            Destroy(effectTarget, effectConfig.destroyDelay);
+            Destroy(gameObject, effectConfig.destroyDelay);
         }
     }
 
diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 5731362..3a81196 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -38,52 +38,9 @@
 
         // 鍔犺浇閰嶇疆鏂囦欢
         HashSet<Type> configTypes = new HashSet<Type>() {
-            typeof(ChatBubbleBoxConfig),
-            typeof(CTGConfig),
-            typeof(DailyLivenessRewardConfig),
-            typeof(DailyQuestConfig),
-            typeof(DailyQuestOpenTimeConfig),
-            typeof(DienstgradConfig),
-            typeof(DirtyNameConfig),
             typeof(DirtyWordConfig),
-            typeof(EffectConfig),
             typeof(EquipGSParamConfig),
-            typeof(EquipPlaceMapConfig),
-            typeof(FamilyEmblemConfig),
-            typeof(FrameAnimationConfig),
-            typeof(FuncConfigConfig),
-            typeof(FuncOpenLVConfig),
-            typeof(FunctionTeamSetConfig),
-            typeof(GetItemWaysConfig),
-            typeof(GmCmdConfig),
-            typeof(HeroAwakeConfig),
-            typeof(HeroConfig),
-            typeof(HeroQualityAwakeConfig),
-            typeof(HeroQualityBreakConfig),
-            typeof(HeroQualityConfig),
-            typeof(HeroSkinConfig),
-            typeof(ItemConfig),
-            typeof(KickOutReasonConfig),
-            typeof(MainChapterConfig),
-            typeof(MainLevelConfig),
-            typeof(NPCConfig),
-            typeof(NPCLineupConfig),
-            typeof(OrderInfoConfig),
-            typeof(PlayerFaceConfig),
-            typeof(PlayerLVConfig),
-            typeof(PlayerPropertyConfig),
-            typeof(priorbundleConfig),
-            typeof(RealmConfig),
-            typeof(RealmLVUPTaskConfig),
-            typeof(RuleConfig),
-            typeof(SkillConfig),
-            typeof(TaskConfig),
-            typeof(TitleStarUpConfig),
-            typeof(TreasureCntAwardConfig),
-            typeof(TreasureItemLibConfig),
-            typeof(TreasureSetConfig),
-            typeof(TreeLVConfig),
-            typeof(XBGetItemConfig)
+            typeof(TitleStarUpConfig)
         };
 
 #if UNITY_EDITOR
@@ -233,98 +190,12 @@
 
     public override void Release()
     {
-        // 娓呯┖ ChatBubbleBoxConfig 瀛楀吀
-        ClearConfigDictionary<ChatBubbleBoxConfig>();
-        // 娓呯┖ CTGConfig 瀛楀吀
-        ClearConfigDictionary<CTGConfig>();
-        // 娓呯┖ DailyLivenessRewardConfig 瀛楀吀
-        ClearConfigDictionary<DailyLivenessRewardConfig>();
-        // 娓呯┖ DailyQuestConfig 瀛楀吀
-        ClearConfigDictionary<DailyQuestConfig>();
-        // 娓呯┖ DailyQuestOpenTimeConfig 瀛楀吀
-        ClearConfigDictionary<DailyQuestOpenTimeConfig>();
-        // 娓呯┖ DienstgradConfig 瀛楀吀
-        ClearConfigDictionary<DienstgradConfig>();
-        // 娓呯┖ DirtyNameConfig 瀛楀吀
-        ClearConfigDictionary<DirtyNameConfig>();
         // 娓呯┖ DirtyWordConfig 瀛楀吀
         ClearConfigDictionary<DirtyWordConfig>();
-        // 娓呯┖ EffectConfig 瀛楀吀
-        ClearConfigDictionary<EffectConfig>();
         // 娓呯┖ EquipGSParamConfig 瀛楀吀
         ClearConfigDictionary<EquipGSParamConfig>();
-        // 娓呯┖ EquipPlaceMapConfig 瀛楀吀
-        ClearConfigDictionary<EquipPlaceMapConfig>();
-        // 娓呯┖ FamilyEmblemConfig 瀛楀吀
-        ClearConfigDictionary<FamilyEmblemConfig>();
-        // 娓呯┖ FrameAnimationConfig 瀛楀吀
-        ClearConfigDictionary<FrameAnimationConfig>();
-        // 娓呯┖ FuncConfigConfig 瀛楀吀
-        ClearConfigDictionary<FuncConfigConfig>();
-        // 娓呯┖ FuncOpenLVConfig 瀛楀吀
-        ClearConfigDictionary<FuncOpenLVConfig>();
-        // 娓呯┖ FunctionTeamSetConfig 瀛楀吀
-        ClearConfigDictionary<FunctionTeamSetConfig>();
-        // 娓呯┖ GetItemWaysConfig 瀛楀吀
-        ClearConfigDictionary<GetItemWaysConfig>();
-        // 娓呯┖ GmCmdConfig 瀛楀吀
-        ClearConfigDictionary<GmCmdConfig>();
-        // 娓呯┖ HeroAwakeConfig 瀛楀吀
-        ClearConfigDictionary<HeroAwakeConfig>();
-        // 娓呯┖ HeroConfig 瀛楀吀
-        ClearConfigDictionary<HeroConfig>();
-        // 娓呯┖ HeroQualityAwakeConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityAwakeConfig>();
-        // 娓呯┖ HeroQualityBreakConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityBreakConfig>();
-        // 娓呯┖ HeroQualityConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityConfig>();
-        // 娓呯┖ HeroSkinConfig 瀛楀吀
-        ClearConfigDictionary<HeroSkinConfig>();
-        // 娓呯┖ ItemConfig 瀛楀吀
-        ClearConfigDictionary<ItemConfig>();
-        // 娓呯┖ KickOutReasonConfig 瀛楀吀
-        ClearConfigDictionary<KickOutReasonConfig>();
-        // 娓呯┖ MainChapterConfig 瀛楀吀
-        ClearConfigDictionary<MainChapterConfig>();
-        // 娓呯┖ MainLevelConfig 瀛楀吀
-        ClearConfigDictionary<MainLevelConfig>();
-        // 娓呯┖ NPCConfig 瀛楀吀
-        ClearConfigDictionary<NPCConfig>();
-        // 娓呯┖ NPCLineupConfig 瀛楀吀
-        ClearConfigDictionary<NPCLineupConfig>();
-        // 娓呯┖ OrderInfoConfig 瀛楀吀
-        ClearConfigDictionary<OrderInfoConfig>();
-        // 娓呯┖ PlayerFaceConfig 瀛楀吀
-        ClearConfigDictionary<PlayerFaceConfig>();
-        // 娓呯┖ PlayerLVConfig 瀛楀吀
-        ClearConfigDictionary<PlayerLVConfig>();
-        // 娓呯┖ PlayerPropertyConfig 瀛楀吀
-        ClearConfigDictionary<PlayerPropertyConfig>();
-        // 娓呯┖ priorbundleConfig 瀛楀吀
-        ClearConfigDictionary<priorbundleConfig>();
-        // 娓呯┖ RealmConfig 瀛楀吀
-        ClearConfigDictionary<RealmConfig>();
-        // 娓呯┖ RealmLVUPTaskConfig 瀛楀吀
-        ClearConfigDictionary<RealmLVUPTaskConfig>();
-        // 娓呯┖ RuleConfig 瀛楀吀
-        ClearConfigDictionary<RuleConfig>();
-        // 娓呯┖ SkillConfig 瀛楀吀
-        ClearConfigDictionary<SkillConfig>();
-        // 娓呯┖ TaskConfig 瀛楀吀
-        ClearConfigDictionary<TaskConfig>();
         // 娓呯┖ TitleStarUpConfig 瀛楀吀
         ClearConfigDictionary<TitleStarUpConfig>();
-        // 娓呯┖ TreasureCntAwardConfig 瀛楀吀
-        ClearConfigDictionary<TreasureCntAwardConfig>();
-        // 娓呯┖ TreasureItemLibConfig 瀛楀吀
-        ClearConfigDictionary<TreasureItemLibConfig>();
-        // 娓呯┖ TreasureSetConfig 瀛楀吀
-        ClearConfigDictionary<TreasureSetConfig>();
-        // 娓呯┖ TreeLVConfig 瀛楀吀
-        ClearConfigDictionary<TreeLVConfig>();
-        // 娓呯┖ XBGetItemConfig 瀛楀吀
-        ClearConfigDictionary<XBGetItemConfig>();
     }
 
 #if UNITY_EDITOR
diff --git a/Main/Config/Configs/SkillConfig.cs b/Main/Config/Configs/SkillConfig.cs
index 55c63d0..55ed3e4 100644
--- a/Main/Config/Configs/SkillConfig.cs
+++ b/Main/Config/Configs/SkillConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�7鏈�17鏃�
+//    [  Date ]:           2025骞�7鏈�28鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -15,85 +15,42 @@
 
     public int SkillID;
 	public string SkillName;
-	public int SkillTypeID;
-	public int SkillLV;
-	public int SkillMaxLV;
-	public int UseType;
+	public string Description;
+	public string IconName;
 	public int FuncType;
-	public int CastTime;
 	public int SkillType;
 	public int HurtType;
-	public int ContinueUse;
 	public int AtkType;
-	public int AtkRadius;
-	public int Tag;
-	public int AtkDist;
-	public int StiffTime;
+	public int TagAim;
+	public int LastTime;
 	public int CoolDownTime;
-	public int MP;
-	public int HP;
-	public int XP;
-	public int UseItemID;
-	public int UseItemCount;
-	public int Effect1;
-	public int EffectValue11;
-	public int EffectValue12;
-	public int EffectValue13;
-	public int Effect2;
-	public int EffectValue21;
-	public int EffectValue22;
-	public int EffectValue23;
-	public int Effect3;
-	public int EffectValue31;
-	public int EffectValue32;
-	public int EffectValue33;
-	public int Effect4;
-	public int EffectValue41;
-	public int EffectValue42;
-	public int EffectValue43;
-	public int Effect5;
-	public int EffectValue51;
-	public int EffectValue52;
-	public int EffectValue53;
-	public int Effect6;
-	public int EffectValue61;
-	public int EffectValue62;
-	public int EffectValue63;
-	public int HappenRate6;
-	public int LastTime6;
-	public int SkillEnhance1;
-	public int SkillEnhance2;
-	public int StateSkillLV;
-	public int LearnSkillReq;
-	public int LearnSkillLV;
-	public int LearnLVReq;
-	public int LearnSkillPointReq;
+	public int EffectID1;
+	public int[] EffectValues1;
+	public int EffectID2;
+	public int[] EffectValues2;
+	public int EffectID3;
+	public int[] EffectValues3;
+	public int ConnSkill;
+	public int[] EnhanceSkillList;
 	public int FightPower;
-	public int LVUpCostMoneyType;
-	public int LVUpCostMoney;
-	public int LVUpCostExp;
-	public int ClientActionLimit;
-	public int ClientSkillSeriesLimit;
-	public int SkillOfSeries;
-	public int ExpendMPRate;
-	public int ExAttr1;
-	public int ExAttr3;
-	public int ExAttr4;
-	public int ExAttr5;
-	public int BuffEffectID;
-	public int EffectName;
-	public string IconName;
-	public string Description;
-	public string BuffDescription;
-	public int BuffDisplay;
+	public int StartupFrames;
+	public int ActiveFrames;
+	public int RecoveryFrames;
+	public int LoopCount;
 	public int CastPosition;
-	public int CastDistance;
-	public int[] TriggerFrames;
+	public int CastIndexNum;
+	public float CastDistance;
 	public int[][] DamageDivide;
+	public int BulletEffectId;
+	public int BulletPos;
+	public int BulletPath;
+	public int BulletFlyTime;
+	public int ExplosionEffectId;
+	public int ExplosionPos;
 	public string SkillMotionName;
 	public int EffectId;
-	public int ExplotionEffectId;
-	public float FlyTime;
+	public int EffectPos;
+	public int EffectType;
 
     public override int LoadKey(string _key)
     {
@@ -109,175 +66,125 @@
 
 			SkillName = tables[1];
 
-			int.TryParse(tables[2],out SkillTypeID); 
+			Description = tables[2];
 
-			int.TryParse(tables[3],out SkillLV); 
+			IconName = tables[3];
 
-			int.TryParse(tables[4],out SkillMaxLV); 
+			int.TryParse(tables[4],out FuncType); 
 
-			int.TryParse(tables[5],out UseType); 
+			int.TryParse(tables[5],out SkillType); 
 
-			int.TryParse(tables[6],out FuncType); 
+			int.TryParse(tables[6],out HurtType); 
 
-			int.TryParse(tables[7],out CastTime); 
+			int.TryParse(tables[7],out AtkType); 
 
-			int.TryParse(tables[8],out SkillType); 
+			int.TryParse(tables[8],out TagAim); 
 
-			int.TryParse(tables[9],out HurtType); 
+			int.TryParse(tables[9],out LastTime); 
 
-			int.TryParse(tables[10],out ContinueUse); 
+			int.TryParse(tables[10],out CoolDownTime); 
 
-			int.TryParse(tables[11],out AtkType); 
+			int.TryParse(tables[11],out EffectID1); 
 
-			int.TryParse(tables[12],out AtkRadius); 
-
-			int.TryParse(tables[13],out Tag); 
-
-			int.TryParse(tables[14],out AtkDist); 
-
-			int.TryParse(tables[15],out StiffTime); 
-
-			int.TryParse(tables[16],out CoolDownTime); 
-
-			int.TryParse(tables[17],out MP); 
-
-			int.TryParse(tables[18],out HP); 
-
-			int.TryParse(tables[19],out XP); 
-
-			int.TryParse(tables[20],out UseItemID); 
-
-			int.TryParse(tables[21],out UseItemCount); 
-
-			int.TryParse(tables[22],out Effect1); 
-
-			int.TryParse(tables[23],out EffectValue11); 
-
-			int.TryParse(tables[24],out EffectValue12); 
-
-			int.TryParse(tables[25],out EffectValue13); 
-
-			int.TryParse(tables[26],out Effect2); 
-
-			int.TryParse(tables[27],out EffectValue21); 
-
-			int.TryParse(tables[28],out EffectValue22); 
-
-			int.TryParse(tables[29],out EffectValue23); 
-
-			int.TryParse(tables[30],out Effect3); 
-
-			int.TryParse(tables[31],out EffectValue31); 
-
-			int.TryParse(tables[32],out EffectValue32); 
-
-			int.TryParse(tables[33],out EffectValue33); 
-
-			int.TryParse(tables[34],out Effect4); 
-
-			int.TryParse(tables[35],out EffectValue41); 
-
-			int.TryParse(tables[36],out EffectValue42); 
-
-			int.TryParse(tables[37],out EffectValue43); 
-
-			int.TryParse(tables[38],out Effect5); 
-
-			int.TryParse(tables[39],out EffectValue51); 
-
-			int.TryParse(tables[40],out EffectValue52); 
-
-			int.TryParse(tables[41],out EffectValue53); 
-
-			int.TryParse(tables[42],out Effect6); 
-
-			int.TryParse(tables[43],out EffectValue61); 
-
-			int.TryParse(tables[44],out EffectValue62); 
-
-			int.TryParse(tables[45],out EffectValue63); 
-
-			int.TryParse(tables[46],out HappenRate6); 
-
-			int.TryParse(tables[47],out LastTime6); 
-
-			int.TryParse(tables[48],out SkillEnhance1); 
-
-			int.TryParse(tables[49],out SkillEnhance2); 
-
-			int.TryParse(tables[50],out StateSkillLV); 
-
-			int.TryParse(tables[51],out LearnSkillReq); 
-
-			int.TryParse(tables[52],out LearnSkillLV); 
-
-			int.TryParse(tables[53],out LearnLVReq); 
-
-			int.TryParse(tables[54],out LearnSkillPointReq); 
-
-			int.TryParse(tables[55],out FightPower); 
-
-			int.TryParse(tables[56],out LVUpCostMoneyType); 
-
-			int.TryParse(tables[57],out LVUpCostMoney); 
-
-			int.TryParse(tables[58],out LVUpCostExp); 
-
-			int.TryParse(tables[59],out ClientActionLimit); 
-
-			int.TryParse(tables[60],out ClientSkillSeriesLimit); 
-
-			int.TryParse(tables[61],out SkillOfSeries); 
-
-			int.TryParse(tables[62],out ExpendMPRate); 
-
-			int.TryParse(tables[63],out ExAttr1); 
-
-			int.TryParse(tables[64],out ExAttr3); 
-
-			int.TryParse(tables[65],out ExAttr4); 
-
-			int.TryParse(tables[66],out ExAttr5); 
-
-			int.TryParse(tables[67],out BuffEffectID); 
-
-			int.TryParse(tables[68],out EffectName); 
-
-			IconName = tables[69];
-
-			Description = tables[70];
-
-			BuffDescription = tables[71];
-
-			int.TryParse(tables[72],out BuffDisplay); 
-
-			int.TryParse(tables[73],out CastPosition); 
-
-			int.TryParse(tables[74],out CastDistance); 
-
-			if (tables[75].Contains("["))
+			if (tables[12].Contains("["))
 			{
-				TriggerFrames = JsonMapper.ToObject<int[]>(tables[75]);
+				EffectValues1 = JsonMapper.ToObject<int[]>(tables[12]);
 			}
 			else
 			{
-				string[] TriggerFramesStringArray = tables[75].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				TriggerFrames = new int[TriggerFramesStringArray.Length];
-				for (int i=0;i<TriggerFramesStringArray.Length;i++)
+				string[] EffectValues1StringArray = tables[12].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				EffectValues1 = new int[EffectValues1StringArray.Length];
+				for (int i=0;i<EffectValues1StringArray.Length;i++)
 				{
-					 int.TryParse(TriggerFramesStringArray[i],out TriggerFrames[i]);
+					 int.TryParse(EffectValues1StringArray[i],out EffectValues1[i]);
 				}
 			}
 
-			DamageDivide = JsonMapper.ToObject<int[][]>(tables[76].Replace("(", "[").Replace(")", "]")); 
+			int.TryParse(tables[13],out EffectID2); 
 
-			SkillMotionName = tables[77];
+			if (tables[14].Contains("["))
+			{
+				EffectValues2 = JsonMapper.ToObject<int[]>(tables[14]);
+			}
+			else
+			{
+				string[] EffectValues2StringArray = tables[14].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				EffectValues2 = new int[EffectValues2StringArray.Length];
+				for (int i=0;i<EffectValues2StringArray.Length;i++)
+				{
+					 int.TryParse(EffectValues2StringArray[i],out EffectValues2[i]);
+				}
+			}
 
-			int.TryParse(tables[78],out EffectId); 
+			int.TryParse(tables[15],out EffectID3); 
 
-			int.TryParse(tables[79],out ExplotionEffectId); 
+			if (tables[16].Contains("["))
+			{
+				EffectValues3 = JsonMapper.ToObject<int[]>(tables[16]);
+			}
+			else
+			{
+				string[] EffectValues3StringArray = tables[16].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				EffectValues3 = new int[EffectValues3StringArray.Length];
+				for (int i=0;i<EffectValues3StringArray.Length;i++)
+				{
+					 int.TryParse(EffectValues3StringArray[i],out EffectValues3[i]);
+				}
+			}
 
-			float.TryParse(tables[80],out FlyTime); 
+			int.TryParse(tables[17],out ConnSkill); 
+
+			if (tables[18].Contains("["))
+			{
+				EnhanceSkillList = JsonMapper.ToObject<int[]>(tables[18]);
+			}
+			else
+			{
+				string[] EnhanceSkillListStringArray = tables[18].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				EnhanceSkillList = new int[EnhanceSkillListStringArray.Length];
+				for (int i=0;i<EnhanceSkillListStringArray.Length;i++)
+				{
+					 int.TryParse(EnhanceSkillListStringArray[i],out EnhanceSkillList[i]);
+				}
+			}
+
+			int.TryParse(tables[19],out FightPower); 
+
+			int.TryParse(tables[20],out StartupFrames); 
+
+			int.TryParse(tables[21],out ActiveFrames); 
+
+			int.TryParse(tables[22],out RecoveryFrames); 
+
+			int.TryParse(tables[23],out LoopCount); 
+
+			int.TryParse(tables[24],out CastPosition); 
+
+			int.TryParse(tables[25],out CastIndexNum); 
+
+			float.TryParse(tables[26],out CastDistance); 
+
+			DamageDivide = JsonMapper.ToObject<int[][]>(tables[27].Replace("(", "[").Replace(")", "]")); 
+
+			int.TryParse(tables[28],out BulletEffectId); 
+
+			int.TryParse(tables[29],out BulletPos); 
+
+			int.TryParse(tables[30],out BulletPath); 
+
+			int.TryParse(tables[31],out BulletFlyTime); 
+
+			int.TryParse(tables[32],out ExplosionEffectId); 
+
+			int.TryParse(tables[33],out ExplosionPos); 
+
+			SkillMotionName = tables[34];
+
+			int.TryParse(tables[35],out EffectId); 
+
+			int.TryParse(tables[36],out EffectPos); 
+
+			int.TryParse(tables[37],out EffectType); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/PartialConfigs/SkillConfig.Partial.cs b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
index 7e5d604..75f1834 100644
--- a/Main/Config/PartialConfigs/SkillConfig.Partial.cs
+++ b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
@@ -14,8 +14,17 @@
 {
 	public SkillType skillType;
 	public SkillCastMode castMode;
+
 	public SkillEffectType effectType;
-	public SkillEffectAnchor effectAnchor;
+
+	protected override void OnConfigParseCompleted()
+	{
+		base.OnConfigParseCompleted();
+
+		skillType = (SkillType)SkillType;
+		castMode = (SkillCastMode)CastPosition;
+		effectType = (SkillEffectType)EffectType;
+	}
 
 	public MotionName GetMotionName()
 	{
diff --git a/Main/Core/NetworkPackage/CustomServerPack.meta b/Main/Core/NetworkPackage/CustomServerPack.meta
new file mode 100644
index 0000000..09e475e
--- /dev/null
+++ b/Main/Core/NetworkPackage/CustomServerPack.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 65490d004b625604d8f1e94f7547d5c1
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs b/Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs
new file mode 100644
index 0000000..0082938
--- /dev/null
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs
@@ -0,0 +1,25 @@
+
+using System.Collections.Generic;
+using UnityEngine;
+
+public class CustomB421ActionPack : GameNetPackBasic
+{
+    public string guid;
+
+    public Queue<GameNetPackBasic> actionPacks = new Queue<GameNetPackBasic>();
+
+    public static CustomB421ActionPack CreateB421ActionPack(string _guid, List<GameNetPackBasic> packList)
+    {
+        //  鍚堝苟涓�涓嬭繖涓鑹茬殑琛屽姩鍐呭鐨勬妧鑳� 鍒朵綔鎴怌ustomB421ActionPack
+        List<GameNetPackBasic> combinedPackList = CustomHB426CombinePack.CombineToSkillPackFromList(_guid, packList);
+        CustomB421ActionPack actionPack = new CustomB421ActionPack();
+        actionPack.guid = _guid;
+        actionPack.actionPacks = new Queue<GameNetPackBasic>(combinedPackList);
+        return actionPack;
+    }
+
+    public void Distribute()
+    {
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs.meta
index 9310e5e..986cbc4 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomB421ActionPack.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 436c83b5afc693841b2b3f51ec07d020
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
new file mode 100644
index 0000000..cfa8274
--- /dev/null
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
@@ -0,0 +1,150 @@
+
+using System.Collections.Generic;
+using UnityEngine;
+
+public class CustomHB426CombinePack : GameNetPackBasic
+{
+
+    protected HB426_tagSCTurnFightTag startTag;
+
+    protected HB426_tagSCTurnFightTag endTag;
+
+    public int fromIndex;
+
+    public int toIndex;
+
+    public string guid;
+
+    public List<GameNetPackBasic> packList = new List<GameNetPackBasic>();
+
+    public override void ReadFromBytes(byte[] vBytes)
+    {
+        base.ReadFromBytes(vBytes);
+    }
+
+    public void SetHB426End(int _toIndex, HB426_tagSCTurnFightTag _endTag)
+    {
+        if (endTag.Sign != 1)
+        {
+            Debug.LogError("HB426_tagSCTurnFightTag Sign must be 1 for end tag, but got: " + endTag.Sign);
+            return;
+        }
+        endTag = _endTag;
+
+        packList = CombineToSkillPackFromList(guid, packList);
+    }
+
+
+    public void SetHB426Start(int _fromIndex, HB426_tagSCTurnFightTag tag)
+    {
+        if (tag.Sign != 0)
+        {
+            Debug.LogError("HB426_tagSCTurnFightTag Sign must be 0 for start tag, but got: " + tag.Sign);
+            return;
+        }
+        fromIndex = _fromIndex;
+        startTag = tag;
+    }
+
+    public void AddPack(GameNetPackBasic pack)
+    {
+        if (startTag == null)
+        {
+            Debug.LogError("startTag is null, please set it first.");
+            return;
+        }
+
+        packList.Add(pack);
+    }
+
+    public bool IsEndPack(HB426_tagSCTurnFightTag tag)
+    {
+        if (endTag == null)
+        {
+            Debug.LogError("endTag is null, please set it first.");
+            return false;
+        }
+
+        return endTag.Tag == tag.Tag && endTag.Sign == 1;
+    }
+
+
+    public static List<GameNetPackBasic> CombineToSkillPackFromList(string _guid, List<GameNetPackBasic> b421SeriesPackList)
+    {
+        CustomHB426CombinePack combinePack = null;
+        for (int i = 0; i < b421SeriesPackList.Count; i++)
+        {
+            var pack = b421SeriesPackList[i];
+            if (pack is HB426_tagSCTurnFightTag)
+            {
+                var tag = pack as HB426_tagSCTurnFightTag;
+                if (null == combinePack)
+                {
+                    combinePack = new CustomHB426CombinePack();
+                    combinePack.guid = _guid;
+                    combinePack.SetHB426Start(i, tag);
+                }
+                else
+                {
+                    if (combinePack.IsEndPack(tag))
+                    {
+                        combinePack.SetHB426End(i, tag);
+                        break;
+                    }
+                }
+            }
+
+            if (null != combinePack)
+            {
+                combinePack.AddPack(pack);
+            }
+        }
+
+        List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>();
+
+        if (null != combinePack)
+        {
+            //  鎶�鑳藉寘鍓嶉潰鐨勫寘锛堜笉鍖呮嫭b426鐨勫紑濮嬫爣绛撅級
+            for (int i = 0; i < combinePack.fromIndex; i++)
+            {
+                newPackList.Add(b421SeriesPackList[i]);
+            }
+
+            //  鎶婂悎骞剁殑鎶�鑳藉寘鍔犺繘鏉�
+            newPackList.Add(combinePack);
+
+            //  鎶�鑳藉寘鍚庨潰鐨勫寘锛堜笉鍖呮嫭b426鐨勭粨鏉熸爣绛撅級
+            for (int i = combinePack.toIndex + 1; i < b421SeriesPackList.Count; i++)
+            {
+                newPackList.Add(b421SeriesPackList[i]);
+            }
+
+            return CombineToSkillPackFromList(_guid, newPackList);
+
+        }
+        else
+        {
+            return b421SeriesPackList;
+        }
+
+    }
+
+    public void Distribute()
+    {
+        BattleField battleField = BattleManager.Instance.GetBattleField(guid);
+
+        if (null == battleField)
+        {
+            Debug.LogError("BattleField not found for guid: " + guid);
+            return;
+        }
+
+        if (startTag.Tag.StartsWith("Skill_"))
+        {
+            H0604_tagUseSkillAttack skill = packList[0] as H0604_tagUseSkillAttack;
+            BattleObject caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID);
+            SkillRecordAction skillRecordAction = new SkillRecordAction(battleField, caster, skill, packList);
+            battleField.PlayRecord(skillRecordAction);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs.meta
similarity index 83%
rename from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
rename to Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs.meta
index 9310e5e..3bb5754 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 34030b38537bbf6498977ece22d729b5
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
index aa62164..20f4fe7 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
@@ -31,7 +31,7 @@
     {
         if (PlayerDatas.Instance.PlayerId == vNetData.ObjID)
         {
-            
+            //  鎴樻枟涓鏋滄垬閿ゆ秷鑰� 鐣岄潰鑷繁鍘荤洃鍚秷鎭�
             PlayerDatas.Instance.RefreshPlayerData(vNetData);
         }
         else
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs
new file mode 100644
index 0000000..21116ae
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs
@@ -0,0 +1,11 @@
+using UnityEngine;
+using System.Collections;
+
+// B4 26 鍥炲悎鎴樻枟鏍囩 #tagSCTurnFightTag
+
+public class DTCB426_tagSCTurnFightTag : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HB426_tagSCTurnFightTag vNetData = vNetPack as HB426_tagSCTurnFightTag;
+    }
+}
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs.meta
index 9310e5e..33001bf 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB426_tagSCTurnFightTag.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 77047853a6f0b1f4d879ad8dbf205761
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs
new file mode 100644
index 0000000..6918090
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs
@@ -0,0 +1,21 @@
+using UnityEngine;
+using System.Collections;
+
+// B4 26 鍥炲悎鎴樻枟鏍囩 #tagSCTurnFightTag
+
+public class HB426_tagSCTurnFightTag : GameNetPackBasic {
+    public byte Len;
+    public string Tag;    // 鏍囩锛岄噴鏀炬妧鑳界殑鏍囩鏍煎紡: Skill_objID_skillID锛屽叾浠栨爣绛炬牸寮忓彲鍐嶆墿灞�
+    public byte Sign;    // 0-鏍囩澶达紱1-鏍囩灏撅紱
+
+    public HB426_tagSCTurnFightTag () {
+        _cmd = (ushort)0xB426;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Len, vBytes, NetDataType.BYTE);
+        TransBytes (out Tag, vBytes, NetDataType.Chars, Len);
+        TransBytes (out Sign, vBytes, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs.meta
index 9310e5e..cde0156 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB426_tagSCTurnFightTag.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 93503b0ea916f594c9c782f20b013bbf
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleConst.cs b/Main/System/Battle/BattleConst.cs
new file mode 100644
index 0000000..a29c672
--- /dev/null
+++ b/Main/System/Battle/BattleConst.cs
@@ -0,0 +1,8 @@
+
+
+public static class BattleConst
+{
+    public const int BattleStartEffectID = 1001; // Example effect ID for battle start
+
+    public const int skillMotionFps = 30;
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/BattleConst.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/BattleConst.cs.meta
index 9310e5e..5cfdd12 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/BattleConst.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: eb7d9bf2b8aa54f47b15a3b378eb38b0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleEffectMgr.cs b/Main/System/Battle/BattleEffectMgr.cs
index d6ce2a6..7d78d36 100644
--- a/Main/System/Battle/BattleEffectMgr.cs
+++ b/Main/System/Battle/BattleEffectMgr.cs
@@ -49,7 +49,7 @@
         }
 
         EffectPlayer effectPlayer = EffectPlayer.Create(effectId, parent);
-        effectPlayer.onDestroy = OnEffectDestroy;
+        effectPlayer.onDestroy += OnEffectDestroy;
         if (effectPlayer != null)
         {
             effectDict[effectId].Add(effectPlayer);
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 00b4f8a..d2006d5 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -18,7 +18,7 @@
 
     public int round = 0;
 
-    public string guid = string.Empty;
+    public string guid = string.Empty;//绛変簬string.Empty鐨勬椂鍊欎唬琛ㄦ槸StoryBattleField 鏄富绾垮壇鏈�
 
     public int MapID = 0;
 
@@ -90,7 +90,7 @@
         guid = _guid;
     }
 
-    public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData, 
+    public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData,
         List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
     {
         MapID = _MapID;
@@ -108,7 +108,16 @@
         battleRootNodeGO.name = this.GetType().Name;
 
         battleObjMgr = new BattleObjMgr();
-        battleObjMgr.Init(this, redTeamList[redTeamIndex], blueTeamList[blueTeamIndex]);
+        if (blueTeamList == null)
+        {
+            battleObjMgr.Init(this, redTeamList[redTeamIndex], null);
+            battleObjMgr.HaveRest(BattleCamp.Red);
+        }
+        else
+        {
+            battleObjMgr.Init(this, redTeamList[redTeamIndex], blueTeamList[blueTeamIndex]);
+        }
+
         battleEffectMgr = new BattleEffectMgr();
         battleEffectMgr.Init(this);
         battleTweenMgr = new BattleTweenMgr();
@@ -206,7 +215,7 @@
         battleTweenMgr.PauseGame();
     }
 
-    public virtual void TurnFightState(int TurnNum, int State, 
+    public virtual void TurnFightState(int TurnNum, int State,
         uint FuncLineID, JsonData extendData)
     {
         round = TurnNum;
@@ -219,8 +228,37 @@
 
     public virtual void OnTurnFightState(int turnNum, int State, int FuncLineID, JsonData extendData)
     {
-        
+        //  鍒囨崲鍥炲悎
+        //  鏄瘡涓垬鏂楀紑濮�/姣忎釜鍥炲悎鐨勭涓�涓垬鏂楀寘
+        //  MapID = MapID
+
+        //  MapID;    // 鑷畾涔夊湴鍥綢D锛屽彲鐢ㄤ簬缁戝畾鎴樻枟鍦板浘鍦烘櫙鍔熻兘锛堝涓荤嚎鍏冲崱銆佷富绾縝oss銆佺埇濉斻�佺珵鎶�鍦虹瓑锛�
+        //  FuncLineID;    // MapID瀵瑰簲鐨勬墿灞曞�硷紝濡傚叿浣撴煇涓叧鍗$瓑  绔犺妭*10000+鍏冲崱缂栧彿*100+绗瑇娉紝濡傜涓�绔狅紝绗�10鍏冲崱鐨刡oss鍊� = 11001
+        //  State;    // 0-璧峰鐘舵�佹爣璁帮紱1-鍑嗗瀹屾瘯锛�2-鎴樻枟涓紱3-鎴樻枟缁撴潫锛�4-缁撶畻濂栧姳锛�5-缁撴潫鐘舵�佹爣璁�
+        //  TurnNum;    // 褰撳墠杞
+        //  Len;
+        //  Msg;    //size = Len   +
+
+        //  鍋氳〃鐜�
+        if (turnNum == 1)
+        {
+            if (State == 2)
+            {
+                Debug.Log("鎴樻枟寮�濮�");
+            }
+        }
+        else
+        {
+            Debug.Log("鎴樻枟鍥炲悎 : " + turnNum + "锛岀姸鎬� " + State);
+        }
+
+
+
+        // 鍋氫竴涓狝ction 閫氱煡UI缈讳笅鐗屽瓙 鐒跺悗缁撴潫Action
+        // TurnFightStateAction turnFightStateAction = new TurnFightStateAction(this, turnNum, State, FuncLineID, extendData);
+        // recordPlayer.PlayRecord(turnFightStateAction);
     }
+
 
     public void ObjInfoRefresh(H0418_tagObjInfoRefresh _refreshInfo)
     {
@@ -284,6 +322,17 @@
         }
     }
 
+    public RectTransform GetTeamNode(BattleCamp battleCamp, int index)
+    {
+        if (battleCamp == BattleCamp.Red)
+        {
+            return battleRootNode.redTeamNodeList[index].transform as RectTransform;
+        }
+        else
+        {
+            return battleRootNode.blueTeamNodeList[index].transform as RectTransform;
+        }
+    }
 
     public bool IsRoundReachLimit()
     {
@@ -303,4 +352,31 @@
             }
         }
     }
+
+    public void StartBattle(Action onMoveComplete)
+    {
+        List<BattleObject> redTeam = battleObjMgr.GetBattleObjList(BattleCamp.Red);
+
+        Tween tween = null;
+
+        foreach (var obj in redTeam)
+        {
+            obj.motionBase.PlayAnimation(MotionName.run, true);
+            RectTransform trans = obj.heroGo.transform as RectTransform;
+            tween = trans.DOMove(obj.GetAliasTeamNode().position, 0.5f).SetEase(Ease.Linear);
+            battleTweenMgr.OnPlayTween(tween);
+        }
+
+        tween.onComplete = () =>
+        {
+            foreach (var obj in redTeam)
+            {
+                obj.motionBase.PlayAnimation(MotionName.idle, true);
+            }
+
+            // 鎾斁鎴樻枟寮�濮嬬殑鐗规晥
+            var efplayer = battleEffectMgr.PlayEffect(0, BattleConst.BattleStartEffectID, battleRootNode.transform);
+            efplayer.onDestroy += a => onMoveComplete();
+        };
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
new file mode 100644
index 0000000..6d098f1
--- /dev/null
+++ b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
@@ -0,0 +1,39 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+public class BattleStartAction : RecordAction
+{
+	private bool isRun = false;
+
+	public BattleStartAction(BattleField _battleField, BattleObject _caster, H0604_tagUseSkillAttack vNetData)
+		: base(RecordActionType.BattleStart, _battleField, _caster)
+	{
+		
+	}
+
+	public override bool IsFinished()
+	{
+		return isFinish;
+	}
+
+
+    public override void Run()
+    {
+        base.Run();
+
+		if (isRun)
+			return;
+
+		//	闅愯棌閮ㄥ垎UI
+		EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, false);
+
+		battleField.StartBattle(() =>
+		{
+			isFinish = true;
+			// 瀹屾垚灏卞紑濮嬫樉绀篣I
+			EventBroadcast.Instance.Broadcast(EventName.DISPLAY_BATTLE_UI, battleField.guid, true);
+		});
+
+		isRun = true;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs.meta
index 9310e5e..d331651 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 6cc7c2a8cefccb64f93a1728173ffbae
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index 74ba476..0c11ba2 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -7,10 +7,10 @@
 
 	private bool isCast = false;
 
-	public SkillRecordAction(BattleField _battleField, BattleObject _caster, H0604_tagUseSkillAttack vNetData)
+	public SkillRecordAction(BattleField _battleField, BattleObject _caster, H0604_tagUseSkillAttack vNetData, List<GameNetPackBasic> packList)
 		: base(RecordActionType.Skill, _battleField, _caster)
 	{
-		skillBase = SkillFactory.CreateSkill(_caster, vNetData, _battleField);
+		skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
 	}
 
 	public override bool IsFinished()
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index 5697047..11e5d9e 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -17,25 +17,41 @@
         base.Init();
         // StartStoryBattle();
         logicUpdate.Start(Run);
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
     }
 
     public override void Release()
     {
         base.Release();
         logicUpdate.Destroy();
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
     }
 
-    public void CreateStoryBattle(int MapID, int FuncLineID, JsonData extendData, List<TeamBase> redTeamList, List<TeamBase> blueTeamList)
+    protected void OnPlayerLoginOk()
+    {
+        ulong exAttr1 = PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ExAttr1);
+        ulong exAttr2 = PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ExAttr2);
+
+        int MapID = 0;
+        int FuncLineID = (int)exAttr2;
+
+        CreateStoryBattle(MapID, FuncLineID, null, null);
+    }
+
+    //  涓婃父鎴忕殑鏃跺�� 绛夋垬鏂楅樀瀹规洿鏂板畬姣� 鍒涘缓涓荤嚎鍓湰 鏁屾柟鐨勬暟鎹彲浠ユ殏鏃朵笉鏄剧ず 宸辨柟琛ㄧ幇涓虹潯瑙�
+    //  濡傛灉涓荤嚎鍓湰瀛樺湪 閭d箞缁存寔褰撳墠鐨勫壇鏈笉鍙�
+    protected void CreateStoryBattle(int MapID, int FuncLineID, JsonData extendData, List<TeamBase> blueTeamList = null)
     {
         if (null == storyBattleField)
         {
             storyBattleField = new StoryBattleField();
+
+            storyBattleField.guid = string.Empty; // 涓荤嚎鍓湰鐨刧uid涓虹┖
+            var redTeamList = new List<TeamBase>();
+            redTeamList.Add(TeamManager.Instance.GetTeam(TeamType.Story));
+            storyBattleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList);
         }
-
-        storyBattleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList);
     }
-
-
 
     public void OnBattleClose(BattleField _battleField)
     {
@@ -43,7 +59,7 @@
     }
 
 
-#region 鎴柇缃戠粶娲惧彂鍖� 鍙敹鍏ュ綋鍓嶅寘鐨勫悗缁�
+#region 鎴柇缃戠粶娲惧彂鍖� 鍙敹鍏ュ綋鍓嶅寘鐨勫悗缁� b425鏄富绾跨殑 闈炰富绾跨殑鍖呭苟涓嶄細璧癰425
     private bool allow = true;
 
     private Queue<GameNetPackBasic> packQueue = new Queue<GameNetPackBasic>();
@@ -62,6 +78,10 @@
             else
             {
                 allow = true;
+
+                //  鍙戦�佹垬鎶ョ墖娈电粨鏉熷寘
+                AnalysisPackQueueAndDistribute();
+                
             }
         }
         else
@@ -75,12 +95,80 @@
         return allow;
     }
 
+    protected void AnalysisPackQueueAndDistribute()
+    {
+        List<GameNetPackBasic> packQueueSnapshot = new List<GameNetPackBasic>(packQueue);
+
+        List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>();
+
+        //  杩欓噷宸茬粡鏄寜鐓equeue鐨勯『搴忎簡
+        for (int i = 0; i < packQueueSnapshot.Count; i++)
+        {
+            GameNetPackBasic pack = packQueueSnapshot[i];
+
+            //  纰板埌B421 鎴柇 寰�涓嬫敹闆哹421閲岀殑鍏ㄩ儴鍐呭
+            if (pack is HB421_tagMCTurnFightObjAction)
+            {
+                HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction;
+
+                List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>();
+
+                i++;    //  璺宠繃褰撳墠鐨凚421鍖�
+
+                for (; i < packQueueSnapshot.Count; i++)
+                {
+                    GameNetPackBasic nextPack = packQueueSnapshot[i];
+                    if (nextPack is HB421_tagMCTurnFightObjAction)
+                    {
+                        // 閬囧埌浜嗗叾浠朆421 鍚姩瑙掕壊鐨凙ction寮�濮嬶紝
+                        // B421鍚庡啀纰板埌B421涓�瀹氭槸鏈変竴涓汉鐨勮鍔ㄧ粨鏉熶簡 鍥為��涓�涓綅缃�
+                        i--;
+                        break;
+                    }
+                    else
+                    {
+                        b421PackList.Add(nextPack);
+                    }
+                }
+
+                //  鍙兘娌$敤浜� 涓昏灏辨槸鍒╃敤涓�涓媠kill鐨刢ombine 鏆傜暀 鐪嬩箣鍚庤繕鏈夋病鏈夊埆鐨勯渶姹�
+                CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(GetGUID(b421Pack.packUID), b421PackList);
+
+                while (actionPack.actionPacks.Count > 0)
+                {
+                    GameNetPackBasic actionPackItem = actionPack.actionPacks.Dequeue();
+                    newPackList.Add(actionPackItem);
+                }
+            }
+            else
+            {
+                newPackList.Add(pack);
+            }
+        }
+
+
+        //  b421璺焍426鐨勫寘宸茬粡澶勭悊瀹屼簡
+        packQueue = new Queue<GameNetPackBasic>(newPackList);
+
+        DistributeNextPackage();
+    }
+
     public bool DistributeNextPackage()
     {
         if (packQueue.Count > 0)
         {
             GameNetPackBasic pack = packQueue.Dequeue();
-            PackageRegedit.Distribute(pack);
+
+            if (pack is CustomHB426CombinePack)
+            {
+                CustomHB426CombinePack combinePack = pack as CustomHB426CombinePack;
+                combinePack.Distribute();
+            }
+            else
+            {
+                PackageRegedit.Distribute(pack);
+            }
+
             return true;
         }
         else
@@ -191,15 +279,18 @@
             battleField.Destroy();
         }
 
-
-        battleField = BattleFieldFactory.CreateBattleField(guid, MapID, FuncLineID, extendData, redTeamList, blueTeamList);
+        if (string.IsNullOrEmpty(guid))
+        {
+            battleField = storyBattleField;
+        }
+        else
+        {
+            battleField = BattleFieldFactory.CreateBattleField(guid, MapID, FuncLineID, extendData, redTeamList, blueTeamList);
+        }
 
         battleFields.Add(guid, battleField);
 
-        if (string.Empty == guid)
-        {
-            storyBattleField = battleField as StoryBattleField;
-        }
+        battleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList);
 
         return battleField;
     }
diff --git a/Main/System/Battle/BattleObject/BattleObjMgr.cs b/Main/System/Battle/BattleObject/BattleObjMgr.cs
index 0141bdc..2999e0b 100644
--- a/Main/System/Battle/BattleObject/BattleObjMgr.cs
+++ b/Main/System/Battle/BattleObject/BattleObjMgr.cs
@@ -27,16 +27,21 @@
     protected void CreateTeam(List<GameObject> posNodeList, Dictionary<int, BattleObject> campDict, TeamBase teamBase, BattleCamp _Camp)
     {
         DestroyTeam(campDict);
-        for (int i = 0; i < teamBase.teamHeros.Length; i++)
+        if (teamBase == null)
         {
-            TeamHero teamHero = teamBase.teamHeros[i];
-            if (teamHero != null)
-            {
-                BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp);
-                allBattleObjDict.Add(battleObj.ObjID, battleObj);
-                campDict.Add(teamHero.positionNum, battleObj);
-            }
+            return;
         }
+
+        for (int i = 0; i < teamBase.serverHeroes.Length; i++)
+            {
+                TeamHero teamHero = teamBase.serverHeroes[i];
+                if (teamHero != null)
+                {
+                    BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp);
+                    allBattleObjDict.Add(battleObj.ObjID, battleObj);
+                    campDict.Add(teamHero.positionNum, battleObj);
+                }
+            }
     }
     
     public BattleObject GetBattleObject(int objId)
@@ -46,6 +51,18 @@
             return battleObj;
         }
         return null;
+    }
+
+    public List<BattleObject> GetBattleObjList(BattleCamp _Camp)
+    {
+        if (_Camp == BattleCamp.Red)
+        {
+            return redCampList;
+        }
+        else
+        {
+            return blueCampList;
+        }
     }
 
     public List<BattleObject> GetBattleObjList(H0604_tagUseSkillAttack tagUseSkillAttack)
@@ -78,6 +95,26 @@
 
     }
 
+    //  绌洪棽鐘舵��
+    public void HaveRest(BattleCamp _Camp)
+    {
+        //  浼戞伅鐘舵��
+        if (_Camp == BattleCamp.Red)
+        {
+            foreach (var item in redCampDict.Values)
+            {
+                item.HaveRest();
+            }
+        }
+        else
+        {
+            foreach (var item in blueCampDict.Values)
+            {
+                item.HaveRest();
+            }
+        }
+    }
+
     public void Release()
     {
         DestroyTeam(redCampDict);
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 00862e4..9aa12be 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -269,7 +269,7 @@
         heroGo.SetActive(false);
     }
 
-     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
+    // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
     protected virtual void PopDamage(long curHp, List<long> damageValues, int attackType)
     {
         //  鍏跺疄搴旇閫氱煡鍑哄幓缁橴I鐣岄潰瑙h�� 璁︰I鐣岄潰鑷繁鏉ユ樉绀虹殑 YYL TODO
@@ -294,6 +294,18 @@
         return battleField.GetTeamNode(Camp == BattleCamp.Red ? BattleCamp.Blue : BattleCamp.Red);
     }
 
+    public BattleCamp GetEnemyCamp()
+    {
+        return Camp == BattleCamp.Red ? BattleCamp.Blue : BattleCamp.Red;
+    }
+
+    public void HaveRest()
+    {
+        // YYL TODO
+        //  浼戞伅鐘舵��
+        //  澶氫竴涓獄zz鐨勪竴涓壒鏁�
+    }
+
 #if UNITY_EDITOR_STOP_USING
     public void EditorRevive()
     {
diff --git a/Main/System/Battle/Bullet/Bullet.cs b/Main/System/Battle/Bullet/Bullet.cs
deleted file mode 100644
index e9f9529..0000000
--- a/Main/System/Battle/Bullet/Bullet.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class Bullet
-{
-    protected BattleObject caster;
-
-    protected SkillConfig skillConfig;
-
-    protected List<H0604_tagUseSkillAttack.tagSkillHurtObj> hurtList;
-
-    protected BattleField battleField;
-
-    protected Action onComplete;
-
-
-    protected int curFrame = 0;
-
-
-    public Bullet(BattleObject _caster, SkillConfig skillConfig,
-        List<H0604_tagUseSkillAttack.tagSkillHurtObj> hurtList, BattleField battleField, Action _onComplete)
-    {
-        this.caster = _caster;
-        this.skillConfig = skillConfig;
-        this.hurtList = hurtList;
-        this.battleField = battleField;
-        this.onComplete = _onComplete;
-
-    }
-
-    public virtual void Start()
-    {
-
-    }
-    public virtual void Run()
-    {
-        
-    }
-
-    protected virtual void PlayEffect(int effectId, SkillEffectAnchor target)
-    {
-        // 杩橀渶瑕丼oAttackType鏉ュ垽鏂槸鎬庢牱鐨勭壒鏁�
-
-        switch (target)
-        {
-            //  鐗规晥鍏堜笉绠� TODO YYL 绛夌壒鏁堥噸鏂板啓杩囦竴閬嶅悗鍐嶅啓
-
-            case SkillEffectAnchor.Caster:
-                // caster.PlayEffect(effectId);
-                break;
-            case SkillEffectAnchor.Target:
-                // caster.teamHero.PlayEffectOnAllies(effectId);
-                break;
-            case SkillEffectAnchor.AlliesCenter:
-                // caster.teamHero.PlayEffectOnAlliesCenter(effectId);
-                break;
-            case SkillEffectAnchor.EnemiesCenter:
-                // caster.teamHero.PlayEffectOnEnemiesCenter(effectId);
-                break;
-            default:
-                Debug.LogWarning($"Unhandled effect target: {target}");
-                break;
-        }
-    }
-
-
-    protected virtual void PlayAudio(int audioId)
-    {
-        SoundPlayer.Instance.PlayUIAudio(audioId);
-    }
-
-    protected virtual void ShakeScreen(int intensity)
-    {
-        // Implement screen shaking logic here
-        Debug.Log($"Shaking screen with intensity: {intensity}");
-    }
-
-    protected virtual void PopDamage()
-    {
-
-    }
-
-    protected virtual void OnSkillComplete()
-    {
-        onComplete?.Invoke();
-    }
-    
-    protected virtual void PlaySkill(int skillId)
-    {
-        
-    }
-}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/Bullet.cs.meta b/Main/System/Battle/Bullet/Bullet.cs.meta
deleted file mode 100644
index 1765184..0000000
--- a/Main/System/Battle/Bullet/Bullet.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 8d4d5668dea0ef64da48bab26e795fac
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/Battle/Bullet/BulletFactory.cs b/Main/System/Battle/Bullet/BulletFactory.cs
deleted file mode 100644
index a776873..0000000
--- a/Main/System/Battle/Bullet/BulletFactory.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-public static class BulletFactory
-{
-    public static Bullet CreateBullet(BattleObject _caster, SkillConfig skillConfig, List<H0604_tagUseSkillAttack.tagSkillHurtObj> hurtList, BattleField battleField, Action _onComplete)
-    {
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/BulletFactory.cs.meta b/Main/System/Battle/Bullet/BulletFactory.cs.meta
deleted file mode 100644
index 8aa3b6e..0000000
--- a/Main/System/Battle/Bullet/BulletFactory.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: b007b1040446daf4db9c2a14b6d25b1d
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/Battle/Bullet/CloseCombatBullet.cs b/Main/System/Battle/Bullet/CloseCombatBullet.cs
deleted file mode 100644
index 90467cd..0000000
--- a/Main/System/Battle/Bullet/CloseCombatBullet.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-
-//	杩戞垬鏀诲嚮
-public class CloseCombatBullet : Bullet
-{
-
-	protected int keyFrameIndex = 0;
-
-	protected int frame = 0;
-
-	public CloseCombatBullet(BattleObject _caster, SkillConfig _skillConfig, List<H0604_tagUseSkillAttack.tagSkillHurtObj> _hurtList, BattleField _battleField, Action _onComplete)
-		: base(_caster, _skillConfig, _hurtList, _battleField, _onComplete)
-	{
-
-	}
-
-
-	public override void Start()
-	{
-		base.Start();
-
-		//	鐢╯killconfig.xp鏉ュ垽鏂笉淇濋櫓
-		MotionName motionName = GetMotionName(skillConfig.SkillMotionName);
-		caster.motionBase.PlayAnimation(motionName, false);
-	}
-
-	public MotionName GetMotionName(string strMotionName)
-	{
-		return Enum.Parse<MotionName>(strMotionName);
-	}
-
-
-	protected override void OnSkillComplete()
-	{
-		foreach (var hurtObj in hurtList)
-		{
-			BattleObject targetObj = battleField.battleObjMgr.GetBattleObject((int)hurtObj.ObjID);
-			if (targetObj != null)
-			{
-				long curHP = GeneralDefine.GetFactValue(hurtObj.CurHP, hurtObj.CurHPEx);
-				targetObj.teamHero.curHp = curHP;
-			}
-		}
-		base.OnSkillComplete();
-
-	}
-
-
-	protected override void PopDamage()
-	{
-		if (keyFrameIndex >= skillConfig.DamageDivide.Length)
-		{
-			Debug.LogError("CloseCombatBullet PopDamage keyFrameIndex out of range: " + keyFrameIndex);
-			return;
-		}
-
-		int[] tenKDamagePercentArray = skillConfig.DamageDivide[keyFrameIndex++];
-
-		foreach (var hurtObj in hurtList)
-		{
-			long factDamage = GeneralDefine.GetFactValue(hurtObj.HurtHP, hurtObj.HurtHPEx);
-			List<long> damageList = new List<long>();
-			for (int i = 0; i < tenKDamagePercentArray.Length; i++)
-			{
-				long damage = (long)(Mathf.Round(factDamage * tenKDamagePercentArray[i] / 10000.0f));
-				damageList.Add(damage);
-			}
-
-			BattleObject targetObj = battleField.battleObjMgr.GetBattleObject((int)hurtObj.ObjID);
-			if (targetObj != null)
-			{
-				//	鎾斁鍙楀嚮鍔ㄤ綔
-				targetObj.Hurt(damageList, hurtObj.AttackType);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/CloseCombatBullet.cs.meta b/Main/System/Battle/Bullet/CloseCombatBullet.cs.meta
deleted file mode 100644
index 12c6799..0000000
--- a/Main/System/Battle/Bullet/CloseCombatBullet.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: a21315aaaa6e8f6448f864298b4516c0
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs b/Main/System/Battle/Bullet/TrajectoryBullet.cs
deleted file mode 100644
index e69de29..0000000
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs
+++ /dev/null
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index e5dc60d..adcb575 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -125,6 +125,88 @@
 
         return currentTrackEntry;
     }
+
+    public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, Action onComplete = null, Action onBeginPhaseEnd = null, Action onActivePhaseEnd = null)
+    {
+        if (skillConfig == null)
+        {
+            Debug.LogError("鎶�鑳介厤缃负绌猴紝鏃犳硶鎾斁鎶�鑳藉姩鐢�");
+            return null;
+        }
+
+        return PlayAnimation(skillConfig.SkillMotionName, skillConfig.StartupFrames, skillConfig.ActiveFrames, skillConfig.LoopCount,
+            onComplete, onBeginPhaseEnd, onActivePhaseEnd);
+    }
+
+    public virtual Spine.TrackEntry PlayAnimation(
+            string animationName,
+            int loopBeginFrame,
+            int loopEndFrame,
+            int loopTimes,
+            Action _onComplete = null,
+            Action onBeginPhaseEnd = null,    // 鍓嶆憞缁撴潫鍥炶皟
+            Action onActivePhaseEnd = null    // 涓憞缁撴潫鍥炶皟
+        )
+    {
+        if (spineAnimationState == null || skeleton == null) return null;
+
+        var anim = skeleton.Data.FindAnimation(animationName);
+        if (anim == null) return null;
+
+        float fps = BattleConst.skillMotionFps;
+        float beginTime = loopBeginFrame / fps;
+        float endTime = loopEndFrame / fps;
+
+        currentTrackEntry = spineAnimationState.SetAnimation(0, anim, false);
+
+        int curLoop = 0;
+        bool finished = false;
+        bool beginPhaseTriggered = false;
+
+        Spine.Unity.UpdateBonesDelegate updateLocalHandler = null;
+        updateLocalHandler = (ISkeletonAnimation animated) =>
+        {
+            if (finished) return;
+            var entry = currentTrackEntry;
+            if (entry == null || entry.Animation != anim)
+            {
+                skeletonGraphic.UpdateLocal -= updateLocalHandler;
+                return;
+            }
+
+            // 鍓嶆憞缁撴潫锛堝彧瑙﹀彂涓�娆★級
+            if (!beginPhaseTriggered && entry.TrackTime >= beginTime)
+            {
+                beginPhaseTriggered = true;
+                onBeginPhaseEnd?.Invoke();
+            }
+
+            // 涓憞缁撴潫锛堟瘡娆″埌endTime閮借Е鍙戯級
+            if (entry.TrackTime >= endTime)
+            {
+                onActivePhaseEnd?.Invoke();
+
+                curLoop++;
+                if (curLoop >= loopTimes)
+                {
+                    finished = true;
+                    skeletonGraphic.UpdateLocal -= updateLocalHandler;
+                    _onComplete?.Invoke();
+                    return;
+                }
+                entry.TrackTime = beginTime;
+                beginPhaseTriggered = false; // 閲嶇疆锛屼笅涓�杞墠鎽囧彲鍐嶆瑙﹀彂
+            }
+        };
+        skeletonGraphic.UpdateLocal += updateLocalHandler;
+
+        if (_onComplete != null && currentTrackEntry != null)
+        {
+            trackEntryCompleteDict[currentTrackEntry] = _onComplete;
+        }
+
+        return currentTrackEntry;
+    }
     
     
     /// <summary>
@@ -166,7 +248,53 @@
             trackEntryCompleteDict.Remove(trackEntry);
         }
     }
-    
+
+
+    public void Test(string animationName, int beginFrame, int activeFrame, int endFrame, int activeFrameLoopCount)
+    {
+        // 瑕佸鐞嗗墠鎽嘼eginFrame 鍚庢憞endFrame 涓憞activeFrame
+
+        // 涓憞鏄湁澶氭鐨刟ctiveFrameLoopCount
+
+        var state = spineAnimationState;
+        var anim = skeleton.Data.FindAnimation(animationName);
+
+        // 璁惧畾浣犺寰幆鐨勫尯闂达紙鍗曚綅锛氱锛�
+        float loopStart = 0.5f;
+        float loopEnd = 1.2f;
+
+        // 鎾斁鍔ㄧ敾
+        state.SetAnimation(0, anim, true);
+        // state.GetCurrent(0).TrackTime = loopStart;
+
+        int curFrame = 0;
+
+        skeletonGraphic.UpdateLocal += (skeletonAnim) =>
+        {
+            // if (curFrame == beginFrame)
+            // {
+            //     OnBeginFrame?.Invoke();
+            // }
+            // else if (curFrame == activeFrame)
+            // {
+            //     OnActiveFrame?.Invoke();
+            // }
+            // else if (curFrame == endFrame)
+            // {
+            //     OnEndFrame?.Invoke();
+            // }
+            // var trackEntry = state.GetCurrent(0);
+            // if (trackEntry != null && trackEntry.Animation == anim)
+            // {
+            //     if (trackEntry.TrackTime > loopEnd)
+            //     {
+            //         // 鍥炲埌loopStart锛屽疄鐜板尯闂村惊鐜�
+            //         trackEntry.TrackTime = loopStart;
+            //     }
+            // }
+        };
+    }
+
 
     public virtual void Run()
     {
diff --git a/Main/System/Battle/RecordPlayer/RecordActionType.cs b/Main/System/Battle/RecordPlayer/RecordActionType.cs
index 413f658..4b0cbda 100644
--- a/Main/System/Battle/RecordPlayer/RecordActionType.cs
+++ b/Main/System/Battle/RecordPlayer/RecordActionType.cs
@@ -5,4 +5,6 @@
     Guard,//鏍兼尅
     Skill,//鎶�鑳�
     Death,//姝讳骸
+
+    BattleStart,//鎴樻枟寮�濮�
 }
diff --git a/Main/System/Battle/Skill/DirectlyDamageSkill.cs b/Main/System/Battle/Skill/DirectlyDamageSkill.cs
index 2b2bcdc..8499523 100644
--- a/Main/System/Battle/Skill/DirectlyDamageSkill.cs
+++ b/Main/System/Battle/Skill/DirectlyDamageSkill.cs
@@ -6,93 +6,79 @@
 
 public class DirectlyDamageSkill : SkillBase
 {
-	
-	public DirectlyDamageSkill(BattleObject _caster, SkillConfig _skillCfg,
-			H0604_tagUseSkillAttack vNetData, BattleField _battleField) : base(_caster, _skillCfg, vNetData, _battleField)
-	{
+	protected SkillEffect skillEffect;
 
+	public DirectlyDamageSkill(BattleObject _caster, SkillConfig _skillCfg,
+			H0604_tagUseSkillAttack _vNetData, List<GameNetPackBasic> _packList, BattleField _battleField)
+			: base(_caster, _skillCfg, _vNetData, _packList, _battleField)
+	{
+		foreach (var pack in packList)
+		{
+			Debug.LogError("directly damage skill pack type is " + pack.GetType());
+		}
 	}
 
 	public override void Run()
 	{
-		base.Run();
-
-	}
-
-    protected override void OnTriggerEvent(int triggerIndex, int triggerFrame)
-    {
-		if (0 == triggerIndex)
+		if (null != skillEffect)
 		{
-			List<BattleObject> targetList = GetTargetList();
-			//	瀛愮被瀹炵幇鍏蜂綋鐨勬妧鑳介�昏緫
-			SkillEffect effect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack);
-			if (null != effect)
-			{
-				//	濡傛灉鏄瓙寮圭被鍨嬬殑
-				effect.Play((hitIndex, hurList) =>
-				{
-					for (int i = 0; i < hurList.Count; i++)
-					{
-						var hurt = hurList[i];
-						BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-
-						List<long> damageList = new List<long>();
-						//	璁$畻浼ゅ 鍒嗘鐨勮瘽
-						if (hitIndex >= skillConfig.DamageDivide.Length)
-						{
-							Debug.LogError("DamageDivide鏈夐棶棰� 闇�瑕佹鏌� 鍙樉绀轰竴娈典激瀹� 鍙杢riggerFrames鐨�");
-							long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx) / (skillConfig.TriggerFrames.Length == 0 ? 1 : skillConfig.TriggerFrames.Length);
-							damageList.Add(totalDamage);
-						}
-						else
-						{
-							long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
-
-							if (hitIndex >= skillConfig.DamageDivide.Length)
-							{
-								int[] tenKDamagePercentArray = skillConfig.DamageDivide[hitIndex];
-								long factDamage = totalDamage;
-								for (int j = 0; j < tenKDamagePercentArray.Length; j++)
-								{
-									long damage = (long)(Mathf.Round(factDamage * tenKDamagePercentArray[j] / 10000.0f));
-									damageList.Add(damage);
-								}
-							}
-						}
-						target.Hurt(damageList, hurt.AttackType);
-					}
-				});
-			}
-        }
-	}
-
-	protected override void DoSkillLogic(Action _onComplete = null)
-	{
-		//	寮�濮嬭褰曞抚鏁�
-		startCounting = true;
-	}
-
-
-#if UNITY_EDITOR_STOP_USING
-	//	浼ゅ鍒楄〃鐞嗗簲鐢辨湇鍔″櫒鍙戠粰瀹㈡埛绔� 杩欒竟鍙仛绮楁祬妯℃嫙
-	public override List<Dictionary<int, List<int>>> GetDamageList(BattleField battleField)
-	{
-		List<Dictionary<int, List<int>>> damageList = new List<Dictionary<int, List<int>>>();
-
-		List<BattleObject> affectList = GetTargetList(battleField);
-
-		Dictionary<int, List<int>> oneRoundDamage = new Dictionary<int, List<int>>();
-
-		for (int j = 0; j < affectList.Count; j++)
-		{
-			BattleObject obj = affectList[j];
-			List<int> tryDmgList = caster.TryAttack(obj, skillConfig);
-			oneRoundDamage.Add(obj.ObjID, tryDmgList);
+			skillEffect.Run();
 		}
 
-		damageList.Add(oneRoundDamage);
-
-		return damageList;
+		base.Run();
 	}
-#endif
+
+
+	//	鎶�鑳藉姩鐢绘挱鏀惧畬姣�
+	protected override void DoSkillLogic(Action _onComplete = null)
+	{
+		// if (skillConfig.EffectId > 0)
+		// {
+		// 	// 鎾斁鎶�鑳界壒鏁�
+		// 	caster.battleField.battleEffectMgr.PlayEffect(
+		// 		caster.ObjID,
+		// 		skillConfig.EffectId,
+		// 		caster.heroGo.transform
+		// 	);
+		// }
+
+		_onComplete?.Invoke();
+	}
+
+	//	鍓嶆憞缁撴潫
+	protected override void OnStartSkillFrame()
+	{
+		skillEffect = SkillEffectFactory.CreateSkillEffect(
+				caster,
+				skillConfig,
+				tagUseSkillAttack
+			);
+		if (skillEffect != null)
+		{
+			skillEffect.Play(OnHitTargets);
+		}
+	}
+
+	protected override void OnHitTargets(int _hitIndex, List<H0604_tagUseSkillAttack.tagSkillHurtObj> hitList)
+	{
+		base.OnHitTargets(_hitIndex, hitList);
+    }
+
+	protected override void OnHitEachTarget(BattleObject target, List<long> damageList, ref H0604_tagUseSkillAttack.tagSkillHurtObj hurt)
+	{
+		base.OnHitEachTarget(target, damageList, ref hurt);
+	}
+
+
+	//  涓憞缁撴潫
+	protected override void OnActiveSkillFrame()
+	{
+		
+	}
+
+	//	鍚庢憞缁撴潫
+	protected override void OnEndSkillFrame()
+	{
+
+	}
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 71f78b2..64964ac 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -25,35 +25,41 @@
 
 	protected int curFrame = 0;
 
-	protected List<int> triggerFrames = new List<int>();
+	protected List<GameNetPackBasic> packList;
 
-	public SkillBase(BattleObject _caster, SkillConfig _skillCfg, H0604_tagUseSkillAttack vNetData, BattleField _battleField = null)
+	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;
 
-		triggerFrames.Clear();
-		triggerFrames.AddRange(skillConfig.TriggerFrames);
-	}
+	}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
 
 	public virtual void Run()
 	{
 		if (startCounting)
 		{
 			curFrame++;
-
-			if (triggerFrames.Contains(curFrame))
-			{
-				OnTriggerEvent(triggerFrames.IndexOf(curFrame), curFrame);
-			}
 		}
 	}
 
-	protected virtual void OnTriggerEvent(int triggerIndex, int triggerFrame)
+	protected virtual void OnActiveSkillFrame()
 	{
 
+	}
+
+	protected virtual void OnStartSkillFrame()
+	{
+
+	}
+
+	protected virtual void OnEndSkillFrame()
+	{
+		
 	}
 
 	public void Pause()
@@ -74,17 +80,33 @@
 		//	楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
 		HighLightAllTargets();
 
+		//	璺濈閰嶆垚璐熸暟瑕佽浆韬� TurnBack
+
 		switch (skillConfig.castMode)
 		{
-			case SkillCastMode.StandCast:
+			case SkillCastMode.Self:
 				PlayCastAnimation(() => DoSkillLogic(OnSkillFinished));
 				break;
-			case SkillCastMode.MoveToTarget:
-				MoveToTarget(_onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
+			case SkillCastMode.Enemy:
+				MoveToTarget(caster.GetEnemyCamp(), skillConfig.CastIndexNum, _onComplete: () => TurnBack(() => PlayCastAnimation(() => DoSkillLogic(() => { BackToOrigin(OnSkillFinished); }))));
 				break;
-			case SkillCastMode.DashCast:
-				DashToTarget(() => BackToOrigin(OnSkillFinished));
+			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;
@@ -92,73 +114,40 @@
 	}
 
 	//	鍐插埡鐨勬妧鑳� 鍔ㄤ綔 璺熺Щ鍔� 鏄悓鏃惰繘琛岀殑 绉诲姩鍒扮洰鏍囩殑涓�鐬棿灏辫杩涜鎶�鑳介�昏緫
-	protected void DashToTarget(Action _onComplete)
-	{
-		TrackEntry entry = PlayCastAnimation();
-		//	鍋氫竴涓井寰殑鎻愬墠
-		MoveToTarget(entry.TrackTime - 0.05f, () => DoSkillLogic(_onComplete));
-	}
+	// 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;
+	// 	}
 
-	protected void GetTargetNode()
-	{
-		targetNode = null;
+	// 	//	鍋氫竴涓井寰殑鎻愬墠
+	// 	MoveToTarget(mainTarget.Camp, mainTarget.teamHero.positionNum, entry.AnimationEnd - 0.05f, () => DoSkillLogic(_onComplete));
+	// }
 
-		if (skillConfig.castMode == SkillCastMode.StandCast)
-		{
-			//	鍘熷湴鏂芥硶
-			targetNode = caster.heroGo.transform as RectTransform;
-		}
-		else if (skillConfig.castMode == SkillCastMode.MoveToTarget || skillConfig.castMode == SkillCastMode.DashCast)
-		{
-			if (tagUseSkillAttack.AttackID <= 0)
-			{
-				Debug.LogError("鎶�鑳芥病鏈夋寚瀹氱洰鏍�");
-				return;
-			}
-
-			//	绉诲姩鍒扮洰鏍囦綅缃柦娉�
-			BattleObject _mainTarget = battleField.battleObjMgr.GetBattleObject((int)tagUseSkillAttack.AttackID);
-			if (_mainTarget == null)
-			{
-				Debug.LogError("鎶�鑳芥寚瀹氱殑鐩爣涓嶅瓨鍦�");
-				return;
-			}
-
-			targetNode = _mainTarget.heroGo.transform as RectTransform;
-		}
-		else if (skillConfig.castMode == SkillCastMode.MoveToFormation)
-		{
-			//	TODO YYL
-			targetNode = /*caster.GetEnemyTeamNode();*/ battleField.GetTeamNode(caster.Camp == BattleCamp.Blue ? BattleCamp.Red : BattleCamp.Blue);
-		}
-		else
-		{
-			Debug.LogError("鏈煡鐨勬柦娉曟柟寮� 鎶�鑳絠d锛�" + skillConfig.SkillID);
-			return;
-		}
-	}
-
-	protected List<BattleObject> GetTargetList()
-	{
-		return battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
-	}
-
+	//	杩欓噷鍏跺疄鏄妧鑳藉悗鎽囩粨鏉熺殑鍦版柟
 	protected virtual void DoSkillLogic(Action _onComplete = null)
 	{
-		//	瀛愮被瀹炵幇鍏蜂綋鐨勬妧鑳介�昏緫
+		
 	}
 
 	protected TrackEntry PlayCastAnimation(Action onComplete = null)
 	{
 		// 鎾斁鏂芥硶鍔ㄤ綔
-		MotionName motionName = skillConfig.GetMotionName();
-		TrackEntry trackEntry = caster.motionBase.PlayAnimation(motionName, false, onComplete);
-		return trackEntry;
+		return caster.motionBase.PlaySkillAnimation(skillConfig, onComplete,
+				OnStartSkillFrame,//鏀诲嚮鍓嶆憞缁撴潫
+				OnActiveSkillFrame);//鏀诲嚮涓憞缁撴潫
 	}
 
-	public void MoveToTarget(float duration = 0.2f, Action _onComplete = null)
+	public void MoveToTarget(BattleCamp camp, int index, float duration = 0.2f, Action _onComplete = null)
 	{
-		GetTargetNode();
+		// GetTargetNode();
+		targetNode = battleField.GetTeamNode(camp, index);
+
 		Vector2 offset = new Vector2(skillConfig.CastDistance, 0);
 		RectTransform selfRect = caster.heroGo.transform as RectTransform;
 		RectTransform targetRect = targetNode;
@@ -171,6 +160,7 @@
 	{
 		if (skillConfig.CastDistance < 0)
 		{
+			//	杞韩
 			caster.heroGo.transform.localScale = new Vector3(-1, 1, 1);
 		}
 		_onComplete?.Invoke();
@@ -184,6 +174,7 @@
 			.SetEase(Ease.Linear)
 			.OnComplete(() =>
 			{
+				//	杞垚姝g‘鏂瑰悜
 				caster.heroGo.transform.localScale = Vector3.one;
 				_onComplete?.Invoke();
 			});
@@ -203,6 +194,53 @@
 		//	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()
 	{
 		return isFinished;
@@ -217,21 +255,4 @@
 	{
 		isFinished = true;
 	}
-
-#if UNITY_EDITOR_STOP_USING
-	public virtual List<BattleObject> GetTargetList(BattleField _battleField)
-	{
-		SkillTargetType targetType = SkillTargetType.Enemy;
-		SkillTargetRangeType rangeType = SkillTargetRangeType.LowestHP;
-
-		List<BattleObject> affectList = _battleField.battleObjMgr.GetTargetList(caster, targetType, rangeType);
-		return affectList;
-	}
-
-	public virtual List<Dictionary<int, List<int>>> GetDamageList(BattleField _battleField)
-	{
-		Debug.LogError("SkillBase GetDamageList should be overridden by derived class");
-		return null;
-	}
-#endif
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillCastMode.cs b/Main/System/Battle/Skill/SkillCastMode.cs
index 26c8615..413fed4 100644
--- a/Main/System/Battle/Skill/SkillCastMode.cs
+++ b/Main/System/Battle/Skill/SkillCastMode.cs
@@ -2,8 +2,19 @@
 
 public enum SkillCastMode
 {
-    StandCast,      // 鍘熷湴閲婃斁
-    MoveToTarget,   // 璺戝埌鐩爣闈㈠墠閲婃斁鍐嶅洖鏉�
-    DashCast,       // 鍘熷湴鍔ㄤ綔浣嗚鑹蹭細鍐插埌鐩爣闈㈠墠
-    MoveToFormation, // 绉诲姩鍒伴樀瀹逛綅缃柦娉�
+    // 绉诲姩鍒扮殑浣嶇疆 CastPosition
+    // 1.鏁� 2.鎴� 3.鑷繁鐨勪綅缃�(鍘熷湴涓嶅姩) 4.鏁屾柟涓荤洰鏍�
+    // 鏁屾垜鐨勬墿灞� CastIndexNum
+    // 鍑犲彿浣�
+
+    None,
+
+    Enemy, //鏁�
+
+    Allies, //鎴�
+
+    Self,
+
+    Target,
+
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillEffectAnchor.cs b/Main/System/Battle/Skill/SkillEffectAnchor.cs
deleted file mode 100644
index b02a2a6..0000000
--- a/Main/System/Battle/Skill/SkillEffectAnchor.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-public enum SkillEffectAnchor
-{
-    Caster, //鍦ㄦ柦娉曡�呬笂
-    Target, //鍦ㄧ洰鏍囦笂
-    AlliesCenter,// 鍦ㄥ弸鏂逛腑蹇�
-    EnemiesCenter,// 鍦ㄦ晫鏂逛腑蹇�
-}
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillEffectAnchor.cs.meta b/Main/System/Battle/Skill/SkillEffectAnchor.cs.meta
deleted file mode 100644
index 7ab771c..0000000
--- a/Main/System/Battle/Skill/SkillEffectAnchor.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 8c9269b4bdb75f042b97225006214939
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/System/Battle/Skill/SkillEffectType.cs b/Main/System/Battle/Skill/SkillEffectType.cs
index a1d4ce0..b222da7 100644
--- a/Main/System/Battle/Skill/SkillEffectType.cs
+++ b/Main/System/Battle/Skill/SkillEffectType.cs
@@ -1,7 +1,10 @@
+
+
 public enum SkillEffectType
 {
-    Bullet, //  瀛愬脊绫诲瀷
-    Direct, // 鐩存帴浼ゅ
-    BuffEffect, //  Buff
-    StageEffect, // 鍦烘櫙鎶�
+    None,
+    Bullet,
+    Direct,
+    BuffEffect,
+    StageEffect,
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillEffectType.cs.meta b/Main/System/Battle/Skill/SkillEffectType.cs.meta
index d3332ba..188c502 100644
--- a/Main/System/Battle/Skill/SkillEffectType.cs.meta
+++ b/Main/System/Battle/Skill/SkillEffectType.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0e224e8034be71b4d8571bb3adba5ecf
+guid: cde6d4bfbadd30544972f057d02b37e9
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/Skill/SkillFactory.cs b/Main/System/Battle/Skill/SkillFactory.cs
index c9d0fa4..c1b284b 100644
--- a/Main/System/Battle/Skill/SkillFactory.cs
+++ b/Main/System/Battle/Skill/SkillFactory.cs
@@ -1,4 +1,5 @@
 
+using System.Collections.Generic;
 using UnityEngine;
 
 
@@ -40,7 +41,7 @@
 
 
 
-	public static SkillBase CreateSkill(BattleObject _caster, H0604_tagUseSkillAttack vNetData, BattleField battleField)
+	public static SkillBase CreateSkill(BattleObject _caster, H0604_tagUseSkillAttack vNetData, List<GameNetPackBasic> packList, BattleField battleField)
 	{
 		SkillConfig skillConfig = SkillConfig.Get(vNetData.SkillID);
 
@@ -49,7 +50,7 @@
 		{
 			case 1:
 				//	鍏堝疄鐜颁竴涓敾鍑荤殑 鍚庣画鏈夊啀鎱㈡參澧炲姞
-				skill = new DirectlyDamageSkill(_caster, skillConfig, vNetData, battleField);
+				skill = new DirectlyDamageSkill(_caster, skillConfig, vNetData, packList, battleField);
 				break;
 			case 2:
 				// skill = new DirectlyHealSkill(_skillConfig);
diff --git a/Main/System/Battle/SkillEffect/BulletCurve.meta b/Main/System/Battle/SkillEffect/BulletCurve.meta
new file mode 100644
index 0000000..a069560
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e629a2dca5d56a24daca10dac6956487
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
new file mode 100644
index 0000000..3a92a06
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BezierBulletCurve : BulletCurve
+{
+    private Vector2 start;
+    private Vector2 end;
+    private Vector2 control;
+
+    public BezierBulletCurve(BattleObject caster, SkillConfig skillConfig, EffectPlayer effectPlayer, RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+        : base(caster, skillConfig, effectPlayer, target, onHit) { }
+
+    public override void Reset()
+    {
+        base.Reset();
+        start = WorldToLocalAnchoredPosition(bulletTrans.position);
+        end = WorldToLocalAnchoredPosition(target.position);
+        control = (start + end) / 2 + Vector2.up * 100f;
+    }
+
+    public override void Run()
+    {
+        if (finished) return;
+        elapsed += Time.deltaTime;
+        float t = Mathf.Clamp01(elapsed / duration);
+        Vector2 pos = Mathf.Pow(1 - t, 2) * start + 2 * (1 - t) * t * control + Mathf.Pow(t, 2) * end;
+        bulletTrans.anchoredPosition = pos;
+
+        Vector2 tangent = 2 * (1 - t) * (control - start) + 2 * t * (end - control);
+        float angle = Mathf.Atan2(tangent.y, tangent.x) * Mathf.Rad2Deg - 90f;
+        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle);
+
+        if (t >= 1f)
+        {
+            finished = true;
+            onHit?.Invoke(0, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs.meta
index 9310e5e..87c4b1e 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BezierBulletCurve.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 143c64c0c71854347bb8249a0f1d3d61
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
new file mode 100644
index 0000000..772df81
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+/// <summary>
+/// 寮瑰皠鍨嬪瓙寮规洸绾匡細渚濇寮瑰皠鍒� HurtList 鐨勬瘡涓洰鏍囷紝姣忔寮瑰皠椋炶鏃堕棿鍥哄畾涓�0.2绉�
+/// </summary>
+public class BounceBulletCurve : BulletCurve
+{
+    private List<H0604_tagUseSkillAttack.tagSkillHurtObj> hurtList;
+    private int curIndex = 0;
+    private Vector2 start;
+    private Vector2 end;
+    private float bounceTime = 0.2f; // 姣忔寮瑰皠鏃堕棿
+    private float bounceElapsed = 0f;
+
+    public BounceBulletCurve(BattleObject caster, SkillConfig skillConfig, EffectPlayer effectPlayer,
+        RectTransform target, H0604_tagUseSkillAttack tagUseSkillAttack, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+        : base(caster, skillConfig, effectPlayer, target, onHit)
+    {
+        this.hurtList = new List<H0604_tagUseSkillAttack.tagSkillHurtObj>(tagUseSkillAttack.HurtList);
+    }
+
+    public override void Reset()
+    {
+        base.Reset();
+        curIndex = 0;
+        bounceElapsed = 0f;
+        if (hurtList.Count > 0)
+        {
+            start = WorldToLocalAnchoredPosition(bulletTrans.position);
+            end = WorldToLocalAnchoredPosition(target.position);
+        }
+    }
+
+    public override void Run()
+    {
+        if (finished || hurtList.Count == 0) return;
+
+        bounceElapsed += Time.deltaTime;
+        float t = Mathf.Clamp01(bounceElapsed / bounceTime);
+
+        Vector2 pos = Vector2.Lerp(start, end, t) + Vector2.up * Mathf.Sin(t * Mathf.PI) * 50f;
+        bulletTrans.anchoredPosition = pos;
+
+        Vector2 dir = end - start;
+        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f;
+        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle);
+
+        if (t >= 1f)
+        {
+            // 鍛戒腑褰撳墠鐩爣
+            onHit?.Invoke(curIndex, hurtList);
+
+            curIndex++;
+            if (curIndex >= hurtList.Count)
+            {
+                finished = true;
+                return;
+            }
+            // 涓嬩竴娈靛脊灏�
+            start = end;
+            var nextTargetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurtList[curIndex].ObjID);
+            if (nextTargetObj != null)
+            {
+                end = WorldToLocalAnchoredPosition(nextTargetObj.heroGo.transform.position);
+            }
+            else
+            {
+                Debug.LogError("寮瑰皠鎵句笉鍒颁笅涓�涓洰鏍�");
+                // 濡傛灉鐩爣涓㈠け锛岀洿鎺ョ敤涓婁竴涓猠nd
+                end = start;
+            }
+            bounceElapsed = 0f;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs.meta
index 9310e5e..9b3eb31 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BounceBulletCurve.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 4296c603d2e1eeb498af28d3d6ae3f7d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
new file mode 100644
index 0000000..b159e89
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BulletCurve
+{
+    protected BattleObject caster;
+    protected SkillConfig skillConfig;
+    protected EffectPlayer bulletEffect;
+    protected RectTransform bulletTrans; // 瀛愬脊鐨凴ectTransform
+    protected RectTransform target;
+    protected Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit;
+
+    protected bool finished = false;
+    protected float duration = 0f;
+    protected float elapsed = 0f;
+
+    public BulletCurve() { }
+
+    public BulletCurve(BattleObject caster, SkillConfig skillConfig, EffectPlayer bulletEffect, RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+    {
+        this.caster = caster;
+        this.skillConfig = skillConfig;
+        this.bulletEffect = bulletEffect;
+        this.target = target;
+        this.onHit = onHit;
+        this.bulletTrans = bulletEffect.transform as RectTransform;
+    }
+
+    public virtual void Reset()
+    {
+        finished = false;
+        elapsed = 0f;
+        duration = skillConfig.BulletFlyTime;
+    }
+
+    // 涓栫晫鍧愭爣杞负bulletTrans鐖惰妭鐐逛笅鐨勬湰鍦板潗鏍�
+    protected Vector2 WorldToLocalAnchoredPosition(Vector3 worldPos)
+    {
+        var parent = bulletTrans.parent as RectTransform;
+        Vector2 localPoint;
+        RectTransformUtility.ScreenPointToLocalPointInRectangle(parent, RectTransformUtility.WorldToScreenPoint(null, worldPos), null, out localPoint);
+        return localPoint;
+    }
+
+    // Run灏辨槸Update锛屾瘡甯ц皟鐢�
+    public virtual void Run()
+    {
+        if (finished) return;
+        Vector2 targetPos = WorldToLocalAnchoredPosition(target.position);
+        bulletTrans.anchoredPosition = targetPos;
+        ReachTarget();
+    }
+
+    protected virtual void ReachTarget()
+    {
+        finished = true;
+        onHit?.Invoke(0, null);
+        caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect);
+    }
+
+    public bool IsFinished => finished;
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs.meta
index 9310e5e..5bdb3a2 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 6fa6db282bea72441bbb2c13c6a353e3
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
new file mode 100644
index 0000000..e0f6863
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BulletCurveFactory
+{
+    // 1路鐩寸嚎娑堝け浜庣洰鏍�
+    // 2路鐩寸嚎璐┛娑堝け鍦ㄥ睆骞曞
+    // 3路鎶涚墿绾垮姬绾�
+    // 4路寮瑰皠
+    // 5路閫忔槑
+
+    public static BulletCurve CreateBulletCurve(
+        BattleObject caster,
+        SkillConfig skillConfig,
+        EffectPlayer bulletEffect,
+        RectTransform target,
+        H0604_tagUseSkillAttack tagUseSkillAttack,
+        Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+    {
+        switch (skillConfig.BulletPath)
+        {
+            case 1: // 鐩寸嚎娑堝け浜庣洰鏍�
+                return new StraightBulletCurve(caster, skillConfig, bulletEffect, target, onHit);
+            case 2: // 鐩寸嚎璐┛娑堝け鍦ㄥ睆骞曞
+                return new PenetrateBulletCurve(caster, skillConfig, bulletEffect, target, onHit);
+            case 3: // 鎶涚墿绾垮姬绾�
+                return new BezierBulletCurve(caster, skillConfig, bulletEffect, target, onHit);
+            case 4: // 寮瑰皠
+                return new BounceBulletCurve(caster, skillConfig, bulletEffect, target, tagUseSkillAttack,onHit);
+            default:
+                return new BulletCurve(caster, skillConfig, bulletEffect, target, onHit);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs.meta
index 9310e5e..5afd08c 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurveFactory.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 66b56fd690393d44a81cebd1ddb43506
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
new file mode 100644
index 0000000..e34200b
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class PenetrateBulletCurve : BulletCurve
+{
+    private Vector2 start;      // 瀛愬脊璧风偣锛堟湰鍦板潗鏍囷級
+    private Vector2 end;        // 鐩爣鐐癸紙鏈湴鍧愭爣锛�
+    private Vector2 outPos;     // 灞忓箷澶栧欢闀跨偣锛堟湰鍦板潗鏍囷級
+    private bool hitTriggered = false; // 鏄惁宸茶Е鍙憃nHit
+
+    public PenetrateBulletCurve(BattleObject caster, SkillConfig skillConfig, EffectPlayer effectPlayer, RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+        : base(caster, skillConfig, effectPlayer, target, onHit) { }
+
+    /// <summary>
+    /// 鍒濆鍖栧脊閬撳弬鏁�
+    /// </summary>
+    public override void Reset()
+    {
+        base.Reset();
+        hitTriggered = false;
+        start = WorldToLocalAnchoredPosition(bulletTrans.position);
+        end = WorldToLocalAnchoredPosition(target.position);
+        Vector2 dir = (end - start).normalized;
+        float extend = 500f; // 璐┛璺濈锛屽彲鏍规嵁闇�姹傝皟鏁�
+        outPos = end + dir * extend;
+    }
+
+    /// <summary>
+    /// 姣忓抚璋冪敤锛岄┍鍔ㄥ瓙寮圭Щ鍔ㄥ拰琛ㄧ幇
+    /// </summary>
+    public override void Run()
+    {
+        if (finished) return;
+        elapsed += Time.deltaTime;
+        float t = Mathf.Clamp01(elapsed / duration);
+
+        // 璐┛鍒嗕袱娈碉細0~0.5鍒扮洰鏍囩偣锛�0.5~1.0缁х画椋炲嚭
+        float mid = 0.5f;
+        Vector2 pos;
+        if (t < mid)
+        {
+            // 鍓嶅崐娈碉細鎻掑�煎埌鐩爣鐐�
+            pos = Vector2.Lerp(start, end, t / mid);
+        }
+        else
+        {
+            // 鍚庡崐娈碉細鎻掑�煎埌灞忓箷澶�
+            pos = Vector2.Lerp(end, outPos, (t - mid) / (1f - mid));
+            // 鍒拌揪鐩爣鐐圭灛闂磋Е鍙憃nHit锛屽彧瑙﹀彂涓�娆�
+            if (!hitTriggered)
+            {
+                hitTriggered = true;
+                onHit?.Invoke(0, null);
+            }
+        }
+        bulletTrans.anchoredPosition = pos;
+
+        // 鏃嬭浆锛氬缁堟湞鍚戣繍鍔ㄦ柟鍚戯紝瀛愬脊榛樿90掳鍚戜笂
+        Vector2 dir = (t < mid) ? (end - start) : (outPos - end);
+        float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90f;
+        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle);
+
+        // 鍒拌揪缁堢偣锛岀粨鏉�
+        if (t >= 1f)
+        {
+            finished = true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs.meta
index 9310e5e..bec27d2 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/PenetrateBulletCurve.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: d033c1638a667574bb58dd52f50f75ff
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
new file mode 100644
index 0000000..b21c5bc
--- /dev/null
+++ b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class StraightBulletCurve : BulletCurve
+{
+    private Vector2 start;
+    private Vector2 end;
+
+    public StraightBulletCurve(BattleObject caster, SkillConfig skillConfig, EffectPlayer bulletEffect, RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHit)
+        : base(caster, skillConfig, bulletEffect, target, onHit) { }
+
+    public override void Reset()
+    {
+        base.Reset();
+        start = WorldToLocalAnchoredPosition(bulletTrans.position);
+        end = WorldToLocalAnchoredPosition(target.position);
+    }
+
+    public override void Run()
+    {
+        if (finished) return;
+        elapsed += Time.deltaTime;
+        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 - 90f;
+        bulletTrans.localRotation = Quaternion.Euler(0, 0, angle);
+
+        if (t >= 1f)
+        {
+            finished = true;
+            onHit?.Invoke(0, null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs.meta
index 9310e5e..8d4956f 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/Battle/SkillEffect/BulletCurve/StraightBulletCurve.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: c29cc9a862a7b724f82ec4bbd0a4432d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index 3f42303..00dc173 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -11,6 +11,8 @@
     // protected BattleObject caster;
     // protected List<BattleObject> targets; // 鐩爣鍒楄〃
 
+    protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
+
     public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, H0604_tagUseSkillAttack _tagUseSkillAttack)
         : base(_skillConfig, _caster, _tagUseSkillAttack)
     {
@@ -21,80 +23,115 @@
 
     public override void Play(Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
     {
-        // Caster, //鍦ㄦ柦娉曡�呬笂
-        // Target, //鍦ㄧ洰鏍囦笂
-        // AlliesCenter,// 鍦ㄥ弸鏂逛腑蹇�
-        // EnemiesCenter,// 鍦ㄦ晫鏂逛腑蹇�
-
-        Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitFormation = (_hitIndex, _hurtList) =>
+        //  寮瑰皠 鍙﹀鐨勫仛娉曚簡
+        if (skillConfig.effectType == SkillEffectType.Bullet && skillConfig.BulletPath == 4)
         {
-            _onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
-        };
-
-        if (skillConfig.effectAnchor == SkillEffectAnchor.Caster)
-        {
-            // 涓嶅彲鑳藉瓙寮瑰皠鍚戣嚜宸卞惂
-            Debug.LogError("瀛愬脊鎶�鑳界壒鏁堜笉鑳介敋瀹氬湪鏂芥硶鑰呬笂 skillConfig.effectAnchor");
-            _onHit?.Invoke(0, default);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.Target)
-        {
-            if (tagUseSkillAttack == null || tagUseSkillAttack.HurtList.Length <= 0)
+            var hurt = tagUseSkillAttack.HurtList[0];
+            BattleObject targetObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+            if (targetObject == null)
             {
-                Debug.LogError("瀛愬脊鎶�鑳界壒鏁堟病鏈夌洰鏍� tagUseSkillAttack.HurtList.Length <= 0");
-                _onHit?.Invoke(0, default);
+                Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
                 return;
             }
-
-            foreach (var hurt in tagUseSkillAttack.HurtList)
-            {
-                BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-                if (target == null)
-                {
-                    Debug.LogError("瀛愬脊鎶�鑳界壒鏁堢洰鏍囦负绌� target == null ObjId : " + hurt.ObjID);
-                    continue;
-                }
-
-                ShotToTarget(target.heroGo.transform as RectTransform, (index, list) => _onHit(0, new List<H0604_tagUseSkillAttack.tagSkillHurtObj>() { hurt }));
-            }
+            ShotToTarget(targetObject, _onHit);
         }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.AlliesCenter)
-        {
-            ShotToTarget(caster.battleField.GetTeamNode(caster.Camp), onHitFormation);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.EnemiesCenter)
-        {
-            ShotToTarget(caster.battleField.GetTeamNode(caster.Camp == BattleCamp.Blue ? BattleCamp.Red : BattleCamp.Blue), onHitFormation);
-        }
+        //  鏅�氱殑鍋氭硶
         else
         {
-            Debug.LogError("鏈煡鐨勬妧鑳界壒鏁堥敋鐐圭被鍨�: " + skillConfig.effectAnchor);
+            Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitFormation = (_hitIndex, _hurtList) =>
+            {
+                _onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
+            };
+            switch (skillConfig.castMode)
+            {
+                case SkillCastMode.Self:
+                    onHitFormation?.Invoke(0, tagUseSkillAttack.HurtList.ToList());
+                    Debug.LogError("瀛愬脊鐨勭洰鏍囨槸鑷繁锛屾殏鏃朵笉鏀寔 鍗忓晢绋嬪簭瀹屾垚");
+                    break;
+                case SkillCastMode.Enemy:
+                    var targetNode = caster.battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig.CastIndexNum);
+                    ShotToFormation(targetNode, onHitFormation);
+                    break;
+                case SkillCastMode.Target:
+                    for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
+                    {
+                        var hurt = tagUseSkillAttack.HurtList[i];
+                        BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                        if (target == null)
+                        {
+                            Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                            continue;
+                        }
+
+                        ShotToTarget(target, _onHit);
+                    }
+                    break;
+                case SkillCastMode.Allies:
+                    var healNode = caster.battleField.GetTeamNode(caster.Camp, skillConfig.CastIndexNum);
+                    ShotToFormation(healNode, onHitFormation);
+                    break;
+                default:
+                    Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绋嬪簭 " + skillConfig.SkillID);
+                    break;
+            }
         }
     }
 
-    protected void ShotToTarget(RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
+    protected void ShotToFormation(RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
     {
-        EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.effectNode);
-
+        EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.effectNode);
 
         RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
-        var tween = BattleUtility.MoveToTarget(effectTrans, target, Vector2.zero, skillConfig.FlyTime, () =>
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
         {
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
-            _onHit?.Invoke(0, null);
+            _onHit?.Invoke(index, hitList);
 
-            //  鍑讳腑灏遍攢姣佸瓙寮�
-            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.EffectId, effectPlayer);
-            //  鎾斁瀛愬脊鐖嗙偢鐗规晥
-            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplotionEffectId, target);
+            // 鍑讳腑灏遍攢姣佸瓙寮�
+            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+            // 鎾斁瀛愬脊鐖嗙偢鐗规晥
+
+            foreach (var hurt in hitList)
+            {
+                BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                if (targetObj == null)
+                {
+                    Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                    continue;
+                }
+
+                caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform);
+            }
+
+            // caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffectId, target);
         });
 
-        caster.battleField.battleTweenMgr.OnPlayTween(tween);
+        bulletCurves.Add(bulletCurve);
+
+    }
+
+    protected void ShotToTarget(BattleObject target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
+    {
+        EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.effectNode);
+        RectTransform effectTrans = effectPlayer.transform as RectTransform;
+
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroGo.transform as RectTransform, tagUseSkillAttack, (index, hitList) =>
+        {
+            //  鍑讳腑灏遍攢姣佸瓙寮� 瀛愬脊涓嶉渶瑕佽嚜鍔ㄩ攢姣� 閰嶇疆琛ㄩ噷autoDestroy涓篺alse
+            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
+            _onHit?.Invoke(index, hitList);
+        });
+
+        bulletCurves.Add(bulletCurve);
     }
 
     public override void Run()
     {
-
+        foreach (var bulletCurve in bulletCurves)
+        {
+            if (!bulletCurve.IsFinished)
+                bulletCurve.Run();
+        }
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index d0e9a54..616eef4 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -14,70 +14,70 @@
     public NormalSkillEffect(SkillConfig _skillConfig, BattleObject _caster, H0604_tagUseSkillAttack _tagUseSkillAttack)
         : base(_skillConfig, _caster, _tagUseSkillAttack)
     {
-
+        
     }
 
 
     public override void Play(Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
     {
 
-        // 鐗规晥鐐稿紑鍦ㄩ樀瀹圭殑涓棿鐨勫洖璋�
-        Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitLineUpCenter = (_hitIndex, _hurtList) =>
-        {
-            _onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
-        };
+        // // 鐗规晥鐐稿紑鍦ㄩ樀瀹圭殑涓棿鐨勫洖璋�
+        // Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitLineUpCenter = (_hitIndex, _hurtList) =>
+        // {
+        //     _onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
+        // };
 
-        if (skillConfig.effectAnchor == SkillEffectAnchor.Caster)
-        {
-            CastInTarget(caster.heroGo.transform as RectTransform, onHitLineUpCenter);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.Target)
-        {
-            if (tagUseSkillAttack == null || tagUseSkillAttack.HurtList.Length <= 0)
-            {
-                Debug.LogError("娌℃湁鐩爣 tagUseSkillAttack.HurtList.Length <= 0");
-                _onHit?.Invoke(0, default);
-                return;
-            }
+        // if (skillConfig.effectAnchor == SkillEffectAnchor.Caster)
+        // {
+        //     CastInTarget(caster.heroGo.transform as RectTransform, onHitLineUpCenter);
+        // }
+        // else if (skillConfig.effectAnchor == SkillEffectAnchor.Target)
+        // {
+        //     if (tagUseSkillAttack == null || tagUseSkillAttack.HurtList.Length <= 0)
+        //     {
+        //         Debug.LogError("娌℃湁鐩爣 tagUseSkillAttack.HurtList.Length <= 0");
+        //         _onHit?.Invoke(0, default);
+        //         return;
+        //     }
 
-            foreach (var hurt in tagUseSkillAttack.HurtList)
-            {
-                BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-                if (target == null)
-                {
-                    Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
-                    continue;
-                }
+        //     foreach (var hurt in tagUseSkillAttack.HurtList)
+        //     {
+        //         BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+        //         if (target == null)
+        //         {
+        //             Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+        //             continue;
+        //         }
 
-                CastInTarget(target.heroGo.transform as RectTransform, (index, list) => _onHit(0, new List<H0604_tagUseSkillAttack.tagSkillHurtObj>() { hurt }));
-            }
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.AlliesCenter)
-        {
-            CastInTarget(caster.battleField.GetTeamNode(caster.Camp), onHitLineUpCenter);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.EnemiesCenter)
-        {
-            CastInTarget(caster.battleField.GetTeamNode(caster.Camp == BattleCamp.Blue ? BattleCamp.Red : BattleCamp.Blue), onHitLineUpCenter);
-        }
-        else
-        {
-            Debug.LogError("鏈煡鐨勬妧鑳界壒鏁堥敋鐐圭被鍨�: " + skillConfig.effectAnchor);
-        }
+        //         CastInTarget(target.heroGo.transform as RectTransform, (index, list) => _onHit(0, new List<H0604_tagUseSkillAttack.tagSkillHurtObj>() { hurt }));
+        //     }
+        // }
+        // else if (skillConfig.effectAnchor == SkillEffectAnchor.AlliesCenter)
+        // {
+        //     CastInTarget(caster.battleField.GetTeamNode(caster.Camp), onHitLineUpCenter);
+        // }
+        // else if (skillConfig.effectAnchor == SkillEffectAnchor.EnemiesCenter)
+        // {
+        //     CastInTarget(caster.battleField.GetTeamNode(caster.Camp == BattleCamp.Blue ? BattleCamp.Red : BattleCamp.Blue), onHitLineUpCenter);
+        // }
+        // else
+        // {
+        //     Debug.LogError("鏈煡鐨勬妧鑳界壒鏁堥敋鐐圭被鍨�: " + skillConfig.effectAnchor);
+        // }
     }
 
     protected void CastInTarget(RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
     {
-        EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.effectNode);
+        // EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.effectNode);
 
-        RectTransform effectTrans = effectPlayer.transform as RectTransform;
+        // RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
-        _onHit?.Invoke(0, null);
+        // _onHit?.Invoke(0, null);
 
-        //  閿�姣佽嚜韬笂鐨勭壒鏁堝簲璇ユ槸绛夌壒鏁堟挱鏀惧畬姣曚箣鍚�
-        // caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.EffectId, effectPlayer);
-        //  鎾斁鍙楀嚮鐗规晥
-        caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplotionEffectId, target);
+        // //  閿�姣佽嚜韬笂鐨勭壒鏁堝簲璇ユ槸绛夌壒鏁堟挱鏀惧畬姣曚箣鍚�
+        // // caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.EffectId, effectPlayer);
+        // //  鎾斁鍙楀嚮鐗规晥
+        // caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplotionEffectId, target);
 
     }
 
diff --git a/Main/System/Battle/SkillEffect/SkillEffect.cs b/Main/System/Battle/SkillEffect/SkillEffect.cs
index 9fb324f..348f020 100644
--- a/Main/System/Battle/SkillEffect/SkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -15,35 +15,10 @@
         tagUseSkillAttack = _tagUseSkillAttack;
     }
 
-    public Action OnHit; // 琛ㄧ幇鍒拌揪鐩爣鏃跺洖璋�
-
     //  
     public virtual void Play(Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
     {
-        // OnHit = _onHit;
-        // switch (skillConfig.effectType)
-        // {
-        //     case SkillEffectType.StageEffect:
-        //         Debug.LogError("鎾斁鍦烘櫙鐗规晥");
-        //         break;
-        //     case SkillEffectType.Bullet:
-        //         // 浼唬鐮侊細琛ㄧ幇瀛愬脊椋炶
-        //         Debug.Log("鎾斁瀛愬脊鐗规晥");
-        //         // 鍒拌揪鐩爣鏃�
-        //         OnHit?.Invoke();
-        //         break;
-        //     case SkillEffectType.Direct:
-        //         // 浼唬鐮侊細鐩存帴鍦ㄧ洰鏍囪韩涓婃挱鏀剧壒鏁�
-        //         Debug.Log("鎾斁鐩存帴鐗规晥");
-        //         OnHit?.Invoke();
-        //         break;
-        //     case SkillEffectType.BuffEffect:
-        //         // 浼唬鐮侊細鎾斁鎸佺画鐗规晥
-        //         Debug.Log("鎾斁Buff鐗规晥");
-        //         break;
-        //     default:
-        //         break;
-        // }
+
     }
 
     public virtual void Run()
diff --git a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
index ef959f3..bc4f710 100644
--- a/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffectFactory.cs
@@ -6,20 +6,20 @@
 {
     public static SkillEffect CreateSkillEffect(BattleObject caster, SkillConfig skillConfig, H0604_tagUseSkillAttack tagUseSkillAttack)
     {
-        switch (skillConfig.effectType)
-        {
-            case SkillEffectType.Bullet:
-                return new BulletSkillEffect(skillConfig, caster, tagUseSkillAttack);
-            case SkillEffectType.Direct:
-                return new NormalSkillEffect(skillConfig, caster, tagUseSkillAttack);
-            // case SkillEffectType.BuffEffect:
-            //     return new BuffSkillEffect(skillConfig, caster, targets);
-            // case SkillEffectType.StageEffect:
-            //     return new StageSkillEffect(skillConfig, caster, targets);
-            default:
-                UnityEngine.Debug.LogError("Unknown Skill Effect Type");
-                break;
-        }
+        // switch (skillConfig.effectType)
+        // {
+        //     case SkillEffectType.Bullet:
+        //         return new BulletSkillEffect(skillConfig, caster, tagUseSkillAttack);
+        //     case SkillEffectType.Direct:
+        //         return new NormalSkillEffect(skillConfig, caster, tagUseSkillAttack);
+        //     // case SkillEffectType.BuffEffect:
+        //     //     return new BuffSkillEffect(skillConfig, caster, targets);
+        //     // case SkillEffectType.StageEffect:
+        //     //     return new StageSkillEffect(skillConfig, caster, targets);
+        //     default:
+        //         UnityEngine.Debug.LogError("Unknown Skill Effect Type");
+        //         break;
+        // }
         return null;
     }
 }
\ No newline at end of file
diff --git a/Main/System/Hero/HeroFetterInfo.cs b/Main/System/Hero/HeroFetterInfo.cs
index 32612c6..2bab5c8 100644
--- a/Main/System/Hero/HeroFetterInfo.cs
+++ b/Main/System/Hero/HeroFetterInfo.cs
@@ -30,9 +30,9 @@
 
         int count = 0;
 
-        for (int i = 0; i < teamBase.teamHeros.Length; i++)
+        for (int i = 0; i < teamBase.serverHeroes.Length; i++)
         {
-            TeamHero teamHero = teamBase.teamHeros[i];
+            TeamHero teamHero = teamBase.serverHeroes[i];
 
             if (null == teamHero)
                 continue;
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index 3aff3c2..22e4249 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -887,23 +887,23 @@
 
     private void AddItemUseTypeDict(int id)
     {
-        SkillConfig skillConfig = GetSkillConfig(id);
-        int itemCount = GetItemCountByID(PackType.Item, id);
-        if (skillConfig != null && itemCount > 0)
-        {
-            if (!itemUseTypeDict.ContainsKey(skillConfig.SkillTypeID))
-            {
-                itemUseTypeDict.Add(skillConfig.SkillTypeID, id);
-            }
-            else
-            {
-                SkillConfig preSkillConfig = GetSkillConfig(itemUseTypeDict[skillConfig.SkillTypeID]);
-                if (skillConfig.SkillLV > preSkillConfig.SkillLV)
-                {
-                    itemUseTypeDict[skillConfig.SkillTypeID] = id;
-                }
-            }
-        }
+        // SkillConfig skillConfig = GetSkillConfig(id);
+        // int itemCount = GetItemCountByID(PackType.Item, id);
+        // if (skillConfig != null && itemCount > 0)
+        // {
+        //     if (!itemUseTypeDict.ContainsKey(skillConfig.SkillTypeID))
+        //     {
+        //         itemUseTypeDict.Add(skillConfig.SkillTypeID, id);
+        //     }
+        //     else
+        //     {
+        //         SkillConfig preSkillConfig = GetSkillConfig(itemUseTypeDict[skillConfig.SkillTypeID]);
+        //         if (skillConfig.SkillLV > preSkillConfig.SkillLV)
+        //         {
+        //             itemUseTypeDict[skillConfig.SkillTypeID] = id;
+        //         }
+        //     }
+        // }
     }
 
 
diff --git a/Main/System/MainLevel.meta b/Main/System/MainLevel.meta
new file mode 100644
index 0000000..984e3ba
--- /dev/null
+++ b/Main/System/MainLevel.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a02c6eff6ff37404ab5bdfb3357a7fa1
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/MainLevel/MainLevelManager.cs b/Main/System/MainLevel/MainLevelManager.cs
new file mode 100644
index 0000000..5b940f9
--- /dev/null
+++ b/Main/System/MainLevel/MainLevelManager.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using UnityEngine;
+using LitJson;
+
+
+public class MainLevelManager : GameSystemManager<MainLevelManager>
+{
+
+    public override void Init()
+    {
+        base.Init();
+    }
+
+    public override void Release()
+    {
+        base.Release();
+    }
+
+    
+	
+}
\ No newline at end of file
diff --git a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta b/Main/System/MainLevel/MainLevelManager.cs.meta
similarity index 83%
copy from Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
copy to Main/System/MainLevel/MainLevelManager.cs.meta
index 9310e5e..712fc99 100644
--- a/Main/System/Battle/Bullet/TrajectoryBullet.cs.meta
+++ b/Main/System/MainLevel/MainLevelManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3d40a22572b07c24e9eefb52db0bfd87
+guid: 8b71fdc64f650e34c972f50e1a10300f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Message/RichTableEvent.cs b/Main/System/Message/RichTableEvent.cs
index ec7423c..31e20ae 100644
--- a/Main/System/Message/RichTableEvent.cs
+++ b/Main/System/Message/RichTableEvent.cs
@@ -193,7 +193,7 @@
                                         var _cfg = SkillConfig.Get(_id);
                                         if (_cfg != null)
                                         {
-                                            return _cfg.BuffDescription;
+                                            return _cfg.Description;
                                         }
                                     }
                                 }
diff --git a/Main/System/Team/TeamBase.cs b/Main/System/Team/TeamBase.cs
index e22edc8..e0f4653 100644
--- a/Main/System/Team/TeamBase.cs
+++ b/Main/System/Team/TeamBase.cs
@@ -28,9 +28,9 @@
     private int ShapeType;
     public int ServerShapeType { get; private set; }
 
-    public TeamHero[] teamHeros = new TeamHero[TeamConst.MaxTeamHeroCount];
+    public TeamHero[] tempHeroes = new TeamHero[TeamConst.MaxTeamHeroCount];
 
-    public TeamHero[] serverData { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount];
+    public TeamHero[] serverHeroes { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount];
 
     public TeamBase(TeamType _teamType)
     {
@@ -49,12 +49,12 @@
 
         for (int i = 0; i < lineUp.ObjCnt; i++)
         {
-            if (i < teamHeros.Length)
+            if (i < tempHeroes.Length)
             {
                 var fightObj = lineUp.ObjList[i];
                 TeamHero hero = new TeamHero(fightObj, this);
-                teamHeros[fightObj.PosNum] = hero;
-                serverData[fightObj.PosNum] = hero;
+                tempHeroes[fightObj.PosNum] = hero;
+                serverHeroes[fightObj.PosNum] = hero;
             }
             else
             {
@@ -70,9 +70,9 @@
     public int GetTeamHeroCount()
     {
         int count = 0;
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] != null)
+            if (tempHeroes[i] != null)
             {
                 count++;
             }
@@ -83,7 +83,7 @@
 
     public bool IsFull()
     {
-        return GetTeamHeroCount() >= teamHeros.Length;
+        return GetTeamHeroCount() >= tempHeroes.Length;
     }
 
     public bool IsEmpty()
@@ -109,7 +109,7 @@
         savePack.PosCnt = (byte)GetTeamHeroCount();
         savePack.HeroPosList = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos[savePack.PosCnt];
 
-        foreach (var hero in teamHeros)
+        foreach (var hero in tempHeroes)
         {
             if (hero != null)
             {
@@ -160,7 +160,7 @@
 
         for (int i = 0; i < heroInfos.Count; i++)
         {
-            if (i < teamHeros.Length)
+            if (i < tempHeroes.Length)
             {
                 var heroInfo = heroInfos[i];
                 TeamHero hero = new TeamHero(heroInfo, i, this);
@@ -175,7 +175,7 @@
 
     public TeamHero GetHero(string guid)
     {
-        foreach (var hero in teamHeros)
+        foreach (var hero in tempHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -187,7 +187,7 @@
 
     public TeamHero GetServerHero(string guid)
     {
-        foreach (var hero in serverData)
+        foreach (var hero in serverHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -200,7 +200,7 @@
     //  甯冮樀鎺ュ彛
     public bool HasHero(string guid)
     {
-        foreach (var hero in teamHeros)
+        foreach (var hero in tempHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -212,9 +212,9 @@
 
     public int GetEmptyPosition()
     {
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] == null)
+            if (tempHeroes[i] == null)
             {
                 return i;
             }
@@ -225,25 +225,25 @@
     //  甯冮樀鎺ュ彛
     public void SetTeamHero(int posNum, TeamHero hero)
     {
-        teamHeros[posNum] = hero;
+        tempHeroes[posNum] = hero;
     }
 
     //  甯冮樀鎺ュ彛
     public void SetServerTeamHero(int posNum, TeamHero hero)
     {
-        serverData[posNum] = hero;
-        teamHeros[posNum] = hero;
+        serverHeroes[posNum] = hero;
+        tempHeroes[posNum] = hero;
     }
 
     public void AddHero(HeroInfo heroInfo, int targetPosition)
     {
-        if (targetPosition < 0 || targetPosition >= teamHeros.Length)
+        if (targetPosition < 0 || targetPosition >= tempHeroes.Length)
         {
             Debug.LogError("Invalid target position for adding hero.");
             return;
         }
 
-        TeamHero targetHero = teamHeros[targetPosition];
+        TeamHero targetHero = tempHeroes[targetPosition];
 
         if (null == targetHero)
         {
@@ -308,9 +308,9 @@
     {
         if (teamHero == null) return false;
 
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] != null && teamHeros[i].guid == teamHero.guid)
+            if (tempHeroes[i] != null && tempHeroes[i].guid == teamHero.guid)
             {
                 SetTeamHero(i, null);
                 return true; // Hero removed successfully
@@ -321,19 +321,19 @@
 
     public void SwapPosition(int index1, int index2)
     {
-        if (index1 < 0 || index1 >= teamHeros.Length || index2 < 0 || index2 >= teamHeros.Length)
+        if (index1 < 0 || index1 >= tempHeroes.Length || index2 < 0 || index2 >= tempHeroes.Length)
         {
             Debug.LogError("Invalid indices for swapping positions.");
             return;
         }
 
-        TeamHero temp = teamHeros[index1];
-        teamHeros[index1] = teamHeros[index2];
-        teamHeros[index2] = temp;
+        TeamHero temp = tempHeroes[index1];
+        tempHeroes[index1] = tempHeroes[index2];
+        tempHeroes[index2] = temp;
 
         //  鏇存柊浣嶇疆缂栧彿
-        if (teamHeros[index1] != null) teamHeros[index1].positionNum = index1;
-        if (teamHeros[index2] != null) teamHeros[index2].positionNum = index2;
+        if (tempHeroes[index1] != null) tempHeroes[index1].positionNum = index1;
+        if (tempHeroes[index2] != null) tempHeroes[index2].positionNum = index2;
     }
     
 }
\ No newline at end of file
diff --git a/Main/System/Team/TeamHero.cs b/Main/System/Team/TeamHero.cs
index 8117758..0e2a2cd 100644
--- a/Main/System/Team/TeamHero.cs
+++ b/Main/System/Team/TeamHero.cs
@@ -80,8 +80,8 @@
         positionNum = teamHero.positionNum;
         teamHero.positionNum = tempPosNum;
 
-        teamBase.teamHeros[positionNum] = this;
-        teamBase.teamHeros[teamHero.positionNum] = teamHero;
+        teamBase.tempHeroes[positionNum] = this;
+        teamBase.tempHeroes[teamHero.positionNum] = teamHero;
 
         Update();
     }
diff --git a/Main/System/Team/TeamManager.cs b/Main/System/Team/TeamManager.cs
index c32a199..9fe2403 100644
--- a/Main/System/Team/TeamManager.cs
+++ b/Main/System/Team/TeamManager.cs
@@ -35,30 +35,39 @@
 		//  鑻遍泟褰撳墠鎵�鏈夊湪鐨勯槦浼�
 		List<int> heroTeams = heroInfo.itemHero.GetUseData(81);
 
-		Dictionary<TeamType, KeyValuePair<int, int>> teamTypeShapeTypePositionDict = new Dictionary<TeamType, KeyValuePair<int, int>>();
-		foreach (var teamMsg in heroTeams)
-		{
-			// 鎵�鍦ㄩ樀瀹逛俊鎭垪琛� [闃靛绫诲瀷*10000+闃靛瀷绫诲瀷*100+浣嶇疆缂栧彿, ...] 
-			int teamType = teamMsg / 10000;
-			int shapeType = (teamMsg % 10000) / 100;
-			int positionIndex = teamMsg % 100;
 
-			if (teamTypeShapeTypePositionDict.ContainsKey((TeamType)teamType))
+		//  褰撳墠鑻遍泟鎵�鍦ㄧ殑闃熶紞淇℃伅 <闃熶紞绫诲瀷, <闃熷舰, 浣嶇疆>>
+		Dictionary<TeamType, KeyValuePair<int, int>> teamTypeShapeTypePositionDict = new Dictionary<TeamType, KeyValuePair<int, int>>();
+
+
+		//  澶勭悊褰撳墠璁板綍鍦ㄨ嫳闆勪俊鎭噷鐨勯槦浼嶄俊鎭�
+		if (null != heroTeams)
+		{
+			foreach (var teamMsg in heroTeams)
 			{
-				//  闃熶紞绫诲瀷鐩稿悓锛屾洿鏂伴樀鍨嬪拰浣嶇疆
-				Debug.LogError("褰撳墠鑻遍泟鎷ユ湁涓や釜鐩稿悓鐨勯槦浼嶄俊鎭�: " + teamType + " " + shapeType + " " + positionIndex + ", hero guid is " + heroInfo.itemHero.guid);
-			}
-			else
-			{
-				//  闃熶紞绫诲瀷涓嶅悓锛屾坊鍔犳柊鐨�
-				KeyValuePair<int, int> shapeTypePosition = new KeyValuePair<int, int>(shapeType, positionIndex);
-				teamTypeShapeTypePositionDict.Add((TeamType)teamType, shapeTypePosition);
+				// 鎵�鍦ㄩ樀瀹逛俊鎭垪琛� [闃靛绫诲瀷*10000+闃靛瀷绫诲瀷*100+浣嶇疆缂栧彿, ...] 
+				int teamType = teamMsg / 10000;
+				int shapeType = (teamMsg % 10000) / 100;
+				int positionIndex = teamMsg % 100;
+
+				if (teamTypeShapeTypePositionDict.ContainsKey((TeamType)teamType))
+				{
+					//  闃熶紞绫诲瀷鐩稿悓锛屾洿鏂伴樀鍨嬪拰浣嶇疆
+					Debug.LogError("褰撳墠鑻遍泟鎷ユ湁涓や釜鐩稿悓鐨勯槦浼嶄俊鎭�: " + teamType + " " + shapeType + " " + positionIndex + ", hero guid is " + heroInfo.itemHero.guid);
+				}
+				else
+				{
+					//  闃熶紞绫诲瀷涓嶅悓锛屾坊鍔犳柊鐨�
+					KeyValuePair<int, int> shapeTypePosition = new KeyValuePair<int, int>(shapeType, positionIndex);
+					teamTypeShapeTypePositionDict.Add((TeamType)teamType, shapeTypePosition);
+				}
 			}
 		}
 
+
 		//  閬嶅巻褰撳墠鎵�鏈夐槦浼� 鍒ゆ柇褰撳墠闃熶紞閲屾槸鍚︽湁璇ヨ嫳闆�
-		//  濡傛灉鏈夌殑璇� 璇诲彇涓�涓嬪綋鍓嶆槸鍚﹁鑻遍泟杩樺湪闃熶紞閲� 浣嶇疆鏄惁鍙戠敓鍙樺寲
-		//  鎴栬�呮槸闃靛瀷鍙戠敓鍙樺寲 鎴栬�呭崟绾殑鑻遍泟鍙戠敓鍙樺寲
+		//  濡傛灉鏈夌殑璇� 鏍规嵁鑻遍泟閲岀殑淇℃伅褰撳墠鏄惁璇ヨ嫳闆勮繕鍦ㄩ槦浼嶉噷 鏄惁鍙戠敓鍙樺寲
+		//  	=>1.闃靛瀷鍙戠敓鍙樺寲 2.浣嶇疆鍙戠敓鍙樺寲
 		//  濡傛灉娌℃湁鐨勮瘽 灏辫鏄庤鑻遍泟琚Щ鍑洪槦浼嶄簡
 		foreach (var team in teamDict.Values)
 		{

--
Gitblit v1.8.0