feat: 使用预处理特效伤害数组
This commit is contained in:
@@ -167,7 +167,7 @@ class CalcEquipMixin(CharacterBase):
|
||||
apply_uppercase_attrs(self, suit)
|
||||
if func is not None and oathEffect is None:
|
||||
# print(f'套装 {suit.name} 生效')
|
||||
func(self)
|
||||
func(self, suit.effectDamage)
|
||||
if max_point_suit != max_point_oath_suit:
|
||||
self.charOathSkillId = '1'
|
||||
oathSkillEffect = []
|
||||
@@ -187,7 +187,9 @@ class CalcEquipMixin(CharacterBase):
|
||||
# 誓约套装效果生效
|
||||
apply_uppercase_attrs(self, oathSuit)
|
||||
if skill is not None:
|
||||
oathSkillEffect.append(skill)
|
||||
base_suit = next((x for x in suitList if x.suitId == oathSuit.suitId), None)
|
||||
base_effect_damage = [] if base_suit is None else base_suit.effectDamage
|
||||
oathSkillEffect.append((skill, base_effect_damage + skill.effectDamage))
|
||||
# 誓约技能效果生效
|
||||
apply_uppercase_attrs(self, skill)
|
||||
self.oathSkillInfo.append(skill)
|
||||
@@ -205,11 +207,11 @@ class CalcEquipMixin(CharacterBase):
|
||||
'skills': [{'id': skill.id, 'skillId': i.skillId, 'name': i.name, 'imageUrl': i.imageUrl, 'enable': i.skillId == '1' or max_point_oath_suit == max_point_suit} for i in skills],
|
||||
# 'value': oathSuit.value,
|
||||
}
|
||||
for skill in oathSkillEffect:
|
||||
for skill, effectDamage in oathSkillEffect:
|
||||
func = equs.funs.execture(f'oath_skill_{skill.id}')
|
||||
if func is not None:
|
||||
# print(f'誓约技能 {skill.id} 生效')
|
||||
func(self)
|
||||
func(self, effectDamage)
|
||||
# 太初积分以上,每超过70点数增加1%技能攻击力
|
||||
if self.max_point >= 2550:
|
||||
skillAttack = (self.max_point - 2550) // 70 * 0.02
|
||||
@@ -235,7 +237,7 @@ class CalcEquipMixin(CharacterBase):
|
||||
if fun is None:
|
||||
continue
|
||||
apply_uppercase_attrs(self, equ)
|
||||
fun(self)
|
||||
fun(self, equ.effectDamage)
|
||||
fun = effects.execture(f'enchant_{enchat}')
|
||||
if fun is not None:
|
||||
fun(self)
|
||||
|
||||
@@ -20,6 +20,46 @@ def parse_to_int_list(info: str, default: Sequence[int] = (0,)) -> list[int]:
|
||||
return list(default) if not info else [int(i) for i in info.split(',')]
|
||||
|
||||
|
||||
def extract_effect_damage(text: str | None) -> list[float]:
|
||||
if not text:
|
||||
return []
|
||||
|
||||
matches: list[tuple[int, int, str]] = []
|
||||
patterns = [
|
||||
r'(?:伤害量|攻击力)\s*[::]?\s*([\d,]+)%',
|
||||
r'(?<!技能)伤害\s*[::]\s*([\d,]+)%',
|
||||
r'造成\s*([\d,]+)%\s*的伤害',
|
||||
]
|
||||
for pattern in patterns:
|
||||
for match in re.finditer(pattern, text):
|
||||
matches.append((match.start(), match.end(), match.group(1)))
|
||||
|
||||
in_damage_info = False
|
||||
offset = 0
|
||||
for line in text.splitlines(keepends=True):
|
||||
if '伤害量信息' in line:
|
||||
in_damage_info = True
|
||||
offset += len(line)
|
||||
continue
|
||||
if in_damage_info and not line.strip():
|
||||
in_damage_info = False
|
||||
offset += len(line)
|
||||
continue
|
||||
if in_damage_info:
|
||||
for match in re.finditer(r'[::]\s*([\d,]+)%', line):
|
||||
matches.append((offset + match.start(), offset + match.end(), match.group(1)))
|
||||
offset += len(line)
|
||||
|
||||
result: list[float] = []
|
||||
seen: list[tuple[int, int]] = []
|
||||
for start, end, value in sorted(matches, key=lambda item: item[0]):
|
||||
if any(start < seen_end and end > seen_start for seen_start, seen_end in seen):
|
||||
continue
|
||||
seen.append((start, end))
|
||||
result.append(float(value.replace(',', '')))
|
||||
return result
|
||||
|
||||
|
||||
class Equ:
|
||||
id: str
|
||||
name: str
|
||||
@@ -130,8 +170,7 @@ class Equipments:
|
||||
setattr(item, attr, value)
|
||||
equ_dict = {k: v for k, v in item.__dict__.items() if not k.startswith('_')}
|
||||
equ_dict['max_adaptation'] = max_adaptation
|
||||
effect_damage = re.findall(r'(?:伤害量|攻击力) : ([\d,]+)%', equ_dict.get('detail', '') if equ_dict.get('detail', '') else '')
|
||||
equ_dict['effectDamage'] = [float(i.replace(',', '')) for i in effect_damage] if effect_damage else []
|
||||
equ_dict['effectDamage'] = extract_effect_damage(equ_dict.get('detail'))
|
||||
equ = Equ(**equ_dict)
|
||||
self.equs.append(equ)
|
||||
self.equ_dict[equ.id] = equ
|
||||
@@ -175,8 +214,7 @@ class Equipments:
|
||||
suit['Attack'] = 0 if i - 1 >= len(attacks) else attacks[i - 1]
|
||||
buffers = parse_to_number_list(suit['Buffer'], [0])
|
||||
suit['Buffer'] = 0 if i - 1 >= len(buffers) else buffers[i - 1]
|
||||
effect_damage = re.findall(r'(?:伤害量|攻击力) : ([\d,]+)%', suit.get('value', '') if suit.get('value', '') else '')
|
||||
suit['effectDamage'] = [float(i.replace(',', '')) for i in effect_damage] if effect_damage else []
|
||||
suit['effectDamage'] = extract_effect_damage(suit.get('value'))
|
||||
suit_obj = Suit(**suit)
|
||||
self.suits.append(suit_obj)
|
||||
self.suit_dict.setdefault(str(suit['suitId']), []).append(suit_obj)
|
||||
@@ -262,8 +300,7 @@ class Equipments:
|
||||
buffers = parse_to_number_list(skill['Buffer'], [0])
|
||||
skill['Buffer'] = 0 if i - 1 >= len(buffers) else buffers[i - 1]
|
||||
skill['level'] = i
|
||||
effect_damage = re.findall(r'(?:伤害量|攻击力) : ([\d,]+)%', skill.get('value', '') if skill.get('value', '') else '')
|
||||
skill['effectDamage'] = [float(i.replace(',', '')) for i in effect_damage] if effect_damage else []
|
||||
skill['effectDamage'] = extract_effect_damage(skill.get('value'))
|
||||
skill_obj = OathSuitSkill(**skill)
|
||||
skill_list.append(skill_obj)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user