From 53e7a72ceb678ddc7dbcf8399d22ce063221c28d Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Fri, 18 Sep 2026 22:21:20 -0500 Subject: [PATCH] Added initial support for extracting map preview images from game level mixes that include a screenshot or overhead map --- lib/dialogs/about.rb | 6 ++-- lib/gui_ext.rb | 9 +++-- lib/states/interface.rb | 56 +++++++++++++++++++++++++++++-- lib/worker.rb | 60 ++++++++++++++++++++++++++++++++++ lib/worker/api.rb | 4 +++ lib/worker/api/game_server.rb | 4 +++ lib/worker/api/settings.rb | 5 ++- media/default_map_preview.png | Bin 23236 -> 15956 bytes w3d_hub_linux_launcher.rb | 1 + 9 files changed, 137 insertions(+), 8 deletions(-) diff --git a/lib/dialogs/about.rb b/lib/dialogs/about.rb index 2ff69ab..ca0728d 100644 --- a/lib/dialogs/about.rb +++ b/lib/dialogs/about.rb @@ -47,8 +47,10 @@ module W3DHubLauncher tagline item.name, margin_left: PADDING end para item.description, margin_left: LARGE_PADDING - link item.license, tip: item.license_url, margin_left: PADDING + LARGE_PADDING unless item.license.empty? do - SDL.OpenURL(item.license_url) + unless item.license.empty? + link format("%s license", item.license), tip: item.license_url, margin_left: PADDING + LARGE_PADDING do + SDL.OpenURL(item.license_url) + end end end end diff --git a/lib/gui_ext.rb b/lib/gui_ext.rb index 6a4b7ae..9dc55a0 100644 --- a/lib/gui_ext.rb +++ b/lib/gui_ext.rb @@ -3,7 +3,7 @@ module W3DHubLauncher BLACK_IMAGE = Gosu.render(64, 64, retro: true) { Gosu.draw_rect(0, 0, 32, 32, Gosu::Color::BLACK) } WHITE_IMAGE = Gosu.render(64, 64, retro: true) { Gosu.draw_rect(0, 0, 32, 32, Gosu::Color::WHITE) } - def safe_get_image(path, retro: false) + def safe_get_image(path, fallback_path: "#{ROOT_PATH}/media/default.png", retro: false) raise RuntimeError, "Images may only be loaded from the main thread!" unless Thread.current == Thread.main begin @@ -12,8 +12,11 @@ module W3DHubLauncher pp e end - path = "#{ROOT_PATH}/media/default.png" - return get_image(path, retro: retro) if File.exist?(path) + begin + return get_image(fallback_path, retro: retro) if File.exist?(fallback_path) + rescue RuntimeError => e + pp e + end WHITE_IMAGE end diff --git a/lib/states/interface.rb b/lib/states/interface.rb index d8f65e2..357b3a3 100644 --- a/lib/states/interface.rb +++ b/lib/states/interface.rb @@ -165,9 +165,33 @@ module W3DHubLauncher @server_details_container.clear do tagline server.name, width: 1.0, text_wrap: :none, tip: server.name - image safe_get_image("#{ROOT_PATH}/media/default_map_preview.png"), width: 1.0, aspect_ratio: 16 / 9.0, tip: server.current_map, margin_bottom: PADDING + map_image_container = stack(width: 1.0, height: (@server_details_container.content_width / 640.0) * 360, background_image: safe_get_image(server.map_preview_image_path, fallback_path: "#{ROOT_PATH}/media/default_map_preview.png")) do + caption( + server.current_map, + text_border: false, + text_border_size: 1, + text_border_color: Gosu::Color::RED, + text_shadow: false, + width: 1.0, + height: 1.0, + padding_bottom: PADDING, + text_align: :center, + text_v_align: :bottom, + tip: server.current_map + ) + end + unless File.exist?(server.map_preview_image_path) + Worker::Api.server_map_image(server) do |result, status| + # If the requested image is still the needed image? + next unless @server_details_container.children.include?(map_image_container) + next unless result.okay? - flow(width: 1.0) do + post_process_map_preview_image(result.data["image_path"]) + map_image_container.background_image = safe_get_image(result.data["image_path"]) + end + end + + flow(width: 1.0, margin_top: PADDING) do button "JOIN SERVER", **CTA_BUTTON_THEME, width: 1.0, enabled: !application.nil?, tip: application.nil? ? "Application not installed" : "" do ApplicationHelper.join_server(application, server) end @@ -303,6 +327,34 @@ module W3DHubLauncher end end + # Get them rounded corners! + def post_process_map_preview_image(path) + image = Gosu::Image.new(path) + + target_width = 640 + target_height= 360 + + nine_slice = CyberarmEngine::BackgroundNineSlice.new( + image_path: NINE_SLICE_ROUNDED, + mode: :stretch, + width: target_width, + height: target_height, + left: NINE_SLICE_EDGE, + right: NINE_SLICE_EDGE, + top: NINE_SLICE_EDGE, + bottom: NINE_SLICE_EDGE, + render_mode: :multiply + ) + + composite = Gosu.render(target_width, target_height) do + image_scale = [target_width / image.width.to_f, target_height / image.height.to_f].max + image.draw_rot(target_width / 2, target_height / 2, 0, 0, 0.5, 0.5, image_scale, image_scale) + nine_slice.draw + end + + composite.save(path) + end + def button_up(id) super diff --git a/lib/worker.rb b/lib/worker.rb index f2fc6e6..a606c89 100644 --- a/lib/worker.rb +++ b/lib/worker.rb @@ -301,6 +301,66 @@ module W3DHubLauncher deliver_response(result, query) end + def server_map_image(query) + result = CyberarmEngine::Result.new + + # TODO: Ideally battleview would host readily accessible map previews + server = @game_servers.find { |s| s.address == query.data["server"]["address"] && s.port == query.data["server"]["port"] } + return deliver_response(result, query) unless server + + # is application installed to source data from? + application = @settings.application_installed?(server.game, server.channel) + return deliver_response(result, query) unless application + + save_path = server.map_preview_image_path + if File.exist?(save_path) + result.data = { image_path: save_path } + + return deliver_response(result, query) + end + + map_mix = Dir.glob("#{application.installation_path}/**/#{query.data["server"]["map"]}")&.first + return deliver_response(result, query) unless map_mix + + mix = W3DHubLauncher::WWMix.new(path: map_mix) + return deliver_response(result, query) unless mix.load + + entry = nil + canvas = nil + + entry = mix.entries.find { |e| e.name.match?(/_map_preview\.png/i) } + entry ||= mix.entries.find { |e| e.name.match?(/_map_preview\.dds/i) } + entry ||= mix.entries.find { |e| e.name.match?(/screenshot\.png/i) } + entry ||= mix.entries.find { |e| e.name.match?(/screenshot\.dds/i) } + entry ||= mix.entries.find { |e| e.name.match?(/_map\.png/i) } + entry ||= mix.entries.find { |e| e.name.match?(/_map\.dds/i) } + + return deliver_response(result, query) unless entry + return deliver_response(result, query) unless entry.read + + if entry.name.match?(/\.dds/i) + begin + dds = W3DHubLauncher::DDS.new(io: StringIO.new(entry.blob)) + image_data = dds.images.first + + canvas = ChunkyPNG::Canvas.from_rgba_stream(image_data.width, image_data.height, image_data.data) + canvas.save(save_path) + rescue StandardError => e + result.error = e + + return deliver_response(result, query) + end + + elsif entry.name.match?(/\.png/i) + # canvas = ChunkyPNG::Canvas.from_blob(entry.blob) + File.binwrite(save_path, entry.blob) + end + + result.data = { image_path: save_path } + + deliver_response(result, query) + end + def dns_resolution(query) result = CyberarmEngine::Result.new diff --git a/lib/worker/api.rb b/lib/worker/api.rb index f6607a0..4522ea0 100644 --- a/lib/worker/api.rb +++ b/lib/worker/api.rb @@ -16,6 +16,10 @@ module W3DHubLauncher Worker::Request.new(:ico_to_png, { ico_path: ico_path, png_path: png_path }, &block) end + def self.server_map_image(server, &block) + Worker::Request.new(:server_map_image, { server: { address: server.address, port: server.port, map: server.current_map } }, &block) + end + def self.dns_resolution(&block) Worker::Request.new(:dns_resolution, "", &block) end diff --git a/lib/worker/api/game_server.rb b/lib/worker/api/game_server.rb index eaf80d2..7694cb8 100644 --- a/lib/worker/api/game_server.rb +++ b/lib/worker/api/game_server.rb @@ -89,6 +89,10 @@ module W3DHubLauncher 0xff_3d3846 end end + + def map_preview_image_path + format("%s/map_preview_%s.png", W3DHubLauncher::CACHE_PATH, Digest::SHA256.hexdigest("#{@game}_#{@channel}_#{@current_map}")) + end end class Team diff --git a/lib/worker/api/settings.rb b/lib/worker/api/settings.rb index a6e40db..851c8a7 100644 --- a/lib/worker/api/settings.rb +++ b/lib/worker/api/settings.rb @@ -35,7 +35,10 @@ module W3DHubLauncher end def application_installed?(application, channel) - applications.find { |app| app.id == application&.id && app.channel == channel&.id } + app_id = application.is_a?(String) ? application : application.id + channel_id = channel.is_a?(String) ? channel : channel.id + + applications.find { |app| app.id == app_id && app.channel == channel_id } end # User explictly set options diff --git a/media/default_map_preview.png b/media/default_map_preview.png index a15a2d83bb165d72b9711ca2f4bc88392d91f5b6..585006d61a760d431ac39a4f825fc1dc4f6e826e 100644 GIT binary patch literal 15956 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 BP!a$D diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index 4dd4ff5..8ddd280 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -47,6 +47,7 @@ require_relative "lib/window" require_relative "lib/application_helper" require_relative "lib/ico" +require_relative "lib/dds" require_relative "lib/ww_mix" require_relative "lib/worker"