48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
from dataclasses import dataclass, field
|
||
from typing import TYPE_CHECKING, Optional
|
||
|
||
from src.classes.map import Map
|
||
from src.classes.calendar import Year, Month, MonthStamp
|
||
from src.classes.avatar_manager import AvatarManager
|
||
from src.classes.event_manager import EventManager
|
||
|
||
if TYPE_CHECKING:
|
||
from src.classes.avatar import Avatar
|
||
from src.classes.celestial_phenomenon import CelestialPhenomenon
|
||
|
||
|
||
@dataclass
|
||
class World():
|
||
map: Map
|
||
month_stamp: MonthStamp
|
||
avatar_manager: AvatarManager = field(default_factory=AvatarManager)
|
||
# 全局事件管理器
|
||
event_manager: EventManager = field(default_factory=EventManager)
|
||
# 当前天地灵机(世界级buff/debuff)
|
||
current_phenomenon: Optional["CelestialPhenomenon"] = None
|
||
# 天地灵机开始年份(用于计算持续时间)
|
||
phenomenon_start_year: int = 0
|
||
|
||
def get_info(self, detailed: bool = False, avatar: Optional["Avatar"] = None) -> dict:
|
||
"""
|
||
返回世界信息(dict),其中包含地图信息(dict)。
|
||
如果指定了 avatar,将传给 map.get_info 用于过滤区域和计算距离。
|
||
"""
|
||
static_info = self.static_info
|
||
map_info = self.map.get_info(detailed=detailed, avatar=avatar)
|
||
world_info = {**map_info, **static_info}
|
||
|
||
if self.current_phenomenon:
|
||
world_info["天地灵机"] = f"【{self.current_phenomenon.name}】{self.current_phenomenon.desc}"
|
||
|
||
return world_info
|
||
|
||
def get_avatars_in_same_region(self, avatar: "Avatar"):
|
||
return self.avatar_manager.get_avatars_in_same_region(avatar)
|
||
|
||
def get_observable_avatars(self, avatar: "Avatar"):
|
||
return self.avatar_manager.get_observable_avatars(avatar)
|
||
|
||
@property
|
||
def static_info(self) -> dict:
|
||
return {"世界描述": "这是一个修仙世界,修仙的境界有:练气、筑基、金丹、元婴。"} |