diff --git a/exp_scenario/features.ts b/exp_scenario/features.ts index 294ee9bf..9c1e70a9 100644 --- a/exp_scenario/features.ts +++ b/exp_scenario/features.ts @@ -81,6 +81,19 @@ export const features: Feature[] = [ str("command_prefix", "Command prefix", "Prefix for chat commands, and for key words to reply to everyone", "!"), ], }, + { + name: "community_details", + title: "Community Details", + description: "The community name and links shown in chat, the readme, help bubbles, and the greeting. These are always used, the switch has no effect", + fields: [ + str("community_name", "Community name", "Name of the community", "Explosive Gaming"), + str("discord", "Discord", "Invite link to the Discord server", "https://discord.explosivegaming.nl"), + str("website", "Website", "Link to the website", "https://www.explosivegaming.nl"), + str("status", "Status page", "Link to the server status page", "https://status.explosivegaming.nl"), + str("github", "GitHub", "Link to the source code", "https://github.com/explosivegaming/ExpCluster"), + str("patreon", "Patreon", "Link to donate", "https://www.patreon.com/ExpGaming"), + ], + }, { name: "custom_start", title: "Custom Start", diff --git a/exp_scenario/module/config/chat_auto_reply.lua b/exp_scenario/module/config/chat_auto_reply.lua index a9e627b9..3ad54776 100644 --- a/exp_scenario/module/config/chat_auto_reply.lua +++ b/exp_scenario/module/config/chat_auto_reply.lua @@ -4,7 +4,7 @@ local ExpUtil = require("modules/exp_util") local Feature = require("modules/exp_scenario/features") local Async = require("modules/exp_util/async") -local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail +local community_details = require("modules/exp_scenario/config/community_details").config local floor = math.floor local random = math.random @@ -20,6 +20,15 @@ local send_message_async = end end) +--- Reply with a link from community_details, read when the reply is sent +--- @param key string +--- @return fun(): LocalisedString +local function server_link(key) + return function() + return { "info." .. key, community_details[key] } + end +end + local afk_time_units = { minutes = true, seconds = true, @@ -28,13 +37,13 @@ local afk_time_units = { return Feature.register("chat_auto_reply", { --- @type table messages = { -- will trigger when ever the word is said - ["discord"] = { "info.discord", config_server_detail["discord"] }, - ["expgaming"] = { "info.website", config_server_detail["website"] }, - ["website"] = { "info.website", config_server_detail["website"] }, - ["status"] = { "info.status", config_server_detail["status"] }, - ["github"] = { "info.github", config_server_detail["github"] }, - ["patreon"] = { "info.patreon", config_server_detail["patreon"] }, - ["donate"] = { "info.patreon", config_server_detail["patreon"] }, + ["discord"] = server_link("discord"), + ["expgaming"] = server_link("website"), + ["website"] = server_link("website"), + ["status"] = server_link("status"), + ["github"] = server_link("github"), + ["patreon"] = server_link("patreon"), + ["donate"] = server_link("patreon"), ["command"] = { "info.custom-commands" }, ["commands"] = { "info.custom-commands" }, ["softmod"] = { "info.softmod" }, diff --git a/exp_scenario/module/config/server_details.lua b/exp_scenario/module/config/server_details.lua new file mode 100644 index 00000000..e7dfc9e8 --- /dev/null +++ b/exp_scenario/module/config/server_details.lua @@ -0,0 +1,14 @@ +--- Names and links of the community, shown in chat, the readme, and the greeting +-- @config Community-Details + +local Feature = require("modules/exp_scenario/features") + +--- The values are always used, disabling the feature changes nothing +return Feature.register("community_details", { + community_name = "Explosive Gaming", + discord = "https://discord.explosivegaming.nl", + website = "https://www.explosivegaming.nl", + status = "https://status.explosivegaming.nl", + github = "https://github.com/explosivegaming/ExpCluster", + patreon = "https://www.patreon.com/ExpGaming", +}) diff --git a/exp_scenario/module/control/help_bubbles.lua b/exp_scenario/module/control/help_bubbles.lua index 51f8a12f..45bafb88 100644 --- a/exp_scenario/module/control/help_bubbles.lua +++ b/exp_scenario/module/control/help_bubbles.lua @@ -5,7 +5,7 @@ Adds friendly biters that walk around and give helpful messages local Async = require("modules/exp_util/async") local Storage = require("modules/exp_util/storage") local Feature = require("modules/exp_scenario/features") -local config_server_detail = require("modules.exp_legacy.config.server_detail") +local community_details = require("modules/exp_scenario/config/community_details").config local feature = Feature.register("help_bubbles") @@ -17,18 +17,21 @@ local locations = { spawn_position = { x = 0, y = 0 }, spawn_surface = "nauvis", entity_name = "small-biter", - messages = { - { "info.website", config_server_detail["website"] }, - { "info.read-readme" }, - { "info.discord", config_server_detail["discord"] }, - { "info.softmod" }, - { "info.redmew" }, - { "info.custom-commands" }, - { "info.status", config_server_detail["status"] }, - { "info.lhd" }, - { "info.github", config_server_detail["github"] }, - { "info.patreon", config_server_detail["patreon"] }, - }, + --- Built each cycle so changes to community_details show without a restart + messages = function() + return { + { "info.website", community_details.website }, + { "info.read-readme" }, + { "info.discord", community_details.discord }, + { "info.softmod" }, + { "info.redmew" }, + { "info.custom-commands" }, + { "info.status", community_details.status }, + { "info.lhd" }, + { "info.github", community_details.github }, + { "info.patreon", community_details.patreon }, + } + end, } } @@ -41,7 +44,8 @@ end) --- @class speech_bubble_task_param --- @field entity LuaEntity ---- @field messages LocalisedString[] +--- @field messages LocalisedString[]? +--- @field location string? Used when there are no messages, a key of locations --- @field previous_message LuaEntity? --- @field current_message_index number @@ -60,8 +64,9 @@ local speech_bubble_task = return Async.status.complete() end + local messages = task.messages or locations[task.location].messages() local index = task.current_message_index - if index > #task.messages then + if index > #messages then index = 1 end @@ -71,7 +76,7 @@ local speech_bubble_task = end speech_bubble_param.source = entity - speech_bubble_param.text = task.messages[index] + speech_bubble_param.text = messages[index] task.previous_message = entity.surface.create_entity(speech_bubble_param) task.current_message_index = index + 1 @@ -114,7 +119,11 @@ local function check_persistent_locations() goto continue end - persistent_locations[name] = register_entity(entity, location.messages) + persistent_locations[name] = speech_bubble_task{ + entity = entity, + location = name, + current_message_index = 1, + } ::continue:: end end diff --git a/exp_scenario/module/gui/readme.lua b/exp_scenario/module/gui/readme.lua index b0d4e510..19c21eac 100644 --- a/exp_scenario/module/gui/readme.lua +++ b/exp_scenario/module/gui/readme.lua @@ -8,7 +8,7 @@ local Roles = require("modules/exp_roles") local Commands = require("modules/exp_commands") local PlayerData = require("modules.exp_legacy.expcore.player_data") local ExpServerList = require("modules/exp_server_list") -local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail +local community = require("modules/exp_scenario/config/community_details").config local format_number = require("util").format_number local format_time = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true } @@ -37,12 +37,12 @@ end --- @class ExpGui_Readme.elements local Elements = {} ---- @type table +--- @type table local tabs = {} --- Register a readme tab --- @param caption LocalisedString ---- @param tooltip LocalisedString +--- @param tooltip LocalisedString | fun(): LocalisedString Functions are called when the readme opens --- @param element ExpElement local function define_tab(caption, tooltip, element) tabs[#tabs + 1] = { caption = caption, tooltip = tooltip, element = element } @@ -202,13 +202,13 @@ end --- Welcome tab define_tab( { "exp-gui_readme.welcome-tab" }, - { "exp-gui_readme.welcome-tooltip", config_server_detail["community_name"] }, + function() return { "exp-gui_readme.welcome-tooltip", community.community_name } end, Gui.define("readme/welcome") :draw(function(_, parent) local player = Gui.get_player(parent) local server_details = { - name = config_server_detail["community_name"] .. " S0 - Local", + name = community.community_name .. " S0 - Local", welcome = "Failed to load description: disconnected from the controller.", reset_time = "Not Set", } @@ -248,7 +248,7 @@ define_tab( frame_width, { "exp-gui_readme.welcome-general", - config_server_detail["community_name"], + community.community_name, format_time(game.tick), server_details.reset_time, } @@ -353,7 +353,7 @@ define_tab( 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, config_server_detail[key], { "exp-gui_readme.servers-open-in-browser" }) + Gui.elements.centered_label(external_links, 460, community[key], { "exp-gui_readme.servers-open-in-browser" }) end return container @@ -651,11 +651,16 @@ Elements.container = Gui.define("readme/container") } for _, tab in ipairs(tabs) do + local tooltip = tab.tooltip + if type(tooltip) == "function" then + tooltip = tooltip() + end + local gui_tab = pane.add{ type = "tab", style = "frame_tab", caption = tab.caption, - tooltip = tab.tooltip, + tooltip = tooltip, } pane.add_tab(gui_tab, tab.element(pane))