From 3215d63af755bc2b9d64792d8a115854e1756ed2 Mon Sep 17 00:00:00 2001 From: Weiduhuo <1281586535@qq.com> Date: Fri, 24 Nov 2023 15:32:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E5=89=AF=E8=AF=8D?= =?UTF-8?q?=E6=9D=A1=E6=9E=81=E7=AB=AF=E6=83=85=E5=86=B5=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/relic.py | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/utils/relic.py b/utils/relic.py index 47e719e1..9f0018f1 100644 --- a/utils/relic.py +++ b/utils/relic.py @@ -1585,10 +1585,17 @@ def print_relic( max_level = ret[0] max_idx = idx # 通过判断整体副词条强化次数是否超限,来判断是否需要强化次数修正 - if max_level >= 4 and total_level == relic_level // 3 + 4 + 1: # 判断为8个挡位积分会归为1次强化次数导致,进行修正 - level, score, result = sub_data[max_idx][-1] - sub_data[max_idx][-1] = (level-1, score+8, result) - log.debug(_("强化次数修正:{}").format(sub_data[max_idx])) + if max_level >= 4 and total_level == relic_level // 3 + 4 + 1: # 判断为挡位积分达到阈值归为1次强化次数导致,进行修正 + name, value, (level, score, result) = sub_data[max_idx] + if name == _("速度") and rarity == 5: + # 2) 优化修正,采用重新计算 + stats_index = subs_stats_dict[name] + sub_data[max_idx][-1] = self.get_subs_stats_detail((name, value), rarity, stats_index, set_level=level-1) + else: + # 1) 机械修正 (两种方法互斥,不可混用) + level, score, result = sub_data[max_idx][-1] + sub_data[max_idx][-1] = (level-1, score+8, result) + log.debug(_("副词条修正:{}").format(sub_data[max_idx])) # 打印增强并修正后的数值 for name, value, ret in sub_data: pre = " " if name in NOT_PRE_STATS else "%" @@ -2070,7 +2077,7 @@ def get_base_stats_detail(self, data: Tuple[str, float], rarity: int, level: int return None return result - def get_subs_stats_detail(self, data: Tuple[str, float], rarity: int, stats_index: Optional[int]=None, check=True) -> Optional[Tuple[int, int, float]]: + def get_subs_stats_detail(self, data: Tuple[str, float], rarity: int, stats_index: Optional[int]=None, set_level: int=None, check=True) -> Optional[Tuple[int, int, float]]: """ 说明: 计算副词条的详细信息 (如强化次数、档位积分,以及提高原数据的小数精度) @@ -2078,12 +2085,20 @@ def get_subs_stats_detail(self, data: Tuple[str, float], rarity: int, stats_inde 可以作为副词条校验函数 (可以检测出大部分的OCR错误) 支持五星遗器与四星遗器 注意: - 此方法8个挡位积分会归为1次强化次数,例如 (4,8)=(5,0) (5,9)=(6,1) (6,12)=(7,4) - 可通过判断整体副词条强化次数是否超限来修正部分情况下的数值 (初始3词条的情形无法修正) + 此方法挡位积分达到阈值会归为1次强化次数,例如 (4,8)=(5,0) (5,9)=(6,1) (6,12)=(7,4) + 五星'速度'词条与上述类似,但不完全满足上述规律,无法机械修正,需进行重新计算 + 可通过判断[1]个体强化次数是否达到7或[2]整体副词条强化次数是否超限来修正部分情况下的数值 + 缺陷: + 初始3词条的情形无法通过上述方法修正 + (基本无伤大雅,此时计算所得的修正数值与词条数为真实值,仅强化次数有二义性) + 但是,初始3词条,五星'速度'词条在未精确小数位时,可能出现修正数值的二义性, + 例如 13 既可以是 (6, 4, 13.2),也可以是 (5, 10, 13.0),这是较大的缺陷 + 在精确小数位后可解决该二义性,但需具备精确与否的标记【待扩展】 参数: :param data: 遗器副词条键值对 :param stats_index: 遗器副词条索引 :param rarity: 遗器稀有度 + :param set_level: 设定指定的强化次数进行计算 :param check: 开启校验 返回: :return level: 强化次数: 0次强化记为1,最高5次强化为6 @@ -2100,16 +2115,21 @@ def get_subs_stats_detail(self, data: Tuple[str, float], rarity: int, stats_inde a_ = int(a) # 从个分位截断小数 else: a_ = int(a * 10)/10 # 从十分位截断小数 - level = int(value / a_) # 向下取整 - a_ = a_ if name == _("速度") else a # 给四星速度打补丁 + if set_level: + level = set_level + else: + level = int(value / a_) # 向下取整 + if level == 7: # 修正极端情况下的挡位积分进位 + level = 6 + a_ = a_ if name == _("速度") else a # 给四星速度打补丁 score = (math.ceil((value - a_*level) / d - 1.e-6)) # 向上取整 (考虑浮点数运算的数值损失) if score < 0: # 总分小于零打补丁 (由于真实总分过大导致) level -= 1 score = math.ceil((value - a_*level) / d - 1.e-6) result = round(a*level + d*score, 4) # 四舍五入 (考虑浮点数运算的数值损失) + log.debug(f"({name}, {value}): [{a}, {d}], l={level}, s={score}, r={result}") # 不启用校验,用于统计词条使用 if not check: - log.debug(f"({name}, {value}): [{a}, {d}], l={level}, s={score}, r={result}") return (level, score, result) # 校验数据 check = result - value @@ -2119,7 +2139,6 @@ def get_subs_stats_detail(self, data: Tuple[str, float], rarity: int, stats_inde level > 6 or level < 1 or \ score > level*2 or score < 0: log.error(_(f"校验失败,原数据或计算方法有误: {data}")) - log.debug(f"[{a}, {d}], l={level}, s={score}, r={result}") return None return (level, score, result)