Spaces:
Runtime error
Runtime error
File size: 4,830 Bytes
025687f 2452398 025687f 5825182 025687f 2f63a42 b76daae f0b1638 025687f 5825182 025687f 2f63a42 025687f 2452398 ef62e40 5825182 2452398 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 2452398 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 5825182 ef62e40 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
from dataclasses import dataclass
from typing import Dict, List, Union
from base.attribute import Attribute
from base.skill import Skill
ATTR_DICT = Dict[str, Union[List[int], int]]
@dataclass
class Buff:
buff_id: int
buff_name: str
buff_level: int = 0
buff_stack: int = 1
activate: bool = True
gain_skills: Dict[int, ATTR_DICT] = None
gain_attributes: ATTR_DICT = None
SNAPSHOT_ATTRS = ["attack_power", "critical_strike", "critical_power", "strain", "damage_addition"]
def __post_init__(self):
if self.gain_skills is None:
self.gain_skills = {}
if self.gain_attributes is None:
self.gain_attributes = {}
@property
def display_name(self):
return f"{self.buff_name}/{self.buff_id}-{self.buff_level}-{self.buff_stack}"
def level_value(self, value):
if isinstance(value, list):
return value[self.buff_level - 1]
else:
return value
def add(self, attribute: Attribute, skill: Skill, snapshot=None):
if snapshot is None:
self.add_all(attribute, skill)
elif snapshot:
self.add_snapshot(attribute, skill)
else:
self.add_current(attribute, skill)
def add_all(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
setattr(attribute, attr, getattr(attribute, attr) + self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
setattr(skill, attr, getattr(skill, attr) + self.level_value(value) * self.buff_stack)
def add_snapshot(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
if all(snapshot_attr not in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(attribute, attr, getattr(attribute, attr) + self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
if all(snapshot_attr not in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(skill, attr, getattr(skill, attr) + self.level_value(value) * self.buff_stack)
def add_current(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
if any(snapshot_attr in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(attribute, attr, getattr(attribute, attr) + self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
if any(snapshot_attr in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(skill, attr, getattr(skill, attr) + self.level_value(value) * self.buff_stack)
def sub(self, attribute: Attribute, skill: Skill, snapshot=None):
if snapshot is None:
self.sub_all(attribute, skill)
elif snapshot:
self.sub_snapshot(attribute, skill)
else:
self.sub_current(attribute, skill)
def sub_all(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
setattr(attribute, attr, getattr(attribute, attr) - self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
setattr(skill, attr, getattr(skill, attr) - self.level_value(value) * self.buff_stack)
def sub_snapshot(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
if all(snapshot_attr not in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(attribute, attr, getattr(attribute, attr) - self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
if all(snapshot_attr not in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(skill, attr, getattr(skill, attr) - self.level_value(value) * self.buff_stack)
def sub_current(self, attribute: Attribute, skill: Skill):
for attr, value in self.gain_attributes.items():
if any(snapshot_attr in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(attribute, attr, getattr(attribute, attr) - self.level_value(value) * self.buff_stack)
for attr, value in self.gain_skills.get(skill.skill_id, {}).items():
if any(snapshot_attr in attr for snapshot_attr in self.SNAPSHOT_ATTRS):
continue
setattr(skill, attr, getattr(skill, attr) - self.level_value(value) * self.buff_stack)
|