|
|
@ -6,16 +6,11 @@
|
|
|
|
#include <vector>
|
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "tinythread.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "luamain.h"
|
|
|
|
#include "luamain.h"
|
|
|
|
#include "lua_Process.h"
|
|
|
|
#include "lua_Process.h"
|
|
|
|
#include "lua_Hexsearch.h"
|
|
|
|
#include "lua_Hexsearch.h"
|
|
|
|
#include "lua_Misc.h"
|
|
|
|
#include "lua_Misc.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "DataDefs.h"
|
|
|
|
#include "DataDefs.h"
|
|
|
|
#include "LuaTools.h"
|
|
|
|
#include "LuaTools.h"
|
|
|
|
|
|
|
|
|
|
|
@ -23,112 +18,51 @@ using std::vector;
|
|
|
|
using std::string;
|
|
|
|
using std::string;
|
|
|
|
using namespace DFHack;
|
|
|
|
using namespace DFHack;
|
|
|
|
|
|
|
|
|
|
|
|
static tthread::mutex* mymutex=0;
|
|
|
|
|
|
|
|
static tthread::thread* thread_dfusion=0;
|
|
|
|
|
|
|
|
uint64_t timeLast=0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DFHACK_PLUGIN("dfusion")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
command_result dfusion (color_ostream &out, std::vector <std::string> ¶meters);
|
|
|
|
DFHACK_PLUGIN("dfusion")
|
|
|
|
command_result dfuse (color_ostream &out, std::vector <std::string> ¶meters);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DFhackCExport const char * plugin_name ( void )
|
|
|
|
static int loadObjectFile(lua_State* L)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return "dfusion";
|
|
|
|
std::string path;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
path=luaL_checkstring(L,1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OutFile::File f(path);
|
|
|
|
|
|
|
|
lua_newtable(L);
|
|
|
|
|
|
|
|
int table_pos=lua_gettop(L);
|
|
|
|
|
|
|
|
size_t size=f.GetTextSize();
|
|
|
|
|
|
|
|
Lua::Push(L,size);
|
|
|
|
|
|
|
|
lua_setfield(L,table_pos,"data_size");
|
|
|
|
|
|
|
|
char* buf=new char[size];
|
|
|
|
|
|
|
|
f.GetText(buf);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Lua::PushDFObject(L,DFHack::,buf);
|
|
|
|
|
|
|
|
//Lua::Push(L,buf);
|
|
|
|
|
|
|
|
lua_pushlightuserdata(L,buf);
|
|
|
|
|
|
|
|
lua_setfield(L,table_pos,"data");
|
|
|
|
|
|
|
|
OutFile::vSymbol& symbols=f.GetSymbols();
|
|
|
|
|
|
|
|
lua_newtable(L);
|
|
|
|
|
|
|
|
for(size_t i=0;i<symbols.size();i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Lua::Push(L,i);
|
|
|
|
|
|
|
|
lua_newtable(L);
|
|
|
|
|
|
|
|
Lua::Push(L,symbols[i].name);
|
|
|
|
|
|
|
|
lua_setfield(L,-2,"name");
|
|
|
|
|
|
|
|
Lua::Push(L,symbols[i].pos);
|
|
|
|
|
|
|
|
lua_setfield(L,-2,"pos");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lua_settable(L,-3);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
lua_setfield(L,table_pos,"symbols");
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DFHACK_PLUGIN_LUA_COMMANDS {
|
|
|
|
DFhackCExport command_result plugin_init (color_ostream &out, std::vector <PluginCommand> &commands)
|
|
|
|
DFHACK_LUA_COMMAND(loadObjectFile),
|
|
|
|
|
|
|
|
DFHACK_LUA_END
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_init ( color_ostream &out, std::vector <PluginCommand> &commands)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
lua::state st=lua::glua::Get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//maybe remake it to run automatically
|
|
|
|
|
|
|
|
Lua::Open(out, st);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lua::RegisterProcess(st);
|
|
|
|
|
|
|
|
lua::RegisterHexsearch(st);
|
|
|
|
|
|
|
|
lua::RegisterMisc(st);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef LINUX_BUILD
|
|
|
|
|
|
|
|
st.push(1);
|
|
|
|
|
|
|
|
st.setglobal("LINUX");
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
st.push(1);
|
|
|
|
|
|
|
|
st.setglobal("WINDOWS");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
commands.push_back(PluginCommand("dfusion","Run dfusion system (interactive i.e. can input further commands).",dfusion,true));
|
|
|
|
|
|
|
|
commands.push_back(PluginCommand("dfuse","Init dfusion system (not interactive).",dfuse,false));
|
|
|
|
|
|
|
|
mymutex=new tthread::mutex;
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_shutdown ( Core * c )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// shutdown stuff
|
|
|
|
|
|
|
|
if(thread_dfusion)
|
|
|
|
|
|
|
|
delete thread_dfusion;
|
|
|
|
|
|
|
|
delete mymutex;
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_onupdate_DISABLED ( Core * c )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
uint64_t time2 = GetTimeMs64();
|
|
|
|
|
|
|
|
uint64_t delta = time2-timeLast;
|
|
|
|
|
|
|
|
if(delta<100)
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
|
|
|
timeLast = time2;
|
|
|
|
|
|
|
|
mymutex->lock();
|
|
|
|
|
|
|
|
lua::state s=lua::glua::Get();
|
|
|
|
|
|
|
|
s.getglobal("OnTick");
|
|
|
|
|
|
|
|
if(s.is<lua::function>())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try{
|
|
|
|
|
|
|
|
s.pcall();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch(lua::exception &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
c->getConsole().printerr("Error OnTick:%s\n",e.what());
|
|
|
|
|
|
|
|
c->getConsole().printerr("%s\n",lua::DebugDump(lua::glua::Get()).c_str());
|
|
|
|
|
|
|
|
c->getConsole().msleep(1000);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
s.settop(0);
|
|
|
|
|
|
|
|
mymutex->unlock();
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void RunDfusion(color_ostream &out, std::vector <std::string> ¶meters)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
mymutex->lock();
|
|
|
|
|
|
|
|
lua::state s=lua::glua::Get();
|
|
|
|
|
|
|
|
try{
|
|
|
|
|
|
|
|
s.loadfile("dfusion/init.lua"); //load script
|
|
|
|
|
|
|
|
for(size_t i=0;i<parameters.size();i++)
|
|
|
|
|
|
|
|
s.push(parameters[i]);
|
|
|
|
|
|
|
|
Lua::SafeCall(out, s, parameters.size(),0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch(lua::exception &e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
out.printerr("Error:%s\n",e.what());
|
|
|
|
|
|
|
|
out.printerr("%s\n",lua::DebugDump(lua::glua::Get()).c_str());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
s.settop(0);// clean up
|
|
|
|
|
|
|
|
mymutex->unlock();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
command_result dfuse(color_ostream &out, std::vector <std::string> ¶meters)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
lua::state s=lua::glua::Get();
|
|
|
|
|
|
|
|
s.push(1);
|
|
|
|
|
|
|
|
s.setglobal("INIT");
|
|
|
|
|
|
|
|
RunDfusion(out,parameters);
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
command_result dfusion (color_ostream &out, std::vector <std::string> ¶meters)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
lua::state s=lua::glua::Get();
|
|
|
|
|
|
|
|
s.push();
|
|
|
|
|
|
|
|
s.setglobal("INIT");
|
|
|
|
|
|
|
|
RunDfusion(out,parameters);
|
|
|
|
|
|
|
|
return CR_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|