void IEditorComponent.BeforeSaveGame()
{
if (!IsPluginEnabled)
{
if (!File.Exists(Path.Combine(compiledir, "agslua.dll")))
{
TryDeleteFile("lua5.1.dll", compiledir);
}
if (!File.Exists(Path.Combine(debugdir, "agslua.dll")))
{
TryDeleteFile("lua5.1.dll", debugdir);
}
TryDeleteFile("lscripts.dat", compiledir);
return;
}
foreach (LuaScriptEditPane pane in editPanes.Values)
{
pane.Save();
}
if (!Directory.Exists(compiledir))
{
Directory.CreateDirectory(compiledir);
}
TryCopySiblingFileTo("lua5.1.dll", compiledir);
if (!Directory.Exists(debugdir))
{
Directory.CreateDirectory(debugdir);
}
TryCopySiblingFileTo("lua5.1.dll", debugdir);
string lscripts_dat_path = Path.Combine(compiledir, "lscripts.dat");
using (FileStream lscripts_dat = File.Open(lscripts_dat_path, FileMode.Create))
{
lscripts_dat.WriteByte(27);
lscripts_dat.Write(Encoding.ASCII.GetBytes("lscripts:"), 0, "lscripts:".Length);
Queue<string> codeQ = new Queue<string>();
codeQ.Enqueue("return {");
/*
codeQ.Enqueue("rooms = {");
foreach (UnloadedRoom room in _editor.CurrentGame.Rooms)
{
codeQ.Enqueue("[" + room.Number + "]={");
codeQ.Enqueue("objects = {");
_editor.RoomController.
foreach (RoomObject obj in )
{
codeQ.Enqueue("[" + obj.ID + "]=" + InvokeLua.util_quotestring(obj.Name) + ";");
}
codeQ.Enqueue("};"); // rooms[i].objects
codeQ.Enqueue("hotspots = {");
foreach (RoomHotspot hotspot in room.Hotspots)
{
codeQ.Enqueue("[" + hotspot.ID + "]=" + InvokeLua.util_quotestring(hotspot.Name) + ";");
}
codeQ.Enqueue("};"); // rooms[i].hotspots
codeQ.Enqueue("};"); // rooms[i]
}
codeQ.Enqueue("};"); // rooms
*/
codeQ.Enqueue("dialog={");
foreach (Dialog dialog in editor.CurrentGame.Dialogs)
{
codeQ.Enqueue("[" + dialog.ID + "]=" + InvokeLua.util_quotestring(dialog.Name) + ";");
}
codeQ.Enqueue("};"); // dialog
codeQ.Enqueue("audioclips={");
foreach (string clipname in HacksAndKludges.YieldAudioClipScriptNames(editor.CurrentGame))
{
codeQ.Enqueue(InvokeLua.util_quotestring(clipname) + ";");
}
codeQ.Enqueue("};");
codeQ.Enqueue("fonts={");
foreach (AGSFont font in editor.CurrentGame.Fonts)
{
codeQ.Enqueue("[" + font.ID + "]=" + InvokeLua.util_quotestring(font.ScriptID) + ";");
}
codeQ.Enqueue("};"); // fonts
codeQ.Enqueue("views={");
ProcessViewFolder readViews = null;
readViews =
delegate(IViewFolder folder)
{
foreach (AGSView view in folder.Views)
{
codeQ.Enqueue("[" + view.ID + "] = " + InvokeLua.util_quotestring(view.Name) + ";");
}
foreach (IViewFolder subfolder in folder.SubFolders)
{
readViews(subfolder);
}
};
readViews(editor.CurrentGame.Views);
codeQ.Enqueue("};"); // views
codeQ.Enqueue("cursors = {");
foreach (MouseCursor cursor in editor.CurrentGame.Cursors)
{
codeQ.Enqueue("[" + cursor.ID + "]=" + InvokeLua.util_quotestring(cursor.ScriptID) + ";");
}
codeQ.Enqueue("};"); // cursor
codeQ.Enqueue("gui = {");
foreach (GUI gui in editor.CurrentGame.GUIs)
{
codeQ.Enqueue("[" + gui.ID + "]={name=" + InvokeLua.util_quotestring(gui.Name) + ";");
foreach (GUIControl cnt in gui.Controls)
{
codeQ.Enqueue("[" + cnt.ID + "]={" +
"name=" + InvokeLua.util_quotestring(cnt.Name) + ";" +
"type=" + InvokeLua.util_quotestring(cnt.ControlType) + ";" +
"};");
}
codeQ.Enqueue("};"); // gui[i]
}
codeQ.Enqueue("};"); // gui
codeQ.Enqueue("inventory = {");
foreach (InventoryItem item in editor.CurrentGame.InventoryItems)
{
codeQ.Enqueue("[" + item.ID + "]=" + InvokeLua.util_quotestring(item.Name) + ";");
}
codeQ.Enqueue("};"); // inventory
codeQ.Enqueue("guid='");
Guid signature = Guid.NewGuid();
foreach (byte b in signature.ToByteArray())
{
codeQ.Enqueue(String.Format("\\{0}", b));
}
codeQ.Enqueue("';"); // end of guid
codeQ.Enqueue("files={");
foreach (ScriptEntry scriptEntry in scripts)
{
string path = scriptEntry.Value.file.FullName;
string key = scriptEntry.Key.Substring(SCRIPTS_ROOT.Length);
byte[] buf = File.ReadAllBytes(path);
if (InvokeLua.LUA_OK != InvokeLua.luaL_loadbuffer(main_L, buf, (size_t)buf.Length, scriptEntry.Value.ScriptPath))
{
string errorMessage = InvokeLua.lua_tostring(main_L, -1);
InvokeLua.lua_pop(main_L, 1);
InvokeLua.luaL_loadstring(main_L, "error(" + InvokeLua.util_quotestring(errorMessage) + ",2)");
}
byte[] compressedCompiled;
using (MemoryStream memStream = new MemoryStream())
using (ZOutputStream z_out = new ZOutputStream(memStream, 9))
{
InvokeLua.lua_Writer ZOutWriter =
delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
{
z_out.Write(data, 0, data.Length);
return 0;
};
InvokeLua.lua_dump(main_L, ZOutWriter, lua_State.Zero);
z_out.finish();
compressedCompiled = memStream.ToArray();
}
codeQ.Enqueue(String.Format("[{0}]=", InvokeLua.util_quotestring(key)));
codeQ.Enqueue("{");
codeQ.Enqueue(String.Format("offset={0};length={1};", lscripts_dat.Position, compressedCompiled.Length));
codeQ.Enqueue("};");
lscripts_dat.Write(compressedCompiled, 0, compressedCompiled.Length);
InvokeLua.lua_pop(main_L, 1);
}
codeQ.Enqueue("};"); // end of files
codeQ.Enqueue("modules={");
foreach (ScriptEntry scriptEntry in scripts)
{
string key = scriptEntry.Key.Substring(SCRIPTS_ROOT.Length);
codeQ.Enqueue("[" + InvokeLua.util_quotestring(scriptEntry.Value.ModuleName.ToLower()) + "]="
+ InvokeLua.util_quotestring(key) + ";");
}
codeQ.Enqueue("};"); // end of modules
if (compileTimeScripts.Count != 0)
{
lua_State temp_L = InvokeLua.luaL_newstate();
InvokeLua.lua_atpanic(temp_L, InvokeLua.ExceptionPanicHandler);
try
{
InvokeRunTimePlugin.PrepareForCompileTimeScripts(temp_L);
/*
InvokeLua.lua_getfield(temp_L, InvokeLua.LUA_REGISTRYINDEX, "lscripts");
int IDX_LSCRIPTS = InvokeLua.lua_gettop(temp_L);
InvokeLua.lua_getfield(temp_L, InvokeLua.LUA_REGISTRYINDEX, "lmodules");
int IDX_LMODULES = InvokeLua.lua_gettop(temp_L);
foreach (ScriptEntry scriptEntry in scripts)
{
InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.ScriptPath.ToLower());
InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.file.FullName);
InvokeLua.lua_rawset(temp_L, IDX_LSCRIPTS);
string moduleName = scriptEntry.Value.ModuleName;
if (moduleName != null)
{
InvokeLua.lua_pushstring(temp_L, moduleName);
InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.file.FullName);
InvokeLua.lua_rawset(temp_L, IDX_LMODULES);
}
}
InvokeLua.lua_pop(temp_L, 2); // remove lscripts, lmodules
*/
foreach (LuaScriptFileInfo script in compileTimeScripts)
{
if (InvokeLua.LUA_OK != InvokeLua.luaL_loadfile(temp_L, script.file.FullName))
{
MessageBox.Show(script.ScriptPath + " Compile Error:\n\n" + InvokeLua.lua_tostring(temp_L, -1));
InvokeLua.lua_pop(temp_L, -1);
}
else
{
if (InvokeLua.LUA_OK != InvokeLua.lua_pcall(temp_L, 0, 0, 0))
{
MessageBox.Show(script.ScriptPath + " Run Error:\n\n" + InvokeLua.lua_tostring(temp_L, -1));
InvokeLua.lua_pop(temp_L, 1);
}
}
}
codeQ.Enqueue("initstate=\"");
InvokeLua.lua_Writer initStateWrite =
delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
{
foreach (byte b in data)
{
codeQ.Enqueue(String.Format("\\{0}", b));
}
return 0;
};
InvokeRunTimePlugin.WriteInitState(temp_L, initStateWrite);
codeQ.Enqueue("\";");
}
finally
{
InvokeLua.lua_close(temp_L);
}
}
codeQ.Enqueue("};"); // end of data
InvokeLua.lua_Reader_RetString CodeQReader =
delegate(lua_State _L, IntPtr _data, ref size_t sz)
{
if (codeQ.Count == 0)
{
sz = size_t.Zero;
return "";
}
else
{
string fragment = codeQ.Dequeue();
sz = (size_t)fragment.Length;
return fragment;
}
};
if (InvokeLua.LUA_OK == InvokeLua.lua_load(main_L, CodeQReader, lua_State.Zero, "lscripts.dat"))
{
byte[] compressedCompiled;
using (MemoryStream memStream = new MemoryStream())
using (ZOutputStream z_out = new ZOutputStream(memStream, 9))
{
InvokeLua.lua_Writer Z_OutWriter =
delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
{
z_out.Write(data, 0, data.Length);
return 0;
};
InvokeLua.lua_dump(main_L, Z_OutWriter, lua_State.Zero);
z_out.finish();
compressedCompiled = memStream.ToArray();
}
byte[] offset_buf = BitConverter.GetBytes((long)lscripts_dat.Position);
byte[] length_buf = BitConverter.GetBytes((long)compressedCompiled.Length);
lscripts_dat.Write(compressedCompiled, 0, compressedCompiled.Length);
lscripts_dat.Write(offset_buf, 0, offset_buf.Length);
lscripts_dat.Write(length_buf, 0, length_buf.Length);
}
else
{
MessageBox.Show("Error compiling lscripts.dat");
}
}
}