diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 101b645fd..fcdd96cbf 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -101,6 +101,8 @@ distribution. #include "df/specific_ref.h" #include "df/specific_ref_type.h" #include "df/vermin.h" +#include "df/report_init.h" +#include "df/report_zoom_type.h" #include #include @@ -1505,7 +1507,127 @@ static const LuaWrapper::FunctionReg dfhack_gui_module[] = { { NULL, NULL } }; +static int gui_autoDFAnnouncement(lua_State *state) +{ + int rv; + df::report_init *r = Lua::GetDFObject(state, 1); + + if (r) + { + std::string message = luaL_checkstring(state, 2); + + if (lua_gettop(state) >= 3) + rv = Gui::autoDFAnnouncement(*r, message, lua_toboolean(state, 3)); + else + rv = Gui::autoDFAnnouncement(*r, message); + } + else + { + df::coord pos; + int color; + bool bright, sparring, log_failures; + df::unit *unit1, *unit2; + + auto type = (df::announcement_type)lua_tointeger(state, 1); + Lua::CheckDFAssign(state, &pos, 2); + std::string message = luaL_checkstring(state, 3); + + switch (lua_gettop(state)) + { + default: + case 9: + log_failures = lua_toboolean(state, 9); + case 8: + sparring = lua_toboolean(state, 8); + case 7: + unit2 = Lua::CheckDFObject(state, 7); + case 6: + unit1 = Lua::CheckDFObject(state, 6); + case 5: + bright = lua_toboolean(state, 5); + case 4: + color = lua_tointeger(state, 4); + case 3: + break; + } + + switch (lua_gettop(state)) + { // Use the defaults in Gui.h + default: + case 9: + rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1, unit2, sparring, log_failures); + break; + case 8: + rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1, unit2, sparring); + break; + case 7: + rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1, unit2); + break; + case 6: + rv = Gui::autoDFAnnouncement(type, pos, message, color, bright, unit1); + break; + case 5: + rv = Gui::autoDFAnnouncement(type, pos, message, color, bright); + break; + case 4: + rv = Gui::autoDFAnnouncement(type, pos, message, color); + break; + case 3: + rv = Gui::autoDFAnnouncement(type, pos, message); + } + } + + lua_pushinteger(state, rv); + return 1; +} + +static int gui_pauseRecenter(lua_State *state) +{ + if (lua_gettop(state) == 2) + { + df::coord p; + Lua::CheckDFAssign(state, &p, 1); + Gui::pauseRecenter(p, lua_toboolean(state, 2)); + } + else + Gui::pauseRecenter(CheckCoordXYZ(state, 1, false), lua_toboolean(state, 4)); + + return 1; +} + +static int gui_recenterViewscreen(lua_State *state) +{ + df::coord p; + switch (lua_gettop(state)) + { + default: + case 4: + Gui::recenterViewscreen(CheckCoordXYZ(state, 1, false), (df::report_zoom_type)lua_tointeger(state, 4)); + break; + case 3: + Gui::recenterViewscreen(CheckCoordXYZ(state, 1, false)); + break; + case 2: + Lua::CheckDFAssign(state, &p, 1); + Gui::recenterViewscreen(p, (df::report_zoom_type)lua_tointeger(state, 2)); + break; + case 1: + if (lua_type(state, 1) == LUA_TNUMBER) + Gui::recenterViewscreen((df::report_zoom_type)lua_tointeger(state, 1)); + else + Gui::recenterViewscreen(CheckCoordXYZ(state, 1, true)); + break; + case 0: + Gui::recenterViewscreen(); + } + + return 1; +} + static const luaL_Reg dfhack_gui_funcs[] = { + { "autoDFAnnouncement", gui_autoDFAnnouncement }, + { "pauseRecenter", gui_pauseRecenter }, + { "recenterViewscreen", gui_recenterViewscreen }, { "getDwarfmodeViewDims", gui_getDwarfmodeViewDims }, { NULL, NULL } };