From 84027fc1d774bd545b9b3d0fd640c0cf4ee38cdb Mon Sep 17 00:00:00 2001 From: 4thfever Date: Mon, 26 Jan 2026 23:18:11 +0800 Subject: [PATCH] Feat/retreat (#104) * feat: add retreat --- docs/specs/action_isolation.md | 56 +++++++ src/classes/action/__init__.py | 3 + src/classes/action/action.py | 6 + src/classes/action/retreat.py | 141 ++++++++++++++++++ src/classes/auxiliary.py | 5 +- src/classes/avatar/action_mixin.py | 15 ++ src/classes/avatar/core.py | 36 +++-- src/classes/effect/__init__.py | 1 + src/classes/effect/consts.py | 13 ++ src/classes/effect/desc.py | 1 + src/classes/effect/mixin.py | 15 ++ src/classes/fortune.py | 4 + src/classes/gathering/auction.py | 8 +- src/classes/misfortune.py | 4 + .../locales/en_US/LC_MESSAGES/messages.mo | Bin 53767 -> 55177 bytes .../locales/en_US/LC_MESSAGES/messages.po | 43 +++++- .../locales/zh_CN/LC_MESSAGES/messages.mo | Bin 50368 -> 51603 bytes .../locales/zh_CN/LC_MESSAGES/messages.po | 39 +++++ src/sim/load/avatar_load_mixin.py | 3 + src/sim/save/avatar_save_mixin.py | 1 + .../locales/en-US/game_configs/auxiliary.csv | 4 +- .../game_configs/celestial_phenomenon.csv | 4 +- static/locales/en-US/game_configs/persona.csv | 14 +- static/locales/en-US/game_configs/root.csv | 2 +- static/locales/en-US/game_configs/sect.csv | 2 +- .../locales/en-US/game_configs/technique.csv | 2 +- .../locales/zh-CN/game_configs/auxiliary.csv | 4 +- .../game_configs/celestial_phenomenon.csv | 4 +- static/locales/zh-CN/game_configs/persona.csv | 14 +- static/locales/zh-CN/game_configs/root.csv | 2 +- static/locales/zh-CN/game_configs/sect.csv | 2 +- .../locales/zh-CN/game_configs/technique.csv | 2 +- tests/test_action_retreat.py | 140 +++++++++++++++++ 33 files changed, 544 insertions(+), 46 deletions(-) create mode 100644 docs/specs/action_isolation.md create mode 100644 src/classes/action/retreat.py create mode 100644 tests/test_action_retreat.py diff --git a/docs/specs/action_isolation.md b/docs/specs/action_isolation.md new file mode 100644 index 0000000..2f3eb88 --- /dev/null +++ b/docs/specs/action_isolation.md @@ -0,0 +1,56 @@ +# Action Isolation Strategy (动作隔离策略) + +## 背景 + +在修仙世界模拟中,角色会执行各种持续性动作(如闭关、战斗、移动等)。同时,系统存在各种全局机制(如拍卖会、大比、奇遇、霉运等)会尝试与角色互动。 + +此前存在的问题是:全局机制无视角色当前状态,导致“正在闭关的角色跑去参加拍卖会”或“闭关时路边捡到神兵”等逻辑违和现象。 + +## 解决方案:Trait-based Declarative Control + +我们采用“基于特性的声明式控制”方案,将“是否允许被打扰”的定义权下放给 `Action` 类本身。 + +### 1. Action 基类定义 + +在 `src/classes/action/action.py` 中,所有动作默认开放交互: + +```python +class Action(ABC): + # ... + # 是否允许参与聚会(如拍卖会、大比) + ALLOW_GATHERING: bool = True + + # 是否允许触发世界随机事件(如奇遇、霉运) + ALLOW_WORLD_EVENTS: bool = True +``` + +### 2. 特定动作重写策略 + +例如 `Retreat` (闭关) 动作 (`src/classes/action/retreat.py`) 需要与世隔绝: + +```python +class Retreat(TimedAction): + # ... + # 闭关期间,不问世事,不染因果 + ALLOW_GATHERING = False + ALLOW_WORLD_EVENTS = False +``` + +### 3. Avatar 状态检查接口 + +在 `Avatar` (`src/classes/avatar/action_mixin.py`) 中封装了状态检查属性: + +- `avatar.can_join_gathering`: 检查当前动作是否允许参加聚会。 +- `avatar.can_trigger_world_event`: 检查当前动作是否允许触发奇遇/霉运。 + +### 4. 外部调用规范 + +- **Gathering (如 Auction)**: 在获取参与者列表时,必须过滤 `can_join_gathering` 为 True 的角色。 +- **Passive Effects (Fortune/Misfortune)**: 在触发前,必须检查 `can_trigger_world_event` 为 True。 + +## 扩展指南 + +当你创建一个新的 Action 时: +- 如果该动作需要角色全神贯注(如“突破”、“炼丹”),应考虑将 `ALLOW_GATHERING` 设为 `False`。 +- 如果该动作处于特殊空间或心流状态(如“心魔劫”、“顿悟”),应考虑将 `ALLOW_WORLD_EVENTS` 设为 `False`。 +- 默认情况下不需要做任何修改。 diff --git a/src/classes/action/__init__.py b/src/classes/action/__init__.py index 60fdf20..4c85051 100644 --- a/src/classes/action/__init__.py +++ b/src/classes/action/__init__.py @@ -39,6 +39,7 @@ from .cast import Cast from .refine import Refine from .buy import Buy from .mine import Mine +from .retreat import Retreat # 注册到 ActionRegistry(标注是否为实际可执行动作) register_action(actual=False)(Action) @@ -74,6 +75,7 @@ register_action(actual=True)(Cast) register_action(actual=True)(Refine) register_action(actual=True)(Buy) register_action(actual=True)(Mine) +register_action(actual=True)(Retreat) # Talk 已移动到 mutual_action 模块,在那里注册 __all__ = [ @@ -112,6 +114,7 @@ __all__ = [ "Refine", "Buy", "Mine", + "Retreat", ] diff --git a/src/classes/action/action.py b/src/classes/action/action.py index 9bb45a2..5d11a39 100644 --- a/src/classes/action/action.py +++ b/src/classes/action/action.py @@ -55,6 +55,12 @@ class Action(ABC): DESC_ID: str = "" REQUIREMENTS_ID: str = "" + # 是否允许参与聚会(如拍卖会、大比) + ALLOW_GATHERING: bool = True + + # 是否允许触发世界随机事件(如奇遇、霉运) + ALLOW_WORLD_EVENTS: bool = True + def __init__(self, avatar: Avatar, world: World): """ 传一个avatar的ref diff --git a/src/classes/action/retreat.py b/src/classes/action/retreat.py new file mode 100644 index 0000000..fe85bc1 --- /dev/null +++ b/src/classes/action/retreat.py @@ -0,0 +1,141 @@ +from __future__ import annotations + +import random +from src.i18n import t +from src.classes.action import TimedAction +from src.classes.action.cooldown import cooldown_action +from src.classes.event import Event +from src.classes.cultivation import REALM_RANK +from src.classes.action_runtime import ActionResult, ActionStatus +from src.classes.story_teller import StoryTeller + +@cooldown_action +class Retreat(TimedAction): + """ + 闭关:赌博性质的行为。 + 随机持续 1-5 年。 + 成功:获得持续10年的突破概率加成。 + 失败:减少寿元。 + """ + + ACTION_NAME_ID = "retreat_action_name" + DESC_ID = "retreat_desc" + REQUIREMENTS_ID = "retreat_requirements" + + EMOJI = "🧘" + PARAMS = {} + + # 闭关结束后1年内不能再次闭关 + ACTION_CD_MONTHS = 12 + IS_MAJOR = True + + # 闭关期间,不问世事,不染因果 + ALLOW_GATHERING = False + ALLOW_WORLD_EVENTS = False + + def __init__(self, avatar, world): + super().__init__(avatar, world) + # 随机持续时间:12 - 60 个月 (1-5年) + self.duration_months = random.randint(12, 60) + + def get_save_data(self) -> dict: + data = super().get_save_data() + data['duration_months'] = self.duration_months + return data + + def load_save_data(self, data: dict) -> None: + super().load_save_data(data) + if 'duration_months' in data: + self.duration_months = data['duration_months'] + + def calc_success_rate(self) -> float: + """ + 计算闭关成功率 + 练气(0): 50%, 筑基(1): 40%, 金丹(2): 30%, 元婴(3): 20% + """ + realm_idx = REALM_RANK.get(self.avatar.cultivation_progress.realm, 0) + base = 0.5 - (realm_idx * 0.1) + base = max(0.1, base) + + # 应用effect加成 + extra_rate = self.avatar.effects.get("extra_retreat_success_rate", 0.0) + return min(1.0, base + float(extra_rate)) + + def _execute(self) -> None: + # TimedAction 的 _execute 每月调用,这里主要做结束时的结算 + # 但 TimedAction.step 会在时间到时将状态设为 COMPLETED + # 我们需要在 finish 中处理结算逻辑,或者在最后一次 step 中处理 + # 按照 TimedAction 的设计,_execute 是过程逻辑。 + # 我们可以留空 _execute,或者在这里加一些描述性事件(可选) + pass + + async def finish(self) -> list[Event]: + # 1. 判定结果 + success_rate = self.calc_success_rate() + is_success = random.random() < success_rate + + events = [] + current_month = int(self.world.month_stamp) + + if is_success: + # 成功:增加临时效果(10年 = 120个月) + buff_duration = 120 + # 增加 20% 突破成功率 + bonus = { + "extra_breakthrough_success_rate": 0.3 + } + + self.avatar.temporary_effects.append({ + "source": "Retreat Bonus", + "effects": bonus, + "start_month": current_month, + "duration": buff_duration + }) + self.avatar.recalc_effects() + + result_text = t("retreat_success", duration=self.duration_months) + core_text = t("{avatar} finished retreat successfully.", avatar=self.avatar.name) + + # 生成故事 + prompt = t("retreat_story_prompt_success") + story = await StoryTeller.tell_story(core_text, result_text, self.avatar, prompt=prompt) + + events.append(Event(self.world.month_stamp, core_text, related_avatars=[self.avatar.id], is_major=True)) + events.append(Event(self.world.month_stamp, story, related_avatars=[self.avatar.id], is_story=True)) + + else: + # 失败:扣除寿元 + # 随机扣除 5-20 年 + reduce_years = random.randint(5, 20) + self.avatar.age.decrease_max_lifespan(reduce_years) + + # 检查是否死亡(如果 decrease_max_lifespan 导致当前年龄超过上限,会在下一次 age update 或者 death check 中发现, + # 但 decrease_max_lifespan 可能已经触发了 set_dead 如果它内部有逻辑, + # 不过根据 CultivationProgress.breakthrough 的逻辑,只是 decrease,真正死亡判定在 simulator 循环里) + # 我们手动检查一下给个提示 + + is_dead = self.avatar.age.age >= self.avatar.age.max_lifespan + + result_text = t("retreat_fail", reduce_years=reduce_years) + if is_dead: + result_text += t("retreat_death_append") + + core_text = t("{avatar} failed retreat and lost {years} years of lifespan.", avatar=self.avatar.name, years=reduce_years) + + prompt = t("retreat_story_prompt_fail") + story = await StoryTeller.tell_story(core_text, result_text, self.avatar, prompt=prompt) + + events.append(Event(self.world.month_stamp, core_text, related_avatars=[self.avatar.id], is_major=True)) + events.append(Event(self.world.month_stamp, story, related_avatars=[self.avatar.id], is_story=True)) + + return events + + def can_start(self) -> tuple[bool, str]: + # 任何时候都可以闭关,只要没死 + # 可以加个限制:寿元太少时不建议闭关?不,那是用户自己的选择(或者 AI 的愚蠢选择) + return True, "" + + def start(self) -> Event: + # 记录开始 + content = t("retreat_start", avatar=self.avatar.name) + return Event(self.world.month_stamp, content, related_avatars=[self.avatar.id], is_major=True) diff --git a/src/classes/auxiliary.py b/src/classes/auxiliary.py index 51658ec..d5f0669 100644 --- a/src/classes/auxiliary.py +++ b/src/classes/auxiliary.py @@ -90,10 +90,7 @@ def _load_auxiliaries_data() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary] # 解析grade grade_str = get_str(row, "grade", "练气") - try: - realm = next(r for r in Realm if r.value == grade_str) - except StopIteration: - realm = Realm.Qi_Refinement + realm = Realm.from_str(grade_str) a = Auxiliary( id=get_int(row, "item_id"), diff --git a/src/classes/avatar/action_mixin.py b/src/classes/avatar/action_mixin.py index 2b04d0b..457a99f 100644 --- a/src/classes/avatar/action_mixin.py +++ b/src/classes/avatar/action_mixin.py @@ -211,3 +211,18 @@ class ActionMixin: return "\n".join(lines) + @property + def can_join_gathering(self: "Avatar") -> bool: + """是否可以参加聚会""" + if self.current_action and self.current_action.action: + return getattr(self.current_action.action, 'ALLOW_GATHERING', True) + return True # 空闲状态默认可以 + + @property + def can_trigger_world_event(self: "Avatar") -> bool: + """是否可以触发奇遇/霉运""" + if self.current_action and self.current_action.action: + return getattr(self.current_action.action, 'ALLOW_WORLD_EVENTS', True) + return True + + diff --git a/src/classes/avatar/core.py b/src/classes/avatar/core.py index 39c4941..4ac6ef3 100644 --- a/src/classes/avatar/core.py +++ b/src/classes/avatar/core.py @@ -113,6 +113,8 @@ class Avatar( custom_pic_id: Optional[int] = None elixirs: List[ConsumedElixir] = field(default_factory=list) + # 临时效果列表: [{"source": str, "effects": dict, "start_month": int, "duration": int}] + temporary_effects: List[dict] = field(default_factory=list) is_dead: bool = False death_info: Optional[dict] = None @@ -157,18 +159,30 @@ class Avatar( 1. 移除已完全过期的丹药 2. 如果有移除,触发属性重算 """ - if not self.elixirs: - return - - original_count = len(self.elixirs) - # 过滤掉完全过期的 - self.elixirs = [ - e for e in self.elixirs - if not e.is_completely_expired(current_month) - ] + need_recalc = False - # 如果数量减少,说明有过期,重算属性(主要是寿命、MaxHP) - if len(self.elixirs) < original_count: + # 处理丹药 + if self.elixirs: + original_count = len(self.elixirs) + self.elixirs = [ + e for e in self.elixirs + if not e.is_completely_expired(current_month) + ] + if len(self.elixirs) < original_count: + need_recalc = True + + # 处理临时效果 + if self.temporary_effects: + original_temp_count = len(self.temporary_effects) + self.temporary_effects = [ + eff for eff in self.temporary_effects + if current_month < (eff.get("start_month", 0) + eff.get("duration", 0)) + ] + if len(self.temporary_effects) < original_temp_count: + need_recalc = True + + # 如果有过期,重算属性 + if need_recalc: self.recalc_effects() def join_sect(self, sect: Sect, rank: "SectRank") -> None: diff --git a/src/classes/effect/__init__.py b/src/classes/effect/__init__.py index e91b56c..f965be3 100644 --- a/src/classes/effect/__init__.py +++ b/src/classes/effect/__init__.py @@ -6,6 +6,7 @@ from .consts import ( EXTRA_CULTIVATE_EXP, CULTIVATE_DURATION_REDUCTION, EXTRA_BREAKTHROUGH_SUCCESS_RATE, + EXTRA_RETREAT_SUCCESS_RATE, EXTRA_DUAL_CULTIVATION_EXP, EXTRA_HARVEST_MATERIALS, EXTRA_HUNT_MATERIALS, diff --git a/src/classes/effect/consts.py b/src/classes/effect/consts.py index 414f9b9..443599a 100644 --- a/src/classes/effect/consts.py +++ b/src/classes/effect/consts.py @@ -91,6 +91,18 @@ EXTRA_BREAKTHROUGH_SUCCESS_RATE = "extra_breakthrough_success_rate" - 大量: 0.3 (30%) """ +EXTRA_RETREAT_SUCCESS_RATE = "extra_retreat_success_rate" +""" +额外闭关成功率 +类型: float +结算: src/classes/action/retreat.py +说明: 闭关判定成功率的加成。 +数值参考: + - 微量: 0.05 (5%) + - 中量: 0.1 (10%) + - 大量: 0.2 (20%) +""" + # --- 双修相关 --- EXTRA_DUAL_CULTIVATION_EXP = "extra_dual_cultivation_exp" """ @@ -424,6 +436,7 @@ ALL_EFFECTS = [ "extra_cultivate_exp", # int - 额外修炼经验 "cultivate_duration_reduction", # float - 修炼时长缩减 "extra_breakthrough_success_rate", # float - 额外突破成功率 + "extra_retreat_success_rate", # float - 额外闭关成功率 # 双修相关 "extra_dual_cultivation_exp", # int - 额外双修经验 diff --git a/src/classes/effect/desc.py b/src/classes/effect/desc.py index d2f6da0..663457c 100644 --- a/src/classes/effect/desc.py +++ b/src/classes/effect/desc.py @@ -14,6 +14,7 @@ def get_effect_desc(effect_key: str) -> str: "extra_weapon_proficiency_gain": "effect_extra_weapon_proficiency_gain", "extra_dual_cultivation_exp": "effect_extra_dual_cultivation_exp", "extra_breakthrough_success_rate": "effect_extra_breakthrough_success_rate", + "extra_retreat_success_rate": "effect_extra_retreat_success_rate", "extra_fortune_probability": "effect_extra_fortune_probability", "extra_misfortune_probability": "effect_extra_misfortune_probability", "extra_harvest_materials": "effect_extra_harvest_materials", diff --git a/src/classes/effect/mixin.py b/src/classes/effect/mixin.py index e759d62..d34867e 100644 --- a/src/classes/effect/mixin.py +++ b/src/classes/effect/mixin.py @@ -17,6 +17,14 @@ from src.classes.hp import HP_MAX_BY_REALM class EffectsMixin: """效果计算相关方法""" + def get_active_temporary_effects(self: "Avatar") -> list[dict[str, Any]]: + """获取当前生效的临时效果列表""" + current_month = int(self.world.month_stamp) + return [ + eff for eff in getattr(self, "temporary_effects", []) + if current_month < eff.get("start_month", 0) + eff.get("duration", 0) + ] + def _evaluate_values(self, effects: dict[str, Any]) -> dict[str, Any]: """ 评估效果字典中的动态值(字符串表达式)。 @@ -138,6 +146,13 @@ class EffectsMixin: label = t("Elixir [{name}]", name=consumed.elixir.name) _collect(label, explicit_effects=active) + # 处理临时效果(如闭关获得的短期加成) + for temp_eff in self.get_active_temporary_effects(): + # 来源显示,支持翻译 + source_key = temp_eff.get("source", "Unknown") + label = t(source_key) + _collect(label, explicit_effects=temp_eff.get("effects", {})) + return breakdown def recalc_effects(self: "Avatar") -> None: diff --git a/src/classes/fortune.py b/src/classes/fortune.py index f41b45c..d3ae183 100644 --- a/src/classes/fortune.py +++ b/src/classes/fortune.py @@ -386,6 +386,10 @@ async def try_trigger_fortune(avatar: Avatar) -> list[Event]: prob = base_prob + extra_prob if prob <= 0.0: return [] + + # 检查当前动作状态是否允许触发世界事件 + if not avatar.can_trigger_world_event: + return [] if random.random() >= prob: return [] diff --git a/src/classes/gathering/auction.py b/src/classes/gathering/auction.py index f915352..87a6e28 100644 --- a/src/classes/gathering/auction.py +++ b/src/classes/gathering/auction.py @@ -35,9 +35,13 @@ class Auction(Gathering): def get_related_avatars(self, world: "World") -> List[int]: """ - 所有存活的 avatar 都参与 + 所有存活且允许参加聚会的 avatar 都参与 """ - return [avatar.id for avatar in world.avatar_manager.get_living_avatars()] + return [ + avatar.id + for avatar in world.avatar_manager.get_living_avatars() + if avatar.can_join_gathering + ] def get_info(self, world: "World") -> str: from src.i18n import t diff --git a/src/classes/misfortune.py b/src/classes/misfortune.py index c12e9ce..69a521f 100644 --- a/src/classes/misfortune.py +++ b/src/classes/misfortune.py @@ -88,6 +88,10 @@ async def try_trigger_misfortune(avatar: Avatar) -> list[Event]: prob = base_prob + extra_prob if prob <= 0.0: return [] + + # 检查当前动作状态是否允许触发世界事件 + if not avatar.can_trigger_world_event: + return [] if random.random() >= prob: return [] diff --git a/src/i18n/locales/en_US/LC_MESSAGES/messages.mo b/src/i18n/locales/en_US/LC_MESSAGES/messages.mo index e7cf0aaf3ee3ea7927ef17023f7cbb74422bffda..3f255f73111de2a54ffbf2e27052e9b6a7c601b2 100644 GIT binary patch delta 12468 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 D*BA}K delta 11181 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 diff --git a/src/i18n/locales/en_US/LC_MESSAGES/messages.po b/src/i18n/locales/en_US/LC_MESSAGES/messages.po index 924eeec..84c0e01 100644 --- a/src/i18n/locales/en_US/LC_MESSAGES/messages.po +++ b/src/i18n/locales/en_US/LC_MESSAGES/messages.po @@ -2246,6 +2246,12 @@ msgstr "Breakthrough Success Rate" +msgid "effect_extra_retreat_success_rate" + +msgstr "Retreat Success Rate" + + + msgid "effect_extra_fortune_probability" msgstr "Fortune Probability" @@ -3438,8 +3444,43 @@ msgstr "{winner} defeated {loser}" -# ============================================================================ +msgid "retreat_action_name" +msgstr "Retreat" +msgid "retreat_desc" +msgstr "Retreat, to breakthrough self. Extremely risky, only for those with great perseverance." + +msgid "retreat_requirements" +msgstr "No restrictions; cooldown required" + +msgid "retreat_start" +msgstr "{avatar} begins retreat, breakthrough time unknown." + +msgid "retreat_success" +msgstr "Retreat successfully completed! Cultivation improved, understanding of Heavenly Dao deepened." + +msgid "retreat_fail" +msgstr "Retreat failed! Vitality greatly damaged, lost {years} years of lifespan." + +msgid "retreat_death_append" +msgstr " And exhausted the last trace of vitality during retreat, passed away." + +msgid "retreat_story_prompt_success" +msgstr "This is about a successful retreat. Describe how the cultivator overcame loneliness, comprehended the Heavenly Dao, and finally broke through the state of mind during the retreat. No combat description needed." + +msgid "retreat_story_prompt_fail" +msgstr "This is about a failed retreat. Describe how the cultivator was troubled by inner demons, self-doubt, and finally suffered backlash during the retreat. No combat description needed." + +msgid "{avatar} finished retreat successfully." +msgstr "{avatar} finished retreat successfully." + +msgid "{avatar} failed retreat and lost {years} years of lifespan." +msgstr "{avatar} failed retreat and lost {years} years of lifespan." + +msgid "Retreat Bonus" +msgstr "Retreat Insight" + +# ============================================================================ # Frontend UI Translations # ============================================================================ diff --git a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo index 739333158fae0b601b2099c07f75123acd7f50ea..bf524061eb231a79d63b820e117123997dda9f04 100644 GIT binary patch delta 12243 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 A=>Px# diff --git a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po index 00c61d0..1e4b929 100644 --- a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po +++ b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po @@ -1122,6 +1122,9 @@ msgstr "双修经验" msgid "effect_extra_breakthrough_success_rate" msgstr "突破成功率" +msgid "effect_extra_retreat_success_rate" +msgstr "闭关成功率" + msgid "effect_extra_fortune_probability" msgstr "奇遇概率" @@ -1718,6 +1721,42 @@ msgstr "{avatar} 修为增长 {exp} 点" msgid "{winner} defeated {loser}" msgstr "{winner} 战胜了 {loser}" +msgid "retreat_action_name" +msgstr "闭关" + +msgid "retreat_desc" +msgstr "闭关,尝试突破自我。风险极大,非大毅力者不可为。" + +msgid "retreat_requirements" +msgstr "无限制;需要冷却" + +msgid "retreat_start" +msgstr "{avatar} 开始闭关,破关时间不详。" + +msgid "retreat_success" +msgstr "闭关成功!修为精进,对天道的感悟加深了。" + +msgid "retreat_fail" +msgstr "闭关失败!元气大伤,折损了 {years} 年阳寿。" + +msgid "retreat_death_append" +msgstr "并且在闭关中耗尽了最后一丝生机,坐化了。" + +msgid "retreat_story_prompt_success" +msgstr "这是关于一次成功的闭关。描写修士在闭关期间如何战胜孤独、感悟天道,最终突破心境的过程。不需要描写战斗。" + +msgid "retreat_story_prompt_fail" +msgstr "这是关于一次失败的闭关。描写修士在闭关期间如何被心魔困扰、自我怀疑,最终导致反噬的过程。不需要描写战斗。" + +msgid "{avatar} finished retreat successfully." +msgstr "{avatar} 闭关成功,修为大增。" + +msgid "{avatar} failed retreat and lost {years} years of lifespan." +msgstr "{avatar} 闭关失败,折损了 {years} 年阳寿。" + +msgid "Retreat Bonus" +msgstr "闭关感悟" + # ============================================================================ # Frontend UI Translations # ============================================================================ diff --git a/src/sim/load/avatar_load_mixin.py b/src/sim/load/avatar_load_mixin.py index 2077fb5..58b366a 100644 --- a/src/sim/load/avatar_load_mixin.py +++ b/src/sim/load/avatar_load_mixin.py @@ -223,6 +223,9 @@ class AvatarLoadMixin: consume_time = elixir_data["time"] avatar.elixirs.append(ConsumedElixir(elixir_obj, consume_time)) + # 恢复临时效果 + avatar.temporary_effects = data.get("temporary_effects", []) + # 加载完成后重新计算effects(确保数值正确) avatar.recalc_effects() diff --git a/src/sim/save/avatar_save_mixin.py b/src/sim/save/avatar_save_mixin.py index 99864ce..5441813 100644 --- a/src/sim/save/avatar_save_mixin.py +++ b/src/sim/save/avatar_save_mixin.py @@ -116,5 +116,6 @@ class AvatarSaveMixin: } for consumed in self.elixirs ], + "temporary_effects": self.temporary_effects, } diff --git a/static/locales/en-US/game_configs/auxiliary.csv b/static/locales/en-US/game_configs/auxiliary.csv index 1e04609..e111d20 100644 --- a/static/locales/en-US/game_configs/auxiliary.csv +++ b/static/locales/en-US/game_configs/auxiliary.csv @@ -7,9 +7,9 @@ item_id,name,grade,desc,effects 2005,Iron Essence,Foundation Establishment,Refined from a hundred jin of common iron to get one tael, a basic material for improving artifact quality.,{extra_weapon_upgrade_chance: 0.05} 2006,Heavenly Origin Eye,Foundation Establishment,Able to see through falsehoods, look directly at the source, and find dragon veins.,"{extra_observation_radius: 1, extra_fortune_probability: 0.005}" 2007,Cloud Treading Boots,Foundation Establishment,Steps born on clouds, body light as a swallow, essential for traveling.,"{extra_escape_success_rate: 0.15, extra_move_step: 1}" -2008,Bodhi Seed,Foundation Establishment,A supreme treasure of Buddhism, holding it clears the mind and greatly increases comprehension.,{extra_breakthrough_success_rate: 0.1} +2008,Bodhi Seed,Foundation Establishment,A supreme treasure of Buddhism, holding it clears the mind and greatly increases comprehension.,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.15}" 2009,Golden Thread Soft Armor,Foundation Establishment,Invulnerable to swords and spears, unaffected by water and fire, a close-fitting soft armor.,"{extra_max_hp: 100, damage_reduction: 0.05}" -2010,Cold Jade Bed,Foundation Establishment,A supreme treasure of the Ancient Tomb Sect, cultivating on this bed yields twice the result with half the effort and avoids heart demons.,{cultivate_duration_reduction: 0.2} +2010,Cold Jade Bed,Foundation Establishment,A supreme treasure of the Ancient Tomb Sect, cultivating on this bed yields twice the result with half the effort and avoids heart demons.,"{cultivate_duration_reduction: 0.2, extra_retreat_success_rate: 0.15}" 2011,Formless Mask,Foundation Establishment,A thousand faces for a thousand people, it not only masks appearance but also masks aura.,{extra_plunder_multiplier: 0.5} 2051,Divine Wind Boat,Core Formation,A flying artifact, extremely fast, essential for traveling and plundering.,"{extra_move_step: 2, extra_escape_success_rate: 0.15}" 2052,Kunlun Mirror,Core Formation,An ancient divine artifact with the power to travel through time and space; this is an imitation, only able to peek into the distance.,{extra_observation_radius: 2} diff --git a/static/locales/en-US/game_configs/celestial_phenomenon.csv b/static/locales/en-US/game_configs/celestial_phenomenon.csv index 96c5b7f..aa972f4 100644 --- a/static/locales/en-US/game_configs/celestial_phenomenon.csv +++ b/static/locales/en-US/game_configs/celestial_phenomenon.csv @@ -3,7 +3,7 @@ id,name,rarity,effects,desc,duration_years 1,Purple Qi from the East,R,{extra_cultivate_exp: 15},"Heavenly spiritual qi is abundant, cultivators' cultivation speed greatly increases, and the desire to cultivate improves",5 2,Year of Golden Malice,R,"{extra_battle_strength_points: 3}","Golden malice fills the world with solemnity, cultivators are more likely to be bloodthirsty and attack each other",5 3,Era of Wood Spirit,R,"{extra_harvest_materials: 2, extra_hp_recovery_rate: 0.5}","Wood virtue nourishes with vitality, harvesting yields double and injuries heal extremely fast, ideal for searching for heavenly materials and earthly treasures everywhere",5 -4,Age of Water Virtue,R,"{extra_cultivate_exp: 20, cultivate_duration_reduction: 0.2}","Water element flows without hindrance, cultivation efficiency and speed both improve, making it a great time for secluded cultivation",5 +4,Age of Water Virtue,R,"{extra_cultivate_exp: 20, cultivate_duration_reduction: 0.2, extra_retreat_success_rate: 0.15}","Water element flows without hindrance, cultivation efficiency and speed both improve, making it a great time for secluded cultivation",5 5,Era of Fire Calamity,R,"{extra_battle_strength_points: 5, extra_max_lifespan: -20}","Heavenly fire burns and calamity arrives, combat power surges but lifespan drains, one should decide battles quickly to fight for life against heaven",5 6,World of Thick Earth,R,"{damage_reduction: 0.15, extra_max_hp: 150}","Earth virtue is thick and carries all things, the body is resilient and blood qi is full, allowing one to face strong enemies without fear",5 7,Five Elements Chaos,SR,"{extra_cultivate_exp: -10, extra_breakthrough_success_rate: 0.3}","Five elements are out of order and heaven and earth are in chaos, conventional cultivation yields half the result with twice the effort, but bottlenecks loosen and it is suitable to attempt breakthroughs",5 @@ -18,7 +18,7 @@ id,name,rarity,effects,desc,duration_years 16,Killing Calamity Descends,SR,"{extra_battle_strength_points: 5, extra_fortune_probability: -0.005}","Blood light reaches the sky and the intent to kill is hard to suppress, although killing power greatly increases, opportunities are cut off, suitable for taking the initiative to prove the Dao through killing",5 17,Era of Peace,R,"{extra_cultivate_exp: -10, extra_fortune_probability: 0.01}","The world is at peace and all things are tranquil, although bitter cultivation is slow, opportunities arise frequently, suitable for traveling the world to find encounters",5 18,Blessed by Luck,R,"[{when: 'any(p.key == ""CHILD_OF_FORTUNE"" for p in avatar.personas)', extra_cultivate_exp: 25, extra_fortune_probability: 0.005}]","Favored by destiny and centered by luck, everything goes well for the chosen one, ordinary people can only look up and not force it",5 -19,Blood Moon in the Sky,SR,"{extra_battle_strength_points: 7, extra_cultivate_exp: -10}","The blood moon hangs high and hearts are restless, combat power is strong but quiet cultivation is difficult, suitable for plundering resources through battle",5 +19,Blood Moon in the Sky,SR,"{extra_battle_strength_points: 7, extra_cultivate_exp: -10, extra_retreat_success_rate: -0.2}","The blood moon hangs high and hearts are restless, combat power is strong but quiet cultivation is difficult, suitable for plundering resources through battle",5 20,Gate of Ascension,SSR,"{extra_cultivate_exp: 30, extra_breakthrough_success_rate: 0.2}","The heavenly gate opens wide and the Great Dao manifests, comprehension and cultivation are helped as if by gods, it is the time to impact realms and ascend to immortality",7 21,Law Manifestation,SSR,"{extra_breakthrough_success_rate: 0.5}","Heaven and earth laws are clearly touchable, bottlenecks are like paper that can be pierced with a touch, do not miss this heaven-sent opportunity for breakthrough",3 22,Spacetime Turbulence,SSR,"{extra_fortune_probability: 0.005}","Spacetime is out of order and strange phenomena frequently occur, dangerous places also hide supreme opportunities, suitable for seeking wealth in danger and exploring the unknown",5 diff --git a/static/locales/en-US/game_configs/persona.csv b/static/locales/en-US/game_configs/persona.csv index 603a67e..bf15531 100644 --- a/static/locales/en-US/game_configs/persona.csv +++ b/static/locales/en-US/game_configs/persona.csv @@ -1,25 +1,25 @@ id,key,name,exclusion_keys,desc,rarity,condition,effects ,Key,Name,Exclusion Keys,Description/LLM Input Text,Rarity(N/R/SR/SSR),Condition,JSON Effects -1,RATIONAL,Rational,FICKLE;CASUAL,"You always use logic to think through problems and act only after planning.",N,, -2,FICKLE,Fickle,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL;PENSIVE,"Goals are unstable; you will not stick to a single goal for long.",N,, -3,LAZY,Lazy,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You always procrastinate, don't want to work hard, and are more keen on enjoying life.",N,,{extra_cast_success_rate: -0.05} +1,RATIONAL,Rational,FICKLE;CASUAL,"You always use logic to think through problems and act only after planning.",N,,{extra_retreat_success_rate: 0.05} +2,FICKLE,Fickle,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL;PENSIVE,"Goals are unstable; you will not stick to a single goal for long.",N,,{extra_retreat_success_rate: -0.1} +3,LAZY,Lazy,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You always procrastinate, don't want to work hard, and are more keen on enjoying life.",N,,"{extra_cast_success_rate: -0.05, extra_retreat_success_rate: -0.1}" 4,ADVENTUROUS,Adventurous,LAZY;LIFE_CHERISHING,"You always take risks, love excitement, and always want to give it your all.",N,, 5,CASUAL,Casual,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You always adapt to circumstances; wherever your mood goes, you follow, with no fixed rules.",N,, 6,GREEDY,Greedy,,"You have a strong desire for spirit stones and wealth.",N,,{extra_item_sell_price_multiplier: 0.1} 7,GATHERER,Gatherer,,"Likes to find various strange flowers, herbs, and spiritual medicines in mountains and forests.",R,,{extra_harvest_materials: 1} 8,HUNTER,Hunter,,"Enjoys the excitement of tracking prey in the wild, knows the habits of various animals well.",R,,{extra_hunt_materials: 1} -9,PENSIVE,Pensive,FICKLE,"You always think deeply, and your approach to problems is more philosophical.",N,, +9,PENSIVE,Pensive,FICKLE,"You always think deeply, and your approach to problems is more philosophical.",N,,{extra_retreat_success_rate: 0.1} 10,LIFE_CHERISHING,Life-cherishing,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You always value your own life and will not take risks easily.",R,,{extra_escape_success_rate: 0.15} 11,FRIENDLY,Friendly,ALOOF;INDIFFERENT;AGGRESSIVE;VENGEFUL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You value companions and harmony, are helpful.",N,, 12,VENGEFUL,Vengeful,FRIENDLY;INDIFFERENT,"You never easily let go of a grudge and are willing to pay the price and time for revenge.",N,, 13,ALOOF,Aloof,FRIENDLY,"You prefer being alone, avoid deep involvement with others.",N,, 14,INDIFFERENT,Indifferent,FRIENDLY;VENGEFUL;AGGRESSIVE;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You are emotionally restrained, calm and detached from the outside world.",N,, 15,AGGRESSIVE,Aggressive,FRIENDLY;INDIFFERENT;LIFE_CHERISHING;TIMID,"You face conflicts directly, prefer resolving problems through power and confrontation.",R,,{extra_battle_strength_points: 1} -16,RASH,Rash,RATIONAL;PENSIVE;LIFE_CHERISHING,"You act impulsively with little regard for consequences.",N,,{extra_cast_success_rate: -0.05} +16,RASH,Rash,RATIONAL;PENSIVE;LIFE_CHERISHING,"You act impulsively with little regard for consequences.",N,,"{extra_cast_success_rate: -0.05, extra_retreat_success_rate: -0.1}" 17,TIMID,Timid,ADVENTUROUS;AGGRESSIVE;VENGEFUL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,"You are cautious and meticulous, easily afraid of risks.",N,,{extra_escape_success_rate: 0.1} 18,OVERBEARING,Overbearing,FRIENDLY;TIMID,"You act strongly and unreasonably, habitually putting your own interests first.",N,, -19,CULTIVATION_OBSESSED,Cultivation Obsessed,FICKLE;LAZY;CASUAL,"You spend the vast majority of your time on cultivation.",R,,{extra_cultivate_exp: 30} -20,INTROVERTED,Introverted,EXTROVERTED,"You enjoy solitude and self-reflection more.",N,, +19,CULTIVATION_OBSESSED,Cultivation Obsessed,FICKLE;LAZY;CASUAL,"You spend the vast majority of your time on cultivation.",R,,"{extra_cultivate_exp: 30, extra_retreat_success_rate: 0.15}" +20,INTROVERTED,Introverted,EXTROVERTED,"You enjoy solitude and self-reflection more.",N,,{extra_retreat_success_rate: 0.05} 21,EXTROVERTED,Extroverted,ALOOF;INDIFFERENT;INTROVERTED,"You enjoy communicating with others, proactively making friends.",N,, 22,MEAN,Mean,FRIENDLY;ENTHUSIASTIC,"In dialogue, you tend to express yourself through irony, mockery, and sarcasm.",N,, 23,ENTHUSIASTIC,Enthusiastic,ALOOF;INDIFFERENT;MEAN,"You are friendly to others and respond positively.",N,, diff --git a/static/locales/en-US/game_configs/root.csv b/static/locales/en-US/game_configs/root.csv index d6bfae0..28d3b91 100644 --- a/static/locales/en-US/game_configs/root.csv +++ b/static/locales/en-US/game_configs/root.csv @@ -9,4 +9,4 @@ id,key,name,element_list,desc,effects 7,ICE,Ice Spiritual Root,GOLD;WATER,Strong control; good persistence, 8,WIND,Wind Spiritual Root,WOOD;WATER,Exceptional movement; elusive, 9,DARK,Dark Spiritual Root,FIRE;EARTH,Stealth-oriented; good at illusions and deceit, -10,HEAVEN,Heavenly Spiritual Root,GOLD;WOOD;WATER;FIRE;EARTH,Peerless aptitude; proficient in all five elements, comprehensive cultivation,{extra_breakthrough_success_rate: 0.1} +10,HEAVEN,Heavenly Spiritual Root,GOLD;WOOD;WATER;FIRE;EARTH,Peerless aptitude; proficient in all five elements, comprehensive cultivation,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}" diff --git a/static/locales/en-US/game_configs/sect.csv b/static/locales/en-US/game_configs/sect.csv index f501350..74b6501 100644 --- a/static/locales/en-US/game_configs/sect.csv +++ b/static/locales/en-US/game_configs/sect.csv @@ -3,7 +3,7 @@ id,name,desc,member_act_style,alignment,weight,preferred_weapon,effects,rank_nam 1,Mingxin Sword Sect,"The number one sect in the east of the Tongxuan Realm, ruling the world with supreme sword path. The Cloud Pattern Array is their secret manual. [Sword Path Specialization] As a sword cultivator, your combat power is amazing when using sword-type weapons, and your comprehension speed in the sword path far exceeds ordinary people.","Pure and self-disciplined, consistent in action. Both heavy sword and heart method are prioritized, focusing on illuminating the heart and seeing the nature.",RIGHTEOUS,1,SWORD,"{extra_battle_strength_points: 3, extra_weapon_proficiency_gain: 0.5}", 2,Baishou Sect,"Famous for taming spiritual beasts, keeping various demonic beasts and monsters as combat power. [Beast Taming Master] You have a unique beast taming talent; capturing demonic beasts is easy for you, and you are good at driving beast groups to fight for you.","Direct speech, values strength and bloodiness, admires hunting and fighting.",EVIL,1,WHIP,"{extra_catch_success_rate: 0.25, extra_hunt_materials: 1}",Valley Master;Offering;Beast Tamer;Retainer 3,Shuijing Sect,"One of the ten righteous sects, but actually strictly neutral. Possesses the immortal realm treasure ""Heaven-Piercing Water Mirror"" to predict the future. [Seeking Luck and Avoiding Evil] You have extraordinary intuition, a broad vision, and are extremely likely to find encounters during exploration.","Calm and smooth in handling affairs, likes to overcome hardness with softness, good at borrowing power and counter-control.",NEUTRAL,1,FAN,"{extra_observation_radius: 2, extra_fortune_probability: 0.002, extra_refine_success_rate: 0.05}",Mirror Master;Mirror Keeper;Successor;Mirror Attendant -4,Mingwang Sect,"Walking the path of the underworld, with cold and fierce techniques. [Netherworld Access] You practice underworld laws with a firm mind, and when breaking through bottlenecks, you have no distractions, leading to a higher success rate.","Cold and emotionless in speech, awe of karma but unafraid of killing, favoring efficiency and results.",EVIL,1,FAN,{extra_breakthrough_success_rate: 0.1},Hall Master;Judge;Impermanence;Ghost Soldier +4,Mingwang Sect,"Walking the path of the underworld, with cold and fierce techniques. [Netherworld Access] You practice underworld laws with a firm mind, and when breaking through bottlenecks, you have no distractions, leading to a higher success rate.","Cold and emotionless in speech, awe of karma but unafraid of killing, favoring efficiency and results.",EVIL,1,FAN,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}",Hall Master;Judge;Impermanence;Ghost Soldier 5,Zhugou Sect,"A major evil sect. Famous for artifact refining, mechanisms, and assassination, traditionally sinister and aloof. [Assassination Expert] You are proficient in stealth and assassination; for strong enemies, avoiding direct confrontation and seeking assassination is often your best winning strategy.","Facing desires and costs directly, unafraid of darkness, excelling in offensive techniques.",EVIL,1,HIDDEN_WEAPON,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1, extra_cast_success_rate: 0.05}",Tower Master;Executioner;Shadow Assassin;Spy 6,Hehuan Sect,"Entering the Dao through emotion, increasing cultivation through dual cultivation, good at manipulating people's hearts and long in power changes. [Dual Cultivation Secret Technique] Your constitution is special; through dual cultivation, you can gain cultivation improvements far exceeding ordinary people, which is your best shortcut to raising your realm.","Elegant speech, good at grasping human desires and situations, overcoming hardness with softness.",NEUTRAL,1,ZITHER,"{extra_dual_cultivation_exp: 150, shop_buy_price_reduction: 0.1}",Palace Master;Guardian;Enchantress;Attendant 7,Zhenhun Sect,"Iron-blooded style, good at calming souls, sealing evil, and delivering from distress, with fierce suppressing techniques. [Indestructible Vajra] You practice body protection divine skills, possessing extremely strong physical defense and damage reduction abilities, as immovable as a mountain.","Solemn and steady, values soul calming and evil suppression, few words but decisive.",RIGHTEOUS,1,STAFF,"{extra_max_hp: 100, damage_reduction: 0.15}",Abbot;Chief;Ascetic;Layman diff --git a/static/locales/en-US/game_configs/technique.csv b/static/locales/en-US/game_configs/technique.csv index 180bf4c..361ffa4 100644 --- a/static/locales/en-US/game_configs/technique.csv +++ b/static/locales/en-US/game_configs/technique.csv @@ -10,7 +10,7 @@ id,name,technique_root,grade,desc,weight,condition,sect_id,effects 11,Pure Yang Infinite Art,FIRE,MIDDLE,"Pure Yang qi, fierce and unyielding, restraining cold and evil.",1,,,"{""extra_battle_strength_points"": 3}" 13,Mountain Moving Formula,EARTH,LOWER,"Able to lift a tripod with strength, with long physical power, like a tiger coming down the mountain.",1,,, 14,Immovable Wisdom King Formula,EARTH,MIDDLE,"Immovable as a mountain, moving like a thunderbolt, a Buddhist guardian divine skill.",1,,,"{""extra_battle_strength_points"": 3}" -16,Ice Heart Formula,ICE,LOWER,"The heart is clear as ice, heaven falling will not startle, focusing and calming the mind.",1,,, +16,Ice Heart Formula,ICE,LOWER,"The heart is clear as ice, heaven falling will not startle, focusing and calming the mind.",1,,,{extra_retreat_success_rate: 0.1} 17,Profound Ice Power,ICE,MIDDLE,"Cold qi reaches the bone, freezing meridians, sinister and overbearing.",1,,,"{""extra_battle_strength_points"": 3}" 19,Divine Movement Hundred Transformations,WIND,LOWER,"Agile movement, ever-changing, first-rate for escaping.",1,,, 20,Cloud Treading Step,WIND,MIDDLE,"Wudang's supreme skill, left foot stepping on the right foot, directly up to the green clouds.",1,,,"{""extra_battle_strength_points"": 3}" diff --git a/static/locales/zh-CN/game_configs/auxiliary.csv b/static/locales/zh-CN/game_configs/auxiliary.csv index f952f3f..43441fd 100644 --- a/static/locales/zh-CN/game_configs/auxiliary.csv +++ b/static/locales/zh-CN/game_configs/auxiliary.csv @@ -7,9 +7,9 @@ item_id,name,grade,desc,effects 2005,铁精,筑基,提炼百斤凡铁才得一两,提升法器品质的基础材料.,{extra_weapon_upgrade_chance: 0.05} 2006,源天神眼,筑基,可勘破虚妄,直视本源,寻龙定穴.,"{extra_observation_radius: 1, extra_fortune_probability: 0.005}" 2007,踏云靴,筑基,步履生云,身轻如燕,赶路必备.,"{extra_escape_success_rate: 0.15, extra_move_step: 1}" -2008,菩提子,筑基,佛门至宝,持之可灵台清明,悟性大增.,{extra_breakthrough_success_rate: 0.1} +2008,菩提子,筑基,佛门至宝,持之可灵台清明,悟性大增.,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.15}" 2009,金丝软甲,筑基,刀枪不入,水火不侵,贴身软甲.,"{extra_max_hp: 100, damage_reduction: 0.05}" -2010,寒玉床,筑基,古墓派至宝,在此床上修炼,事半功倍,且无心魔之虞.,{cultivate_duration_reduction: 0.2} +2010,寒玉床,筑基,古墓派至宝,在此床上修炼,事半功倍,且无心魔之虞.,"{cultivate_duration_reduction: 0.2, extra_retreat_success_rate: 0.15}" 2011,无相面具,筑基,千人千面,不仅掩盖容貌,更能掩盖气息.,{extra_plunder_multiplier: 0.5} 2051,神风舟,金丹,飞行法器,速度极快,居家旅行杀人越货必备.,"{extra_move_step: 2, extra_escape_success_rate: 0.15}" 2052,昆仑镜,金丹,上古神器,拥有穿梭时空之力,此为仿品,仅能窥探远方.,{extra_observation_radius: 2} diff --git a/static/locales/zh-CN/game_configs/celestial_phenomenon.csv b/static/locales/zh-CN/game_configs/celestial_phenomenon.csv index 5d63646..ba3f30e 100644 --- a/static/locales/zh-CN/game_configs/celestial_phenomenon.csv +++ b/static/locales/zh-CN/game_configs/celestial_phenomenon.csv @@ -3,7 +3,7 @@ id,name,rarity,effects,desc,duration_years 1,紫气东来,R,{extra_cultivate_exp: 15},天地灵气充沛,修士修行速度大增,修行欲望提高,5 2,金煞之年,R,"{extra_battle_strength_points: 3}",金煞充盈天地肃杀,修士更大可能嗜血而相互攻伐,5 3,木灵盛世,R,"{extra_harvest_materials: 2, extra_hp_recovery_rate: 0.5}",木德滋养生机盎然,采集收获倍增且伤势恢复极快,宜四处搜罗天材地宝,5 -4,水德之纪,R,"{extra_cultivate_exp: 20, cultivate_duration_reduction: 0.2}",水行流转通达无碍,修炼效率与速度双重提升,正是闭关苦修的大好时机,5 +4,水德之纪,R,"{extra_cultivate_exp: 20, cultivate_duration_reduction: 0.2, extra_retreat_success_rate: 0.15}",水行流转通达无碍,修炼效率与速度双重提升,正是闭关苦修的大好时机,5 5,火劫时代,R,"{extra_battle_strength_points: 5, extra_max_lifespan: -20}",天火燃烧劫数降临,战力暴涨但寿元流逝,当速战速决以命搏天,5 6,土厚之世,R,"{damage_reduction: 0.15, extra_max_hp: 150}",土德厚重载物无疆,身躯坚韧血气充盈,可无惧强敌正面争锋,5 7,五行逆乱,SR,"{extra_cultivate_exp: -10, extra_breakthrough_success_rate: 0.3}",五行失序天地大乱,常规修炼事倍功半,然瓶颈松动宜尝试突破,5 @@ -18,7 +18,7 @@ id,name,rarity,effects,desc,duration_years 16,杀劫降临,SR,"{extra_battle_strength_points: 5, extra_fortune_probability: -0.005}",血光冲天杀意难抑,虽杀伐之力大增但机缘断绝,宜主动出击以杀证道,5 17,太平盛世,R,"{extra_cultivate_exp: -10, extra_fortune_probability: 0.01}",天下太平万物安宁,虽苦修进境缓慢但机缘频出,宜游历天下寻找奇遇,5 18,气运加身,R,"[{when: 'any(p.key == ""CHILD_OF_FORTUNE"" for p in avatar.personas)', extra_cultivate_exp: 25, extra_fortune_probability: 0.005}]",天命眷顾气运所钟,天选之人万事皆顺,常人只可仰望不可强求,5 -19,血月当空,SR,"{extra_battle_strength_points: 7, extra_cultivate_exp: -10}",血月高悬人心躁动,战力虽强但静修困难,宜以战养战掠夺资源,5 +19,血月当空,SR,"{extra_battle_strength_points: 7, extra_cultivate_exp: -10, extra_retreat_success_rate: -0.2}",血月高悬人心躁动,战力虽强但静修困难,宜以战养战掠夺资源,5 20,飞升之门,SSR,"{extra_cultivate_exp: 30, extra_breakthrough_success_rate: 0.2}",天门大开大道显现,感悟修行皆如有神助,正是冲击境界飞升成仙之时,7 21,法则显化,SSR,"{extra_breakthrough_success_rate: 0.5}",天地法则清晰可触,瓶颈如纸一捅即破,万勿错过此突破天赐良机,3 22,时空乱流,SSR,"{extra_fortune_probability: 0.005}",时空错乱异象频生,险地亦藏无上机缘,宜富贵险中求探索未知,5 \ No newline at end of file diff --git a/static/locales/zh-CN/game_configs/persona.csv b/static/locales/zh-CN/game_configs/persona.csv index 879f370..8c49a4a 100644 --- a/static/locales/zh-CN/game_configs/persona.csv +++ b/static/locales/zh-CN/game_configs/persona.csv @@ -1,25 +1,25 @@ id,key,name,exclusion_keys,desc,rarity,condition,effects ,Key,名称,互斥Key,描述/用于LLM输入的文本,稀有度(N/R/SR/SSR),选取条件,JSON形式 -1,RATIONAL,理性,FICKLE;CASUAL,你总是会用逻辑来思考问题,做事会谋定而后动。,N,, -2,FICKLE,无常,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL;PENSIVE,目标飘忽不定,不会长期坚持一个目标。,N,, -3,LAZY,怠惰,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你总是会拖延,不想努力,更热衷于享受人生。,N,,{extra_cast_success_rate: -0.05} +1,RATIONAL,理性,FICKLE;CASUAL,你总是会用逻辑来思考问题,做事会谋定而后动。,N,,{extra_retreat_success_rate: 0.05} +2,FICKLE,无常,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL;PENSIVE,目标飘忽不定,不会长期坚持一个目标。,N,,{extra_retreat_success_rate: -0.1} +3,LAZY,怠惰,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你总是会拖延,不想努力,更热衷于享受人生。,N,,"{extra_cast_success_rate: -0.05, extra_retreat_success_rate: -0.1}" 4,ADVENTUROUS,冒险,LAZY;LIFE_CHERISHING,你总是会冒险,喜欢刺激,总想放手一搏。,N,, 5,CASUAL,随性,RATIONAL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。,N,, 6,GREEDY,贪财,,你对灵石和财富有着强烈的渴望。,N,,{extra_item_sell_price_multiplier: 0.1} 7,GATHERER,采集者,,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。,R,,{extra_harvest_materials: 1} 8,HUNTER,猎人,,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌。,R,,{extra_hunt_materials: 1} -9,PENSIVE,沉思,FICKLE,你总是会深思熟虑,思考问题比较有哲理。,N,, +9,PENSIVE,沉思,FICKLE,你总是会深思熟虑,思考问题比较有哲理。,N,,{extra_retreat_success_rate: 0.1} 10,LIFE_CHERISHING,惜命,ADVENTUROUS;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你总是会珍惜自己的生命,不会轻易冒险。,R,,{extra_escape_success_rate: 0.15} 11,FRIENDLY,友爱,ALOOF;INDIFFERENT;AGGRESSIVE;VENGEFUL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你重视同伴与和谐,乐于助人。,N,, 12,VENGEFUL,复仇,FRIENDLY;INDIFFERENT,你绝不轻易放下仇怨,为了复仇愿意付出代价与时间。,N,, 13,ALOOF,孤僻,FRIENDLY,你喜欢独处,避免与人深交。,N,, 14,INDIFFERENT,淡漠,FRIENDLY;VENGEFUL;AGGRESSIVE;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你情感克制,对外界冷静疏离。,N,, 15,AGGRESSIVE,好斗,FRIENDLY;INDIFFERENT;LIFE_CHERISHING;TIMID,你直面冲突,偏好以力量与对抗解决问题。,R,,{extra_battle_strength_points: 1} -16,RASH,鲁莽,RATIONAL;PENSIVE;LIFE_CHERISHING,你行事冲动、少考虑后果,常凭直觉立刻行动。,N,,{extra_cast_success_rate: -0.05} +16,RASH,鲁莽,RATIONAL;PENSIVE;LIFE_CHERISHING,你行事冲动、少考虑后果,常凭直觉立刻行动。,N,,"{extra_cast_success_rate: -0.05, extra_retreat_success_rate: -0.1}" 17,TIMID,胆小,ADVENTUROUS;AGGRESSIVE;VENGEFUL;EXTREMELY_RIGHTEOUS;EXTREMELY_EVIL,你谨小慎微,容易畏惧风险。,N,,{extra_escape_success_rate: 0.1} 18,OVERBEARING,霸道,FRIENDLY;TIMID,你行事强势,不讲道理,习惯以自己的利益为先。,N,, -19,CULTIVATION_OBSESSED,修行痴迷,FICKLE;LAZY;CASUAL,你将绝大多数时间用于修炼,厌恶享乐。,R,,{extra_cultivate_exp: 30} -20,INTROVERTED,内向,EXTROVERTED,你更享受独处与自我思考,倾向回避不必要的社交。,N,, +19,CULTIVATION_OBSESSED,修行痴迷,FICKLE;LAZY;CASUAL,你将绝大多数时间用于修炼,厌恶享乐。,R,,"{extra_cultivate_exp: 30, extra_retreat_success_rate: 0.15}" +20,INTROVERTED,内向,EXTROVERTED,你更享受独处与自我思考,倾向回避不必要的社交。,N,,{extra_retreat_success_rate: 0.05} 21,EXTROVERTED,外向,ALOOF;INDIFFERENT;INTROVERTED,你乐于与人交流,主动结识伙伴。,N,, 22,MEAN,刻薄,FRIENDLY;ENTHUSIASTIC,你在对话中倾向以讽刺、嘲弄、挖苦的方式表达自己。,N,, 23,ENTHUSIASTIC,热情,ALOOF;INDIFFERENT;MEAN,你待人友好、积极回应,倾向用鼓励与赞美拉近距离。,N,, diff --git a/static/locales/zh-CN/game_configs/root.csv b/static/locales/zh-CN/game_configs/root.csv index 79119f9..a4d2ea5 100644 --- a/static/locales/zh-CN/game_configs/root.csv +++ b/static/locales/zh-CN/game_configs/root.csv @@ -9,5 +9,5 @@ id,key,name,element_list,desc,effects 7,ICE,冰灵根,GOLD;WATER,控制力强;持久性好, 8,WIND,风灵根,WOOD;WATER,身法卓绝;难以捉摸, 9,DARK,暗灵根,FIRE;EARTH,隐匿系;擅幻术与诡道, -10,HEAVEN,天灵根,GOLD;WOOD;WATER;FIRE;EARTH,资质通天;五行皆通,修行全面,{extra_breakthrough_success_rate: 0.1} +10,HEAVEN,天灵根,GOLD;WOOD;WATER;FIRE;EARTH,资质通天;五行皆通,修行全面,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}" diff --git a/static/locales/zh-CN/game_configs/sect.csv b/static/locales/zh-CN/game_configs/sect.csv index b1f12c5..14367a4 100644 --- a/static/locales/zh-CN/game_configs/sect.csv +++ b/static/locales/zh-CN/game_configs/sect.csv @@ -3,7 +3,7 @@ id,name,desc,member_act_style,alignment,weight,preferred_weapon,effects,rank_nam 1,明心剑宗,"通玄界东方第一宗,以无上剑道称雄于世。云纹阵法为不传心法。【剑道专精】作为剑修,你使用剑类兵器时战力惊人,且在剑道上的感悟速度远超常人。",清明克己,行止如一。重剑与心法并重,讲究明心见性。,RIGHTEOUS,1,SWORD,"{extra_battle_strength_points: 3, extra_weapon_proficiency_gain: 0.5}", 2,百兽宗,"以驯养灵兽闻名,豢养各种妖兽灵怪为战力。【御兽大师】你拥有独特的御兽天赋,捕捉妖兽对你来说轻而易举,善于驱使兽群为你而战。",言语直接,重视力量与血性,崇尚狩猎与搏斗。,EVIL,1,WHIP,"{extra_catch_success_rate: 0.25, extra_hunt_materials: 1}",谷主;供奉;驭兽师;扈从 3,水镜宗,"正道十宗之一,实则严守中立。拥有仙界异宝""彻天水镜""可预知未来。【趋吉避凶】你拥有超乎常人的直觉,视野开阔,且极易在探索中发现奇遇。",处事冷静圆融,喜以柔克刚,擅借力与反制。,NEUTRAL,1,FAN,"{extra_observation_radius: 2, extra_fortune_probability: 0.002, extra_refine_success_rate: 0.05}",镜主;掌镜人;传人;侍镜 -4,冥王宗,"行走幽冥之道,术法阴冷狠厉。【通幽】你修行幽冥之法,心志坚定,突破瓶颈时心无杂念,成功率更高。",言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,EVIL,1,FAN,"{extra_breakthrough_success_rate: 0.1}",殿主;判官;无常;鬼卒 +4,冥王宗,"行走幽冥之道,术法阴冷狠厉。【通幽】你修行幽冥之法,心志坚定,突破瓶颈时心无杂念,成功率更高。",言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,EVIL,1,FAN,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}",殿主;判官;无常;鬼卒 5,朱勾宗,"邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。【暗杀专家】你精通潜伏与刺杀,对于强敌,避开正面交锋、伺机暗杀往往是你最佳的制胜之道。",直面欲望与代价,不惧黑暗,以攻伐见长。,EVIL,1,HIDDEN_WEAPON,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1, extra_cast_success_rate: 0.05}",楼主;掌刑使;影刺;探子 6,合欢宗,"以情入道,靠双修增进修为,善驭人心,长于权变。【双修秘术】你的体质特殊,通过双修能获得远超常人的修为提升,这是你提升境界的最佳捷径。",辞令婉转,善于拿捏人欲与局势,以柔制刚。,NEUTRAL,1,ZITHER,"{extra_dual_cultivation_exp: 150, shop_buy_price_reduction: 0.1}",宫主;护法;媚仙;侍童 7,镇魂宗,"铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。【金刚不坏】你修习护体神功,拥有极强的肉身防御与伤害减免能力,如山岳般不可撼动。",肃穆沉稳,重安魂镇邪,少言而果决。,RIGHTEOUS,1,STAFF,"{extra_max_hp: 100, damage_reduction: 0.15}",住持;首座;行者;居士 diff --git a/static/locales/zh-CN/game_configs/technique.csv b/static/locales/zh-CN/game_configs/technique.csv index 7d1a09c..fb8a662 100644 --- a/static/locales/zh-CN/game_configs/technique.csv +++ b/static/locales/zh-CN/game_configs/technique.csv @@ -10,7 +10,7 @@ id,name,technique_root,grade,desc,weight,condition,sect_id,effects 11,纯阳无极功,FIRE,MIDDLE,纯阳之气,刚猛无铸,克制阴邪。,1,,,"{""extra_battle_strength_points"": 3}" 13,搬山诀,EARTH,LOWER,力能扛鼎,气力悠长,如下山猛虎。,1,,, 14,不动明王诀,EARTH,MIDDLE,不动如山,动如雷震,佛门护法神功。,1,,,"{""extra_battle_strength_points"": 3}" -16,冰心诀,ICE,LOWER,心若冰清,天塌不惊,凝神静气。,1,,, +16,冰心诀,ICE,LOWER,心若冰清,天塌不惊,凝神静气。,1,,,{extra_retreat_success_rate: 0.1} 17,玄冰劲,ICE,MIDDLE,寒气透骨,冻结经脉,阴狠霸道。,1,,,"{""extra_battle_strength_points"": 3}" 19,神行百变,WIND,LOWER,身法灵动,变幻莫测,逃跑一流。,1,,, 20,梯云纵,WIND,MIDDLE,武当绝学,左脚踩右脚,直上青云。,1,,,"{""extra_battle_strength_points"": 3}" diff --git a/tests/test_action_retreat.py b/tests/test_action_retreat.py new file mode 100644 index 0000000..8512a8e --- /dev/null +++ b/tests/test_action_retreat.py @@ -0,0 +1,140 @@ + +import pytest +from unittest.mock import MagicMock, patch, ANY +from src.classes.action.retreat import Retreat +from src.classes.action_runtime import ActionStatus +from src.classes.cultivation import Realm +from src.i18n import t + +class TestActionRetreat: + + @pytest.fixture + def retreat_avatar(self, dummy_avatar): + """配置一个适合闭关的角色环境""" + # 设置为练气期,基础突破概率 0.5 + dummy_avatar.cultivation_progress.realm = Realm.Qi_Refinement + + # 确保 temporary_effects 列表存在(虽然 init 应该已经创建了) + if not hasattr(dummy_avatar, "temporary_effects"): + dummy_avatar.temporary_effects = [] + + return dummy_avatar + + def test_retreat_init(self, retreat_avatar): + """测试闭关动作初始化""" + action = Retreat(retreat_avatar, retreat_avatar.world) + + # 验证持续时间范围 12-60 个月 + assert 12 <= action.duration_months <= 60 + # 验证是大事 + assert action.IS_MAJOR is True + + # 验证可以开始 + can_start, reason = action.can_start() + assert can_start is True + + @pytest.mark.asyncio + async def test_retreat_success(self, retreat_avatar): + """测试闭关成功""" + action = Retreat(retreat_avatar, retreat_avatar.world) + action.duration_months = 24 + + # Mock 随机数,使得 random.random() < success_rate (0.5) + # calc_success_rate for Qi_Refinement is 0.5 (0.5 - 0*0.1) + # So we need random < 0.5 + with patch('random.random', return_value=0.1), \ + patch('src.classes.story_teller.StoryTeller.tell_story', return_value="Great story"): + + # Start + start_event = action.start() + assert start_event is not None + + # Finish + events = await action.finish() + + # 验证事件生成 + assert len(events) >= 2 + assert any("successfully" in str(e) or "成功" in str(e) for e in events) + + # 验证获得了临时效果 + assert len(retreat_avatar.temporary_effects) == 1 + effect = retreat_avatar.temporary_effects[0] + assert effect["source"] == "Retreat Bonus" + assert effect["effects"]["extra_breakthrough_success_rate"] > 0 + assert effect["duration"] == 120 # 10年 + + # 验证属性重算(需要检查 effects 属性是否包含加成) + # 由于 effects 是动态计算的,只要 temporary_effects 里有,且 EffectsMixin 正常工作, + # 那么 avatar.effects 应该能读到 + + # 这里简单验证 temporary_effects 结构正确即可,EffectsMixin 逻辑由 mixin 自身保证 + pass + + @pytest.mark.asyncio + async def test_retreat_fail(self, retreat_avatar): + """测试闭关失败""" + action = Retreat(retreat_avatar, retreat_avatar.world) + action.duration_months = 36 + + original_lifespan = retreat_avatar.age.max_lifespan + + # Mock 随机数,使得 random.random() >= success_rate (0.5) + # random.randint used for reduce_years (5, 20) + with patch('random.random', return_value=0.9), \ + patch('random.randint', side_effect=[10]), \ + patch('src.classes.story_teller.StoryTeller.tell_story', return_value="Sad story"): + + # Finish + events = await action.finish() + + # 验证事件 + assert len(events) >= 2 + assert any("failed" in str(e) or "失败" in str(e) for e in events) + + # 验证没有临时效果 + assert len(retreat_avatar.temporary_effects) == 0 + + # 验证寿元减少 (mocked to reduce 10) + assert retreat_avatar.age.max_lifespan == original_lifespan - 10 + + def test_calc_success_rate(self, retreat_avatar): + """测试成功率计算""" + action = Retreat(retreat_avatar, retreat_avatar.world) + + # Qi Refinement: 0.5 - 0 = 0.5 + retreat_avatar.cultivation_progress.realm = Realm.Qi_Refinement + assert action.calc_success_rate() == 0.5 + + # Foundation: 0.5 - 0.1 = 0.4 + retreat_avatar.cultivation_progress.realm = Realm.Foundation_Establishment + assert action.calc_success_rate() == 0.4 + + # Core Formation: 0.5 - 0.2 = 0.3 + retreat_avatar.cultivation_progress.realm = Realm.Core_Formation + assert action.calc_success_rate() == 0.3 + + # Nascent Soul: 0.5 - 0.3 = 0.2 + retreat_avatar.cultivation_progress.realm = Realm.Nascent_Soul + assert action.calc_success_rate() == pytest.approx(0.2) + + def test_retreat_isolation(self, retreat_avatar): + """测试闭关的隔离性(不参与聚会,不触发奇遇)""" + action = Retreat(retreat_avatar, retreat_avatar.world) + + # 1. 验证 Action 类属性配置 + assert action.ALLOW_GATHERING is False + assert action.ALLOW_WORLD_EVENTS is False + + # 2. 验证 Avatar 状态检查 + # 模拟角色正在执行闭关动作 + from src.classes.action_runtime import ActionInstance + retreat_avatar.current_action = ActionInstance(action=action, params={}, status="running") + + assert retreat_avatar.can_join_gathering is False + assert retreat_avatar.can_trigger_world_event is False + + # 3. 验证解除动作后恢复正常 + retreat_avatar.current_action = None + assert retreat_avatar.can_join_gathering is True + assert retreat_avatar.can_trigger_world_event is True +