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