DOF/sqr/User/Object/Map/TownObject.nut

119 lines
4.0 KiB
Plaintext

/*
文件名:TownObject.nut
路径:User/Object/Map/TownObject.nut
创建日期:2024-12-24 14:49
文件用途:城镇对象
*/
if (!getroottable().rawin("GlobalTownManager")) {
GlobalTownManager <- {};
GlobalTownManager.TownList <- {};
//全局当前所在城镇地图
GlobalTownManager.CurrentMap <- null;
}
class Town {
//城镇编号
TownID = 0;
//数据
t_data = null;
//地图管理器
map = null;
//赛丽亚房间编号
SariaRoomID = 0;
//赛利亚房间进入时的坐标
SariaRoomPos = null;
//初始化城镇数据
function InitData(Path) {
Path = "town/" + Path;
t_data = ScriptData.GetFileData(Path, function(DataTable, Data) {
//在这里添加一些初始化的默认值
DataTable.area <- {};
while (!Data.Eof()) {
local str = Data.Get();
//进入城镇时的标题动画
if (str == "[entering title]") {
DataTable.entering_title <- (Data.Get());
}
//进入城镇时的过场标题图像
else if (str == "[cutscene image]") {
DataTable.cutscene_image <- {};
DataTable.cutscene_image.path <- Data.Get().tolower();
DataTable.cutscene_image.idx <- Data.Get();
}
//进入城镇的前置副本
else if (str == "[dungeon what must be cleared]") {
DataTable.dungeon_what_must_be_cleared <- Data.Get();
}
//城镇区域
else if (str == "[area]") {
local DataT = {};
local MapId = Data.Get();
DataT.path <- Data.Get().tolower();
DataT.type <- Data.Get();
//赛利亚房间
if (DataT.type == "[gate]") {
SariaRoomID = MapId;
SariaRoomPos = {
x = Data.Get(),
y = Data.Get(),
z = 0
}
} else if (DataT.type == "[dungeon gate]") {
DataT.dungeon_gate <- Data.Get();
}
DataTable.area[MapId] <- DataT;
}
//城镇名称
else if (str == "[name]") {
DataTable.name <- (Data.Get());
}
//城镇可进入最低等级
else if (str == "[limit level]") {
DataTable.limit_level <- Data.Get();
}
}
}.bindenv(this));
t_data.path <- Path;
t_data.dirpath <- Path.slice(0, Path.lastfind("/") + 1);
}
//构造地图
function InitMap() {
map = {};
foreach(pos, info in t_data.area) {
local MapObj = Map("map/" + info.path);
MapObj.m_town = TownID;
MapObj.m_mapId = pos;
map[pos] <- MapObj;
}
}
//添加角色对象 (注意 这里是第一次上线 或者是使用瞬间移动药剂走的逻辑 因为会默认在赛丽亚房间)
function AddObject(obj, IsPlayer = false) {
//获取当前场景
local Stage = sq_GetCurrentStage();
if (GlobalTownManager.CurrentMap) {
Stage.Removechild(GlobalTownManager.CurrentMap);
}
local SariaRoomMap = map[SariaRoomID];
Stage.Addchild(SariaRoomMap);
//添加全局
GlobalTownManager.CurrentMap = SariaRoomMap.weakref();
SariaRoomMap.AddObject(obj, IsPlayer);
obj.SetPosition(SariaRoomPos);
obj.SetAnimation("RestAni");
}
constructor(Index) {
TownID = Index;
local TownPath = AssetManager.TownList[Index].Path;
//初始化数据
InitData(TownPath);
//构造地图
InitMap();
//加入全局
GlobalTownManager.TownList[Index] <- this;
}
}