feat: 使用预处理特效伤害数组

This commit is contained in:
2026-07-06 02:02:05 +08:00
parent 91eed49d28
commit 34dfb3f217
6 changed files with 515 additions and 469 deletions
+43 -6
View File
@@ -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)