update get info
This commit is contained in:
@@ -14,7 +14,12 @@ class Alignment(Enum):
|
||||
return alignment_strs.get(self, self.value)
|
||||
|
||||
def get_info(self) -> str:
|
||||
return alignment_strs[self] + ": " + alignment_infos[self]
|
||||
# 简版:仅返回短中文
|
||||
return alignment_strs[self]
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
# 详细版:短中文 + 详细描述 + 关键词提示
|
||||
return f"{alignment_strs[self]}:{alignment_infos[self]}"
|
||||
|
||||
def __hash__(self) -> int:
|
||||
return hash(self.value)
|
||||
@@ -58,4 +63,3 @@ alignment_infos = {
|
||||
Alignment.NEUTRAL: "中立阵营的理念是:顺势而为,趋利避害,重视自度与平衡,不轻易站队。",
|
||||
Alignment.EVIL: "邪恶阵营的理念是:弱肉强食,以自身利益为先,蔑视规则,推崇权力与恐惧。",
|
||||
}
|
||||
|
||||
|
||||
@@ -120,16 +120,53 @@ class Avatar:
|
||||
def __hash__(self) -> int:
|
||||
return hash(self.id)
|
||||
|
||||
def get_info(self) -> str:
|
||||
def get_info(self, detailed: bool = False) -> str:
|
||||
"""
|
||||
获取avatar的详细信息
|
||||
尽量多打一些,因为会用来给LLM进行决策
|
||||
获取avatar的信息,分详细和不详细两种。
|
||||
"""
|
||||
personas_str = ", ".join([persona.name for persona in self.personas])
|
||||
technique_str = self.technique.get_info()
|
||||
sect_str = self.get_sect_str()
|
||||
region_name = self.tile.region.name if self.tile.region is not None else "无"
|
||||
return f"Avatar(id={self.id}, 性别={self.gender}, 年龄={self.age}, name={self.name}, 宗门={sect_str}, 阵营={self.alignment.get_info()}, 区域={region_name}, 灵根={str(self.root)}, 功法={technique_str}, 境界={self.cultivation_progress}, HP={self.hp}, MP={self.mp}, 个性={personas_str})"
|
||||
region_info = "无"
|
||||
region = self.tile.region if self.tile is not None else None
|
||||
relations_info = self._get_relations_summary_str()
|
||||
magic_stone_info = str(self.magic_stone)
|
||||
|
||||
info = "Avatar:\n"
|
||||
info += f"id={self.id}\n"
|
||||
info += f"name={self.name}\n"
|
||||
info += f"gender={self.gender}\n"
|
||||
info += f"age={self.age}\n"
|
||||
info += f"hp={self.hp}\n"
|
||||
info += f"mp={self.mp}\n"
|
||||
info += f"magic_stone={magic_stone_info}\n"
|
||||
info += f"relations={relations_info}\n"
|
||||
|
||||
# 接下来开始有区分了
|
||||
if detailed:
|
||||
sect_info = self.sect.get_detailed_info() if self.sect is not None else "散修"
|
||||
alignment_info = self.alignment.get_detailed_info() if self.alignment is not None else "未知"
|
||||
region_info = region.get_detailed_info() if region is not None else "无"
|
||||
root_info = self.root.get_detailed_info()
|
||||
technique_info = self.technique.get_detailed_info() if self.technique is not None else "无"
|
||||
cultivation_info = self.cultivation_progress.get_detailed_info()
|
||||
personas_info = ", ".join([p.get_detailed_info() for p in self.personas]) if self.personas else "无"
|
||||
items_info = ",".join([f"{item.get_detailed_info()}x{quantity}" for item, quantity in self.items.items()]) if self.items else "无"
|
||||
else:
|
||||
sect_info = self.sect.get_info() if self.sect is not None else "散修"
|
||||
region_info = region.get_info() if region is not None else "无"
|
||||
alignment_info = self.alignment.get_info()
|
||||
root_info = self.root.get_info()
|
||||
technique_info = self.technique.get_info()
|
||||
cultivation_info = self.cultivation_progress.get_info()
|
||||
personas_info = ", ".join([p.get_info() for p in self.personas]) if self.personas else "无"
|
||||
items_info = ",".join([f"{item.get_info()}x{quantity}" for item, quantity in self.items.items()]) if self.items else "无"
|
||||
info += f"sect={sect_info}\n"
|
||||
info += f"alignment={alignment_info}\n"
|
||||
info += f"region={region_info}\n"
|
||||
info += f"root={root_info}\n"
|
||||
info += f"technique={technique_info}\n"
|
||||
info += f"cultivation={cultivation_info}\n"
|
||||
info += f"personas={personas_info}\n"
|
||||
info += f"items={items_info}\n"
|
||||
return info
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.get_info()
|
||||
@@ -388,24 +425,9 @@ class Avatar:
|
||||
"""
|
||||
获取角色提示词信息
|
||||
"""
|
||||
info = self.get_info()
|
||||
info = self.get_info(detailed=False)
|
||||
action_space = self.get_action_space_str()
|
||||
|
||||
# 构建personas的提示词信息
|
||||
personas_prompts = []
|
||||
for i, persona in enumerate(self.personas, 1):
|
||||
personas_prompts.append(f"个性{i}:{persona.prompt}")
|
||||
personas_info = "\n".join(personas_prompts)
|
||||
|
||||
# 添加灵石信息
|
||||
magic_stone_info = f"灵石持有情况:{str(self.magic_stone)}"
|
||||
|
||||
# 添加物品信息
|
||||
if self.items:
|
||||
items_info = "物品持有情况:" + ",".join([f"{item.name}x{quantity}" for item, quantity in self.items.items()])
|
||||
else:
|
||||
items_info = "物品持有情况:无"
|
||||
|
||||
# 观测范围内角色(沿用参数名保持兼容)
|
||||
co_region_info = ""
|
||||
if co_region_avatars:
|
||||
@@ -414,16 +436,6 @@ class Avatar:
|
||||
entries.append(f"{other.name}(境界:{other.cultivation_progress.get_simple_info()})")
|
||||
co_region_info = "\n观测范围内角色:" + (",".join(entries) if entries else "无")
|
||||
|
||||
# 关系摘要
|
||||
relations_summary = self._get_relations_summary_str()
|
||||
|
||||
# 宗门信息
|
||||
sect_name = self.get_sect_str()
|
||||
if self.sect is not None:
|
||||
sect_info = f"{sect_name},风格:{self.sect.member_act_style},驻地:{self.sect.headquarter.name}"
|
||||
else: # 散修
|
||||
sect_info = sect_name
|
||||
|
||||
# 历史事件摘要
|
||||
if self.history_events:
|
||||
history_lines = ";".join([str(e) for e in self.history_events[-8:]])
|
||||
@@ -431,7 +443,7 @@ class Avatar:
|
||||
else:
|
||||
history_info = "历史事件:无"
|
||||
|
||||
return f"{info}\n{sect_info}\n{personas_info}\n{magic_stone_info}\n{items_info}\n{history_info}\n关系:{relations_summary}\n{co_region_info}\n该角色的目前合法动作为:{action_space}"
|
||||
return f"{info}\n{history_info}\n{co_region_info}\n该角色的目前合法动作为:{action_space}"
|
||||
|
||||
def get_hover_info(self) -> list[str]:
|
||||
"""
|
||||
|
||||
@@ -106,8 +106,8 @@ class CultivationProgress:
|
||||
can_break_through_str = "可以突破" if can_break_through else "不可以突破"
|
||||
return f"{self.realm.value}{self.stage.value}({self.level}级){can_break_through_str}"
|
||||
|
||||
def get_simple_info(self) -> str:
|
||||
return f"{self.realm.value}{self.stage.value}"
|
||||
def get_detailed_info(self) -> str:
|
||||
return self.get_info()
|
||||
|
||||
def get_exp_required(self) -> int:
|
||||
"""
|
||||
|
||||
@@ -19,6 +19,12 @@ class Item:
|
||||
def __str__(self) -> str:
|
||||
return self.name
|
||||
|
||||
def get_info(self) -> str:
|
||||
return f"{self.name} -({self.realm.value})"
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name} - {self.desc}({self.realm.value})"
|
||||
|
||||
def _load_items() -> tuple[dict[int, Item], dict[str, Item]]:
|
||||
"""从配表加载item数据"""
|
||||
items_by_id: dict[int, Item] = {}
|
||||
|
||||
@@ -21,6 +21,12 @@ class MagicStone(int):
|
||||
_upper, _middle, _value = self.exchange()
|
||||
return f"上品灵石:{_upper},中品灵石:{_middle},下品灵石:{_value}"
|
||||
|
||||
def get_info(self) -> str:
|
||||
return str(self)
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return str(self)
|
||||
|
||||
def __add__(self, other: Union['MagicStone', int]) -> 'MagicStone':
|
||||
if isinstance(other, int):
|
||||
return MagicStone(self.value + other)
|
||||
|
||||
@@ -36,10 +36,10 @@ class Conversation(MutualAction):
|
||||
def _build_prompt_infos(self, target_avatar: "Avatar", *, can_into_relation: bool) -> dict:
|
||||
avatar_name_1 = self.avatar.name
|
||||
avatar_name_2 = target_avatar.name
|
||||
# 目标的 get_prompt_info 已含 personas、关系等,信息更充分
|
||||
# 交谈:使用详细信息,便于生成更丰富对话
|
||||
avatar_infos = {
|
||||
avatar_name_1: self.avatar.get_prompt_info([]),
|
||||
avatar_name_2: target_avatar.get_prompt_info([]),
|
||||
avatar_name_1: self.avatar.get_info(detailed=True),
|
||||
avatar_name_2: target_avatar.get_info(detailed=True),
|
||||
}
|
||||
# 可能的后天关系(转中文名,给模板阅读)
|
||||
possible_relations = [relation_display_names[r] for r in get_possible_post_relations(self.avatar, target_avatar)]
|
||||
|
||||
@@ -42,8 +42,8 @@ class MutualAction(DefineAction, LLMAction, TargetingMixin):
|
||||
avatar_name_2 = target_avatar.name
|
||||
# avatar infos 仅放入与两人相关的提示,避免超长
|
||||
avatar_infos = {
|
||||
avatar_name_1: self.avatar.cultivation_progress.get_simple_info(),
|
||||
avatar_name_2: target_avatar.get_prompt_info([]),
|
||||
avatar_name_1: self.avatar.get_info(detailed=False),
|
||||
avatar_name_2: target_avatar.get_info(detailed=False),
|
||||
}
|
||||
feedback_actions = self.FEEDBACK_ACTIONS
|
||||
comment = self.COMMENT
|
||||
|
||||
@@ -23,6 +23,12 @@ class Persona:
|
||||
weight: float
|
||||
condition: str
|
||||
|
||||
def get_info(self) -> str:
|
||||
return self.name
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name}({self.prompt})"
|
||||
|
||||
def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
|
||||
"""从配表加载persona数据"""
|
||||
personas_by_id: dict[int, Persona] = {}
|
||||
|
||||
@@ -168,6 +168,14 @@ class Region(ABC):
|
||||
f"描述: {self.desc}",
|
||||
]
|
||||
|
||||
def get_info(self) -> str:
|
||||
# 简版:仅返回名称
|
||||
return self.name
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
# 基类暂无更多结构化信息,详细版返回名称+描述
|
||||
return f"{self.name} - {self.desc}"
|
||||
|
||||
|
||||
class Shape(Enum):
|
||||
"""
|
||||
@@ -245,6 +253,15 @@ class NormalRegion(Region):
|
||||
species_info = self.get_species_info()
|
||||
return f"普通区域:{self.name} - {self.desc} | 物种分布:{species_info}"
|
||||
|
||||
def get_info(self) -> str:
|
||||
return self.name
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
species_info = self.get_species_info()
|
||||
if not species_info or species_info == "暂无特色物种":
|
||||
return f"{self.name} - {self.desc}"
|
||||
return f"{self.name} - {self.desc} | 物种分布:{species_info}"
|
||||
|
||||
def get_hover_info(self) -> list[str]:
|
||||
lines = super().get_hover_info()
|
||||
species_info = self.get_species_info()
|
||||
@@ -291,6 +308,12 @@ class CultivateRegion(Region):
|
||||
def __str__(self) -> str:
|
||||
return f"修炼区域:{self.name}({self.essence_type}行灵气:{self.essence_density})- {self.desc}"
|
||||
|
||||
def get_info(self) -> str:
|
||||
return self.name
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name}({self.essence_type}行灵气:{self.essence_density})- {self.desc}"
|
||||
|
||||
def get_hover_info(self) -> list[str]:
|
||||
lines = super().get_hover_info()
|
||||
stars = "★" * self.essence_density + "☆" * (10 - self.essence_density)
|
||||
@@ -314,6 +337,12 @@ class CityRegion(Region):
|
||||
# 城市区域暂时仅展示基础信息
|
||||
return super().get_hover_info()
|
||||
|
||||
def get_info(self) -> str:
|
||||
return self.name
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name} - {self.desc}"
|
||||
|
||||
|
||||
T = TypeVar('T', NormalRegion, CultivateRegion, CityRegion)
|
||||
|
||||
|
||||
@@ -78,6 +78,12 @@ class Root(_RootMixin, Enum):
|
||||
),
|
||||
)
|
||||
|
||||
def get_info(self) -> str:
|
||||
return format_root_cn(self)
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
return self.get_info()
|
||||
|
||||
|
||||
# 元素到灵气类型的一一对应
|
||||
_essence_by_element = {
|
||||
|
||||
@@ -41,6 +41,15 @@ class Sect:
|
||||
# 功法:在technique.csv中配置
|
||||
# TODO:法宝
|
||||
# TODO:宗内等级和称谓
|
||||
|
||||
def get_info(self) -> str:
|
||||
hq = self.headquarter
|
||||
return f"{self.name}(阵营:{self.alignment},驻地:{hq.name})"
|
||||
|
||||
def get_detailed_info(self) -> str:
|
||||
# 详细描述:风格、阵营、驻地
|
||||
hq = self.headquarter
|
||||
return f"{self.name}(阵营:{self.alignment},风格:{self.member_act_style},驻地:{hq.name})"
|
||||
def _split_names(value: object) -> list[str]:
|
||||
raw = "" if value is None or str(value) == "nan" else str(value)
|
||||
sep = CONFIG.df.ids_separator
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Dict
|
||||
from typing import Dict, TYPE_CHECKING
|
||||
|
||||
from src.utils.config import CONFIG
|
||||
from src.utils.llm import get_prompt_and_call_llm
|
||||
@@ -15,12 +15,12 @@ class StoryTeller:
|
||||
def build_avatar_infos(*avatars: "Avatar") -> Dict[str, str]:
|
||||
"""
|
||||
将若干角色信息组织为 {name: info} 映射,供故事模板使用。
|
||||
优先使用 `get_prompt_info([])`,失败时退化为 `get_info()`。
|
||||
战斗/小故事使用详细信息。
|
||||
"""
|
||||
infos: Dict[str, str] = {}
|
||||
for av in avatars:
|
||||
try:
|
||||
infos[av.name] = av.get_prompt_info([])
|
||||
infos[av.name] = av.get_info(detailed=True)
|
||||
except Exception:
|
||||
infos[av.name] = getattr(av, "name", "未知角色")
|
||||
return infos
|
||||
@@ -51,3 +51,8 @@ class StoryTeller:
|
||||
__all__ = ["StoryTeller"]
|
||||
|
||||
|
||||
|
||||
if TYPE_CHECKING:
|
||||
# 仅用于类型检查,避免循环导入
|
||||
from src.classes.avatar import Avatar
|
||||
|
||||
|
||||
@@ -58,9 +58,13 @@ class Technique:
|
||||
return bool(eval(self.condition, {"__builtins__": {}}, {"avatar": avatar, "Alignment": Alignment}))
|
||||
|
||||
def get_info(self) -> str:
|
||||
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.prompt}"
|
||||
|
||||
|
||||
|
||||
# 五行与扩展属性的克制关系
|
||||
# - 五行:金克木,木克土,土克水,水克火,火克金
|
||||
# - 雷克邪;邪、冰、风、暗不克任何人
|
||||
|
||||
Reference in New Issue
Block a user