update web, add clickable parts
This commit is contained in:
@@ -44,6 +44,16 @@ class Animal:
|
||||
|
||||
return " - ".join(info_parts)
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
items_info = [item.get_structured_info() for item in self.items]
|
||||
return {
|
||||
"name": self.name,
|
||||
"desc": self.desc,
|
||||
"grade": self.realm.value,
|
||||
"drops": items_info,
|
||||
"type": "animal"
|
||||
}
|
||||
|
||||
def _load_animals() -> tuple[dict[int, Animal], dict[str, Animal]]:
|
||||
"""从配表加载animal数据"""
|
||||
animals_by_id: dict[int, Animal] = {}
|
||||
|
||||
@@ -41,6 +41,16 @@ class Auxiliary:
|
||||
r, g, b = self.grade.color_rgb
|
||||
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),
|
||||
}
|
||||
|
||||
|
||||
def _load_auxiliaries() -> tuple[Dict[int, Auxiliary], Dict[str, Auxiliary], Dict[int, Auxiliary]]:
|
||||
"""从配表加载 auxiliary 数据。
|
||||
|
||||
@@ -278,6 +278,119 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
|
||||
info_dict["短期目标"] = self.short_term_objective
|
||||
return info_dict
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
"""
|
||||
获取结构化的角色信息,用于前端展示和交互。
|
||||
"""
|
||||
# 基础信息
|
||||
info = {
|
||||
"id": self.id,
|
||||
"name": self.name,
|
||||
"gender": str(self.gender),
|
||||
"age": self.age.age,
|
||||
"lifespan": self.age.max_lifespan,
|
||||
"realm": self.cultivation_progress.realm.value,
|
||||
"level": self.cultivation_progress.level,
|
||||
"hp": {"cur": self.hp.cur, "max": self.hp.max},
|
||||
"mp": {"cur": self.mp.cur, "max": self.mp.max},
|
||||
"alignment": str(self.alignment) if self.alignment else "未知",
|
||||
"magic_stone": self.magic_stone.value,
|
||||
"thinking": self.thinking,
|
||||
"short_term_objective": self.short_term_objective,
|
||||
"long_term_objective": self.long_term_objective.content if self.long_term_objective else "",
|
||||
"nickname": self.nickname,
|
||||
}
|
||||
|
||||
# 复杂对象结构化
|
||||
|
||||
# 1. 特质 (Personas)
|
||||
info["personas"] = [p.get_structured_info() for p in self.personas]
|
||||
|
||||
# 2. 功法 (Technique)
|
||||
if self.technique:
|
||||
info["technique"] = self.technique.get_structured_info()
|
||||
else:
|
||||
info["technique"] = None
|
||||
|
||||
# 3. 宗门 (Sect)
|
||||
if self.sect:
|
||||
sect_info = self.sect.get_structured_info()
|
||||
# 补充职位信息
|
||||
if self.sect_rank:
|
||||
from src.classes.sect_ranks import get_rank_display_name
|
||||
sect_info["rank"] = get_rank_display_name(self.sect_rank, self.sect)
|
||||
else:
|
||||
sect_info["rank"] = "弟子"
|
||||
info["sect"] = sect_info
|
||||
else:
|
||||
info["sect"] = None
|
||||
|
||||
# 补充:阵营详情
|
||||
from src.classes.alignment import alignment_infos, alignment_strs
|
||||
# 保持 alignment 字段为 string (value) 兼容现有逻辑
|
||||
info["alignment"] = str(self.alignment) if self.alignment else "未知"
|
||||
if self.alignment:
|
||||
cn_name = alignment_strs.get(self.alignment, self.alignment.value)
|
||||
desc = alignment_infos.get(self.alignment, "")
|
||||
info["alignment_detail"] = {
|
||||
"name": cn_name,
|
||||
"desc": desc,
|
||||
}
|
||||
|
||||
# 4. 装备 (Weapon & Auxiliary)
|
||||
if self.weapon:
|
||||
w_info = self.weapon.get_structured_info()
|
||||
w_info["proficiency"] = f"{self.weapon_proficiency:.1f}%"
|
||||
info["weapon"] = w_info
|
||||
else:
|
||||
info["weapon"] = None
|
||||
|
||||
if self.auxiliary:
|
||||
info["auxiliary"] = self.auxiliary.get_structured_info()
|
||||
else:
|
||||
info["auxiliary"] = None
|
||||
|
||||
# 5. 物品 (Items)
|
||||
items_list = []
|
||||
for item, count in self.items.items():
|
||||
i_info = item.get_structured_info()
|
||||
i_info["count"] = count
|
||||
items_list.append(i_info)
|
||||
info["items"] = items_list
|
||||
|
||||
# 6. 关系 (Relations)
|
||||
relations_list = []
|
||||
for other, relation in self.relations.items():
|
||||
relations_list.append({
|
||||
"target_id": other.id,
|
||||
"name": other.name,
|
||||
"relation": str(relation),
|
||||
# 可以加更多 info,比如境界,用于列表中展示
|
||||
"realm": other.cultivation_progress.realm.value,
|
||||
"sect": other.sect.name if other.sect else "散修"
|
||||
})
|
||||
info["relations"] = relations_list
|
||||
|
||||
# 7. 外貌
|
||||
info["appearance"] = self.appearance.get_info()
|
||||
|
||||
# 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)
|
||||
}
|
||||
|
||||
# 9. 灵兽
|
||||
if self.spirit_animal:
|
||||
info["spirit_animal"] = self.spirit_animal.get_structured_info()
|
||||
|
||||
return info
|
||||
|
||||
def __str__(self) -> str:
|
||||
return str(self.get_info(detailed=False))
|
||||
|
||||
|
||||
@@ -25,6 +25,14 @@ class Item:
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name} - {self.desc}({self.realm.value})"
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
return {
|
||||
"name": self.name,
|
||||
"desc": self.desc,
|
||||
"grade": self.realm.value,
|
||||
"effect_desc": "" # 物品暂时没有效果字段
|
||||
}
|
||||
|
||||
def _load_items() -> tuple[dict[int, Item], dict[str, Item]]:
|
||||
"""从配表加载item数据"""
|
||||
items_by_id: dict[int, Item] = {}
|
||||
|
||||
@@ -41,6 +41,16 @@ class Persona:
|
||||
r, g, b = self.rarity.color_rgb
|
||||
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),
|
||||
}
|
||||
|
||||
def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]:
|
||||
"""从配表加载persona数据"""
|
||||
personas_by_id: dict[int, Persona] = {}
|
||||
|
||||
@@ -44,6 +44,16 @@ class Plant:
|
||||
|
||||
return " - ".join(info_parts)
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
items_info = [item.get_structured_info() for item in self.items]
|
||||
return {
|
||||
"name": self.name,
|
||||
"desc": self.desc,
|
||||
"grade": self.realm.value,
|
||||
"drops": items_info,
|
||||
"type": "plant"
|
||||
}
|
||||
|
||||
def _load_plants() -> tuple[dict[int, Plant], dict[str, Plant]]:
|
||||
"""从配表加载plant数据"""
|
||||
plants_by_id: dict[int, Plant] = {}
|
||||
|
||||
@@ -177,6 +177,15 @@ class Region(ABC):
|
||||
# 基类暂无更多结构化信息,详细版返回名称+描述
|
||||
return f"{self.name} - {self.desc}"
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
return {
|
||||
"id": self.id,
|
||||
"name": self.name,
|
||||
"desc": self.desc,
|
||||
"type": self.get_region_type(),
|
||||
"type_name": "区域"
|
||||
}
|
||||
|
||||
|
||||
class Shape(Enum):
|
||||
"""
|
||||
@@ -301,6 +310,13 @@ class NormalRegion(Region):
|
||||
# 如果该区域有植物,则可以采集
|
||||
return len(self.plants) > 0
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "普通区域"
|
||||
info["animals"] = [a.get_structured_info() for a in self.animals]
|
||||
info["plants"] = [p.get_structured_info() for p in self.plants]
|
||||
return info
|
||||
|
||||
|
||||
@dataclass
|
||||
class CultivateRegion(Region):
|
||||
@@ -338,6 +354,15 @@ class CultivateRegion(Region):
|
||||
lines.append(f"主要灵气: {self.essence_type} {stars}")
|
||||
return lines
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "修炼区域"
|
||||
info["essence"] = {
|
||||
"type": self.essence_type.value,
|
||||
"density": self.essence_density
|
||||
}
|
||||
return info
|
||||
|
||||
|
||||
@dataclass
|
||||
class CityRegion(Region):
|
||||
@@ -361,6 +386,11 @@ class CityRegion(Region):
|
||||
def get_detailed_info(self) -> str:
|
||||
return f"{self.name} - {self.desc}"
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "城市区域"
|
||||
return info
|
||||
|
||||
|
||||
def _normalize_region_name(name: str) -> str:
|
||||
"""
|
||||
|
||||
@@ -69,6 +69,19 @@ 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,
|
||||
"desc": self.desc,
|
||||
"alignment": self.alignment.value,
|
||||
"style": self.member_act_style,
|
||||
"hq_name": hq.name,
|
||||
"hq_desc": hq.desc,
|
||||
"effect_desc": format_effects_to_text(self.effects),
|
||||
}
|
||||
|
||||
def _split_names(value: object) -> list[str]:
|
||||
raw = "" if value is None or str(value) == "nan" else str(value)
|
||||
sep = CONFIG.df.ids_separator
|
||||
|
||||
@@ -24,4 +24,8 @@ class SectRegion(Region):
|
||||
f"描述: {self.desc}",
|
||||
]
|
||||
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "宗门驻地"
|
||||
info["sect_name"] = self.sect_name
|
||||
return info
|
||||
|
||||
@@ -39,4 +39,13 @@ class SpiritAnimal:
|
||||
pts = self.get_extra_strength_points()
|
||||
return {"extra_battle_strength_points": pts} if pts else {}
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
from src.utils.effect_desc import format_effects_to_text
|
||||
return {
|
||||
"name": self.name,
|
||||
"desc": f"境界:{self.realm.value}",
|
||||
"grade": self.realm.value,
|
||||
"effect_desc": format_effects_to_text(self.effects),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -83,6 +83,17 @@ class Technique:
|
||||
r, g, b = self.grade.color_rgb
|
||||
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),
|
||||
}
|
||||
|
||||
# 五行与扩展属性的克制关系
|
||||
# - 五行:金克木,木克土,土克水,水克火,火克金
|
||||
# - 雷克邪;邪、冰、风、暗不克任何人
|
||||
|
||||
@@ -51,6 +51,28 @@ class Weapon:
|
||||
r, g, b = self.grade.color_rgb
|
||||
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
|
||||
|
||||
# 特殊数据处理
|
||||
souls = 0
|
||||
if self.name == "万魂幡":
|
||||
souls = self.special_data.get("devoured_souls", 0)
|
||||
if souls > 0:
|
||||
full_desc = f"{full_desc} (已吞噬魂魄:{souls})"
|
||||
|
||||
return {
|
||||
"name": self.name,
|
||||
"desc": full_desc,
|
||||
"grade": self.grade.value,
|
||||
"color": self.grade.color_rgb,
|
||||
"type": self.weapon_type.value,
|
||||
"effect_desc": format_effects_to_text(self.effects),
|
||||
}
|
||||
|
||||
|
||||
def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Weapon]]:
|
||||
"""从配表加载 weapon 数据。
|
||||
|
||||
Reference in New Issue
Block a user