From f2a8df7728435146a5e7cd1d4c9bc11fb12c3b00 Mon Sep 17 00:00:00 2001 From: MysterD Date: Mon, 24 Apr 2023 16:45:25 -0700 Subject: [PATCH] Made nametags mod interpolate names and health --- autogen/lua_definitions/constants.lua | 8 ++- autogen/lua_definitions/functions.lua | 31 ++++++++++ docs/lua/constants.md | 2 + docs/lua/functions-3.md | 46 +++++++++++++- docs/lua/functions-4.md | 28 +++++++++ docs/lua/functions.md | 3 + mods/nametags.lua | 41 ++++++++++--- src/pc/djui/djui_hud_utils.c | 70 +++++++++++++++++++++- src/pc/djui/djui_hud_utils.h | 3 +- src/pc/lua/smlua_cobject_autogen.c | 2 +- src/pc/lua/smlua_constants_autogen.c | 4 +- src/pc/lua/smlua_functions_autogen.c | 86 ++++++++++++++++++++++++++- src/pc/lua/utils/smlua_misc_utils.c | 39 ++++++++++++ src/pc/lua/utils/smlua_misc_utils.h | 1 + 14 files changed, 346 insertions(+), 18 deletions(-) diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 37295519..16200c55 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -343,7 +343,13 @@ INSTANT_WARP_INDEX_START = 0x00 INSTANT_WARP_INDEX_STOP = 0x04 --- @type integer -MAX_LOADED_GRAPH_NODES = 0x100 +LOADED_GRAPH_NODES_EXTENDED = 512 + +--- @type integer +LOADED_GRAPH_NODES_VANILLA = 256 + +--- @type integer +MAX_LOADED_GRAPH_NODES = (LOADED_GRAPH_NODES_VANILLA + LOADED_GRAPH_NODES_EXTENDED) --- @type integer WARP_TRANSITION_FADE_FROM_BOWSER = 0x12 diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 93ab667e..b60b668c 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -3663,6 +3663,18 @@ function djui_hud_print_text(message, x, y, scale) -- ... end +--- @param message string +--- @param prevX number +--- @param prevY number +--- @param prevScale number +--- @param x number +--- @param y number +--- @param scale number +--- @return nil +function djui_hud_print_text_interpolated(message, prevX, prevY, prevScale, x, y, scale) + -- ... +end + --- @param x number --- @param y number --- @param width number @@ -3685,6 +3697,11 @@ function djui_hud_render_rect_interpolated(prevX, prevY, prevWidth, prevHeight, -- ... end +--- @return nil +function djui_hud_reset_color() + -- ... +end + --- @param r integer --- @param g integer --- @param b integer @@ -8418,6 +8435,20 @@ function hud_render_power_meter(health, x, y, width, height) -- ... end +--- @param health integer +--- @param prevX number +--- @param prevY number +--- @param prevWidth number +--- @param prevHeight number +--- @param x number +--- @param y number +--- @param width number +--- @param height number +--- @return nil +function hud_render_power_meter_interpolated(health, prevX, prevY, prevWidth, prevHeight, x, y, width, height) + -- ... +end + --- @param type HudDisplayValue --- @param value integer --- @return nil diff --git a/docs/lua/constants.md b/docs/lua/constants.md index d43fb20b..4d402e1c 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -70,6 +70,8 @@ ## [area.h](#area.h) - INSTANT_WARP_INDEX_START - INSTANT_WARP_INDEX_STOP +- LOADED_GRAPH_NODES_EXTENDED +- LOADED_GRAPH_NODES_VANILLA - MAX_LOADED_GRAPH_NODES - WARP_TRANSITION_FADE_FROM_BOWSER - WARP_TRANSITION_FADE_FROM_CIRCLE diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md index a163d824..caaa6453 100644 --- a/docs/lua/functions-3.md +++ b/docs/lua/functions-3.md @@ -2198,7 +2198,33 @@ - None ### C Prototype -`void djui_hud_print_text(const char* message, float x, float y, float scale);` +`void djui_hud_print_text(const char* message, f32 x, f32 y, f32 scale);` + +[:arrow_up_small:](#) + +
+ +## [djui_hud_print_text_interpolated](#djui_hud_print_text_interpolated) + +### Lua Example +`djui_hud_print_text_interpolated(message, prevX, prevY, prevScale, x, y, scale)` + +### Parameters +| Field | Type | +| ----- | ---- | +| message | `string` | +| prevX | `number` | +| prevY | `number` | +| prevScale | `number` | +| x | `number` | +| y | `number` | +| scale | `number` | + +### Returns +- None + +### C Prototype +`void djui_hud_print_text_interpolated(const char* message, f32 prevX, f32 prevY, f32 prevScale, f32 x, f32 y, f32 scale);` [:arrow_up_small:](#) @@ -2254,6 +2280,24 @@
+## [djui_hud_reset_color](#djui_hud_reset_color) + +### Lua Example +`djui_hud_reset_color()` + +### Parameters +- None + +### Returns +- None + +### C Prototype +`void djui_hud_reset_color(void);` + +[:arrow_up_small:](#) + +
+ ## [djui_hud_set_color](#djui_hud_set_color) ### Lua Example diff --git a/docs/lua/functions-4.md b/docs/lua/functions-4.md index 52a92822..c72d6c19 100644 --- a/docs/lua/functions-4.md +++ b/docs/lua/functions-4.md @@ -8553,6 +8553,34 @@
+## [hud_render_power_meter_interpolated](#hud_render_power_meter_interpolated) + +### Lua Example +`hud_render_power_meter_interpolated(health, prevX, prevY, prevWidth, prevHeight, x, y, width, height)` + +### Parameters +| Field | Type | +| ----- | ---- | +| health | `integer` | +| prevX | `number` | +| prevY | `number` | +| prevWidth | `number` | +| prevHeight | `number` | +| x | `number` | +| y | `number` | +| width | `number` | +| height | `number` | + +### Returns +- None + +### C Prototype +`void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height);` + +[:arrow_up_small:](#) + +
+ ## [hud_set_value](#hud_set_value) ### Lua Example diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 283ae7aa..67bad391 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -724,8 +724,10 @@ - [djui_hud_is_pause_menu_created](functions-3.md#djui_hud_is_pause_menu_created) - [djui_hud_measure_text](functions-3.md#djui_hud_measure_text) - [djui_hud_print_text](functions-3.md#djui_hud_print_text) + - [djui_hud_print_text_interpolated](functions-3.md#djui_hud_print_text_interpolated) - [djui_hud_render_rect](functions-3.md#djui_hud_render_rect) - [djui_hud_render_rect_interpolated](functions-3.md#djui_hud_render_rect_interpolated) + - [djui_hud_reset_color](functions-3.md#djui_hud_reset_color) - [djui_hud_set_color](functions-3.md#djui_hud_set_color) - [djui_hud_set_font](functions-3.md#djui_hud_set_font) - [djui_hud_set_mouse_locked](functions-3.md#djui_hud_set_mouse_locked) @@ -1568,6 +1570,7 @@ - [hud_hide](functions-4.md#hud_hide) - [hud_is_hidden](functions-4.md#hud_is_hidden) - [hud_render_power_meter](functions-4.md#hud_render_power_meter) + - [hud_render_power_meter_interpolated](functions-4.md#hud_render_power_meter_interpolated) - [hud_set_value](functions-4.md#hud_set_value) - [hud_show](functions-4.md#hud_show) - [is_game_paused](functions-4.md#is_game_paused) diff --git a/mods/nametags.lua b/mods/nametags.lua index c86891bf..18bf03ee 100644 --- a/mods/nametags.lua +++ b/mods/nametags.lua @@ -9,6 +9,17 @@ gGlobalSyncTable.health = true showSelfTag = false +gStateExtras = {} +for i = 0, (MAX_PLAYERS - 1) do + gStateExtras[i] = {} + local e = gStateExtras[i] + e.prevPos = {} + e.prevPos.x = 0 + e.prevPos.y = 0 + e.prevPos.z = 0 + e.prevScale = 1 +end + for k, v in pairs(gActiveMods) do local name = v.name:lower() if v.enabled and (name:find("hide") or name:find("hns") or name:find("hunt")) then @@ -62,16 +73,19 @@ function djui_hud_set_adjusted_color(r, g, b, a) djui_hud_set_color(r * multiplier, g * multiplier, b * multiplier, a) end -function djui_hud_print_outlined_text(text, x, y, scale, r, g, b, a, outlineDarkness) +function djui_hud_print_outlined_text(text, prevx, prevy, prevscale, x, y, scale, r, g, b, a, outlineDarkness) + djui_hud_set_resolution(RESOLUTION_N64) -- render outline djui_hud_set_adjusted_color(r * outlineDarkness, g * outlineDarkness, b * outlineDarkness, a) - djui_hud_print_text(text, x - (1*(scale*2)), y, scale) - djui_hud_print_text(text, x + (1*(scale*2)), y, scale) - djui_hud_print_text(text, x, y - (1*(scale*2)), scale) - djui_hud_print_text(text, x, y + (1*(scale*2)), scale) + local offset = (1*(scale*2)) + local prevoffset = (1*(prevscale*2)) + djui_hud_print_text_interpolated(text, prevx - prevoffset, prevy, prevscale, x - offset, y, scale) + djui_hud_print_text_interpolated(text, prevx + prevoffset, prevy, prevscale, x + offset, y, scale) + djui_hud_print_text_interpolated(text, prevx, prevy - prevoffset, prevscale, x, y - offset, scale) + djui_hud_print_text_interpolated(text, prevx, prevy + prevoffset, prevscale, x, y + offset, scale) -- render text djui_hud_set_adjusted_color(r, g, b, 255) - djui_hud_print_text(text, x, y, scale) + djui_hud_print_text_interpolated(text, prevx, prevy, prevscale, x, y, scale) djui_hud_set_color(255, 255, 255, 255) end @@ -113,13 +127,24 @@ function on_hud_render() network_player_palette_to_color(gNetworkPlayers[i], SHIRT, color) local measure = djui_hud_measure_text(name) * scale * 0.5 local alpha = if_then_else(m.action ~= ACT_CROUCHING and m.action ~= ACT_START_CRAWLING and m.action ~= ACT_CRAWLING and m.action ~= ACT_STOP_CRAWLING, 255, 100) - djui_hud_print_outlined_text(name, out.x - measure, out.y, scale, color.r, color.g, color.b, alpha, 0.25) + + local e = gStateExtras[i] + + djui_hud_print_outlined_text(name, e.prevPos.x - measure, e.prevPos.y, e.prevScale, out.x - measure, out.y, scale, color.r, color.g, color.b, alpha, 0.25) if m.playerIndex ~= 0 and gGlobalSyncTable.health then djui_hud_set_adjusted_color(255, 255, 255, alpha) local healthScale = 75 * scale - hud_render_power_meter(m.health, out.x - (healthScale * 0.5), out.y - healthScale, healthScale, healthScale) + local prevHealthScale = 75 * e.prevScale + hud_render_power_meter_interpolated(m.health, + e.prevPos.x - (prevHealthScale * 0.5), e.prevPos.y - prevHealthScale, prevHealthScale, prevHealthScale, + out.x - (healthScale * 0.5), out.y - healthScale, healthScale, healthScale) end + + e.prevPos.x = out.x + e.prevPos.y = out.y + e.prevPos.z = out.z + e.prevScale = scale end end end diff --git a/src/pc/djui/djui_hud_utils.c b/src/pc/djui/djui_hud_utils.c index 98df9546..88001b45 100644 --- a/src/pc/djui/djui_hud_utils.c +++ b/src/pc/djui/djui_hud_utils.c @@ -79,7 +79,7 @@ static void djui_hud_size_translate(f32* size) { // interp // //////////// -#define MAX_INTERP_HUD 128 +#define MAX_INTERP_HUD 512 struct InterpHud { Gfx* headPos; f32 z; @@ -228,7 +228,7 @@ f32 djui_hud_measure_text(const char* message) { return width * font->defaultFontScale; } -void djui_hud_print_text(const char* message, float x, float y, float scale) { +void djui_hud_print_text(const char* message, f32 x, f32 y, f32 scale) { if (message == NULL) { return; } gDjuiHudUtilsZ += 0.01f; @@ -275,6 +275,72 @@ void djui_hud_print_text(const char* message, float x, float y, float scale) { gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); } +void djui_hud_print_text_interpolated(const char* message, f32 prevX, f32 prevY, f32 prevScale, f32 x, f32 y, f32 scale) { + if (message == NULL) { return; } + f32 savedZ = gDjuiHudUtilsZ; + gDjuiHudUtilsZ += 0.01f; + + const struct DjuiFont* font = gDjuiFonts[sFont]; + f32 fontScale = font->defaultFontScale * scale; + + // setup display list + if (font->textBeginDisplayList != NULL) { + gSPDisplayList(gDisplayListHead++, font->textBeginDisplayList); + } + + Gfx* savedHeadPos = gDisplayListHead; + + // translate position + f32 translatedX = x; + f32 translatedY = y; + djui_hud_position_translate(&translatedX, &translatedY); + create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, gDjuiHudUtilsZ); + + // compute font size + f32 translatedFontSize = fontScale; + djui_hud_size_translate(&translatedFontSize); + create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedFontSize, translatedFontSize, 1.0f); + + // render the line + f32 addX = 0; + char* c = (char*)message; + while (*c != '\0') { + f32 charWidth = font->char_width(c); + + if (*c == '\n' && *c == ' ') { + addX += charWidth; + c++; + continue; + } + + // render + font->render_char(c); + create_dl_translation_matrix(DJUI_MTX_NOPUSH, charWidth + addX, 0, 0); + addX = 0; + + c = djui_unicode_next_char(c); + } + + // pop + gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); + + if (sInterpHudCount >= MAX_INTERP_HUD) { return; } + struct InterpHud* interp = &sInterpHuds[sInterpHudCount++]; + interp->headPos = savedHeadPos; + interp->prevX = prevX; + interp->prevY = prevY; + interp->prevScaleW = prevScale; + interp->prevScaleH = prevScale; + interp->x = x; + interp->y = y; + interp->scaleW = scale; + interp->scaleH = scale; + interp->width = font->defaultFontScale; + interp->height = font->defaultFontScale; + interp->z = savedZ; + interp->resolution = sResolution; +} + void djui_hud_render_texture_raw(const u8* texture, u32 bitSize, u32 width, u32 height, f32 x, f32 y, f32 scaleW, f32 scaleH) { gDjuiHudUtilsZ += 0.01f; diff --git a/src/pc/djui/djui_hud_utils.h b/src/pc/djui/djui_hud_utils.h index 377a91ca..09822b9e 100644 --- a/src/pc/djui/djui_hud_utils.h +++ b/src/pc/djui/djui_hud_utils.h @@ -52,7 +52,8 @@ f32 djui_hud_get_raw_mouse_y(void); void djui_hud_set_mouse_locked(bool locked); f32 djui_hud_measure_text(const char* message); -void djui_hud_print_text(const char* message, float x, float y, float scale); +void djui_hud_print_text(const char* message, f32 x, f32 y, f32 scale); +void djui_hud_print_text_interpolated(const char* message, f32 prevX, f32 prevY, f32 prevScale, f32 x, f32 y, f32 scale); void djui_hud_render_texture(struct TextureInfo* texInfo, f32 x, f32 y, f32 scaleW, f32 scaleH); void djui_hud_render_texture_raw(const u8* texture, u32 bitSize, u32 width, u32 height, f32 x, f32 y, f32 scaleW, f32 scaleH); void djui_hud_render_texture_tile(struct TextureInfo* texInfo, f32 x, f32 y, f32 scaleW, f32 scaleH, u32 tileX, u32 tileY, u32 tileW, u32 tileH); diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 8dc73118..b875b073 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -1931,7 +1931,7 @@ static struct LuaObjectField sSpawnParticlesInfoFields[LUA_SPAWN_PARTICLES_INFO_ { "forwardVelBase", LVT_S8, offsetof(struct SpawnParticlesInfo, forwardVelBase), false, LOT_NONE }, { "forwardVelRange", LVT_S8, offsetof(struct SpawnParticlesInfo, forwardVelRange), false, LOT_NONE }, { "gravity", LVT_S8, offsetof(struct SpawnParticlesInfo, gravity), false, LOT_NONE }, - { "model", LVT_U8, offsetof(struct SpawnParticlesInfo, model), true, LOT_NONE }, + { "model", LVT_U16, offsetof(struct SpawnParticlesInfo, model), true, LOT_NONE }, { "offsetY", LVT_S8, offsetof(struct SpawnParticlesInfo, offsetY), false, LOT_NONE }, { "sizeBase", LVT_F32, offsetof(struct SpawnParticlesInfo, sizeBase), false, LOT_NONE }, { "sizeRange", LVT_F32, offsetof(struct SpawnParticlesInfo, sizeRange), false, LOT_NONE }, diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index d8b649ef..8c529f6a 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -307,7 +307,9 @@ char gSmluaConstants[] = "" "COURSE_COUNT = 25\n" "--- @type integer\n" "COURSE_MIN = 1\n" -"MAX_LOADED_GRAPH_NODES = 0x100\n" +"LOADED_GRAPH_NODES_VANILLA = 256\n" +"LOADED_GRAPH_NODES_EXTENDED = 512\n" +"MAX_LOADED_GRAPH_NODES = (LOADED_GRAPH_NODES_VANILLA + LOADED_GRAPH_NODES_EXTENDED)\n" "INSTANT_WARP_INDEX_START = 0x00\n" "INSTANT_WARP_INDEX_STOP = 0x04\n" "WARP_TRANSITION_FADE_FROM_COLOR = 0x00\n" diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 642b6691..998949af 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -11614,11 +11614,11 @@ int smlua_func_djui_hud_print_text(lua_State* L) { const char* message = smlua_to_string(L, 1); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "djui_hud_print_text"); return 0; } - float x = smlua_to_number(L, 2); + f32 x = smlua_to_number(L, 2); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "djui_hud_print_text"); return 0; } - float y = smlua_to_number(L, 3); + f32 y = smlua_to_number(L, 3); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "djui_hud_print_text"); return 0; } - float scale = smlua_to_number(L, 4); + f32 scale = smlua_to_number(L, 4); if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "djui_hud_print_text"); return 0; } djui_hud_print_text(message, x, y, scale); @@ -11626,6 +11626,35 @@ int smlua_func_djui_hud_print_text(lua_State* L) { return 1; } +int smlua_func_djui_hud_print_text_interpolated(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 7) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_print_text_interpolated", 7, top); + return 0; + } + + const char* message = smlua_to_string(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "djui_hud_print_text_interpolated"); return 0; } + f32 prevX = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "djui_hud_print_text_interpolated"); return 0; } + f32 prevY = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "djui_hud_print_text_interpolated"); return 0; } + f32 prevScale = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "djui_hud_print_text_interpolated"); return 0; } + f32 x = smlua_to_number(L, 5); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "djui_hud_print_text_interpolated"); return 0; } + f32 y = smlua_to_number(L, 6); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "djui_hud_print_text_interpolated"); return 0; } + f32 scale = smlua_to_number(L, 7); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 7, "djui_hud_print_text_interpolated"); return 0; } + + djui_hud_print_text_interpolated(message, prevX, prevY, prevScale, x, y, scale); + + return 1; +} + int smlua_func_djui_hud_render_rect(lua_State* L) { if (L == NULL) { return 0; } @@ -11680,6 +11709,21 @@ int smlua_func_djui_hud_render_rect_interpolated(lua_State* L) { return 1; } +int smlua_func_djui_hud_reset_color(UNUSED lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 0) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_reset_color", 0, top); + return 0; + } + + + djui_hud_reset_color(); + + return 1; +} + int smlua_func_djui_hud_set_color(lua_State* L) { if (L == NULL) { return 0; } @@ -27427,6 +27471,39 @@ int smlua_func_hud_render_power_meter(lua_State* L) { return 1; } +int smlua_func_hud_render_power_meter_interpolated(lua_State* L) { + if (L == NULL) { return 0; } + + int top = lua_gettop(L); + if (top != 9) { + LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "hud_render_power_meter_interpolated", 9, top); + return 0; + } + + s32 health = smlua_to_integer(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "hud_render_power_meter_interpolated"); return 0; } + f32 prevX = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "hud_render_power_meter_interpolated"); return 0; } + f32 prevY = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "hud_render_power_meter_interpolated"); return 0; } + f32 prevWidth = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "hud_render_power_meter_interpolated"); return 0; } + f32 prevHeight = smlua_to_number(L, 5); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "hud_render_power_meter_interpolated"); return 0; } + f32 x = smlua_to_number(L, 6); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "hud_render_power_meter_interpolated"); return 0; } + f32 y = smlua_to_number(L, 7); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 7, "hud_render_power_meter_interpolated"); return 0; } + f32 width = smlua_to_number(L, 8); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 8, "hud_render_power_meter_interpolated"); return 0; } + f32 height = smlua_to_number(L, 9); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 9, "hud_render_power_meter_interpolated"); return 0; } + + hud_render_power_meter_interpolated(health, prevX, prevY, prevWidth, prevHeight, x, y, width, height); + + return 1; +} + int smlua_func_hud_set_value(lua_State* L) { if (L == NULL) { return 0; } @@ -29903,8 +29980,10 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "djui_hud_is_pause_menu_created", smlua_func_djui_hud_is_pause_menu_created); smlua_bind_function(L, "djui_hud_measure_text", smlua_func_djui_hud_measure_text); smlua_bind_function(L, "djui_hud_print_text", smlua_func_djui_hud_print_text); + smlua_bind_function(L, "djui_hud_print_text_interpolated", smlua_func_djui_hud_print_text_interpolated); smlua_bind_function(L, "djui_hud_render_rect", smlua_func_djui_hud_render_rect); smlua_bind_function(L, "djui_hud_render_rect_interpolated", smlua_func_djui_hud_render_rect_interpolated); + smlua_bind_function(L, "djui_hud_reset_color", smlua_func_djui_hud_reset_color); smlua_bind_function(L, "djui_hud_set_color", smlua_func_djui_hud_set_color); smlua_bind_function(L, "djui_hud_set_font", smlua_func_djui_hud_set_font); smlua_bind_function(L, "djui_hud_set_mouse_locked", smlua_func_djui_hud_set_mouse_locked); @@ -30692,6 +30771,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "hud_hide", smlua_func_hud_hide); smlua_bind_function(L, "hud_is_hidden", smlua_func_hud_is_hidden); smlua_bind_function(L, "hud_render_power_meter", smlua_func_hud_render_power_meter); + smlua_bind_function(L, "hud_render_power_meter_interpolated", smlua_func_hud_render_power_meter_interpolated); smlua_bind_function(L, "hud_set_value", smlua_func_hud_set_value); smlua_bind_function(L, "hud_show", smlua_func_hud_show); smlua_bind_function(L, "is_game_paused", smlua_func_is_game_paused); diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index e112502a..228bec23 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -125,6 +125,45 @@ void hud_render_power_meter(s32 health, f32 x, f32 y, f32 width, f32 height) { djui_hud_render_texture(&sPowerMeterTexturesInfo[numWedges + 1], x + width / 4, y + height / 4, width / 64, height / 64); } } +void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height) { + extern const u8 texture_power_meter_left_side[]; + extern const u8 texture_power_meter_right_side[]; + extern const u8 texture_power_meter_full[]; + extern const u8 texture_power_meter_seven_segments[]; + extern const u8 texture_power_meter_six_segments[]; + extern const u8 texture_power_meter_five_segments[]; + extern const u8 texture_power_meter_four_segments[]; + extern const u8 texture_power_meter_three_segments[]; + extern const u8 texture_power_meter_two_segments[]; + extern const u8 texture_power_meter_one_segments[]; + static struct TextureInfo sPowerMeterTexturesInfo[] = { + { (u8*)texture_power_meter_left_side, 8, 32, 64 }, + { (u8*)texture_power_meter_right_side, 8, 32, 64 }, + { (u8*)texture_power_meter_one_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_two_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_three_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_four_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_five_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_six_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_seven_segments, 8, 32, 32 }, + { (u8*)texture_power_meter_full, 8, 32, 32 }, + }; + + djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[0], + prevX, prevY, prevWidth / 64, prevHeight / 64, + x, y, width / 64, height / 64); + + djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[1], + prevX + prevWidth / 2, prevY, prevWidth / 64, prevHeight / 64, + x + width / 2, y, width / 64, height / 64); + + s32 numWedges = MIN(MAX(health >> 8, 0), 8); + if (numWedges != 0) { + djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[numWedges + 1], + prevX + prevWidth / 4, prevY + prevHeight / 4, prevWidth / 64, prevHeight / 64, + x + width / 4, y + height / 4, width / 64, height / 64); + } +} /// diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index 467d177d..b3c336ce 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -38,6 +38,7 @@ bool hud_is_hidden(void); s32 hud_get_value(enum HudDisplayValue type); void hud_set_value(enum HudDisplayValue type, s32 value); void hud_render_power_meter(s32 health, f32 x, f32 y, f32 width, f32 height); +void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height); void camera_freeze(void); void camera_unfreeze(void);