diff --git a/src/classes/action/breakthrough.py b/src/classes/action/breakthrough.py index 3235697..c85e3a1 100644 --- a/src/classes/action/breakthrough.py +++ b/src/classes/action/breakthrough.py @@ -7,7 +7,7 @@ from src.classes.event import Event from src.classes.cultivation import Realm from src.classes.story_teller import StoryTeller from src.classes.tribulation import TribulationSelector -from src.classes.hp_and_mp import HP_MAX_BY_REALM, MP_MAX_BY_REALM +from src.classes.hp_and_mp import HP_MAX_BY_REALM from src.classes.effect import _merge_effects # —— 配置:哪些"出发境界"会生成突破小故事(global var)—— @@ -59,9 +59,9 @@ class Breakthrough(TimedAction): self.avatar.cultivation_progress.break_through() new_realm = self.avatar.cultivation_progress.realm - # 突破成功时更新HP和MP的最大值 + # 突破成功时更新HP的最大值 if new_realm != old_realm: - self._update_hp_mp_on_breakthrough(new_realm) + self._update_hp_on_breakthrough(new_realm) # 成功:确保最大寿元至少达到新境界的基线 self.avatar.age.ensure_max_lifespan_at_least_realm_base(new_realm) # 记录结果用于 finish 事件 @@ -77,25 +77,21 @@ class Breakthrough(TimedAction): # 记录结果用于 finish 事件 self._last_result = ("fail", int(reduce_years)) - def _update_hp_mp_on_breakthrough(self, new_realm): + def _update_hp_on_breakthrough(self, new_realm): """ - 突破境界时更新HP和MP的最大值并完全恢复 + 突破境界时更新HP的最大值并完全恢复 Args: new_realm: 新的境界 """ new_max_hp = HP_MAX_BY_REALM.get(new_realm, 100) - new_max_mp = MP_MAX_BY_REALM.get(new_realm, 100) # 计算增加的最大值 hp_increase = new_max_hp - self.avatar.hp.max - mp_increase = new_max_mp - self.avatar.mp.max # 更新最大值并恢复相应的当前值 self.avatar.hp.add_max(hp_increase) self.avatar.hp.recover(hp_increase) # 突破时完全恢复HP - self.avatar.mp.add_max(mp_increase) - self.avatar.mp.recover(mp_increase) # 突破时完全恢复MP def can_start(self) -> tuple[bool, str]: ok = self.avatar.cultivation_progress.can_break_through() diff --git a/src/classes/avatar.py b/src/classes/avatar.py index cbdc074..305c448 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -33,7 +33,7 @@ from src.classes.auxiliary import Auxiliary from src.classes.weapon_type import WeaponType from src.classes.equipment_grade import EquipmentGrade from src.classes.magic_stone import MagicStone -from src.classes.hp_and_mp import HP, MP, HP_MAX_BY_REALM, MP_MAX_BY_REALM +from src.classes.hp_and_mp import HP, HP_MAX_BY_REALM from src.utils.id_generator import get_avatar_id from src.utils.config import CONFIG from src.classes.relation import Relation, get_reciprocal @@ -93,7 +93,6 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): magic_stone: MagicStone = field(default_factory=lambda: MagicStone(0)) # 灵石,即货币 items: dict[Item, int] = field(default_factory=dict) hp: HP = field(default_factory=lambda: HP(0, 0)) # 将在__post_init__中初始化 - mp: MP = field(default_factory=lambda: MP(0, 0)) # 将在__post_init__中初始化 relations: dict["Avatar", Relation] = field(default_factory=dict) alignment: Alignment | None = None # 所属宗门(可为空,表示散修/无门无派) @@ -120,15 +119,13 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): def __post_init__(self): """ - 在Avatar创建后自动初始化tile和HP/MP + 在Avatar创建后自动初始化tile和HP """ self.tile = self.world.map.get_tile(self.pos_x, self.pos_y) - # 根据当前境界初始化HP和MP + # 根据当前境界初始化HP max_hp = HP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100) - max_mp = MP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100) self.hp = HP(max_hp, max_hp) - self.mp = MP(max_mp, max_mp) # 最大寿元已在 Age 构造时基于境界初始化 @@ -152,7 +149,7 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): - # 初始化时计算所有长期效果(HP/MP等) + # 初始化时计算所有长期效果(HP等) self.recalc_effects() @property @@ -249,7 +246,6 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): "性别": str(self.gender), "年龄": str(self.age), "hp": str(self.hp), - "mp": str(self.mp), "灵石": magic_stone_info, "关系": relations_info, "宗门": sect_info, @@ -292,7 +288,6 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): "realm": self.cultivation_progress.realm.value, "level": self.cultivation_progress.level, "hp": {"cur": self.hp.cur, "max": self.hp.max}, - "mp": {"cur": self.mp.cur, "max": self.mp.max}, "alignment": str(self.alignment) if self.alignment else "未知", "magic_stone": self.magic_stone.value, "thinking": self.thinking, @@ -690,7 +685,6 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): add_kv(lines, "阵营", self.alignment) add_kv(lines, "境界", str(self.cultivation_progress)) add_kv(lines, "HP", self.hp) - add_kv(lines, "MP", self.mp) add_kv(lines, "战斗力", int(get_base_strength(self))) add_kv(lines, "宗门", self.get_sect_str()) @@ -850,26 +844,22 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): - 也会重新计算动态表达式(如 eval(...)) 当前包括: - - HP/MP 最大值 + - HP 最大值 - 寿命最大值 """ # 计算基础最大值(基于境界) base_max_hp = HP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100) - base_max_mp = MP_MAX_BY_REALM.get(self.cultivation_progress.realm, 100) # 访问 self.effects 会触发 @property,重新 merge 所有 effects effects = self.effects extra_max_hp = int(effects.get("extra_max_hp", 0)) - extra_max_mp = int(effects.get("extra_max_mp", 0)) extra_max_lifespan = int(effects.get("extra_max_lifespan", 0)) # 计算新的最大值 new_max_hp = base_max_hp + extra_max_hp - new_max_mp = base_max_mp + extra_max_mp # 更新最大值 self.hp.max = new_max_hp - self.mp.max = new_max_mp # 更新寿命 # 如果 effects 中有额外寿命加成,需要加到 base_max_lifespan 上吗? @@ -884,8 +874,6 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin): # 调整当前值(不超过新的最大值) if self.hp.cur > new_max_hp: self.hp.cur = new_max_hp - if self.mp.cur > new_max_mp: - self.mp.cur = new_max_mp def change_weapon(self, new_weapon: Weapon) -> None: """ diff --git a/src/classes/hp_and_mp.py b/src/classes/hp_and_mp.py index 7738186..8c3754f 100644 --- a/src/classes/hp_and_mp.py +++ b/src/classes/hp_and_mp.py @@ -82,87 +82,3 @@ HP_MAX_BY_REALM = { Realm.Core_Formation: 300, Realm.Nascent_Soul: 400, } - - -@dataclass -class MP: - """ - 灵力 - 会因为战斗而消耗cur。 - 会随时间或者服用丹药等补充cur。 - 会因为突破境界,服用丹药等增加max。 - """ - max: int - cur: int - - def can_cast(self, value_2_cast:int) -> bool: - return self.cur >= value_2_cast - - def reduce(self, value_2_reduce:int) -> bool: - self.cur -= value_2_reduce - if self.cur < 0: - self.cur = 0 - return True - - def recover(self, value_2_recover:int) -> bool: - self.cur += value_2_recover - if self.cur > self.max: - self.cur = self.max - return True - - def __str__(self) -> str: - return f"{self.cur}/{self.max}" - - def __repr__(self) -> str: - return self.__str__() - - # 比较运算符,使用cur进行比较 - def __eq__(self, other) -> bool: - if isinstance(other, MP): - return self.cur == other.cur - return self.cur == other - - def __ne__(self, other) -> bool: - if isinstance(other, MP): - return self.cur != other.cur - return self.cur != other - - def __lt__(self, other) -> bool: - if isinstance(other, MP): - return self.cur < other.cur - return self.cur < other - - def __le__(self, other) -> bool: - if isinstance(other, MP): - return self.cur <= other.cur - return self.cur <= other - - def __gt__(self, other) -> bool: - if isinstance(other, MP): - return self.cur > other.cur - return self.cur > other - - def __ge__(self, other) -> bool: - if isinstance(other, MP): - return self.cur >= other.cur - return self.cur >= other - - def add_max(self, value_2_add:int) -> bool: - self.max += value_2_add - return True - - def to_dict(self) -> dict: - """转换为可序列化的字典""" - return {"max": self.max, "cur": self.cur} - - @classmethod - def from_dict(cls, data: dict) -> "MP": - """从字典重建MP""" - return cls(max=data["max"], cur=data["cur"]) - -MP_MAX_BY_REALM = { - Realm.Qi_Refinement: 100, - Realm.Foundation_Establishment: 200, - Realm.Core_Formation: 300, - Realm.Nascent_Soul: 400, -} \ No newline at end of file diff --git a/src/sim/load/avatar_load_mixin.py b/src/sim/load/avatar_load_mixin.py index c44db46..3ae9e5e 100644 --- a/src/sim/load/avatar_load_mixin.py +++ b/src/sim/load/avatar_load_mixin.py @@ -38,7 +38,7 @@ class AvatarLoadMixin: from src.classes.calendar import MonthStamp from src.classes.cultivation import Realm, CultivationProgress from src.classes.age import Age - from src.classes.hp_and_mp import HP, MP + from src.classes.hp_and_mp import HP from src.classes.technique import techniques_by_id from src.classes.item import items_by_id from src.classes.weapon import weapons_by_id @@ -84,9 +84,8 @@ class AvatarLoadMixin: if technique_id is not None: avatar.technique = techniques_by_id.get(technique_id) - # 设置HP/MP + # 设置HP avatar.hp = HP.from_dict(data["hp"]) - avatar.mp = MP.from_dict(data["mp"]) # 设置物品与资源 avatar.magic_stone = MagicStone(data.get("magic_stone", 0)) diff --git a/src/sim/save/avatar_save_mixin.py b/src/sim/save/avatar_save_mixin.py index 8765349..d720af3 100644 --- a/src/sim/save/avatar_save_mixin.py +++ b/src/sim/save/avatar_save_mixin.py @@ -71,7 +71,6 @@ class AvatarSaveMixin: "root": self.root.name, "technique_id": self.technique.id if self.technique else None, "hp": self.hp.to_dict(), - "mp": self.mp.to_dict(), # 物品与资源 "magic_stone": self.magic_stone.value, diff --git a/web/src/components/game/panels/info/AvatarDetail.vue b/web/src/components/game/panels/info/AvatarDetail.vue index d6ad3ce..11bde79 100644 --- a/web/src/components/game/panels/info/AvatarDetail.vue +++ b/web/src/components/game/panels/info/AvatarDetail.vue @@ -74,7 +74,7 @@ async function handleClearObjective() { - +