refactor sect in vue
This commit is contained in:
@@ -120,6 +120,23 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
|
||||
_action_cd_last_months: dict[str, int] = field(default_factory=dict)
|
||||
# 不缓存 effects;实时从宗门与功法合并
|
||||
|
||||
def join_sect(self, sect: Sect, rank: "SectRank") -> None:
|
||||
"""加入宗门"""
|
||||
if self.sect:
|
||||
self.leave_sect()
|
||||
self.sect = sect
|
||||
self.sect_rank = rank
|
||||
sect.add_member(self)
|
||||
# 更新阵营倾向为宗门阵营(如果之前是中立或不同)- 可选,视设计而定
|
||||
# 这里暂不强制修改个人阵营,除非完全不兼容
|
||||
|
||||
def leave_sect(self) -> None:
|
||||
"""退出宗门"""
|
||||
if self.sect:
|
||||
self.sect.remove_member(self)
|
||||
self.sect = None
|
||||
self.sect_rank = None
|
||||
|
||||
def __post_init__(self):
|
||||
"""
|
||||
在Avatar创建后自动初始化tile和HP
|
||||
@@ -142,6 +159,10 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
|
||||
if self.technique is None:
|
||||
self.technique = get_technique_by_sect(self.sect)
|
||||
|
||||
# 确保宗门引用同步
|
||||
if self.sect:
|
||||
self.sect.add_member(self)
|
||||
|
||||
# 若未设定阵营,则依据宗门/无门无派规则设置,避免后续为 None
|
||||
if self.alignment is None:
|
||||
if self.sect is not None:
|
||||
@@ -772,6 +793,16 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
|
||||
rank_name = get_rank_display_name(self.sect_rank, self.sect)
|
||||
return f"{self.sect.name}{rank_name}"
|
||||
|
||||
def get_sect_rank_name(self) -> str:
|
||||
"""
|
||||
获取宗门职位的显示名称
|
||||
"""
|
||||
if self.sect is None or self.sect_rank is None:
|
||||
return "散修"
|
||||
|
||||
from src.classes.sect_ranks import get_rank_display_name
|
||||
return get_rank_display_name(self.sect_rank, self.sect)
|
||||
|
||||
def set_relation(self, other: "Avatar", relation: Relation) -> None:
|
||||
"""
|
||||
设置与另一个角色的关系。
|
||||
|
||||
@@ -358,7 +358,7 @@ class CultivateRegion(Region):
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "修炼区域"
|
||||
info["essence"] = {
|
||||
"type": self.essence_type.value,
|
||||
"type": str(self.essence_type), # EssenceType.__str__ 已经返回中文名
|
||||
"density": self.essence_density
|
||||
}
|
||||
return info
|
||||
|
||||
@@ -7,6 +7,11 @@ from src.utils.df import game_configs, get_str, get_float, get_int
|
||||
from src.classes.effect import load_effect_from_str
|
||||
from src.utils.config import CONFIG
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
if TYPE_CHECKING:
|
||||
from src.classes.avatar import Avatar
|
||||
from src.classes.technique import Technique
|
||||
from src.classes.sect_ranks import SectRank
|
||||
|
||||
"""
|
||||
宗门、宗门总部基础数据。
|
||||
@@ -46,6 +51,25 @@ class Sect:
|
||||
effect_desc: str = ""
|
||||
# 宗门自定义职位名称(可选):SectRank -> 名称
|
||||
rank_names: dict[str, str] = field(default_factory=dict)
|
||||
|
||||
# 运行时成员列表:Avatar ID -> Avatar
|
||||
members: dict[str, "Avatar"] = field(default_factory=dict, init=False)
|
||||
# 功法对象列表:Technique
|
||||
techniques: list["Technique"] = field(default_factory=list, init=False)
|
||||
|
||||
def __post_init__(self):
|
||||
self.members = {}
|
||||
self.techniques = []
|
||||
|
||||
def add_member(self, avatar: "Avatar") -> None:
|
||||
"""添加成员到宗门"""
|
||||
if avatar.id not in self.members:
|
||||
self.members[avatar.id] = avatar
|
||||
|
||||
def remove_member(self, avatar: "Avatar") -> None:
|
||||
"""从宗门移除成员"""
|
||||
if avatar.id in self.members:
|
||||
del self.members[avatar.id]
|
||||
|
||||
def get_info(self) -> str:
|
||||
hq = self.headquarter
|
||||
@@ -73,14 +97,66 @@ class Sect:
|
||||
|
||||
def get_structured_info(self) -> dict:
|
||||
hq = self.headquarter
|
||||
|
||||
from src.classes.sect_ranks import RANK_ORDER
|
||||
from src.server.main import resolve_avatar_pic_id
|
||||
from src.classes.technique import techniques_by_name
|
||||
|
||||
# 成员列表:直接从 self.members 获取
|
||||
members_list = []
|
||||
for a in self.members.values():
|
||||
rank_enum = getattr(a, "sect_rank", None)
|
||||
sort_val = 999
|
||||
if rank_enum and rank_enum in RANK_ORDER:
|
||||
sort_val = RANK_ORDER[rank_enum]
|
||||
|
||||
members_list.append({
|
||||
"id": str(a.id),
|
||||
"name": a.name,
|
||||
"pic_id": resolve_avatar_pic_id(a),
|
||||
"gender": a.gender.value if hasattr(a.gender, "value") else "male",
|
||||
"rank": a.get_sect_rank_name(),
|
||||
"realm": a.cultivation_progress.realm.value if hasattr(a, 'cultivation_progress') else "未知",
|
||||
"_sort_val": sort_val
|
||||
})
|
||||
# 按职位排序
|
||||
members_list.sort(key=lambda x: x["_sort_val"])
|
||||
# 清理排序字段
|
||||
for m in members_list:
|
||||
del m["_sort_val"]
|
||||
|
||||
# 填充 techniques
|
||||
# 使用 technique_names 从全局字典中查找对应的 Technique 对象并序列化
|
||||
techniques_data = []
|
||||
for t_name in self.technique_names:
|
||||
t_obj = techniques_by_name.get(t_name)
|
||||
if t_obj:
|
||||
techniques_data.append(t_obj.get_structured_info())
|
||||
else:
|
||||
# Fallback for missing techniques: create a minimal structure
|
||||
techniques_data.append({
|
||||
"name": t_name,
|
||||
"desc": "(未知功法)",
|
||||
"grade": "",
|
||||
"color": (200, 200, 200), # Gray
|
||||
"attribute": "",
|
||||
"effect_desc": ""
|
||||
})
|
||||
|
||||
return {
|
||||
"id": self.id,
|
||||
"name": self.name,
|
||||
"desc": self.desc,
|
||||
"alignment": self.alignment.value,
|
||||
"alignment": str(self.alignment), # 直接返回中文
|
||||
"style": self.member_act_style,
|
||||
"hq_name": hq.name,
|
||||
"hq_desc": hq.desc,
|
||||
"effect_desc": self.effect_desc,
|
||||
"techniques": techniques_data,
|
||||
# 兼容旧字段,如果前端还要用的话(建议迁移后废弃)
|
||||
"technique_names": self.technique_names,
|
||||
"preferred_weapon": self.preferred_weapon,
|
||||
"members": members_list
|
||||
}
|
||||
|
||||
def _split_names(value: object) -> list[str]:
|
||||
|
||||
@@ -11,6 +11,7 @@ class SectRegion(Region):
|
||||
无额外操作或属性。
|
||||
"""
|
||||
sect_name: str
|
||||
sect_id: int = -1
|
||||
image_path: str | None = None
|
||||
|
||||
def get_region_type(self) -> str:
|
||||
@@ -28,4 +29,5 @@ class SectRegion(Region):
|
||||
info = super().get_structured_info()
|
||||
info["type_name"] = "宗门驻地"
|
||||
info["sect_name"] = self.sect_name
|
||||
info["sect_id"] = self.sect_id
|
||||
return info
|
||||
|
||||
Reference in New Issue
Block a user