mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Apply b4fa98d2f to lua_hudlib.c
Continued from 544812a45
This commit is contained in:
parent
ceeda5c826
commit
b4d1fade5f
4 changed files with 34 additions and 226 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
// SONIC ROBO BLAST 2
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
// Copyright (C) 2012-2016 by John "JTE" Muniz.
|
||||||
// Copyright (C) 2012-2022 by Sonic Team Junior.
|
// Copyright (C) 2012-2022 by Sonic Team Junior.
|
||||||
|
|
@ -15,6 +15,8 @@
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "d_event.h"
|
#include "d_event.h"
|
||||||
|
|
||||||
|
#include "lua_hudlib_drawlist.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Do you know what an 'X Macro' is? Such a macro is called over each element of
|
Do you know what an 'X Macro' is? Such a macro is called over each element of
|
||||||
a list and expands the input. I use it for the hook lists because both an enum
|
a list and expands the input. I use it for the hook lists because both an enum
|
||||||
|
|
@ -110,12 +112,12 @@ ENUM (STRING_HOOK);
|
||||||
|
|
||||||
/* dead simple, LUA_HOOK(GameQuit) */
|
/* dead simple, LUA_HOOK(GameQuit) */
|
||||||
#define LUA_HOOK(type) LUA_HookVoid(HOOK(type))
|
#define LUA_HOOK(type) LUA_HookVoid(HOOK(type))
|
||||||
#define LUA_HUDHOOK(type) LUA_HookHUD(HUD_HOOK(type))
|
//#define LUA_HUDHOOK(type) LUA_HookHUD(HUD_HOOK(type))
|
||||||
|
|
||||||
extern boolean hook_cmd_running;
|
extern boolean hook_cmd_running;
|
||||||
|
|
||||||
void LUA_HookVoid(int hook);
|
void LUA_HookVoid(int hook);
|
||||||
void LUA_HookHUD(int hook);
|
void LUA_HookHUD(huddrawlist_h, int hook);
|
||||||
|
|
||||||
int LUA_HookMobj(mobj_t *, int hook);
|
int LUA_HookMobj(mobj_t *, int hook);
|
||||||
int LUA_Hook2Mobj(mobj_t *, mobj_t *, int hook);
|
int LUA_Hook2Mobj(mobj_t *, mobj_t *, int hook);
|
||||||
|
|
|
||||||
|
|
@ -630,6 +630,7 @@ int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
|
||||||
return hook.status;
|
return hook.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< Updated upstream
|
||||||
int LUA_HookKey(event_t *event, int hook_type)
|
int LUA_HookKey(event_t *event, int hook_type)
|
||||||
{
|
{
|
||||||
Hook_State hook;
|
Hook_State hook;
|
||||||
|
|
@ -641,7 +642,10 @@ int LUA_HookKey(event_t *event, int hook_type)
|
||||||
return hook.status;
|
return hook.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LUA_HookHUD(int hook_type)
|
void LUA_HookHUD(int hook_type, huddrawlist_h list)
|
||||||
|
=======
|
||||||
|
void LUA_HookHUD(huddrawlist_h list, int hook_type)
|
||||||
|
>>>>>>> Stashed changes
|
||||||
{
|
{
|
||||||
const hook_t * map = &hudHookIds[hook_type];
|
const hook_t * map = &hudHookIds[hook_type];
|
||||||
Hook_State hook;
|
Hook_State hook;
|
||||||
|
|
@ -650,7 +654,7 @@ void LUA_HookHUD(int hook_type)
|
||||||
start_hook_stack();
|
start_hook_stack();
|
||||||
begin_hook_values(&hook);
|
begin_hook_values(&hook);
|
||||||
|
|
||||||
LUA_SetHudHook(hook_type);
|
LUA_SetHudHook(hook_type, list);
|
||||||
|
|
||||||
hud_running = true; // local hook
|
hud_running = true; // local hook
|
||||||
init_hook_call(&hook, 0, res_none);
|
init_hook_call(&hook, 0, res_none);
|
||||||
|
|
|
||||||
|
|
@ -47,10 +47,6 @@ extern boolean hud_running;
|
||||||
|
|
||||||
boolean LUA_HudEnabled(enum hud option);
|
boolean LUA_HudEnabled(enum hud option);
|
||||||
|
|
||||||
void LUAh_GameHUD(player_t *stplyr, huddrawlist_h list);
|
void LUA_SetHudHook(int hook, huddrawlist_h list);
|
||||||
void LUAh_ScoresHUD(huddrawlist_h list);
|
|
||||||
void LUAh_TitleHUD(huddrawlist_h list);
|
|
||||||
void LUAh_TitleCardHUD(player_t *stplayr, huddrawlist_h list);
|
|
||||||
void LUAh_IntermissionHUD(huddrawlist_h list);
|
|
||||||
|
|
||||||
#endif // __LUA_HUD_H__
|
#endif // __LUA_HUD_H__
|
||||||
|
|
|
||||||
228
src/lua_hudlib.c
228
src/lua_hudlib.c
|
|
@ -29,14 +29,13 @@
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
#include "lua_hud.h"
|
#include "lua_hud.h"
|
||||||
|
#include "lua_hook.h"
|
||||||
|
|
||||||
#define HUDONLY if (!hud_running) return luaL_error(L, "HUD rendering code should not be called outside of rendering hooks!");
|
#define HUDONLY if (!hud_running) return luaL_error(L, "HUD rendering code should not be called outside of rendering hooks!");
|
||||||
|
|
||||||
boolean hud_running = false;
|
boolean hud_running = false;
|
||||||
static UINT8 hud_enabled[(hud_MAX/8)+1];
|
static UINT8 hud_enabled[(hud_MAX/8)+1];
|
||||||
|
|
||||||
static UINT8 hudAvailable; // hud hooks field
|
|
||||||
|
|
||||||
static UINT8 camnum = 1;
|
static UINT8 camnum = 1;
|
||||||
|
|
||||||
// must match enum hud in lua_hud.h
|
// must match enum hud in lua_hud.h
|
||||||
|
|
@ -79,21 +78,6 @@ static const char *const patch_opt[] = {
|
||||||
"topoffset",
|
"topoffset",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
enum hudhook {
|
|
||||||
hudhook_game = 0,
|
|
||||||
hudhook_scores,
|
|
||||||
hudhook_intermission,
|
|
||||||
hudhook_title,
|
|
||||||
hudhook_titlecard
|
|
||||||
};
|
|
||||||
static const char *const hudhook_opt[] = {
|
|
||||||
"game",
|
|
||||||
"scores",
|
|
||||||
"intermission",
|
|
||||||
"title",
|
|
||||||
"titlecard",
|
|
||||||
NULL};
|
|
||||||
|
|
||||||
// alignment types for v.drawString
|
// alignment types for v.drawString
|
||||||
enum align {
|
enum align {
|
||||||
align_left = 0,
|
align_left = 0,
|
||||||
|
|
@ -1249,6 +1233,8 @@ static luaL_Reg lib_draw[] = {
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int lib_draw_ref;
|
||||||
|
|
||||||
//
|
//
|
||||||
// lib_hud
|
// lib_hud
|
||||||
//
|
//
|
||||||
|
|
@ -1282,28 +1268,7 @@ static int lib_hudenabled(lua_State *L)
|
||||||
}
|
}
|
||||||
|
|
||||||
// add a HUD element for rendering
|
// add a HUD element for rendering
|
||||||
static int lib_hudadd(lua_State *L)
|
extern int lib_hudadd(lua_State *L);
|
||||||
{
|
|
||||||
enum hudhook field;
|
|
||||||
|
|
||||||
luaL_checktype(L, 1, LUA_TFUNCTION);
|
|
||||||
field = luaL_checkoption(L, 2, "game", hudhook_opt);
|
|
||||||
|
|
||||||
if (!lua_lumploading)
|
|
||||||
return luaL_error(L, "This function cannot be called from within a hook or coroutine!");
|
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(L, -1));
|
|
||||||
lua_rawgeti(L, -1, field+2); // HUD[2+]
|
|
||||||
I_Assert(lua_istable(L, -1));
|
|
||||||
lua_remove(L, -2);
|
|
||||||
|
|
||||||
lua_pushvalue(L, 1);
|
|
||||||
lua_rawseti(L, -2, (int)(lua_objlen(L, -2) + 1));
|
|
||||||
|
|
||||||
hudAvailable |= 1<<field;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static luaL_Reg lib_hud[] = {
|
static luaL_Reg lib_hud[] = {
|
||||||
{"enable", lib_hudenable},
|
{"enable", lib_hudenable},
|
||||||
|
|
@ -1321,26 +1286,9 @@ int LUA_HudLib(lua_State *L)
|
||||||
{
|
{
|
||||||
memset(hud_enabled, 0xff, (hud_MAX/8)+1);
|
memset(hud_enabled, 0xff, (hud_MAX/8)+1);
|
||||||
|
|
||||||
lua_newtable(L); // HUD registry table
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lib_draw);
|
luaL_register(L, NULL, lib_draw);
|
||||||
lua_rawseti(L, -2, 1); // HUD[1] = lib_draw
|
lib_draw_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_rawseti(L, -2, 2); // HUD[2] = game rendering functions array
|
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_rawseti(L, -2, 3); // HUD[3] = scores rendering functions array
|
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_rawseti(L, -2, 4); // HUD[4] = intermission rendering functions array
|
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_rawseti(L, -2, 5); // HUD[5] = title rendering functions array
|
|
||||||
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_rawseti(L, -2, 6); // HUD[6] = title card rendering functions array
|
|
||||||
lua_setfield(L, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
|
|
||||||
luaL_newmetatable(L, META_COLORMAP);
|
luaL_newmetatable(L, META_COLORMAP);
|
||||||
lua_pushcfunction(L, colormap_get);
|
lua_pushcfunction(L, colormap_get);
|
||||||
|
|
@ -1371,170 +1319,28 @@ boolean LUA_HudEnabled(enum hud option)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hook for HUD rendering
|
void LUA_SetHudHook(int hook, huddrawlist_h list)
|
||||||
void LUAh_GameHUD(player_t *stplayr, huddrawlist_h list)
|
|
||||||
{
|
{
|
||||||
if (!gL || !(hudAvailable & (1<<hudhook_game)))
|
lua_getref(gL, lib_draw_ref);
|
||||||
return;
|
|
||||||
|
|
||||||
lua_pushlightuserdata(gL, list);
|
lua_pushlightuserdata(gL, list);
|
||||||
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
||||||
|
|
||||||
hud_running = true;
|
switch (hook)
|
||||||
lua_settop(gL, 0);
|
{
|
||||||
|
case HUD_HOOK(game):
|
||||||
lua_pushcfunction(gL, LUA_GetErrorMessage);
|
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_rawgeti(gL, -1, 2+hudhook_game); // HUD[2] = rendering funcs
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_remove(gL, -3); // pop HUD
|
|
||||||
LUA_PushUserdata(gL, stplayr, META_PLAYER);
|
|
||||||
|
|
||||||
camnum = R_GetViewNumber();
|
camnum = R_GetViewNumber();
|
||||||
|
|
||||||
|
LUA_PushUserdata(gL, stplyr, META_PLAYER);
|
||||||
LUA_PushUserdata(gL, &camera[camnum], META_CAMERA);
|
LUA_PushUserdata(gL, &camera[camnum], META_CAMERA);
|
||||||
|
|
||||||
camnum++; // for compatibility
|
camnum++; // for compatibility
|
||||||
|
break;
|
||||||
|
|
||||||
lua_pushnil(gL);
|
case HUD_HOOK(titlecard):
|
||||||
while (lua_next(gL, -5) != 0) {
|
LUA_PushUserdata(gL, stplyr, META_PLAYER);
|
||||||
lua_pushvalue(gL, -5); // graphics library (HUD[1])
|
|
||||||
lua_pushvalue(gL, -5); // stplayr
|
|
||||||
lua_pushvalue(gL, -5); // camera
|
|
||||||
LUA_Call(gL, 3, 0, 1);
|
|
||||||
}
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
hud_running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LUAh_ScoresHUD(huddrawlist_h list)
|
|
||||||
{
|
|
||||||
if (!gL || !(hudAvailable & (1<<hudhook_scores)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
lua_pushlightuserdata(gL, list);
|
|
||||||
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
|
||||||
|
|
||||||
hud_running = true;
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
|
|
||||||
lua_pushcfunction(gL, LUA_GetErrorMessage);
|
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_rawgeti(gL, -1, 2+hudhook_scores); // HUD[3] = rendering funcs
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_remove(gL, -3); // pop HUD
|
|
||||||
lua_pushnil(gL);
|
|
||||||
while (lua_next(gL, -3) != 0) {
|
|
||||||
lua_pushvalue(gL, -3); // graphics library (HUD[1])
|
|
||||||
LUA_Call(gL, 1, 0, 1);
|
|
||||||
}
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
hud_running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LUAh_TitleHUD(huddrawlist_h list)
|
|
||||||
{
|
|
||||||
if (!gL || !(hudAvailable & (1<<hudhook_title)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
lua_pushlightuserdata(gL, list);
|
|
||||||
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
|
||||||
|
|
||||||
hud_running = true;
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
|
|
||||||
lua_pushcfunction(gL, LUA_GetErrorMessage);
|
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_rawgeti(gL, -1, 2+hudhook_title); // HUD[5] = rendering funcs
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_remove(gL, -3); // pop HUD
|
|
||||||
lua_pushnil(gL);
|
|
||||||
while (lua_next(gL, -3) != 0) {
|
|
||||||
lua_pushvalue(gL, -3); // graphics library (HUD[1])
|
|
||||||
LUA_Call(gL, 1, 0, 1);
|
|
||||||
}
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
hud_running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LUAh_TitleCardHUD(player_t *stplayr, huddrawlist_h list)
|
|
||||||
{
|
|
||||||
if (!gL || !(hudAvailable & (1<<hudhook_titlecard)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
lua_pushlightuserdata(gL, list);
|
|
||||||
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
|
||||||
|
|
||||||
hud_running = true;
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
|
|
||||||
lua_pushcfunction(gL, LUA_GetErrorMessage);
|
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_rawgeti(gL, -1, 2+hudhook_titlecard); // HUD[6] = rendering funcs
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_remove(gL, -3); // pop HUD
|
|
||||||
|
|
||||||
LUA_PushUserdata(gL, stplayr, META_PLAYER);
|
|
||||||
lua_pushinteger(gL, lt_ticker);
|
lua_pushinteger(gL, lt_ticker);
|
||||||
lua_pushinteger(gL, (lt_endtime + TICRATE));
|
lua_pushinteger(gL, (lt_endtime + TICRATE));
|
||||||
lua_pushnil(gL);
|
break;
|
||||||
|
|
||||||
while (lua_next(gL, -6) != 0) {
|
|
||||||
lua_pushvalue(gL, -6); // graphics library (HUD[1])
|
|
||||||
lua_pushvalue(gL, -6); // stplayr
|
|
||||||
lua_pushvalue(gL, -6); // lt_ticker
|
|
||||||
lua_pushvalue(gL, -6); // lt_endtime
|
|
||||||
LUA_Call(gL, 4, 0, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
hud_running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LUAh_IntermissionHUD(huddrawlist_h list)
|
|
||||||
{
|
|
||||||
if (!gL || !(hudAvailable & (1<<hudhook_intermission)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
lua_pushlightuserdata(gL, list);
|
|
||||||
lua_setfield(gL, LUA_REGISTRYINDEX, "HUD_DRAW_LIST");
|
|
||||||
|
|
||||||
hud_running = true;
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
|
|
||||||
lua_pushcfunction(gL, LUA_GetErrorMessage);
|
|
||||||
|
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "HUD");
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_rawgeti(gL, -1, 2+hudhook_intermission); // HUD[4] = rendering funcs
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -2, 1); // HUD[1] = lib_draw
|
|
||||||
I_Assert(lua_istable(gL, -1));
|
|
||||||
lua_remove(gL, -3); // pop HUD
|
|
||||||
lua_pushnil(gL);
|
|
||||||
while (lua_next(gL, -3) != 0) {
|
|
||||||
lua_pushvalue(gL, -3); // graphics library (HUD[1])
|
|
||||||
LUA_Call(gL, 1, 0, 1);
|
|
||||||
}
|
|
||||||
lua_settop(gL, 0);
|
|
||||||
hud_running = false;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue