diff --git a/src/classes/effects.py b/src/classes/effects.py new file mode 100644 index 0000000..551381c --- /dev/null +++ b/src/classes/effects.py @@ -0,0 +1,173 @@ +""" +Effects 效果系统 +================ + +本文件定义了游戏中所有合法的 effect 字段。 +Effects 通过角色的 avatar.effects 属性合并并生效。 + +Effect 来源: +- 宗门 (sect) +- 功法 (technique) +- 灵根 (root) +- 特质 (persona) +- 法宝 (treasure) +""" + +# ============================================================================= +# Effect 常量定义 +# ============================================================================= + +# --- 战斗相关 --- +EXTRA_BATTLE_STRENGTH_POINTS = "extra_battle_strength_points" +""" +额外战斗力点数 +类型: int +结算: src/classes/battle.py +说明: 直接增加角色的战斗力数值 +""" + +EXTRA_OBSERVATION_RADIUS = "extra_observation_radius" +""" +额外观察半径 +类型: int +结算: [待实现] +说明: 增加角色的观察范围 +""" + +# --- 修炼相关 --- +EXTRA_CULTIVATE_EXP = "extra_cultivate_exp" +""" +额外修炼经验 +类型: int +结算: src/classes/action/cultivate.py +说明: 每次修炼时额外获得的经验值 +""" + +EXTRA_BREAKTHROUGH_SUCCESS_RATE = "extra_breakthrough_success_rate" +""" +额外突破成功率 +类型: float (范围: -1.0 ~ 1.0) +结算: src/classes/action/breakthrough.py +说明: 修改突破时的成功率,可以为负值降低成功率 +""" + +# --- 双修相关 --- +EXTRA_DUAL_CULTIVATION_EXP = "extra_dual_cultivation_exp" +""" +额外双修经验 +类型: int +结算: src/classes/mutual_action/dual_cultivation.py +说明: 双修时发起者额外获得的经验值 +""" + +# --- 采集相关 --- +EXTRA_HARVEST_ITEMS = "extra_harvest_items" +""" +额外采集物品数量 +类型: int +结算: src/classes/action/harvest.py +说明: 采集植物时额外获得的物品数量 +""" + +EXTRA_HUNT_ITEMS = "extra_hunt_items" +""" +额外狩猎物品数量 +类型: int +结算: src/classes/action/hunt.py +说明: 狩猎动物时额外获得的物品数量 +""" + +# --- 移动相关 --- +EXTRA_MOVE_STEP = "extra_move_step" +""" +额外移动步数 +类型: int +结算: [待实现] +说明: 每次移动时可以多移动的步数 +""" + +# --- 捕捉相关 --- +EXTRA_CATCH_SUCCESS_RATE = "extra_catch_success_rate" +""" +额外捕捉成功率 +类型: float (范围: 0.0 ~ 1.0) +结算: src/classes/action/catch.py +说明: 捕捉灵兽时增加的成功率 +""" + +# --- 奇遇相关 --- +EXTRA_FORTUNE_PROBABILITY = "extra_fortune_probability" +""" +额外奇遇概率 +类型: float (范围: 0.0 ~ 1.0) +结算: src/classes/fortune.py +说明: 增加触发奇遇事件的概率 +""" + +# --- 特殊权限 --- +LEGAL_ACTIONS = "legal_actions" +""" +合法动作列表 +类型: list[str] +结算: 各个 action 的权限检查 +说明: 允许角色执行的特殊动作列表 +可用值: + - "DualCultivation": 双修(合欢宗专属) + - "DevourMortals": 吞噬凡人(邪道法宝) +""" + +# ============================================================================= +# Effect 合并规则 +# ============================================================================= + +""" +Effects 通过 src/classes/effect.py 中的 _merge_effects() 函数合并。 + +合并规则: +1. 列表类型 (如 legal_actions): 取并集(去重) +2. 数值类型 (如 extra_*): 累加 +3. 其他类型: 后者覆盖前者 +4. 动态表达式 (如 "eval(...)"): 在 Avatar.effects property 中 eval 计算 + +合并顺序(从低到高优先级): +1. 宗门 (sect) +2. 功法 (technique) +3. 灵根 (root) +4. 特质 (persona) - 遍历所有 personas +5. 法宝 (treasure) + +最终结果通过 Avatar.effects 属性获取(实时计算)。 +""" + +# ============================================================================= +# 所有合法 Effect 字段清单 +# ============================================================================= + +ALL_EFFECTS = [ + # 战斗相关 + "extra_battle_strength_points", # int - 额外战斗力 + "extra_observation_radius", # int - 额外观察半径 + + # 修炼相关 + "extra_cultivate_exp", # int - 额外修炼经验 + "extra_breakthrough_success_rate", # float - 额外突破成功率 + + # 双修相关 + "extra_dual_cultivation_exp", # int - 额外双修经验 + + # 采集相关 + "extra_harvest_items", # int - 额外采集物品数量 + "extra_hunt_items", # int - 额外狩猎物品数量 + + # 移动相关 + "extra_move_step", # int - 额外移动步数 + + # 捕捉相关 + "extra_catch_success_rate", # float - 额外捕捉成功率 + + # 奇遇相关 + "extra_fortune_probability", # float - 额外奇遇概率 + + # 特殊权限 + "legal_actions", # list[str] - 合法动作列表 +] diff --git a/src/classes/persona.py b/src/classes/persona.py index d0ce689..9b89482 100644 --- a/src/classes/persona.py +++ b/src/classes/persona.py @@ -22,7 +22,7 @@ class Persona: id: int name: str desc: str - exclusion_ids: List[int] + exclusion_names: List[str] rarity: Rarity condition: str effects: dict[str, object] @@ -45,11 +45,11 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: persona_df = game_configs["persona"] for _, row in persona_df.iterrows(): - # 解析exclusion_ids字符串,转换为int列表 - exclusion_ids_str = str(row["exclusion_ids"]) if str(row["exclusion_ids"]) != "nan" else "" - exclusion_ids = [] - if exclusion_ids_str: - exclusion_ids = [int(x.strip()) for x in exclusion_ids_str.split(ids_separator) if x.strip()] + # 解析exclusion_names字符串,转换为字符串列表 + exclusion_names_str = str(row["exclusion_names"]) if str(row["exclusion_names"]) != "nan" else "" + exclusion_names = [] + if exclusion_names_str: + exclusion_names = [x.strip() for x in exclusion_names_str.split(ids_separator) if x.strip()] # 解析稀有度(缺失或为 NaN 时默认为 N) rarity_val = row.get("rarity", "N") rarity_str = str(rarity_val).strip().upper() @@ -65,7 +65,7 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: id=int(row["id"]), name=str(row["name"]), desc=str(row["desc"]), - exclusion_ids=exclusion_ids, + exclusion_names=exclusion_names, rarity=rarity, condition=condition, effects=effects, @@ -82,7 +82,7 @@ def _is_persona_allowed(persona_id: int, already_selected_ids: set[int], avatar: """ 统一判断:persona 是否允许被选择(条件 + 互斥)。 - 条件:当存在 avatar 且配置了 condition 时,通过安全 eval 判断。 - - 互斥:与已选 persona 双向互斥。 + - 互斥:与已选 persona 双向互斥(通过名字比较)。 """ persona = personas_by_id[persona_id] # 条件判定 @@ -90,10 +90,11 @@ def _is_persona_allowed(persona_id: int, already_selected_ids: set[int], avatar: allowed = bool(eval(persona.condition, {"__builtins__": {}}, {"avatar": avatar})) if not allowed: return False - # 与已选互斥检查(双向) + # 与已选互斥检查(双向,通过名字) for sid in already_selected_ids: other = personas_by_id[sid] - if (persona_id in other.exclusion_ids) or (sid in persona.exclusion_ids): + # 检查当前persona是否在对方的互斥列表中,或对方是否在当前persona的互斥列表中 + if (persona.name in other.exclusion_names) or (other.name in persona.exclusion_names): return False return True diff --git a/static/game_configs/persona.csv b/static/game_configs/persona.csv index 11f997f..b406f90 100644 --- a/static/game_configs/persona.csv +++ b/static/game_configs/persona.csv @@ -1,33 +1,33 @@ -id,name,exclusion_ids,desc,rarity,condition,effects -,,和本persona互斥的persona的id,描述/用于LLM输入的文本,稀有度(N/R/SR/SSR),选取条件(可用avatar字段/Alignment中文或英文等),"JSON形式" -1,理性,2;5,你总是会用逻辑来思考问题,做事会谋定而后动。,N, -2,无常,1;24;25;9,目标飘忽不定,不会长期坚持一个目标。,N, -3,怠惰,4;24;25,你总是会拖延,不想努力,更热衷于享受人生。,N, -4,冒险,3;10,你总是会冒险,喜欢刺激,总想放手一搏。,N, -5,随性,1;24;25,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。,N, +id,name,exclusion_names,desc,rarity,condition,effects +,,和本persona互斥的persona的名称,描述/用于LLM输入的文本,稀有度(N/R/SR/SSR),选取条件(可用avatar字段/Alignment中文或英文等),"JSON形式" +1,理性,无常;随性,你总是会用逻辑来思考问题,做事会谋定而后动。,N, +2,无常,理性;极端正义;极端邪恶;沉思,目标飘忽不定,不会长期坚持一个目标。,N, +3,怠惰,冒险;极端正义;极端邪恶,你总是会拖延,不想努力,更热衷于享受人生。,N, +4,冒险,怠惰;惜命,你总是会冒险,喜欢刺激,总想放手一搏。,N, +5,随性,理性;极端正义;极端邪恶,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。,N, 6,贪财,,你对灵石和财富有着强烈的渴望。,N, 7,药师,,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。你认为大自然的恩赐需要用心去发现和珍惜。,R,,"{""extra_harvest_items"": 1}" 8,猎者,,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌,喜欢捕猎野兽。情况允许也会御兽。,R,,"{""extra_hunt_items"": 1}" -9,沉思,2,你总是会深思熟虑,思考问题比较有哲理。,N, -10,惜命,4;24;25,你总是会珍惜自己的生命,不会轻易冒险。,N, -11,友爱,13;14;15;12;24;25,你重视同伴与和谐,乐于助人,倾向通过协作与沟通化解矛盾。,N, -12,复仇,11;14,"你绝不轻易放下仇怨,为了复仇愿意付出代价与时间。你必须立刻进行复仇行动。",N,, -13,孤僻,11,你喜欢独处,避免与人深交,更信赖自己的判断与行动。,N, -14,淡漠,11;12;15;24;25,你情感克制,对外界冷静疏离,不轻易被他人或事件影响。,N, -15,好斗,11;14;10;17,你直面冲突,偏好以力量与对抗解决问题,并格外热衷增加己身战力。,R,,"{""extra_battle_strength_points"": 1}" -16,鲁莽,1;9;10,你行事冲动、少考虑后果,常凭直觉立刻行动。,N, -17,胆小,4;15;12;24;25,你谨小慎微,容易畏惧风险,倾向回避正面冲突。,N, -18,霸道,11;17,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。,N, -19,修行痴迷,2;3;5,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。,R,,"{""extra_cultivate_exp"": 30}" -20,内向,21,你更享受独处与自我思考,倾向回避不必要的社交与长谈。,N, -21,外向,13;14;20,你乐于与人交流,主动结识伙伴,倾向接受对话和合作。,N, -22,刻薄,11;23,你在对话中倾向以讽刺、嘲弄、挖苦的方式表达自己,更容易引发冲突与对立;你通常不愿迅速进入友好关系,更可能在不顺利的交流后滋生敌意或结仇。,N, -23,热情,13;14;22,你待人友好、积极回应,倾向用鼓励与赞美拉近距离;你更愿意主动展开善意的交流,乐于合作与分享,N, -24,极端正义,20;25,你对邪恶深恶痛绝,对正义的理想抱有近乎偏执的追求。,SR,avatar.alignment == "正" -25,极端邪恶,20;24,你推崇权力与恐惧,为达目的不择手段,对善良嗤之以鼻。,SR,avatar.alignment == "邪" -26,开放,27,你对待和他人结为道侣或者双修比较随意,R,,"{""extra_dual_cultivation_exp"": 30}" -27,腼腆,26,你对待和他人结为道侣或者双修比较谨慎,N, -28,舔狗,13;14;22;27,你对异性中外貌出众者格外友善,倾向主动接近、帮助与合作。,N, -29,嫉妒,11;23,你对在修为、外貌或财富等方面远超于你的人容易产生敌意,更倾向对其冷淡、挑衅或打压。,N, +9,沉思,无常,你总是会深思熟虑,思考问题比较有哲理。,N, +10,惜命,冒险;极端正义;极端邪恶,你总是会珍惜自己的生命,不会轻易冒险。,N, +11,友爱,孤僻;淡漠;好斗;复仇;极端正义;极端邪恶,你重视同伴与和谐,乐于助人,倾向通过协作与沟通化解矛盾。,N, +12,复仇,友爱;淡漠,"你绝不轻易放下仇怨,为了复仇愿意付出代价与时间。你必须立刻进行复仇行动。",N,, +13,孤僻,友爱,你喜欢独处,避免与人深交,更信赖自己的判断与行动。,N, +14,淡漠,友爱;复仇;好斗;极端正义;极端邪恶,你情感克制,对外界冷静疏离,不轻易被他人或事件影响。,N, +15,好斗,友爱;淡漠;惜命;胆小,你直面冲突,偏好以力量与对抗解决问题,并格外热衷增加己身战力。,R,,"{""extra_battle_strength_points"": 1}" +16,鲁莽,理性;沉思;惜命,你行事冲动、少考虑后果,常凭直觉立刻行动。,N, +17,胆小,冒险;好斗;复仇;极端正义;极端邪恶,你谨小慎微,容易畏惧风险,倾向回避正面冲突。,N, +18,霸道,友爱;胆小,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。,N, +19,修行痴迷,无常;怠惰;随性,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。,R,,"{""extra_cultivate_exp"": 30}" +20,内向,外向,你更享受独处与自我思考,倾向回避不必要的社交与长谈。,N, +21,外向,孤僻;淡漠;内向,你乐于与人交流,主动结识伙伴,倾向接受对话和合作。,N, +22,刻薄,友爱;热情,你在对话中倾向以讽刺、嘲弄、挖苦的方式表达自己,更容易引发冲突与对立;你通常不愿迅速进入友好关系,更可能在不顺利的交流后滋生敌意或结仇。,N, +23,热情,孤僻;淡漠;刻薄,你待人友好、积极回应,倾向用鼓励与赞美拉近距离;你更愿意主动展开善意的交流,乐于合作与分享,N, +24,极端正义,内向;极端邪恶,你对邪恶深恶痛绝,对正义的理想抱有近乎偏执的追求。,SR,avatar.alignment == "正" +25,极端邪恶,内向;极端正义,你推崇权力与恐惧,为达目的不择手段,对善良嗤之以鼻。,SR,avatar.alignment == "邪" +26,开放,腼腆,你对待和他人结为道侣或者双修比较随意,R,,"{""extra_dual_cultivation_exp"": 30}" +27,腼腆,开放,你对待和他人结为道侣或者双修比较谨慎,N, +28,舔狗,孤僻;淡漠;刻薄;腼腆,你对异性中外貌出众者格外友善,倾向主动接近、帮助与合作。,N, +29,嫉妒,友爱;热情,你对在修为、外貌或财富等方面远超于你的人容易产生敌意,更倾向对其冷淡、挑衅或打压。,N, 30,穿越者,,你来自现代社会,怀念现代社会的一切,你的思考(thinking)必须是现代化的思考,SR, -31,气运之子,,天生气运加身,更易遇到奇遇,战斗力也略有提升,SSR,,"{""extra_fortune_probability"": 0.05, ""extra_battle_strength_points"": 2}" \ No newline at end of file +31,气运之子,,天生气运加身,更易遇到奇遇,战斗力也略有提升,SSR,,"{""extra_fortune_probability"": 0.05, ""extra_battle_strength_points"": 2}"