Convert readme and science info

This commit is contained in:
Cooldude2606
2025-01-22 00:41:29 +00:00
parent bd6781b3a0
commit 6f9a062190
9 changed files with 401 additions and 166 deletions

View File

@@ -5,8 +5,8 @@
]]
local ExpUtil = require("modules/exp_util")
local Gui = require("modules/exp_gui")
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Commands = require("modules/exp_commands") --- @dep expcore.commands
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
@@ -23,9 +23,8 @@ local title_width = 270 -- controls the centering of the titles
local scroll_height = 275 -- controls the height of the scrolls
--- Sub content area used within the content areas
-- @element sub_content
local sub_content =
Gui.element{
local sub_content = Gui.element("readme_sub_content")
:draw{
type = "frame",
direction = "vertical",
style = "inside_deep_frame",
@@ -38,10 +37,9 @@ local sub_content =
}
--- Table which has a title above it above it
-- @element title_table
local title_table =
Gui.element(function(_, parent, bar_size, caption, column_count)
Gui.title_label(parent, bar_size, caption)
local title_table = Gui.element("readme_title_table")
:draw(function(_, parent, bar_size, caption, column_count)
Gui.elements.title_label(parent, bar_size, caption)
return parent.add{
type = "table",
@@ -56,10 +54,9 @@ local title_table =
horizontally_stretchable = true,
}
--- Scroll to be used with Gui.title_label tables
-- @element title_table_scroll
local title_table_scroll =
Gui.element{
--- Scroll to be used with Gui.elements.title_label tables
local title_table_scroll = Gui.element("readme_title_table_scroll")
:draw{
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
@@ -73,9 +70,8 @@ local title_table_scroll =
}
--- Used to connect to servers in server list
-- @element join_server
local join_server =
Gui.element(function(_, parent, server_id, wrong_version)
local join_server = Gui.element("readme_join_server")
:draw(function(_, parent, server_id, wrong_version)
local status = External.get_server_status(server_id) or "Offline"
if wrong_version then status = "Version" end
local flow = parent.add{ name = server_id, type = "flow" }
@@ -103,22 +99,25 @@ local join_server =
return button
end)
:style(Gui.sprite_style(20, -1))
:on_click(function(player, element, _)
local server_id = element.parent.name
:style{
size = 20,
padding = -1,
}
:on_click(function(def, event)
local player = Gui.get_player(event)
local server_id = event.element.parent.name
External.request_connection(player, server_id, true)
end)
local welcome_time_format = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true }
--- Content area for the welcome tab
-- @element welcome_content
define_tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" }, Gui.element("readme_welcome")
:draw(function(_, parent)
local server_details = { name = "ExpGaming S0 - Local", welcome = "Failed to load description: disconnected from external api.", reset_time = "Non Set", branch = "Unknown" }
if External.valid() then server_details = External.get_current_server() end
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
local player = Gui.get_player(parent)
-- Set up the top flow with logos
local top_flow = container.add{ type = "flow" }
@@ -128,9 +127,9 @@ define_tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" },
top_vertical_flow.style.horizontal_align = "center"
-- Add the title and description to the top flow
Gui.title_label(top_vertical_flow, 62, "Welcome to " .. server_details.name)
Gui.centered_label(top_vertical_flow, 380, server_details.welcome)
Gui.bar(container)
Gui.elements.title_label(top_vertical_flow, 62, "Welcome to " .. server_details.name)
Gui.elements.centered_label(top_vertical_flow, 380, server_details.welcome)
Gui.elements.bar(container)
-- Get the names of the roles the player has
local player_roles = Roles.get_player_roles(player)
@@ -142,75 +141,72 @@ define_tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" },
-- Add the other information to the gui
container.add{ type = "flow" }.style.height = 4
local online_time = welcome_time_format(game.tick)
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-general", server_details.reset_time, online_time })
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-roles", table.concat(role_names, ", ") })
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-chat" })
Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-general", server_details.reset_time, online_time })
Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-roles", table.concat(role_names, ", ") })
Gui.elements.centered_label(sub_content(container), frame_width, { "readme.welcome-chat" })
return container
end))
--- Content area for the rules tab
-- @element rules_content
define_tab({ "readme.rules-tab" }, { "readme.rules-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.rules-tab" }, { "readme.rules-tooltip" }, Gui.element("readme_rules")
:draw(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width - 3, { "readme.rules-tab" })
Gui.centered_label(container, frame_width, { "readme.rules-general" })
Gui.bar(container)
Gui.elements.title_label(container, title_width - 3, { "readme.rules-tab" })
Gui.elements.centered_label(container, frame_width, { "readme.rules-general" })
Gui.elements.bar(container)
container.add{ type = "flow" }
-- Add a table for the rules
local rules = Gui.scroll_table(container, scroll_height, 1) --[[@as LuaGuiElement]]
local rules = Gui.elements.scroll_table(container, scroll_height, 1) --[[@as LuaGuiElement]]
rules.style = "bordered_table"
rules.style.cell_padding = 4
-- Add the rules to the table
for i = 1, 15 do
Gui.centered_label(rules, 565, { "readme.rules-" .. i })
Gui.elements.centered_label(rules, 565, { "readme.rules-" .. i })
end
return container
end))
--- Content area for the commands tab
-- @element commands_content
define_tab({ "readme.commands-tab" }, { "readme.commands-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.commands-tab" }, { "readme.commands-tooltip" }, Gui.element("readme_commands")
:draw(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
local player = Gui.get_player(parent)
-- Add the title and description to the content
Gui.title_label(container, title_width - 20, { "readme.commands-tab" })
Gui.centered_label(container, frame_width, { "readme.commands-general" })
Gui.bar(container)
Gui.elements.title_label(container, title_width - 20, { "readme.commands-tab" })
Gui.elements.centered_label(container, frame_width, { "readme.commands-general" })
Gui.elements.bar(container)
container.add{ type = "flow" }
-- Add a table for the commands
local commands = Gui.scroll_table(container, scroll_height, 2) --[[@as LuaGuiElement]]
local commands = Gui.elements.scroll_table(container, scroll_height, 2) --[[@as LuaGuiElement]]
commands.style = "bordered_table"
commands.style.cell_padding = 0
-- Add the rules to the table
for name, command in pairs(Commands.list_for_player(player)) do
Gui.centered_label(commands, 120, name)
Gui.centered_label(commands, 450, command.description)
Gui.elements.centered_label(commands, 120, name)
Gui.elements.centered_label(commands, 450, command.description)
end
return container
end))
--- Content area for the servers tab
-- @element servers_content
define_tab({ "readme.servers-tab" }, { "readme.servers-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.servers-tab" }, { "readme.servers-tooltip" }, Gui.element("readme_servers")
:draw(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width - 10, { "readme.servers-tab" })
Gui.centered_label(container, frame_width, { "readme.servers-general" })
Gui.bar(container)
Gui.elements.title_label(container, title_width - 10, { "readme.servers-tab" })
Gui.elements.centered_label(container, frame_width, { "readme.servers-general" })
Gui.elements.bar(container)
container.add{ type = "flow" }
-- Draw the scroll
@@ -222,15 +218,15 @@ define_tab({ "readme.servers-tab" }, { "readme.servers-tooltip" },
local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 3)
local current_version = External.get_current_server().version
for server_id, server in pairs(External.get_servers()) do
Gui.centered_label(factorio_servers, 110, server.short_name)
Gui.centered_label(factorio_servers, 436, server.description)
Gui.elements.centered_label(factorio_servers, 110, server.short_name)
Gui.elements.centered_label(factorio_servers, 436, server.description)
join_server(factorio_servers, server_id, current_version ~= server.version and server.version)
end
else
local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 2)
for i = 1, 8 do
Gui.centered_label(factorio_servers, 110, { "readme.servers-" .. i })
Gui.centered_label(factorio_servers, 460, { "readme.servers-d" .. i })
Gui.elements.centered_label(factorio_servers, 110, { "readme.servers-" .. i })
Gui.elements.centered_label(factorio_servers, 460, { "readme.servers-d" .. i })
end
end
@@ -238,23 +234,22 @@ define_tab({ "readme.servers-tab" }, { "readme.servers-tooltip" },
local external_links = title_table(scroll_pane, 235, { "readme.servers-external" }, 2)
for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do
local upper_key = key:gsub("^%l", string.upper)
Gui.centered_label(external_links, 110, upper_key)
Gui.centered_label(external_links, 460, { "links." .. key }, { "readme.servers-open-in-browser" })
Gui.elements.centered_label(external_links, 110, upper_key)
Gui.elements.centered_label(external_links, 460, { "links." .. key }, { "readme.servers-open-in-browser" })
end
return container
end))
--- Content area for the servers tab
-- @element backers_content
define_tab({ "readme.backers-tab" }, { "readme.backers-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.backers-tab" }, { "readme.backers-tooltip" }, Gui.element("readme_backers")
:draw(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width - 10, { "readme.backers-tab" })
Gui.centered_label(container, frame_width, { "readme.backers-general" })
Gui.bar(container)
Gui.elements.title_label(container, title_width - 10, { "readme.backers-tab" })
Gui.elements.centered_label(container, frame_width, { "readme.backers-general" })
Gui.elements.bar(container)
container.add{ type = "flow" }
-- Find which players will go where
@@ -296,12 +291,12 @@ define_tab({ "readme.backers-tab" }, { "readme.backers-tooltip" },
for _, players in ipairs(groups) do
local table = title_table(scroll_pane, players._width, players._title, 4)
for _, player_name in ipairs(players) do
Gui.centered_label(table, 140, player_name)
Gui.elements.centered_label(table, 140, player_name)
end
if #players < 4 then
for i = 1, 4 - #players do
Gui.centered_label(table, 140)
Gui.elements.centered_label(table, 140)
end
end
end
@@ -310,11 +305,10 @@ define_tab({ "readme.backers-tab" }, { "readme.backers-tooltip" },
end))
--- Content area for the player data tab
-- @element commands_content
define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
Gui.element(function(_, parent)
define_tab({ "readme.data-tab" }, { "readme.data-tooltip" }, Gui.element("readme_data")
:draw(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
local player = Gui.get_player(parent)
local player_name = player.name
local enum = PlayerData.PreferenceEnum
@@ -323,24 +317,24 @@ define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
preference = enum[preference]
-- Add the title and description to the content
Gui.title_label(container, title_width, { "readme.data-tab" })
Gui.centered_label(container, frame_width, { "readme.data-general" })
Gui.bar(container)
Gui.elements.title_label(container, title_width, { "readme.data-tab" })
Gui.elements.centered_label(container, frame_width, { "readme.data-general" })
Gui.elements.bar(container)
container.add{ type = "flow" }
local scroll_pane = title_table_scroll(container)
-- Add the required area
local required = title_table(scroll_pane, 250, { "readme.data-required" }, 2)
Gui.centered_label(required, 150, preference_meta.name, preference_meta.tooltip)
Gui.centered_label(required, 420, { "expcore-data.preference-" .. enum[preference] }, preference_meta.value_tooltip)
Gui.elements.centered_label(required, 150, preference_meta.name, preference_meta.tooltip)
Gui.elements.centered_label(required, 420, { "expcore-data.preference-" .. enum[preference] }, preference_meta.value_tooltip)
for name, child in pairs(PlayerData.Required.children) do
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(required, 150, metadata.name or { "exp-required." .. name }, metadata.tooltip or { "exp-required." .. name .. "-tooltip" })
Gui.centered_label(required, 420, tostring(value), metadata.value_tooltip or { "exp-required." .. name .. "-value-tooltip" })
Gui.elements.centered_label(required, 150, metadata.name or { "exp-required." .. name }, metadata.tooltip or { "exp-required." .. name .. "-tooltip" })
Gui.elements.centered_label(required, 420, tostring(value), metadata.value_tooltip or { "exp-required." .. name .. "-value-tooltip" })
end
end
@@ -353,8 +347,8 @@ define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
if not metadata.permission or Roles.player_allowed(player, metadata.permission) then
if metadata.stringify then value = metadata.stringify(value) end
if value == nil then value = "None set" end
Gui.centered_label(settings, 150, metadata.name or { "exp-settings." .. name }, metadata.tooltip or { "exp-settings." .. name .. "-tooltip" })
Gui.centered_label(settings, 420, tostring(value), metadata.value_tooltip or { "exp-settings." .. name .. "-value-tooltip" })
Gui.elements.centered_label(settings, 150, metadata.name or { "exp-settings." .. name }, metadata.tooltip or { "exp-settings." .. name .. "-tooltip" })
Gui.elements.centered_label(settings, 420, tostring(value), metadata.value_tooltip or { "exp-settings." .. name .. "-value-tooltip" })
end
end
end
@@ -374,12 +368,12 @@ define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
else
value = format_number(value or 0, false)
end
Gui.centered_label(statistics, 150, metadata.name or { "exp-statistics." .. name }, metadata.tooltip or { "exp-statistics." .. name .. "-tooltip" })
Gui.centered_label(statistics, 130, { "readme.data-format", value, metadata.unit or "" }, metadata.value_tooltip or { "exp-statistics." .. name .. "-tooltip" })
Gui.elements.centered_label(statistics, 150, metadata.name or { "exp-statistics." .. name }, metadata.tooltip or { "exp-statistics." .. name .. "-tooltip" })
Gui.elements.centered_label(statistics, 130, { "readme.data-format", value, metadata.unit or "" }, metadata.value_tooltip or { "exp-statistics." .. name .. "-tooltip" })
end
end
if count > 0 then for i = 1, count do Gui.centered_label(statistics, 140) end end
if count > 0 then for i = 1, count do Gui.elements.centered_label(statistics, 140) end end
end
-- Add the misc area
@@ -394,8 +388,8 @@ define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(misc, 150, metadata.name or name, metadata.tooltip)
Gui.centered_label(misc, 420, tostring(value), metadata.value_tooltip)
Gui.elements.centered_label(misc, 150, metadata.name or name, metadata.tooltip)
Gui.elements.centered_label(misc, 420, tostring(value), metadata.value_tooltip)
end
end
end
@@ -405,18 +399,17 @@ define_tab({ "readme.data-tab" }, { "readme.data-tooltip" },
end))
--- Main readme container for the center flow
-- @element readme
local readme_toggle
local readme =
Gui.element(function(definition, parent)
local readme = Gui.element("readme")
:draw(function(def, parent)
local container = parent.add{
name = definition.name,
name = def.name,
type = "frame",
style = "invisible_frame",
}
-- Add the left hand side of the frame back, removed because of frame_tabbed_pane style
local left_alignment = Gui.alignment(container, nil, nil, "bottom")
local left_alignment = Gui.elements.aligned_flow(container, { vertical_align = "bottom" })
left_alignment.style.padding = { 32, 0, 0, 0 }
local left_side =
@@ -443,22 +436,31 @@ local readme =
return container
end)
:static_name(Gui.unique_static_name)
:on_open(function(player)
Gui.toggle_toolbar_button(player, readme_toggle, true)
:on_opened(function(def, event)
local player = Gui.get_player(event)
local button = Gui.get_top_element(readme_toggle, player)
Gui.set_toolbar_button_style(button, true)
end)
:on_close(function(player, element)
Gui.toggle_toolbar_button(player, readme_toggle, false)
Gui.destroy_if_valid(element)
:on_closed(function(def, event)
local player = Gui.get_player(event)
local button = Gui.get_top_element(readme_toggle, player)
Gui.set_toolbar_button_style(button, false)
Gui.destroy_if_valid(event.element)
end)
--- Toggle button for the readme gui
-- @element readme_toggle
readme_toggle =
Gui.toolbar_button("virtual-signal/signal-info", { "readme.main-tooltip" }, function(player)
return Roles.player_allowed(player, "gui/readme")
end)
:on_click(function(player, _)
Gui.create_toolbar_button{
name = "readme_toggle",
auto_toggle = true,
sprite = "virtual-signal/signal-info",
tooltip = { "readme.main-tooltip" },
visible = function(player, element)
return Roles.player_allowed(player, "gui/readme")
end
}
:on_click(function(def, event)
local player = Gui.get_player(event)
local center = player.gui.center
if center[readme.name] then
player.opened = nil
@@ -475,18 +477,13 @@ Event.add(defines.events.on_player_created, function(event)
player.opened = element
end)
--- When a player joins clear center unless the player has something open
Event.add(defines.events.on_player_joined_game, function(event)
local function clear_readme(event)
local player = game.players[event.player_index]
if not player.opened then
player.gui.center.clear()
Gui.destroy_if_valid(player.gui.center[readme.name])
end
end)
end
--- When a player respawns clear center unless the player has something open
Event.add(defines.events.on_player_respawned, function(event)
local player = game.players[event.player_index]
if not player.opened then
player.gui.center.clear()
end
end)
--- When a player joins or respawns, clear center unless the player has something open
Event.add(defines.events.on_player_joined_game, clear_readme)
Event.add(defines.events.on_player_respawned, clear_readme)