From 6a8c92e088157d170af7d3d2ef8b2ba701cf1b67 Mon Sep 17 00:00:00 2001 From: Warmist Date: Tue, 9 Aug 2011 02:46:32 +0300 Subject: [PATCH] versionInfo wrapper, no offsetgroup methods yet --- plugins/Dfusion/dfusion.cpp | 16 +- plugins/Dfusion/include/lua_VersionInfo.h | 4 +- plugins/Dfusion/include/luaxx.hpp | 6 +- plugins/Dfusion/luafiles/offsets.lua | 10 +- plugins/Dfusion/src/lua_VersionInfo.cpp | 214 ++++++++++++++++++++++ 5 files changed, 236 insertions(+), 14 deletions(-) diff --git a/plugins/Dfusion/dfusion.cpp b/plugins/Dfusion/dfusion.cpp index 67e09b07c..2a013328d 100644 --- a/plugins/Dfusion/dfusion.cpp +++ b/plugins/Dfusion/dfusion.cpp @@ -15,7 +15,8 @@ #include "lua_Console.h" #include "lua_Process.h" #include "lua_Hexsearch.h" -#include "lua_Misc.h" +#include "lua_Misc.h" +#include "lua_VersionInfo.h" #include "functioncall.h" using std::vector; @@ -40,25 +41,26 @@ DFhackCExport command_result plugin_init ( Core * c, std::vector lua::RegisterConsole(lua::glua::Get(),&c->con); lua::RegisterProcess(lua::glua::Get(),c->p); lua::RegisterHexsearch(lua::glua::Get()); - lua::RegisterMisc(lua::glua::Get()); + lua::RegisterMisc(lua::glua::Get()); + lua::RegisterVersionInfo(lua::glua::Get()); commands.push_back(PluginCommand("dfusion","Init dfusion system.",dfusion)); commands.push_back(PluginCommand("lua", "Run interactive interpreter.\ \n Options: = run instead",lua_run)); - + mymutex=new tthread::mutex; return CR_OK; } DFhackCExport command_result plugin_shutdown ( Core * c ) { - + // shutdown stuff delete mymutex; return CR_OK; } DFhackCExport command_result plugin_onupdate ( Core * c ) -{ +{ uint64_t time2 = GetTimeMs64(); uint64_t delta = time2-timeLast; if(delta<100) @@ -91,7 +93,7 @@ void InterpreterLoop(Core* c) string curline; con.print("Type quit to exit interactive mode\n"); con.lineedit(">>",curline); - + while (curline!="quit") { con.history_add(curline); try @@ -140,7 +142,7 @@ DFhackCExport command_result dfusion (Core * c, vector & parameters) Console &con=c->con; mymutex->lock(); lua::state s=lua::glua::Get(); - + try{ s.loadfile("dfusion/init.lua"); //load script s.pcall(0,0);// run it diff --git a/plugins/Dfusion/include/lua_VersionInfo.h b/plugins/Dfusion/include/lua_VersionInfo.h index e45e34a21..3ab877c88 100644 --- a/plugins/Dfusion/include/lua_VersionInfo.h +++ b/plugins/Dfusion/include/lua_VersionInfo.h @@ -2,9 +2,11 @@ #define LUA_VERSIONINFO_H #include #include - +#include "luamain.h" namespace lua { + +void RegisterVersionInfo(lua::state &st); } #endif diff --git a/plugins/Dfusion/include/luaxx.hpp b/plugins/Dfusion/include/luaxx.hpp index f1873949b..40e26e376 100644 --- a/plugins/Dfusion/include/luaxx.hpp +++ b/plugins/Dfusion/include/luaxx.hpp @@ -28,7 +28,11 @@ #define lua_Integer_long 1 #define lua_Integer_int 1 -#include +extern "C" { +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" +} #include #include #include diff --git a/plugins/Dfusion/luafiles/offsets.lua b/plugins/Dfusion/luafiles/offsets.lua index 774e85942..9d684b62a 100644 --- a/plugins/Dfusion/luafiles/offsets.lua +++ b/plugins/Dfusion/luafiles/offsets.lua @@ -1,11 +1,11 @@ function f_dwarves() - --pos_=offsets.findall(0,0x07,0,0,0) --search pattern - --for _,v in pairs(pos_) do - -- print(string.format("Possible hit:%x",v)) - --end - pos=offsets.find(0,0x07,0,0,0) --search pattern + pos_=offsets.findall(0,0x24,0x14,0x07,0,0,0) --search pattern + for _,v in pairs(pos_) do + print(string.format("Possible hit:%x",v)) + end + pos=offsets.find(0,0x24,0x14,0x07,0,0,0,0xeb,0x08,0x8d) --search pattern print(string.format("Start dwarf position:%x",pos)) if pos~=0 then return pos+2-offsets.base(); diff --git a/plugins/Dfusion/src/lua_VersionInfo.cpp b/plugins/Dfusion/src/lua_VersionInfo.cpp index 1d0cd6bed..f2ef9d82d 100644 --- a/plugins/Dfusion/src/lua_VersionInfo.cpp +++ b/plugins/Dfusion/src/lua_VersionInfo.cpp @@ -1 +1,215 @@ #include "lua_VersionInfo.h" +static int __lua_getMD5(lua_State *S) +{ + lua::state st(S); + std::string output; + bool ret=DFHack::Core::getInstance().vinfo->getMD5(output); + st.push(ret); + st.push(output); + return 2; +} +static int __lua_getPE(lua_State *S) +{ + lua::state st(S); + uint32_t output; + bool ret=DFHack::Core::getInstance().vinfo->getPE(output); + st.push(ret); + st.push(output); + return 2; +} +static int __lua_PrintOffsets(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->PrintOffsets(); + st.push(output); + return 1; +} +static int __lua_getMood(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getMood(st.as(1)); + st.push(output); + return 1; +} +/*static int __lua_getString(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getString(st.as(1)); + st.push(output); + return 1; +}*/ +static int __lua_getProfession(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getProfession(st.as(1)); + st.push(output); + return 1; +} +static int __lua_getJob(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getJob(st.as(1)); + st.push(output); + return 1; +} +static int __lua_getSkill(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getSkill(st.as(1)); + st.push(output); + return 1; +} +static int __lua_getTrait(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getTrait(st.as(1),st.as(2)); + st.push(output); + return 1; +} +static int __lua_getTraitName(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getTraitName(st.as(1)); + st.push(output); + return 1; +} +static int __lua_getLabor(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getLabor(st.as(1)); + st.push(output); + return 1; +} +static int __lua_getAllTraits(lua_State *S) +{ + lua::state st(S); + std::vector< std::vector > output=DFHack::Core::getInstance().vinfo->getAllTraits(); + st.newtable(); + for(size_t i=0;i output=DFHack::Core::getInstance().vinfo->getAllLabours(); + st.newtable(); + for(std::map::iterator it=output.begin();it!=output.end();it++) + { + st.push(it->first); + st.push(it->second); + st.settable(); + } + return 1; +} +static int __lua_getLevelInfo(lua_State *S) +{ + lua::state st(S); + DFHack::t_level output=DFHack::Core::getInstance().vinfo->getLevelInfo(st.as(1)); + st.newtable(); + st.push(output.level); + st.setfield("level"); + st.push(output.name); + st.setfield("name"); + st.push(output.xpNxtLvl); + st.setfield("xpNxtLvl"); + return 1; +} +static int __lua_getVersion(lua_State *S) +{ + lua::state st(S); + std::string output=DFHack::Core::getInstance().vinfo->getVersion(); + st.push(output); + return 1; +} +static int __lua_getOS(lua_State *S) +{ + lua::state st(S); + DFHack::OSType output=DFHack::Core::getInstance().vinfo->getOS(); + st.push(output); + return 1; +} +static int __lua_resolveObjectToClassID(lua_State *S) +{ + lua::state st(S); + int32_t ret; + bool output=DFHack::Core::getInstance().vinfo->resolveObjectToClassID(st.as(1),ret); + st.push(output); + st.push(ret); + return 2; +} +static int __lua_resolveClassnameToClassID(lua_State *S) +{ + lua::state st(S); + int32_t ret; + bool output=DFHack::Core::getInstance().vinfo->resolveClassnameToClassID(st.as(1),ret); + st.push(output); + st.push(ret); + return 2; +} +static int __lua_resolveClassnameToVPtr(lua_State *S) +{ + lua::state st(S); + void * ret; + bool output=DFHack::Core::getInstance().vinfo->resolveClassnameToVPtr(st.as(1),ret); + st.push(output); + st.pushlightuserdata(ret); + return 2; +} +static int __lua_resolveClassIDToClassname(lua_State *S) +{ + lua::state st(S); + std::string ret; + bool output=DFHack::Core::getInstance().vinfo->resolveClassIDToClassname(st.as(1),ret); + st.push(output); + st.push(ret); + return 2; +} +#define ___m(x) {#x,__lua_##x} +const luaL_Reg lua_vinfo_func[]= +{ + ___m(getMD5), + ___m(getPE), + ___m(PrintOffsets), + ___m(getMood), +// ___m(getString), + ___m(getProfession), + ___m(getJob), + ___m(getSkill), + ___m(getTrait), + ___m(getTraitName), + ___m(getLabor), + ___m(getAllTraits), + ___m(getAllLabours), + ___m(getLevelInfo), + ___m(getVersion), + ___m(getOS), + ___m(resolveObjectToClassID), + ___m(resolveClassnameToClassID), + ___m(resolveClassnameToVPtr), + ___m(resolveClassIDToClassname), + {NULL,NULL} +}; +#undef ___m +void lua::RegisterVersionInfo(lua::state &st) +{ + st.getglobal("VersionInfo"); + if(st.is()) + { + st.pop(); + st.newtable(); + } + + lua::RegFunctionsLocal(st, lua_vinfo_func); + st.setglobal("VersionInfo"); +}