118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			118 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.CurrentTown <- 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.CurrentTown) {
 | |
|             Stage.Removechild(GlobalTownManager.CurrentTown);
 | |
|         }
 | |
|         local SariaRoomMap = map[SariaRoomID];
 | |
|         Stage.Addchild(SariaRoomMap);
 | |
|         //添加全局
 | |
|         GlobalTownManager.CurrentTown = 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;
 | |
|     }
 | |
| } |