You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
7.6 KiB

  1. local function covert2LuaString(str)
  2. return string.toLuaString(str);
  3. end;
  4. local function getGlobalValueName(func)
  5. for k, v in pairs(_G) do
  6. if v == func then
  7. return k;
  8. end
  9. end
  10. return nil;
  11. end;
  12. local function eval2FuncString(exp, isInteger)
  13. if exp == "" then
  14. return "emptyFunction";
  15. end;
  16. local bNeedLoadEnv = true;
  17. local x_n = 0;
  18. for i = 1, 20 do
  19. if string.find(exp, "x" .. i) then
  20. x_n = i;
  21. end
  22. end
  23. local paramString = "";
  24. for i = 1, x_n do
  25. if i == 1 then
  26. paramString = paramString .. "x" .. i;
  27. else
  28. paramString = paramString .. ", x" .. i;
  29. end
  30. end
  31. local expString;
  32. if x_n == 0 then
  33. bNeedLoadEnv = isInteger;
  34. if tonumber(exp) then
  35. expString = "(" .. exp .. ")";
  36. else
  37. --expString = "(\"" .. exp .. "\")";
  38. if isInteger then
  39. return "toInterEval(" .. covert2LuaString(exp) .. ")";
  40. else
  41. return "toEval(" .. covert2LuaString(exp) .. ")";
  42. end
  43. end
  44. else
  45. expString = "(" .. exp .. ")";
  46. end;
  47. if isInteger then
  48. expString = "Math.ceil" .. expString;
  49. end
  50. local ret;
  51. if bNeedLoadEnv then
  52. local envString = "";
  53. for i , v in pairs(ServerScriptEnv) do
  54. envString = envString .. "local " .. i .. " = ServerScriptEnv." .. i .. "; ";
  55. end
  56. ret = string.format("function(%s)%s local ret = %s; return ret; end", paramString, envString, expString);
  57. else
  58. ret = string.format("function(%s) return %s; end", paramString, expString);
  59. end;
  60. return ret;
  61. end;
  62. -- 解析配置文件的一行数据
  63. local function buildConfigString(skill, desc)
  64. local str = "";
  65. for k, v in pairsByKeys(skill) do
  66. local keyString;
  67. if type(k) == "number" then
  68. keyString = tostring(k);
  69. else
  70. keyString = "\"" .. tostring(k) .. "\"";
  71. end;
  72. local valueType = type(v);
  73. if valueType == "number" then
  74. str = str .. string.format("[%s] = %s;\n", keyString, tostring(v));
  75. elseif valueType == "string" then
  76. str = str .. string.format("[%s] = %s;\n", keyString, covert2LuaString(v));
  77. elseif valueType == "boolean" then
  78. str = str .. string.format("[%s] = %s;\n", keyString, tostring(v));
  79. elseif valueType == "table" then
  80. if type(v.exp) == "string" then
  81. local func = desc.Mapping[k];
  82. local funcString;
  83. if func == toEval then
  84. funcString = eval2FuncString(v.exp, false);
  85. elseif func == toInterEval then
  86. funcString = eval2FuncString(v.exp, true);
  87. else
  88. error("暂时不支持的函数类型 " .. tostring(getGlobalValueName(func)));
  89. end;
  90. str = str .. string.format("[%s] = %s;\n", keyString, funcString);
  91. --[[
  92. local func = desc.Mapping[k];
  93. local funcString = getGlobalValueName(func);
  94. if not funcString then
  95. error("无法识别的转换函数");
  96. end
  97. local luaString = covert2LuaString(v.exp);
  98. str = str .. string.format("[%s] = %s(%s);\n", keyString, funcString, luaString);
  99. ]]
  100. else
  101. str = str .. string.format("[%s] = \n{\n", keyString);
  102. str = str .. buildConfigString(v, desc);
  103. str = str .. "\n};\n";
  104. end;
  105. elseif valueType == "userdata" then
  106. if tolua.type(v) == "CCPoint" then
  107. str = str .. string.format("[%s] = ccp(%s, %s);\n", keyString, tostring(v.x), tostring(v.y));
  108. elseif tolua.type(v) == "ccColor3B" then
  109. str = str .. string.format("[%s] = ccc3(%d, %d, %d);\n", keyString, v.r, v.g, v.b);
  110. end
  111. elseif valueType == "function" then
  112. print("发现一个函数需要处理");
  113. local funcString = getGlobalValueName(v);
  114. assert(funcString, "指向的函数不在_G内");
  115. str = str .. string.format("[%s] = %s;\n", keyString, funcString);
  116. else
  117. error("无法识别的类型 " .. keyString .. " 类型为" .. valueType);
  118. end
  119. end
  120. return str;
  121. end;
  122. -- 解析一个配置文件
  123. function saveLuaXMLConfig(config, configDesc, filename)
  124. print("序列化配置" , filename)
  125. local file = io.open(filename, "wb");
  126. if file then
  127. file:write([[local t = {};]] .. '\n');
  128. local defSecKey = configDesc.DefaultSecondKey;
  129. if defSecKey then
  130. local keyString;
  131. if type(defSecKey) == "number" then
  132. keyString = tostring(defSecKey);
  133. else
  134. keyString = "\"" .. tostring(defSecKey) .. "\"";
  135. end;
  136. local str = [[
  137. local function secDefaultData(self, key)
  138. if key == "get" then
  139. return function(s , kk)
  140. return rawget(s , kk);
  141. end
  142. end
  143. local value = rawget(self, key);
  144. if value then
  145. return value;
  146. else
  147. print("找不到配置[" .. "%s" .. "]键为[" ..tostring(key) .. "]的值,将使用默认键[" .. %s .. "]代替");
  148. return rawget(self, %s);
  149. end;
  150. end
  151. ]];
  152. str = string.format(str, configDesc.XMLFile, keyString, keyString);
  153. file:write(str);
  154. end;
  155. for KeyName, skill in pairsByKeys(config) do
  156. if type(skill) == "table" then
  157. local keyString;
  158. if type(KeyName) == "number" then
  159. keyString = "t[" .. KeyName .. "]";
  160. else
  161. keyString = "t[\"" .. KeyName .. "\"]";
  162. end;
  163. file:write(keyString .. " = \n{\n");
  164. local str = buildConfigString(skill, configDesc, true);
  165. file:write(str);
  166. file:write("\n};\n");
  167. if defSecKey then
  168. str = string.format([[setmetatable(%s, {__index = secDefaultData});]] .. "\n", keyString);
  169. file:write(str);
  170. end;
  171. elseif type(skill) == "function" then
  172. print(filename, KeyName);
  173. print("发现一个函数需要处理");
  174. if type(KeyName) == "number" then
  175. file:write("t[" .. KeyName .. "] = ");
  176. else
  177. file:write("t[\"" .. KeyName .. "\"] = ");
  178. end;
  179. local funcString = getGlobalValueName(skill);
  180. assert(funcString, "指向的函数不在_G内");
  181. local str = string.format("%s;\n", funcString);
  182. file:write(str);
  183. else
  184. error("无法识别的类型 " .. KeyName .. " 类型为" .. type(skill));
  185. end;
  186. end
  187. local defaultKey = configDesc.DefaultKey;
  188. if defaultKey then
  189. local keyString;
  190. if type(defaultKey) == "number" then
  191. keyString = tostring(defaultKey);
  192. else
  193. keyString = "\"" .. tostring(defaultKey) .. "\"";
  194. end;
  195. local str = string.format([[
  196. local method =
  197. {
  198. };
  199. local function defaultData(self, key)
  200. if method[key] then
  201. return method[key];
  202. end;
  203. local value = rawget(self, key);
  204. if value then
  205. return value;
  206. else
  207. print("找不到配置[" .. "%s" .. "]键为[" ..tostring(key) .. "]的值,将使用默认键[" .. %s .. "]代替");
  208. return rawget(self, %s);
  209. end
  210. end;
  211. function method:get(key)
  212. return rawget(t , key);
  213. end;
  214. ]], configDesc.XMLFile, keyString, keyString);
  215. file:write(str);
  216. file:write("\n");
  217. file:write([[setmetatable(t, {__index = defaultData});]]);
  218. file:write("\n");
  219. else
  220. local str =[[
  221. local method =
  222. {
  223. };
  224. local function defaultData(self, key)
  225. if method[key] then
  226. return method[key];
  227. end;
  228. end;
  229. function method:get(key)
  230. return rawget(t , key);
  231. end;
  232. ]];
  233. file:write(str);
  234. file:write("\n");
  235. file:write([[setmetatable(t, {__index = defaultData});]]);
  236. file:write("\n");
  237. end
  238. file:write([[return t;]]);
  239. file:close();
  240. end;
  241. end;
  242. function loadLuaXMLConfig(filename , configDesc)
  243. if configDesc.postload then
  244. table.insert(g_allXMLPostload , configDesc.postload)
  245. end
  246. print("读取lua配置" , filename)
  247. local data = cc.FileUtils:getInstance():readData(filename);
  248. local uncompressData = lzma.uncompress(data);
  249. local n,r = loadstring(uncompressData);
  250. if n == nil then
  251. error("载入文件" .. tostring(filename) .. "时出错" .. r);
  252. end
  253. local luaCfg = n();
  254. local mt = getmetatable(luaCfg);
  255. if mt then
  256. local oldIndex = mt.__index;
  257. mt.__index = function(self, key)
  258. if key == "LuaFile" then
  259. return filename;
  260. elseif key == "XmlFile" then
  261. print("configDesc.XMLFile" , configDesc.XMLFile);
  262. return configDesc.XMLFile;
  263. end
  264. return oldIndex(self , key);
  265. end
  266. end
  267. return luaCfg;
  268. end;