add more effects

This commit is contained in:
bridge
2025-10-16 02:06:04 +08:00
parent f09f8318b9
commit 14317a7b78
8 changed files with 122 additions and 75 deletions

View File

@@ -25,7 +25,7 @@ CALAMITY_DESCRIPTIONS: dict[str, str] = {
"情劫": "柔情即刃,难舍难分,念头被拉回人间烟火。",
}
from src.classes.hp_and_mp import HP_MAX_BY_REALM, MP_MAX_BY_REALM
from src.classes.root import extra_breakthrough_success_rate
from src.classes.effect import _merge_effects
class Breakthrough(TimedAction):
@@ -45,7 +45,8 @@ class Breakthrough(TimedAction):
计算突破境界的成功率(由修为进度给出)
"""
base = self.avatar.cultivation_progress.get_breakthrough_success_rate()
bonus = extra_breakthrough_success_rate[self.avatar.root]
# 统一从 avatar.effects 读取额外加成root/technique/sect 等已合并)
bonus = float(self.avatar.effects.get("extra_breakthrough_success_rate", 0.0))
# 夹紧到 [0, 1]
return max(0.0, min(1.0, base + bonus))

View File

@@ -29,6 +29,10 @@ class Cultivate(TimedAction):
essence_types = get_essence_types_for_root(root)
essence_density = max((essence.get_density(et) for et in essence_types), default=0)
exp = self.get_exp(essence_density)
# 结算额外修炼经验(来自功法/宗门/灵根等已合并)
extra_exp = int(self.avatar.effects.get("extra_cultivate_exp", 0) or 0)
if extra_exp:
exp += extra_exp
self.avatar.cultivation_progress.add_exp(exp)
def get_exp(self, essence_density: int) -> int:

View File

@@ -20,6 +20,7 @@ from src.classes.event import NULL_EVENT, Event
from src.classes.typings import ACTION_NAME, ACTION_PARAMS, ACTION_NAME_PARAMS_PAIRS, ACTION_NAME_PARAMS_PAIR
from src.classes.action_runtime import ActionPlan, ActionInstance
from src.classes.effect import _merge_effects
from src.classes.alignment import Alignment
from src.classes.persona import Persona, personas_by_id, get_random_compatible_personas
from src.classes.item import Item
from src.classes.magic_stone import MagicStone
@@ -128,10 +129,13 @@ class Avatar:
@property
def effects(self) -> dict[str, object]:
merged: dict[str, object] = defaultdict(str)
# 来自宗门
if self.sect is not None and getattr(self.sect, "effects", None):
merged = _merge_effects(merged, self.sect.effects)
if self.technique is not None and getattr(self.technique, "effects", None):
merged = _merge_effects(merged, self.technique.effects)
# 来自功法
merged = _merge_effects(merged, self.technique.effects)
# 来自灵根
merged = _merge_effects(merged, self.root.effects)
return merged

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
import json
import ast
from typing import Any
from typing import Any, Callable, Optional
def load_effect_from_str(value: object) -> dict[str, Any]:
@@ -62,3 +62,32 @@ def _merge_effects(base: dict[str, object], addition: dict[str, object]) -> dict
else:
merged[key] = val
return merged
def build_effects_map_from_df(
df,
key_column: str,
parse_key: Callable[[str], Any],
effects_column: str = "effects",
) -> dict[Any, dict[str, object]]:
"""
将配表 DataFrame 构造成 {key -> effects} 的映射:
- key_column用于定位键字符串通过 parse_key 解析为目标键(如 Enum
- effects_column字符串列使用 load_effect_from_str 解析
解析失败或空值的行将被忽略。
"""
effects_map: dict[Any, dict[str, object]] = {}
if df is None:
return effects_map
for _, row in df.iterrows():
raw_key = str(row.get(key_column, "")).strip()
if not raw_key or raw_key == "nan":
continue
try:
key = parse_key(raw_key)
except Exception:
continue
eff = load_effect_from_str(row.get(effects_column, ""))
if eff:
effects_map[key] = eff
return effects_map

View File

@@ -7,6 +7,8 @@
from enum import Enum
from typing import List, Tuple, Dict
from collections import defaultdict
from src.utils.df import game_configs
from src.classes.effect import build_effects_map_from_df
from src.classes.essence import EssenceType
@@ -84,6 +86,13 @@ class Root(_RootMixin, Enum):
def get_detailed_info(self) -> str:
return self.get_info()
@property
def effects(self) -> dict[str, object]:
"""
从 CSV 读取的该灵根效果。
"""
return dict(_root_effects_by_root.get(self, {}))
# 元素到灵气类型的一一对应
_essence_by_element = {
@@ -102,15 +111,17 @@ def get_essence_types_for_root(root: "Root") -> List[EssenceType]:
return [_essence_by_element[e] for e in root.elements]
# 额外突破成功率(默认 0.0),根据原 CSV 保留天灵根 0.1
extra_breakthrough_success_rate = defaultdict(
lambda: 0.0,
{
Root.HEAVEN: 0.1,
},
)
def _parse_root_key(raw: str) -> "Root":
return Root[raw]
_root_effects_by_root = build_effects_map_from_df(
game_configs.get("root"),
key_column="key",
parse_key=_parse_root_key,
effects_column="effects",
)
def format_root_cn(root: "Root") -> str:
"""
将 Root 显示为中文短名 + 组成,例如:

View File

@@ -67,8 +67,6 @@ class Technique:
def get_detailed_info(self) -> str:
return f"{self.name}{self.attribute}{self.grade.value} {self.desc}"
# 五行与扩展属性的克制关系
# - 五行:金克木,木克土,土克水,水克火,火克金
# - 雷克邪;邪、冰、风、暗不克任何人

View File

@@ -1,13 +1,13 @@
id,key,name,element_list,desc,extra_breakthrough_success_rate
,,元素列表以分号分隔(示例:金;木),描述不会在代码中使用,额外突破成功率
1,GOLD,金灵根,,刚强果断;攻击力强,适合剑修,0
2,WOOD,木灵根,,仁厚坚韧;擅恢复、毒术与木属性法术,0
3,WATER,水灵根,,智慧圆融;身法轻盈,善辅助与隐匿,0
4,FIRE,火灵根,,激情暴烈;高爆发攻术,火系功法,0
5,EARTH,土灵根,,稳重踏实;防御高,体修或傀儡术,0
6,THUNDER,雷灵根,水;土,爆发性极强;战斗系顶尖,0
7,ICE,冰灵根,金;水,控制力强;持久性好,0
8,WIND,风灵根,木;水,身法卓绝;难以捉摸,0
9,DARK,暗灵根,火;土,隐匿系;擅幻术与诡道,0
10,HEAVEN,天灵根,金;木;水;火;土,资质通天;五行皆通,修行全面,0.1
id,key,name,element_list,desc,effects
,,元素列表以分号分隔(示例:金;木),描述不会在代码中使用,JSON/字面量,例:{"extra_breakthrough_success_rate": 0.1}
1,GOLD,金灵根,,刚强果断;攻击力强,适合剑修,
2,WOOD,木灵根,,仁厚坚韧;擅恢复、毒术与木属性法术,
3,WATER,水灵根,,智慧圆融;身法轻盈,善辅助与隐匿,
4,FIRE,火灵根,,激情暴烈;高爆发攻术,火系功法,
5,EARTH,土灵根,,稳重踏实;防御高,体修或傀儡术,
6,THUNDER,雷灵根,水;土,爆发性极强;战斗系顶尖,
7,ICE,冰灵根,金;水,控制力强;持久性好,
8,WIND,风灵根,木;水,身法卓绝;难以捉摸,
9,DARK,暗灵根,火;土,隐匿系;擅幻术与诡道,
10,HEAVEN,天灵根,金;木;水;火;土,资质通天;五行皆通,修行全面,{"extra_breakthrough_success_rate": 0.1}
Can't render this file because it contains an unexpected character in line 2 and column 108.

View File

@@ -1,50 +1,50 @@
id,name,technique_root,grade,desc,weight,condition,sect
,名称,属性,品阶(上中下),描述/提示词,抽样权重,条件,所属宗门
1,太乙金光锻体诀,,下品,运太乙金光淬骨炼筋,金罡护体,刀兵难侵。,1,,
2,金阳破甲术,,中品,融金阳之炽与锋,一往破敌,破甲断魄。,1,,
4,青木长春诀,,下品,借青木长春之机,涓涓养元,稳固根基。,1,,
5,碧林长生法,,中品,汲林海生机,法源不竭,柔而不折。,1,,
7,玄冥敛息诀,,下品,以玄冥静息收摄心神,润物无声。,1,,
8,玄水化海术,,中品,以玄水化百川,绵延不绝,攻守随势。,1,,
10,南明离火心诀,,下品,承南明离火之炽,鼓荡心魄,炼魂淬魄。,1,,
11,赤炎炼真诀,,中品,以赤炎炼真元,去伪存真,攻势如潮。,1,,
13,厚土镇魄诀,,下品,以厚土安神定魄,稳如山嶽,不动如山。,1,,
14,玄黄定岳法,,中品,以玄黄凝岳势,千钧一力,镇压四方。,1,,
16,玄冰凝真诀,,下品,以玄冰凝灵,清寒护体,心湖如镜。,1,,
17,冰魄玄寒法,,中品,御玄寒之魄,封江冻海,以静制动。,1,,
19,御风术,,下品,以清风导息,轻身迅行,形如掠影。,1,,
20,清风御行法,,中品,驭风行空,攻守兼备,灵动飘逸。,1,,
22,幽冥潜形术,,下品,以幽冥藏形,锋芒尽敛,伺机而动。,1,,
23,玄夜无相法,,中品,夜行无相,出入无痕,摄人心魄。,1,,
25,九天淬体雷诀,,下品,引九天霆罡击体,筋骨再生,爆发如雷。,1,,
26,九霄养雷法,,中品,引九霄真雷,养气通窍,威势赫然。,1,,
28,血神噬魂大法,,下品,以血神邪念淬炼,杀伐狠辣,损阴德。,1,,
29,冥狱吞灵大法,,中品,循冥狱之道吞噬灵魄,逆乱阴阳,速成之途。,1,,
30,明心归一剑典,,上品,以剑返本归一,明镜止水,一剑断妄。,10,,明心剑宗
31,霆光明志剑,,上品,以霆光贯剑意,电掣雷行,破虚斩障。,10,,明心剑宗
32,离火明心诀,,上品,以离火照见自心,去蔽存真,剑随心行。,10,,明心剑宗
33,御兽玄纲,,上品,以木灵沟通群兽,血脉契合,驱策如臂。,10,,百兽宗
34,蛮荒镇骨体,,上品,以厚土淬锻筋骨,躯壳如山,血勇不挫。,10,,百兽宗
35,血啸狩魂诀,,上品,以嗜血啸魄摄魂,狩猎杀伐,越战越猛。,10,,百兽宗
36,彻天水镜观,,上品,以彻天水镜观机,借势化力,先机在握。,10,,水镜宗
37,寒漪反斩法,,上品,以寒漪回折之势,四两拨千斤,刚柔相济。,10,,水镜宗
38,镜花游身步,,上品,以轻风流转为引,身化水月,进退自如。,10,,水镜宗
39,幽冥镇狱经,,上品,引幽冥阴煞镇压万灵,寒魄凝骨,万劫不侵。,10,,冥王宗
40,冥焰噬神法,,上品,以冥焰噬神,逆夺生机,吞灵化魄。,10,,冥王宗
41,黄泉引魄步,,上品,以玄寒引魄入泉,步步生霜,摄魂夺魄。,10,,冥王宗
42,赤狱炼锋诀,,上品,以赤狱真火炼锋,法器通灵,杀机更盛。,10,,朱勾宗
43,魇丝摄魂术,,上品,以魇丝无声摄魄,藏形夺命,来去无迹。,10,,朱勾宗
44,噬心傀儡经,,上品,以金罡刻阵,傀儡载魄,攻守如一。,10,,朱勾宗
45,双修合和典,,上品,以清润相济,合气生生,周天圆满。,10,,合欢宗
46,魅月摄情术,,上品,以魅月摄心,惑而不乱,借情化力。,10,,合欢宗
47,绮罗化影步,,上品,以轻纱化影,形随意转,柔中带锋。,10,,合欢宗
48,镇岳定魂经,,上品,以玄黄定岳势,安神定魄,万邪难侵。,10,,镇魂宗
49,霆狱伏邪法,,上品,引九霄霆威压邪,刚猛无俦,镇压不返。,10,,镇魂宗
50,金章封煞术,,上品,以金章为印,封煞束灵,斩乱镇邪。,10,,镇魂宗
51,幽冥无相诀,,上品,隐形无相,出没幽明,摄心夺魄于无声。,10,,幽魂噬影宗
52,噬影穿行步,,上品,以风掠影,穿行缝隙,先至而不留痕。,10,,幽魂噬影宗
53,冥狱吞魄经,,上品,循幽冥吞魄之道,化敌为养,速成险绝。,10,,幽魂噬影宗
54,天罗机巧篇,,上品,精研机巧阵枢,百变应敌,器术合一。,10,,千帆城
55,蓝星定魂阵,,上品,以厚土定魂为基,阵锁心神,稳如磐石。,10,,千帆城
56,飞翼乘风术,,上品,乘风而行,纵横千里,御器齐驱。,10,,千帆城
id,name,technique_root,grade,desc,weight,condition,sect,effects
,名称,属性,品阶(上中下),描述/提示词,抽样权重,条件,所属宗门,JSON/字面量,例:{"extra_cultivate_exp":50}
1,太乙金光锻体诀,,下品,运太乙金光淬骨炼筋,金罡护体,刀兵难侵。,1,,,
2,金阳破甲术,,中品,融金阳之炽与锋,一往破敌,破甲断魄。,1,,,
4,青木长春诀,,下品,借青木长春之机,涓涓养元,稳固根基。,1,,,
5,碧林长生法,,中品,汲林海生机,法源不竭,柔而不折。,1,,,
7,玄冥敛息诀,,下品,以玄冥静息收摄心神,润物无声。,1,,,
8,玄水化海术,,中品,以玄水化百川,绵延不绝,攻守随势。,1,,,
10,南明离火心诀,,下品,承南明离火之炽,鼓荡心魄,炼魂淬魄。,1,,,
11,赤炎炼真诀,,中品,以赤炎炼真元,去伪存真,攻势如潮。,1,,,
13,厚土镇魄诀,,下品,以厚土安神定魄,稳如山嶽,不动如山。,1,,,
14,玄黄定岳法,,中品,以玄黄凝岳势,千钧一力,镇压四方。,1,,,
16,玄冰凝真诀,,下品,以玄冰凝灵,清寒护体,心湖如镜。,1,,,
17,冰魄玄寒法,,中品,御玄寒之魄,封江冻海,以静制动。,1,,,
19,御风术,,下品,以清风导息,轻身迅行,形如掠影。,1,,,
20,清风御行法,,中品,驭风行空,攻守兼备,灵动飘逸。,1,,,
22,幽冥潜形术,,下品,以幽冥藏形,锋芒尽敛,伺机而动。,1,,,
23,玄夜无相法,,中品,夜行无相,出入无痕,摄人心魄。,1,,,
25,九天淬体雷诀,,下品,引九天霆罡击体,筋骨再生,爆发如雷。,1,,,
26,九霄养雷法,,中品,引九霄真雷,养气通窍,威势赫然。,1,,,
28,血神噬魂大法,,下品,以血神邪念淬炼,杀伐狠辣,损阴德。,1,,,{"extra_breakthrough_success_rate": -0.1, "extra_cultivate_exp": 50}
29,冥狱吞灵大法,,中品,循冥狱之道吞噬灵魄,逆乱阴阳,速成之途。,1,,,{"extra_breakthrough_success_rate": -0.1, "extra_cultivate_exp": 50}
30,明心归一剑典,,上品,以剑返本归一,明镜止水,一剑断妄。,10,,明心剑宗,
31,霆光明志剑,,上品,以霆光贯剑意,电掣雷行,破虚斩障。,10,,明心剑宗,
32,离火明心诀,,上品,以离火照见自心,去蔽存真,剑随心行。,10,,明心剑宗,
33,御兽玄纲,,上品,以木灵沟通群兽,血脉契合,驱策如臂。,10,,百兽宗,
34,蛮荒镇骨体,,上品,以厚土淬锻筋骨,躯壳如山,血勇不挫。,10,,百兽宗,
35,血啸狩魂诀,,上品,以嗜血啸魄摄魂,狩猎杀伐,越战越猛。,10,,百兽宗,{"extra_breakthrough_success_rate": -0.1, "extra_cultivate_exp": 50}
36,彻天水镜观,,上品,以彻天水镜观机,借势化力,先机在握。,10,,水镜宗,
37,寒漪反斩法,,上品,以寒漪回折之势,四两拨千斤,刚柔相济。,10,,水镜宗,
38,镜花游身步,,上品,以轻风流转为引,身化水月,进退自如。,10,,水镜宗,
39,幽冥镇狱经,,上品,引幽冥阴煞镇压万灵,寒魄凝骨,万劫不侵。,10,,冥王宗,
40,冥焰噬神法,,上品,以冥焰噬神,逆夺生机,吞灵化魄。,10,,冥王宗,{"extra_breakthrough_success_rate": -0.1, "extra_cultivate_exp": 50}
41,黄泉引魄步,,上品,以玄寒引魄入泉,步步生霜,摄魂夺魄。,10,,冥王宗,
42,赤狱炼锋诀,,上品,以赤狱真火炼锋,法器通灵,杀机更盛。,10,,朱勾宗,
43,魇丝摄魂术,,上品,以魇丝无声摄魄,藏形夺命,来去无迹。,10,,朱勾宗,
44,噬心傀儡经,,上品,以金罡刻阵,傀儡载魄,攻守如一。,10,,朱勾宗,
45,双修合和典,,上品,以清润相济,合气生生,周天圆满。,10,,合欢宗,
46,魅月摄情术,,上品,以魅月摄心,惑而不乱,借情化力。,10,,合欢宗,
47,绮罗化影步,,上品,以轻纱化影,形随意转,柔中带锋。,10,,合欢宗,
48,镇岳定魂经,,上品,以玄黄定岳势,安神定魄,万邪难侵。,10,,镇魂宗,
49,霆狱伏邪法,,上品,引九霄霆威压邪,刚猛无俦,镇压不返。,10,,镇魂宗,
50,金章封煞术,,上品,以金章为印,封煞束灵,斩乱镇邪。,10,,镇魂宗,
51,幽冥无相诀,,上品,隐形无相,出没幽明,摄心夺魄于无声。,10,,幽魂噬影宗,
52,噬影穿行步,,上品,以风掠影,穿行缝隙,先至而不留痕。,10,,幽魂噬影宗,
53,冥狱吞魄经,,上品,循幽冥吞魄之道,化敌为养,速成险绝。,10,,幽魂噬影宗,{"extra_breakthrough_success_rate": -0.1, "extra_cultivate_exp": 50}
54,天罗机巧篇,,上品,精研机巧阵枢,百变应敌,器术合一。,10,,千帆城,
55,蓝星定魂阵,,上品,以厚土定魂为基,阵锁心神,稳如磐石。,10,,千帆城,
56,飞翼乘风术,,上品,乘风而行,纵横千里,御器齐驱。,10,,千帆城,
Can't render this file because it contains an unexpected character in line 2 and column 112.