update pack

This commit is contained in:
bridge
2025-11-21 23:58:36 +08:00
parent 870037d811
commit 259d4a3794
19 changed files with 316 additions and 240 deletions

View File

@@ -3,7 +3,7 @@ from pathlib import Path
import json
from src.classes.alignment import Alignment
from src.utils.df import game_configs
from src.utils.df import game_configs, get_str, get_float, get_int
from src.classes.effect import load_effect_from_str
from src.utils.config import CONFIG
@@ -68,6 +68,7 @@ class Sect:
from src.classes.sect_ranks import SectRank, DEFAULT_RANK_NAMES
# 优先使用自定义名称,否则使用默认名称
return self.rank_names.get(rank.value, DEFAULT_RANK_NAMES.get(rank, "弟子"))
def _split_names(value: object) -> list[str]:
raw = "" if value is None or str(value) == "nan" else str(value)
sep = CONFIG.df.ids_separator
@@ -85,56 +86,59 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
sect_region_df = game_configs.get("sect_region")
hq_by_sect_id: dict[int, tuple[str, str]] = {}
if sect_region_df is not None:
for _, sr in sect_region_df.iterrows():
sid_str = str(sr.get("sect_id", "")).strip()
# 跳过说明行或空值
if not sid_str.isdigit():
for sr in sect_region_df:
sid = get_int(sr, "sect_id", -1)
if sid == -1:
continue
sid = int(sid_str)
hq_name = str(sr.get("headquarter_name", "")).strip()
hq_desc = str(sr.get("headquarter_desc", "")).strip()
hq_name = get_str(sr, "headquarter_name")
hq_desc = get_str(sr, "headquarter_desc")
hq_by_sect_id[sid] = (hq_name, hq_desc)
# 可能不存在 technique 配表或未添加 sect 列,做容错
tech_df = game_configs.get("technique")
assets_base = Path("assets/sects")
for _, row in df.iterrows():
image_path = assets_base / f"{row['name']}.png"
for row in df:
name = get_str(row, "name")
image_path = assets_base / f"{name}.png"
# 收集该宗门下配置的功法名称
technique_names: list[str] = []
if tech_df is not None and "sect" in tech_df.columns:
# 检查 tech_df 是否存在以及是否有数据
if tech_df:
# 检查是否存在 sect 字段 (检查第一行或当前行)
technique_names = [
str(tname).strip()
for tname in tech_df.loc[tech_df["sect"] == row["name"], "name"].tolist()
if str(tname).strip()
get_str(t, "name")
for t in tech_df
if get_str(t, "sect") == name and get_str(t, "name")
]
# 读取权重(缺省/NaN 则为 1.0
weight_val = row.get("weight", 1)
weight = float(str(weight_val)) if str(weight_val) != "nan" else 1.0
weight = get_float(row, "weight", 1.0)
# 读取 effects(兼容 JSON/单引号字面量/空)
effects = load_effect_from_str(row.get("effects", ""))
# 读取 effects
effects = load_effect_from_str(get_str(row, "effects"))
# 读取倾向兵器类型
preferred_weapon_val = row.get("preferred_weapon", "")
preferred_weapon = str(preferred_weapon_val).strip() if str(preferred_weapon_val) != "nan" else ""
preferred_weapon = get_str(row, "preferred_weapon")
# 从 sect_region.csv 中优先取驻地名称/描述;否则兼容旧列或退回宗门名
csv_hq = hq_by_sect_id.get(int(row["id"]))
sid = get_int(row, "id")
csv_hq = hq_by_sect_id.get(sid)
hq_name_from_csv = (csv_hq[0] if csv_hq else "").strip() if csv_hq else ""
hq_desc_from_csv = (csv_hq[1] if csv_hq else "").strip() if csv_hq else ""
hq_name = hq_name_from_csv or get_str(row, "headquarter_name") or name
hq_desc = hq_desc_from_csv or get_str(row, "headquarter_desc")
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["alignment"]),
# 驻地:优先 sect_region.csv否则兼容旧列最终回退宗门名
id=sid,
name=name,
desc=get_str(row, "desc"),
member_act_style=get_str(row, "member_act_style"),
alignment=Alignment.from_str(get_str(row, "alignment")),
headquarter=SectHeadQuarter(
name=(hq_name_from_csv or str(row.get("headquarter_name", "")).strip() or str(row["name"])) ,
desc=(hq_desc_from_csv or str(row.get("headquarter_desc", ""))),
name=hq_name,
desc=hq_desc,
image=image_path,
),
technique_names=technique_names,
@@ -189,4 +193,4 @@ def get_sect_info_with_rank(avatar: "Avatar", detailed: bool = False) -> str:
return f"{sect_rank_str}{detail_part}"
# 如果没有括号(理论上不应该出现),直接返回职位字符串
return sect_rank_str
return sect_rank_str