Mutators: cleaned up GUI and added localization

This commit is contained in:
bi 2018-05-19 13:23:28 +03:00
parent f2b3787866
commit febbd6ebd7
3 changed files with 177 additions and 129 deletions

View file

@ -191,7 +191,11 @@ return {
-- MUTATORS -- MUTATORS
mutator_no_description_provided = {
en = "No description provided."
},
-- Difficulties' names [V1]
easy = { easy = {
en = "Easy" en = "Easy"
}, },
@ -217,6 +221,7 @@ return {
en = "Heroic" en = "Heroic"
}, },
-- Chat messages
broadcast_enabled_mutators = { broadcast_enabled_mutators = {
en = "ENABLED MUTATORS" en = "ENABLED MUTATORS"
}, },
@ -240,6 +245,7 @@ return {
en = "DUE TO CHANGE IN DIFFICULTY" en = "DUE TO CHANGE IN DIFFICULTY"
}, },
-- Interface
mutators_title = { mutators_title = {
en = "Mutators" en = "Mutators"
}, },
@ -253,19 +259,38 @@ return {
en = "Subscribe to mods and mutators on the workshop" en = "Subscribe to mods and mutators on the workshop"
}, },
tooltip_supported_difficulty = { -- Mutator widgets' tooltips
en = "Supported difficulty levels" tooltip_incompatible_mutators = {
en = "\n\n-- INCOMPATIBLE WITH MUTATORS --\n"
}, },
tooltip_incompatible_with_all = { tooltip_compatible_mutators = {
en = "Incompatible with all other mutators" en = "\n\n-- COMPATIBLE ONLY WITH MUTATORS --\n"
}, },
tooltip_incompatible_with = { tooltip_compatible_with_all_mutators = {
en = "Incompatible with" en = "\n\n-- COMPATIBLE WITH ALL MUTATORS --"
}, },
tooltip_compatible_with_all = { tooltip_incompatible_with_all_mutators = {
en = "Compatible with all other mutators" en = "\n\n-- INCOMPATIBLE WITH ALL MUTATORS --"
},
tooltip_incompatible_diffs = {
en = "\n\n-- INCOMPATIBLE WITH DIFFICULTIES --\n"
},
tooltip_compatible_diffs = {
en = "\n\n-- COMPATIBLE ONLY WITH DIFFICULTIES --\n"
},
tooltip_compatible_with_all_diffs = {
en = "\n\n-- COMPATIBLE WITH ALL DIFFICULTIES --"
},
tooltip_conflicts = {
en = "\n\n-- CONFLICTS --\n"
},
tooltip_append_mutator = {
en = " (mutator)"
},
tooltip_append_difficulty = {
en = " (difficulty)"
}, },
tooltip_will_be_disabled = {
en = "Will be disabled when Play is pressed"
}
} }

View file

@ -1,10 +1,9 @@
local vmf = get_mod("VMF") local vmf = get_mod("VMF")
local _MUTATORS = vmf.mutators local _MUTATORS = vmf.mutators
local _SELECTED_DIFFICULTY_KEY local _SELECTED_DIFFICULTY_KEY -- Currently selected difficulty in the map view.
local _DEFINITIONS = dofile("scripts/mods/vmf/modules/ui/mutators/mutators_gui_definitions") local _DEFINITIONS = dofile("scripts/mods/vmf/modules/ui/mutators/mutators_gui_definitions")
local _UI_SCENEGRAPH local _UI_SCENEGRAPH
@ -12,10 +11,9 @@ local _MUTATOR_LIST_WIDGETS = {}
local _PARTY_BUTTON_WIDGET local _PARTY_BUTTON_WIDGET
local _OTHER_WIDGETS = {} local _OTHER_WIDGETS = {}
local _ORIGINAL_VALUES = {} -- @TODO: get rid of it? local _ORIGINAL_VALUES = {} -- @TODO: get rid of it?
local _MUTATOR_LIST_IS_VISIBLE local _IS_MUTATOR_LIST_VISIBLE -- 'true' if Mutator view is active, 'false' if Party view is active.
local _CURRENT_PAGE_NUMBER local _CURRENT_PAGE_NUMBER
local _TOTAL_PAGES_NUMBER local _TOTAL_PAGES_NUMBER
@ -34,9 +32,10 @@ local function get_map_view()
end end
-- Toggles mutator list (switches between Party and Mutators views).
local function show_mutator_list(map_view, is_visible) local function show_mutator_list(map_view, is_visible)
_MUTATOR_LIST_IS_VISIBLE = is_visible _IS_MUTATOR_LIST_VISIBLE = is_visible
if is_visible then if is_visible then
@ -90,14 +89,14 @@ local function change_map_view_look(map_view, is_vmf_look)
end end
end end
--@TODO: clean up, and probably do direct change instead of return -- Used in the next function to calculate tooltip offset, since Fatshark's solution doesn't support
-- tooltips with cursor being in the left-bottom corner.
local function calculate_tooltip_offset (widget_content, widget_style, ui_renderer) local function calculate_tooltip_offset (widget_content, widget_style, ui_renderer)
--local cursor_offset_bottom = widget_style.cursor_offset_bottom local input_service = ui_renderer.input_service
if input_service then
if ui_renderer.input_service then local cursor_position = UIInverseScaleVectorToResolution(input_service:get("cursor"))
local cursor_position = UIInverseScaleVectorToResolution(ui_renderer.input_service.get(ui_renderer.input_service, "cursor"))
if cursor_position then if cursor_position then
local text = widget_content.tooltip_text local text = widget_content.tooltip_text
@ -115,27 +114,20 @@ local function calculate_tooltip_offset (widget_content, widget_style, ui_render
local tooltip_height = full_font_height * num_texts local tooltip_height = full_font_height * num_texts
--if((cursor_offset_bottom[2] / UIResolutionScale() + tooltip_height) > cursor_position[2]) then widget_style.cursor_offset[1] = widget_style.cursor_default_offset[1]
widget_style.cursor_offset[2] = widget_style.cursor_default_offset[2] - (tooltip_height * UIResolutionScale())
local cursor_offset_top = {}
cursor_offset_top[1] = widget_style.cursor_offset_top[1]
cursor_offset_top[2] = widget_style.cursor_offset_top[2] - (tooltip_height * UIResolutionScale())
return cursor_offset_top
--else
-- return cursor_offset_bottom
--end
end end
end end
--return cursor_offset_bottom
end end
-- Callback function for mutator widgets. It's not defined in definitions file because it works with
-- mutators array and vmf.various_internal_functions.
local function offset_function_callback(ui_scenegraph_, style, content, ui_renderer) local function offset_function_callback(ui_scenegraph_, style, content, ui_renderer)
local mutator = content.mutator local mutator = content.mutator
-- Find out if mutator can be enabled.
local can_be_enabled = true local can_be_enabled = true
local mutator_compatibility_config = mutator:get_config().compatibility local mutator_compatibility_config = mutator:get_config().compatibility
@ -154,7 +146,7 @@ local function offset_function_callback(ui_scenegraph_, style, content, ui_rende
content.can_be_enabled = can_be_enabled content.can_be_enabled = can_be_enabled
-- Enable/disable mutator -- Enable/disable mutator.
if content.highlight_hotspot.on_release then if content.highlight_hotspot.on_release then
if mutator:is_enabled() then if mutator:is_enabled() then
vmf.set_mutator_state(mutator, false, false) vmf.set_mutator_state(mutator, false, false)
@ -164,36 +156,41 @@ local function offset_function_callback(ui_scenegraph_, style, content, ui_rende
end end
-- Tooltip -- Build tooltip (only for currently selected mutator widget).
-- Yup, a boilerplate code, kinda. I made it to divide tooltip code part, and to update it only for selected mod.
if content.highlight_hotspot.is_hover then if content.highlight_hotspot.is_hover then
-- DESCRIPTION
local tooltip_text = content.description local tooltip_text = content.description
-- MUTATORS COMPATIBILITY
local incompatible_mods = {} local incompatible_mods = {}
local conflicting_mods = {}
if next(except) then if next(except) then
tooltip_text = tooltip_text .. "\n\n" .. tooltip_text = tooltip_text .. (is_mostly_compatible and vmf:localize("tooltip_incompatible_mutators") or
(is_mostly_compatible and "-- INCOMPATIBLE WITH [MUTATORS] --\n" or vmf:localize("tooltip_compatible_mutators"))
"-- COMPATIBLE ONLY WITH [MUTATORS] --\n") --@TODO: localize
for other_mutator, _ in pairs(except) do for other_mutator, _ in pairs(except) do
table.insert(incompatible_mods, " * " .. other_mutator:get_readable_name()) table.insert(incompatible_mods, " * " .. other_mutator:get_readable_name())
end end
tooltip_text = tooltip_text .. table.concat(incompatible_mods, "\n") tooltip_text = tooltip_text .. table.concat(incompatible_mods, "\n")
else
if is_mostly_compatible then
tooltip_text = tooltip_text .. vmf:localize("tooltip_compatible_with_all_mutators")
else
tooltip_text = tooltip_text .. vmf:localize("tooltip_incompatible_with_all_mutators")
end
end end
-- DIFFICULTIES COMPATIBILITY
local difficulties = {} local difficulties = {}
local compatible_difficulties_number = mutator_compatibility_config.compatible_difficulties_number local compatible_difficulties_number = mutator_compatibility_config.compatible_difficulties_number
if compatible_difficulties_number < 8 then if compatible_difficulties_number < 8 then
tooltip_text = tooltip_text .. "\n\n" .. tooltip_text = tooltip_text .. (compatible_difficulties_number > 4 and
(compatible_difficulties_number > 4 and "-- INCOMPATIBLE WITH [DIFFICULTIES] --\n" or vmf:localize("tooltip_incompatible_diffs") or
"-- COMPATIBLE ONLY WITH [DIFFICULTIES] --\n") --@TODO: localize vmf:localize("tooltip_compatible_diffs"))
for difficulty_key, is_compatible in pairs(mutator_compatibility_config.compatible_difficulties) do for difficulty_key, is_compatible in pairs(mutator_compatibility_config.compatible_difficulties) do
if compatible_difficulties_number > 4 and not is_compatible if compatible_difficulties_number > 4 and not is_compatible
@ -203,40 +200,45 @@ local function offset_function_callback(ui_scenegraph_, style, content, ui_rende
end end
tooltip_text = tooltip_text .. table.concat(difficulties, "\n") tooltip_text = tooltip_text .. table.concat(difficulties, "\n")
else
tooltip_text = tooltip_text .. vmf:localize("tooltip_compatible_with_all_diffs")
end end
-- CONFLICTS
if not can_be_enabled then
tooltip_text = tooltip_text .. vmf:localize("tooltip_conflicts")
local conflicting_mods = {}
for _, other_mutator in ipairs(_MUTATORS) do for _, other_mutator in ipairs(_MUTATORS) do
if other_mutator:is_enabled() and other_mutator ~= mutator then if other_mutator:is_enabled() and other_mutator ~= mutator then
if not (is_mostly_compatible and not except[other_mutator] or if not (is_mostly_compatible and not except[other_mutator] or
not is_mostly_compatible and except[other_mutator]) then not is_mostly_compatible and except[other_mutator]) then
table.insert(conflicting_mods, " * " .. other_mutator:get_readable_name() .. " (mutator)")
table.insert(conflicting_mods, " * " .. other_mutator:get_readable_name() ..
vmf:localize("tooltip_append_mutator"))
end end
end end
end end
if not can_be_enabled then
--tooltip_text = tooltip_text .. "\n\n" .. "--[X]-- CONFLICTS --[X]--\n"
tooltip_text = tooltip_text .. "\n\n" .. "-- CONFLICTS --\n"
if #conflicting_mods > 0 then if #conflicting_mods > 0 then
tooltip_text = tooltip_text .. table.concat(conflicting_mods, "\n") .. "\n" tooltip_text = tooltip_text .. table.concat(conflicting_mods, "\n") .. "\n"
end end
if not mutator_compatibility_config.compatible_difficulties[_SELECTED_DIFFICULTY_KEY] then if not mutator_compatibility_config.compatible_difficulties[_SELECTED_DIFFICULTY_KEY] then
tooltip_text = tooltip_text .. " * " .. vmf:localize(_SELECTED_DIFFICULTY_KEY) .. " (difficulty)" .. "\n" tooltip_text = tooltip_text .. " * " .. vmf:localize(_SELECTED_DIFFICULTY_KEY) ..
vmf:localize("tooltip_append_difficulty")
end end
--tooltip_text = tooltip_text .. "--[X]--\n"
end end
-- Applying tooltip
content.tooltip_text = tooltip_text content.tooltip_text = tooltip_text
calculate_tooltip_offset(content, style.tooltip_text, ui_renderer)
style.tooltip_text.cursor_offset = calculate_tooltip_offset(content, style.tooltip_text, ui_renderer)
end end
-- VISUAL
-- Visual changing (text color and checkboxes).
local is_enabled = content.mutator:is_enabled() local is_enabled = content.mutator:is_enabled()
style.text.text_color = content.can_be_enabled and (is_enabled and content.text_color_enabled or style.text.text_color = content.can_be_enabled and (is_enabled and content.text_color_enabled or
@ -288,7 +290,7 @@ local function draw(map_view, dt)
-- Party button -- Party button
UIRenderer.draw_widget(ui_renderer, _PARTY_BUTTON_WIDGET) UIRenderer.draw_widget(ui_renderer, _PARTY_BUTTON_WIDGET)
if _MUTATOR_LIST_IS_VISIBLE then if _IS_MUTATOR_LIST_VISIBLE then
-- Mutator list (render only 8 (or less) currently visible mutator widgets) -- Mutator list (render only 8 (or less) currently visible mutator widgets)
for i = ((_CURRENT_PAGE_NUMBER - 1) * 8 + 1), (_CURRENT_PAGE_NUMBER * 8) do for i = ((_CURRENT_PAGE_NUMBER - 1) * 8 + 1), (_CURRENT_PAGE_NUMBER * 8) do
@ -308,6 +310,7 @@ local function draw(map_view, dt)
end end
-- Reads mousewheel scrolls from corresponding widget and changes current page number, if possible.
local function update_mousewheel_scroll_area_input() local function update_mousewheel_scroll_area_input()
local widget_content = _OTHER_WIDGETS.mousewheel_scroll_area.content local widget_content = _OTHER_WIDGETS.mousewheel_scroll_area.content
local mouse_scroll_value = widget_content.scroll_value local mouse_scroll_value = widget_content.scroll_value
@ -363,14 +366,7 @@ end)
-- ##### VMF internal functions and variables ######################################################################### -- ##### VMF internal functions and variables #########################################################################
-- #################################################################################################################### -- ####################################################################################################################
function vmf.reset_map_view() -- Changes map_view VMF way
local map_view = get_map_view()
if map_view then
change_map_view_look(map_view, false)
show_mutator_list(map_view, false)
end
end
function vmf.modify_map_view() function vmf.modify_map_view()
local map_view = get_map_view() local map_view = get_map_view()
if map_view then if map_view then
@ -378,6 +374,11 @@ function vmf.modify_map_view()
end end
end end
-- #################################################################################################################### -- Restores map_view to its defaults
-- ##### Script ####################################################################################################### function vmf.reset_map_view()
-- #################################################################################################################### local map_view = get_map_view()
if map_view then
change_map_view_look(map_view, false)
show_mutator_list(map_view, false)
end
end

View file

@ -1,51 +1,72 @@
local vmf = get_mod("VMF")
local scenegraph_definition = { local scenegraph_definition = {
sg_root = { sg_root = {
is_root = true,
size = {1920, 1080}, size = {1920, 1080},
position = {0, 0, UILayer.default} position = {0, 0, UILayer.default},
is_root = true,
},
-- fix for fullhd windowed (not fullscreen) mode (if everything else will inherit from sg_root, its children will
-- stick to the window border instead of the black gap)
sg_placeholder = {
size = {1920, 1080},
position = {0, 0, 1},
parent = "sg_root",
horizontal_alignment = "center",
vertical_alignment = "center"
}, },
sg_mutators_list_background = { sg_mutators_list_background = {
vertical_alignment = "bottom",
parent = "sg_root",
horizontal_alignment = "left",
size = {547, 313}, size = {547, 313},
position = {-2, -2, 10} -- @TODO: fix the actual image position = {-2, -2, 2}, -- @TODO: fix the actual image (-2 px plus image overlaping text)
parent = "sg_placeholder",
horizontal_alignment = "left",
vertical_alignment = "bottom"
}, },
sg_mutators_button = { sg_mutators_button = {
vertical_alignment = "bottom",
parent = "sg_root",
horizontal_alignment = "left",
size = {64, 64}, size = {64, 64},
position = {87, 430.5, 10} position = {87, 430.5, 2},
parent = "sg_placeholder",
horizontal_alignment = "left",
vertical_alignment = "bottom"
}, },
sg_mutators_list = { sg_mutators_list = {
vertical_alignment = "bottom",
horizontal_alignment = "left",
size = {370, 265}, size = {370, 265},
position = {80, 61, 11}, --122 position = {80, 61, 3},
parent = "sg_root" parent = "sg_placeholder",
vertical_alignment = "bottom",
horizontal_alignment = "left"
}, },
sg_mutators_list_start = { sg_mutators_list_start = {
vertical_alignment = "top",
horizontal_alignment = "left",
size = {1, 1}, size = {1, 1},
offset = {0, 0, 1}, offset = {0, 0, 3},
parent = "sg_mutators_list" parent = "sg_mutators_list",
},
vertical_alignment = "top",
horizontal_alignment = "left"
}
} }
local widgets_definition = { local widgets_definition = {
-- That photoshopped background texture which expands displayed list area
mutator_list_background = { mutator_list_background = {
scenegraph_id = "sg_root", scenegraph_id = "sg_root",
element = { element = {
@ -66,8 +87,7 @@ local widgets_definition = {
} }
} }
}, },
--[[ --[[
mutators_list_debug = { mutators_list_debug = {
scenegraph_id = "sg_mutators_list", scenegraph_id = "sg_mutators_list",
element = { element = {
@ -86,8 +106,9 @@ local widgets_definition = {
}, },
} }
}, },
]] ]]
-- Widgets that detects mousewheel scrolls inside itself
mousewheel_scroll_area = { mousewheel_scroll_area = {
scenegraph_id = "sg_mutators_list", scenegraph_id = "sg_mutators_list",
element = { element = {
@ -104,10 +125,10 @@ local widgets_definition = {
scroll_value = 0 scroll_value = 0
}, },
style = {} style = {}
}, }
} }
-- The 4th button, which will toggle old "Party" view (which is replaced by "Mutators" view)
local party_button_widget_defenition = UIWidgets.create_octagon_button( local party_button_widget_defenition = UIWidgets.create_octagon_button(
{ {
"map_view_party_button", "map_view_party_button",
@ -120,7 +141,7 @@ local party_button_widget_defenition = UIWidgets.create_octagon_button(
"sg_mutators_button" "sg_mutators_button"
) )
-- Creates a widget for every mutator (that string with checkbox)
local function create_mutator_widget(mutator, offset_function_callback) local function create_mutator_widget(mutator, offset_function_callback)
return { return {
scenegraph_id = "sg_mutators_list_start", scenegraph_id = "sg_mutators_list_start",
@ -139,10 +160,12 @@ local function create_mutator_widget(mutator, offset_function_callback)
{ {
pass_type = "local_offset", pass_type = "local_offset",
-- The function is executed inside of 'mutators_gui.lua', since it has to interact with mutator list a lot
offset_function = offset_function_callback offset_function = offset_function_callback
}, },
{ {
pass_type = "texture", pass_type = "texture",
style_id = "hover_texture", style_id = "hover_texture",
texture_id = "hover_texture", texture_id = "hover_texture",
content_check_function = function (content) content_check_function = function (content)
@ -157,6 +180,7 @@ local function create_mutator_widget(mutator, offset_function_callback)
}, },
{ {
pass_type = "texture", pass_type = "texture",
style_id = "checkbox_style", style_id = "checkbox_style",
texture_id = "checkbox_texture" texture_id = "checkbox_texture"
}, },
@ -175,22 +199,21 @@ local function create_mutator_widget(mutator, offset_function_callback)
mutator = nil, -- is added after creation (i can't add mutator here now, becuase UIWidget.init() clones tables) mutator = nil, -- is added after creation (i can't add mutator here now, becuase UIWidget.init() clones tables)
text = mutator:get_readable_name(), text = mutator:get_readable_name(),
description = mutator:get_description() or vmf:localize("mutator_no_description_provided"),
description = mutator:get_description() or "No description provided.", --@TODO: localize
can_be_enabled = false, can_be_enabled = false,
mutators_list_background_texture_id = "map_view_mutators_area",
highlight_hotspot = {}, highlight_hotspot = {},
tooltip_text = "", tooltip_text = "", -- is always being changed in local_offset pass
--hover_texture = "map_setting_bg_fade",
hover_texture = "playerlist_hover", hover_texture = "playerlist_hover",
checkbox_texture = "checkbox_unchecked", checkbox_texture = "checkbox_unchecked", -- is always being changed in local_offset pass
checkbox_unchecked_texture = "checkbox_unchecked", -- unsused -- Presets
checkbox_checked_texture = "checkbox_checked", -- unsused checkbox_unchecked_texture = "checkbox_unchecked",
checkbox_checked_texture = "checkbox_checked",
text_color_disabled = Colors.get_color_table_with_alpha("white", 255), text_color_disabled = Colors.get_color_table_with_alpha("white", 255),
text_color_enabled = Colors.get_color_table_with_alpha("cheeseburger", 255), text_color_enabled = Colors.get_color_table_with_alpha("cheeseburger", 255),
@ -209,7 +232,7 @@ local function create_mutator_widget(mutator, offset_function_callback)
font_size = 24, font_size = 24,
font_type = "hell_shark", font_type = "hell_shark",
dynamic_font = true, dynamic_font = true,
text_color = Colors.get_color_table_with_alpha("white", 255) text_color = Colors.get_color_table_with_alpha("white", 255) -- is always being changed in local_offset pass
}, },
hover_texture = { hover_texture = {
@ -230,9 +253,8 @@ local function create_mutator_widget(mutator, offset_function_callback)
vertical_alignment = "top", vertical_alignment = "top",
cursor_side = "right", cursor_side = "right",
max_width = 425, max_width = 425,
cursor_offset = {27, 27}, cursor_offset = {0, 0}, -- is always being changed in local_offset pass
cursor_offset_bottom = {27, 27}, cursor_default_offset = {27, -27}
cursor_offset_top = {27, -27}
}, },
size = {370, 32}, size = {370, 32},