From a7e2de6783216dff1b674aadf943b671729b8d75 Mon Sep 17 00:00:00 2001 From: bridge Date: Wed, 8 Oct 2025 21:31:24 +0800 Subject: [PATCH] add sect --- src/classes/alignment.py | 15 ++++++++ src/classes/sect.py | 68 ++++++++++++++++++++++++++++++++++++ static/game_configs/sect.csv | 11 ++++++ static/templates/story.txt | 2 +- static/templates/talk.txt | 2 +- 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/classes/sect.py create mode 100644 static/game_configs/sect.csv diff --git a/src/classes/alignment.py b/src/classes/alignment.py index 1b2001a..0c80549 100644 --- a/src/classes/alignment.py +++ b/src/classes/alignment.py @@ -31,6 +31,21 @@ class Alignment(Enum): return other == self.value or other == str(self) return False + @staticmethod + def from_str(text: str) -> "Alignment": + """ + 将字符串解析为 Alignment,支持中文与英文别名。 + 未识别时返回中立。 + """ + t = str(text).strip().lower() + if t in {"正", "righteous", "right"}: + return Alignment.RIGHTEOUS + if t in {"中", "neutral", "middle", "center"}: + return Alignment.NEUTRAL + if t in {"邪", "evil"}: + return Alignment.EVIL + return Alignment.NEUTRAL + alignment_strs = { Alignment.RIGHTEOUS: "正", diff --git a/src/classes/sect.py b/src/classes/sect.py new file mode 100644 index 0000000..444ecec --- /dev/null +++ b/src/classes/sect.py @@ -0,0 +1,68 @@ +from dataclasses import dataclass +from pathlib import Path + +from src.classes.alignment import Alignment +from src.utils.df import game_configs +from src.utils.config import CONFIG + + +# 宗门驻地 +@dataclass +class SectHeadQuarter: + """ + 宗门总部 + """ + name: str + image: Path + +@dataclass +class Sect: + """ + 宗门 + """ + id: int + name: str + desc: str + member_act_style: str + alignment: Alignment + sect_surnames: list[str] + sect_given_names: list[str] + headquarter: SectHeadQuarter + # 功法:在technique.csv中配置 + # TODO:法宝 + # TODO:宗内等级和称谓 +def _split_names(value: object) -> list[str]: + raw = "" if value is None or str(value) == "nan" else str(value) + sep = CONFIG.df.ids_separator + parts = [x.strip() for x in raw.split(sep) if x.strip()] if raw else [] + return parts + + +def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]: + """从配表加载 sect 数据""" + sects_by_id: dict[int, Sect] = {} + sects_by_name: dict[str, Sect] = {} + + df = game_configs["sect"] + assets_base = Path("assets/sects") + for _, row in df.iterrows(): + image_path = assets_base / f"{row['name']}.png" + + sect = Sect( + id=int(row["id"]), + name=str(row["name"]), + desc=str(row["desc"]), + member_act_style=str(row["member_act_style"]), + alignment=Alignment.from_str(row.get("alignment", "中")), + sect_surnames=_split_names(row.get("sect_surnames", "")), + sect_given_names=_split_names(row.get("sect_given_names", "")), + headquarter=SectHeadQuarter(name=str(row["name"]), image=image_path), + ) + sects_by_id[sect.id] = sect + sects_by_name[sect.name] = sect + + return sects_by_id, sects_by_name + + +# 导出:从配表加载 sect 数据 +sects_by_id, sects_by_name = _load_sects() \ No newline at end of file diff --git a/static/game_configs/sect.csv b/static/game_configs/sect.csv new file mode 100644 index 0000000..9418823 --- /dev/null +++ b/static/game_configs/sect.csv @@ -0,0 +1,11 @@ +id,name,desc,member_act_style,alignment,sect_surnames,sect_given_names +,,宗门名称与描述,宗门成员行事风格,阵营(正/中/邪),宗门常用姓氏(分号分隔),宗门常用名(分号分隔) +1,明心剑宗,以剑证道,清明克己,行止如一。重剑与心法并重,讲究明心见性。,正,明;心;剑;云;白;飞;清;凌;顾;林,清风;明远;问心;凌霄;止水;无尘;素心;明照;心远;雪凝 +2,百兽宗,崇尚血脉与搏杀,习驭兽与变身之术,体魄强横。,你是百兽宗弟子。你言语直接,重视力量与血性,崇尚狩猎与搏斗。,,百;熊;虎;狼;猿;牛;白;石;嵩;岳,虎魄;狼行;熊罡;白猿;石坚;山岚;青鬃;玄爪;金瞳;赤鬃 +3,水镜宗,以水化镜,以镜照心,术法多幻与反制,攻守如流。,你是水镜宗弟子。你处事冷静圆融,喜以柔克刚,擅借力与反制。,中,水;镜;寒;霜;冰;清;沐;阮;顾;白,映月;照心;寒影;秋水;轻漪;雪落;如镜;寒江;青荷;凝霜 +4,冥王宗,行走幽冥之道,以冥焰镇压亡魂,术法阴冷狠厉。,你是冥王宗弟子。你言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,邪,冥;王;玄;幽;夜;白;江;冷;燕;楚,冥焰;噬魂;夜阙;幽垣;玄骨;寒魄;冥狱;魇息;影灭;夜行 +5,朱勾宗,以血炼骨,勾魂摄魄,擅用血煞与禁术,代价与力量并存。,你是朱勾宗弟子。你直面欲望与代价,不惧黑暗,以攻伐见长。,邪,朱;勾;血;狱;秦;韩;燕;赵;魏;楚,血手;勾魂;朱砂;赤狱;凝血;摄魄;夺心;吞灵;渊渟;夜烬 +6,合欢宗,以情入道,双修与魅术并重,善驭人心,长于权变。,你是合欢宗弟子。你辞令婉转,善于拿捏人欲与局势,以柔制刚。,中,合;欢;苏;陆;柳;花;月;楚;顾;白,婉心;轻柔;疏影;流烟;如梦;绮念;月华;惜香;慕雪;倾城 +7,镇魂宗,以镇魂钟摄百魂,擅安魂、封邪、渡厄,兼有刚烈镇压之术。,你是镇魂宗弟子。你肃穆沉稳,重安魂镇邪,少言而果决。,正,镇;魂;钟;青;凌;白;楚;顾;林;云,镇灵;定魄;钟离;安魂;肃霜;白岭;清钟;涤秽;正鸣;宁川 +8,幽魂噬影宗,影遁噬魂,袭取魄光于无形,偏好奇袭与暗杀之道。,你是幽魂噬影宗弟子。你行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,邪,幽;魂;噬;影;夜;冷;白;江;玄;楚,噬影;隐魄;夜藏;无相;玄影;摄魂;遁形;寒星;绝响;空痕 +9,千帆城,商旅云集的修真大城,亦有自成体系的城主与护城修士。,你是千帆城修士。你务实精明,重交易与信誉,崇尚规则与秩序。,中,商;楚;顾;白;苏;林;叶;秦;赵;魏,商行;持衡;清评;问价;立契;通衡;问道;理市;衡准;守约 diff --git a/static/templates/story.txt b/static/templates/story.txt index 62e0c1a..517a50b 100644 --- a/static/templates/story.txt +++ b/static/templates/story.txt @@ -9,5 +9,5 @@ 注意,只返回json格式的结果,格式为: {{ - "story": "", // 第三人称的故事描述 + "story": "", // 第三人称的故事描述,仙侠语言风格 }} \ No newline at end of file diff --git a/static/templates/talk.txt b/static/templates/talk.txt index 09e8ad5..7ba631a 100644 --- a/static/templates/talk.txt +++ b/static/templates/talk.txt @@ -14,7 +14,7 @@ {avatar_name_2}: {{ "thinking": ..., // 简单思考应该怎么决策 "feedback": ... // 面对{avatar_name_1}的行为的合法feedback action name - "talk_content": ... // 第三人称视角的,对话的主题和情况概括,约100字。注意不是对话的口语内容。 + "talk_content": ... // 第三人称视角的,对话的主题和情况概括,约100字。注意不是对话的口语内容,仙侠语言风格。 "into_relation": ... // 如果你认为可以让两者产生某种身份关系,则返回。注意这是{avatar_name_2}相对于{avatar_name_1}的身份。 }} }} \ No newline at end of file