diff --git a/lib/application_manager.rb b/lib/application_manager.rb index 29a4422..a73a388 100644 --- a/lib/application_manager.rb +++ b/lib/application_manager.rb @@ -83,6 +83,17 @@ class W3DHub end end + def join_server(app_id, channel, server, password = nil) + if installed?(app_id, channel) && window.settings[:server_list_username].to_s.length.positive? + run( + app_id, channel, + "+connect #{server.address}:#{server.port}", + "+netplayername \"#{window.settings[:server_list_username]}\"", + password ? "+password \"#{password}\"" : "" + ) + end + end + def installed!(task) # install_dir # installed_version diff --git a/lib/application_manager/tasks/importer.rb b/lib/application_manager/tasks/importer.rb index e18ce62..4506240 100644 --- a/lib/application_manager/tasks/importer.rb +++ b/lib/application_manager/tasks/importer.rb @@ -1,11 +1,11 @@ class W3DHub class ApplicationManager class Importer < Task - def initialize(app_id, channel, path) + def initialize(app_id, channel, path = nil) super(app_id, channel) @path = path end end end -end \ No newline at end of file +end diff --git a/lib/pages/community.rb b/lib/pages/community.rb index 8e6f8e8..1a87032 100644 --- a/lib/pages/community.rb +++ b/lib/pages/community.rb @@ -5,54 +5,40 @@ class W3DHub body.clear do stack(width: 1.0, height: 1.0, padding: 8) do stack(width: 1.0, height: 0.15) do - tagline "Welcome to the W3D Hub Launcher" - para "The W3D Hub launcher is a one-stop shop for your W3D gamings needs, providing game downloads and automatic updating, an intregrated server browser, centralized management of in-game options and many other features." + tagline "Welcome to the #{W3DHub::NAME}" + para "The #{W3DHub::NAME} is a one-stop shop for your W3D gaming needs, providing game downloads, automatic updating, an integrated server browser, and centralized management of in-game options." end - flow(width: 1.0, height: 0.1, margin_top: 24) do - flow(width: 0.375, height: 1.0) do + flow(width: 1.0, height: 0.15, margin_bottom: 24) do + flow(width: (1.0 - 0.27) / 2, height: 1.0) do end - flow(width: 0.25, height: 1.0) do - image "#{GAME_ROOT_PATH}/media/icons/apb.png", height: 1.0 - image "#{GAME_ROOT_PATH}/media/icons/ren.png", height: 1.0, margin_left: 32 - image "#{GAME_ROOT_PATH}/media/icons/tsr.png", height: 1.0, margin_left: 32 - image "#{GAME_ROOT_PATH}/media/icons/w3dhub.png", height: 1.0, margin_left: 32 - end - - flow(width: 0.375, height: 1.0) do + flow(width: 0.27, height: 1.0) do + image "#{GAME_ROOT_PATH}/media/icons/w3dhub.png", height: 1.0, hover: { color: 0xaa_ffffff }, tip: "W3D Hub Forums" do + Launchy.open("https://w3dhub.com/forum/") + end + image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", hover: { color: 0xaa_ffffff }, height: 1.0, margin_left: 32, tip: "W3D Hub Discord Server" do + Launchy.open("https://discord.com/invite/GYhW7eV") + end + image "#{GAME_ROOT_PATH}/media/social_media_icons/facebook.png", hover: { color: 0xaa_ffffff }, height: 1.0, margin_left: 32, tip: "W3D Hub Facebook Page" do + Launchy.open("https://www.facebook.com/w3dhub") + end end end - stack(width: 1.0, height: 0.6, scroll: true) do + stack(width: 1.0, height: 0.55, scroll: true) do tagline "Latest Updates" - para "Beta 12", margin_left: 16 - para "- Server Browser: Added detailed information for selection server", margin_left: 32 - - para "Beta 11.6", margin_left: 16, margin_top: 16 - para "- Localisation: Added Korean translations (unknown author)", margin_left: 32 - para "- Localisation: Added Spanish translations (thanks to Silverlight and URKA)", margin_left: 32 - para "- Localisation: Added Spanish translations (thanks to darkyuri-cz)", margin_left: 32 - - para "Beta 11.0", margin_left: 16, margin_top: 16 - para "- Localisation: Added partial Chinese (Simplified) translations and Polish (thanks to DoDoCat and TrollekPL on the W3D Hub forums for providing translations)", margin_left: 32 - para "- Performance: Reduced CPU and GPU usage during game installs and updates", margin_left: 32 - para "- Settings: Added new setting menu for the launcher - click on the [gear] icon in the titlebar. Incluudes:", margin_left: 32 - para "- Manually choose language, rather than using default based on OS", margin_left: 48 - para "- Choose package cache folder location", margin_left: 48 - para "- Choose default folder into which games are installed", margin_left: 48 - para "- Server Browser: Now receives push notifications so it shows changes to maps, player counts, etc. as soon as they are available", margin_left: 32 - para "- Server Browser: Now lists servers with players in above empty ones", margin_left: 32 - para "- Server Browser: Game filter options are now saved", margin_left: 32 + para "Hello World " * 100 end - stack(width: 1.0, height: 0.15) do + stack(width: 1.0, height: 0.15, margin_top: 16) do tagline "Help & Support" flow(width: 1.0) do para "For help and support using this launcher or playing any W3D Hub game visit the" link("W3D Hub forums", text_size: 16) { Launchy.open("https://w3dhub.com/forum/") } para "or join us in" - link("[discord]#tech-support", text_size: 16) { Launchy.open("https://w3dhub.com/forum/") } + image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", height: 16, padding_top: 4 + link("#tech-support", text_size: 16) { Launchy.open("https://discord.com/invite/GYhW7eV") } para "on the W3D Hub Discord server" end end diff --git a/lib/pages/server_browser.rb b/lib/pages/server_browser.rb index 688fc5b..16e327d 100644 --- a/lib/pages/server_browser.rb +++ b/lib/pages/server_browser.rb @@ -47,9 +47,18 @@ class W3DHub end flow(width: 0.249, height: 1.0) do - inscription "Nickname:" - inscription "Cyberarm" - image "#{GAME_ROOT_PATH}/media/ui_icons/wrench.png", height: 16 + inscription "Nickname:", width: 0.32 + @nickname_label = inscription "#{window.settings[:server_list_username]}", width: 0.6 + image "#{GAME_ROOT_PATH}/media/ui_icons/wrench.png", height: 16, hover: { color: 0xaa_ffffff }, tip: "Set nickname" do + # Prompt for player name + prompt_for_nickname( + accept_callback: proc do |entry| + @nickname_label.value = entry + window.settings[:server_list_username] = entry + window.settings.save_settings + end + ) + end end end @@ -180,7 +189,33 @@ class W3DHub end stack(width: 1.0, height: 0.25) do - button "Join Server", enabled: window.application_manager.installed?(server.game, window.applications.games.find { |g| g.id == server.game }.channels.first) + game_installed = window.application_manager.installed?(server.game, window.applications.games.find { |g| g.id == server.game }.channels.first.id) + + button "Join Server", enabled: !game_installed.nil? do + # Check for nickname + # prompt for nickname + # !abort unless nickname set + # Launch game + if window.settings[:server_list_username].to_s.length.zero? + prompt_for_nickname( + accept_callback: proc do |entry| + @nickname_label.value = entry + window.settings[:server_list_username] = entry + window.settings.save_settings + + window.application_manager.join_server( + server.game, + window.applications.games.find { |g| g.id == server.game }.channels.first.id, server + ) + end + ) + else + window.application_manager.join_server( + server.game, + window.applications.games.find { |g| g.id == server.game }.channels.first.id, server + ) + end + end end stack(width: 1.0, height: 0.55, margin_top: 16) do @@ -281,6 +316,18 @@ class W3DHub "C&C Renegade" end end + + def prompt_for_nickname(accept_callback: nil, cancel_callback: nil) + push_state( + W3DHub::States::PromptDialog, + title: "Set Nickname", + message: "Set a nickname that will be used when joining a server:", + prefill: window.settings[:server_list_username], + accept_callback: accept_callback, + cancel_callback: cancel_callback, + valid_callback: proc { |entry| entry.length.positive? } + ) + end end end end diff --git a/lib/settings.rb b/lib/settings.rb index 783ce2a..0ef73d8 100644 --- a/lib/settings.rb +++ b/lib/settings.rb @@ -8,7 +8,7 @@ class W3DHub wine_command: "wine", create_wine_prefixes: true, allow_diagnostic_reports: false, - server_list_username: nil, + server_list_username: "", account: {}, applications: {}, games: {} @@ -53,6 +53,10 @@ class W3DHub @settings.dig(*args) end + def []=(key, value) + @settings[key] = value + end + def load_settings @settings = JSON.parse(File.read(SETTINGS_FILE_PATH), symbolize_names: true) end diff --git a/lib/states/prompt_dialog.rb b/lib/states/prompt_dialog.rb new file mode 100644 index 0000000..41cf118 --- /dev/null +++ b/lib/states/prompt_dialog.rb @@ -0,0 +1,52 @@ +class W3DHub + class States + class PromptDialog < CyberarmEngine::GuiState + def setup + window.show_cursor = true + + theme(W3DHub::THEME) + + background 0xee_444444 + + stack(width: 1.0, height: 1.0, margin: 128, background: 0xee_222222) do + flow(width: 1.0, height: 0.1, padding: 8) do + background 0x88_000000 + + image "#{GAME_ROOT_PATH}/media/ui_icons/question.png", width: 0.04, align: :center, color: 0xff_ff8800 + + tagline "#{@options[:title]}", width: 0.9, text_align: :center + end + + stack(width: 1.0, height: 0.78, padding: 16) do + para @options[:message], width: 1.0 + @prompt_entry = edit_line @options[:prefill].to_s, margin_top: 24, width: 1.0, focus: true + end + + flow(width: 1.0, height: 0.1, padding: 8) do + button "Cancel", width: 0.25 do + pop_state + @options[:cancel_callback]&.call(@prompt_entry.value) + end + + stack(width: 0.5) + + button "Accept", width: 0.25 do + if @options[:valid_callback]&.call(@prompt_entry.value) + pop_state + @options[:accept_callback]&.call(@prompt_entry.value) + end + end + end + end + end + + def draw + previous_state&.draw + + Gosu.flush + + super + end + end + end +end diff --git a/media/social_media_icons/discord.png b/media/social_media_icons/discord.png new file mode 100644 index 0000000..820ac08 Binary files /dev/null and b/media/social_media_icons/discord.png differ diff --git a/media/social_media_icons/facebook.png b/media/social_media_icons/facebook.png new file mode 100644 index 0000000..79d38c9 Binary files /dev/null and b/media/social_media_icons/facebook.png differ diff --git a/w3dhub.rb b/w3dhub.rb index 3b95630..2d52101 100644 --- a/w3dhub.rb +++ b/w3dhub.rb @@ -38,6 +38,7 @@ require_relative "lib/application_manager/tasks/importer" require_relative "lib/states/boot" require_relative "lib/states/interface" require_relative "lib/states/message_dialog" +require_relative "lib/states/prompt_dialog" require_relative "lib/api" require_relative "lib/api/service_status"