/* 文件名:AssetManager.nut 路径:User/Asset/AssetManager.nut 创建日期:2024-11-24 08:44 文件用途: 资源管理器 */ class _AssetManager_ { //角色列表 CharacterList = null; //角色信息表 CharacterInfoList = null; //角色经验表 CharacterExptable = null; //技能信息表 SkillList = null; //技能树信息表 SkillTreeList = null; //地图列表 MapList = null; //城镇列表 TownList = null; //装备列表 EquipmentList = null; //消耗品列表 StackableList = null; //NPC列表 NpcList = null; //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() + "个"); }); } 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() + "个"); }); 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; } }) 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; } } //默认时装 else if (Key == "[default avatar]") { DataTable.default_avatar <- []; while (true) { local Ret = Data.Get(); if (Ret == "[/default avatar]") break; DataTable.default_avatar.append(Ret); } } //基础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()); } } //属性 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); } } } // print(DataTable); if (_DEBUG_) print("初始化角色" + DataTable.job); }.bindenv(this)); CharacterInfoList.push(Info); } } 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)) } function InitEquipmentList() { EquipmentList = ScriptData.GetFileData("equipment/equipment.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() + "个"); }); } 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() + "个"); }); } 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() + "个"); }); } function InitNpcShopList() { NpcShopList = ScriptData.GetFileData("itemshop/itemshop.lst", function(DataTable, Data) { while (!Data.Eof()) { local Key = Data.Get(); //注册NPC商店列表 路径写入 数据未读取 DataTable.rawset(Key, { Path = Data.Get(), Data = null }); } if (_DEBUG_) print("加载NPC商店List完成, 共" + DataTable.len() + "个"); }); } 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(), } } } } }); } } constructor() { 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"); //初始化城镇列表 InitTownList(); //初始化地图列表 InitMapList(); //初始化角色 InitCharacter(); //初始化技能 InitSkill(); //初始化技能树 InitSkillTree(); //初始化装备列表 InitEquipmentList(); //初始化消耗品列表 InitStackableList(); //初始化NPC列表 InitNpcList(); //初始化NPC商店列表 InitNpcShopList(); //初始化杂项配置信息 InitEtcConfig(); getroottable().AssetManager <- this; } //Public:: //获取装备信息 function GetEquipment(Idx) { //如果没有这件装备则返回 if (!(EquipmentList.rawin(Idx))) return; //如果装备数据已经读取过存在了则直接返回 if (EquipmentList[Idx].Data) return EquipmentList[Idx].Data; local Path = EquipmentList[Idx].Path; 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(); //名称 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]") { local RealKey = Pack.slice(1, -1); DataTable[RealKey] <- Data.Get(); } //属性 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(); } } //适用角色 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 == "[hide layer]") { DataTable.hide_layer <- []; while (true) { local Ret = Data.Get(); if (Ret == "[/hide layer]") break; DataTable.hide_layer.append(Ret); } } //图标 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 == "[equipment 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 == "[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); } } //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) } } //Ani else if (Pack == "[animation job]") { local Job = Data.Get().slice(1, -1); if (!(DataTable.rawin("Ani"))) DataTable["Ani"] <- {}; DataTable["Ani"]["Ani_" + Job] <- {}; Data.Get(); local Index1 = Data.Get(); local Index2 = Data.Get(); DataTable["Ani"]["Ani_" + Job].variation <- [Index1, Index2]; DataTable["Ani"]["Ani_" + Job].layer_variation <- []; 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(); DataTable["Ani"]["Ani_" + Job].layer_variation.append(InfoBuf); } } } } }.bindenv(this)); EquipmentList[Idx].Data = m_data; return m_data; } //获取消耗品信息 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; } //获取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] <- { img = "sprite/" + Data.Get().tolower(), 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; } //获取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, "", "%d"); ExplainBuffer = String.ReplaceString(ExplainBuffer, "", "%.1f"); ExplainBuffer = String.ReplaceString(ExplainBuffer, "", "%.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("没有找到指定职业的技能树配置"); } }