update
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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. 灵兽
|
||||
|
||||
@@ -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),
|
||||
)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 显示为中文短名 + 组成,例如:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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个动作,按顺序执行
|
||||
}}
|
||||
}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user