This commit is contained in:
bridge
2025-11-26 21:56:39 +08:00
parent 3f7bed61fe
commit a1210589b7
10 changed files with 65 additions and 22 deletions

View File

@@ -24,6 +24,7 @@ class Auxiliary:
sect_id: Optional[int]
desc: str
effects: dict[str, object] = field(default_factory=dict)
effect_desc: str = ""
sect: Optional[Sect] = None
# 特殊属性(用于存储实例特定数据)
special_data: dict = field(default_factory=dict)
@@ -34,7 +35,8 @@ class Auxiliary:
def get_detailed_info(self) -> str:
"""获取详细信息"""
return f"{self.name}{self.grade}{self.desc}"
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}{self.grade}{self.desc}{effect_part}"
def get_colored_info(self) -> str:
"""获取带颜色标记的信息,供前端渲染使用"""
@@ -42,13 +44,12 @@ class Auxiliary:
return f"<color:{r},{g},{b}>{self.get_info()}</color>"
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
return {
"name": self.name,
"desc": self.desc,
"grade": self.grade.value,
"color": self.grade.color_rgb,
"effect_desc": format_effects_to_text(self.effects),
"effect_desc": self.effect_desc,
}
@@ -71,7 +72,9 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary], Dic
sect_id = None
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
sect_obj: Optional[Sect] = sects_by_id.get(sect_id) if sect_id is not None else None
# 解析grade
@@ -89,6 +92,7 @@ def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary], Dic
sect_id=sect_id,
desc=get_str(row, "desc"),
effects=effects,
effect_desc=effect_desc,
sect=sect_obj,
)

View File

@@ -375,13 +375,12 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
# 8. 灵根
from src.classes.root import format_root_cn
from src.utils.effect_desc import format_effects_to_text
root_str = format_root_cn(self.root)
info["root"] = root_str
info["root_detail"] = {
"name": root_str,
"desc": f"包含元素:{''.join(str(e) for e in self.root.elements)}",
"effect_desc": format_effects_to_text(self.root.effects)
"effect_desc": self.root.effect_desc
}
# 9. 灵兽

View File

@@ -44,6 +44,7 @@ class CelestialPhenomenon:
name: str
rarity: Rarity
effects: dict[str, object]
effect_desc: str
desc: str
duration_years: int
@@ -58,7 +59,8 @@ class CelestialPhenomenon:
def get_detailed_info(self) -> str:
"""获取详细信息"""
return f"{self.name}{self.desc}"
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}{self.desc}{effect_part}"
def _load_celestial_phenomena() -> dict[int, CelestialPhenomenon]:
@@ -76,12 +78,15 @@ def _load_celestial_phenomena() -> dict[int, CelestialPhenomenon]:
# 解析effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
phenomenon = CelestialPhenomenon(
id=get_int(row, "id"),
name=get_str(row, "name"),
rarity=rarity,
effects=effects,
effect_desc=effect_desc,
desc=get_str(row, "desc"),
duration_years=get_int(row, "duration_years", 5),
)

View File

@@ -49,11 +49,15 @@ async def kill_and_grab(winner: Avatar, loser: Avatar) -> str:
should_loot = True
else:
# 2. 否则让 AI 决策
context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.grade.value}{'兵器' if loot_type == 'weapon' else '辅助装备'}{loot_item.name}』({loot_item.desc})。"
# 构建详细描述,包含效果
item_desc = loot_item.get_detailed_info()
current_desc = winner_current.get_detailed_info()
context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.grade.value}{'兵器' if loot_type == 'weapon' else '辅助装备'}{item_desc}』。"
options = [
{
"key": "A",
"desc": f"夺取{loot_item.grade.value}{loot_item.name}』({loot_item.desc}),替换掉身上的『{winner_current.name}』({winner_current.grade.value}{winner_current.desc})。"
"desc": f"夺取{loot_item.name}』,替换掉身上的『{winner_current.name}』。\n - 新装备:{item_desc}\n - 原装备:{current_desc}"
},
{
"key": "B",

View File

@@ -24,6 +24,7 @@ class Persona:
rarity: Rarity
condition: str
effects: dict[str, object]
effect_desc: str = ""
@property
def weight(self) -> float:
@@ -34,7 +35,9 @@ class Persona:
return self.name
def get_detailed_info(self) -> str:
return f"{self.name}{self.desc}"
desc_part = f"{self.desc}" if self.desc else ""
effect_part = f"\n效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}{desc_part}{effect_part}"
def get_colored_info(self) -> str:
"""获取带颜色标记的信息,供前端渲染使用"""
@@ -42,13 +45,12 @@ class Persona:
return f"<color:{r},{g},{b}>{self.name}</color>"
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
return {
"name": self.name,
"desc": self.desc,
"rarity": self.rarity.level.value,
"color": self.rarity.color_rgb,
"effect_desc": format_effects_to_text(self.effects),
"effect_desc": self.effect_desc,
}
def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
@@ -70,6 +72,8 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
# 解析effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
persona = Persona(
id=get_int(row, "id"),
@@ -79,6 +83,7 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
rarity=rarity,
condition=condition,
effects=effects,
effect_desc=effect_desc,
)
personas_by_id[persona.id] = persona
personas_by_name[persona.name] = persona

View File

@@ -93,6 +93,13 @@ class Root(_RootMixin, Enum):
"""
return dict(_root_effects_by_root.get(self, {}))
@property
def effect_desc(self) -> str:
"""
获取灵根效果的文本描述。
"""
return _root_effect_desc_by_root.get(self, "")
# 元素到灵气类型的一一对应
_essence_by_element = {
@@ -122,6 +129,12 @@ _root_effects_by_root = build_effects_map_from_df(
effects_column="effects",
)
from src.utils.effect_desc import format_effects_to_text
_root_effect_desc_by_root = {
root: format_effects_to_text(effects)
for root, effects in _root_effects_by_root.items()
}
def format_root_cn(root: "Root") -> str:
"""
将 Root 显示为中文短名 + 组成,例如:

View File

@@ -43,6 +43,7 @@ class Sect:
preferred_weapon: str = ""
# 影响角色或系统的效果
effects: dict[str, object] = field(default_factory=dict)
effect_desc: str = ""
# 宗门自定义职位名称可选SectRank -> 名称
rank_names: dict[str, str] = field(default_factory=dict)
@@ -53,7 +54,8 @@ class Sect:
def get_detailed_info(self) -> str:
# 详细描述:风格、阵营、驻地
hq = self.headquarter
return f"{self.name}(阵营:{self.alignment},风格:{self.member_act_style},驻地:{hq.name}"
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}(阵营:{self.alignment},风格:{self.member_act_style},驻地:{hq.name}{effect_part}"
def get_rank_name(self, rank: "SectRank") -> str:
"""
@@ -70,7 +72,6 @@ class Sect:
return self.rank_names.get(rank.value, DEFAULT_RANK_NAMES.get(rank, "弟子"))
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
hq = self.headquarter
return {
"name": self.name,
@@ -79,7 +80,7 @@ class Sect:
"style": self.member_act_style,
"hq_name": hq.name,
"hq_desc": hq.desc,
"effect_desc": format_effects_to_text(self.effects),
"effect_desc": self.effect_desc,
}
def _split_names(value: object) -> list[str]:
@@ -130,6 +131,8 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
# 读取 effects
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
# 读取倾向兵器类型
preferred_weapon = get_str(row, "preferred_weapon")
@@ -158,6 +161,7 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
weight=weight,
preferred_weapon=preferred_weapon,
effects=effects,
effect_desc=effect_desc,
)
sects_by_id[sect.id] = sect
sects_by_name[sect.name] = sect

View File

@@ -66,6 +66,7 @@ class Technique:
sect: Optional[str] = None
# 影响角色或系统的效果
effects: dict[str, object] = field(default_factory=dict)
effect_desc: str = ""
def is_allowed_for(self, avatar) -> bool:
if not self.condition:
@@ -76,7 +77,8 @@ class Technique:
return f"{self.name}{self.attribute}{self.grade.value}"
def get_detailed_info(self) -> str:
return f"{self.name}{self.attribute}{self.grade.value} {self.desc}"
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}{self.attribute}{self.grade.value} {self.desc}{effect_part}"
def get_colored_info(self) -> str:
"""获取带颜色标记的信息,供前端渲染使用"""
@@ -84,14 +86,13 @@ class Technique:
return f"<color:{r},{g},{b}>{self.name}{self.attribute}·{self.grade.value}</color>"
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
return {
"name": self.name,
"desc": self.desc,
"grade": self.grade.value,
"color": self.grade.color_rgb,
"attribute": self.attribute.value,
"effect_desc": format_effects_to_text(self.effects),
"effect_desc": self.effect_desc,
}
# 五行与扩展属性的克制关系
@@ -127,6 +128,8 @@ def loads() -> tuple[dict[int, Technique], dict[str, Technique]]:
sect = None
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
t = Technique(
id=get_int(row, "id"),
@@ -138,6 +141,7 @@ def loads() -> tuple[dict[int, Technique], dict[str, Technique]]:
condition=condition,
sect=sect,
effects=effects,
effect_desc=effect_desc,
)
techniques_by_id[t.id] = t
techniques_by_name[t.name] = t

View File

@@ -27,6 +27,7 @@ class Weapon:
sect_id: Optional[int]
desc: str
effects: dict[str, object] = field(default_factory=dict)
effect_desc: str = ""
sect: Optional[Sect] = None
# 特殊属性(如万魂幡的吞噬魂魄计数)
special_data: dict = field(default_factory=dict)
@@ -44,7 +45,9 @@ class Weapon:
souls = ""
if self.name == "万魂幡" and self.special_data.get("devoured_souls", 0) > 0:
souls = f" 吞噬魂魄:{self.special_data['devoured_souls']}"
return f"{self.name}{self.weapon_type}·{self.grade}{self.desc}{souls}"
effect_part = f" 效果:{self.effect_desc}" if self.effect_desc else ""
return f"{self.name}{self.weapon_type}·{self.grade}{self.desc}{souls}{effect_part}"
def get_colored_info(self) -> str:
"""获取带颜色标记的信息,供前端渲染使用"""
@@ -52,7 +55,6 @@ class Weapon:
return f"<color:{r},{g},{b}>{self.get_info()}</color>"
def get_structured_info(self) -> dict:
from src.utils.effect_desc import format_effects_to_text
# 基础描述
full_desc = self.desc
@@ -70,7 +72,7 @@ class Weapon:
"grade": self.grade.value,
"color": self.grade.color_rgb,
"type": self.weapon_type.value,
"effect_desc": format_effects_to_text(self.effects),
"effect_desc": self.effect_desc,
}
@@ -93,6 +95,8 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Wea
sect_id = None
effects = load_effect_from_str(get_str(row, "effects"))
from src.utils.effect_desc import format_effects_to_text
effect_desc = format_effects_to_text(effects)
sect_obj: Optional[Sect] = sects_by_id.get(sect_id) if sect_id is not None else None
@@ -125,6 +129,7 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Wea
sect_id=sect_id,
desc=get_str(row, "desc"),
effects=effects,
effect_desc=effect_desc,
sect=sect_obj,
)

View File

@@ -12,7 +12,7 @@
AvatarName: {{
"avatar_thinking": ... // 从角色角度,以第一人称视角,简单清晰的描述想法
"short_term_objective": ..., // 角色接下来一段时间的短期目标
"action_name_params_pairs": list[Tuple[action_name, action_params]] // 一次性决定未来的3~8个动作,按顺序执行
"action_name_params_pairs": list[Tuple[action_name, action_params]] // 一次性决定未来的5~10个动作,按顺序执行
}}
}}