From 494c00713b0c55ff2336a34f8afc78fdcf633948 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 6 Apr 2014 22:24:14 +0000 Subject: [PATCH] Mapster32/Lunatic: add functionality to connect Lua funcs to s.bar menu [;]+[F]. Hook up those from test/shadexfog.lua and some debugging ones from engine.lua. git-svn-id: https://svn.eduke32.com/eduke32@4419 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/astub.c | 72 +++++++++ polymer/eduke32/source/lunatic/dynsymlist | 1 + polymer/eduke32/source/lunatic/dynsymlist_m32 | 4 + polymer/eduke32/source/lunatic/engine.lua | 57 +++++++ .../eduke32/source/lunatic/test/shadexfog.lua | 146 +++++++++++++++++- polymer/eduke32/source/mapster32.h | 3 + 6 files changed, 281 insertions(+), 2 deletions(-) diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index 8dd7a2cf0..5721455e7 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -8019,6 +8019,12 @@ static void Keys2d(void) { FuncMenu(); } +#ifdef LUNATIC + else if (keystatus[KEYSC_SEMI] && PRESSED_KEYSC(F)) // ; F + { + LuaFuncMenu(); + } +#endif else if (!eitherALT && PRESSED_KEYSC(F)) { if (pointhighlight < 16384 && tcursectornum>=0 && graphicsmode) @@ -12969,6 +12975,15 @@ typedef struct StatusBarMenu_ { #define MENU_INITIALIZER(MenuName, CustomStartIndex, ProcessFunc, ...) \ { MenuName, CustomStartIndex, CustomStartIndex, ProcessFunc, {}, ## __VA_ARGS__ } +#ifdef LUNATIC +static void M_Clear(StatusBarMenu *m) +{ + m->numentries = 0; + Bmemset(m->auxdata, 0, sizeof(m->auxdata)); + Bmemset(m->name, 0, sizeof(m->name)); +} +#endif + static void M_UnregisterFunction(StatusBarMenu *m, intptr_t auxdata) { int32_t i, j; @@ -13051,6 +13066,12 @@ static void M_EnterMainLoop(StatusBarMenu *m) int32_t crowmax[3] = {-1, -1, -1}; int32_t xpos = 8, ypos = MENU_BASE_Y+16; + if (m->numentries == 0) + { + printmessage16("%s menu has no entries", m->menuname); + return; + } + Bmemset(disptext, 0, sizeof(disptext)); Bassert((unsigned)m->numentries <= MENU_MAX_ENTRIES); @@ -13388,3 +13409,54 @@ static void FuncMenu_Process(const StatusBarMenu *m, int32_t col, int32_t row) } // switch (col) } + +#ifdef LUNATIC +typedef const char *(*luamenufunc_t)(void); + +static int32_t g_numLuaFuncs = 0; +static luamenufunc_t g_LuaFuncPtrs[MENU_MAX_ENTRIES]; + +static void LuaFuncMenu_Process(const StatusBarMenu *m, int32_t col, int32_t row) +{ + luamenufunc_t func = g_LuaFuncPtrs[col*8 + row]; + const char *errmsg; + + Bassert(func != NULL); + errmsg = func(); + + if (errmsg == NULL) + { + printmessage16("Lua function executed successfully"); + } + else + { + printmessage16("There were errors executing the Lua function, see OSD"); + OSD_Printf("Errors executing Lua function \"%s\": %s\n", m->name[col*8 + row], errmsg); + } +} + +static StatusBarMenu g_LuaFuncMenu = MENU_INITIALIZER_EMPTY("Lua functions", LuaFuncMenu_Process); + +static void LuaFuncMenu(void) +{ + M_EnterMainLoop(&g_LuaFuncMenu); +} + +LUNATIC_EXTERN void LM_Register(const char *name, luamenufunc_t funcptr) +{ + if (name == NULL || g_numLuaFuncs == MENU_MAX_ENTRIES) + return; + + g_LuaFuncPtrs[g_numLuaFuncs] = funcptr; + M_RegisterFunction(&g_LuaFuncMenu, name, g_numLuaFuncs); + g_numLuaFuncs++; +} + +LUNATIC_EXTERN void LM_Clear(void) +{ + M_Clear(&g_LuaFuncMenu); + + g_numLuaFuncs = 0; + Bmemset(g_LuaFuncPtrs, 0, sizeof(g_LuaFuncPtrs)); +} +#endif diff --git a/polymer/eduke32/source/lunatic/dynsymlist b/polymer/eduke32/source/lunatic/dynsymlist index d15c6e4c2..c5ee4e148 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist +++ b/polymer/eduke32/source/lunatic/dynsymlist @@ -17,6 +17,7 @@ numyaxbunches; spritesortcnt; guniqhudid; +qsetmode; rendmode; totalclock; randomseed; diff --git a/polymer/eduke32/source/lunatic/dynsymlist_m32 b/polymer/eduke32/source/lunatic/dynsymlist_m32 index 6389066da..51527c704 100644 --- a/polymer/eduke32/source/lunatic/dynsymlist_m32 +++ b/polymer/eduke32/source/lunatic/dynsymlist_m32 @@ -17,6 +17,7 @@ numyaxbunches; spritesortcnt; guniqhudid; +qsetmode; rendmode; totalclock; randomseed; @@ -108,7 +109,10 @@ luaJIT_BC_dis_x64; g_argv; +_getnumber16; listsearchpath; +LM_Register; +LM_Clear; basepaltable; }; diff --git a/polymer/eduke32/source/lunatic/engine.lua b/polymer/eduke32/source/lunatic/engine.lua index 82af72fd3..e6ef2e29c 100644 --- a/polymer/eduke32/source/lunatic/engine.lua +++ b/polymer/eduke32/source/lunatic/engine.lua @@ -16,6 +16,7 @@ local ismapster32 = (C.LUNATIC_CLIENT == C.LUNATIC_CLIENT_MAPSTER32) ---------- decl[[ +const int32_t qsetmode; int32_t getclosestcol_lim(int32_t r, int32_t g, int32_t b, int32_t lastokcol); char *palookup[256]; // MAXPALOOKUPS uint8_t palette[768]; @@ -27,6 +28,16 @@ void setblendtab(int32_t blend, const char *tab); int32_t setpalookup(int32_t palnum, const uint8_t *shtab); ]] +if (ismapster32) then + ffi.cdef[[ +int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, const char *(func)(int32_t)); + +typedef const char *(*luamenufunc_t)(void); +void LM_Register(const char *name, luamenufunc_t funcptr); +void LM_Clear(void); +]] +end + ---------- @@ -419,6 +430,52 @@ if (ismapster32) then end end end + + -- Interfaces to Mapster32's status bar menu + + local pcall = pcall + + function engine.clearMenu() + C.LM_Clear() + end + + function engine.registerMenuFunc(name, func) + if (type(name) ~= "string") then + error("invalid argument #1: must be a string", 2) + end + if (type(func) ~= "function") then + error("invalid argument #2: must be a function", 2) + end + + local safefunc = function() + local ok, errmsg = pcall(func) + if (not ok) then + return errmsg + end + end + + C.LM_Register(name, safefunc) + end + + engine.GETNUMFLAG = { + NEG_ALLOWED = 1, + AUTOCOMPL_NAMES = 2, + AUTOCOMPL_TAGLAB = 4, + RET_M1_ON_CANCEL = 8, + + NEXTFREE = 16, + } + + function engine.getnumber16(namestart, num, maxnumber, flags) + if (C.qsetmode == 200) then + error("getnumber16 must be called from 2D mode", 2) + end + if (type(namestart)~="string") then + error("invalid argument #1: must be a string", 2) + end + + return C._getnumber16(namestart, num, maxnumber, flags, nil) + end end diff --git a/polymer/eduke32/source/lunatic/test/shadexfog.lua b/polymer/eduke32/source/lunatic/test/shadexfog.lua index d22d9e3df..69eb3dd24 100644 --- a/polymer/eduke32/source/lunatic/test/shadexfog.lua +++ b/polymer/eduke32/source/lunatic/test/shadexfog.lua @@ -12,6 +12,7 @@ local error = error local print = print local printf = printf local type = type +local unpack = unpack local bit = require("bit") local math = require("math") @@ -106,7 +107,7 @@ end -- Translate the whole map for use with a shade-x-fog palookup set. -- .pal becomes the + former .shade -- .shade becomes the [0 .. 31] --- If is passed, set all sector's visibility to that value. +-- If is passed and >= 0, set all sector's visibility to that value. -- -- Notes: -- - auto-detects when the translation has been applied with the *same* @@ -116,7 +117,7 @@ function shadexfog.translate(startpalnum, fogintensity, vis) for i=0,gv.numsectors-1 do trans(sector[i].ceiling, startpalnum, fogintensity) trans(sector[i].floor, startpalnum, fogintensity) - if (vis) then + if (vis and vis >= 0) then sector[i].visibility = vis end end @@ -409,6 +410,147 @@ function shadexfog.create_additive_trans(startblendidx, numtables, fullbrightsOK end +-- Mapster32 Lua menu hooks +local getnumber16 = engine.getnumber16 +local GNF = engine.GETNUMFLAG +local GNF_BOOL = GNF.NEXTFREE + +local df = GNF.RET_M1_ON_CANCEL -- default getnumber16() flags + +local MAXUSERPALOOKUP = 256-1-8 -- KEEPINSYNC engine.lua:check_palidx() + +-- wrapped_func = CreateMenuFunction(argdesc) +-- +-- : table with [0]= and then, entries { name, init, max [, noret] } +function CreateMenuFunction(argdesc) + return function() + local func = argdesc[0] + assert(type(func) == "function") + local args = {} + + for i=1,#argdesc do + local ad = argdesc[i] + assert(type(ad) == "table" and #ad == 3 or #ad == 4) + + local moreflags = ad[4] or 0 + args[i] = getnumber16(ad[1]..": ", ad[2], ad[3], bit.bor(df, moreflags)) + if (bit.band(moreflags, GNF.NEG_ALLOWED)==0 and args[i] < 0) then + return + end + if (bit.band(moreflags, GNF_BOOL)~=0) then + args[i] = (args[i] > 0) + end + end + + func(unpack(args)) + end +end + +engine.clearMenu() + +engine.registerMenuFunc( + "Create shadexfog palset", + CreateMenuFunction{ + [0] = shadexfog.create, + { "Starting palnum", 100, MAXUSERPALOOKUP-31 }, + { "Red fog color [0-63]", 0, 63 }, + { "Green fog color [0-63]", 0, 63 }, + { "Blue fog color [0-63]", 0, 63 }, + } +) + +engine.registerMenuFunc( + "Translate map for shxfog", + CreateMenuFunction{ + [0] = shadexfog.translate, + { "Starting palnum", 100, MAXUSERPALOOKUP-31 }, + { "Fog intensity [0-31]", 0, 31 }, + { "Change all sectors' visibility to (Esc: don't)", 0, 255, GNF.NEG_ALLOWED }, + } +) + +engine.registerMenuFunc( + "Change pal of everything", + CreateMenuFunction{ + [0] = shadexfog.challpal, + { "Pal to change to", 0, MAXUSERPALOOKUP }, + } +) + +engine.registerMenuFunc( + "Create alpha trans. tabs", + CreateMenuFunction{ + [0] = shadexfog.create_alpha_trans, + { "Starting blendnum", 1, 255 }, + { "Number of blending tables", 32, 255 }, + { "Fullbright result colors OK?", 0, 1, GNF_BOOL }, + } +) + +engine.registerMenuFunc( + "Create addtv. trans. tabs", + CreateMenuFunction{ + [0] = shadexfog.create_additive_trans, + { "Starting blendnum", 1, 255 }, + { "Number of blending tables", 32, 255 }, + { "Fullbright result colors OK?", 0, 1, GNF_BOOL }, + } +) + +engine.registerMenuFunc( + "Create base shade table", + CreateMenuFunction{ + [0] = shadexfog.create0, + { "Pal number", 100, MAXUSERPALOOKUP }, + { "Second attempt?", 1, 1, GNF_BOOL }, + } +) + +engine.registerMenuFunc( + "Create depth shade tab", + CreateMenuFunction{ + [0] = shadexfog.create_depth_shtab, + { "Pal number", 100, MAXUSERPALOOKUP }, + } +) + +engine.registerMenuFunc( + "Create vismarker sh. tab", + CreateMenuFunction{ + [0] = shadexfog.create_vismarker_shtab, + { "Pal number", 100, MAXUSERPALOOKUP }, + } +) + +engine.registerMenuFunc( + "Create c.index remapping", + function() + local palnum = getnumber16("Pal number: ", 100, MAXUSERPALOOKUP, df) + if (palnum < 0) then return end + + local remaptab = {} + while (true) do + local srchex = getnumber16("Source hexadecatuple (0: finish): ", 0, 14, df) + if (srchex < 0) then return end + local dsthex = getnumber16("Destn. hexadecatuple (0: finish): ", 0, 14, df) + if (dsthex < 0) then return end + + if (srchex == 0 and dsthex == 0) then + break + end + + remaptab[srchex] = dsthex + end + + shadexfog.createremap(palnum, remaptab) + end +) + +engine.registerMenuFunc("_________DEBUG_________", function() end) +engine.registerMenuFunc("Setup dbg. water basepal", engine.setupDebugBasePal) +engine.registerMenuFunc("Linearize default basep.", engine.linearizeBasePal) + + do return shadexfog end diff --git a/polymer/eduke32/source/mapster32.h b/polymer/eduke32/source/mapster32.h index 5bc2fda34..49ec6a461 100644 --- a/polymer/eduke32/source/mapster32.h +++ b/polymer/eduke32/source/mapster32.h @@ -72,6 +72,9 @@ static void EditSpriteData(int16_t spritenum); static void EditWallData(int16_t wallnum); static void EditSectorData(int16_t sectnum); static void FuncMenu(void); +#ifdef LUNATIC +static void LuaFuncMenu(void); +#endif #define BASEPALCOUNT 6