/// <summary> /// 获取最佳轮回人选 /// </summary> /// <param name="instance"></param> /// <returns>各个属性的最佳人选 dataIndex -> (charId, attrValue, deltaBonus)</returns> private static SortedDictionary <int, (int, int, int)> GetBestCandidates(ui_SamsaraPlatform instance) { var candidates = new SortedDictionary <int, (int, int, int)>(); var allAttrBonuses = GetAllAttrBonuses(instance); var buildingLevel = Traverse.Create(instance).Field("buildingLevel").GetValue <int>(); var mainActorId = DateFile.instance.MianActorID(); // 已转世的人 var bornedActorSet = new HashSet <int>(); foreach (var data in DateFile.instance.samsaraPlatformChildrenData.Values) { bornedActorSet.Add(data.samsaraActorId); } foreach (var charId in DateFile.instance.deadActors) { if (DateFile.instance.GetActorFavor(false, mainActorId, charId) == -1) { continue; // 去掉不认识的人 } if (bornedActorSet.Contains(charId)) { continue; // 去掉已转世的人 } if (int.Parse(DateFile.instance.GetActorDate(charId, 11, false)) <= ConstValue.actorMinAge) { continue; // 去掉未成年人 } foreach (var entry in allAttrBonuses) { var dataIndex = entry.Key; var oriBonus = entry.Value; var attrValue = int.Parse(DateFile.instance.GetActorDate(charId, dataIndex, false)); int currBonus = attrValue * buildingLevel / 100; if (currBonus <= oriBonus) { continue; } if (!candidates.ContainsKey(dataIndex) || candidates[dataIndex].Item2 < currBonus) { candidates[dataIndex] = (charId, attrValue, currBonus - oriBonus); } } } return(candidates); }
/// <summary> /// 获取目前的所有属性加成, 包括还未有加成的属性 /// </summary> /// <param name="instance"></param> /// <returns></returns> private static Dictionary <int, int> GetAllAttrBonuses(ui_SamsaraPlatform instance) { var allAttrBonuses = new Dictionary <int, int>(); var attrBonuses = DateFile.instance.samsaraPlatformAddAttribute; var attrDataStartIndex = Traverse.Create(instance).Field("attrDataStartIndex").GetValue <int[]>(); var attrDataText = Traverse.Create(instance).Field("attrDataText").GetValue <List <CText>[]>(); foreach (var attrType in _attrTypes) { var firstDataIndex = attrDataStartIndex[attrType]; var attrText = attrDataText[attrType]; for (var i = 0; i < attrText.Count; ++i) { var dataIndex = firstDataIndex + i; var bonus = attrBonuses.ContainsKey(dataIndex) ? attrBonuses[dataIndex] : 0; allAttrBonuses[dataIndex] = bonus; } } return(allAttrBonuses); }
private static void Postfix(ui_SamsaraPlatform __instance) { if (!Main.enabled || !Main.settings.autoSearchSamsara) { return; } var candidates = GetBestCandidates(__instance); // 最佳人选信息 charId -> [(dataIndex, attrValue, deltaBonus), ] var candidateChars = new Dictionary <int, List <(int, int, int)> >(); foreach (var entry in candidates) { var dataIndex = entry.Key; var charId = entry.Value.Item1; var attrValue = entry.Value.Item2; var deltaBonus = entry.Value.Item3; if (!candidateChars.ContainsKey(charId)) { candidateChars[charId] = new List <(int, int, int)>(); } candidateChars[charId].Add((dataIndex, attrValue, deltaBonus)); } foreach (var charId in candidateChars.Keys.ToArray()) { var attrbutes = candidateChars[charId]; attrbutes.Sort((lhs, rhs) => lhs.Item1.CompareTo(rhs.Item1)); } // 输出结果 if (candidateChars.Count <= 0) { Main.Logger.Log($"轮回台最佳人选: 找不到合适的人选."); return; } var message = new StringBuilder(); foreach (var entry in candidateChars) { var charId = entry.Key; var attributesInfo = entry.Value; message.Append($"{DateFile.instance.GetActorName(charId, true)}: "); foreach (var attrInfo in attributesInfo) { var dataIndex = attrInfo.Item1; var attrValue = attrInfo.Item2; var deltaBonus = attrInfo.Item3; message.Append($"{GetAttrName(dataIndex)} {attrValue} (+{deltaBonus}), "); } message.AppendLine(); } Main.Logger.Log($"轮回台最佳人选:\n{message.ToString()}"); }