From eba494f9a050178f2f71f7bf2173a00a6fa32130 Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期三, 17 十月 2018 15:53:45 +0800
Subject: [PATCH] 3687 【1.2.0】天赋功能

---
 Core/GameEngine/Model/ConfigManager.cs                                                            |    2 
 Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs                          |   34 
 System/Skill/TalentModel.cs                                                                       |  491 ++++++++++++++
 System/Skill/TalentTreeScriptable.cs.meta                                                         |   12 
 Utility/EnumHelper.cs                                                                             |    1 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs      |   16 
 System/Skill/TalentModel.cs.meta                                                                  |   12 
 System/Skill/TalentWin.cs.meta                                                                    |   12 
 Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta           |    6 
 Core/GameEngine/Model/Config/TalentConfig.cs.meta                                                 |   12 
 Core/GameEngine/Model/Config/SkillConfig.cs                                                       |  433 ++++++------
 Core/GameEngine/DataToCtl/PackageRegedit.cs                                                       |    1 
 System/Skill/TalentSkillBehaviour.cs.meta                                                         |   12 
 Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs                                     |    1 
 System/Skill/TalentWin.cs                                                                         |  502 ++++++++++++++
 System/Skill/TalentTreeScriptable.cs                                                              |  201 +++++
 System/Skill/TalentSkillBehaviour.cs                                                              |   80 ++
 System/Skill/TalentSeriesBehaviour.cs.meta                                                        |   12 
 Core/GameEngine/Model/Config/TalentConfig.cs                                                      |   47 +
 System/Skill/TalentSeriesBehaviour.cs                                                             |   77 ++
 Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs                |   37 
 System/Skill/SkillPanel.cs                                                                        |   15 
 Core/GameEngine/Model/Player/PlayerDatas.cs                                                       |    3 
 Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs            |    2 
 System/WindowBase/ModelCenter.cs                                                                  |    1 
 Core/GameEngine/Model/Config/SkillConfig.cs.meta                                                  |    2 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta |   12 
 27 files changed, 1,786 insertions(+), 250 deletions(-)

diff --git a/Core/GameEngine/DataToCtl/PackageRegedit.cs b/Core/GameEngine/DataToCtl/PackageRegedit.cs
index 5fd7ca9..462b347 100644
--- a/Core/GameEngine/DataToCtl/PackageRegedit.cs
+++ b/Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -11,6 +11,7 @@
     public static void Init()
     {
         // 鐧昏鐩稿簲鐨勬暟鎹綋鍙婂搴旂殑鏁版嵁杞�昏緫绫�
+		Register(typeof(H0311_tagDeleteSkill), typeof(DTC0311_tagDeleteSkill));
 		Register(typeof(HB106_tagMCNotifyPlayerMove), typeof(DTCB106_tagMCNotifyPlayerMove));
         Register(typeof(H0132_tagCreateRoleSucess), typeof(DTC0132_tagCreateRoleSucess));
 		Register(typeof(HA326_tagMCNPCIDCollectionCntInfo), typeof(DTCA326_tagMCNPCIDCollectionCntInfo));
diff --git a/Core/GameEngine/Model/Config/SkillConfig.cs b/Core/GameEngine/Model/Config/SkillConfig.cs
index 89212d3..7d0fa88 100644
--- a/Core/GameEngine/Model/Config/SkillConfig.cs
+++ b/Core/GameEngine/Model/Config/SkillConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:			绗簩涓栫晫
-//    [  Date ]:		   Thursday, May 03, 2018
+//    [  Date ]:		   Wednesday, September 26, 2018
 //--------------------------------------------------------
 
 using UnityEngine;
@@ -11,77 +11,78 @@
     
 	public partial class SkillConfig : ConfigBase {
 
-		public int SkillID { get ; private set ; }
-		public string SkillName { get ; private set; } 
-		public int SkillTypeID { get ; private set ; }
-		public int SkillLV { get ; private set ; }
-		public int SkillMaxLV { get ; private set ; }
-		public int UseType { get ; private set ; }
-		public int FuncType { get ; private set ; }
-		public int CastTime { get ; private set ; }
-		public int SkillType { get ; private set ; }
-		public int HurtType { get ; private set ; }
-		public int ContinueUse { get ; private set ; }
-		public int AtkType { get ; private set ; }
-		public int AtkRadius { get ; private set ; }
-		public int Tag { get ; private set ; }
-		public int AtkDist { get ; private set ; }
-		public int StiffTime { get ; private set ; }
-		public int CoolDownTime { get ; private set ; }
-		public int MP { get ; private set ; }
-		public int HP { get ; private set ; }
-		public int XP { get ; private set ; }
-		public int UseItemID { get ; private set ; }
-		public int UseItemCount { get ; private set ; }
-		public int Effect1 { get ; private set ; }
-		public int EffectValue11 { get ; private set ; }
-		public int EffectValue12 { get ; private set ; }
-		public int EffectValue13 { get ; private set ; }
-		public int Effect2 { get ; private set ; }
-		public int EffectValue21 { get ; private set ; }
-		public int EffectValue22 { get ; private set ; }
-		public int EffectValue23 { get ; private set ; }
-		public int Effect3 { get ; private set ; }
-		public int EffectValue31 { get ; private set ; }
-		public int EffectValue32 { get ; private set ; }
-		public int EffectValue33 { get ; private set ; }
-		public int Effect4 { get ; private set ; }
-		public int EffectValue41 { get ; private set ; }
-		public int EffectValue42 { get ; private set ; }
-		public int EffectValue43 { get ; private set ; }
-		public int Effect5 { get ; private set ; }
-		public int EffectValue51 { get ; private set ; }
-		public int EffectValue52 { get ; private set ; }
-		public int EffectValue53 { get ; private set ; }
-		public int Effect6 { get ; private set ; }
-		public int EffectValue61 { get ; private set ; }
-		public int EffectValue62 { get ; private set ; }
-		public int EffectValue63 { get ; private set ; }
-		public int LearnSkillReq { get ; private set ; }
-		public int LearnSkillLV { get ; private set ; }
-		public int LearnLVReq { get ; private set ; }
-		public int FightPower { get ; private set ; }
-		public int LVUpCostMoneyType { get ; private set ; }
-		public int LVUpCostMoney { get ; private set ; }
-		public int LVUpCostExp { get ; private set ; }
-		public int ClientActionLimit { get ; private set ; }
-		public int ClientSkillSeriesLimit { get ; private set ; }
-		public int SkillOfSeries { get ; private set ; }
-		public int ExpendMPRate { get ; private set ; }
-		public int ExAttr1 { get ; private set ; }
-		public int ExAttr3 { get ; private set ; }
-		public int ExAttr4 { get ; private set ; }
-		public int ExAttr5 { get ; private set ; }
-		public int WarnInfo { get ; private set ; }
-		public int CtrlActionID { get ; private set ; }
-		public int BuffEffectID { get ; private set ; }
-		public int EffectName { get ; private set ; }
-		public string IconName { get ; private set; } 
-		public string SkillNameIcon { get ; private set; } 
-		public string Description { get ; private set; } 
-		public string BuffDescription { get ; private set; } 
-		public string Skillsource { get ; private set; } 
-		public int Skillactmark { get ; private set ; }
+		public int SkillID { get ; private set ; }
+		public string SkillName { get ; private set; } 
+		public int SkillTypeID { get ; private set ; }
+		public int SkillLV { get ; private set ; }
+		public int SkillMaxLV { get ; private set ; }
+		public int UseType { get ; private set ; }
+		public int FuncType { get ; private set ; }
+		public int CastTime { get ; private set ; }
+		public int SkillType { get ; private set ; }
+		public int HurtType { get ; private set ; }
+		public int ContinueUse { get ; private set ; }
+		public int AtkType { get ; private set ; }
+		public int AtkRadius { get ; private set ; }
+		public int Tag { get ; private set ; }
+		public int AtkDist { get ; private set ; }
+		public int StiffTime { get ; private set ; }
+		public int CoolDownTime { get ; private set ; }
+		public int MP { get ; private set ; }
+		public int HP { get ; private set ; }
+		public int XP { get ; private set ; }
+		public int UseItemID { get ; private set ; }
+		public int UseItemCount { get ; private set ; }
+		public int Effect1 { get ; private set ; }
+		public int EffectValue11 { get ; private set ; }
+		public int EffectValue12 { get ; private set ; }
+		public int EffectValue13 { get ; private set ; }
+		public int Effect2 { get ; private set ; }
+		public int EffectValue21 { get ; private set ; }
+		public int EffectValue22 { get ; private set ; }
+		public int EffectValue23 { get ; private set ; }
+		public int Effect3 { get ; private set ; }
+		public int EffectValue31 { get ; private set ; }
+		public int EffectValue32 { get ; private set ; }
+		public int EffectValue33 { get ; private set ; }
+		public int Effect4 { get ; private set ; }
+		public int EffectValue41 { get ; private set ; }
+		public int EffectValue42 { get ; private set ; }
+		public int EffectValue43 { get ; private set ; }
+		public int Effect5 { get ; private set ; }
+		public int EffectValue51 { get ; private set ; }
+		public int EffectValue52 { get ; private set ; }
+		public int EffectValue53 { get ; private set ; }
+		public int Effect6 { get ; private set ; }
+		public int EffectValue61 { get ; private set ; }
+		public int EffectValue62 { get ; private set ; }
+		public int EffectValue63 { get ; private set ; }
+		public int LearnSkillReq { get ; private set ; }
+		public int LearnSkillLV { get ; private set ; }
+		public int LearnLVReq { get ; private set ; }
+		public int LearnSkillPointReq { get ; private set ; }
+		public int FightPower { get ; private set ; }
+		public int LVUpCostMoneyType { get ; private set ; }
+		public int LVUpCostMoney { get ; private set ; }
+		public int LVUpCostExp { get ; private set ; }
+		public int ClientActionLimit { get ; private set ; }
+		public int ClientSkillSeriesLimit { get ; private set ; }
+		public int SkillOfSeries { get ; private set ; }
+		public int ExpendMPRate { get ; private set ; }
+		public int ExAttr1 { get ; private set ; }
+		public int ExAttr3 { get ; private set ; }
+		public int ExAttr4 { get ; private set ; }
+		public int ExAttr5 { get ; private set ; }
+		public int WarnInfo { get ; private set ; }
+		public int CtrlActionID { get ; private set ; }
+		public int BuffEffectID { get ; private set ; }
+		public int EffectName { get ; private set ; }
+		public string IconName { get ; private set; } 
+		public string SkillNameIcon { get ; private set; } 
+		public string Description { get ; private set; } 
+		public string BuffDescription { get ; private set; } 
+		public string Skillsource { get ; private set; } 
+		public int Skillactmark { get ; private set ; }
 		public int BuffDisplay { get ; private set ; }
 
 		public override string getKey()
@@ -92,149 +93,151 @@
 		public override void Parse() {
 			try
             {
-                SkillID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
-			
-				SkillName = rawContents[1].Trim();
-			
-				SkillTypeID=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0; 
-			
-				SkillLV=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0; 
-			
-				SkillMaxLV=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0; 
-			
-				UseType=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0; 
-			
-				FuncType=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0; 
-			
-				CastTime=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0; 
-			
-				SkillType=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0; 
-			
-				HurtType=IsNumeric(rawContents[9]) ? int.Parse(rawContents[9]):0; 
-			
-				ContinueUse=IsNumeric(rawContents[10]) ? int.Parse(rawContents[10]):0; 
-			
-				AtkType=IsNumeric(rawContents[11]) ? int.Parse(rawContents[11]):0; 
-			
-				AtkRadius=IsNumeric(rawContents[12]) ? int.Parse(rawContents[12]):0; 
-			
-				Tag=IsNumeric(rawContents[13]) ? int.Parse(rawContents[13]):0; 
-			
-				AtkDist=IsNumeric(rawContents[14]) ? int.Parse(rawContents[14]):0; 
-			
-				StiffTime=IsNumeric(rawContents[15]) ? int.Parse(rawContents[15]):0; 
-			
-				CoolDownTime=IsNumeric(rawContents[16]) ? int.Parse(rawContents[16]):0; 
-			
-				MP=IsNumeric(rawContents[17]) ? int.Parse(rawContents[17]):0; 
-			
-				HP=IsNumeric(rawContents[18]) ? int.Parse(rawContents[18]):0; 
-			
-				XP=IsNumeric(rawContents[19]) ? int.Parse(rawContents[19]):0; 
-			
-				UseItemID=IsNumeric(rawContents[20]) ? int.Parse(rawContents[20]):0; 
-			
-				UseItemCount=IsNumeric(rawContents[21]) ? int.Parse(rawContents[21]):0; 
-			
-				Effect1=IsNumeric(rawContents[22]) ? int.Parse(rawContents[22]):0; 
-			
-				EffectValue11=IsNumeric(rawContents[23]) ? int.Parse(rawContents[23]):0; 
-			
-				EffectValue12=IsNumeric(rawContents[24]) ? int.Parse(rawContents[24]):0; 
-			
-				EffectValue13=IsNumeric(rawContents[25]) ? int.Parse(rawContents[25]):0; 
-			
-				Effect2=IsNumeric(rawContents[26]) ? int.Parse(rawContents[26]):0; 
-			
-				EffectValue21=IsNumeric(rawContents[27]) ? int.Parse(rawContents[27]):0; 
-			
-				EffectValue22=IsNumeric(rawContents[28]) ? int.Parse(rawContents[28]):0; 
-			
-				EffectValue23=IsNumeric(rawContents[29]) ? int.Parse(rawContents[29]):0; 
-			
-				Effect3=IsNumeric(rawContents[30]) ? int.Parse(rawContents[30]):0; 
-			
-				EffectValue31=IsNumeric(rawContents[31]) ? int.Parse(rawContents[31]):0; 
-			
-				EffectValue32=IsNumeric(rawContents[32]) ? int.Parse(rawContents[32]):0; 
-			
-				EffectValue33=IsNumeric(rawContents[33]) ? int.Parse(rawContents[33]):0; 
-			
-				Effect4=IsNumeric(rawContents[34]) ? int.Parse(rawContents[34]):0; 
-			
-				EffectValue41=IsNumeric(rawContents[35]) ? int.Parse(rawContents[35]):0; 
-			
-				EffectValue42=IsNumeric(rawContents[36]) ? int.Parse(rawContents[36]):0; 
-			
-				EffectValue43=IsNumeric(rawContents[37]) ? int.Parse(rawContents[37]):0; 
-			
-				Effect5=IsNumeric(rawContents[38]) ? int.Parse(rawContents[38]):0; 
-			
-				EffectValue51=IsNumeric(rawContents[39]) ? int.Parse(rawContents[39]):0; 
-			
-				EffectValue52=IsNumeric(rawContents[40]) ? int.Parse(rawContents[40]):0; 
-			
-				EffectValue53=IsNumeric(rawContents[41]) ? int.Parse(rawContents[41]):0; 
-			
-				Effect6=IsNumeric(rawContents[42]) ? int.Parse(rawContents[42]):0; 
-			
-				EffectValue61=IsNumeric(rawContents[43]) ? int.Parse(rawContents[43]):0; 
-			
-				EffectValue62=IsNumeric(rawContents[44]) ? int.Parse(rawContents[44]):0; 
-			
-				EffectValue63=IsNumeric(rawContents[45]) ? int.Parse(rawContents[45]):0; 
-			
-				LearnSkillReq=IsNumeric(rawContents[46]) ? int.Parse(rawContents[46]):0; 
-			
-				LearnSkillLV=IsNumeric(rawContents[47]) ? int.Parse(rawContents[47]):0; 
-			
-				LearnLVReq=IsNumeric(rawContents[48]) ? int.Parse(rawContents[48]):0; 
-			
-				FightPower=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0; 
-			
-				LVUpCostMoneyType=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0; 
-			
-				LVUpCostMoney=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0; 
-			
-				LVUpCostExp=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0; 
-			
-				ClientActionLimit=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0; 
-			
-				ClientSkillSeriesLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0; 
-			
-				SkillOfSeries=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0; 
-			
-				ExpendMPRate=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0; 
-			
-				ExAttr1=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0; 
-			
-				ExAttr3=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0; 
-			
-				ExAttr4=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0; 
-			
-				ExAttr5=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0; 
-			
-				WarnInfo=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0; 
-			
-				CtrlActionID=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0; 
-			
-				BuffEffectID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0; 
-			
-				EffectName=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0; 
-			
-				IconName = rawContents[65].Trim();
-			
-				SkillNameIcon = rawContents[66].Trim();
-			
-				Description = rawContents[67].Trim();
-			
-				BuffDescription = rawContents[68].Trim();
-			
-				Skillsource = rawContents[69].Trim();
-			
-				Skillactmark=IsNumeric(rawContents[70]) ? int.Parse(rawContents[70]):0; 
-			
-				BuffDisplay=IsNumeric(rawContents[71]) ? int.Parse(rawContents[71]):0; 
+                SkillID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
+			
+				SkillName = rawContents[1].Trim();
+			
+				SkillTypeID=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0; 
+			
+				SkillLV=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0; 
+			
+				SkillMaxLV=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0; 
+			
+				UseType=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0; 
+			
+				FuncType=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0; 
+			
+				CastTime=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0; 
+			
+				SkillType=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0; 
+			
+				HurtType=IsNumeric(rawContents[9]) ? int.Parse(rawContents[9]):0; 
+			
+				ContinueUse=IsNumeric(rawContents[10]) ? int.Parse(rawContents[10]):0; 
+			
+				AtkType=IsNumeric(rawContents[11]) ? int.Parse(rawContents[11]):0; 
+			
+				AtkRadius=IsNumeric(rawContents[12]) ? int.Parse(rawContents[12]):0; 
+			
+				Tag=IsNumeric(rawContents[13]) ? int.Parse(rawContents[13]):0; 
+			
+				AtkDist=IsNumeric(rawContents[14]) ? int.Parse(rawContents[14]):0; 
+			
+				StiffTime=IsNumeric(rawContents[15]) ? int.Parse(rawContents[15]):0; 
+			
+				CoolDownTime=IsNumeric(rawContents[16]) ? int.Parse(rawContents[16]):0; 
+			
+				MP=IsNumeric(rawContents[17]) ? int.Parse(rawContents[17]):0; 
+			
+				HP=IsNumeric(rawContents[18]) ? int.Parse(rawContents[18]):0; 
+			
+				XP=IsNumeric(rawContents[19]) ? int.Parse(rawContents[19]):0; 
+			
+				UseItemID=IsNumeric(rawContents[20]) ? int.Parse(rawContents[20]):0; 
+			
+				UseItemCount=IsNumeric(rawContents[21]) ? int.Parse(rawContents[21]):0; 
+			
+				Effect1=IsNumeric(rawContents[22]) ? int.Parse(rawContents[22]):0; 
+			
+				EffectValue11=IsNumeric(rawContents[23]) ? int.Parse(rawContents[23]):0; 
+			
+				EffectValue12=IsNumeric(rawContents[24]) ? int.Parse(rawContents[24]):0; 
+			
+				EffectValue13=IsNumeric(rawContents[25]) ? int.Parse(rawContents[25]):0; 
+			
+				Effect2=IsNumeric(rawContents[26]) ? int.Parse(rawContents[26]):0; 
+			
+				EffectValue21=IsNumeric(rawContents[27]) ? int.Parse(rawContents[27]):0; 
+			
+				EffectValue22=IsNumeric(rawContents[28]) ? int.Parse(rawContents[28]):0; 
+			
+				EffectValue23=IsNumeric(rawContents[29]) ? int.Parse(rawContents[29]):0; 
+			
+				Effect3=IsNumeric(rawContents[30]) ? int.Parse(rawContents[30]):0; 
+			
+				EffectValue31=IsNumeric(rawContents[31]) ? int.Parse(rawContents[31]):0; 
+			
+				EffectValue32=IsNumeric(rawContents[32]) ? int.Parse(rawContents[32]):0; 
+			
+				EffectValue33=IsNumeric(rawContents[33]) ? int.Parse(rawContents[33]):0; 
+			
+				Effect4=IsNumeric(rawContents[34]) ? int.Parse(rawContents[34]):0; 
+			
+				EffectValue41=IsNumeric(rawContents[35]) ? int.Parse(rawContents[35]):0; 
+			
+				EffectValue42=IsNumeric(rawContents[36]) ? int.Parse(rawContents[36]):0; 
+			
+				EffectValue43=IsNumeric(rawContents[37]) ? int.Parse(rawContents[37]):0; 
+			
+				Effect5=IsNumeric(rawContents[38]) ? int.Parse(rawContents[38]):0; 
+			
+				EffectValue51=IsNumeric(rawContents[39]) ? int.Parse(rawContents[39]):0; 
+			
+				EffectValue52=IsNumeric(rawContents[40]) ? int.Parse(rawContents[40]):0; 
+			
+				EffectValue53=IsNumeric(rawContents[41]) ? int.Parse(rawContents[41]):0; 
+			
+				Effect6=IsNumeric(rawContents[42]) ? int.Parse(rawContents[42]):0; 
+			
+				EffectValue61=IsNumeric(rawContents[43]) ? int.Parse(rawContents[43]):0; 
+			
+				EffectValue62=IsNumeric(rawContents[44]) ? int.Parse(rawContents[44]):0; 
+			
+				EffectValue63=IsNumeric(rawContents[45]) ? int.Parse(rawContents[45]):0; 
+			
+				LearnSkillReq=IsNumeric(rawContents[46]) ? int.Parse(rawContents[46]):0; 
+			
+				LearnSkillLV=IsNumeric(rawContents[47]) ? int.Parse(rawContents[47]):0; 
+			
+				LearnLVReq=IsNumeric(rawContents[48]) ? int.Parse(rawContents[48]):0; 
+			
+				LearnSkillPointReq=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0; 
+			
+				FightPower=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0; 
+			
+				LVUpCostMoneyType=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0; 
+			
+				LVUpCostMoney=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0; 
+			
+				LVUpCostExp=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0; 
+			
+				ClientActionLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0; 
+			
+				ClientSkillSeriesLimit=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0; 
+			
+				SkillOfSeries=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0; 
+			
+				ExpendMPRate=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0; 
+			
+				ExAttr1=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0; 
+			
+				ExAttr3=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0; 
+			
+				ExAttr4=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0; 
+			
+				ExAttr5=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0; 
+			
+				WarnInfo=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0; 
+			
+				CtrlActionID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0; 
+			
+				BuffEffectID=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0; 
+			
+				EffectName=IsNumeric(rawContents[65]) ? int.Parse(rawContents[65]):0; 
+			
+				IconName = rawContents[66].Trim();
+			
+				SkillNameIcon = rawContents[67].Trim();
+			
+				Description = rawContents[68].Trim();
+			
+				BuffDescription = rawContents[69].Trim();
+			
+				Skillsource = rawContents[70].Trim();
+			
+				Skillactmark=IsNumeric(rawContents[71]) ? int.Parse(rawContents[71]):0; 
+			
+				BuffDisplay=IsNumeric(rawContents[72]) ? int.Parse(rawContents[72]):0; 
             }
             catch (Exception ex)
             {
diff --git a/Core/GameEngine/Model/Config/SkillConfig.cs.meta b/Core/GameEngine/Model/Config/SkillConfig.cs.meta
index dbc7ab1..40aff55 100644
--- a/Core/GameEngine/Model/Config/SkillConfig.cs.meta
+++ b/Core/GameEngine/Model/Config/SkillConfig.cs.meta
@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 guid: db393bd0ebb18b74e98ba16a7d19e7c6
-timeCreated: 1525345704
+timeCreated: 1537946131
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2
diff --git a/Core/GameEngine/Model/Config/TalentConfig.cs b/Core/GameEngine/Model/Config/TalentConfig.cs
new file mode 100644
index 0000000..fcb36a4
--- /dev/null
+++ b/Core/GameEngine/Model/Config/TalentConfig.cs
@@ -0,0 +1,47 @@
+锘�//--------------------------------------------------------
+//    [Author]:			绗簩涓栫晫
+//    [  Date ]:		   Thursday, October 11, 2018
+//--------------------------------------------------------
+
+using UnityEngine;
+using System;
+
+namespace TableConfig {
+
+    
+	public partial class TalentConfig : ConfigBase {
+
+		public int skillId { get ; private set ; }
+		public int type { get ; private set ; }
+		public int series { get ; private set ; }
+		public int order { get ; private set ; }
+
+		public override string getKey()
+        {
+            return skillId.ToString();
+        }
+
+		public override void Parse() {
+			try
+            {
+                skillId=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
+			
+				type=IsNumeric(rawContents[1]) ? int.Parse(rawContents[1]):0; 
+			
+				series=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0; 
+			
+				order=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0; 
+            }
+            catch (Exception ex)
+            {
+                DebugEx.Log(ex);
+            }
+		}
+	
+	}
+
+}
+
+
+
+
diff --git a/Core/GameEngine/Model/Config/TalentConfig.cs.meta b/Core/GameEngine/Model/Config/TalentConfig.cs.meta
new file mode 100644
index 0000000..7a8df78
--- /dev/null
+++ b/Core/GameEngine/Model/Config/TalentConfig.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 86eb4a564c7dcb047bb4509cf2e2758a
+timeCreated: 1539224901
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/GameEngine/Model/ConfigManager.cs b/Core/GameEngine/Model/ConfigManager.cs
index 968ad5c..dd6ad4b 100644
--- a/Core/GameEngine/Model/ConfigManager.cs
+++ b/Core/GameEngine/Model/ConfigManager.cs
@@ -199,7 +199,7 @@
         AddAsyncTask<DungeonSpecialStateTimeConfig>();
         AddAsyncTask<DailyQuestSpecialOpenTimeConfig>();
         AddAsyncTask<WHYJRewardConfig>();
-
+        AddAsyncTask<TalentConfig>();
         while (!AllCompleted())
         {
             var completedCount = 0;
diff --git a/Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs b/Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs
index c9324aa..da15ddb 100644
--- a/Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs
+++ b/Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs
@@ -57,4 +57,5 @@
     public int forbidenTalk;
     public int NpcHurtAddPer;//瀵规�墿浼ゅ鍔犳垚 188
     public int FunalHurtPer;//瀵规�墿浼ゅ鍔犳垚 189
+    public int talentPoint;//澶╄祴鐐规暟 190
 }
diff --git a/Core/GameEngine/Model/Player/PlayerDatas.cs b/Core/GameEngine/Model/Player/PlayerDatas.cs
index 22981f3..8ac6e40 100644
--- a/Core/GameEngine/Model/Player/PlayerDatas.cs
+++ b/Core/GameEngine/Model/Player/PlayerDatas.cs
@@ -737,6 +737,9 @@
             case PlayerDataRefresh.CDBPlayerRefresh_ForbidenTalk:
                 extersion.forbidenTalk = (int)value;
                 break;
+            case PlayerDataRefresh.CDBPlayerRefresh_TalentPoint:
+                extersion.talentPoint = (int)value;
+                break;
         }
     }
 
diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs
new file mode 100644
index 0000000..2b5b6eb
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs
@@ -0,0 +1,16 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 50 重置大师天赋技能 #tagCMResetMasterSkill

+

+public class CA550_tagCMResetMasterSkill : GameNetPackBasic {

+

+    public CA550_tagCMResetMasterSkill () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA550;

+    }

+

+    public override void WriteToBytes () {

+    }

+

+}

diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta
new file mode 100644
index 0000000..4e8f22a
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 34385181537277e42aecb5e9c8fbcb67
+timeCreated: 1537966668
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
index 4ab3a4a..af0faa5 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
@@ -41,7 +41,7 @@
 
 
         model.UpdateTreasurePotentialInfo(vNetData.OldSkillID, vNetData.NewSkillID);
-
+        ModelCenter.Instance.GetModel<TalentModel>().UpdateTalentSkill(vNetData.OldSkillID, vNetData.NewSkillID);
         if (vNetData != null)
         {
             //  horsemodel.MountSkill0310(vNetData.NewSkillID);
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs
index 77e119c..2d71f6a 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs
@@ -1,13 +1,24 @@
-锘縰sing UnityEngine;
-using System.Collections;
-
-/** 涓昏鍒犻櫎鎶�鑳� */
-public class DTC0311_tagDeleteSkill : DtcBasic {
-
-    /** 閲嶅啓鍩虹被鐨勬暟鎹寘杞�昏緫澶勭悊 */
-    public override void Done(GameNetPackBasic vNetPack)
-    {
-        base.Done(vNetPack);
-//        H0311_tagDeleteSkill vNetData = vNetPack as H0311_tagDeleteSkill;
-    }
-}
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Thursday, October 11, 2018
+//--------------------------------------------------------
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using Snxxz.UI;
+public class DTC0311_tagDeleteSkill : DtcBasic
+{
+
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        var package = vNetPack as H0311_tagDeleteSkill;
+        ModelCenter.Instance.GetModel<TalentModel>().DeleteTalentSkill((int)package.SkillID);
+    }
+
+}
+
+
+
+
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta
index 1d531ae..d17c5c3 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta
+++ b/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta
@@ -1,8 +1,12 @@
 fileFormatVersion: 2
-guid: 995d5419b5b880447917544b8c2cf104
+guid: f1409e1bfa7856e4d87922bed8509b8f
+timeCreated: 1539223309
+licenseType: Pro
 MonoImporter:
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
   icon: {instanceID: 0}
   userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs b/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs
index 4e8ad75..0bd6c55 100644
--- a/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs
+++ b/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs
@@ -1,17 +1,17 @@
-锘縰sing UnityEngine;
-using System.Collections;
-
-/** 涓昏鍒犻櫎鎶�鑳� */
-public class H0311_tagDeleteSkill : GameNetPackBasic {
-	
-	public int	SkillID;		
-	
-	public H0311_tagDeleteSkill () {
-		_cmd = (ushort)0x0311;
-	}
-	
-	/** 浠庡瓧鑺傚寘涓В鏋愪俊鎭� */
-	public override void ReadFromBytes (byte[] vBytes) {
-		TransBytes (out SkillID, vBytes, NetDataType.DWORD);		
-	}
-}
+using UnityEngine;
+using System.Collections;
+
+//03 11 主角删除技能#tagDeleteSkill

+

+public class H0311_tagDeleteSkill : GameNetPackBasic {

+    public uint SkillID;

+

+    public H0311_tagDeleteSkill () {

+        _cmd = (ushort)0x0311;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out SkillID, vBytes, NetDataType.DWORD);

+    }

+

+}

diff --git a/System/Skill/SkillPanel.cs b/System/Skill/SkillPanel.cs
index d5bd436..f013715 100644
--- a/System/Skill/SkillPanel.cs
+++ b/System/Skill/SkillPanel.cs
@@ -62,6 +62,15 @@
         private void OnTalentFunc()
         {
             CloseChild();
+            functionOrder = 2;
+            if (windowState == WindowState.Opened)
+            {
+                WindowCenter.Instance.OpenWithoutAnimation<TalentWin>();
+            }
+            else
+            {
+                WindowCenter.Instance.Open<TalentWin>();
+            }
         }
 
         private void OnAccordFunc()
@@ -83,7 +92,7 @@
         protected override void OnActived()
         {
             base.OnActived();
-            functionButtonTalent.state = TitleBtnState.Locked;
+            //functionButtonTalent.state = TitleBtnState.Locked;
 
             if (functionOrder == 0 && model.jumpToPass)
             {
@@ -126,6 +135,10 @@
             if (WindowCenter.Instance.IsOpen<SkillPassWin>()) {
                 WindowCenter.Instance.CloseImmediately<SkillPassWin>();
             }
+            if (WindowCenter.Instance.IsOpen<TalentWin>())
+            {
+                WindowCenter.Instance.CloseImmediately<TalentWin>();
+            }
         }
     }
 }
diff --git a/System/Skill/TalentModel.cs b/System/Skill/TalentModel.cs
new file mode 100644
index 0000000..0ed2b21
--- /dev/null
+++ b/System/Skill/TalentModel.cs
@@ -0,0 +1,491 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using TableConfig;
+using System;
+using System.Linq;
+
+namespace Snxxz.UI
+{
+    public class TalentModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize
+    {
+        Dictionary<int, TalentSkill> talentSkills = new Dictionary<int, TalentSkill>();
+        Dictionary<int, TalentTree> talentTreeDict = new Dictionary<int, TalentTree>();
+
+        int m_SelectSeries;
+        public int selectSeries
+        {
+            get { return m_SelectSeries; }
+            set
+            {
+                if (m_SelectSeries != value && selectSeriesEvent != null)
+                {
+                    m_SelectSeries = value;
+                    selectSeriesEvent();
+                }
+                m_SelectSeries = value;
+            }
+        }
+        int m_SelectTalentType;
+        public int selectTalentType
+        {
+            get { return m_SelectTalentType; }
+            set
+            {
+                if (m_SelectTalentType != value && selectTalentTypeEvnet != null)
+                {
+                    m_SelectTalentType = value;
+                    selectTalentTypeEvnet();
+                }
+                m_SelectTalentType = value;
+            }
+        }
+        int m_SelectSkill;
+        public int selectSkill
+        {
+            get { return m_SelectSkill; }
+            set
+            {
+                if (m_SelectSkill != value && selectSkillEvent != null)
+                {
+                    m_SelectSkill = value;
+                    selectSkillEvent();
+                }
+                m_SelectSkill = value;
+            }
+        }
+
+        bool serverInited = false;
+
+        public event Action selectTalentTypeEvnet;
+        public event Action selectSeriesEvent;
+        public event Action selectSkillEvent;
+        public event Action talentPointUpdate;
+        public event Action<int> talentSkillUpdate;
+
+        public override void Init()
+        {
+            ParseConfig();
+            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
+        }
+
+        public void OnBeforePlayerDataInitialize()
+        {
+            foreach (var talent in talentSkills.Values)
+            {
+                talent.level = 0;
+            }
+            serverInited = false;
+        }
+
+        public void OnPlayerLoginOk()
+        {
+            serverInited = true;
+            if (WindowCenter.Instance.IsOpen<TalentWin>())
+            {
+                foreach (var talent in talentSkills.Values)
+                {
+                    if (talentSkillUpdate != null)
+                    {
+                        talentSkillUpdate(talent.skillId);
+                    }
+                }
+            }
+            UpdateRedpoint();
+        }
+
+        public override void UnInit()
+        {
+            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+            PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
+        }
+
+        private void OnFuncStateChangeEvent(int _id)
+        {
+            if (_id == (int)FuncOpenEnum.Talent)
+            {
+                UpdateRedpoint();
+            }
+        }
+
+        public int talentResetBook { get; private set; }
+        public int talentResetBookCost { get; private set; }
+        Dictionary<int, List<int>> jobTalentTypeDict = new Dictionary<int, List<int>>();
+        void ParseConfig()
+        {
+            var configs = Config.Instance.GetAllValues<TalentConfig>();
+            for (int i = 0; i < configs.Count; i++)
+            {
+                var skillId = configs[i].skillId;
+                var skillConfig = Config.Instance.Get<SkillConfig>(skillId);
+                TalentSkill talent;
+                if (!TryGetTalent(skillConfig.SkillTypeID, out talent))
+                {
+                    talent = new TalentSkill(skillConfig.SkillTypeID, skillConfig.SkillMaxLV);
+                    talent.level = 0;
+                    talentSkills.Add(skillConfig.SkillTypeID, talent);
+
+                    TalentTree talentTree;
+                    if (!talentTreeDict.TryGetValue(skillConfig.UseType, out talentTree))
+                    {
+                        talentTree = new TalentTree();
+                        talentTreeDict.Add(skillConfig.UseType, talentTree);
+                    }
+                    talentTree.Add(configs[i], skillConfig.SkillTypeID);
+
+                    List<int> list = null;
+                    if (!jobTalentTypeDict.TryGetValue(skillConfig.UseType, out list))
+                    {
+                        list = new List<int>();
+                        jobTalentTypeDict.Add(skillConfig.UseType, list);
+                    }
+                    if (!list.Contains(configs[i].type))
+                    {
+                        list.Add(configs[i].type);
+                    }
+                }
+            }
+            var jobs = jobTalentTypeDict.Keys.ToList();
+            for (int i = 0; i < jobs.Count; i++)
+            {
+                var list = jobTalentTypeDict[jobs[i]];
+                list.Sort((x, y) =>
+                {
+                    return x.CompareTo(y);
+                });
+            }
+
+
+            var config = Config.Instance.Get<FuncConfigConfig>("TalentResetBook");
+            talentResetBook = int.Parse(config.Numerical1);
+            talentResetBookCost = int.Parse(config.Numerical2);
+        }
+
+        public int GetTalentType(int index)
+        {
+            var job = (int)Math.Pow(2, PlayerDatas.Instance.baseData.Job);
+            if (jobTalentTypeDict.ContainsKey(job))
+            {
+                var list = jobTalentTypeDict[job];
+                return index < list.Count ? list[index] : list[0];
+            }
+            return 1;
+        }
+
+        public int talentTypeCount
+        {
+            get
+            {
+                var job = (int)Math.Pow(2, PlayerDatas.Instance.baseData.Job);
+                if (jobTalentTypeDict.ContainsKey(job))
+                {
+                    var list = jobTalentTypeDict[job];
+                    return list.Count;
+                }
+                return 0;
+            }
+        }
+
+        public bool TryGetTalents(int job, int talentType, int talentSeries, out List<int> talents)
+        {
+            talents = null;
+            TalentTree talentTree = null;
+            var _job = (int)Math.Pow(2, job);
+            talentTreeDict.TryGetValue(_job, out talentTree);
+            if (null != talentTree)
+            {
+                return talentTree.TryGetTalents(talentType, talentSeries, out talents);
+            }
+            return false;
+        }
+
+        public bool TryGetTalent(int talentId, out TalentSkill talent)
+        {
+            return talentSkills.TryGetValue(talentId, out talent);
+        }
+
+        public int GetTalentTypePoint(int talentType)
+        {
+            var point = 0;
+            for (int i = 1; i <= 3; i++)
+            {
+                point += GetSeriesPoint(talentType, i);
+            }
+            return point;
+        }
+
+        public int GetSeriesPoint(int talentType,int talentSeries)
+        {
+            var job = PlayerDatas.Instance.baseData.Job;
+            List<int> list;
+            var point = 0;
+            if (TryGetTalents(job, talentType, talentSeries, out list))
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    TalentSkill talent;
+                    if (TryGetTalent(list[i], out talent))
+                    {
+                        point += talent.level;
+                    }
+                }
+            }
+            return point;
+        }
+
+        public bool SatisfyLevelUp(int talentId, out int error)
+        {
+            error = 0;
+            TalentSkill talent;
+            if (TryGetTalent(talentId, out talent))
+            {
+                if (talent.level >= talent.maxLevel)
+                {
+                    error = 1;
+                    return false;
+                }
+                if (talentPoint <= 0)
+                {
+                    error = 2;
+                    return false;
+                }
+                var talentConfig = talent.GetTalentConfig(talent.level + 1);
+                var skillConfig = talent.GetSkillConfig(talent.level + 1);
+                var requireSeriesPoint = skillConfig.RequireTalentSeriesPoint();
+                if (requireSeriesPoint != 0)
+                {
+                    var requireSeries = skillConfig.RequireTalentSeries();
+                    if (GetSeriesPoint(talentConfig.type, requireSeries) < requireSeriesPoint)
+                    {
+                        error = 3;
+                        return false;
+                    }
+                }
+                if (skillConfig.LearnSkillReq != 0)
+                {
+                    TalentSkill learnTalent;
+                    if (TryGetTalent(skillConfig.LearnSkillReq, out learnTalent))
+                    {
+                        if (learnTalent.level < skillConfig.LearnSkillLV)
+                        {
+                            error = 4;
+                            return false;
+                        }
+                    }
+                }
+            }
+            return true;
+        }
+
+        public void ProcessLevelUpError(int talentId, int error)
+        {
+            switch (error)
+            {
+                case 1:
+                    SysNotifyMgr.Instance.ShowTip("TalentHighestLevel");
+                    break;
+                case 2:
+                    SysNotifyMgr.Instance.ShowTip("LackTalentPoint");
+                    break;
+                case 3:
+                    SysNotifyMgr.Instance.ShowTip("LackTalentSeriesPoint");
+                    break;
+                case 4:
+                    SysNotifyMgr.Instance.ShowTip("PreTalentLevelLimit");
+                    break;
+            }
+        }
+
+        #region 鏈嶅姟绔暟鎹�
+        public int talentPoint { get { return PlayerDatas.Instance.extersion.talentPoint; } }
+
+        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh refreshType)
+        {
+            if (refreshType == PlayerDataRefresh.CDBPlayerRefresh_TalentPoint)
+            {
+                if (talentPointUpdate != null)
+                {
+                    talentPointUpdate();
+                }
+                UpdateRedpoint();
+            }
+        }
+
+        public void UpdateTalentSkill(int _oldSkillId, int _newSkillId)
+        {
+            var config = Config.Instance.Get<SkillConfig>(_newSkillId);
+            if (config == null)
+            {
+                return;
+            }
+            if (talentSkills.ContainsKey(config.SkillTypeID))
+            {
+                var talentSkill = talentSkills[config.SkillTypeID];
+                talentSkill.level = config.SkillLV;
+                if (talentSkillUpdate != null)
+                {
+                    talentSkillUpdate(config.SkillTypeID);
+                }
+            }
+        }
+
+        public void DeleteTalentSkill(int _skillId)
+        {
+            var config = Config.Instance.Get<SkillConfig>(_skillId);
+            if (config == null)
+            {
+                return;
+            }
+            if (talentSkills.ContainsKey(config.SkillTypeID))
+            {
+                var talentSkill = talentSkills[config.SkillTypeID];
+                talentSkill.level = 0;
+                if (talentSkillUpdate != null)
+                {
+                    talentSkillUpdate(config.SkillTypeID);
+                }
+            }
+        }
+        #endregion
+
+        #region 绾㈢偣
+        Redpoint talentRedpoint = new Redpoint(103, 10303);
+        void UpdateRedpoint()
+        {
+            talentRedpoint.state = RedPointState.None;
+            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Talent))
+            {
+                return;
+            }
+            if (talentPoint > 0)
+            {
+                talentRedpoint.state = RedPointState.Simple;
+            }
+        }
+        #endregion
+    }
+
+    public class TalentSkill
+    {
+        public int skillId { get; private set; }
+        public int level { get; set; }
+        public int maxLevel { get; private set; }
+
+        public TalentSkill(int skillId, int maxLevel)
+        {
+            this.skillId = skillId;
+            this.maxLevel = maxLevel;
+        }
+
+        public SkillConfig GetSkillConfig(int level = 0)
+        {
+            if (level > 0)
+            {
+                return Config.Instance.Get<SkillConfig>(skillId + level - 1);
+            }
+            else
+            {
+                return Config.Instance.Get<SkillConfig>(skillId + level);
+            }
+        }
+
+        public TalentConfig GetTalentConfig(int level = 0)
+        {
+            if (level > 0)
+            {
+                return Config.Instance.Get<TalentConfig>(skillId + level - 1);
+            }
+            else
+            {
+                return Config.Instance.Get<TalentConfig>(skillId + level);
+            }
+        }
+    }
+
+    public class TalentSeries
+    {
+        public int series { get; private set; }
+        public List<int> talentSkills { get; private set; }
+
+        public TalentSeries(int series)
+        {
+            this.series = series;
+            talentSkills = new List<int>();
+        }
+
+        public void Add(int skillId)
+        {
+            if (talentSkills.Contains(skillId))
+            {
+                return;
+            }
+            talentSkills.Add(skillId);
+        }
+    }
+
+    public class TalentTree
+    {
+        Dictionary<int, List<TalentSeries>> talentSeriesDict = new Dictionary<int, List<TalentSeries>>();
+
+        public void Add(TalentConfig config, int skillId)
+        {
+            List<TalentSeries> list = null;
+            if (!talentSeriesDict.TryGetValue(config.type, out list))
+            {
+                list = new List<TalentSeries>();
+                talentSeriesDict.Add(config.type, list);
+            }
+            TalentSeries talentSeries = list.Find((x) =>
+             {
+                 return x.series == config.series;
+             });
+            if (talentSeries == null)
+            {
+                talentSeries = new TalentSeries(config.series);
+                list.Add(talentSeries);
+            }
+            talentSeries.Add(skillId);
+        }
+
+        public bool TryGetTalents(int type, int series, out List<int> list)
+        {
+            list = null;
+            if (talentSeriesDict.ContainsKey(type))
+            {
+                var talentSeries = talentSeriesDict[type].Find((x) =>
+                 {
+                     return x.series == series;
+                 });
+                if (talentSeries != null)
+                {
+                    list = talentSeries.talentSkills;
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    public static class TalentHelper
+    {
+        public static int RequireTalentSeries(this SkillConfig config)
+        {
+            if (config == null)
+            {
+                return 0;
+            }
+            return config.LearnSkillPointReq / 10000;
+        }
+
+        public static int RequireTalentSeriesPoint(this SkillConfig config)
+        {
+            if (config == null)
+            {
+                return 0;
+            }
+            return config.LearnSkillPointReq % 10000;
+        }
+    }
+}
+
diff --git a/System/Skill/TalentModel.cs.meta b/System/Skill/TalentModel.cs.meta
new file mode 100644
index 0000000..9a50643
--- /dev/null
+++ b/System/Skill/TalentModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 94d2b0e6415910d47a88b77e252ec3a0
+timeCreated: 1532942625
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/Skill/TalentSeriesBehaviour.cs b/System/Skill/TalentSeriesBehaviour.cs
new file mode 100644
index 0000000..08b5d54
--- /dev/null
+++ b/System/Skill/TalentSeriesBehaviour.cs
@@ -0,0 +1,77 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+    public class TalentSeriesBehaviour : MonoBehaviour
+    {
+        [SerializeField] int talentSeries = 0;
+        [SerializeField] Button m_Button;
+        [SerializeField] Image m_Icon;
+        [SerializeField] Text m_TalentType;
+        [SerializeField] Text m_TalentPoint;
+        [SerializeField] RectTransform m_ContainerSelect;
+
+        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
+
+        private void Awake()
+        {
+            m_Button.onClick.AddListener(SelectSeries);
+        }
+
+        private void SelectSeries()
+        {
+            if (talentSeries != 0)
+            {
+                model.selectSeries = talentSeries;
+            }
+        }
+
+        public void Display()
+        {
+            m_ContainerSelect.gameObject.SetActive(talentSeries == model.selectSeries);
+            m_TalentType.text = Language.Get(StringUtility.Contact("TalentBtnSeries_", talentSeries));
+
+            DisplayTalentPoint();
+
+            model.selectSeriesEvent -= OnSelectSeriesEvent;
+            model.selectSeriesEvent += OnSelectSeriesEvent;
+            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
+            model.selectTalentTypeEvnet += OnSelectTalentTypeEvnet;
+            model.talentSkillUpdate -= TalentSkillUpdate;
+            model.talentSkillUpdate += TalentSkillUpdate;
+        }
+
+        void DisplayTalentPoint()
+        {
+            var point = model.GetSeriesPoint(model.selectTalentType, talentSeries);
+            m_TalentPoint.text = StringUtility.Contact("锛�", point, "锛�");
+        }
+
+        public void Dispose()
+        {
+            model.selectSeriesEvent -= OnSelectSeriesEvent;
+            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
+            model.talentSkillUpdate -= TalentSkillUpdate;
+        }
+
+        private void TalentSkillUpdate(int skillId)
+        {
+            DisplayTalentPoint();
+        }
+
+        private void OnSelectSeriesEvent()
+        {
+            m_ContainerSelect.gameObject.SetActive(talentSeries == model.selectSeries);
+        }
+
+        private void OnSelectTalentTypeEvnet()
+        {
+            DisplayTalentPoint();
+        }
+    }
+}
+
diff --git a/System/Skill/TalentSeriesBehaviour.cs.meta b/System/Skill/TalentSeriesBehaviour.cs.meta
new file mode 100644
index 0000000..6b69afe
--- /dev/null
+++ b/System/Skill/TalentSeriesBehaviour.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 44434ba8a44224c408afd5e00a00f571
+timeCreated: 1533004940
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/Skill/TalentSkillBehaviour.cs b/System/Skill/TalentSkillBehaviour.cs
new file mode 100644
index 0000000..5a56986
--- /dev/null
+++ b/System/Skill/TalentSkillBehaviour.cs
@@ -0,0 +1,80 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using TableConfig;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+    public class TalentSkillBehaviour : MonoBehaviour
+    {
+        [SerializeField] Image m_Icon;
+        [SerializeField] Text m_Level;
+        [SerializeField] Button m_Button;
+        [SerializeField] RectTransform m_ContainerSelect;
+
+        int skillId = 0;
+
+        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
+
+        private void Awake()
+        {
+            m_Button.onClick.AddListener(SelectSkill);
+        }
+
+        public void Display(int _skillId)
+        {
+            skillId = _skillId;
+            model.talentSkillUpdate -= TalentSkillUpdate;
+            model.talentSkillUpdate += TalentSkillUpdate;
+            model.selectSkillEvent -= OnSelectSkillEvent;
+            model.selectSkillEvent += OnSelectSkillEvent;
+            Display();
+        }
+
+        private void Display()
+        {
+            TalentSkill talent;
+            if (model.TryGetTalent(skillId, out talent))
+            {
+                var config = Config.Instance.Get<SkillConfig>(talent.skillId);
+                if (config != null)
+                {
+                    m_Icon.SetSprite(config.IconName);
+                }
+                m_Level.text = StringUtility.Contact(talent.level, "/", talent.maxLevel);
+                m_Icon.material = talent.level > 0 ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
+                m_ContainerSelect.gameObject.SetActive(skillId == model.selectSkill);
+            }
+        }
+
+        private void TalentSkillUpdate(int _skillid)
+        {
+            if (skillId == _skillid)
+            {
+                Display();
+            }
+        }
+
+        private void OnSelectSkillEvent()
+        {
+            m_ContainerSelect.gameObject.SetActive(skillId == model.selectSkill);
+        }
+
+        public void Dispose()
+        {
+            model.talentSkillUpdate -= TalentSkillUpdate;
+            model.selectSkillEvent -= OnSelectSkillEvent;
+        }
+
+        private void SelectSkill()
+        {
+            if (skillId != 0)
+            {
+                model.selectSkill = skillId;
+            }
+        }
+    }
+}
+
diff --git a/System/Skill/TalentSkillBehaviour.cs.meta b/System/Skill/TalentSkillBehaviour.cs.meta
new file mode 100644
index 0000000..71fa0e2
--- /dev/null
+++ b/System/Skill/TalentSkillBehaviour.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5359bc88b0bc7cd439412a99efda7dbb
+timeCreated: 1533007965
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/Skill/TalentTreeScriptable.cs b/System/Skill/TalentTreeScriptable.cs
new file mode 100644
index 0000000..c41e745
--- /dev/null
+++ b/System/Skill/TalentTreeScriptable.cs
@@ -0,0 +1,201 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+namespace Snxxz.UI
+{
+    public class TalentTreeScriptable : ScriptableObject
+    {
+        [SerializeField] TalentTree talentTrees;
+        [SerializeField] Vector2 m_ContentSizeDelta;
+        [SerializeField] List<TalentElement> skillElements;
+        [SerializeField] List<ArrowElement> arrowElements;
+
+        public Vector2 contentSizeDelta
+        {
+            get { return m_ContentSizeDelta; }
+        }
+
+        public int arrowCount
+        {
+            get { return arrowElements == null ? 0 : arrowElements.Count; }
+        }
+
+        public int skillCount
+        {
+            get { return skillElements == null ? 0 : skillElements.Count; }
+        }
+
+        public TalentElement GetTalentElement(int index)
+        {
+            if (skillElements != null && index < skillElements.Count)
+            {
+                return skillElements[index];
+            }
+            return default(TalentElement);
+        }
+
+        public ArrowElement GetArrowElement(int index)
+        {
+            if (arrowElements != null && index < arrowElements.Count)
+            {
+                return arrowElements[index];
+            }
+            return default(ArrowElement);
+        }
+
+        public float GetPercentBySkillElement(int index, float viewHeight, float offset)
+        {
+            if (skillElements != null && index < skillElements.Count)
+            {
+                var element = skillElements[index];
+                var height = contentSizeDelta.y - Mathf.Abs(element.position.y);
+                var percent = Mathf.Clamp01((height - viewHeight) / (contentSizeDelta.y - viewHeight));
+                return Mathf.Clamp01(percent + (offset / (contentSizeDelta.y - viewHeight)));//鍋忕Щ
+            }
+            return 1;
+        }
+
+#if UNITY_EDITOR
+        public void ApplyTalentElement(int index,Vector3 _position)
+        {
+            if (skillElements == null)
+            {
+                skillElements = new List<TalentElement>();
+            }
+            var element = new TalentElement()
+            {
+                position = _position,
+            };
+            if (index >= skillElements.Count)
+            {
+                skillElements.Add(element);
+            }
+            else
+            {
+                skillElements[index] = element;
+            }
+        }
+
+        public void SyncTalentElementsCount(int count)
+        {
+            if (count < skillElements.Count)
+            {
+                skillElements.RemoveRange(count, skillElements.Count - count);
+            }
+        }
+
+        public void ApplyArrowElement(int index, Vector3 _position, Vector2 _sizeDelta, Vector3 _rotation, string _iconKey)
+        {
+            if (arrowElements == null)
+            {
+                arrowElements = new List<ArrowElement>();
+            }
+            var element = new ArrowElement()
+            {
+                position = _position,
+                sizeDelta = _sizeDelta,
+                rotation = _rotation,
+                iconKey = _iconKey,
+            };
+            if (index >= arrowElements.Count)
+            {
+                arrowElements.Add(element);
+            }
+            else
+            {
+                arrowElements[index] = element;
+            }
+        }
+
+        public void SyncArrowElementsCount(int count)
+        {
+            if (count < arrowElements.Count)
+            {
+                arrowElements.RemoveRange(count, arrowElements.Count - count);
+            }
+        }
+#endif
+
+        public bool Belong(int job, int talentType, int talentSeries)
+        {
+            return talentTrees.Belong(job, talentType, talentSeries);
+        }
+
+        [Serializable]
+        public struct TalentTree
+        {
+            public int[] jobs;
+            public int[] talentTypes;
+            public int[] talentSeriess;
+
+            public bool Belong(int job, int talentType, int talentSeries)
+            {
+                bool sameJob = false;
+                for (int i = 0; i < jobs.Length; i++)
+                {
+                    if (jobs[i] == job)
+                    {
+                        sameJob = true;
+                        break;
+                    }
+                }
+                bool sameType = false;
+                for (int i = 0; i < talentTypes.Length; i++)
+                {
+                    if (talentTypes[i] == talentType)
+                    {
+                        sameType = true;
+                        break;
+                    }
+                }
+                bool sameSeries = false;
+                for (int i = 0; i < talentSeriess.Length; i++)
+                {
+                    if (talentSeriess[i] == talentSeries)
+                    {
+                        sameSeries = true;
+                        break;
+                    }
+                }
+                return sameJob && sameType && sameSeries;
+            }
+        }
+
+        [Serializable]
+        public struct TalentElement
+        {
+            public Vector3 position;
+        }
+
+        [Serializable]
+        public struct ArrowElement
+        {
+            public string iconKey;
+            public Vector3 position;
+            public Vector3 rotation;
+            public Vector2 sizeDelta;
+        }
+    }
+
+#if UNITY_EDITOR
+    public class TalentTreeScriptableEditor : Editor
+    {
+        [MenuItem("绛栧垝宸ュ叿/鐢熸垚澶╄祴閰嶇疆鏂囦欢")]
+        static void BuildConfig()
+        {
+            TalentTreeScriptable config = CreateInstance<TalentTreeScriptable>();
+            string _path = StringUtility.Contact("Assets/ResourcesOut/Refdata/ScriptableObject/SoTalentTree/",
+                                          "SoTalentTree_",
+                                          ".asset");
+            AssetDatabase.CreateAsset(config, _path);
+            AssetDatabase.Refresh();
+            ProjectWindowUtil.ShowCreatedAsset(config);
+        }
+    }
+#endif
+}
+
diff --git a/System/Skill/TalentTreeScriptable.cs.meta b/System/Skill/TalentTreeScriptable.cs.meta
new file mode 100644
index 0000000..bc6e668
--- /dev/null
+++ b/System/Skill/TalentTreeScriptable.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 56183617d36b9af4d9dbb2785a581975
+timeCreated: 1537859705
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/Skill/TalentWin.cs b/System/Skill/TalentWin.cs
new file mode 100644
index 0000000..1aa857b
--- /dev/null
+++ b/System/Skill/TalentWin.cs
@@ -0,0 +1,502 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Tuesday, July 31, 2018
+//--------------------------------------------------------
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using TableConfig;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI {
+
+    public class TalentWin : Window
+    {
+        [SerializeField] TalentSeriesBehaviour[] m_TalentSeries;
+        [SerializeField] TalentTreeScriptable[] m_TalentConfigs;
+        [SerializeField] RectTransform m_ContainerSelect;
+        [SerializeField] Button m_TalentTypeSelect;
+        [SerializeField] Text m_TalentType;
+        [SerializeField] Text m_TalentTitle;
+
+        [SerializeField] float m_AutoSelectOffset = 62f;
+        [SerializeField] ScrollRect m_Scroller;
+        [SerializeField] List<TalentSkillBehaviour> m_TalentSkills;
+        [SerializeField] List<Image> m_Arrows;
+
+        [SerializeField] RectTransform m_ContainerSelectSkill;
+        [SerializeField] Image m_SelectSkillIcon;
+        [SerializeField] Text m_SelectSkillLevel;
+        [SerializeField] Text m_SelectSkillName;
+
+        [SerializeField] RectTransform m_ContainerUnActive;
+        [SerializeField] RectTransform m_ContainerActive;
+        [SerializeField] RectTransform m_ContainerBetter;
+        [SerializeField] RectTransform m_ContainerMax;
+
+        [SerializeField] Text[] m_SelectConditions;
+        [SerializeField] Text m_SelectSkillEffect;
+        [SerializeField] Text m_SelectNextEffect;
+
+
+        [SerializeField] Button m_ResetPoint;
+        [SerializeField] Button m_AddPoint;
+        [SerializeField] Text m_AddPointBtnText;
+        [SerializeField] Text m_SurplusPoint;
+
+#if UNITY_EDITOR
+        [SerializeField] TalentTreeScriptable m_EditorScriptable;
+        [SerializeField] bool m_EditorMode;
+        [SerializeField] string m_StraightArrowName;
+        [SerializeField] string m_TurnArrowName;
+#endif
+
+        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
+        PlayerPackModel pack { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
+        #region Built-in
+        protected override void BindController()
+        {
+        }
+
+        protected override void AddListeners()
+        {
+            m_TalentTypeSelect.onClick.AddListener(SelectTalentType);
+            m_ResetPoint.onClick.AddListener(ResetPoint);
+            m_AddPoint.onClick.AddListener(AddPoint);
+        }
+
+        protected override void OnPreOpen()
+        {
+            model.selectSeries = 1;
+            model.selectTalentType = model.GetTalentType(0);
+            Display();
+            model.selectTalentTypeEvnet += OnSelectTalentTypeEvnet;
+            model.selectSeriesEvent += OnSelectSeriesEvent;
+            model.selectSkillEvent += OnSelectSkillEvent;
+            model.talentSkillUpdate += TalentSkillUpdate;
+            model.talentPointUpdate += TalentPointUpdate;
+        }
+
+        protected override void OnAfterOpen()
+        {
+        }
+
+        protected override void OnPreClose()
+        {
+            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
+            model.selectSeriesEvent -= OnSelectSeriesEvent;
+            model.selectSkillEvent -= OnSelectSkillEvent;
+            model.talentSkillUpdate -= TalentSkillUpdate;
+            model.talentPointUpdate -= TalentPointUpdate;
+            for (int i = 0; i < m_TalentSeries.Length; i++)
+            {
+                m_TalentSeries[i].Dispose();
+            }
+            for (int i = 0; i < m_TalentSkills.Count; i++)
+            {
+                m_TalentSkills[i].Dispose();
+            }
+
+#if UNITY_EDITOR
+            if (m_EditorScriptable != null)
+            {
+                m_EditorScriptable = null;
+            }
+#endif
+        }
+
+        protected override void OnAfterClose()
+        {
+        }
+        #endregion
+
+        protected override void LateUpdate()
+        {
+            base.LateUpdate();
+#if UNITY_EDITOR
+            if (m_EditorMode && m_EditorScriptable != null)
+            {
+                DisplayTalentLayout(m_EditorScriptable);
+            }
+#endif
+        }
+
+        void Display()
+        {
+            for (int i = 0; i < m_TalentSeries.Length; i++)
+            {
+                m_TalentSeries[i].Display();
+            }
+
+            DisplaySkills();
+            DisplayTalentType();
+            DisplaySelectSkill();
+            DisplayTalentPoint();
+            DisplayLevelUp();
+        }
+
+        void DisplaySkills()
+        {
+            var job = PlayerDatas.Instance.baseData.Job;
+            List<int> talents = null;
+            model.TryGetTalents(job, model.selectTalentType, model.selectSeries, out talents);
+
+            TalentTreeScriptable selectScriptable = null;
+            for (int i = 0; i < m_TalentConfigs.Length; i++)
+            {
+                if (m_TalentConfigs[i].Belong(job, model.selectTalentType, model.selectSeries))
+                {
+                    selectScriptable = m_TalentConfigs[i];
+                    DisplayTalentLayout(selectScriptable);
+                    break;
+                }
+            }
+
+            List<int> sortTalents = new List<int>(talents);
+            sortTalents.Sort(Compare);
+
+            var index = 0;
+            if (sortTalents != null && sortTalents.Count > 0)
+            {
+                index = 0;
+            }
+            model.selectSkill = sortTalents[index];
+            if (selectScriptable != null)
+            {
+                var rect = m_Scroller.transform as RectTransform;
+                var skillRect = m_TalentSkills[0].transform as RectTransform;
+                m_Scroller.verticalNormalizedPosition = selectScriptable.GetPercentBySkillElement(index, rect.sizeDelta.y, m_AutoSelectOffset);
+            }
+            for (int i = 0; i < m_TalentSkills.Count; i++)
+            {
+                if (sortTalents != null && i < sortTalents.Count)
+                {
+                    m_TalentSkills[i].gameObject.SetActive(true);
+                    m_TalentSkills[i].Display(sortTalents[i]);
+                }
+                else
+                {
+                    m_TalentSkills[i].Dispose();
+                    m_TalentSkills[i].gameObject.SetActive(false);
+                }
+            }
+
+            var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentType_", model.selectTalentType));
+            var seriesDisplay = Language.Get(StringUtility.Contact("TalentSeries_", model.selectSeries));
+            m_TalentTitle.text = StringUtility.Contact(talentTypeDisplay, "路", seriesDisplay);
+        }
+
+        void DisplayTalentType()
+        {
+            m_ContainerSelect.gameObject.SetActive(model.talentTypeCount > 1);
+            if (model.talentTypeCount > 1)
+            {
+                var unselectTalentType = model.selectTalentType == model.GetTalentType(0) ? model.GetTalentType(1) : model.GetTalentType(0);
+                var point = model.GetTalentTypePoint(unselectTalentType);
+                var job = PlayerDatas.Instance.baseData.Job;
+                var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentBtnType_", unselectTalentType));
+                m_TalentType.text = StringUtility.Contact(talentTypeDisplay, "锛�", point, "锛�");
+            }
+        }
+
+        void DisplaySelectSkill()
+        {
+            DisplaySkillInfo();
+            DisplayConditions();
+            DisplaySkillEffect();
+        }
+
+        void DisplayConditions()
+        {
+            TalentSkill talent;
+            var index = 0;
+            if (model.TryGetTalent(model.selectSkill, out talent))
+            {
+                var talentConfig = talent.GetTalentConfig(talent.level + 1);
+                var skillConfig = talent.GetSkillConfig(talent.level + 1);
+                if (talentConfig != null)
+                {
+                    var requireSeriesPoint = skillConfig.RequireTalentSeriesPoint();
+                    if (requireSeriesPoint != 0 && index < m_SelectConditions.Length)
+                    {
+                        m_SelectConditions[index].gameObject.SetActive(true);
+                        var requireSeries = skillConfig.RequireTalentSeries();
+                        var point = model.GetSeriesPoint(talentConfig.type, requireSeries);
+                        var requireDisplay = StringUtility.Contact(point, "/", requireSeriesPoint);
+                        requireDisplay = UIHelper.GetTextColorByItemColor(point >= requireSeriesPoint ?
+                            TextColType.Green : TextColType.Red, requireDisplay);
+                        var seriesDisplay = Language.Get("TalentSeriesCondition", Language.Get(StringUtility.Contact("TalentSeries_", requireSeries)));
+                        m_SelectConditions[index].text = StringUtility.Contact(seriesDisplay, requireDisplay);
+                        index++;
+                    }
+                }
+                if (skillConfig != null && index < m_SelectConditions.Length)
+                {
+                    TalentSkill learnTalent;
+                    if (skillConfig.LearnSkillReq != 0 && model.TryGetTalent(skillConfig.LearnSkillReq, out learnTalent))
+                    {
+                        var learnSkillConfig = Config.Instance.Get<SkillConfig>(skillConfig.LearnSkillReq);
+                        m_SelectConditions[index].gameObject.SetActive(true);
+                        var requireDisplay = StringUtility.Contact(learnSkillConfig.SkillName, " ", learnTalent.level, "/", skillConfig.LearnSkillLV);
+                        requireDisplay = UIHelper.GetTextColorByItemColor(learnTalent.level >= skillConfig.LearnSkillLV ?
+                            TextColType.Green : TextColType.Red, requireDisplay);
+                        m_SelectConditions[index].text = StringUtility.Contact(Language.Get("TalentPreSkillCondition"), requireDisplay);
+                        index++;
+                    }
+                }
+            }
+            for (int i = index; i < m_SelectConditions.Length; i++)
+            {
+                m_SelectConditions[i].gameObject.SetActive(false);
+            }
+        }
+
+        void DisplaySkillInfo()
+        {
+            TalentSkill talent;
+            m_ContainerSelectSkill.gameObject.SetActive(false);
+            if (model.TryGetTalent(model.selectSkill, out talent))
+            {
+                m_ContainerSelectSkill.gameObject.SetActive(true);
+                var config = talent.GetSkillConfig(talent.level);
+                m_SelectSkillIcon.SetSprite(config.IconName);
+                m_SelectSkillLevel.text = StringUtility.Contact(Language.Get("TalentLevel"), talent.level, "/", talent.maxLevel);
+                m_SelectSkillName.text = config.SkillName;
+            }
+        }
+
+        void DisplaySkillEffect()
+        {
+            TalentSkill talent;
+            if (model.TryGetTalent(model.selectSkill, out talent))
+            {
+                m_ContainerUnActive.gameObject.SetActive(talent.level == 0);
+                m_ContainerActive.gameObject.SetActive(talent.level > 0);
+                m_ContainerBetter.gameObject.SetActive(talent.level < talent.maxLevel);
+                m_ContainerMax.gameObject.SetActive(talent.level >= talent.maxLevel);
+
+                if (talent.level > 0)
+                {
+                    var config = talent.GetSkillConfig(talent.level);
+                    m_SelectSkillEffect.text = config.Description;
+                }
+                if (talent.level < talent.maxLevel)
+                {
+                    var nextConfig = talent.GetSkillConfig(talent.level + 1);
+                    m_SelectNextEffect.text = nextConfig.Description;
+                }
+            }
+        }
+
+        bool TryGetTalentConfig(out TalentTreeScriptable config)
+        {
+            config = null;
+            for (int i = 0; i < m_TalentConfigs.Length; i++)
+            {
+                if (m_TalentConfigs[i].Belong(PlayerDatas.Instance.baseData.Job, model.selectTalentType, model.selectSeries))
+                {
+                    config = m_TalentConfigs[i];
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        void DisplayTalentPoint()
+        {
+            m_SurplusPoint.text = model.talentPoint.ToString();
+        }
+
+        private void TalentSkillUpdate(int _skillId)
+        {
+            if (_skillId == model.selectSkill)
+            {
+                DisplaySkillInfo();
+                DisplayConditions();
+                DisplaySkillEffect();
+                DisplayLevelUp();
+            }
+        }
+
+        private void TalentPointUpdate()
+        {
+            DisplayTalentPoint();
+        }
+
+        private void OnSelectTalentTypeEvnet()
+        {
+            model.selectSeries = 1;
+            DisplaySkills();
+            DisplaySelectSkill();
+            DisplayTalentType();
+        }
+
+        private void OnSelectSeriesEvent()
+        {
+            DisplaySkills();
+            DisplaySelectSkill();
+        }
+
+        private void OnSelectSkillEvent()
+        {
+            DisplaySelectSkill();
+            DisplayLevelUp();
+        }
+
+        private void SelectTalentType()
+        {
+            if (model.talentTypeCount > 1)
+            {
+                model.selectTalentType = model.selectTalentType == model.GetTalentType(0) ?
+                         model.GetTalentType(1) : model.GetTalentType(0);
+            }
+        }
+
+        private void DisplayLevelUp()
+        {
+            TalentSkill talent;
+            if (model.TryGetTalent(model.selectSkill, out talent))
+            {
+                m_AddPointBtnText.text = talent.level >= talent.maxLevel ? Language.Get("TalentHighestLevel") : Language.Get("TalentLevelUp");
+            }
+        }
+
+        private void AddPoint()
+        {
+            TalentSkill talent;
+            if (model.TryGetTalent(model.selectSkill, out talent))
+            {
+                int error;
+                if (!model.SatisfyLevelUp(model.selectSkill, out error))
+                {
+                    model.ProcessLevelUpError(model.selectSkill, error);
+                    return;
+                }
+                else
+                {
+                    C0304_tagCAddSkillPoint pak = new C0304_tagCAddSkillPoint();
+                    pak.SkillID = (ushort)model.selectSkill;
+                    GameNetSystem.Instance.SendInfo(pak);
+                }
+            }
+        }
+
+        private void ResetPoint()
+        {
+            var count = pack.GetItemCountByID(PackType.rptItem, model.talentResetBook);
+            var config = Config.Instance.Get<ItemConfig>(model.talentResetBook);
+            if (count > 0)
+            {
+                ConfirmCancel.ShowItemConfirm(Language.Get("TalentResetRequire", config.ItemName), model.talentResetBook, 1, () =>
+                    {
+                        CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
+                        GameNetSystem.Instance.SendInfo(pak);
+                    });
+            }
+            else
+            {
+                ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("LackTalentBook",
+                    config.ItemName, model.talentResetBookCost), (bool isOk) =>
+                    {
+                        if (isOk)
+                        {
+                            if (UIHelper.GetMoneyCnt(1) < (ulong)model.talentResetBookCost)
+                            {
+                                WindowCenter.Instance.Open<RechargeTipWin>();
+                            }
+                            else
+                            {
+                                CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
+                                GameNetSystem.Instance.SendInfo(pak);
+                            }
+                        }
+                    });
+            }
+        }
+
+        void DisplayTalentLayout(TalentTreeScriptable config)
+        {
+            m_Scroller.content.sizeDelta = config.contentSizeDelta;
+            for (int i = 0; i < config.skillCount; i++)
+            {
+                var element = config.GetTalentElement(i);
+                if (i < m_TalentSkills.Count)
+                {
+                    m_TalentSkills[i].transform.localPosition = element.position;
+                }
+            }
+            var index = 0;
+            for (int i = 0; i < config.arrowCount; i++)
+            {
+                var element = config.GetArrowElement(i);
+                if (i < m_Arrows.Count)
+                {
+                    var arrow = m_Arrows[i];
+                    arrow.gameObject.SetActive(true);
+                    arrow.transform.localPosition = element.position;
+                    arrow.transform.localEulerAngles = element.rotation;
+                    arrow.rectTransform.sizeDelta = element.sizeDelta;
+                    arrow.SetSprite(element.iconKey);
+                    index++;
+                }
+            }
+            for (int i = index; i < m_Arrows.Count; i++)
+            {
+                m_Arrows[i].gameObject.SetActive(false);
+            }
+        }
+
+        int Compare(int x, int y)
+        {
+            var configx = Config.Instance.Get<TalentConfig>(x);
+            var configy = Config.Instance.Get<TalentConfig>(y);
+            if (configx != null && configy != null)
+            {
+                return configx.order.CompareTo(configy.order);
+            }
+            return 0;
+        }
+
+#if UNITY_EDITOR
+        [ContextMenu("搴旂敤浣嶇疆鏁版嵁")]
+        void ApplyPositionToScriptable()
+        {
+            if (m_EditorScriptable == null)
+            {
+                return;
+            }
+            var count = 0;
+            for (int i = 0; i < m_TalentSkills.Count; i++)
+            {
+                if (m_TalentSkills[i].gameObject.activeSelf)
+                {
+                    m_EditorScriptable.ApplyTalentElement(count, m_TalentSkills[i].transform.localPosition);
+                    count++;
+                }
+            }
+            m_EditorScriptable.SyncTalentElementsCount(count);
+            count = 0;
+            if (m_Arrows != null)
+            {
+                for (int i = 0; i < m_Arrows.Count; i++)
+                {
+                    if (m_Arrows[i].gameObject.activeSelf)
+                    {
+                        m_EditorScriptable.ApplyArrowElement(count, m_Arrows[i].transform.localPosition,
+                            m_Arrows[i].rectTransform.sizeDelta, m_Arrows[i].transform.localEulerAngles,
+                            m_Arrows[i].sprite.name.Equals(m_StraightArrowName) ? "Talent_StraightArrow" : "Talent_TurnArrow");
+                        count++;
+                    }
+                }
+                m_EditorScriptable.SyncArrowElementsCount(count);
+            }
+        }
+#endif
+    }
+}
+
+
+
+
diff --git a/System/Skill/TalentWin.cs.meta b/System/Skill/TalentWin.cs.meta
new file mode 100644
index 0000000..3db09c9
--- /dev/null
+++ b/System/Skill/TalentWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0bfe355d392770544ad6c5a5d59852f1
+timeCreated: 1533002943
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/WindowBase/ModelCenter.cs b/System/WindowBase/ModelCenter.cs
index 0b132b5..b61c7cf 100644
--- a/System/WindowBase/ModelCenter.cs
+++ b/System/WindowBase/ModelCenter.cs
@@ -196,6 +196,7 @@
             RegisterModel<AwardExchangeModel>();
             RegisterModel<WheelOfFortuneModel>();
             RegisterModel<FlashRushToBuyModel>();
+            RegisterModel<TalentModel>();
             RegisterModel<OpenServerActivityNotifyModel>();
             inited = true;
         }
diff --git a/Utility/EnumHelper.cs b/Utility/EnumHelper.cs
index 0f6254e..71e73c1 100644
--- a/Utility/EnumHelper.cs
+++ b/Utility/EnumHelper.cs
@@ -565,6 +565,7 @@
     CDBPlayerRefresh_Danjing = 187,              // 涓圭簿 187
     CDBPlayerRefresh_NPCHurtAddPer,//瀵规�墿浼ゅ鍔犳垚 188
     FunalHurtPer = 189,// 鏈�缁堜激瀹冲姞鎴�
+    CDBPlayerRefresh_TalentPoint = 190,
 };
 
 /** 鐗╁搧鍔犳垚绫诲瀷 */

--
Gitblit v1.8.0