update personas
This commit is contained in:
173
src/classes/effects.py
Normal file
173
src/classes/effects.py
Normal file
@@ -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] - 合法动作列表
|
||||
]
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user