/// <summary> /// gets the list of dependencies from modinfo.lua /// </summary> string[] GetDependenciesFromLua(string archiveName, string fileName) { var modInfoFile = Archive.ExtractTextFile(archiveName, fileName); var results = CLua.TraceDoString(L, 1, modInfoFile); return(results[0].GetLuaValues("depend").Select(v => v.ToString()).ToArray()); }
/// <summary> ///gets the list of dependencies from modinfo.tdf /// </summary> string[] GetDependenciesFromTdf(string archiveName, string fileName) { var modInfoText = Archive.ExtractTextFile(archiveName, fileName); Lua.lua_getglobal(L, "TDFparser"); // push the parser table on the stack Lua.lua_getfield(L, -1, "ParseText"); // push the parse string function var modInfoTable = CLua.TraceCall(L, 2, new LuaString(modInfoText)); // load the tdf from string var modInfo = modInfoTable[0].GetField("mod"); // get all existing "dependN" fields var dependencies = new List <string>(); var n = 0; while (true) { var field = modInfo.GetField("depend" + n++); if (field != null) { dependencies.Add(field.ToString()); } else { break; } } LuaValue.Pop(L, 1); return(dependencies.ToArray()); }
static LuaValue[] GetTdfTableFromString(IntPtr L, string fileString) { Lua.lua_getglobal(L, "TDFparser"); // push the parser table on the stack Lua.lua_getfield(L, -1, "ParseText"); // push the parse string function var ret = CLua.TraceCall(L, 2, new LuaString(fileString)); LuaValue.Pop(L, 1); return(ret); }
public static LuaValue[] Call(IntPtr L, int resultNumber, params LuaValue[] arguments) { Check(L, -1); Array.ForEach(arguments, a => a.Push(L)); CLua.CheckError(L, Lua.lua_pcall(L, arguments.Length, resultNumber, 0)); var ret = Enumerable.Range(0, resultNumber).Select(n => Read(L, -n - 1)).ToArray(); Array.Reverse(ret); return(ret); }
///<summary> /// creates a lua state and registers the TDF parser ///</summary> public static IntPtr GetLuaState(string springPath) { if (Path.HasExtension(springPath)) { throw new Exception("Invalid spring path"); } var L = Lua.luaL_newstate(); Lua.luaL_openlibs(L); var springContent = Path.Combine(springPath, @"base\springcontent.sdz"); var tdfParserString = Archive.ExtractTextFile(springContent, "gamedata/parse_tdf.lua"); CLua.DoStringPushReturn(L, tdfParserString, new ConstantResults(1)); Lua.lua_setglobal(L, "TDFParser"); return(L); }
static string GetTdfField(IntPtr L, string fieldName, string archivePath) { var archive = Archive.Open(archivePath); var tdfFile = FindModInfo(archive, "tdf"); if (tdfFile != null) { var modInfoTable = GetTdfTableFromString(L, Archive.ExtractTextFile(archivePath, tdfFile)); if (modInfoTable[0] is LuaNil) { throw new Exception(String.Format("Error in file {0}: {1}", archivePath, modInfoTable[1])); } var modInfo = modInfoTable[0].GetField("mod"); if (modInfo == null) { return(null); } var field = modInfo.GetField(fieldName); if (field == null) { return(null); } return(field.ToString()); } var luaFile = FindModInfo(archive, "lua"); if (luaFile != null) { var modinfo = Archive.ExtractTextFile(archivePath, luaFile); var result = CLua.TraceDoString(L, 1, modinfo)[0].GetField(fieldName); if (result == null) { return(null); } return(result.ToString()); } return(null); }
/// <summary> /// creates a lua state and registers functions commonly used in lua defs /// </summary> static IntPtr GetLuaStpringState(Dictionary <string, IArchiveFileData> fileMap) { var L = Lua.luaL_newstate(); Lua.luaL_openlibs(L); // it seems CA makes lowerkeys global, so lets do the same // push the system table CLua.DoStringPushReturn(L, fileMap["gamedata/system.lua"].Text, new ConstantResults(1)); // get the lowerkeys field from the system table and push it Lua.lua_pushstring(L, "lowerkeys"); Lua.lua_gettable(L, -2); // set the lowerkeys function as global Lua.lua_setglobal(L, "lowerkeys"); Lua.lua_CFunction VFS_Include = l => { var path = CLua.ExpectArgs(l, 1)[0].ToString(); IArchiveFileData file; if (!fileMap.TryGetValue(path, out file)) { throw new Exception("path not found: " + path); } CLua.DoStringPushReturn(l, file.Text, new ConstantResults(1)); return(1); }; Lua.lua_CFunction VFS_LoadFile = l => { var path = CLua.ExpectArgs(l, 1)[0].ToString(); IArchiveFileData file; if (!fileMap.TryGetValue(path, out file)) { throw new Exception("path not found: " + path); } return(CLua.ReturnValues(l, new LuaString(file.Text))); }; Lua.lua_CFunction VFS_FileExists = l => { var path = CLua.ExpectArgs(l, 1)[0].ToString(); return(CLua.ReturnValues(l, new LuaBoolean(fileMap.ContainsKey(path)))); }; Lua.lua_CFunction VFS_DirList = l => { var args = CLua.ExpectArgs(l, 2); var path = args[0].ToString().ToLower(); var mask = args[1].ToString().ToLower().Substring(1); var i = 0; var files = from s in fileMap.Keys where s.StartsWith(path) && s.EndsWith(mask) let arrayIndex = new LuaNumber(i++) select new KeyValuePair <LuaValue, LuaValue>(arrayIndex, new LuaString(s)); return(CLua.ReturnValues(l, new LuaTable(files))); }; Lua.lua_CFunction Spring_TimeCheck = l => { var desc = LuaValue.Read(l, 1).ToString(); Lua.lua_pushvalue(l, 2); var sw = Stopwatch.StartNew(); CLua.TraceCallPushReturn(l, new ConstantResults(0)); Trace.TraceInformation(desc + " " + sw.Elapsed); // call function on top, push return values on stack return(0); }; Lua.lua_CFunction Spring_Echo = l => CLua.Print(s => Trace.WriteLine(s), l); // morphs defs crash if they can't figure out what kind of commander we're using (why do we need morph defs anyway, here?) Lua.lua_CFunction Spring_GetModOptions = l => { var data = new KeyValuePair <LuaValue, LuaValue>(new LuaString("commtype"), new LuaString("default")); return(CLua.ReturnValues(l, new LuaTable(new[] { data }))); }; var springFunctions = new List <KeyValuePair <LuaValue, LuaValue> > { new KeyValuePair <LuaValue, LuaValue>(new LuaString("TimeCheck"), new LuaFunction(Spring_TimeCheck)), new KeyValuePair <LuaValue, LuaValue>(new LuaString("Echo"), new LuaFunction(Spring_Echo)), new KeyValuePair <LuaValue, LuaValue>(new LuaString("GetModOptions"), new LuaFunction(Spring_GetModOptions)), }; CLua.SetGlobal(L, "Spring", new LuaTable(springFunctions)); var vfsFunctions = new List <KeyValuePair <LuaValue, LuaValue> > { new KeyValuePair <LuaValue, LuaValue>(new LuaString("Include"), new LuaFunction(VFS_Include)), new KeyValuePair <LuaValue, LuaValue>(new LuaString("LoadFile"), new LuaFunction(VFS_LoadFile)), new KeyValuePair <LuaValue, LuaValue>(new LuaString("FileExists"), new LuaFunction(VFS_FileExists)), new KeyValuePair <LuaValue, LuaValue>(new LuaString("DirList"), new LuaFunction(VFS_DirList)), }; CLua.SetGlobal(L, "VFS", new LuaTable(vfsFunctions)); return(L); }
public override void Push(IntPtr L) { Lua.lua_pushboolean(L, CLua.CBool(Value)); }