mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-05-28 06:09:54 +09:00
Refactor readme gui
This commit is contained in:
@@ -76,6 +76,7 @@ add(require("modules/exp_scenario/gui/player_bonus"))
|
||||
add(require("modules/exp_scenario/gui/player_stats"))
|
||||
add(require("modules/exp_scenario/gui/production_stats"))
|
||||
add(require("modules/exp_scenario/gui/quick_actions"))
|
||||
add(require("modules/exp_scenario/gui/readme"))
|
||||
add(require("modules/exp_scenario/gui/research_milestones"))
|
||||
add(require("modules/exp_scenario/gui/science_production"))
|
||||
add(require("modules/exp_scenario/gui/surveillance"))
|
||||
|
||||
@@ -0,0 +1,707 @@
|
||||
--[[-- Gui Module - Readme
|
||||
Adds a main gui that contains important information about the server.
|
||||
]]
|
||||
|
||||
local ExpUtil = require("modules/exp_util")
|
||||
local Gui = require("modules/exp_gui")
|
||||
local Roles = require("modules.exp_legacy.expcore.roles")
|
||||
local Commands = require("modules/exp_commands")
|
||||
local PlayerData = require("modules.exp_legacy.expcore.player_data")
|
||||
local External = require("modules.exp_legacy.expcore.external")
|
||||
|
||||
local format_number = require("util").format_number
|
||||
local format_time = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true }
|
||||
|
||||
local frame_width = 595
|
||||
local title_width = 270
|
||||
local scroll_height = 275
|
||||
|
||||
--- @class ExpGui_Readme.elements
|
||||
local Elements = {}
|
||||
|
||||
--- @type table<number, { caption: LocalisedString, tooltip: LocalisedString, element: ExpElement }>
|
||||
local tabs = {}
|
||||
|
||||
--- Register a readme tab
|
||||
--- @param caption LocalisedString
|
||||
--- @param tooltip LocalisedString
|
||||
--- @param element ExpElement
|
||||
local function define_tab(caption, tooltip, element)
|
||||
tabs[#tabs + 1] = { caption = caption, tooltip = tooltip, element = element }
|
||||
end
|
||||
|
||||
--- Create a title section table
|
||||
--- @class ExpGui_Readme.elements.title_table: ExpElement
|
||||
--- @overload fun(parent: LuaGuiElement, bar_size: number, caption: LocalisedString, column_count: number): LuaGuiElement
|
||||
Elements.title_table = Gui.define("readme/title_table")
|
||||
:draw(function(_, parent, bar_size, caption, column_count)
|
||||
Gui.elements.title_label(parent, bar_size, caption)
|
||||
return parent.add{
|
||||
type = "table",
|
||||
column_count = column_count,
|
||||
style = "bordered_table",
|
||||
}
|
||||
end)
|
||||
:style{
|
||||
padding = 0,
|
||||
cell_padding = 0,
|
||||
vertical_align = "center",
|
||||
horizontally_stretchable = true,
|
||||
} --[[ @as any ]]
|
||||
|
||||
--- Scroll pane used for title tables
|
||||
--- @class ExpGui_Readme.elements.title_table_scroll: ExpElement
|
||||
--- @overload fun(parent: LuaGuiElement): LuaGuiElement
|
||||
Elements.title_table_scroll = Gui.define("readme/title_table_scroll")
|
||||
:draw{
|
||||
type = "scroll-pane",
|
||||
direction = "vertical",
|
||||
horizontal_scroll_policy = "never",
|
||||
vertical_scroll_policy = "auto",
|
||||
style = "scroll_pane_under_subheader",
|
||||
}
|
||||
:style{
|
||||
padding = { 1, 3 },
|
||||
maximal_height = scroll_height,
|
||||
horizontally_stretchable = true,
|
||||
} --[[ @as any ]]
|
||||
|
||||
--- Sub content frame
|
||||
--- @class ExpGui_Readme.elements.sub_content: ExpElement
|
||||
--- @overload fun(parent: LuaGuiElement): LuaGuiElement
|
||||
Elements.sub_content = Gui.define("readme/sub_content")
|
||||
:draw{
|
||||
type = "frame",
|
||||
direction = "vertical",
|
||||
style = "inside_deep_frame",
|
||||
}
|
||||
:style{
|
||||
horizontally_stretchable = true,
|
||||
horizontal_align = "center",
|
||||
padding = { 2, 2 },
|
||||
top_margin = 2,
|
||||
} --[[ @as any ]]
|
||||
|
||||
--- @class ExpGui_Readme.elements.join_server.elements
|
||||
--- @field server_id string
|
||||
|
||||
--- Join server button
|
||||
--- @class ExpGui_Readme.elements.join_server: ExpElement
|
||||
--- @field data table<LuaGuiElement, ExpGui_Readme.elements.join_server.elements>
|
||||
--- @overload fun(parent: LuaGuiElement, server_id: string, wrong_version: string?): LuaGuiElement
|
||||
Elements.join_server = Gui.define("readme/join_server")
|
||||
:track_all_elements()
|
||||
:draw(function(def, parent, server_id, wrong_version)
|
||||
--- @cast def ExpGui_Readme.elements.join_server
|
||||
local flow = parent.add{
|
||||
type = "flow",
|
||||
}
|
||||
|
||||
local button = flow.add{
|
||||
type = "sprite-button",
|
||||
sprite = "utility/circuit_network_panel",
|
||||
hovered_sprite = "utility/circuit_network_panel",
|
||||
style = "frame_action_button",
|
||||
}
|
||||
|
||||
def.data[button] = {
|
||||
server_id = server_id,
|
||||
}
|
||||
|
||||
Elements.join_server.refresh(button, wrong_version)
|
||||
return button
|
||||
end)
|
||||
:style{
|
||||
size = 20,
|
||||
padding = -1,
|
||||
}
|
||||
:on_click(function(def, player, button)
|
||||
--- @cast def ExpGui_Readme.elements.join_server
|
||||
local server_id = def.data[button].server_id
|
||||
External.request_connection(player, server_id, true)
|
||||
end) --[[ @as any ]]
|
||||
|
||||
--- Refresh join server button
|
||||
--- @param button LuaGuiElement
|
||||
--- @param wrong_version string?
|
||||
function Elements.join_server.refresh(button, wrong_version)
|
||||
local server_id = Elements.join_server.data[button].server_id
|
||||
local status = External.get_server_status(server_id) or "Offline"
|
||||
|
||||
if wrong_version then
|
||||
status = "Version"
|
||||
end
|
||||
|
||||
button.tooltip = { "exp-gui_readme.servers-connect-" .. status, wrong_version }
|
||||
|
||||
if status == "Offline" or status == "Current" then
|
||||
button.enabled = false
|
||||
button.sprite = "utility/circuit_network_panel"
|
||||
button.hovered_sprite = "utility/circuit_network_panel"
|
||||
|
||||
elseif status == "Version" then
|
||||
button.enabled = false
|
||||
button.sprite = "utility/shuffle"
|
||||
button.hovered_sprite = "utility/shuffle"
|
||||
|
||||
elseif status == "Password" then
|
||||
button.enabled = true
|
||||
button.sprite = "utility/warning_white"
|
||||
button.hovered_sprite = "utility/warning"
|
||||
|
||||
elseif status == "Modded" then
|
||||
button.enabled = true
|
||||
button.sprite = "utility/downloading_white"
|
||||
button.hovered_sprite = "utility/downloading"
|
||||
|
||||
else
|
||||
button.enabled = true
|
||||
button.sprite = "utility/circuit_network_panel"
|
||||
button.hovered_sprite = "utility/circuit_network_panel"
|
||||
end
|
||||
end
|
||||
|
||||
--- Refresh all online join buttons
|
||||
function Elements.join_server.refresh_all()
|
||||
if not External.valid() then
|
||||
return
|
||||
end
|
||||
|
||||
local current_version = External.get_current_server().version
|
||||
|
||||
for _, button in Elements.join_server:tracked_elements() do
|
||||
local server_id = Elements.join_server.data[button].server_id
|
||||
local server = External.get_servers()[server_id]
|
||||
|
||||
if server then
|
||||
Elements.join_server.refresh(button, current_version ~= server.version and server.version or nil)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Welcome tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.welcome-tab" },
|
||||
{ "exp-gui_readme.welcome-tooltip" },
|
||||
Gui.define("readme/welcome")
|
||||
:draw(function(_, parent)
|
||||
local player = Gui.get_player(parent)
|
||||
|
||||
local server_details = {
|
||||
name = "ExpGaming S0 - Local",
|
||||
welcome = "Failed to load description: disconnected from external api.",
|
||||
reset_time = "Not Set",
|
||||
}
|
||||
|
||||
if External.valid() then
|
||||
server_details = External.get_current_server()
|
||||
end
|
||||
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
|
||||
local top_flow = container.add{ type = "flow" }
|
||||
top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" }
|
||||
|
||||
local center_flow = top_flow.add{ type = "flow", direction = "vertical" }
|
||||
center_flow.style.horizontal_align = "center"
|
||||
|
||||
Gui.elements.title_label(center_flow, 62, { "exp-gui_readme.welcome-title", server_details.name })
|
||||
Gui.elements.centered_label(center_flow, 380, server_details.welcome)
|
||||
|
||||
top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" }
|
||||
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }.style.height = 4
|
||||
|
||||
local role_names = {}
|
||||
for i, role in ipairs(Roles.get_player_roles(player)) do
|
||||
role_names[i] = role.name
|
||||
end
|
||||
|
||||
Gui.elements.centered_label(
|
||||
Elements.sub_content(container),
|
||||
frame_width,
|
||||
{
|
||||
"exp-gui_readme.welcome-general",
|
||||
server_details.reset_time,
|
||||
format_time(game.tick),
|
||||
}
|
||||
)
|
||||
|
||||
Gui.elements.centered_label(
|
||||
Elements.sub_content(container),
|
||||
frame_width,
|
||||
{
|
||||
"exp-gui_readme.welcome-roles",
|
||||
table.concat(role_names, ", "),
|
||||
}
|
||||
)
|
||||
|
||||
Gui.elements.centered_label(
|
||||
Elements.sub_content(container),
|
||||
frame_width,
|
||||
{ "exp-gui_readme.welcome-chat" }
|
||||
)
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- Rules tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.rules-tab" },
|
||||
{ "exp-gui_readme.rules-tooltip" },
|
||||
Gui.define("readme/rules")
|
||||
:draw(function(_, parent)
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
Gui.elements.title_label(container, title_width - 3, { "exp-gui_readme.rules-tab" })
|
||||
Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.rules-general" })
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }
|
||||
|
||||
local rules = Gui.elements.scroll_table(container, scroll_height, 1)
|
||||
rules.style = "bordered_table"
|
||||
rules.style.cell_padding = 4
|
||||
|
||||
for i = 1, 15 do
|
||||
Gui.elements.centered_label(rules, frame_width - 30, { "exp-gui_readme.rules-" .. i })
|
||||
end
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- Commands tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.commands-tab" },
|
||||
{ "exp-gui_readme.commands-tooltip" },
|
||||
Gui.define("readme/commands")
|
||||
:draw(function(_, parent)
|
||||
local player = Gui.get_player(parent)
|
||||
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
Gui.elements.title_label(container, title_width - 20, { "exp-gui_readme.commands-tab" })
|
||||
Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.commands-general" })
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }
|
||||
|
||||
local commands = Gui.elements.scroll_table(container, scroll_height, 2)
|
||||
commands.style = "bordered_table"
|
||||
commands.style.cell_padding = 0
|
||||
|
||||
for name, command in pairs(Commands.list_for_player(player)) do
|
||||
Gui.elements.centered_label(commands, 120, name)
|
||||
Gui.elements.centered_label(commands, 450, command.description)
|
||||
end
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- Servers tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.servers-tab" },
|
||||
{ "exp-gui_readme.servers-tooltip" },
|
||||
Gui.define("readme/servers")
|
||||
:draw(function(_, parent)
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
Gui.elements.title_label(container, title_width - 10, { "exp-gui_readme.servers-tab" })
|
||||
Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.servers-general" })
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }
|
||||
|
||||
local scroll_pane = Elements.title_table_scroll(container)
|
||||
scroll_pane.style.maximal_height = scroll_height + 20
|
||||
|
||||
if External.valid() then
|
||||
local current_version = External.get_current_server().version
|
||||
|
||||
local factorio_servers = Elements.title_table(scroll_pane, 225, { "exp-gui_readme.servers-factorio" }, 3)
|
||||
|
||||
for server_id, server in pairs(External.get_servers()) do
|
||||
Gui.elements.centered_label(factorio_servers, 110, server.short_name)
|
||||
Gui.elements.centered_label(factorio_servers, 436, server.description)
|
||||
Elements.join_server(factorio_servers, server_id, current_version ~= server.version and server.version or nil)
|
||||
end
|
||||
else
|
||||
local factorio_servers = Elements.title_table(scroll_pane, 225, { "exp-gui_readme.servers-factorio" }, 2)
|
||||
for i = 1, 8 do
|
||||
Gui.elements.centered_label(factorio_servers, 110, { "exp-gui_readme.servers-" .. i })
|
||||
Gui.elements.centered_label(factorio_servers, 460, { "exp-gui_readme.servers-d" .. i })
|
||||
end
|
||||
end
|
||||
|
||||
local external_links = Elements.title_table(scroll_pane, 235, { "exp-gui_readme.servers-external" }, 2)
|
||||
for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do
|
||||
Gui.elements.centered_label(external_links, 110, key:gsub("^%l", string.upper))
|
||||
Gui.elements.centered_label(external_links, 460, { "links." .. key }, { "exp-gui_readme.servers-open-in-browser" })
|
||||
end
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- Backers tab
|
||||
--- Content area for the backers tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.backers-tab" },
|
||||
{ "exp-gui_readme.backers-tooltip" },
|
||||
Gui.define("readme/backers")
|
||||
:draw(function(_, parent)
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
Gui.elements.title_label(container, title_width - 10, { "exp-gui_readme.backers-tab" })
|
||||
Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.backers-general" })
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }
|
||||
|
||||
local groups = {
|
||||
{
|
||||
roles = { "Senior Administrator", "Administrator" },
|
||||
title = { "exp-gui_readme.backers-management" },
|
||||
width = 230,
|
||||
players = {},
|
||||
},
|
||||
{
|
||||
roles = { "Board Member", "Senior Backer" },
|
||||
title = { "exp-gui_readme.backers-board" },
|
||||
width = 145,
|
||||
players = {},
|
||||
},
|
||||
{
|
||||
roles = { "Sponsor", "Supporter" },
|
||||
title = { "exp-gui_readme.backers-backers" },
|
||||
width = 196,
|
||||
players = {},
|
||||
},
|
||||
{
|
||||
roles = { "Moderator", "Trainee" },
|
||||
title = { "exp-gui_readme.backers-staff" },
|
||||
width = 235,
|
||||
players = {},
|
||||
},
|
||||
{
|
||||
roles = {},
|
||||
time = 3 * 3600 * 60,
|
||||
title = { "exp-gui_readme.backers-active" },
|
||||
width = 235,
|
||||
players = {},
|
||||
},
|
||||
}
|
||||
|
||||
local done = {}
|
||||
|
||||
-- Fill groups from configured roles
|
||||
for player_name, player_roles in pairs(Roles.config.players) do
|
||||
for _, group in ipairs(groups) do
|
||||
for _, role_name in ipairs(group.roles) do
|
||||
if table.contains(player_roles, role_name) then
|
||||
done[player_name] = true
|
||||
group.players[#group.players + 1] = player_name
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Fill active player group
|
||||
for _, player in pairs(game.players) do
|
||||
if not done[player.name] then
|
||||
for _, group in ipairs(groups) do
|
||||
if group.time and player.online_time > group.time then
|
||||
group.players[#group.players + 1] = player.name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local scroll_pane = Elements.title_table_scroll(container)
|
||||
|
||||
for _, group in ipairs(groups) do
|
||||
if #group.players > 0 then
|
||||
local backers_table = Elements.title_table(scroll_pane, group.width, group.title, 4)
|
||||
|
||||
for _, player_name in ipairs(group.players) do
|
||||
Gui.elements.centered_label(backers_table, 140, player_name)
|
||||
end
|
||||
|
||||
if #group.players < 4 then
|
||||
for i = 1, 4 - #group.players do
|
||||
Gui.elements.centered_label(backers_table, 140)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- @class (exact) ExpGui_Readme.elements.readme_data.param table
|
||||
--- @field scroll_pane LuaGuiElement
|
||||
--- @field player LuaPlayer
|
||||
--- @field player_name string
|
||||
--- @field children table
|
||||
--- @field title LocalisedString
|
||||
--- @field locale_prefix string
|
||||
--- @field default_stringify fun(value: any): string
|
||||
--- @field columns number
|
||||
--- @field title_width number
|
||||
--- @field column_width number
|
||||
--- @field extra_rows fun(data_table: LuaGuiElement)?
|
||||
|
||||
--- Render a player data category
|
||||
--- @param opts ExpGui_Readme.elements.readme_data.param
|
||||
local function render_data_category(opts)
|
||||
local data_table = Elements.title_table(opts.scroll_pane, opts.title_width, opts.title, opts.columns)
|
||||
|
||||
if opts.extra_rows then
|
||||
opts.extra_rows(data_table)
|
||||
end
|
||||
|
||||
for name, child in pairs(opts.children) do
|
||||
local metadata = child.metadata
|
||||
|
||||
if not metadata.permission or Roles.player_allowed(opts.player, metadata.permission) then
|
||||
local value = child:get(opts.player_name)
|
||||
|
||||
if value ~= nil or metadata.show_always then
|
||||
if metadata.stringify_short then
|
||||
value = metadata.stringify_short(value)
|
||||
elseif metadata.stringify then
|
||||
value = metadata.stringify(value)
|
||||
else
|
||||
value = opts.default_stringify(value)
|
||||
end
|
||||
|
||||
local tooltip = metadata.tooltip or { opts.locale_prefix .. name .. "-tooltip" }
|
||||
Gui.elements.centered_label(
|
||||
data_table, 150,
|
||||
metadata.name or { opts.locale_prefix .. name },
|
||||
tooltip
|
||||
)
|
||||
|
||||
Gui.elements.centered_label(
|
||||
data_table, opts.column_width,
|
||||
{ "exp-gui_readme.data-format", value, metadata.unit or "" },
|
||||
metadata.value_tooltip or { "?", { opts.locale_prefix .. name .. "-value-tooltip" }, tooltip }
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Content area for the player data tab
|
||||
define_tab(
|
||||
{ "exp-gui_readme.data-tab" },
|
||||
{ "exp-gui_readme.data-tooltip" },
|
||||
Gui.define("readme/data")
|
||||
:draw(function(_, parent)
|
||||
local container = parent.add{ type = "flow", direction = "vertical" }
|
||||
|
||||
local player = Gui.get_player(parent)
|
||||
local player_name = player.name
|
||||
|
||||
local enum = PlayerData.PreferenceEnum
|
||||
local preference = PlayerData.DataSavingPreference:get(player_name)
|
||||
local preference_meta = PlayerData.DataSavingPreference.metadata
|
||||
preference = enum[preference]
|
||||
|
||||
Gui.elements.title_label(container, title_width, { "exp-gui_readme.data-tab" })
|
||||
Gui.elements.centered_label(container, frame_width, { "exp-gui_readme.data-general" })
|
||||
Gui.elements.bar(container)
|
||||
container.add{ type = "flow" }
|
||||
|
||||
local scroll_pane = Elements.title_table_scroll(container)
|
||||
|
||||
render_data_category{
|
||||
scroll_pane = scroll_pane,
|
||||
player = player,
|
||||
player_name = player_name,
|
||||
children = PlayerData.Required.children,
|
||||
title = { "exp-gui_readme.data-required" },
|
||||
locale_prefix = "exp-required.",
|
||||
columns = 2,
|
||||
title_width = 250,
|
||||
column_width = 420,
|
||||
default_stringify = tostring,
|
||||
extra_rows = function(required)
|
||||
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)
|
||||
end,
|
||||
}
|
||||
|
||||
if preference <= enum.Settings then
|
||||
render_data_category{
|
||||
scroll_pane = scroll_pane,
|
||||
player = player,
|
||||
player_name = player_name,
|
||||
children = PlayerData.Settings.children,
|
||||
title = { "exp-gui_readme.data-settings" },
|
||||
locale_prefix = "exp-settings.",
|
||||
columns = 2,
|
||||
title_width = 255,
|
||||
column_width = 420,
|
||||
default_stringify = function(value)
|
||||
return tostring(value or "None set")
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
if preference <= enum.Statistics then
|
||||
render_data_category{
|
||||
scroll_pane = scroll_pane,
|
||||
player = player,
|
||||
player_name = player_name,
|
||||
children = PlayerData.Statistics.children,
|
||||
title = { "exp-gui_readme.data-statistics" },
|
||||
locale_prefix = "exp-statistics.",
|
||||
columns = 4,
|
||||
title_width = 250,
|
||||
column_width = 130,
|
||||
default_stringify = function(value)
|
||||
return format_number(value or 0, false)
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
local skip = {
|
||||
DataSavingPreference = true,
|
||||
Settings = true,
|
||||
Statistics = true,
|
||||
Required = true,
|
||||
}
|
||||
|
||||
local count = 0
|
||||
for _ in pairs(PlayerData.All.children) do
|
||||
count = count + 1
|
||||
end
|
||||
|
||||
if preference <= enum.All and count > 4 then
|
||||
local misc = {}
|
||||
for name, child in pairs(PlayerData.All.children) do
|
||||
if not skip[name] then
|
||||
misc[name] = child
|
||||
end
|
||||
end
|
||||
|
||||
render_data_category{
|
||||
scroll_pane = scroll_pane,
|
||||
player = player,
|
||||
player_name = player_name,
|
||||
children = misc,
|
||||
title = { "exp-gui_readme.data-misc" },
|
||||
locale_prefix = "",
|
||||
columns = 2,
|
||||
title_width = 232,
|
||||
column_width = 420,
|
||||
default_stringify = tostring,
|
||||
}
|
||||
end
|
||||
|
||||
return container
|
||||
end) --[[ @as any ]]
|
||||
)
|
||||
|
||||
--- @class ExpGui_Readme.elements.container.elements
|
||||
--- @field pane LuaGuiElement
|
||||
|
||||
--- Main readme container
|
||||
--- @class ExpGui_Readme.elements.container: ExpElement
|
||||
--- @field data table<LuaGuiElement, ExpGui_Readme.elements.container.elements>
|
||||
Elements.container = Gui.define("readme/container")
|
||||
:track_all_elements()
|
||||
:draw(function(def, parent)
|
||||
--- @cast def ExpGui_Readme.elements.container
|
||||
local container = parent.add{ name = def.name, type = "frame", style = "invisible_frame" }
|
||||
|
||||
local left_alignment = Gui.elements.aligned_flow(container, { vertical_align = "bottom" })
|
||||
left_alignment.style.padding = { 32, 0, 0, 0 }
|
||||
|
||||
local left_side = left_alignment.add{ type = "frame", style = "character_gui_left_side" }
|
||||
left_side.style.vertically_stretchable = true
|
||||
left_side.style.padding = 0
|
||||
left_side.style.width = 5
|
||||
|
||||
local pane = container.add{
|
||||
name = "pane",
|
||||
type = "tabbed-pane",
|
||||
style = "frame_tabbed_pane",
|
||||
}
|
||||
|
||||
for _, tab in ipairs(tabs) do
|
||||
local gui_tab = pane.add{
|
||||
type = "tab",
|
||||
style = "frame_tab",
|
||||
caption = tab.caption,
|
||||
tooltip = tab.tooltip,
|
||||
}
|
||||
|
||||
pane.add_tab(gui_tab, tab.element(pane))
|
||||
end
|
||||
|
||||
def.data[container] = {
|
||||
pane = pane,
|
||||
}
|
||||
|
||||
return container
|
||||
end)
|
||||
:on_opened(function(def, player)
|
||||
Gui.toolbar.set_button_toggled_state(Elements.toggle_button, player, true)
|
||||
end)
|
||||
:on_closed(function(def, player, element)
|
||||
Gui.toolbar.set_button_toggled_state(Elements.toggle_button, player, false)
|
||||
Gui.destroy_if_valid(element)
|
||||
end)
|
||||
|
||||
--- Toggle button
|
||||
Elements.toggle_button = Gui.toolbar.create_button{
|
||||
name = "readme_toggle",
|
||||
auto_toggle = true,
|
||||
sprite = "virtual-signal/signal-info",
|
||||
tooltip = { "exp-gui_readme.main-tooltip" },
|
||||
visible = function(player)
|
||||
return Roles.player_allowed(player, "gui/readme")
|
||||
end,
|
||||
}
|
||||
:on_click(function(_, player)
|
||||
local center = player.gui.center
|
||||
local readme = center[Elements.container.name]
|
||||
|
||||
if readme then
|
||||
player.opened = nil
|
||||
else
|
||||
player.opened = Elements.container(center)
|
||||
end
|
||||
end)
|
||||
|
||||
--- Open readme for new players
|
||||
--- @param event EventData.on_player_created
|
||||
local function open_readme(event)
|
||||
local player = assert(game.get_player(event.player_index))
|
||||
local element = Elements.container(player.gui.center)
|
||||
element.pane.selected_tab_index = 1
|
||||
player.opened = element
|
||||
end
|
||||
|
||||
--- Clear stale readme
|
||||
--- @param event EventData.on_player_joined_game | EventData.on_player_respawned
|
||||
local function clear_readme(event)
|
||||
local player = game.players[event.player_index]
|
||||
if not player.opened then
|
||||
Gui.destroy_if_valid(player.gui.center[Elements.container.name])
|
||||
end
|
||||
end
|
||||
|
||||
local e = defines.events
|
||||
|
||||
return {
|
||||
elements = Elements,
|
||||
events = {
|
||||
[e.on_player_created] = open_readme,
|
||||
[e.on_player_joined_game] = clear_readme,
|
||||
[e.on_player_respawned] = clear_readme,
|
||||
},
|
||||
on_nth_tick = {
|
||||
[60 * 60] = Elements.join_server.refresh_all,
|
||||
}
|
||||
}
|
||||
@@ -346,6 +346,80 @@ tooltip-trains=Set all trains to automatic
|
||||
caption-waterfill=Waterfill
|
||||
tooltip-waterfill=Change tiles to water
|
||||
|
||||
[exp-gui_readme]
|
||||
main-tooltip=Information
|
||||
welcome-tab=Welcome
|
||||
welcome-tooltip=Welcome to Explosive Gaming
|
||||
welcome-title=Welcome to __1__
|
||||
welcome-general=Welcome to Explosive Gaming; we host many Factorio servers. While you are here, we ask you to follow our rules. You can find these in the tab above. You can also find our custom commands and links to our other servers. This map has been online for __2__.\nPlease note that our servers reset periodically, the next reset is: __1__
|
||||
welcome-roles=We run a custom role system to help protect the work of others. As a result you may not be able to use your deconstruction planner yet or drop items on the ground. Roles also give you access to some custom features such as adding tasks to our task list or making new warp points.\nYou have been assigned the roles: __1__
|
||||
welcome-chat=Chatting can be difficult for new players because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key (which is located under the “ESC key”). If you would like to change the key, go to your Controls tab in options.\nThe setting you need to change is “Toggle chat (and Lua console)” you currently have it set to "__CONTROL__toggle-console__"
|
||||
rules-tab=Rules
|
||||
rules-tooltip=Rules for our server
|
||||
rules-general=By playing on our servers you accept the rules below. If you are suspected of breaking a rule then you will be questioned by one of our moderators. If required you will be banned from our servers. Appeals can be made by contacting an Administrator on our Discord.
|
||||
rules-1=Hacking / cheating / abusing bugs will not be tolerated.
|
||||
rules-2=Any bugs or exploits found should be reported to our staff members.
|
||||
rules-3=Be respectful to other players in chat, this includes any other forms of communication.
|
||||
rules-4=Taking all items from a belt or logistics network is forbidden: sharing resources is mandatory.
|
||||
rules-5=Spamming of chat, bots, unlimited chests, or concrete is not allowed.
|
||||
rules-6=Before removing major parts of the factory tell other players why you are removing it.
|
||||
rules-7=Do not cause unnecessary lag by placing/removing tiles with bots or using active provider chests. If you think something might cause lag please ask staff first.
|
||||
rules-8=Do not walk in random directions with no reason, this is to reduce map download times.
|
||||
rules-9=Do not use speakers on global or with alerts without prior permission. No one wants to hear your music at full volume without knowing where the off switch is.
|
||||
rules-10=Do not rotate belts, deactivate belts with wires, or cause production to stop without good reason. This goes for inserters and splitters as well.
|
||||
rules-11=Do not make train roundabouts. Other loops such as RoRo stations are allowed.
|
||||
rules-12=When using trains, use the same size other players have used. Many players use 1-2-1, 2-4-2, or 3-8-3, meaning 1 engine 2 cargo 1 engine.
|
||||
rules-13=Trains are Left Hand Drive (LHD) only, this means trains drive on the left side of the tracks.
|
||||
rules-14=Do not beg for roles, advertise other servers, or link to harmful sites.
|
||||
rules-15=Use common sense, report rule breakers, and Administrators have the final word.
|
||||
commands-tab=Commands
|
||||
commands-tooltip=Commands which you are able to use
|
||||
commands-general=We have lots of custom commands which you are able to use. Below you can find a list of all the commands that you are allowed to use and what they do. If you need more information or want to search for a command you can use our /search-help command.
|
||||
servers-tab=Servers
|
||||
servers-tooltip=Links to our other servers and sites
|
||||
servers-general=This is only one of our Factorio servers, we host many others as well. Below you can find details about all the servers that we host as well as links to our external services such as Discord or GitHub.
|
||||
servers-factorio=Factorio Servers
|
||||
servers-external=External Links
|
||||
servers-open-in-browser=Open in your browser
|
||||
servers-1=S1 Public
|
||||
servers-d1=This is our 48 hour reset server.
|
||||
servers-2=S2 Off
|
||||
servers-d2=This server is closed.
|
||||
servers-3=S3 Weekly
|
||||
servers-d3=This is our weekly reset server.
|
||||
servers-4=S4 Monthly
|
||||
servers-d4=This is our monthly reset server.
|
||||
servers-5=S5 Modded
|
||||
servers-d5=This is our modded server, see Discord for details.
|
||||
servers-6=S6 Donator
|
||||
servers-d6=This is our donator only server, online when requested.
|
||||
servers-7=S7 Event
|
||||
servers-d7=This is our event server, we try to run events at least once per week.
|
||||
servers-8=S8 T̷-̶s̶-̴:̷
|
||||
servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸.̸
|
||||
servers-connect-Offline=Server is currently offline
|
||||
servers-connect-Current=This is your current server
|
||||
servers-connect-Version=Server is on a different version: __1__
|
||||
servers-connect-Password=Server requires a password
|
||||
servers-connect-Modded=Server requires mods to be downloaded
|
||||
servers-connect-Online=Server is online
|
||||
backers-tab=Backers
|
||||
backers-tooltip=People who have helped make our server
|
||||
backers-general=We would like to thank all our staff and backers who have helped our community grow. Our staff have helped to keep our servers safe from trolls and a fun place to play. Our backers have helped us to cover our running costs and provide a great community for us all to enjoy together.
|
||||
backers-management=Administrators
|
||||
backers-board=Board Members and Senior Backers
|
||||
backers-staff=Staff Members
|
||||
backers-backers=Sponsors and Supporters
|
||||
backers-active=Active Players
|
||||
data-tab=Data
|
||||
data-tooltip=All of your stored player data
|
||||
data-general=Our servers will save your player data so that we can sync it between servers. All of your data can be found below. If you wish to save a copy locally then use /save-data. If you want to change what data is saved then use /set-preference.
|
||||
data-required=Required
|
||||
data-settings=Settings
|
||||
data-statistics=Statistics
|
||||
data-misc=Miscellaneous
|
||||
data-format=__1____2__
|
||||
|
||||
[exp-gui_research-milestones]
|
||||
tooltip-main=Research Milestones
|
||||
caption-main=Milestones
|
||||
|
||||
@@ -346,6 +346,79 @@ tooltip-trains=把火車設置為自動模式
|
||||
caption-waterfill=挖水
|
||||
tooltip-waterfill=把地換為水。
|
||||
|
||||
[exp-gui_readme]
|
||||
main-tooltip=資訊
|
||||
welcome-tab=歡迎
|
||||
welcome-tooltip=歡迎來到 Explosive Gaming
|
||||
welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__
|
||||
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
||||
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
||||
rules-tab=規則
|
||||
rules-tooltip=服務器規則
|
||||
rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。
|
||||
rules-1=開掛或濫用漏洞將不會被容忍。
|
||||
rules-2=當你找到漏洞可以通知職員。
|
||||
rules-3=請在聊天室中尊重其他人。
|
||||
rules-4=請不要把所有物品全部取走。
|
||||
rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。
|
||||
rules-6=當你想大量拆除原有設施前請通知其他用戶。
|
||||
rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。
|
||||
rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。
|
||||
rules-9=請不要無故使用全圖喇叭。
|
||||
rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。
|
||||
rules-11=請不要用迴旋處。 火車站尾返程則是例外。
|
||||
rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。
|
||||
rules-13=火車必須是左上右下 (LHD)。
|
||||
rules-14=禁止要求身份組,發廣告,發惡意連結。
|
||||
rules-15=使用常識, 舉報違規人員,管理員有最終決定權。
|
||||
commands-tab=指令
|
||||
commands-tooltip=你可用的指令
|
||||
commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。
|
||||
servers-tab=伺服器
|
||||
servers-tooltip=到其他伺服器及網站的連結
|
||||
servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。
|
||||
servers-factorio=異星工廠伺服器
|
||||
servers-1=S1 公共
|
||||
servers-d1=這個服務器每兩日重設。
|
||||
servers-2=S2 -
|
||||
servers-d2=這個服務器沒在營運。
|
||||
servers-3=S3 周
|
||||
servers-d3=這個服務器每週重設。
|
||||
servers-4=S4 月
|
||||
servers-d4=這個服務器每月重設。
|
||||
servers-5=S5 模組
|
||||
servers-d5=這個服務器運行模組,可在 Discord 中得到更多資訊。
|
||||
servers-6=S6 Donator
|
||||
servers-d6=這個服務器為支持者運行,可在 Discord 中得到更多資訊。
|
||||
servers-7=S7 項目
|
||||
servers-d7=這個服務器只在有項目期間運行。
|
||||
servers-8=S8 T̷-̶s̶-̴:̷
|
||||
servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸。̸
|
||||
servers-connect-Offline=該服務器目前沒有在運行
|
||||
servers-connect-Current=你目前所在的伺服器
|
||||
servers-connect-Version=該服務器運行不同的遊戲版本: __1__
|
||||
servers-connect-Password=該服務器需要密碼
|
||||
servers-connect-Modded=該服務器需要下載模組
|
||||
servers-connect-Online=該服務器在線
|
||||
servers-external=外部連結
|
||||
servers-open-in-browser=可在你的瀏覽器中打開
|
||||
backers-tab=支持者
|
||||
backers-tooltip=支持者
|
||||
backers-general=他們為服務器運行提供了不少幫助。
|
||||
backers-management=系統管理員
|
||||
backers-board=議員
|
||||
backers-staff=職員
|
||||
backers-backers=支持者
|
||||
backers-active=活躍玩家
|
||||
data-tab=資料
|
||||
data-tooltip=所有已存資料
|
||||
data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。
|
||||
data-settings=設定
|
||||
data-statistics=數據
|
||||
data-required=需要
|
||||
data-misc=雜項
|
||||
data-format=__1____2__
|
||||
|
||||
[exp-gui_research-milestones]
|
||||
tooltip-main=研究介面
|
||||
caption-main=研究介面
|
||||
|
||||
@@ -346,6 +346,79 @@ tooltip-trains=把火車設置為自動模式
|
||||
caption-waterfill=挖水
|
||||
tooltip-waterfill=把地換為水。
|
||||
|
||||
[exp-gui_readme]
|
||||
main-tooltip=資訊
|
||||
welcome-tab=歡迎
|
||||
welcome-tooltip=歡迎來到 Explosive Gaming
|
||||
welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__
|
||||
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
||||
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
||||
rules-tab=規則
|
||||
rules-tooltip=服務器規則
|
||||
rules-general=你在本服務器遊玩即等同同意以下規則。管理員有機會就相關事項提問。你可能會因為違反規則而被封禁,你可以在 Discord 中提出反對。
|
||||
rules-1=開掛或濫用漏洞將不會被容忍。
|
||||
rules-2=當你找到漏洞可以通知職員。
|
||||
rules-3=請在聊天室中尊重其他人。
|
||||
rules-4=請不要把所有物品全部取走。
|
||||
rules-5=請不要濫發信息,大量鋪設地磚,或不為箱子設置上限,浪費資源。
|
||||
rules-6=當你想大量拆除原有設施前請通知其他用戶。
|
||||
rules-7=請不要無故使用機器人來大量鋪設或拆除地磚,濫用主動出貨箱。
|
||||
rules-8=請不要隨意移動來開大量地圖,這有助減少地圖下載時間。
|
||||
rules-9=請不要無故使用全圖喇叭。
|
||||
rules-10=請不要無故轉動傳送帶方向,停用傳送帶,或停止生產。
|
||||
rules-11=請不要用迴旋處。 火車站尾返程則是例外。
|
||||
rules-12=請跟其他人使用相同的火車組成。常用的有 1-2-1,2-4-2,或 3-8-3,即1個動車組拖2個貨車組再拖不同方向的1個動車組。
|
||||
rules-13=火車必須是左上右下 (LHD)。
|
||||
rules-14=禁止要求身份組,發廣告,發惡意連結。
|
||||
rules-15=使用常識, 舉報違規人員,管理員有最終決定權。
|
||||
commands-tab=指令
|
||||
commands-tooltip=你可用的指令
|
||||
commands-general=這裏有自訂的指令。你可以在下邊找到你可用的指令及其功能介紹。你可以用 /search-help 來取得更多資訊。
|
||||
servers-tab=伺服器
|
||||
servers-tooltip=到其他伺服器及網站的連結
|
||||
servers-general=這是其中一個伺服器。你可以在下方找到其他同樣是由我們運行的伺服器資料。
|
||||
servers-factorio=異星工廠伺服器
|
||||
servers-1=S1 公共
|
||||
servers-d1=這個服務器每兩日重設。
|
||||
servers-2=S2 -
|
||||
servers-d2=這個服務器沒在營運。
|
||||
servers-3=S3 周
|
||||
servers-d3=這個服務器每週重設。
|
||||
servers-4=S4 月
|
||||
servers-d4=這個服務器每月重設。
|
||||
servers-5=S5 模組
|
||||
servers-d5=這個服務器運行模組,可在 Discord 中得到更多資訊。
|
||||
servers-6=S6 Donator
|
||||
servers-d6=這個服務器為支持者運行,可在 Discord 中得到更多資訊。
|
||||
servers-7=S7 項目
|
||||
servers-d7=這個服務器只在有項目期間運行。
|
||||
servers-8=S8 T̷-̶s̶-̴:̷
|
||||
servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸。̸
|
||||
servers-connect-Offline=該服務器目前沒有在運行
|
||||
servers-connect-Current=你目前所在的伺服器
|
||||
servers-connect-Version=該服務器運行不同的遊戲版本: __1__
|
||||
servers-connect-Password=該服務器需要密碼
|
||||
servers-connect-Modded=該服務器需要下載模組
|
||||
servers-connect-Online=該服務器在線
|
||||
servers-external=外部連結
|
||||
servers-open-in-browser=可在你的瀏覽器中打開
|
||||
backers-tab=支持者
|
||||
backers-tooltip=支持者
|
||||
backers-general=他們為服務器運行提供了不少幫助。
|
||||
backers-management=系統管理員
|
||||
backers-board=議員
|
||||
backers-staff=職員
|
||||
backers-backers=支持者
|
||||
backers-active=活躍玩家
|
||||
data-tab=資料
|
||||
data-tooltip=所有已存資料
|
||||
data-general=資料會自動存到各個服務器中。 你也可以用 /save-data 存一份副本。 也可用 /set-preference 來更改喜好。
|
||||
data-settings=設定
|
||||
data-statistics=數據
|
||||
data-required=需要
|
||||
data-misc=雜項
|
||||
data-format=__1____2__
|
||||
|
||||
[exp-gui_research-milestones]
|
||||
tooltip-main=研究介面
|
||||
caption-main=研究介面
|
||||
|
||||
Reference in New Issue
Block a user