diff --git a/src/deh_soc.c b/src/deh_soc.c index 343beb301..8e8c669a1 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3490,6 +3490,18 @@ static void readcondition(UINT8 set, UINT32 id, char *word2) return; } } + else if (fastcmp(params[0], "LUA")) + { + PARAMCHECK(1); + ty = UC_LUA; + re = atoi(params[1]); + + if (re <= 0 || re > MAXLUACONDITIONS) + { + deh_warning("Lua condition %d out of range (1 - %d)", re, MAXLUACONDITIONS); + return; + } + } else if (fastcmp(params[0], "CONDITIONSET")) { PARAMCHECK(1); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 1ffa3968b..c973f6aa3 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3880,6 +3880,34 @@ static int lib_gAddGametype(lua_State *L) return 0; } +// Lua exclusive function to unlock Lua Conditions +// Up to Lua scripter +static int lib_gUnlockCondition(lua_State* L) +{ + int id = luaL_checkinteger(L, 1) - 1; + boolean global = luaL_checkboolean(L, 2); + + if (id <= 0 || id > MAXLUACONDITIONS) + { + luaL_error(L, "Lua condition %d out of range (1 - %d)", id + 1, MAXLUACONDITIONS); + return 0; + } + + if (global) + { + serverGamedata->lua[id] = true; + M_SilentUpdateUnlockablesAndEmblems(serverGamedata); + } + + clientGamedata->lua[id] = true; + if (M_UpdateUnlockablesAndExtraEmblems(clientGamedata)) + { + S_StartSound(NULL, sfx_s3k68); + } + + return 0; +} + // Bot adding function! // Partly lifted from Got_AddPlayer static int lib_gAddPlayer(lua_State *L) @@ -4628,6 +4656,7 @@ static luaL_Reg lib[] = { {"G_AddGametype", lib_gAddGametype}, {"G_AddPlayer", lib_gAddPlayer}, {"G_RemovePlayer", lib_gRemovePlayer}, + {"G_UnlockCondition", lib_gUnlockCondition}, {"G_SetUsedCheats", lib_gSetUsedCheats}, {"G_BuildMapName",lib_gBuildMapName}, {"G_BuildMapTitle",lib_gBuildMapTitle}, diff --git a/src/lua_hook.h b/src/lua_hook.h index ce79cd1cb..94d30d5ef 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -86,6 +86,7 @@ automatically. X (scores),/* emblems/multiplayer list */\ X (title),/* titlescreen */\ X (titlecard),\ + X (escpanel) /* rings/time/score/emblem panel in pause menu */,\ X (intermission),\ X (continue),\ X (playersetup),\ @@ -127,6 +128,10 @@ int LUA_HookCharacterHUD INT32 skinIndex, UINT8 sprite2, UINT8 frame, UINT8 rotation, skincolornum_t color, INT32 ticker, boolean mode ); +int LUA_HookEscapePanel( + int hook, huddrawlist_h drawlist, + int x, int y, int width, int height +); int LUA_HookMobj(mobj_t *, int hook); int LUA_Hook2Mobj(mobj_t *, mobj_t *, int hook); diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 1bf3caf65..ef404b3c2 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -727,6 +727,22 @@ int LUA_HookCharacterHUD return hook.status; } +int LUA_HookEscapePanel(int hook, huddrawlist_h drawlist, int x, int y, int width, int height) +{ + Hook_State hookstate; + if (prepare_hud_hook(&hookstate, false, hook)) + { + LUA_SetHudHook(hook, drawlist); + lua_pushinteger(gL, x); + lua_pushinteger(gL, y); + lua_pushinteger(gL, width); + lua_pushinteger(gL, height); + call_hud_hooks(&hookstate, 1, res_true); + } + return hookstate.status; +} + + /* ========================================================================= SPECIALIZED HOOKS ========================================================================= */ diff --git a/src/lua_script.c b/src/lua_script.c index 686555a16..2234241b6 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -412,6 +412,15 @@ int LUA_PushGlobals(lua_State *L, const char *word) } else if (fastcmp(word, "token")) { lua_pushinteger(L, token); return 1; + } else if (fastcmp(word, "emblems")) { + lua_pushinteger(L, M_CountEmblems(clientGamedata)); + return 1; + } else if (fastcmp(word, "numemblems")) { + lua_pushinteger(L, numemblems); + return 1; + } else if (fastcmp(word, "numextraemblems")) { + lua_pushinteger(L, numextraemblems); + return 1; } else if (fastcmp(word, "gamestate")) { lua_pushinteger(L, gamestate); return 1; diff --git a/src/m_cond.c b/src/m_cond.c index 9706f76c8..f9400b1b1 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -155,6 +155,8 @@ void M_ClearSecrets(gamedata_t *data) data->unlocked[i] = false; for (i = 0; i < MAXCONDITIONSETS; ++i) data->achieved[i] = false; + for (i = 0; i < MAXLUACONDITIONS; ++i) + data->lua[i] = false; data->timesBeaten = data->timesBeatenWithEmeralds = data->timesBeatenUltimate = 0; @@ -214,6 +216,8 @@ static UINT8 M_CheckCondition(condition_t *cn, gamedata_t *data) return data->collected[cn->requirement-1]; case UC_EXTRAEMBLEM: // Requires extra emblem x to be obtained return data->extraCollected[cn->requirement-1]; + case UC_LUA: + return data->lua[cn->requirement-1]; case UC_CONDITIONSET: // requires condition set x to already be achieved return M_Achieved(cn->requirement-1, data); } diff --git a/src/m_cond.h b/src/m_cond.h index 2491a384c..2e6606f56 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -47,6 +47,7 @@ typedef enum UC_EMBLEM, // EMBLEM [emblem number] UC_EXTRAEMBLEM, // EXTRAEMBLEM [extra emblem number] UC_CONDITIONSET, // CONDITIONSET [condition set number] + UC_LUA, // LUA [condition set number] } conditiontype_t; // Condition Set information @@ -141,6 +142,7 @@ typedef struct #define MAXEMBLEMS 512 #define MAXEXTRAEMBLEMS 48 #define MAXUNLOCKABLES 80 +#define MAXLUACONDITIONS 128 /** Time attack information, currently a very small structure. */ @@ -202,6 +204,9 @@ typedef struct // UNLOCKABLES UNLOCKED boolean unlocked[MAXUNLOCKABLES]; + // LUA DATA (NOT SAVED INTO GAMEDATA) + boolean lua[MAXLUACONDITIONS]; + // TIME ATTACK DATA recorddata_t *mainrecords[NUMMAPS]; nightsdata_t *nightsrecords[NUMMAPS]; diff --git a/src/m_menu.c b/src/m_menu.c index be1b421f7..847db7471 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -186,6 +186,7 @@ static tic_t keydown = 0; // Lua static huddrawlist_h luahuddrawlist_playersetup; +static huddrawlist_h luahuddrawlist_infoscreen; // // PROTOTYPES @@ -393,6 +394,7 @@ static void M_DrawColorRamp(INT32 x, INT32 y, INT32 w, INT32 h, skincolor_t colo // Handling functions static boolean M_ExitPandorasBox(void); static boolean M_QuitMultiPlayerMenu(void); +static boolean M_QuitPauseMenu(void); static void M_HandleAddons(INT32 choice); static void M_HandleLevelPlatter(INT32 choice); static void M_HandleSoundTest(INT32 choice); @@ -3767,6 +3769,14 @@ void M_StartControlPanel(void) CON_ToggleOff(); // move away console } +static boolean M_QuitPauseMenu(void) +{ + LUA_HUD_DestroyDrawList(luahuddrawlist_infoscreen); + luahuddrawlist_infoscreen = NULL; + + return true; +} + void M_EndModeAttackRun(void) { G_ClearModeAttackRetryFlag(); @@ -4719,8 +4729,29 @@ static void M_DrawPauseMenu(void) emblem_t *emblem_detail[3] = {NULL, NULL, NULL}; char emblem_text[3][20]; INT32 i; + INT16 xbox = 27; + INT16 ybox = 16; + INT16 widthbox = 32; + INT16 heightbox = 6; - M_DrawTextBox(27, 16, 32, 6); + M_DrawTextBox(xbox, ybox, widthbox, heightbox); + + if (!LUA_HUD_IsDrawListValid(luahuddrawlist_infoscreen)) + { + LUA_HUD_DestroyDrawList(luahuddrawlist_infoscreen); + luahuddrawlist_infoscreen = LUA_HUD_CreateDrawList(); + } + LUA_HUD_ClearDrawList(luahuddrawlist_infoscreen); + + boolean esc_override = LUA_HookEscapePanel( + HUD_HOOK(escpanel), + luahuddrawlist_infoscreen, + xbox+5, ybox+5, widthbox*8+6, heightbox*8+6); + + LUA_HUD_DrawList(luahuddrawlist_infoscreen); + + if (esc_override) + goto draw_rest; // Draw any and all emblems at the top. M_DrawMapEmblems(gamemap, 272, 28, true); @@ -4853,7 +4884,10 @@ static void M_DrawPauseMenu(void) } } - M_DrawGenericMenu(); + draw_rest: + { + M_DrawGenericMenu(); + } } static void M_DrawCenteredMenu(void) diff --git a/src/m_menu.h b/src/m_menu.h index dc8bef8b1..77750b7f7 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -524,7 +524,7 @@ void M_FreePlayerSetupColors(void); M_DrawPauseMenu,\ x, y,\ 0,\ - NULL\ + M_QuitPauseMenu\ } #define CENTERMENUSTYLE(id, header, source, prev, y)\