diff --git a/lib/application_helper.rb b/lib/application_helper.rb new file mode 100644 index 0000000..00508fe --- /dev/null +++ b/lib/application_helper.rb @@ -0,0 +1,34 @@ +module W3DHubLauncher + class ApplicationHelper + def self.wine_command(app) + # FIXME: account for the cursed whitespace and wrap in quotes + format("%s ", MemCache[:settings]&.preferences&.wine_command || "wine") + end + def self.wine_prefix(app) + # TODO: fallback from app specific prefix to launcher prefix to global prefix + # format("%s ", app&.wine_prefix_path || MemCache[:settings]&.preferences&.wine_prefix_path || "") + + "" + end + + def self.run(app, *args) + exe_path = app.id == "ecw" ? format("%s/game500.exe", app.installation_path) : format("%s/game.exe", app.installation_path) + + env = {} + unless wine_prefix(app).to_s.empty? + env["WINEPREFIX"] = wine_prefix(app).to_s + end + env["DXVK_HUD"] = "full" + + pid = Process.spawn( + env, + "#{wine_command(app)}#{exe_path} -launcher #{args.join(' ')}" + ) + Process.detach(pid) + end + + def self.join_server(app, server, password: nil, token: nil) + + end + end +end diff --git a/lib/pages/games.rb b/lib/pages/games.rb index d2e32b8..ed547da 100644 --- a/lib/pages/games.rb +++ b/lib/pages/games.rb @@ -156,8 +156,7 @@ module W3DHubLauncher end def populate_game_info - # FIXME: We should be able to query an api to figure out the installation state, instead of explictly writing it out like this... - application = MemCache[:settings].applications.find { |app| app.id == @current_app.id && app.channel == @current_channel&.id } + application = MemCache[:settings].application_installed?(@current_app, @current_channel) # pp application @game_info_container.clear do @@ -187,7 +186,9 @@ module W3DHubLauncher flow(width: 1.0, height: 60) do if application button "JOIN", tip: "Join most populated or lowest ping server", fill: true, height: 1.0, background_nine_slice: NINE_SLICE_ROUNDED_LEFT, **CTA_BUTTON_THEME - button safe_get_image("#{ROOT_PATH}/media/icons/singleplayer.png"), tip: "Single player", image_height: 1.0, background_nine_slice: NINE_SLICE_SQUARE, **CTA_BUTTON_THEME + button safe_get_image("#{ROOT_PATH}/media/icons/singleplayer.png"), tip: "Single player", image_height: 1.0, background_nine_slice: NINE_SLICE_SQUARE, **CTA_BUTTON_THEME do + ApplicationHelper.run(application) + end button safe_get_image("#{ROOT_PATH}/media/icons/gear.png"), tip: "Options", image_height: 1.0, background_nine_slice: NINE_SLICE_ROUNDED_RIGHT, **CTA_BUTTON_THEME do |btn| menu(parent: btn) do menu_item("Game Settings") diff --git a/lib/worker/api/settings.rb b/lib/worker/api/settings.rb index 00adeed..3d65f27 100644 --- a/lib/worker/api/settings.rb +++ b/lib/worker/api/settings.rb @@ -34,6 +34,10 @@ module W3DHubLauncher }.to_json(options) end + def application_installed?(application, channel) + applications.find { |app| app.id == application&.id && app.channel == channel&.id } + end + # User explictly set options class Preferences SCHEMA = 0 diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index 7442a8a..8a53597 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -43,6 +43,7 @@ require_relative "lib/dialogs/account" require_relative "lib/states/boot" require_relative "lib/states/interface" require_relative "lib/window" +require_relative "lib/application_helper" require_relative "lib/ico" require_relative "lib/ww_mix"