From 14317a7b78cb1253f14a26bbdee29b3c0d3c71a7 Mon Sep 17 00:00:00 2001 From: bridge Date: Thu, 16 Oct 2025 02:06:04 +0800 Subject: [PATCH] add more effects --- src/classes/action/breakthrough.py | 5 +- src/classes/action/cultivate.py | 4 ++ src/classes/avatar.py | 8 ++- src/classes/effect.py | 31 +++++++++- src/classes/root.py | 25 +++++--- src/classes/technique.py | 2 - static/game_configs/root.csv | 24 ++++---- static/game_configs/technique.csv | 98 +++++++++++++++--------------- 8 files changed, 122 insertions(+), 75 deletions(-) diff --git a/src/classes/action/breakthrough.py b/src/classes/action/breakthrough.py index 578e46d..39894be 100644 --- a/src/classes/action/breakthrough.py +++ b/src/classes/action/breakthrough.py @@ -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)) diff --git a/src/classes/action/cultivate.py b/src/classes/action/cultivate.py index 4fc40eb..f635948 100644 --- a/src/classes/action/cultivate.py +++ b/src/classes/action/cultivate.py @@ -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: diff --git a/src/classes/avatar.py b/src/classes/avatar.py index ee034ad..6ace542 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -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 diff --git a/src/classes/effect.py b/src/classes/effect.py index 6f946b5..c418c0d 100644 --- a/src/classes/effect.py +++ b/src/classes/effect.py @@ -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 diff --git a/src/classes/root.py b/src/classes/root.py index 684f7be..477d146 100644 --- a/src/classes/root.py +++ b/src/classes/root.py @@ -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 显示为中文短名 + 组成,例如: diff --git a/src/classes/technique.py b/src/classes/technique.py index 43d96f4..e0edfdc 100644 --- a/src/classes/technique.py +++ b/src/classes/technique.py @@ -67,8 +67,6 @@ class Technique: def get_detailed_info(self) -> str: return f"{self.name}({self.attribute}){self.grade.value} {self.desc}" - - # 五行与扩展属性的克制关系 # - 五行:金克木,木克土,土克水,水克火,火克金 # - 雷克邪;邪、冰、风、暗不克任何人 diff --git a/static/game_configs/root.csv b/static/game_configs/root.csv index 41eea85..4e2e9e9 100644 --- a/static/game_configs/root.csv +++ b/static/game_configs/root.csv @@ -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} diff --git a/static/game_configs/technique.csv b/static/game_configs/technique.csv index bd44393..34f3789 100644 --- a/static/game_configs/technique.csv +++ b/static/game_configs/technique.csv @@ -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,,千帆城,