diff --git a/src/SM64Lua.lua b/src/SM64Lua.lua index aa92bbd..d478550 100644 --- a/src/SM64Lua.lua +++ b/src/SM64Lua.lua @@ -74,6 +74,7 @@ local views = { dofile(views_path .. 'Settings.lua'), dofile(views_path .. 'Tools.lua'), dofile(views_path .. 'Timer.lua'), + dofile(views_path .. 'Visualizer.lua'), } local semantic_workflow = dofile(processors_path .. 'SemanticWorkflow.lua') diff --git a/src/core/Locales.lua b/src/core/Locales.lua index 2f3f6be..a184482 100644 --- a/src/core/Locales.lua +++ b/src/core/Locales.lua @@ -21,6 +21,7 @@ Locales = {} ---@field public SETTINGS_TAB_NAME string ---@field public TOOLS_TAB_NAME string ---@field public TIMER_TAB_NAME string +---@field public VISUALIZER_TAB_NAME string ---@field public PRESET string ---@field public PRESET_CONTEXT_MENU_DELETE_ALL string ---@field public DISABLED string @@ -152,25 +153,28 @@ Locales = {} ---@field public TIMER_RESET string ---@field public TIMER_MANUAL string ---@field public TIMER_AUTO string +---@field public VARWATCH_FACING_YAW_LABEL string ---@field public VARWATCH_FACING_YAW string +---@field public VARWATCH_INTENDED_YAW_LABEL string ---@field public VARWATCH_INTENDED_YAW string +---@field public VARWATCH_H_SPEED_LABEL string ---@field public VARWATCH_H_SPEED string ----@field public VARWATCH_H_SLIDING string ----@field public VARWATCH_Y_SPEED string ----@field public VARWATCH_SPD_EFFICIENCY string ----@field public VARWATCH_POS_X string ----@field public VARWATCH_POS_Y string ----@field public VARWATCH_POS_Z string ----@field public VARWATCH_PITCH string ----@field public VARWATCH_YAW_VEL string ----@field public VARWATCH_PITCH_VEL string ----@field public VARWATCH_XZ_MOVEMENT string ----@field public VARWATCH_ACTION string +---@field public VARWATCH_H_SLIDING_LABEL string +---@field public VARWATCH_Y_SPEED_LABEL string +---@field public VARWATCH_SPD_EFFICIENCY_LABEL string +---@field public VARWATCH_POS_X_LABEL string +---@field public VARWATCH_POS_Y_LABEL string +---@field public VARWATCH_POS_Z_LABEL string +---@field public VARWATCH_PITCH_LABEL string +---@field public VARWATCH_YAW_VEL_LABEL string +---@field public VARWATCH_PITCH_VEL_LABEL string +---@field public VARWATCH_XZ_MOVEMENT_LABEL string +---@field public VARWATCH_ACTION_LABEL string ---@field public VARWATCH_UNKNOWN_ACTION string ----@field public VARWATCH_RNG string ----@field public VARWATCH_RNG_INDEX string ----@field public VARWATCH_GLOBAL_TIMER string ----@field public VARWATCH_DIST_MOVED string +---@field public VARWATCH_RNG_LABEL string +---@field public VARWATCH_RNG_INDEX_LABEL string +---@field public VARWATCH_GLOBAL_TIMER_LABEL string +---@field public VARWATCH_DIST_MOVED_LABEL string ---@field public ADDRESS_USA string ---@field public ADDRESS_JAPAN string ---@field public ADDRESS_SHINDOU string diff --git a/src/core/VarWatch.lua b/src/core/VarWatch.lua index 18d64d4..4202521 100644 --- a/src/core/VarWatch.lua +++ b/src/core/VarWatch.lua @@ -4,25 +4,50 @@ -- SPDX-License-Identifier: GPL-2.0-or-later -- -local var_funcs = { +---@alias VarWatchEntry { label: string?, value: string } + +VarWatch = { + ---@type string[] + processed_values = {}, + + ---@type table + var_funcs = {}, +} + +VarWatch.var_funcs = { ['yaw_facing'] = function() local angle = (Settings.show_effective_angles and Engine.get_effective_angle(Memory.current.mario_facing_yaw) or Memory.current.mario_facing_yaw) local opposite = (Settings.show_effective_angles and (Engine.get_effective_angle(Memory.current.mario_facing_yaw) + 32768) % 65536 or (Memory.current.mario_facing_yaw + 32768) % 65536) - return string.format(Locales.str('VARWATCH_FACING_YAW'), Formatter.angle(angle), Formatter.angle(opposite)) + return { + label = Locales.str('VARWATCH_FACING_YAW_LABEL'), + value = string.format(Locales.str('VARWATCH_FACING_YAW'), + Formatter.angle(angle), Formatter.angle(opposite)) + } end, ['yaw_intended'] = function() local angle = (Settings.show_effective_angles and Engine.get_effective_angle(Memory.current.mario_intended_yaw) or Memory.current.mario_intended_yaw) local opposite = (Settings.show_effective_angles and (Engine.get_effective_angle(Memory.current.mario_intended_yaw) + 32768) % 65536 or (Memory.current.mario_intended_yaw + 32768) % 65536) - return string.format(Locales.str('VARWATCH_INTENDED_YAW'), Formatter.angle(angle), Formatter.angle(opposite)) + return { + label = Locales.str('VARWATCH_INTENDED_YAW_LABEL'), + value = string.format( + Locales.str('VARWATCH_INTENDED_YAW'), Formatter.angle(angle), Formatter.angle(opposite)) + } end, ['h_spd'] = function() local h_speed = Memory.current.mario_h_speed local h_sliding_speed = Engine.GetHSlidingSpeed() - return string.format(Locales.str('VARWATCH_H_SPEED'), Formatter.ups(h_speed), Formatter.ups(h_sliding_speed)) + return { + label = Locales.str('VARWATCH_H_SPEED_LABEL'), + value = string.format(Locales.str('VARWATCH_H_SPEED'), + Formatter.ups(h_speed), Formatter.ups(h_sliding_speed)) + } end, ['v_spd'] = function() local y_speed = Memory.current.mario_v_speed - return string.format(Locales.str('VARWATCH_Y_SPEED'), Formatter.ups(y_speed)) + return { + label = Locales.str('VARWATCH_Y_SPEED_LABEL'), + value = Formatter.ups(y_speed) + } end, ['spd_efficiency'] = function() local spd_efficiency = Engine.GetSpeedEfficiency() @@ -30,71 +55,121 @@ local var_funcs = { local fraction = Formatter.fraction(spd_efficiency, 4) local full = string.format("%s (%s)", percentage, fraction) - return string.format(Locales.str('VARWATCH_SPD_EFFICIENCY'), full) + return { + label = Locales.str('VARWATCH_SPD_EFFICIENCY_LABEL'), + value = full + } end, ['position_x'] = function() - return string.format(Locales.str('VARWATCH_POS_X'), Formatter.u(Memory.current.mario_x)) + return { + label = Locales.str('VARWATCH_POS_X_LABEL'), + value = Formatter.u(Memory.current.mario_x) + } end, ['position_y'] = function() - return string.format(Locales.str('VARWATCH_POS_Y'), Formatter.u(Memory.current.mario_y)) + return { + label = Locales.str('VARWATCH_POS_Y_LABEL'), + value = Formatter.u(Memory.current.mario_y) + } end, ['position_z'] = function() - return string.format(Locales.str('VARWATCH_POS_Z'), Formatter.u(Memory.current.mario_z)) + return { + label = Locales.str('VARWATCH_POS_Z_LABEL'), + value = Formatter.u(Memory.current.mario_z) + } end, ['pitch'] = function() - return string.format(Locales.str('VARWATCH_PITCH'), Formatter.angle(Memory.current.mario_pitch)) + return { + label = Locales.str('VARWATCH_PITCH_LABEL'), + value = Formatter.angle(Memory.current.mario_pitch) + } end, ['yaw_vel'] = function() - return string.format(Locales.str('VARWATCH_YAW_VEL'), Formatter.angle(Memory.current.mario_yaw_vel)) + return { + label = Locales.str('VARWATCH_YAW_VEL_LABEL'), + value = Formatter.angle(Memory.current.mario_yaw_vel) + } end, ['pitch_vel'] = function() - return string.format(Locales.str('VARWATCH_PITCH_VEL'), Formatter.angle(Memory.current.mario_pitch_vel)) + return { + label = Locales.str('VARWATCH_PITCH_VEL_LABEL'), + value = Formatter.angle(Memory.current.mario_pitch_vel) + } end, ['xz_movement'] = function() - return string.format(Locales.str('VARWATCH_XZ_MOVEMENT'), - Formatter.u(Engine.get_xz_distance_moved_since_last_frame())) + return { + label = Locales.str('VARWATCH_XZ_MOVEMENT_LABEL'), + value = Formatter.u(Engine.get_xz_distance_moved_since_last_frame()) + } end, ['action'] = function() local name = Locales.raw().ACTIONS[Memory.current.mario_action] local fallback = Locales.str('VARWATCH_UNKNOWN_ACTION') .. Memory.current.mario_action - return Locales.str('VARWATCH_ACTION') .. (name or fallback) + return { + label = Locales.str('VARWATCH_ACTION_LABEL'), + value = (name or fallback) + } end, ['rng'] = function() - return Locales.str('VARWATCH_RNG') .. - Memory.current.rng_value .. - ' (' .. Locales.str('VARWATCH_RNG_INDEX') .. RNG.get_index(Memory.current.rng_value) .. ')' + return { + label = Locales.str('VARWATCH_RNG_LABEL'), + value = string.format("%d (%s %d)", + Memory.current.rng_value, + Locales.str('VARWATCH_RNG_INDEX_LABEL'), + RNG.get_index(Memory.current.rng_value)) + } end, ['global_timer'] = function() - return string.format(Locales.str('VARWATCH_GLOBAL_TIMER'), (Memory.current.mario_global_timer)) + return { + label = Locales.str('VARWATCH_GLOBAL_TIMER_LABEL'), + value = tostring(Memory.current.mario_global_timer) + } end, ['moved_dist'] = function() local dist = Settings.track_moved_distance and Engine.get_distance_moved() or Settings.moved_distance - return string.format(Locales.str('VARWATCH_DIST_MOVED'), Formatter.u(dist)) + return { + label = Locales.str('VARWATCH_DIST_MOVED_LABEL'), + value = Formatter.u(dist) + } end, ['atan_basic'] = function() - return string.format('E: %s R: %s D: %s N: %s', Settings.atan_exp, - MoreMaths.round(Settings.tas.atan_r, Settings.format_decimal_points), - MoreMaths.round(Settings.tas.atan_d, Settings.format_decimal_points), - MoreMaths.round(Settings.tas.atan_n, Settings.format_decimal_points) - ) + return { + value = string.format('E: %s R: %s D: %s N: %s', Settings.atan_exp, + MoreMaths.round(Settings.tas.atan_r, Settings.format_decimal_points), + MoreMaths.round(Settings.tas.atan_d, Settings.format_decimal_points), + MoreMaths.round(Settings.tas.atan_n, Settings.format_decimal_points) + ) + } end, ['atan_start_frame'] = function() - return 'S: ' .. math.floor(Settings.tas.atan_start + 1) + return { + value = 'S: ' .. math.floor(Settings.tas.atan_start + 1) + } end, } -VarWatch = { - processed_values = {}, -} + VarWatch_compute_value = function(key) - return var_funcs[key]() + return VarWatch.var_funcs[key]() end VarWatch_update = function() VarWatch.processed_values = {} for key, value in pairs(Settings.variables) do - if value.visible then - VarWatch.processed_values[#VarWatch.processed_values + 1] = var_funcs[value.identifier]() + if not value.visible then + goto continue end + + local entry = VarWatch.var_funcs[value.identifier]() + + local str + if entry.label then + str = string.format('%s: %s', entry.label, entry.value) + else + str = entry.value + end + VarWatch.processed_values[#VarWatch.processed_values + 1] = str + + ::continue:: end end diff --git a/src/res/lang/en_US.lua b/src/res/lang/en_US.lua index efd2d96..4c2134d 100644 --- a/src/res/lang/en_US.lua +++ b/src/res/lang/en_US.lua @@ -20,6 +20,7 @@ return { SETTINGS_TAB_NAME = 'Settings', TOOLS_TAB_NAME = 'Tools', TIMER_TAB_NAME = 'Timer', + VISUALIZER_TAB_NAME = 'Visualizer', PRESET = 'Preset ', -- Preset Context Menu PRESET_CONTEXT_MENU_DELETE_ALL = 'Delete All', @@ -130,7 +131,8 @@ This action cannot be undone. SETTINGS_VISUALS_NOTIFICATIONS = 'Notifications', SETTINGS_VISUALS_NOTIFICATIONS_BUBBLE = 'Bubble', SETTINGS_VISUALS_NOTIFICATIONS_CONSOLE = 'Console', - SETTINGS_VISUALS_NOTIFICATIONS_TOOLTIP = 'The style used for notifications.\n Bubble: Show notifications over the game.\n Console: Show notifications in the Lua console.', + SETTINGS_VISUALS_NOTIFICATIONS_TOOLTIP = + 'The style used for notifications.\n Bubble: Show notifications over the game.\n Console: Show notifications in the Lua console.', SETTINGS_VISUALS_FF_FPS = 'FPS during Fast-Forward', SETTINGS_VISUALS_FF_FPS_TOOLTIP = 'The FPS to render at when fast-forwarding. Decrease to increase performance.', SETTINGS_VISUALS_UPDATE_EVERY_VI = 'Update every VI', @@ -144,12 +146,14 @@ This action cannot be undone. SETTINGS_VARWATCH_ANGLE_FORMAT_SHORT = 'Short', SETTINGS_VARWATCH_ANGLE_FORMAT_DEGREE = 'Degree', SETTINGS_VARWATCH_DECIMAL_POINTS = 'Decimal points', - SETTINGS_VARWATCH_ANGLE_FORMAT_TOOLTIP = 'The formatting style for angle variables.\n Short: Formats angles like signed shorts (0-65535)\n Degree: Formats angles in degrees (0-360)', + SETTINGS_VARWATCH_ANGLE_FORMAT_TOOLTIP = + 'The formatting style for angle variables.\n Short: Formats angles like signed shorts (0-65535)\n Degree: Formats angles in degrees (0-360)', SETTINGS_VARWATCH_DECIMAL_POINTS_TOOLTIP = 'The maximum number of decimal places displayed in numbers.', SETTINGS_VARWATCH_SPD_EFFICIENCY = 'Speed Efficiency Visualization', SETTINGS_VARWATCH_SPD_EFFICIENCY_PERCENTAGE = 'Percentage', SETTINGS_VARWATCH_SPD_EFFICIENCY_FRACTION = 'Fraction', - SETTINGS_VARWATCH_SPD_EFFICIENCY_TOOLTIP = 'The formatting style for the speed efficiency variable.\n Percentage: Shows the speed efficiency as a percentage (0-100%)\n Fraction: Shows the speed efficiency as a mathematical fraction (e.g. 1/4)', + SETTINGS_VARWATCH_SPD_EFFICIENCY_TOOLTIP = + 'The formatting style for the speed efficiency variable.\n Percentage: Shows the speed efficiency as a percentage (0-100%)\n Fraction: Shows the speed efficiency as a mathematical fraction (e.g. 1/4)', SETTINGS_MEMORY_FILE_SELECT = 'Select map file...', SETTINGS_MEMORY_DETECT_NOW = 'Autodetect now', SETTINGS_MEMORY_DETECT_ON_START = 'Autodetect on start', @@ -189,25 +193,28 @@ This action cannot be undone. TIMER_MANUAL = 'Manual', TIMER_AUTO = 'Auto', -- Varwatch - VARWATCH_FACING_YAW = 'Facing Yaw: %s (O: %s)', - VARWATCH_INTENDED_YAW = 'Intended Yaw: %s (O: %s)', - VARWATCH_H_SPEED = 'H Spd: %s (S: %s)', - VARWATCH_H_SLIDING = 'H Sliding Spd: %s', - VARWATCH_Y_SPEED = 'Y Spd: %s', - VARWATCH_SPD_EFFICIENCY = 'Spd Efficiency: %s', - VARWATCH_POS_X = 'X: %s', - VARWATCH_POS_Y = 'Y: %s', - VARWATCH_POS_Z = 'Z: %s', - VARWATCH_PITCH = 'Pitch: %s', - VARWATCH_YAW_VEL = 'Yaw Vel: %s', - VARWATCH_PITCH_VEL = 'Pitch Vel: %s', - VARWATCH_XZ_MOVEMENT = 'XZ Movement: %s', - VARWATCH_ACTION = 'Action: ', - VARWATCH_UNKNOWN_ACTION = 'Unknown action ', - VARWATCH_RNG = 'RNG: ', - VARWATCH_RNG_INDEX = 'Index: ', - VARWATCH_GLOBAL_TIMER = 'Global Timer: %s', - VARWATCH_DIST_MOVED = 'Dist Moved: %s', + VARWATCH_FACING_YAW_LABEL = "Facing Yaw", + VARWATCH_FACING_YAW = '%s (O: %s)', + VARWATCH_INTENDED_YAW_LABEL = "Intended Yaw", + VARWATCH_INTENDED_YAW = '%s (O: %s)', + VARWATCH_H_SPEED_LABEL = "H Spd", + VARWATCH_H_SPEED = '%s (S: %s)', + VARWATCH_H_SLIDING_LABEL = 'H Sliding Spd', + VARWATCH_Y_SPEED_LABEL = 'Y Spd', + VARWATCH_SPD_EFFICIENCY_LABEL = 'Spd Efficiency', + VARWATCH_POS_X_LABEL = 'X', + VARWATCH_POS_Y_LABEL = 'Y', + VARWATCH_POS_Z_LABEL = 'Z', + VARWATCH_PITCH_LABEL = 'Pitch', + VARWATCH_YAW_VEL_LABEL = 'Yaw Vel', + VARWATCH_PITCH_VEL_LABEL = 'Pitch Vel', + VARWATCH_XZ_MOVEMENT_LABEL = 'XZ Movement', + VARWATCH_ACTION_LABEL = 'Action', + VARWATCH_RNG_LABEL = 'RNG', + VARWATCH_RNG_INDEX_LABEL = 'Index', + VARWATCH_GLOBAL_TIMER_LABEL = 'Global Timer', + VARWATCH_DIST_MOVED_LABEL = 'Dist Moved', + VARWATCH_UNKNOWN_ACTION = 'unknown action', -- Memory addresses ADDRESS_USA = 'USA', ADDRESS_JAPAN = 'Japan', diff --git a/src/res/lang/fr_FR.lua b/src/res/lang/fr_FR.lua index dcb33f6..e4ef472 100644 --- a/src/res/lang/fr_FR.lua +++ b/src/res/lang/fr_FR.lua @@ -20,6 +20,7 @@ return { SETTINGS_TAB_NAME = 'Paramètres', TOOLS_TAB_NAME = 'Outils', TIMER_TAB_NAME = 'Chronomètre', + VISUALIZER_TAB_NAME = 'Visualiseur', PRESET = 'Préréglage ', -- Preset Context Menu PRESET_CONTEXT_MENU_DELETE_ALL = 'Tout supprimer', diff --git a/src/views/Visualizer.lua b/src/views/Visualizer.lua new file mode 100644 index 0000000..2b852d0 --- /dev/null +++ b/src/views/Visualizer.lua @@ -0,0 +1,191 @@ +-- +-- Copyright (c) 2025, Mupen64 maintainers. +-- +-- SPDX-License-Identifier: GPL-2.0-or-later +-- + +local UID = UIDProvider.allocate_once('Visualizer', function(enum_next) + return { + Joystick = enum_next(), + Labels = enum_next(100), + } +end) + +return { + name = function() return Locales.str('VISUALIZER_TAB_NAME') end, + draw = function() + local text_color = Drawing.foreground_color() + + local FONT_SMALL = ugui.standard_styler.params.font_size * 1.2 + local FONT_BIG = ugui.standard_styler.params.font_size * 1.5 + local function draw_button(pressed, active_color, text, shape, origin_x, origin_y, x, y, w, h, textoffset_x, + textoffset_y, font) + local rect = { + x = origin_x + x * Drawing.scale, + y = origin_y + y * Drawing.scale, + width = w * Drawing.scale, + height = h * Drawing.scale + } + + if shape == "ellipse" then + if pressed then + bg_color = active_color + BreitbandGraphics.fill_ellipse(rect, active_color) + end + BreitbandGraphics.draw_ellipse(rect, text_color, 1) + elseif shape == "rect" then + if pressed then + bg_color = active_color + BreitbandGraphics.fill_rectangle(rect, active_color) + end + BreitbandGraphics.draw_rectangle(rect, text_color, 1) + end + + if textoffset_x == nil then textoffset_x = 6 end + if textoffset_y == nil then textoffset_y = 8 end + + BreitbandGraphics.draw_text2({ + text = text, + rectangle = rect, + font_name = font or ugui.standard_styler.params.monospace_font_name, + font_size = FONT_BIG, + color = text_color, + }) + + return rect + end + + + local theme = Styles.theme() + local joystick_position = { + x = Engine.stick_for_input_x(Settings.tas), + y = -Engine.stick_for_input_y(Settings + .tas) + } + + ugui.joystick({ + uid = UID.Joystick, + rectangle = grid_rect(2, 0, 4, 4), + position = joystick_position + }) + + local rc = grid_rect(1.25, 4, 4, 4) + local x = rc.x + local y = rc.y + draw_button(Joypad.input.A, "#3366CC", "A", "ellipse", x, y, 82, 60, 29, 29, nil, nil) + draw_button(Joypad.input.B, "#009245", "B", "ellipse", x, y, 63, 31, 29, 29, nil, nil) + draw_button(Joypad.input.start, "#EE1C24", "S", "ellipse", x, y, 31, 60, 29, 29, nil, nil) + draw_button(Joypad.input.R, "#DDDDDD", "R", "rect", x, y, 98, 0, 72, 21, nil, nil) + draw_button(Joypad.input.L, "#DDDDDD", "L", "rect", x, y, 9, 0, 72, 21, nil, nil) + draw_button(Joypad.input.Z, "#DDDDDD", "Z", "rect", x, y, 0, 30, 21, 59, nil, nil) + draw_button(Joypad.input.Cleft, "#FFFF00", "3", "ellipse", x, y, 116, 47, 21, 21, 8, 7, "Marlett") + draw_button(Joypad.input.Cright, "#FFFF00", "4", "ellipse", x, y, 155, 47, 21, 21, 9, 7, "Marlett") + draw_button(Joypad.input.Cup, "#FFFF00", "5", "ellipse", x, y, 135, 28, 21, 21, 8, 8, "Marlett") + draw_button(Joypad.input.Cdown, "#FFFF00", "6", "ellipse", x, y, 135, 68, 21, 21, 8, 8, "Marlett") + + local rc2 = grid_rect(0.1, 7, 0, 0) + local available_width = (Drawing.size.width - Drawing.initial_size.width) - + (rc2.x - Drawing.initial_size.width) * 2 + + y = rc2.y + + local function place_entry(uid, label, value, size) + ugui.label({ + uid = uid, + rectangle = { + x = rc2.x, + y = y, + width = available_width, + height = 0 + }, + text = label, + color = text_color, + font_size = size, + font_name = ugui.standard_styler.params.monospace_font_name, + align_x = BreitbandGraphics.alignment.start + }) + + ugui.label({ + uid = uid + 1, + rectangle = { + x = rc2.x, + y = y, + width = available_width, + height = 0 + }, + text = value, + color = text_color, + font_size = size, + font_name = ugui.standard_styler.params.monospace_font_name, + align_x = BreitbandGraphics.alignment['end'] + }) + y = y + size + 4 + return uid + 2 + end + + local function place_separator(uid) + local size = 8 + ugui.label({ + uid = uid, + rectangle = { + x = rc2.x, + y = y, + width = available_width, + height = 0 + }, + text = string.rep('—', 50), + color = text_color, + font_size = size, + font_name = ugui.standard_styler.params.monospace_font_name, + align_x = BreitbandGraphics.alignment['end'] + }) + y = y + size * 2 + return uid + 1 + end + + local current_uid = UID.Labels + + local sample = emu.samplecount() + local active = sample ~= 4294967295 + current_uid = place_entry(current_uid, active and "Frame" or "No movie playing", + active and emu.samplecount() or "", FONT_SMALL) + + current_uid = place_separator(current_uid) + + for _, value in pairs(Settings.variables) do + local entry = VarWatch.var_funcs[value.identifier]() + + if not value.visible or not entry.label then + goto continue + end + + + local size = FONT_SMALL + + local locale = Locales.raw() + local big = { locale.VARWATCH_FACING_YAW_LABEL, locale.VARWATCH_H_SPEED_LABEL, locale.VARWATCH_Y_SPEED_LABEL, + locale.VARWATCH_ACTION_LABEL } + + for _, v in ipairs(big) do + if entry.label == v then + size = FONT_BIG + break + end + end + + local separator_after = { locale.VARWATCH_INTENDED_YAW_LABEL, locale.VARWATCH_SPD_EFFICIENCY_LABEL, locale + .VARWATCH_POS_Z_LABEL } + + current_uid = place_entry(current_uid, entry.label, entry.value, size) + + for _, v in ipairs(separator_after) do + if entry.label == v then + current_uid = place_separator(current_uid) + break + end + end + + ::continue:: + end + end, +}