diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 9a3e676d5fd6168fd64bfaaa44466a5e85e8949c..15844e52447bd1eb3dd08c33b24cce2d3832f1d9 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -280,7 +280,7 @@ static int hudinfo_num(lua_State *L) static int colormap_get(lua_State *L) { - const UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP)); + UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP)); UINT32 i = luaL_checkinteger(L, 2); if (i >= 256) return luaL_error(L, "colormap index %d out of range (0 - %d)", i, 255); @@ -288,6 +288,23 @@ static int colormap_get(lua_State *L) return 1; } +static int colormap_set(lua_State *L) +{ + UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP)); + UINT32 i = luaL_checkinteger(L, 2); + if (i >= 256) + return luaL_error(L, "colormap index %d out of range (0 - %d)", i, 255); + colormap[i] = (UINT8)luaL_checkinteger(L, 3); + return 0; +} + +static int colormap_free(lua_State *L) +{ + UINT8 *colormap = *((UINT8 **)luaL_checkudata(L, 1, META_COLORMAP)); + Z_Free(colormap); + return 0; +} + static int patch_get(lua_State *L) { patch_t *patch = *((patch_t **)luaL_checkudata(L, 1, META_PATCH)); @@ -948,7 +965,7 @@ static int libd_getColormap(lua_State *L) // all was successful above, now we generate the colormap at last! - colormap = R_GetTranslationColormap(skinnum, color, GTC_CACHE); + colormap = R_GetTranslationColormap(skinnum, color, 0); LUA_PushUserdata(L, colormap, META_COLORMAP); // push as META_COLORMAP userdata, specifically for patches to use! return 1; } @@ -957,10 +974,14 @@ static int libd_getStringColormap(lua_State *L) { INT32 flags = luaL_checkinteger(L, 1); UINT8* colormap = NULL; + UINT8* lua_colormap = NULL; HUDONLY colormap = V_GetStringColormap(flags & V_CHARCOLORMASK); if (colormap) { - LUA_PushUserdata(L, colormap, META_COLORMAP); // push as META_COLORMAP userdata, specifically for patches to use! + lua_colormap = Z_Malloc(256 * sizeof(UINT8), PU_LUA, NULL); + memcpy(lua_colormap, colormap, 256 * sizeof(UINT8)); + + LUA_PushUserdata(L, lua_colormap, META_COLORMAP); // push as META_COLORMAP userdata, specifically for patches to use! return 1; } return 0; @@ -1270,6 +1291,12 @@ int LUA_HudLib(lua_State *L) luaL_newmetatable(L, META_COLORMAP); lua_pushcfunction(L, colormap_get); lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, colormap_set); + lua_setfield(L, -2, "__newindex"); + + lua_pushcfunction(L, colormap_free); + lua_setfield(L, -2, "__gc"); lua_pop(L,1); luaL_newmetatable(L, META_PATCH);