|
@@ -6,6 +6,7 @@ using Excel2Json;
|
|
|
using Fort23.UTool;
|
|
|
using UnityEngine;
|
|
|
using Utility;
|
|
|
+using Random = UnityEngine.Random;
|
|
|
|
|
|
public class EventSystemManager : Singleton<EventSystemManager>
|
|
|
{
|
|
@@ -24,96 +25,44 @@ public class EventSystemManager : Singleton<EventSystemManager>
|
|
|
BigMap bigMap = ConfigComponent.Instance.Get<BigMap>(bigMapId);
|
|
|
DivineSenseConfig divineSenseConfig = ConfigComponent.Instance.Get<DivineSenseConfig>(1);
|
|
|
|
|
|
+
|
|
|
// 选择神识区间
|
|
|
DivineSenseIntervalConfig interval = SelectInterval(200);
|
|
|
|
|
|
// 获取通用事件
|
|
|
List<EventConfig> globalEvents = eventConfigs
|
|
|
- .Where(e => e.EventTriggerType == 3 && CanTriggerEvent(e.ID) &&
|
|
|
- interval.EventQualities.Contains(e.EventQuality))
|
|
|
+ .Where(e => e.EventTriggerType == 3 && CanTriggerEvent(e.ID))
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
- //获取特定事件
|
|
|
- var eventIDs = bigMap.DivineSenseEvent.ToList();
|
|
|
- List<EventConfig> candidateEvents = eventConfigs
|
|
|
- .Where(e => eventIDs.Contains(e.ID) && CanTriggerEvent(e.ID))
|
|
|
- .ToList();
|
|
|
- candidateEvents.AddRange(globalEvents);
|
|
|
+ //神识场景事件
|
|
|
+ List<EventConfig> candidateEvents = eventConfigs.Where(e => bigMap.DivineSenseGeneralEvent.Contains(e.ID) && CanTriggerEvent(e.ID)).ToList();
|
|
|
|
|
|
- if (candidateEvents.Count == 0)
|
|
|
+ if (candidateEvents.Count == 0 && globalEvents.Count == 0)
|
|
|
{
|
|
|
LogTool.Warning("没有可以刷新的任务");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 计算高品质事件加成
|
|
|
- float qualityBonusMultiplier = divineSenseConfig.QualityBonusChance *
|
|
|
- Mathf.Floor((200 - divineSenseConfig.MinDivineSenseValue) /
|
|
|
- divineSenseConfig.DivineSenseCount);
|
|
|
-
|
|
|
-
|
|
|
- // 获得全部权重
|
|
|
- var eventWeights = new List<(EventConfig Event, int Weight)>();
|
|
|
- float totalProbability = candidateEvents.Sum(evt =>
|
|
|
- {
|
|
|
- float prob = evt.BaseProbability;
|
|
|
- if (evt.EventQuality >= 2)
|
|
|
- prob *= (1f + qualityBonusMultiplier);
|
|
|
- return prob;
|
|
|
- });
|
|
|
-
|
|
|
- foreach (var evt in candidateEvents)
|
|
|
- {
|
|
|
- float probability = evt.BaseProbability;
|
|
|
- if (evt.EventQuality >= 2)
|
|
|
- probability *= (1f + qualityBonusMultiplier);
|
|
|
- int weight = Mathf.Max(1, Mathf.RoundToInt(probability / totalProbability * 100));
|
|
|
- eventWeights.Add((evt, weight));
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
- // 调整权重确保总和=100
|
|
|
- int totalWeight = 100;
|
|
|
- int currentSum = eventWeights.Sum(ew => ew.Weight);
|
|
|
- if (currentSum != totalWeight)
|
|
|
+ var triggeredEvents = new List<EventConfig>();
|
|
|
+ for (int i = 0; i >= divineSenseConfig.DetectEventCount; i++)
|
|
|
{
|
|
|
- float scale = (float)totalWeight / currentSum;
|
|
|
- eventWeights = eventWeights.Select(ew => (ew.Event, Mathf.Max(1, Mathf.RoundToInt(ew.Weight * scale))))
|
|
|
- .ToList();
|
|
|
- // 微调总和
|
|
|
- currentSum = eventWeights.Sum(ew => ew.Weight);
|
|
|
- if (currentSum != totalWeight)
|
|
|
+ int randomValue1 = Random.Range(0, 101);
|
|
|
+ //刷
|
|
|
+ if (randomValue1 >= bigMap.DivineSenseGeneralProbability && candidateEvents.Count > 0)
|
|
|
{
|
|
|
- int diff = totalWeight - currentSum;
|
|
|
- var maxWeightEvent = eventWeights.OrderByDescending(ew => ew.Weight).First();
|
|
|
- eventWeights[eventWeights.IndexOf(maxWeightEvent)] =
|
|
|
- (maxWeightEvent.Event, maxWeightEvent.Weight + diff);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- foreach (var (evt, weight) in eventWeights)
|
|
|
- {
|
|
|
- LogTool.Log($"EventId {evt.ID}: 权重={weight} ({weight / (float)totalWeight:P2})");
|
|
|
- }
|
|
|
+ int randomValue2 = Random.Range(0, candidateEvents.Count);
|
|
|
|
|
|
- // 随机抽取事件
|
|
|
- var triggeredEvents = new List<EventConfig>();
|
|
|
- for (int i = 0; i < divineSenseConfig.DetectEventCount && eventWeights.Count > 0; i++)
|
|
|
- {
|
|
|
- int randomValue = UnityEngine.Random.Range(0, 101);
|
|
|
- int cumulative = 0;
|
|
|
- foreach (var (evt, weight) in eventWeights.ToList())
|
|
|
+ triggeredEvents.Add(candidateEvents[randomValue2]);
|
|
|
+ candidateEvents.RemoveAll(ew => ew.ID == candidateEvents[randomValue2].ID);
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- cumulative += weight;
|
|
|
- if (randomValue < cumulative)
|
|
|
- {
|
|
|
- triggeredEvents.Add(evt);
|
|
|
- eventWeights.RemoveAll(ew => ew.Event.ID == evt.ID);
|
|
|
- LogTool.Log($"S旋转事件 {evt.ID}, 权重={weight}, 随机到的权重={randomValue}");
|
|
|
- break;
|
|
|
- }
|
|
|
+ int randomValue2 = Random.Range(0, globalEvents.Count);
|
|
|
+
|
|
|
+ triggeredEvents.Add(globalEvents[randomValue2]);
|
|
|
+ globalEvents.RemoveAll(ew => ew.ID == globalEvents[randomValue2].ID);
|
|
|
}
|
|
|
}
|
|
|
|