コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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()}");
        }