update web, add clickable parts

This commit is contained in:
bridge
2025-11-22 15:07:09 +08:00
parent 8ae8b50e70
commit 99e4871a5d
18 changed files with 1085 additions and 13 deletions

View File

@@ -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] = {}

View File

@@ -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 数据。

View File

@@ -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))

View File

@@ -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] = {}

View File

@@ -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] = {}

View File

@@ -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] = {}

View File

@@ -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:
"""

View File

@@ -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

View File

@@ -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

View File

@@ -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),
}

View File

@@ -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),
}
# 五行与扩展属性的克制关系
# - 五行:金克木,木克土,土克水,水克火,火克金
# - 雷克邪;邪、冰、风、暗不克任何人

View File

@@ -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 数据。