| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 文件名:AssetManager.nut | 
					
						
							|  |  |  | 路径:User/Asset/AssetManager.nut | 
					
						
							|  |  |  | 创建日期:2024-11-24	08:44 | 
					
						
							|  |  |  | 文件用途: 资源管理器 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | class _AssetManager_ { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //角色列表 | 
					
						
							|  |  |  |     CharacterList = null; | 
					
						
							|  |  |  |     //角色信息表 | 
					
						
							|  |  |  |     CharacterInfoList = null; | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |     //角色经验表 | 
					
						
							|  |  |  |     CharacterExptable = null; | 
					
						
							|  |  |  |     //技能信息表 | 
					
						
							|  |  |  |     SkillList = null; | 
					
						
							|  |  |  |     //技能树信息表 | 
					
						
							|  |  |  |     SkillTreeList = null; | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     //地图列表 | 
					
						
							|  |  |  |     MapList = null; | 
					
						
							| 
									
										
										
										
											2024-12-25 11:32:34 +08:00
										 |  |  |     //城镇列表 | 
					
						
							|  |  |  |     TownList = null; | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |     //装备列表 | 
					
						
							|  |  |  |     EquipmentList = null; | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |     //消耗品列表 | 
					
						
							|  |  |  |     StackableList = null; | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  |     //NPC列表 | 
					
						
							|  |  |  |     NpcList = null; | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |     //NPC商店列表 | 
					
						
							|  |  |  |     NpcShopList = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //杂项配置信息 | 
					
						
							|  |  |  |     EtcConfig = null; | 
					
						
							|  |  |  |     //属性脚本 | 
					
						
							|  |  |  |     AttributeScript = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function InitTownList() { | 
					
						
							|  |  |  |         TownList = ScriptData.GetFileData("town/town.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 //注册城镇列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, { | 
					
						
							|  |  |  |                     Path = Data.Get(), | 
					
						
							|  |  |  |                     Data = null | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载城镇List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function InitMapList() { | 
					
						
							|  |  |  |         MapList = ScriptData.GetFileData("map/map.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 DataTable.rawset(Key, Data.Get()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载地图List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function InitCharacter() { | 
					
						
							|  |  |  |         CharacterList = ScriptData.GetFileData("character/character.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             local dirpath = DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Index = Data.Get(); | 
					
						
							|  |  |  |                 local Path = Data.Get(); | 
					
						
							|  |  |  |                 DataTable.rawset(Index, dirpath + Path.tolower()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载角色List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |         CharacterExptable = ScriptData.GetFileData("character/exptable.tbl", function(DataTable, Data) { | 
					
						
							|  |  |  |             local Level = 1; | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Exp = Data.Get(); | 
					
						
							|  |  |  |                 DataTable.rawset(Level, Exp.tointeger()); | 
					
						
							|  |  |  |                 Level += 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         CharacterInfoList = []; | 
					
						
							|  |  |  |         foreach(Index, Path in CharacterList) { | 
					
						
							|  |  |  |             if (Index == "filepath") continue; | 
					
						
							|  |  |  |             local Info = ScriptData.GetFileData(Path, function(DataTable, Data) { | 
					
						
							|  |  |  |                 local dirpath = DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |                 while (!Data.Eof()) { | 
					
						
							|  |  |  |                     local Key = Data.Get(); | 
					
						
							|  |  |  |                     if (Key == "[job]") { | 
					
						
							|  |  |  |                         DataTable.job <- Data.Get().slice(1, -1); | 
					
						
							|  |  |  |                     } else if (Key == "[growtype name]") { | 
					
						
							|  |  |  |                         DataTable.growtype <- array(6, {}); | 
					
						
							|  |  |  |                         for (local i = 0; i< 5; i++) { | 
					
						
							|  |  |  |                             local name = Data.Get(); | 
					
						
							|  |  |  |                             DataTable.growtype[i].name <- name; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-12-15 20:23:11 +08:00
										 |  |  |                     //默认时装 | 
					
						
							|  |  |  |                     else if (Key == "[default avatar]") { | 
					
						
							|  |  |  |                         DataTable.default_avatar <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/default avatar]") break; | 
					
						
							|  |  |  |                             DataTable.default_avatar.append(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |                     //基础Ani | 
					
						
							|  |  |  |                     else if (Key == "[waiting motion]" || Key == "[move motion]" || Key == "[sit motion]" || Key == "[damage motion 1]" || Key == "[damage motion 2]" || Key == "[down motion]" || Key == "[overturn motion]" || Key == "[jump motion]" || Key == "[jumpattack motion]" || Key == "[rest motion]" || Key == "[throw motion 1-1]" || Key == "[throw motion 1-2]" || Key == "[throw motion 2-1]" || Key == "[throw motion 2-2]" || Key == "[throw motion 3-1]" || Key == "[throw motion 3-2]" || Key == "[throw motion 4-1]" || Key == "[throw motion 4-2]" || Key == "[dash motion]" || Key == "[dashattack motion]" || Key == "[getitem motion]" || Key == "[buff motion]" || Key == "[simple rest motion]" || Key == "[simple move motion]" || Key == "[back motion]") { | 
					
						
							|  |  |  |                         local RealKey = Key.slice(1, Key.len() - 1); | 
					
						
							|  |  |  |                         DataTable[RealKey] <- dirpath + Data.Get().tolower(); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     //普攻Ani | 
					
						
							|  |  |  |                     else if (Key == "[attack motion]") { | 
					
						
							|  |  |  |                         DataTable.attack_motion <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/attack motion]") break; | 
					
						
							|  |  |  |                             DataTable.attack_motion.append(dirpath + Ret.tolower()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     //进阶Ani | 
					
						
							|  |  |  |                     else if (Key == "[etc motion]") { | 
					
						
							|  |  |  |                         DataTable.etc_motion <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/etc motion]") break; | 
					
						
							|  |  |  |                             DataTable.etc_motion.append(dirpath + Ret.tolower()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     //基础Atk | 
					
						
							|  |  |  |                     else if (Key == "[jumpattack info]" || Key == "[dashattack info]") { | 
					
						
							|  |  |  |                         local RealKey = Key.slice(1, Key.len() - 1); | 
					
						
							|  |  |  |                         DataTable[RealKey] <- (dirpath + Data.Get().tolower()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     //普攻Atk | 
					
						
							|  |  |  |                     else if (Key == "[attack info]") { | 
					
						
							|  |  |  |                         DataTable.attack_info <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/attack info]") break; | 
					
						
							|  |  |  |                             DataTable.attack_info.append(dirpath + Ret.tolower()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     //进阶Atk | 
					
						
							|  |  |  |                     else if (Key == "[etc attack info]") { | 
					
						
							|  |  |  |                         DataTable.etc_attack_info <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/etc attack info]") break; | 
					
						
							|  |  |  |                             DataTable.etc_attack_info.append(dirpath + Ret.tolower()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                     //属性 | 
					
						
							|  |  |  |                     else if (Key == "[growtype attribute]") { | 
					
						
							|  |  |  |                         DataTable.Attribute <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/growtype attribute]") break; | 
					
						
							|  |  |  |                             local attrtable = ScriptData.GetFileData(Ret, function(DataTable, Data) { | 
					
						
							|  |  |  |                                 while (!Data.Eof()) { | 
					
						
							|  |  |  |                                     local Key = Data.Get(); | 
					
						
							|  |  |  |                                     //基础属性 | 
					
						
							|  |  |  |                                     if (AttributeScript.rawin(Key)) { | 
					
						
							|  |  |  |                                         DataTable[AttributeScript[Key]] <- Data.Get(); | 
					
						
							|  |  |  |                                     } | 
					
						
							|  |  |  |                                     //名称 | 
					
						
							|  |  |  |                                     else if (Key == "[name]") { | 
					
						
							|  |  |  |                                         DataTable.name <- Data.Get(); | 
					
						
							|  |  |  |                                     } | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                             }.bindenv(this)); | 
					
						
							|  |  |  |                             DataTable.Attribute.push(attrtable); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 // print(DataTable); | 
					
						
							|  |  |  |                 if (_DEBUG_) print("初始化角色" + DataTable.job); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |             }.bindenv(this)); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |             CharacterInfoList.push(Info); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |     function InitSkill() { | 
					
						
							|  |  |  |         SkillList = ScriptData.GetFileData("skill/skilllist.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 //注册装备列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, ScriptData.GetFileData("skill/" + Data.Get().tolower(), function(DataTableA, DataA) { | 
					
						
							|  |  |  |                     while (!DataA.Eof()) { | 
					
						
							|  |  |  |                         local SkillIndex = DataA.Get(); | 
					
						
							|  |  |  |                         //注册装备列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                         DataTableA.rawset(SkillIndex, DataA.Get()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if (_DEBUG_) print("加载职业技能" + Key + "List完成, 共" + DataTableA.len() + "个"); | 
					
						
							|  |  |  |                 })); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载技能List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function InitJobSkillTree(Path) { | 
					
						
							|  |  |  |         local ConfigBuffer = ScriptData.GetFileData("clientonly/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 if (Key == "[skill info]") { | 
					
						
							|  |  |  |                     Data.Get(); | 
					
						
							|  |  |  |                     local SkillIndex = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.rawset(SkillIndex, {}); | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/skill info]") break; | 
					
						
							|  |  |  |                         //技能图标位置 | 
					
						
							|  |  |  |                         if (Ret == "[icon pos]") { | 
					
						
							|  |  |  |                             DataTable[SkillIndex].IconPos <- { | 
					
						
							|  |  |  |                                 x = Data.Get(), | 
					
						
							|  |  |  |                                 y = Data.Get() | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         ConfigBuffer.rawdelete("filepath"); | 
					
						
							|  |  |  |         return ConfigBuffer; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function InitSkillTree() { | 
					
						
							|  |  |  |         //先读职业技能树list  在读转职职业list | 
					
						
							|  |  |  |         SkillTreeList = ScriptData.GetFileData("clientonly/skilltree.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 //注册技能树列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, ScriptData.GetFileData("clientonly/" + Data.Get().tolower(), function(DataTableA, DataA) { | 
					
						
							|  |  |  |                     while (!DataA.Eof()) { | 
					
						
							|  |  |  |                         local GrowJob = DataA.Get(); | 
					
						
							|  |  |  |                         local GrowJobSkillTreePath = DataA.Get(); | 
					
						
							|  |  |  |                         local Config = InitJobSkillTree(GrowJobSkillTreePath); | 
					
						
							|  |  |  |                         DataTableA.rawset(GrowJob, Config); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }.bindenv(this))); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载技能树List完成, 共" + DataTable.len() + "个职业技能树"); | 
					
						
							|  |  |  |         }.bindenv(this)) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |     function InitEquipmentList() { | 
					
						
							|  |  |  |         EquipmentList = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							| 
									
										
										
										
											2024-12-15 20:23:11 +08:00
										 |  |  |                 //注册装备列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, { | 
					
						
							|  |  |  |                     Path = Data.Get(), | 
					
						
							|  |  |  |                     Data = null | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载装备List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |     function InitStackableList() { | 
					
						
							|  |  |  |         StackableList = ScriptData.GetFileData("stackable/stackable.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 //注册装备列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, { | 
					
						
							|  |  |  |                     Path = Data.Get(), | 
					
						
							|  |  |  |                     Data = null | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载消耗品List完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  |     function InitNpcList() { | 
					
						
							|  |  |  |         NpcList = ScriptData.GetFileData("npc/npc.lst", function(DataTable, Data) { | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							|  |  |  |                 //注册NPC列表 路径写入 数据未读取 | 
					
						
							|  |  |  |                 DataTable.rawset(Key, { | 
					
						
							|  |  |  |                     Path = Data.Get(), | 
					
						
							|  |  |  |                     Data = null | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (_DEBUG_) print("加载NPCList完成, 共" + DataTable.len() + "个"); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |     function InitNpcShopList() { | 
					
						
							|  |  |  |         NpcShopList = ScriptData.GetFileData("itemshop/itemshop.lst", function(DataTable, Data) { | 
					
						
							| 
									
										
										
										
											2024-12-25 11:32:34 +08:00
										 |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Key = Data.Get(); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                 //注册NPC商店列表 路径写入 数据未读取 | 
					
						
							| 
									
										
										
										
											2024-12-25 11:32:34 +08:00
										 |  |  |                 DataTable.rawset(Key, { | 
					
						
							|  |  |  |                     Path = Data.Get(), | 
					
						
							|  |  |  |                     Data = null | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |             if (_DEBUG_) print("加载NPC商店List完成, 共" + DataTable.len() + "个"); | 
					
						
							| 
									
										
										
										
											2024-12-25 11:32:34 +08:00
										 |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function InitEtcConfig() { | 
					
						
							|  |  |  |         //初始化装备信息标签tag配置 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             EtcConfig.ItemInfoTag <- ScriptData.GetFileData("etc/iteminfo.etc", function(DataTable, Data) { | 
					
						
							|  |  |  |                 while (!Data.Eof()) { | 
					
						
							|  |  |  |                     local Pack = Data.Get(); | 
					
						
							|  |  |  |                     //名称 grade 套装Id 稀有度 最低穿戴登记 重量 | 
					
						
							|  |  |  |                     if (Pack == "[item group name table]") { | 
					
						
							|  |  |  |                         DataTable.item_group_name_table <- {}; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/item group name table]") break; | 
					
						
							|  |  |  |                             DataTable.item_group_name_table.rawset(Ret, Data.Get()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[elemental property tag]") { | 
					
						
							|  |  |  |                         DataTable.elemental_property_tag <- {}; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/elemental property tag]") break; | 
					
						
							|  |  |  |                             DataTable.elemental_property_tag.rawset(Ret, Data.Get()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[rarity frame color idx]") { | 
					
						
							|  |  |  |                         DataTable.rarityframe_color_idx <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/rarity frame color idx]") break; | 
					
						
							|  |  |  |                             DataTable.rarityframe_color_idx.push(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[rarity name tag]") { | 
					
						
							|  |  |  |                         DataTable.rarity_name_tag <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/rarity name tag]") break; | 
					
						
							|  |  |  |                             DataTable.rarity_name_tag.push(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[rarity color]") { | 
					
						
							|  |  |  |                         DataTable.rarity_color <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/rarity color]") break; | 
					
						
							|  |  |  |                             local color = HexStringToInt(Ret); | 
					
						
							|  |  |  |                             DataTable.rarity_color.push(color); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[percentage text]") { | 
					
						
							|  |  |  |                         DataTable.percentage_text <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/percentage text]") break; | 
					
						
							|  |  |  |                             DataTable.percentage_text.push(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[percentage range boundaries]") { | 
					
						
							|  |  |  |                         DataTable.percentage_range_boundaries <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/percentage range boundaries]") break; | 
					
						
							|  |  |  |                             DataTable.percentage_range_boundaries.push(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[trade type text]") { | 
					
						
							|  |  |  |                         DataTable.trade_type_text <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/trade type text]") break; | 
					
						
							|  |  |  |                             DataTable.trade_type_text.push(Ret); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } else if (Pack == "[trade type color]") { | 
					
						
							|  |  |  |                         DataTable.trade_type_color <- []; | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/trade type color]") break; | 
					
						
							|  |  |  |                             local color = HexStringToInt(Ret); | 
					
						
							|  |  |  |                             DataTable.trade_type_color.push(color); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         //初始化NPC功能对应配置 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             EtcConfig.NpcRole <- ScriptData.GetFileData("etc/npcroleconfig.dat", function(DataTable, Data) { | 
					
						
							|  |  |  |                 while (!Data.Eof()) { | 
					
						
							|  |  |  |                     local Pack = Data.Get(); | 
					
						
							|  |  |  |                     //名称 grade 套装Id 稀有度 最低穿戴登记 重量 | 
					
						
							|  |  |  |                     if (Pack == "[config]") { | 
					
						
							|  |  |  |                         while (true) { | 
					
						
							|  |  |  |                             local Ret = Data.Get(); | 
					
						
							|  |  |  |                             if (Ret == "[/config]") break; | 
					
						
							|  |  |  |                             DataTable[Ret] <- { | 
					
						
							|  |  |  |                                 imgidx = Data.Get(), | 
					
						
							|  |  |  |                                 name = Data.Get(), | 
					
						
							|  |  |  |                                 namecolor = HexStringToInt(Data.Get()), | 
					
						
							|  |  |  |                                 iconpath = Data.Get(), | 
					
						
							|  |  |  |                                 iconidx = Data.Get(), | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |     constructor() { | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |         EtcConfig = {}; | 
					
						
							|  |  |  |         AttributeScript = {}; | 
					
						
							|  |  |  |         AttributeScript.rawset("[HP MAX]", "HPMax"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[MP MAX]", "MPMax"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[HP regen speed]", "HPRegenSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[MP regen speed]", "MPRegenSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[jump power]", "JumpPower"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[hit recovery]", "HitRecovery"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[stuck]", "Stuck"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[stuck resistance]", "StuckResistance"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[physical attack]", "PhysicalAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[magical attack]", "MagicalAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[physical defense]", "PhysicalDefense"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[magical defense]", "MagicalDefense"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[all elemental attack]", "AllElementalAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[dark attack]", "DarkAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[light attack]", "LightAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[water attack]", "WaterAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[fire attack]", "FireAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[equipment physical attack]", "EquipmentPhysicalAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[equipment magical attack]", "EquipmentMagicalAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[separate attack]", "SeparateAttack"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[equipment physical defense]", "EquipmentPhysicalDefense"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[equipment magical defense]", "EquipmentMagicalDefense"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[attack speed]", "AttackSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[cast speed]", "CastSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[move speed]", "MoveSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[jump speed]", "JumpSpeed"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[physical critical hit]", "PhysicalCriticalHit"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[magical critical hit]", "MagicalCriticalHit"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[dark resistance]", "DarkResistance"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[light resistance]", "LightResistance"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[water resistance]", "WaterResistance"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[fire resistance]", "FireResistance"); | 
					
						
							|  |  |  |         AttributeScript.rawset("[elemental property]", "ElementalProperty"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 11:32:34 +08:00
										 |  |  |         //初始化城镇列表 | 
					
						
							|  |  |  |         InitTownList(); | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  |         //初始化地图列表 | 
					
						
							|  |  |  |         InitMapList(); | 
					
						
							|  |  |  |         //初始化角色 | 
					
						
							|  |  |  |         InitCharacter(); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |         //初始化技能 | 
					
						
							|  |  |  |         InitSkill(); | 
					
						
							|  |  |  |         //初始化技能树 | 
					
						
							|  |  |  |         InitSkillTree(); | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |         //初始化装备列表 | 
					
						
							|  |  |  |         InitEquipmentList(); | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |         //初始化消耗品列表 | 
					
						
							|  |  |  |         InitStackableList(); | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  |         //初始化NPC列表 | 
					
						
							|  |  |  |         InitNpcList(); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |         //初始化NPC商店列表 | 
					
						
							|  |  |  |         InitNpcShopList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //初始化杂项配置信息 | 
					
						
							|  |  |  |         InitEtcConfig(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         getroottable().AssetManager <- this; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //Public:: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //获取装备信息 | 
					
						
							|  |  |  |     function GetEquipment(Idx) { | 
					
						
							|  |  |  |         //如果没有这件装备则返回 | 
					
						
							|  |  |  |         if (!(EquipmentList.rawin(Idx))) return; | 
					
						
							| 
									
										
										
										
											2024-12-15 20:23:11 +08:00
										 |  |  |         //如果装备数据已经读取过存在了则直接返回 | 
					
						
							|  |  |  |         if (EquipmentList[Idx].Data) return EquipmentList[Idx].Data; | 
					
						
							|  |  |  |         local Path = EquipmentList[Idx].Path; | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |         local m_data = ScriptData.GetFileData("equipment/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Pack = Data.Get(); | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                 //名称 grade 套装Id 稀有度 最低穿戴登记 重量 组名 购买价格 出售价格 耐久 描述 | 
					
						
							|  |  |  |                 if (Pack == "[name]" || Pack == "[part set index]" || Pack == "[grade]" || Pack == "[rarity]" || Pack == "[minimum level]" || Pack == "[weight]" || Pack == "[item group name]" || Pack == "[price]" || Pack == "[repair price]" || Pack == "[value]" || Pack == "[durability]" || Pack == "[flavor text]") { | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                     local RealKey = Pack.slice(1, -1); | 
					
						
							|  |  |  |                     DataTable[RealKey] <- Data.Get(); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                 //属性 | 
					
						
							|  |  |  |                 else if (AttributeScript.rawin(Pack)) { | 
					
						
							|  |  |  |                     //三攻 和 双防 要读取两个值因为是浮动数组 | 
					
						
							|  |  |  |                     if (Pack == "[equipment physical attack]" || Pack == "[equipment magical attack]" || Pack == "[separate attack]" || Pack == "[equipment physical defense]" || Pack == "[equipment magical defense]") { | 
					
						
							|  |  |  |                         DataTable[AttributeScript[Pack]] <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         DataTable[AttributeScript[Pack]] <- Data.Get(); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                 //适用角色 | 
					
						
							|  |  |  |                 else if (Pack == "[usable job]") { | 
					
						
							|  |  |  |                     DataTable.usable_job <- []; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/usable job]") break; | 
					
						
							|  |  |  |                         DataTable.usable_job.append(Ret.slice(1, -1).tolower()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                 //隐藏图层 | 
					
						
							|  |  |  |                 else if (Pack == "[hide layer]") { | 
					
						
							|  |  |  |                     DataTable.hide_layer <- []; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/hide layer]") break; | 
					
						
							|  |  |  |                         DataTable.hide_layer.append(Ret); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2025-01-07 20:36:10 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                 //图标 | 
					
						
							|  |  |  |                 else if (Pack == "[icon]") { | 
					
						
							|  |  |  |                     DataTable.icon <- {}; | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							| 
									
										
										
										
											2025-01-04 20:03:17 +08:00
										 |  |  |                     DataTable.icon.path <- "sprite/" + Ret.tolower(); | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                     Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.icon.index <- Ret.tointeger(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //装备类型 | 
					
						
							|  |  |  |                 else if (Pack == "[equipment type]") { | 
					
						
							|  |  |  |                     DataTable.type <- {}; | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.type.path <- Ret.tolower().slice(1, -1); | 
					
						
							|  |  |  |                     Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.type.index <- Ret.tointeger(); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-12-17 09:41:42 +08:00
										 |  |  |                 //光环效果 | 
					
						
							|  |  |  |                 else if (Pack == "[aurora graphic effects]") { | 
					
						
							|  |  |  |                     DataTable.aurora_effects <- []; | 
					
						
							|  |  |  |                     local Count = Data.Get(); | 
					
						
							|  |  |  |                     for (local i = 0; i< Count; i++) { | 
					
						
							|  |  |  |                         local T = { | 
					
						
							|  |  |  |                             type = Data.Get(), | 
					
						
							|  |  |  |                             path = Data.Get().tolower() | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         DataTable.aurora_effects.push(T); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                 //Expand Ani | 
					
						
							|  |  |  |                 else if (Pack == "[expand ani]") { | 
					
						
							|  |  |  |                     if (!(DataTable.rawin("Ani"))) DataTable["Ani"] <- {}; | 
					
						
							|  |  |  |                     local DataBuffer = {}; | 
					
						
							|  |  |  |                     DataBuffer.layer_variation <- []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/expand ani]") break; | 
					
						
							|  |  |  |                         if (Ret == "[variation]") { | 
					
						
							|  |  |  |                             DataBuffer.variation <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                         } else if (Ret == "[layer variation]") { | 
					
						
							|  |  |  |                             local InfoBuf = {}; | 
					
						
							|  |  |  |                             InfoBuf.Zorder <- Data.Get(); | 
					
						
							|  |  |  |                             InfoBuf.Path <- Data.Get(); | 
					
						
							|  |  |  |                             DataBuffer.layer_variation.append(InfoBuf); | 
					
						
							|  |  |  |                         } else if (Ret == "[expand path]") { | 
					
						
							|  |  |  |                             DataTable["expand_path"] <- Data.Get(); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     foreach(Job in DataTable.usable_job) { | 
					
						
							|  |  |  |                         DataTable["Ani"]["Ani_" + Job] <- {}; | 
					
						
							|  |  |  |                         DataTable["Ani"]["Ani_" + Job].variation <- sq_DeepCopy(DataBuffer.variation); | 
					
						
							|  |  |  |                         DataTable["Ani"]["Ani_" + Job].layer_variation <- sq_DeepCopy(DataBuffer.layer_variation) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                 //Ani | 
					
						
							|  |  |  |                 else if (Pack == "[animation job]") { | 
					
						
							|  |  |  |                     local Job = Data.Get().slice(1, -1); | 
					
						
							| 
									
										
										
										
											2024-12-13 20:52:58 +08:00
										 |  |  |                     if (!(DataTable.rawin("Ani"))) DataTable["Ani"] <- {}; | 
					
						
							|  |  |  |                     DataTable["Ani"]["Ani_" + Job] <- {}; | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                     Data.Get(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     local Index1 = Data.Get(); | 
					
						
							|  |  |  |                     local Index2 = Data.Get(); | 
					
						
							| 
									
										
										
										
											2024-12-13 20:52:58 +08:00
										 |  |  |                     DataTable["Ani"]["Ani_" + Job].variation <- [Index1, Index2]; | 
					
						
							|  |  |  |                     DataTable["Ani"]["Ani_" + Job].layer_variation <- []; | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[animation job]" || (endswith(Ret, "]") && Ret != "[equipment ani script]" && Ret != "[layer variation]")) { | 
					
						
							|  |  |  |                             Data.Pos--; | 
					
						
							|  |  |  |                             break; | 
					
						
							|  |  |  |                         } else if (Ret == "[layer variation]") { | 
					
						
							|  |  |  |                             local InfoBuf = {}; | 
					
						
							|  |  |  |                             InfoBuf.Zorder <- Data.Get(); | 
					
						
							|  |  |  |                             InfoBuf.Path <- Data.Get(); | 
					
						
							| 
									
										
										
										
											2024-12-13 20:52:58 +08:00
										 |  |  |                             DataTable["Ani"]["Ani_" + Job].layer_variation.append(InfoBuf); | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |         }.bindenv(this)); | 
					
						
							| 
									
										
										
										
											2024-12-15 20:23:11 +08:00
										 |  |  |         EquipmentList[Idx].Data = m_data; | 
					
						
							| 
									
										
										
										
											2024-12-12 14:51:27 +08:00
										 |  |  |         return m_data; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-19 09:48:40 +08:00
										 |  |  |     //获取消耗品信息 | 
					
						
							|  |  |  |     function GetStackable(Idx) { | 
					
						
							|  |  |  |         //如果没有这件消耗品则返回 | 
					
						
							|  |  |  |         if (!(StackableList.rawin(Idx))) return; | 
					
						
							|  |  |  |         //如果装备数据已经读取过存在了则直接返回 | 
					
						
							|  |  |  |         if (StackableList[Idx].Data) return StackableList[Idx].Data; | 
					
						
							|  |  |  |         local Path = StackableList[Idx].Path; | 
					
						
							|  |  |  |         local m_data = ScriptData.GetFileData("stackable/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Pack = Data.Get(); | 
					
						
							|  |  |  |                 //名称 | 
					
						
							|  |  |  |                 if (Pack == "[name]" || Pack == "[item group name]" || Pack == "[explain]") { | 
					
						
							|  |  |  |                     local RealKey = Pack.slice(1, -1); | 
					
						
							|  |  |  |                     DataTable[RealKey] <- Data.Get(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //适用角色 | 
					
						
							|  |  |  |                 else if (Pack == "[usable job]") { | 
					
						
							|  |  |  |                     DataTable.usable_job <- []; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/usable job]") break; | 
					
						
							|  |  |  |                         DataTable.usable_job.append(Ret.slice(1, -1).tolower()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //图标 | 
					
						
							|  |  |  |                 else if (Pack == "[icon]") { | 
					
						
							|  |  |  |                     DataTable.icon <- {}; | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.icon.path <- "sprite/" + Ret.tolower(); | 
					
						
							|  |  |  |                     Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.icon.index <- Ret.tointeger(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //消耗品类型 | 
					
						
							|  |  |  |                 else if (Pack == "[stackable type]") { | 
					
						
							|  |  |  |                     DataTable.type <- {}; | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.type.path <- Ret.tolower().slice(1, -1); | 
					
						
							|  |  |  |                     Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.type.index <- Ret.tointeger(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //交易类型 | 
					
						
							|  |  |  |                 else if (Pack == "[attach type]") { | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							|  |  |  |                     if (Ret == "[free]") DataTable.trade_type <- 0; | 
					
						
							|  |  |  |                     else if (Ret == "[trade]") DataTable.trade_type <- 1; | 
					
						
							|  |  |  |                     else if (Ret == "[sealing]") DataTable.trade_type <- 2; | 
					
						
							|  |  |  |                     else if (Ret == "[account]") DataTable.trade_type <- 3; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         StackableList[Idx].Data = m_data; | 
					
						
							|  |  |  |         return m_data; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //获取NPC信息 | 
					
						
							|  |  |  |     function GetNpc(Idx) { | 
					
						
							|  |  |  |         //如果没有这个NPC则返回 | 
					
						
							|  |  |  |         if (!(NpcList.rawin(Idx))) return; | 
					
						
							|  |  |  |         //如果NPC数据已经读取过存在了则直接返回 | 
					
						
							|  |  |  |         if (NpcList[Idx].Data) return NpcList[Idx].Data; | 
					
						
							|  |  |  |         local Path = NpcList[Idx].Path; | 
					
						
							|  |  |  |         local m_data = ScriptData.GetFileData("npc/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Pack = Data.Get(); | 
					
						
							|  |  |  |                 //各种头像 | 
					
						
							|  |  |  |                 if (Pack == "[small face]" || Pack == "[big face]" || Pack == "[popup face]") { | 
					
						
							|  |  |  |                     local RealKey = Pack.slice(1, Pack.find(" face")) + "_face"; | 
					
						
							|  |  |  |                     DataTable[RealKey] <- { | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  |                         img = "sprite/" + Data.Get().tolower(), | 
					
						
							| 
									
										
										
										
											2025-01-02 19:19:36 +08:00
										 |  |  |                         idx = Data.Get() | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } else if (Pack == "[field animation]") { | 
					
						
							|  |  |  |                     DataTable.field_animation <- DataTable.DirPath + Data.Get().tolower(); | 
					
						
							|  |  |  |                 } else if (Pack == "[field wav]") { | 
					
						
							|  |  |  |                     DataTable.field_wav <- Data.Get(); | 
					
						
							|  |  |  |                 } else if (Pack == "[popup wav]") { | 
					
						
							|  |  |  |                     DataTable.popup_wav <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                 } else if (Pack == "[name]") { | 
					
						
							|  |  |  |                     DataTable.name <- Data.Get(); | 
					
						
							|  |  |  |                 } else if (Pack == "[field name]") { | 
					
						
							|  |  |  |                     DataTable.field_name <- Data.Get(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //功能 | 
					
						
							|  |  |  |                 else if (Pack == "[role]") { | 
					
						
							|  |  |  |                     DataTable.role <- {}; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/role]") break; | 
					
						
							|  |  |  |                         DataTable.role.rawset(Ret.slice(1, -1).tolower(), Data.Get()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         NpcList[Idx].Data = m_data; | 
					
						
							|  |  |  |         return m_data; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-02-20 13:53:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //获取NPC商店信息 | 
					
						
							|  |  |  |     function GetNpcShop(Idx) { | 
					
						
							|  |  |  |         //如果没有这个商店则返回 | 
					
						
							|  |  |  |         if (!(NpcShopList.rawin(Idx))) return; | 
					
						
							|  |  |  |         //如果商店数据已经读取过存在了则直接返回 | 
					
						
							|  |  |  |         if (NpcShopList[Idx].Data) return NpcShopList[Idx].Data; | 
					
						
							|  |  |  |         local Path = NpcShopList[Idx].Path; | 
					
						
							|  |  |  |         local m_data = ScriptData.GetFileData("itemshop/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             DataTable.PageList <- []; | 
					
						
							|  |  |  |             DataTable.PageNameList <- []; | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Pack = Data.Get(); | 
					
						
							|  |  |  |                 //商店信息 | 
					
						
							|  |  |  |                 if (Pack == "[page]") { | 
					
						
							|  |  |  |                     local ItemList = []; | 
					
						
							|  |  |  |                     DataTable.PageNameList.push(Data.Get()); | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Buffer = Data.Get(); | 
					
						
							|  |  |  |                         if (Buffer == "[/page]") break; | 
					
						
							|  |  |  |                         local ItemInfo = {}; | 
					
						
							|  |  |  |                         ItemInfo.Id <- Buffer; | 
					
						
							|  |  |  |                         ItemInfo.Cera <- Data.Get(); | 
					
						
							|  |  |  |                         ItemInfo.CeraPoint <- Data.Get(); | 
					
						
							|  |  |  |                         ItemInfo.Gold <- Data.Get(); | 
					
						
							|  |  |  |                         ItemInfo.Material <- Data.Get(); | 
					
						
							|  |  |  |                         ItemInfo.MaterialCount <- Data.Get(); | 
					
						
							|  |  |  |                         ItemList.push(ItemInfo); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     DataTable.PageList.push(ItemList); | 
					
						
							|  |  |  |                 } else if (Pack == "[name]") { | 
					
						
							|  |  |  |                     DataTable.name <- Data.Get(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         NpcList[Idx].Data = m_data; | 
					
						
							|  |  |  |         return m_data; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //获取技能信息 | 
					
						
							|  |  |  |     function GetSkill(Job, Idx) { | 
					
						
							|  |  |  |         //如果没有这个技能则返回 | 
					
						
							|  |  |  |         if (!(SkillList.rawin(Job))) return; | 
					
						
							|  |  |  |         if (!(SkillList[Job].rawin(Idx))) return; | 
					
						
							|  |  |  |         //如果技能数据已经读取过存在了则直接返回 | 
					
						
							|  |  |  |         if (typeof SkillList[Job][Idx] == "table") return SkillList[Job][Idx]; | 
					
						
							|  |  |  |         local Path = SkillList[Job][Idx]; | 
					
						
							|  |  |  |         local m_data = ScriptData.GetFileData("skill/" + Path, function(DataTable, Data) { | 
					
						
							|  |  |  |             DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); | 
					
						
							|  |  |  |             while (!Data.Eof()) { | 
					
						
							|  |  |  |                 local Pack = Data.Get(); | 
					
						
							|  |  |  |                 if (Pack == "[command key explain]" || Pack == "[basic explain]" || Pack == "[explain]" || Pack == "[name]" || Pack == "[name2]" || Pack == "[required level]" || Pack == "[required level range]" || Pack == "[skill class]" || Pack == "[maximum level]" || Pack == "[skill fitness second growtype]") { | 
					
						
							|  |  |  |                     DataTable[Pack.slice(1, -1)] <- Data.Get(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //技能类型 | 
					
						
							|  |  |  |                 else if (Pack == "[type]") { | 
					
						
							|  |  |  |                     local Type = Data.Get(); | 
					
						
							|  |  |  |                     if (Type == "[active]") { | 
					
						
							|  |  |  |                         DataTable.type <- 0; | 
					
						
							|  |  |  |                     } else if (Type == "[passive]") { | 
					
						
							|  |  |  |                         DataTable.type <- 0; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //技能消耗道具 | 
					
						
							|  |  |  |                 else if (Pack == "[consume item]") { | 
					
						
							|  |  |  |                     DataTable.consume_item <- []; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/consume item]") break; | 
					
						
							|  |  |  |                         DataTable.consume_item.push(Ret); | 
					
						
							|  |  |  |                         DataTable.consume_item.push(Data.Get()); | 
					
						
							|  |  |  |                         DataTable.consume_item.push(Data.Get()); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //各职业是否可学习 | 
					
						
							|  |  |  |                 else if (Pack == "[skill fitness growtype]") { | 
					
						
							|  |  |  |                     DataTable.skill_fitness_growtype <- {}; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/skill fitness growtype]") break; | 
					
						
							|  |  |  |                         DataTable.skill_fitness_growtype.rawset(Ret, true); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //图标 | 
					
						
							|  |  |  |                 else if (Pack == "[icon]") { | 
					
						
							|  |  |  |                     DataTable.icon <- {}; | 
					
						
							|  |  |  |                     local Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.icon.path <- "sprite/" + Ret.tolower(); | 
					
						
							|  |  |  |                     Ret = Data.Get(); | 
					
						
							|  |  |  |                     DataTable.icon.index <- Ret.tointeger(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //技能指令 | 
					
						
							|  |  |  |                 else if (Pack == "[command]") { | 
					
						
							|  |  |  |                     DataTable.command <- []; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/command]") break; | 
					
						
							|  |  |  |                         DataTable.command.push(Ret); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //技能属性 | 
					
						
							|  |  |  |                 else if (Pack == "[level property]") { | 
					
						
							|  |  |  |                     DataTable.level_property <- {}; | 
					
						
							|  |  |  |                     DataTable.level_property.data <- []; | 
					
						
							|  |  |  |                     Data.Get(); | 
					
						
							|  |  |  |                     Data.Get(); | 
					
						
							|  |  |  |                     local ExplainBuffer = Data.Get(); | 
					
						
							|  |  |  |                     ExplainBuffer = String.ReplaceString(ExplainBuffer, "<int>", "%d"); | 
					
						
							|  |  |  |                     ExplainBuffer = String.ReplaceString(ExplainBuffer, "<float1>", "%.1f"); | 
					
						
							|  |  |  |                     ExplainBuffer = String.ReplaceString(ExplainBuffer, "<float2>", "%.2f"); | 
					
						
							|  |  |  |                     DataTable.level_property.explain <- ExplainBuffer; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/level property]") break; | 
					
						
							|  |  |  |                         DataTable.level_property.data.push(Ret); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 //地下城数据 | 
					
						
							|  |  |  |                 else if (Pack == "[dungeon]") { | 
					
						
							|  |  |  |                     DataTable.dungeon_data <- {}; | 
					
						
							|  |  |  |                     DataTable.dungeon_data.consume_mp <- 0; | 
					
						
							|  |  |  |                     while (true) { | 
					
						
							|  |  |  |                         local Ret = Data.Get(); | 
					
						
							|  |  |  |                         if (Ret == "[/dungeon]") break; | 
					
						
							|  |  |  |                         if (Ret == "[cool time]") { | 
					
						
							|  |  |  |                             DataTable.dungeon_data.cooltime <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                         } else if (Ret == "[consume MP]") { | 
					
						
							|  |  |  |                             DataTable.dungeon_data.consume_mp <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                         } else if (Ret == "[casting time]") { | 
					
						
							|  |  |  |                             DataTable.dungeon_data.casting_time <- [Data.Get(), Data.Get()]; | 
					
						
							|  |  |  |                         } else if (Ret == "[static data]") { | 
					
						
							|  |  |  |                             DataTable.dungeon_data.static_data <- []; | 
					
						
							|  |  |  |                             while (true) { | 
					
						
							|  |  |  |                                 local Ret2 = Data.Get(); | 
					
						
							|  |  |  |                                 if (Ret2 == "[/static data]") break; | 
					
						
							|  |  |  |                                 DataTable.dungeon_data.static_data.push(Ret2); | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } else if (Ret == "[level info]") { | 
					
						
							|  |  |  |                             local ListCount = Data.Get(); | 
					
						
							|  |  |  |                             DataTable.dungeon_data.level_info <- []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                             while (true) { | 
					
						
							|  |  |  |                                 local Ret2 = Data.Get(); | 
					
						
							|  |  |  |                                 if (Ret2 == "[/level info]") break; | 
					
						
							|  |  |  |                                 local ArrBuffer = [Ret2]; | 
					
						
							|  |  |  |                                 for (local i = 0; i< ListCount - 1; i++) { | 
					
						
							|  |  |  |                                     ArrBuffer.push(Data.Get()); | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                                 DataTable.dungeon_data.level_info.push(ArrBuffer); | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         SkillList[Job][Idx] = m_data; | 
					
						
							|  |  |  |         return m_data; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //获取指定职业的技能树配置 | 
					
						
							|  |  |  |     function GetSkillTreeByJob(Job, GrowType) { | 
					
						
							|  |  |  |         if (SkillTreeList.rawin(Job) && SkillTreeList[Job].rawin(GrowType)) { | 
					
						
							|  |  |  |             return SkillTreeList[Job][GrowType]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         error("没有找到指定职业的技能树配置"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-11 15:08:57 +08:00
										 |  |  | } |