From 0ced6b94425308d2a672fb93e9d245906d1d4879 Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期三, 26 九月 2018 13:46:46 +0800
Subject: [PATCH] 3687 天赋功能

---
 Core/GameEngine/Model/ConfigManager.cs |    1 
 System/Skill/TalentSkillBehaviour.cs   |    9 +
 System/Skill/TalentSeriesBehaviour.cs  |   20 +--
 System/Skill/TalentModel.cs            |   46 ++++++++-
 System/WindowBase/ModelCenter.cs       |    1 
 System/Skill/TalentWin.cs              |  108 +++++++++++++++++----
 System/Skill/TalentTreeScriptable.cs   |   80 ++++++++++++---
 7 files changed, 211 insertions(+), 54 deletions(-)

diff --git a/Core/GameEngine/Model/ConfigManager.cs b/Core/GameEngine/Model/ConfigManager.cs
index 8358d24..55dd512 100644
--- a/Core/GameEngine/Model/ConfigManager.cs
+++ b/Core/GameEngine/Model/ConfigManager.cs
@@ -192,6 +192,7 @@
         AddAsyncTask<DungeonSpecialStateTimeConfig>();
         AddAsyncTask<DailyQuestSpecialOpenTimeConfig>();
         AddAsyncTask<WHYJRewardConfig>();
+        AddAsyncTask<TalentConfig>();
         while (!AllCompleted())
         {
             var completedCount = 0;
diff --git a/System/Skill/TalentModel.cs b/System/Skill/TalentModel.cs
index 98b552e..e2f68b3 100644
--- a/System/Skill/TalentModel.cs
+++ b/System/Skill/TalentModel.cs
@@ -62,7 +62,7 @@
 
         public override void Init()
         {
-            //ParseConfig();
+            ParseConfig();
             FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
         }
 
@@ -134,12 +134,22 @@
             return talentSkills.TryGetValue(talentId, out talent);
         }
 
-        public int GetTalentTypeTotalPoint(int series, int talentType)
+        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 = (int)Math.Pow(PlayerDatas.Instance.baseData.Job, 2);
             List<int> list;
             var point = 0;
-            if (TryGetTalents(job, series, talentType, out list))
+            if (TryGetTalents(job, talentType, talentSeries, out list))
             {
                 for (int i = 0; i < list.Count; i++)
                 {
@@ -169,16 +179,16 @@
                     error = 2;
                     return false;
                 }
-                var talentConfig = Config.Instance.Get<TalentConfig>(talent.skillId + talent.level);
+                var talentConfig = talent.GetTalentConfig(talent.level + 1);
                 if (talentConfig.requireSeriesPoint != 0)
                 {
-                    if (GetTalentTypeTotalPoint(talentConfig.requireSeries, talentConfig.type) < talentConfig.requireSeriesPoint)
+                    if (GetSeriesPoint(talentConfig.type, talentConfig.requireSeries) < talentConfig.requireSeriesPoint)
                     {
                         error = 4;
                         return false;
                     }
                 }
-                var skillConfig = Config.Instance.Get<SkillConfig>(talent.skillId + talent.level);
+                var skillConfig = talent.GetSkillConfig(talent.level + 1);
                 if (skillConfig.LearnSkillReq != 0)
                 {
                     TalentSkill learnTalent;
@@ -238,6 +248,30 @@
             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
diff --git a/System/Skill/TalentSeriesBehaviour.cs b/System/Skill/TalentSeriesBehaviour.cs
index 043dd46..c01548f 100644
--- a/System/Skill/TalentSeriesBehaviour.cs
+++ b/System/Skill/TalentSeriesBehaviour.cs
@@ -8,15 +8,13 @@
 {
     public class TalentSeriesBehaviour : MonoBehaviour
     {
-        [SerializeField] int talentSeries;
+        [SerializeField] int talentSeries = 0;
         [SerializeField] Button m_Button;
         [SerializeField] Image m_Icon;
         [SerializeField] Text m_TalentType;
         [SerializeField] Text m_TalentPoint;
 
         TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
-
-        int series = 0;
 
         private void Awake()
         {
@@ -31,22 +29,22 @@
             }
         }
 
-        public void Display(int _series)
+        public void Display()
         {
-            series = _series;
-            OnSelectTalentTypeEvnet();
-            model.OnSelectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
-            model.OnSelectTalentTypeEvnet += OnSelectTalentTypeEvnet;
+            m_Button.image.SetSprite(talentSeries == model.selectSeries ? "Title_TabRight" : "Title_TabDark");
+
+            model.OnSelectSeriesEvent -= OnSelectSeriesEvent;
+            model.OnSelectSeriesEvent += OnSelectSeriesEvent;
         }
 
         public void Dispose()
         {
-            model.OnSelectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
+            model.OnSelectSeriesEvent -= OnSelectSeriesEvent;
         }
 
-        private void OnSelectTalentTypeEvnet()
+        private void OnSelectSeriesEvent()
         {
-            m_Button.image.SetSprite(talentSeries == model.selectTalentType ? "Title_TabRight" : "Title_TabDark");
+            m_Button.image.SetSprite(talentSeries == model.selectSeries ? "Title_TabRight" : "Title_TabDark");
         }
     }
 }
diff --git a/System/Skill/TalentSkillBehaviour.cs b/System/Skill/TalentSkillBehaviour.cs
index ca98738..ac7eb12 100644
--- a/System/Skill/TalentSkillBehaviour.cs
+++ b/System/Skill/TalentSkillBehaviour.cs
@@ -28,6 +28,8 @@
             skillId = _skillId;
             model.talentSkillUpdate -= TalentSkillUpdate;
             model.talentSkillUpdate += TalentSkillUpdate;
+            model.OnSelectSkillEvent -= OnSelectSkillEvent;
+            model.OnSelectSkillEvent += OnSelectSkillEvent;
             Display();
         }
 
@@ -43,6 +45,7 @@
                 }
                 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);
             }
         }
 
@@ -54,9 +57,15 @@
             }
         }
 
+        private void OnSelectSkillEvent()
+        {
+            m_ContainerSelect.gameObject.SetActive(skillId == model.selectSkill);
+        }
+
         public void Dispose()
         {
             model.talentSkillUpdate -= TalentSkillUpdate;
+            model.OnSelectSkillEvent -= OnSelectSkillEvent;
         }
 
         private void SelectSkill()
diff --git a/System/Skill/TalentTreeScriptable.cs b/System/Skill/TalentTreeScriptable.cs
index 72b11e7..ccdf9b3 100644
--- a/System/Skill/TalentTreeScriptable.cs
+++ b/System/Skill/TalentTreeScriptable.cs
@@ -9,10 +9,10 @@
 {
     public class TalentTreeScriptable : ScriptableObject
     {
-        [SerializeField] TalentTree[] talentTrees;
+        [SerializeField] TalentTree talentTrees;
         [SerializeField] Vector2 m_ContentSizeDelta;
-        [SerializeField] TalentElement[] skillElements;
-        [SerializeField] ArrowElement[] arrowElements;
+        [SerializeField] List<TalentElement> skillElements;
+        [SerializeField] List<ArrowElement> arrowElements;
 
         public Vector2 contentSizeDelta
         {
@@ -21,35 +21,83 @@
 
         public TalentElement GetTalentElement(int index)
         {
-            if (index < skillElements.Length)
+            if (skillElements != null && index < skillElements.Count)
             {
                 return skillElements[index];
             }
             return default(TalentElement);
         }
 
+#if UNITY_EDITOR
+        public void ApplyTalentElement(int index,Vector3 _position)
+        {
+            if (index >= skillElements.Count)
+            {
+                skillElements.Add(new TalentElement()
+                {
+                    position = _position,
+                });
+            }
+            else
+            {
+                skillElements[index] = new TalentElement()
+                {
+                    position = _position,
+                };
+            }
+        }
+
+        public void SyncElementsCount(int count)
+        {
+            if (count < skillElements.Count)
+            {
+                skillElements.RemoveRange(count, skillElements.Count - count);
+            }
+        }
+#endif
+
         public bool Belong(int job, int talentType, int talentSeries)
         {
-            for (int i = 0; i < talentTrees.Length; i++)
-            {
-                if (talentTrees[i].Belong(job, talentType, talentSeries))
-                {
-                    return true;
-                }
-            }
-            return false;
+            return talentTrees.Belong(job, talentType, talentSeries);
         }
 
         [Serializable]
         public struct TalentTree
         {
-            public int job;
-            public int talentType;
-            public int talentSeries;
+            public int[] jobs;
+            public int[] talentTypes;
+            public int[] talentSeriess;
 
             public bool Belong(int job, int talentType, int talentSeries)
             {
-                return this.job == job && this.talentType == talentType && this.talentSeries == 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;
             }
         }
 
diff --git a/System/Skill/TalentWin.cs b/System/Skill/TalentWin.cs
index 4e1972a..6402953 100644
--- a/System/Skill/TalentWin.cs
+++ b/System/Skill/TalentWin.cs
@@ -28,10 +28,14 @@
         [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] RectTransform m_ContainerSelectEffect;
         [SerializeField] Text m_SelectSkillEffect;
-        [SerializeField] RectTransform m_ContainerNextEffect;
         [SerializeField] Text m_SelectNextEffect;
 
 
@@ -42,6 +46,7 @@
 
 #if UNITY_EDITOR
         [SerializeField] TalentTreeScriptable m_EditorScriptable;
+        [SerializeField] bool m_EditorMode;
 #endif
 
         TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
@@ -84,6 +89,10 @@
             {
                 m_TalentSeries[i].Dispose();
             }
+            for (int i = 0; i < m_TalentSkills.Length; i++)
+            {
+                m_TalentSkills[i].Dispose();
+            }
 
 #if UNITY_EDITOR
             if (m_EditorScriptable != null)
@@ -102,7 +111,7 @@
         {
             base.LateUpdate();
 #if UNITY_EDITOR
-            if (m_EditorScriptable != null)
+            if (m_EditorMode && m_EditorScriptable != null)
             {
                 DisplayTalentLayout(m_EditorScriptable);
             }
@@ -113,27 +122,54 @@
         {
             for (int i = 0; i < m_TalentSeries.Length; i++)
             {
-                m_TalentSeries[i].Display(model.selectSeries);
+                m_TalentSeries[i].Display();
             }
 
             DisplaySkills();
-            DisplaySeries();
+            DisplayTalentType();
             DisplaySelectSkill();
             DisplayTalentPoint();
         }
 
         void DisplaySkills()
         {
-            
+            var job = PlayerDatas.Instance.baseData.Job;
+            List<int> talents = null;
+            model.TryGetTalents(job, model.selectTalentType, model.selectSeries, out talents);
+
+            for (int i = 0; i < m_TalentConfigs.Length; i++)
+            {
+                if (m_TalentConfigs[i].Belong(job, model.selectTalentType, model.selectSeries))
+                {
+                    DisplayTalentLayout(m_TalentConfigs[i]);
+                    break;
+                }
+            }
+
+            if (talents != null && talents.Count > 0)
+            {
+                model.selectSkill = talents[0];
+            }
+            m_Scroller.verticalNormalizedPosition = 1;
+            for (int i = 0; i < m_TalentSkills.Length; i++)
+            {
+                if (talents != null && i < talents.Count)
+                {
+                    m_TalentSkills[i].gameObject.SetActive(true);
+                    m_TalentSkills[i].Display(talents[i]);
+                }
+                else
+                {
+                    m_TalentSkills[i].Dispose();
+                    m_TalentSkills[i].gameObject.SetActive(false);
+                }
+            }
         }
 
-        void DisplaySeries()
+        void DisplayTalentType()
         {
-            var point = 0;
-            point += model.GetTalentTypeTotalPoint(model.selectSeries, 1);
-            point += model.GetTalentTypeTotalPoint(model.selectSeries, 2);
-            point += model.GetTalentTypeTotalPoint(model.selectSeries, 3);
-            m_TalentType.text = model.selectSeries == 1 ? string.Format("鏅哄姏澶╄祴({0})", point) : string.Format("鍔涢噺澶╄祴({0})", point);
+            var point = model.GetTalentTypePoint(model.selectTalentType);
+            m_TalentType.text = model.selectTalentType == 1 ? string.Format("鏅哄姏澶╄祴({0})", point) : string.Format("鍔涢噺澶╄祴({0})", point);
         }
 
         void DisplaySelectSkill()
@@ -151,8 +187,8 @@
             var index = 0;
             if (model.TryGetTalent(model.selectSkill, out talent))
             {
-                var talentConfig = Config.Instance.Get<TalentConfig>(talent.skillId + talent.level);
-                var skillConfig = Config.Instance.Get<SkillConfig>(talent.skillId + talent.level);
+                var talentConfig = talent.GetTalentConfig(talent.level + 1);
+                var skillConfig = talent.GetSkillConfig(talent.level + 1);
                 if (talentConfig != null)
                 {
                     if (talentConfig.requireSeriesPoint != 0 && index < m_SelectConditions.Length)
@@ -190,7 +226,7 @@
             if (model.TryGetTalent(model.selectSkill, out talent))
             {
                 m_ContainerSelectSkill.gameObject.SetActive(true);
-                var config = Config.Instance.Get<SkillConfig>(talent.skillId + talent.level);
+                var config = talent.GetSkillConfig(talent.level);
                 m_SelectSkillIcon.SetSprite(config.IconName);
                 m_SelectSkillLevel.text = StringUtility.Contact(talent.level, "/", talent.maxLevel);
                 m_SelectSkillName.text = config.SkillName;
@@ -202,12 +238,19 @@
             TalentSkill talent;
             if (model.TryGetTalent(model.selectSkill, out talent))
             {
-                var config = Config.Instance.Get<SkillConfig>(talent.skillId + talent.level);
-                m_SelectSkillEffect.text = config.Description;
-                m_ContainerNextEffect.gameObject.SetActive(talent.level < talent.maxLevel);
+                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 = Config.Instance.Get<SkillConfig>(talent.skillId + talent.level + 1);
+                    var nextConfig = talent.GetSkillConfig(talent.level + 1);
                     m_SelectNextEffect.text = nextConfig.Description;
                 }
             }
@@ -249,13 +292,15 @@
 
         private void OnSelectTalentTypeEvnet()
         {
+            model.selectSeries = 1;
             DisplaySkills();
+            DisplaySelectSkill();
         }
 
         private void OnSelectSeriesEvent()
         {
-            model.selectTalentType = 1;
-            Display();
+            DisplaySkills();
+            DisplaySelectSkill();
         }
 
         private void OnSelectSkillEvent()
@@ -296,6 +341,27 @@
                 m_TalentSkills[i].transform.localPosition = element.position;
             }
         }
+
+#if UNITY_EDITOR
+        [ContextMenu("搴旂敤浣嶇疆鏁版嵁")]
+        void ApplyPositionToScriptable()
+        {
+            if (m_EditorScriptable == null)
+            {
+                return;
+            }
+            var count = 0;
+            for (int i = 0; i < m_TalentSkills.Length; i++)
+            {
+                if (m_TalentSkills[i].gameObject.activeSelf)
+                {
+                    m_EditorScriptable.ApplyTalentElement(count, m_TalentSkills[i].transform.localPosition);
+                    count++;
+                }
+            }
+            m_EditorScriptable.SyncElementsCount(count);
+        }
+#endif
     }
 }
 
diff --git a/System/WindowBase/ModelCenter.cs b/System/WindowBase/ModelCenter.cs
index e555f65..8999745 100644
--- a/System/WindowBase/ModelCenter.cs
+++ b/System/WindowBase/ModelCenter.cs
@@ -195,6 +195,7 @@
             RegisterModel<PrayForDurgModel>();
             RegisterModel<FeatureNoticeModel>();
             RegisterModel<AwardExchangeModel>();
+            RegisterModel<TalentModel>();
             inited = true;
         }
 

--
Gitblit v1.8.0