From 9b35f8c21e44f1c9c2a897a27c4494708c507fc7 Mon Sep 17 00:00:00 2001 From: "heinu.01" <791583861@qq.com> Date: Tue, 23 Jun 2026 12:02:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=A5=B6=E5=85=B3=E8=81=94?= =?UTF-8?q?=E7=BB=93=E5=A9=9A=E5=B1=9E=E6=80=A7=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/core/basic/character/calc_carry.py | 3 +- backend/core/basic/character_old.py | 3 +- backend/core/basic/formula.py | 24 ++--- backend/core/equipment/version_0/sundry.py | 2 + backend/tests/unit/test_base_attributes.py | 20 +++++ .../tests/unit/test_system_buff_marriage.py | 88 +++++++++++++++++++ 6 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 backend/tests/unit/test_base_attributes.py create mode 100644 backend/tests/unit/test_system_buff_marriage.py diff --git a/backend/core/basic/character/calc_carry.py b/backend/core/basic/character/calc_carry.py index 6a72509a..99d86ff1 100644 --- a/backend/core/basic/character/calc_carry.py +++ b/backend/core/basic/character/calc_carry.py @@ -37,8 +37,9 @@ class CalcCarryMixin(CharacterBase): # 力智系数 value0_1 = getattr(self, attrs[0]) value0_2 = 获取基础属性(self.角色, self.职业)[0] if attrs[0] == 'STR' else 获取基础属性(self.角色, self.职业)[1] + marriage_correction = getattr(self, 'system_buff_marriage_correction', 0) if attrs[0] == 'STR' else 0 # 系统奶及奶系增幅 - value = value0_1 + ((value0_1 - value0_2) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) + value = value0_1 + ((value0_1 - value0_2 - marriage_correction) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) ratio_0: float = value / 250 + 1 # 物理/魔法/独立攻击力 ratio_1: float = getattr(self, attrs[1]) + 30000 * (1 if BUFF else 0) diff --git a/backend/core/basic/character_old.py b/backend/core/basic/character_old.py index 8d7a1da6..d74bc22d 100644 --- a/backend/core/basic/character_old.py +++ b/backend/core/basic/character_old.py @@ -916,8 +916,9 @@ class Character(CharacterProperty): # 力智系数 value0_1 = getattr(self, attrs[0]) value0_2 = 获取基础属性(self.角色, self.职业)[0] if attrs[0] == 'STR' else 获取基础属性(self.角色, self.职业)[1] + marriage_correction = getattr(self, 'system_buff_marriage_correction', 0) if attrs[0] == 'STR' else 0 # 系统奶及奶系增幅 - value = value0_1 + ((value0_1 - value0_2) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) + value = value0_1 + ((value0_1 - value0_2 - marriage_correction) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) ratio_0: float = value / 250 + 1 # 物理/魔法/独立攻击力 ratio_1: float = getattr(self, attrs[1]) + 30000 * (1 if BUFF else 0) diff --git a/backend/core/basic/formula.py b/backend/core/basic/formula.py index dc328e30..dc32d9a2 100644 --- a/backend/core/basic/formula.py +++ b/backend/core/basic/formula.py @@ -342,7 +342,7 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', # region 角色基础属性 -当前等级 = 110 +当前等级 = 115 # 力量 体力 智力 精神 角色基础系数 = { @@ -389,7 +389,7 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', '枪炮师-神枪手(女)': (5.5, 5.5, 3.5, 3.5), '机械师-神枪手(女)': (3.5, 3.5, 5.5, 5.5), '弹药专家-神枪手(女)': (4.7, 4.3, 4.7, 4.3), - '协战师-神枪手(女)': (3.5, 5.5, 3.5, 5.5), + '协战师-神枪手(女)': (5.5, 3, 4, 5.5), '漫游枪手-神枪手(男)': (5.5, 5.5, 3.5, 3.5), '枪炮师-神枪手(男)': (5.5, 5.5, 3.5, 3.5), '机械师-神枪手(男)': (3.5, 3.5, 5.5, 5.5), @@ -403,9 +403,9 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', '召唤师-魔法师(女)': (3.8, 3.7, 5.3, 5.2), '战斗法师-魔法师(女)': (5, 4, 5, 4), '魔道学者-魔法师(女)': (4.5, 4, 5.2, 4.3), - '小魔女-魔法师(女)': (4.7, 4.8, 5.5, 4.5), + '小魔女-魔法师(女)': (3.5, 4.5, 5.5, 4.5), '元素爆破师-魔法师(男)': (3.5, 3.5, 5.5, 5.5), - '冰结师-魔法师(男)': (3.5, 3.7, 5.5, 5.2), + '冰结师-魔法师(男)': (3.5, 3.8, 5.5, 5.2), '血法师-魔法师(男)': (5.5, 5.5, 3.5, 3.5), '逐风者-魔法师(男)': (5.5, 5.2, 3.5, 3.8), '次元行者-魔法师(男)': (3.5, 3.5, 5.5, 5.5), @@ -425,7 +425,7 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', '暗殿骑士-鬼剑士(女)': (3.5, 3.5, 5.5, 5.5), '契魔者-鬼剑士(女)': (5.5, 5.5, 3.5, 3.5), '流浪武士-鬼剑士(女)': (5.5, 5.5, 3.5, 3.5), - '圣骑士-圣职者(男)': (3.5, 5.5, 4.5, 5.5), + '圣骑士-圣职者(男)': (3.5, 5.5, 3.5, 5.5), '蓝拳圣使-圣职者(男)': (5.2, 5, 3.9, 3.9), '驱魔师-圣职者(男)': (5, 4, 5, 4), '复仇者-圣职者(男)': (3.5, 3.5, 5.5, 5.5), @@ -438,8 +438,8 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', # todo '缪斯-弓箭手': (3.5, 5.5, 3.5, 5.5), '旅人-弓箭手': (5.5, 5.5, 3.5, 3.5), - '猎人-弓箭手': (5.5, 5.5, 3.5, 3.5), - '妖护使-弓箭手': (5.5, 5.5, 5.5, 3.5), + '猎人-弓箭手': (5.5, 5, 3.5, 4), + '妖护使-弓箭手': (3.5, 3.5, 5.5, 5.5), '奇美拉-弓箭手': (5.5, 5.5, 3.5, 3.5), # '破浪者-帝国骑士': (6, 5.5, 3.5, 3.5), @@ -601,11 +601,11 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', def 获取基础属性(角色, 职业): 角色数据 = 角色基础系数[角色] 职业数据 = 职业基础数据[职业 + '-' + 角色] - # TODO 将93 + 当前等级 角色基础数据+94 角色成长全部+1 - 力量 = int(角色数据[4] + 角色数据[0] * min(14, 当前等级 - 1) + 94 + (职业数据[0] + 1) * max(当前等级 - 15, 0)) - 体力 = int(角色数据[5] + 角色数据[1] * min(14, 当前等级 - 1) + 94 + (职业数据[1] + 1) * max(当前等级 - 15, 0)) - 智力 = int(角色数据[6] + 角色数据[2] * min(14, 当前等级 - 1) + 94 + (职业数据[2] + 1) * max(当前等级 - 15, 0)) - 精神 = int(角色数据[7] + 角色数据[3] * min(14, 当前等级 - 1) + 94 + (职业数据[3] + 1) * max(当前等级 - 15, 0)) + 基础补正 = 当前等级 - 7 + 力量 = int(角色数据[4] + 角色数据[0] * min(14, 当前等级 - 1) + 基础补正 + (职业数据[0] + 1) * max(当前等级 - 15, 0)) + 体力 = int(角色数据[5] + 角色数据[1] * min(14, 当前等级 - 1) + 基础补正 + (职业数据[1] + 1) * max(当前等级 - 15, 0)) + 智力 = int(角色数据[6] + 角色数据[2] * min(14, 当前等级 - 1) + 基础补正 + (职业数据[2] + 1) * max(当前等级 - 15, 0)) + 精神 = int(角色数据[7] + 角色数据[3] * min(14, 当前等级 - 1) + 基础补正 + (职业数据[3] + 1) * max(当前等级 - 15, 0)) return (力量, 智力, 体力, 精神) diff --git a/backend/core/equipment/version_0/sundry.py b/backend/core/equipment/version_0/sundry.py index f95171ad..7771148e 100644 --- a/backend/core/equipment/version_0/sundry.py +++ b/backend/core/equipment/version_0/sundry.py @@ -58,6 +58,7 @@ def sundry_7(char: CharacterProperty, *args): 婚房婚戒 婚戒属强不享受辟邪玉加成 """ + char.system_buff_marriage_correction = 0 # 婚戒 if args[0] == 1: char.SetStatus(全属强=1) @@ -72,6 +73,7 @@ def sundry_7(char: CharacterProperty, *args): char.SetStatus(体精=8) elif args[1] == 2: char.SetStatus(体精=10, 力智=15) + char.system_buff_marriage_correction = 15 @register diff --git a/backend/tests/unit/test_base_attributes.py b/backend/tests/unit/test_base_attributes.py new file mode 100644 index 00000000..c25c703b --- /dev/null +++ b/backend/tests/unit/test_base_attributes.py @@ -0,0 +1,20 @@ +import pytest + +from core.basic.formula import 当前等级, 获取基础属性 + + +@pytest.mark.parametrize( + ('role', 'job', 'expected'), + [ + ('格斗家(女)', '气功师', (635, 818, 635, 818)), + ('神枪手(女)', '协战师', (827, 676, 577, 826)), + ('圣职者(男)', '圣骑士', (630, 618, 831, 827)), + ('魔法师(女)', '小魔女', (618, 835, 718, 735)), + ('魔法师(男)', '冰结师', (611, 843, 648, 805)), + ('弓箭手', '猎人', (828, 625, 778, 675)), + ('弓箭手', '妖护使', (628, 825, 628, 825)), + ], +) +def test_level_115_base_attributes_match_2604_sheet(role, job, expected): + assert 当前等级 == 115 + assert 获取基础属性(role, job) == expected diff --git a/backend/tests/unit/test_system_buff_marriage.py b/backend/tests/unit/test_system_buff_marriage.py new file mode 100644 index 00000000..d414b392 --- /dev/null +++ b/backend/tests/unit/test_system_buff_marriage.py @@ -0,0 +1,88 @@ +from types import SimpleNamespace + +import pytest + +from core.basic.character import calc_carry +from core.basic.character.calc_carry import CalcCarryMixin +from core.equipment.version_0.sundry import sundry_7 + + +class StatusTarget: + def __init__(self): + self.status_calls = [] + + def SetStatus(self, **kwargs): + self.status_calls.append(kwargs) + + +def make_carry(output_type: str): + return SimpleNamespace( + 输出类型=output_type, + 角色='test-role', + 职业='test-job', + STR=8700, + INT=8700, + AtkP=4500, + AtkM=4500, + AtkI=4500, + PAtkP=1, + PAtkM=1, + PAtkI=1, + ElementDB={'火': 0}, + buff=1, + SkillAttack=1, + jade_effect=SimpleNamespace(SkillAttack=0, AttackP=0), + Attack=0, + AttackP=1, + ElementIncrease=1, + system_buff_marriage_correction=15, + ) + + +def test_marriage_attributes_enable_system_buff_correction(): + target = StatusTarget() + + sundry_7(target, 4, 2) + + assert target.system_buff_marriage_correction == 15 + assert {'体精': 10, '力智': 15} in target.status_calls + + +def test_marriage_correction_resets_when_attribute_is_not_selected(): + target = StatusTarget() + sundry_7(target, 4, 2) + + sundry_7(target, 4, 0) + + assert target.system_buff_marriage_correction == 0 + + +@pytest.mark.parametrize( + ('output_type', 'expected_correction'), + [ + ('物理百分比', 15), + ('魔法百分比', 0), + ], +) +def test_system_buff_applies_marriage_correction_by_main_stat( + monkeypatch, output_type, expected_correction +): + monkeypatch.setattr(calc_carry, '获取基础属性', lambda *_: (818, 818, 818, 818)) + carry = make_carry(output_type) + + ratios = CalcCarryMixin.calc_damage_ration(carry, DSB=True, BUFF=False) + + system_buff = (8700 - 818 - expected_correction) * 3.08 + 2886 + assert ratios[0] == pytest.approx((8700 + system_buff) / 250 + 1) + + +def test_system_buff_matches_2604_sheet_light_nen_example(): + carry = make_carry('魔法百分比') + carry.角色 = '格斗家(女)' + carry.职业 = '气功师' + + ratios = CalcCarryMixin.calc_damage_ration(carry, DSB=True, BUFF=False) + + final_intelligence = (ratios[0] - 1) * 250 + assert final_intelligence - 8700 == pytest.approx(27162.56) + assert final_intelligence == pytest.approx(35862.56) -- 2.54.0