From 8804ac2cf4cfdbffa4bb2adb9fa8964a5cf86ade Mon Sep 17 00:00:00 2001
From: client_linchunjie <461730578@qq.com>
Date: 星期五, 26 四月 2019 17:07:48 +0800
Subject: [PATCH] 3335 修改加点推荐逻辑

---
 System/Role/ReikiRootModel.cs |  185 ++++++++++++++++------------------------------
 1 files changed, 64 insertions(+), 121 deletions(-)

diff --git a/System/Role/ReikiRootModel.cs b/System/Role/ReikiRootModel.cs
index bf387f0..c0a37c3 100644
--- a/System/Role/ReikiRootModel.cs
+++ b/System/Role/ReikiRootModel.cs
@@ -9,8 +9,6 @@
         Dictionary<int, int> m_ReikiRootPoints = new Dictionary<int, int>();
         Dictionary<int, int> m_ReikiRootFreePoints = new Dictionary<int, int>();
         Dictionary<int, List<int>> m_RecommendReikiRoots = new Dictionary<int, List<int>>();
-        Dictionary<int, Dictionary<int, float>> m_RecommendProportion = new Dictionary<int, Dictionary<int, float>>();
-        Dictionary<int, int> m_MainReikiRoots = new Dictionary<int, int>();
         Dictionary<int, int> m_ReikiQualityMapColors;
         Dictionary<int, int> m_CacheReikiRootPoints = new Dictionary<int, int>();
         Dictionary<int, Dictionary<int, int[]>> m_PromotePropertyValues = new Dictionary<int, Dictionary<int, int[]>>();
@@ -39,15 +37,6 @@
                         onCacheFreePointRefresh();
                     }
                 }
-            }
-        }
-
-        public int mainReikiRoot
-        {
-            get
-            {
-                var job = PlayerDatas.Instance.baseData.Job;
-                return m_MainReikiRoots[job];
             }
         }
 
@@ -88,22 +77,7 @@
             foreach (var jobKey in json.Keys)
             {
                 var job = int.Parse(jobKey);
-                var _mainReikiRoot = 0;
-                var _proportion = 0f;
-                m_RecommendProportion.Add(job, new Dictionary<int, float>());
-                foreach (var idKey in json[jobKey].Keys)
-                {
-                    var id = int.Parse(idKey);
-                    var proportion = int.Parse(json[jobKey][idKey].ToString()) / 100f;
-                    if (proportion > _proportion)
-                    {
-                        _mainReikiRoot = id;
-                        _proportion = proportion;
-                    }
-                    m_RecommendProportion[job].Add(id, proportion);
-                }
-                m_MainReikiRoots.Add(job, _mainReikiRoot);
-                m_RecommendReikiRoots.Add(job, new List<int>(m_RecommendProportion[job].Keys));
+                m_RecommendReikiRoots.Add(job, new List<int>(LitJson.JsonMapper.ToObject<int[]>(json[jobKey].ToJson())));
             }
 
             var config = ReikiRootConfig.GetValues()[0];
@@ -181,95 +155,81 @@
                 return null;
             }
 
-            //m_CacheReikiRootPoints.Clear();
-            //foreach (var id in m_ReikiRootPoints.Keys)
-            //{
-            //    m_CacheReikiRootPoints[id] = m_ReikiRootPoints[id];
-            //}
+            m_CacheReikiRootPoints.Clear();
+            foreach (var id in m_ReikiRootPoints.Keys)
+            {
+                m_CacheReikiRootPoints[id] = m_ReikiRootPoints[id];
+            }
 
             var recommends = new List<ReikiRootRecommend>();
             var job = PlayerDatas.Instance.baseData.Job;
 
-            if (m_RecommendProportion.ContainsKey(job))
+            if (m_RecommendReikiRoots.ContainsKey(job))
             {
-                var proportions = m_RecommendProportion[job];
-                var index = 0;
+                var reikis = m_RecommendReikiRoots[job];
                 var surplusPoint = point;
-                foreach (var id in proportions.Keys)
+                while (surplusPoint > 0)
                 {
-                    var recommendPoint = Mathf.Min(surplusPoint, (int)(point * proportions[id]));
-                    if (index == proportions.Keys.Count - 1)
+                    reikis.Sort((int x, int y) =>
                     {
-                        recommendPoint = surplusPoint;
-                    }
-                    recommends.Add(new ReikiRootRecommend()
-                    {
-                        id = id,
-                        value = recommendPoint,
+                        var x_point = GetReikiRootCachePoint(x);
+                        var y_point = GetReikiRootCachePoint(y);
+                        if (x_point != y_point)
+                        {
+                            return x_point.CompareTo(y_point);
+                        }
+                        return x.CompareTo(y);
                     });
-                    surplusPoint -= recommendPoint;
-                    index++;
+
+                    var minpoint = GetReikiRootCachePoint(reikis[0]);
+                    var samepointIds = reikis.FindAll((x) =>
+                    {
+                        return GetReikiRootCachePoint(x) == minpoint;
+                    });
+
+                    var recommendPoint = 0;
+
+                    if (samepointIds.Count != reikis.Count)
+                    {
+                        var secondpointId = reikis.Find((x) =>
+                        {
+                            return GetReikiRootCachePoint(x) > minpoint;
+                        });
+                        var secondpoint = GetReikiRootCachePoint(secondpointId);
+                        recommendPoint = Mathf.Min((secondpoint - minpoint) * samepointIds.Count, surplusPoint) / samepointIds.Count;
+                    }
+                    else
+                    {
+                        recommendPoint = surplusPoint / samepointIds.Count;
+                    }
+
+                    if (recommendPoint > 0)
+                    {
+                        foreach (var id in samepointIds)
+                        {
+                            recommends.Add(new ReikiRootRecommend()
+                            {
+                                id = id,
+                                value = recommendPoint,
+                            });
+                            surplusPoint -= recommendPoint;
+                            m_CacheReikiRootPoints[id] += recommendPoint;
+                        }
+                    }
+                    else
+                    {
+                        var id = samepointIds[0];
+                        recommends.Add(new ReikiRootRecommend()
+                        {
+                            id = id,
+                            value = 1,
+                        });
+                        surplusPoint -= 1;
+                        m_CacheReikiRootPoints[id] += 1;
+                    }
                 }
             }
 
-            //var remainPoint = point;
-            //var currentMaxQuality = 1;
-
-            //foreach (var id in reikiRoots)
-            //{
-            //    var quality = GetReikiRootQuality(id);
-            //    if (quality >= currentMaxQuality)
-            //    {
-            //        currentMaxQuality = quality;
-            //    }
-            //}
-            //
-            //if (m_RecommendReikiRoots.ContainsKey(job))
-            //{
-            //    var reikiRoots = m_RecommendReikiRoots[job];
-            //    while (remainPoint > 0)
-            //    {
-            //        reikiRoots.Sort(QualityCompare);
-            //        var id = reikiRoots[0];
-            //        var quality = GetReikiRootQuality(id, m_CacheReikiRootPoints[id]);
-            //        var addpoint = 0;
-            //        if (quality >= maxQuality)
-            //        {
-            //            var proportions = m_RecommendProportion[job];
-            //            foreach (var key in proportions.Keys)
-            //            {
-            //                addpoint = Mathf.RoundToInt(remainPoint * proportions[key]);
-            //                recommends.Add(new ReikiRootRecommend()
-            //                {
-            //                    id = key,
-            //                    value = addpoint,
-            //                });
-            //                if (!m_CacheReikiRootPoints.ContainsKey(key))
-            //                {
-            //                    m_CacheReikiRootPoints.Add(key, 0);
-            //                }
-            //                m_CacheReikiRootPoints[key] += addpoint;
-            //            }
-            //            remainPoint = 0;
-            //        }
-            //        else
-            //        {
-            //            addpoint = Mathf.Min(remainPoint, GetCacheQualityRequrePoint(id,
-            //                quality < currentMaxQuality ? currentMaxQuality : quality + 1));
-            //            remainPoint -= addpoint;
-            //            recommends.Add(new ReikiRootRecommend()
-            //            {
-            //                id = id,
-            //                value = addpoint,
-            //            });
-            //            if (!m_CacheReikiRootPoints.ContainsKey(id))
-            //            {
-            //                m_CacheReikiRootPoints.Add(id, 0);
-            //            }
-            //            m_CacheReikiRootPoints[id] += addpoint;
-            //        }
-            //    }
-            //}
             return recommends;
         }
 
@@ -366,23 +326,6 @@
             pak.PointValueList = pointValues;
             pak.PointAttrIDCount = (byte)points.Length;
             GameNetSystem.Instance.SendInfo(pak);
-        }
-
-        int QualityCompare(int lhs, int rhs)
-        {
-            var lhsQuality = GetReikiRootQuality(lhs, GetReikiRootCachePoint(lhs));
-            var rhsQuality = GetReikiRootQuality(rhs, GetReikiRootCachePoint(rhs));
-            if (lhs != rhs)
-            {
-                if (mainReikiRoot == lhs || mainReikiRoot == rhs)
-                {
-                    if (lhsQuality == rhsQuality)
-                    {
-                        return mainReikiRoot == lhs ? -1 : 1;
-                    }
-                }
-            }
-            return lhsQuality.CompareTo(rhsQuality);
         }
 
         private void PlayerDataRefreshEvent(PlayerDataType dataType)

--
Gitblit v1.8.0