Compare commits

..

5 Commits

19 changed files with 241 additions and 190 deletions

View File

@@ -3,7 +3,7 @@ GEM
specs: specs:
base64 (0.2.0) base64 (0.2.0)
concurrent-ruby (1.2.3) concurrent-ruby (1.2.3)
cyberarm_engine (0.24.1) cyberarm_engine (0.24.2)
excon (~> 0.88) excon (~> 0.88)
gosu (~> 1.1) gosu (~> 1.1)
gosu_more_drawables (~> 0.3) gosu_more_drawables (~> 0.3)

View File

@@ -22,7 +22,7 @@ class W3DHub
def initialize(hash) def initialize(hash)
@data = hash @data = hash
@id = @data[:id] @id = @data[:id].to_s
@name = @data[:name] @name = @data[:name]
@type = @data[:type] @type = @data[:type]
@category = @data[:category] @category = @data[:category]
@@ -44,7 +44,7 @@ class W3DHub
def initialize(hash) def initialize(hash)
@data = hash @data = hash
@id = @data[:id] @id = @data[:id].to_s
@name = @data[:name] @name = @data[:name]
@user_level = @data[:"user-level"] @user_level = @data[:"user-level"]
@current_version = @data[:"current-version"] @current_version = @data[:"current-version"]

View File

@@ -459,6 +459,13 @@ class W3DHub
Store.applications.games.detect { |g| g.id == app_id }&.name Store.applications.games.detect { |g| g.id == app_id }&.name
end end
def channel_name(app_id, channel_id)
app = Store.applications.games.detect { |g| g.id.to_s == app_id.to_s }
return unless app
app.channels.detect { |g| g.id.to_s == channel_id.to_s }&.name
end
# No application tasks are being done # No application tasks are being done
def idle? def idle?
!busy? !busy?

View File

@@ -45,10 +45,10 @@ class W3DHub
tagline "<b>Help & Support</b>" tagline "<b>Help & Support</b>"
flow(width: 1.0) do flow(width: 1.0) do
para "For help and support using this launcher or playing any W3D Hub game visit the" para "For help and support using this launcher or playing any W3D Hub game visit the"
link("W3D Hub forums", text_size: 16, tip: "https://w3dhub.com/forum/") { W3DHub.url("https://w3dhub.com/forum/") } link("W3D Hub forums", text_size: 22, tip: "https://w3dhub.com/forum/") { W3DHub.url("https://w3dhub.com/forum/") }
para "or join us in" para "or join us in"
image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", height: 16, padding_top: 4 image "#{GAME_ROOT_PATH}/media/social_media_icons/discord.png", height: 16, padding_top: 4
link("#tech-support", text_size: 16, tip: "https://discord.com/invite/GYhW7eV") { W3DHub.url("https://discord.com/invite/GYhW7eV") } link("#tech-support", text_size: 22, tip: "https://discord.com/invite/GYhW7eV") { W3DHub.url("https://discord.com/invite/GYhW7eV") }
para "on the W3D Hub Discord server" para "on the W3D Hub Discord server"
end end
end end
@@ -113,15 +113,15 @@ class W3DHub
# stack(width: 0.6, height: 1.0) do # stack(width: 0.6, height: 1.0) do
# stack(width: 1.0, height: 112) do # stack(width: 1.0, height: 112) do
# link "<b>#{item.title}</b>", text_size: 18 do # link "<b>#{item.title}</b>", text_size: 22 do
# W3DHub.url(item.uri) # W3DHub.url(item.uri)
# end # end
# inscription item.blurb.gsub(/\n+/, "\n").strip[0..180] # para item.blurb.gsub(/\n+/, "\n").strip[0..180]
# end # end
# flow(width: 1.0) do # flow(width: 1.0) do
# inscription item.timestamp.strftime("%Y-%m-%d"), width: 0.499 # para item.timestamp.strftime("%Y-%m-%d"), width: 0.499
# link I18n.t(:"games.read_more"), width: 0.5, text_align: :right, text_size: 16 do # link I18n.t(:"games.read_more"), width: 0.5, text_align: :right, text_size: 22 do
# W3DHub.url(item.uri) # W3DHub.url(item.uri)
# end # end
# end # end
@@ -139,12 +139,12 @@ class W3DHub
stack(fill: true, height: 1.0, padding: 4, border_thickness_left: 1, border_color_left: lighten(Gosu::Color.new(0xff_252525))) do stack(fill: true, height: 1.0, padding: 4, border_thickness_left: 1, border_color_left: lighten(Gosu::Color.new(0xff_252525))) do
tagline "<b>#{item.title}</b>", width: 1.0 tagline "<b>#{item.title}</b>", width: 1.0
inscription item.blurb.gsub(/\n+/, "\n").strip[0..1024], fill: true para item.blurb.gsub(/\n+/, "\n").strip[0..1024], fill: true
flow(width: 1.0, height: 32, margin_top: 8) do flow(width: 1.0, height: 36, margin_top: 8) do
stack(fill: true, height: 1.0) do stack(fill: true, height: 1.0) do
flow(fill: true) flow(fill: true)
inscription "#{item.author}#{item.timestamp.strftime("%Y-%m-%d")}" para "#{item.author}#{item.timestamp.strftime("%Y-%m-%d")}"
end end
button I18n.t(:"games.read_more"), width: 1.0, max_width: 128, padding_top: 4, padding_bottom: 4 do button I18n.t(:"games.read_more"), width: 1.0, max_width: 128, padding_top: 4, padding_bottom: 4 do

View File

@@ -39,19 +39,19 @@ class W3DHub
stack(margin_left: 8, width: 0.75) do stack(margin_left: 8, width: 0.75) do
@application_name_label = tagline "#{task.application.name}" @application_name_label = tagline "#{task.application.name}"
@application_version_label = inscription "Version: #{task.target_version} (#{task.channel.id})" @application_version_label = para "Version: #{task.target_version} (#{task.channel.id})"
end end
end end
flow(width: 0.30, height: 1.0) do flow(width: 0.30, height: 1.0) do
stack(width: 0.499, height: 1.0) do stack(width: 0.499, height: 1.0) do
para "Download Speed", width: 1.0, text_align: :center para "Download Speed", width: 1.0, text_align: :center
@download_speed_label = inscription "- b/s", width: 1.0, text_align: :center @download_speed_label = para "- b/s", width: 1.0, text_align: :center
end end
stack(width: 0.5, height: 1.0) do stack(width: 0.5, height: 1.0) do
para "Downloaded", width: 1.0, text_align: :center para "Downloaded", width: 1.0, text_align: :center
inscription "---- b / ---- b", width: 1.0, text_align: :center para "---- b / ---- b", width: 1.0, text_align: :center
end end
end end
end end
@@ -68,8 +68,8 @@ class W3DHub
background 0xff_333333 if i.odd? background 0xff_333333 if i.odd?
flow(width: 1.0, height: 22) do flow(width: 1.0, height: 22) do
@operation_info["#{key}_name"] = inscription operation.label, width: 0.7, text_wrap: :none, tag: "#{key}_name" @operation_info["#{key}_name"] = para operation.label, width: 0.7, text_wrap: :none, tag: "#{key}_name"
@operation_info["#{key}_status"] = inscription operation.value, width: 0.3, text_align: :right, text_wrap: :none, tag: "#{key}_status" @operation_info["#{key}_status"] = para operation.value, width: 0.3, text_align: :right, text_wrap: :none, tag: "#{key}_status"
end end
@operation_info["#{key}_progress"] = progress fraction: operation.progress, height: 2, width: 1.0, tag: "#{key}_progress" @operation_info["#{key}_progress"] = progress fraction: operation.progress, height: 2, width: 1.0, tag: "#{key}_progress"

View File

@@ -63,7 +63,7 @@ class W3DHub
image "#{GAME_ROOT_PATH}/media/ui_icons/import.png", width: 24, margin_left: -4, margin_top: -6, color: 0xff_ff8800 if Store.application_manager.updateable?(game.id, game.channels.first.id) image "#{GAME_ROOT_PATH}/media/ui_icons/import.png", width: 24, margin_left: -4, margin_top: -6, color: 0xff_ff8800 if Store.application_manager.updateable?(game.id, game.channels.first.id)
end end
# inscription game.name, width: 1.0, text_align: :center, text_size: 16 # para game.name, width: 1.0, text_align: :center
end end
def game_button.hit_element?(x, y) def game_button.hit_element?(x, y)
@@ -128,7 +128,7 @@ class W3DHub
flow(width: 1.0, height: 22, margin_bottom: 8) do flow(width: 1.0, height: 22, margin_bottom: 8) do
image "#{GAME_ROOT_PATH}/media/ui_icons/#{hash[:icon]}.png", width: 24 if hash[:icon] image "#{GAME_ROOT_PATH}/media/ui_icons/#{hash[:icon]}.png", width: 24 if hash[:icon]
image EMPTY_IMAGE, width: 24 unless hash[:icon] image EMPTY_IMAGE, width: 24 unless hash[:icon]
link key, text_size: 18, enabled: hash.key?(:enabled) ? hash[:enabled] : true do link key, text_size: 22, enabled: hash.key?(:enabled) ? hash[:enabled] : true do
hash[:block]&.call hash[:block]&.call
end end
end end
@@ -138,7 +138,7 @@ class W3DHub
game.web_links.each do |item| game.web_links.each do |item|
flow(width: 1.0, height: 22, margin_bottom: 8) do flow(width: 1.0, height: 22, margin_bottom: 8) do
image "#{GAME_ROOT_PATH}/media/ui_icons/share1.png", width: 24 image "#{GAME_ROOT_PATH}/media/ui_icons/share1.png", width: 24
link item.name, text_size: 18 do link item.name, text_size: 22 do
W3DHub.url(item.uri) W3DHub.url(item.uri)
end end
end end
@@ -148,7 +148,7 @@ class W3DHub
if game.channels.count > 1 if game.channels.count > 1
# Release channel # Release channel
inscription I18n.t(:"games.game_version"), width: 1.0, text_align: :center para I18n.t(:"games.game_version"), width: 1.0, text_align: :center
flow(width: 1.0, height: 48) do flow(width: 1.0, height: 48) do
# background 0xff_444411 # background 0xff_444411
@@ -225,7 +225,7 @@ class W3DHub
# Height should match Game Banner container height # Height should match Game Banner container height
stack(width: 1.0, padding: 16) do stack(width: 1.0, padding: 16) do
title "About #{game.name}", border_bottom_color: 0xff_666666, border_bottom_thickness: 1, width: 1.0 title "About #{game.name}", border_bottom_color: 0xff_666666, border_bottom_thickness: 1, width: 1.0
para "Command & Conquer: Tiberian Sun is a 1999 real-time stretegy video game by Westwood Studios, published by Electronic Arts, releaseed exclusively for Microsoft Windows on August 27th, 1999. The game is the sequel to the 1995 game Command & Conquer. It featured new semi-3D graphics, a more futuristic sci-fi setting, and new gameplay features such as vehicles capable of hovering and burrowing.", width: 1.0, text_size: 20 para "Command & Conquer: Tiberian Sun is a 1999 real-time stretegy video game by Westwood Studios, published by Electronic Arts, releaseed exclusively for Microsoft Windows on August 27th, 1999. The game is the sequel to the 1995 game Command & Conquer. It featured new semi-3D graphics, a more futuristic sci-fi setting, and new gameplay features such as vehicles capable of hovering and burrowing.", width: 1.0
end end
end end
@@ -325,7 +325,7 @@ class W3DHub
stack(width: 166, height: 224, margin: 8, background: 0x88_151515, border_color: game.color, border_thickness: 1) do stack(width: 166, height: 224, margin: 8, background: 0x88_151515, border_color: game.color, border_thickness: 1) do
flow(width: 1.0, height: 24, padding: 8) do flow(width: 1.0, height: 24, padding: 8) do
para "Favorite", fill: true para "Favorite", fill: true
toggle_button checked: Store.application_manager.favorite?(game.id), text_size: 18, padding_top: 3, padding_right: 3, padding_bottom: 3, padding_left: 3 do |btn| toggle_button checked: Store.application_manager.favorite?(game.id), text_size: 22, padding_top: 3, padding_right: 3, padding_bottom: 3, padding_left: 3 do |btn|
Store.application_manager.favorive(game.id, btn.value) Store.application_manager.favorive(game.id, btn.value)
Store.settings.save_settings Store.settings.save_settings
@@ -424,12 +424,12 @@ class W3DHub
stack(fill: true, height: 1.0, padding: 4, border_thickness_left: 1, border_color_left: lighten(Gosu::Color.new(game.color))) do stack(fill: true, height: 1.0, padding: 4, border_thickness_left: 1, border_color_left: lighten(Gosu::Color.new(game.color))) do
tagline "<b>#{item.title}</b>", width: 1.0 tagline "<b>#{item.title}</b>", width: 1.0
inscription item.blurb.gsub(/\n+/, "\n").strip[0..1024], fill: true para item.blurb.gsub(/\n+/, "\n").strip[0..1024], fill: true
flow(width: 1.0, height: 32, margin_top: 8) do flow(width: 1.0, height: 36, margin_top: 8) do
stack(fill: true, height: 1.0) do stack(fill: true, height: 1.0) do
flow(fill: true) flow(fill: true)
inscription "#{item.author}#{item.timestamp.strftime("%Y-%m-%d")}" para "#{item.author}#{item.timestamp.strftime("%Y-%m-%d")}"
end end
button I18n.t(:"games.read_more"), width: 1.0, max_width: 128, padding_top: 4, padding_bottom: 4, margin_left: 0, margin_top: 0, margin_bottom: 0, margin_right: 0 do button I18n.t(:"games.read_more"), width: 1.0, max_width: 128, padding_top: 4, padding_bottom: 4, margin_left: 0, margin_top: 0, margin_bottom: 0, margin_right: 0 do
@@ -472,7 +472,7 @@ class W3DHub
background 0x44_000000 background 0x44_000000
title event.title, width: 1.0, text_align: :center title event.title, width: 1.0, text_align: :center
tagline event.start_time.strftime("%A"), text_size: 36, width: 1.0, text_align: :center title event.start_time.strftime("%A"), width: 1.0, text_align: :center
caption event.start_time.strftime("%B %e, %Y %l:%M %p"), width: 1.0, text_align: :center caption event.start_time.strftime("%B %e, %Y %l:%M %p"), width: 1.0, text_align: :center
end end
end end
@@ -505,12 +505,12 @@ class W3DHub
stack(width: 0.75, height: 1.0) do stack(width: 0.75, height: 1.0) do
stack(width: 1.0, height: 128 - 28) do stack(width: 1.0, height: 128 - 28) do
link(mod[:name]) { W3DHub.url(mod[:url]) } link(mod[:name]) { W3DHub.url(mod[:url]) }
inscription "Author: #{mod[:author]} | #{mod[:type]} | #{mod[:subtype]}" para "Author: #{mod[:author]} | #{mod[:type]} | #{mod[:subtype]}"
para mod[:description][0..180] para mod[:description][0..180]
end end
flow(width: 1.0, height: 28, padding: 4) do flow(width: 1.0, height: 28, padding: 4) do
inscription "Version", width: 0.25, text_align: :center para "Version", width: 0.25, text_align: :center
list_box items: mod[:versions], width: 0.5, enabled: mod[:versions].size > 1, padding_top: 0, padding_bottom: 0 list_box items: mod[:versions], width: 0.5, enabled: mod[:versions].size > 1, padding_top: 0, padding_bottom: 0
button "Install", width: 0.25, padding_top: 0, padding_bottom: 0 button "Install", width: 0.25, padding_top: 0, padding_bottom: 0
end end

View File

@@ -92,19 +92,7 @@ class W3DHub
def populate_account_info def populate_account_info
@host.instance_variable_get(:"@account_container").clear do @host.instance_variable_get(:"@account_container").clear do
stack(width: 0.7, height: 1.0) do
tagline "<b>#{Store.account.username}</b>"
flow(width: 1.0) do
link(I18n.t(:"interface.log_out"), text_size: 16, width: 0.5) { depopulate_account_info }
link I18n.t(:"interface.profile"), text_size: 16, width: 0.49 do
W3DHub.url("https://secure.w3dhub.com/forum/index.php?showuser=#{Store.account.id}")
end
end
end
flow(fill: true, height: 1.0) do flow(fill: true, height: 1.0) do
flow(fill: true) # Fill empty space to push image over to container edge
avatar_image = get_image(Cache.path(Store.account.avatar_uri)) avatar_image = get_image(Cache.path(Store.account.avatar_uri))
mask_image = get_image("#{GAME_ROOT_PATH}/media/textures/circle_mask.png") mask_image = get_image("#{GAME_ROOT_PATH}/media/textures/circle_mask.png")
@@ -115,6 +103,14 @@ class W3DHub
image composite_image, width: 1.0 image composite_image, width: 1.0
end end
stack(width: 0.7, height: 1.0, margin_left: 8) do
link Store.account.username, text_size: 24, font: BOLD_FONT, tip: I18n.t(:"interface.profile"), margin_top: 16, width: 1.0, text_wrap: :none do
W3DHub.url("https://secure.w3dhub.com/forum/index.php?showuser=#{Store.account.id}")
end
link(I18n.t(:"interface.log_out"), text_size: 22) { depopulate_account_info }
end
end end
end end
@@ -137,8 +133,8 @@ class W3DHub
tagline "<b>#{I18n.t(:"interface.not_logged_in")}</b>", text_wrap: :none tagline "<b>#{I18n.t(:"interface.not_logged_in")}</b>", text_wrap: :none
flow(width: 1.0) do flow(width: 1.0) do
link(I18n.t(:"interface.log_in"), text_size: 16, width: 0.5) { page(W3DHub::Pages::Login) } link(I18n.t(:"interface.log_in"), text_size: 22, width: 0.5) { page(W3DHub::Pages::Login) }
link I18n.t(:"interface.register"), text_size: 16, width: 0.49 do link I18n.t(:"interface.register"), text_size: 22, width: 0.49 do
W3DHub.url("https://secure.w3dhub.com/forum/index.php?app=core&module=global&section=register") W3DHub.url("https://secure.w3dhub.com/forum/index.php?app=core&module=global&section=register")
end end
end end

View File

@@ -8,7 +8,7 @@ class W3DHub
@selected_server ||= nil @selected_server ||= nil
@selected_server_container ||= nil @selected_server_container ||= nil
@selected_color = 0xff_666655 @selected_color = 0xaa_666655
@filters = Store.settings[:server_list_filters] || {} @filters = Store.settings[:server_list_filters] || {}
@filter_region = Store.settings[:server_list_region] || "Any" # "Any", "North America", "Europe" @filter_region = Store.settings[:server_list_region] || "Any" # "Any", "North America", "Europe"
@@ -22,14 +22,14 @@ class W3DHub
stack(width: 1.0, height: 1.0, padding: 8) do stack(width: 1.0, height: 1.0, padding: 8) do
background 0xaa_252525 background 0xaa_252525
stack(width: 1.0, height: 18) do stack(width: 1.0, height: 22) do
inscription "<b>#{I18n.t(:"server_browser.filters")}</b>" para "<b>#{I18n.t(:"server_browser.filters")}</b>", font: BOLD_FONT
end end
flow(width: 1.0, height: 32) do flow(width: 1.0, height: 36) do
flow(width: 128, height: 1.0) do flow(width: 128, height: 1.0) do
# para I18n.t(:"server_browser.region"), width: 0.5 # para I18n.t(:"server_browser.region"), width: 0.5
list_box items: ["Any", "North America", "Europe"], choose: Store.settings[:server_list_region], width: 1.0, height: 1.0, padding_top: 4, padding_bottom: 4 do |value| list_box items: ["Any", "North America", "Europe", "Asia"], choose: Store.settings[:server_list_region], width: 1.0, height: 1.0, padding_top: 4, padding_bottom: 4 do |value|
@filter_region = value @filter_region = value
Store.settings[:server_list_region] = @filter_region Store.settings[:server_list_region] = @filter_region
Store.settings.save_settings Store.settings.save_settings
@@ -78,8 +78,8 @@ class W3DHub
flow(min_width: 372, width: 0.38, max_width: 512, height: 1.0) do |container| flow(min_width: 372, width: 0.38, max_width: 512, height: 1.0) do |container|
flow(fill: true) flow(fill: true)
inscription "#{I18n.t(:"server_browser.nickname")}:" para "#{I18n.t(:"server_browser.nickname")}:"
@nickname_label = inscription "#{Store.settings[:server_list_username]}" @nickname_label = para "#{Store.settings[:server_list_username]}"
image "#{GAME_ROOT_PATH}/media/ui_icons/wrench.png", height: 16, hover: { color: 0xaa_ffffff }, tip: I18n.t(:"server_browser.set_nickname") do image "#{GAME_ROOT_PATH}/media/ui_icons/wrench.png", height: 16, hover: { color: 0xaa_ffffff }, tip: I18n.t(:"server_browser.set_nickname") do
# Prompt for player name # Prompt for player name
W3DHub.prompt_for_nickname( W3DHub.prompt_for_nickname(
@@ -105,23 +105,23 @@ class W3DHub
# Players # Players
# Ping # Ping
flow(width: 1.0, height: 24) do flow(width: 1.0, height: 24) do
stack(width: 48, padding: 4) do stack(width: 56, padding: 4) do
end end
stack(width: 0.45, height: 1.0) do stack(width: 0.45, height: 1.0) do
para "<b>#{I18n.t(:"server_browser.hostname")}</b>", text_wrap: :none, width: 1.0 para "<b>#{I18n.t(:"server_browser.hostname")}</b>", text_wrap: :none, width: 1.0, font: BOLD_FONT
end end
flow(fill: true, height: 1.0) do flow(fill: true, height: 1.0) do
para "<b>#{I18n.t(:"server_browser.current_map")}</b>", text_wrap: :none, width: 1.0 para "<b>#{I18n.t(:"server_browser.current_map")}</b>", text_wrap: :none, width: 1.0, font: BOLD_FONT
end end
flow(width: 0.11, height: 1.0) do flow(width: 0.11, height: 1.0) do
para "<b>#{I18n.t(:"server_browser.players")}</b>", text_wrap: :none, width: 1.0 para "<b>#{I18n.t(:"server_browser.players")}</b>", text_wrap: :none, width: 1.0, font: BOLD_FONT
end end
stack(width: 48) do stack(width: 56) do
para "<b>#{I18n.t(:"server_browser.ping")}</b>", text_wrap: :none, width: 1.0 para "<b>#{I18n.t(:"server_browser.ping")}</b>", text_wrap: :none, width: 1.0, font: BOLD_FONT
end end
end end
@@ -248,7 +248,7 @@ class W3DHub
server_ping = find_element_by_tag(server_container, :ping) server_ping = find_element_by_tag(server_container, :ping)
server_name.value = "<b>#{server&.status&.name}</b>" server_name.value = "<b>#{server&.status&.name}</b>"
server_channel.value = server.channel server_channel.value = Store.application_manager.channel_name(server.game, server.channel).to_s
server_region.value = server.region server_region.value = server.region
server_map.value = server&.status&.map server_map.value = server&.status&.map
player_count.value = "#{server&.status&.player_count}/#{server&.status&.max_players}" player_count.value = "#{server&.status&.player_count}/#{server&.status&.max_players}"
@@ -303,35 +303,35 @@ class W3DHub
Store.server_list.each do |server| Store.server_list.each do |server|
next unless @filters[server.game.to_sym] next unless @filters[server.game.to_sym]
next unless server.region == @filter_region || @filter_region == "Any" next unless server.region == @filter_region || @filter_region == "Any"
# next unless server.channel == "release" next unless Store.application_manager.channel_name(server.game, server.channel) # can user access required game and channel for this server?
i += 1 i += 1
server_container = flow(width: 1.0, height: 48, hover: { background: 0xff_555566 }, active: { background: 0xff_555588 }, tag: server.id, tip: ping_tip(server)) do server_container = flow(width: 1.0, height: 56, hover: { background: 0xaa_555566 }, active: { background: 0xaa_555588 }, tag: server.id, tip: ping_tip(server)) do
background 0xff_333333 if i.even? background 0x88_333333 if i.even?
flow(width: 48, height: 1.0, padding: 4) do flow(width: 56, height: 1.0, padding: 4) do
image game_icon(server), height: 1.0, tag: :game_icon image game_icon(server), height: 1.0, tag: :game_icon
end end
stack(width: 0.45, height: 1.0) do stack(width: 0.45, height: 1.0) do
inscription "<b>#{server&.status&.name}</b>", tag: :server_name para server&.status&.name, tag: :server_name, font: BOLD_FONT, text_wrap: :none
flow(width: 1.0, height: 1.0) do flow(width: 1.0, height: 1.0) do
inscription server.channel, margin_right: 64, text_size: 16, tag: :server_channel para Store.application_manager.channel_name(server.game, server.channel).to_s, width: 172, margin_right: 8, tag: :server_channel
inscription server.region, text_size: 16, tag: :server_region para server.region, tag: :server_region
end end
end end
flow(fill: true, height: 1.0) do flow(fill: true, height: 1.0) do
inscription "#{server&.status&.map}", tag: :server_map para "#{server&.status&.map}", tag: :server_map
end end
flow(width: 0.11, height: 1.0) do flow(width: 0.11, height: 1.0) do
inscription "#{server&.status&.player_count}/#{server&.status&.max_players}", tag: :player_count para "#{server&.status&.player_count}/#{server&.status&.max_players}", tag: :player_count
end end
flow(width: 48, height: 1.0, padding: 4) do flow(width: 56, height: 1.0, padding: 4) do
image ping_icon(server), height: 1.0, tag: :ping image ping_icon(server), height: 1.0, tag: :ping
end end
end end
@@ -368,17 +368,17 @@ class W3DHub
def populate_server_info(server) def populate_server_info(server)
@game_server_info_container.clear do @game_server_info_container.clear do
stack(width: 1.0, height: 1.0, padding: 8) do stack(width: 1.0, height: 1.0, padding: 8) do
stack(width: 1.0, height: 220) do stack(width: 1.0, height: 208) do
flow(width: 1.0, height: 0.2) do flow(width: 1.0, height: 34) do
flow(fill: true) flow(fill: true)
image game_icon(server), width: 0.05 image game_icon(server), height: 1.0
tagline server.status.name, text_wrap: :none title server.status.name, text_wrap: :none
flow(fill: true) flow(fill: true)
end end
flow(width: 1.0, height: 0.2) do flow(width: 1.0, height: 46, margin_top: 16, margin_bottom: 16) do
game_installed = Store.application_manager.installed?(server.game, server.channel) game_installed = Store.application_manager.installed?(server.game, server.channel)
game_updatable = Store.application_manager.updateable?(server.game, server.channel) game_updatable = Store.application_manager.updateable?(server.game, server.channel)
style = server.channel != "release" ? TESTING_BUTTON : {} style = server.channel != "release" ? TESTING_BUTTON : {}
@@ -422,8 +422,8 @@ class W3DHub
end end
end end
if Store.developer_mode if W3DHUB_DEVELOPER
list_box(items: (1..12).to_a.map(&:to_s), margin_left: 16, **TESTING_BUTTON) list_box(items: (1..12).to_a.map(&:to_s), margin_left: 16, width: 72, tip: "Number of game clients", **TESTING_BUTTON)
button "Multijoin", tip: "Launch multiple clients with configured username_\#{number}", **TESTING_BUTTON, enabled: true button "Multijoin", tip: "Launch multiple clients with configured username_\#{number}", **TESTING_BUTTON, enabled: true
end end
@@ -431,30 +431,25 @@ class W3DHub
end end
# Server Info # Server Info
stack(width: 1.0, fill: true, margin_top: 16) do stack(width: 1.0, fill: true, margin_bottom: 16) do
flow(width: 1.0) do flow(width: 1.0) do
inscription "<b>#{I18n.t(:"server_browser.game")}</b>", width: 0.28, text_wrap: :none para "<b>#{I18n.t(:"server_browser.game")}</b>", width: 0.12, text_wrap: :none, font: BOLD_FONT
inscription "#{game_name(server.game)} (#{server.channel})", width: 0.71, text_wrap: :none para "#{game_name(server.game)} (#{server.channel})", width: 0.71, text_wrap: :none
end end
flow(width: 1.0) do flow(width: 1.0) do
inscription "<b>#{I18n.t(:"server_browser.map")}</b>", width: 0.28, text_wrap: :none para "<b>#{I18n.t(:"server_browser.map")}</b>", width: 0.12, text_wrap: :none, font: BOLD_FONT
inscription server.status.map, width: 0.71, text_wrap: :none para server.status.map, width: 0.71, text_wrap: :none
end end
flow(width: 1.0) do flow(width: 1.0) do
inscription "<b>#{I18n.t(:"server_browser.max_players")}</b>", width: 0.28, text_wrap: :none para "<b>#{I18n.t(:"server_browser.time")}</b>", width: 0.12, text_wrap: :none, font: BOLD_FONT
inscription "#{server.status.max_players}", width: 0.71, text_wrap: :none para formatted_rentime(server.status.started), text_wrap: :none
end
flow(width: 1.0) do unless server.status.remaining =~ /00:00:00|00.00.00/
inscription "<b>#{I18n.t(:"server_browser.time")}</b>", width: 0.28, text_wrap: :none para "<b>#{I18n.t(:"server_browser.remaining")}</b>", margin_left: 16, margin_right: 8, text_wrap: :none, font: BOLD_FONT
inscription formatted_rentime(server.status.started), width: 0.71, text_wrap: :none para "#{server.status.remaining}", text_wrap: :none
end end
flow(width: 1.0) do
inscription "<b>#{I18n.t(:"server_browser.remaining")}</b>", width: 0.28, text_wrap: :none
inscription "#{server.status.remaining}", width: 0.71, text_wrap: :none
end end
end end
end end
@@ -462,9 +457,9 @@ class W3DHub
game_balance = server_game_balance(server) game_balance = server_game_balance(server)
# Game score and balance display # Game score and balance display
flow(width: 1.0, height: 48, border_thickness_bottom: 2, border_color_bottom: 0x44_ffffff) do flow(width: 1.0, height: 52, border_thickness_bottom: 2, border_color_bottom: 0x44_ffffff) do
stack(fill: true, height: 1.0) do stack(fill: true, height: 1.0) do
para "<b>#{server.status.teams[0].name} (#{server.status.players.select { |pl| pl.team == 0 }.count})</b>", width: 1.0, text_align: :center para "#{server.status.teams[0].name} (#{server.status.players.select { |pl| pl.team == 0 }.count})", width: 1.0, text_align: :center, font: BOLD_FONT
para formatted_score(game_balance[:team_0_score].to_i), width: 1.0, text_align: :center para formatted_score(game_balance[:team_0_score].to_i), width: 1.0, text_align: :center
end end
@@ -479,7 +474,7 @@ class W3DHub
end end
stack(fill: true, height: 1.0) do stack(fill: true, height: 1.0) do
para "<b>#{server.status.teams[1].name} (#{server.status.players.select { |pl| pl.team == 1 }.count})</b>", width: 1.0, text_align: :center para "#{server.status.teams[1].name} (#{server.status.players.select { |pl| pl.team == 1 }.count})", width: 1.0, text_align: :center, font: BOLD_FONT
para formatted_score(game_balance[:team_1_score].to_i), width: 1.0, text_align: :center para formatted_score(game_balance[:team_1_score].to_i), width: 1.0, text_align: :center
end end
end end
@@ -488,15 +483,15 @@ class W3DHub
flow(width: 1.0, fill: true, scroll: true) do flow(width: 1.0, fill: true, scroll: true) do
stack(width: 0.5) do stack(width: 0.5) do
server.status.players.select { |ply| ply.team == 0 }.sort_by { |ply| ply.score }.reverse.each_with_index do |player, i| server.status.players.select { |ply| ply.team == 0 }.sort_by { |ply| ply.score }.reverse.each_with_index do |player, i|
flow(width: 1.0, height: 18) do flow(width: 1.0, height: 26) do
background 0xff_333333 if i.even? background 0xaa_333333 if i.even?
stack(width: 0.6, height: 1.0) do stack(width: 0.6, height: 1.0) do
inscription player.nick, text_size: 16, text_wrap: :none para player.nick, text_wrap: :none
end end
stack(width: 0.4, height: 1.0) do stack(width: 0.4, height: 1.0) do
inscription formatted_score(player.score), text_size: 16, width: 1.0, text_align: :right, text_wrap: :none para formatted_score(player.score), width: 1.0, text_align: :right, text_wrap: :none
end end
end end
end end
@@ -504,15 +499,15 @@ class W3DHub
stack(width: 0.5, border_thickness_left: 2, border_color_left: 0xff_000000) do stack(width: 0.5, border_thickness_left: 2, border_color_left: 0xff_000000) do
server.status.players.select { |ply| ply.team == 1 }.sort_by { |ply| ply.score }.reverse.each_with_index do |player, i| server.status.players.select { |ply| ply.team == 1 }.sort_by { |ply| ply.score }.reverse.each_with_index do |player, i|
flow(width: 1.0, height: 18) do flow(width: 1.0, height: 26) do
background 0xff_333333 if i.even? background 0xaa_333333 if i.even?
stack(width: 0.6, height: 1.0) do stack(width: 0.6, height: 1.0) do
inscription player.nick, text_size: 16, text_wrap: :none para player.nick, text_wrap: :none
end end
stack(width: 0.4, height: 1.0) do stack(width: 0.4, height: 1.0) do
inscription formatted_score(player.score), text_size: 16, width: 1.0, text_align: :right, text_wrap: :none para formatted_score(player.score), width: 1.0, text_align: :right, text_wrap: :none
end end
end end
end end

View File

@@ -11,7 +11,7 @@ class W3DHub
para "<b>Launcher Language</b>", width: 0.249, margin_left: 32, margin_top: 12 para "<b>Launcher Language</b>", width: 0.249, margin_left: 32, margin_top: 12
stack(width: 0.75) do stack(width: 0.75) do
@language_menu = list_box items: I18n.available_locales.map { |l| expand_language_code(l.to_s) }, choose: expand_language_code(Store.settings[:language]), width: 1.0 @language_menu = list_box items: I18n.available_locales.map { |l| expand_language_code(l.to_s) }, choose: expand_language_code(Store.settings[:language]), width: 1.0
inscription "Select the UI language you'd like to use in the W3D Hub Launcher." para "Select the UI language you'd like to use in the W3D Hub Launcher."
end end
end end
@@ -22,7 +22,7 @@ class W3DHub
stack(width: 0.75) do stack(width: 0.75) do
@app_install_dir_input = edit_line Store.settings[:app_install_dir], width: 1.0 @app_install_dir_input = edit_line Store.settings[:app_install_dir], width: 1.0
inscription "The folder into which new games and apps will be installed by the launcher" para "The folder into which new games and apps will be installed by the launcher"
end end
end end
@@ -31,7 +31,7 @@ class W3DHub
stack(width: 0.75) do stack(width: 0.75) do
@package_cache_dir_input = edit_line Store.settings[:package_cache_dir], width: 1.0 @package_cache_dir_input = edit_line Store.settings[:package_cache_dir], width: 1.0
inscription "A folder which will be used to cache downloaded packages used to install games and apps" para "A folder which will be used to cache downloaded packages used to install games and apps"
end end
end end
end end
@@ -42,7 +42,7 @@ class W3DHub
para "<b>Wine Command</b>", width: 0.249, margin_left: 32, margin_top: 12 para "<b>Wine Command</b>", width: 0.249, margin_left: 32, margin_top: 12
stack(width: 0.75) do stack(width: 0.75) do
@wine_command_input = edit_line Store.settings[:wine_command], width: 1.0 @wine_command_input = edit_line Store.settings[:wine_command], width: 1.0
inscription "Command to use to for Windows compatiblity layer" para "Command to use to for Windows compatiblity layer"
end end
end end
@@ -50,7 +50,7 @@ class W3DHub
para "<b>Wine Prefix</b>", width: 0.249, margin_left: 32, margin_top: 12 para "<b>Wine Prefix</b>", width: 0.249, margin_left: 32, margin_top: 12
stack(width: 0.75) do stack(width: 0.75) do
@wine_prefix_toggle = toggle_button checked: Store.settings[:wine_prefix] @wine_prefix_toggle = toggle_button checked: Store.settings[:wine_prefix]
inscription "Whether each game gets its own prefix. Uses global/default prefix by default." para "Whether each game gets its own prefix. Uses global/default prefix by default."
end end
end end
end end

View File

@@ -8,8 +8,6 @@ class W3DHub
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0xff_252525
@fraction = 0.0 @fraction = 0.0
@w3dhub_logo = get_image("#{GAME_ROOT_PATH}/media/icons/app.png") @w3dhub_logo = get_image("#{GAME_ROOT_PATH}/media/icons/app.png")
@tasks = { @tasks = {
@@ -25,23 +23,23 @@ class W3DHub
@task_index = 0 @task_index = 0
stack(width: 1.0, height: 1.0, border_thickness: 1, border_color: W3DHub::BORDER_COLOR) do stack(width: 1.0, height: 1.0, border_thickness: 1, border_color: W3DHub::BORDER_COLOR, background_image: "#{GAME_ROOT_PATH}/media/banners/background.png", background_image_color: 0xff_525252, background_image_mode: :fill) do
stack(width: 1.0, fill: true) do stack(width: 1.0, fill: true) do
end end
stack(width: 1.0, height: 75) do stack(width: 1.0, height: 60) do
@progressbar = progress height: 25, width: 1.0 flow(width: 1.0, height: 26, margin_left: 16, margin_right: 16, margin_bottom: 8, margin_top: 8) do
flow(width: 1.0, fill: true, padding_left: 16, padding_right: 16, padding_bottom: 8, padding_top: 8) do
@status_label = caption "Starting #{I18n.t(:app_name_simple)}...", width: 0.5 @status_label = caption "Starting #{I18n.t(:app_name_simple)}...", width: 0.5
inscription "#{I18n.t(:app_name)} #{W3DHub::VERSION}", width: 0.5, text_align: :right para "#{I18n.t(:app_name)} #{W3DHub::VERSION}", width: 0.5, text_align: :right
end end
@progressbar = progress height: 4, width: 1.0, margin_left: 16, margin_right: 16, margin_bottom: 8
end end
end end
end end
def draw def draw
Gosu.draw_circle(window.width / 2, window.height / 2, @w3dhub_logo.width * (0.6 + Math.cos(Gosu.milliseconds / 1000.0 * Math::PI).abs * 0.05), 128, 0x44_000000, 32) Gosu.draw_circle(window.width / 2, window.height / 2, @w3dhub_logo.width * (0.6 + Math.cos(Gosu.milliseconds / 1000.0 * Math::PI).abs * 0.05), 128, 0xaa_353535, 32)
@w3dhub_logo.draw_rot(window.width / 2, window.height / 2, 32) @w3dhub_logo.draw_rot(window.width / 2, window.height / 2, 32)
super super

View File

@@ -6,22 +6,22 @@ class W3DHub
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0xee_444444 background 0xaa_525252
stack(width: 1.0, max_width: 720, height: 1.0, max_height: 480, v_align: :center, h_align: :center, background: 0xee_222222) do stack(width: 1.0, max_width: 720, height: 1.0, max_height: 480, v_align: :center, h_align: :center, background: 0xee_222222) do
flow(width: 1.0, height: 0.1, padding: 8) do flow(width: 1.0, height: 48, padding: 8) do
background 0x88_000000 background 0x88_000000
image "#{GAME_ROOT_PATH}/media/ui_icons/question.png", width: 0.04, align: :center, color: 0xaa_ff0000 image "#{GAME_ROOT_PATH}/media/ui_icons/question.png", height: 1.0, align: :center, color: 0xaa_ff0000
tagline "<b>#{@options[:title]}</b>", width: 0.9, text_align: :center title "<b>#{@options[:title]}</b>", width: 0.9, text_align: :center, font: BOLD_FONT
end end
stack(width: 1.0, height: 0.78, padding: 16) do stack(width: 1.0, fill: true, padding: 16) do
para @options[:message], width: 1.0, text_align: :center para @options[:message], width: 1.0, text_align: :center
end end
flow(width: 1.0, height: 0.1, padding: 8) do flow(width: 1.0, height: 46, padding: 8) do
button "Cancel", width: 0.25 do button "Cancel", width: 0.25 do
pop_state pop_state
@options[:cancel_callback]&.call @options[:cancel_callback]&.call

View File

@@ -7,16 +7,16 @@ class W3DHub
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0xee_444444 background 0xaa_525252
stack(width: 1.0, max_width: 720, height: 1.0, max_height: 540, v_align: :center, h_align: :center, background: 0xee_222222) do stack(width: 1.0, max_width: 720, height: 1.0, max_height: 540, v_align: :center, h_align: :center, background: 0xee_222222) do
# Title bar # Title bar
flow(width: 1.0, height: 32, padding: 8) do flow(width: 1.0, height: 36, padding: 8) do
background 0x88_000000 background 0x88_000000
image "#{GAME_ROOT_PATH}/media/ui_icons/export.png", width: 32, align: :center, color: 0xaa_ffffff image "#{GAME_ROOT_PATH}/media/ui_icons/export.png", height: 1.0, align: :center, color: 0xaa_ffffff
tagline "<b>#{I18n.t(:"server_browser.direct_connect")}</b>", fill: true, text_align: :center title "<b>#{I18n.t(:"server_browser.direct_connect")}</b>", fill: true, text_align: :center, font: BOLD_FONT
end end
stack(width: 1.0, fill: true, scroll: true) do stack(width: 1.0, fill: true, scroll: true) do
@@ -41,7 +41,7 @@ class W3DHub
end end
@server_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected profile" do @server_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected profile" do
push_state(ConfirmDialog, message: "Purge server profile") push_state(ConfirmDialog, title: "Are you sure?", message: "Remove Server Profile: \"#{@server_profiles_list.value}\"?", accept_callback: -> { delete_server_profile(server_profile_from_name(@server_profiles_list.value)) })
end end
@server_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/save.png"), image_height: 1.0, tip: "Edit and save selected profile" do @server_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/save.png"), image_height: 1.0, tip: "Edit and save selected profile" do
@@ -162,7 +162,7 @@ class W3DHub
end end
end end
flow(width: 1.0, height: 40, padding: 8) do flow(width: 1.0, height: 46, padding: 8) do
button "Cancel", width: 0.25 do button "Cancel", width: 0.25 do
pop_state pop_state
end end
@@ -257,7 +257,7 @@ class W3DHub
server_profile: @server_profiles_list.value, server_profile: @server_profiles_list.value,
server_hostname: @server_hostname.value, server_hostname: @server_hostname.value,
server_port: @server_port.value, server_port: @server_port.value,
game: @games_list.value, game_title: @games_list.value,
launch_arguments: @launch_arguments.value, launch_arguments: @launch_arguments.value,
irc_profile: @irc_profiles_list.value irc_profile: @irc_profiles_list.value
} }
@@ -275,6 +275,24 @@ class W3DHub
@changes_made = false @changes_made = false
end end
def delete_server_profile(profile)
index = W3DHub::Store[:asterisk_config].server_profiles.index(profile)
return unless index
W3DHub::Store[:asterisk_config].server_profiles.delete(profile)
W3DHub::Store[:asterisk_config].save_config
@server_profiles_list.items = W3DHub::Store[:asterisk_config].server_profiles.map { |pf| pf.name }
if W3DHub::Store[:asterisk_config].server_profiles.size.positive?
@server_profiles_list.choose = W3DHub::Store[:asterisk_config].server_profiles[index - 1 > 0 ? index - 1 : 0].name
end
end
def server_profile_from_name(name)
W3DHub::Store[:asterisk_config].server_profiles.find { |pf| name == pf.name }
end
def game_from_title(title) def game_from_title(title)
W3DHub::Store[:asterisk_config].games.find { |g| title == g.title } W3DHub::Store[:asterisk_config].games.find { |g| title == g.title }
end end
@@ -362,7 +380,8 @@ class W3DHub
end end
def delete_irc_profile(profile) def delete_irc_profile(profile)
index = W3DHub::Store[:asterisk_config].irc_profiles.index(profile) || 0 index = W3DHub::Store[:asterisk_config].irc_profiles.index(profile)
return unless index
W3DHub::Store[:asterisk_config].irc_profiles.delete(profile) W3DHub::Store[:asterisk_config].irc_profiles.delete(profile)

View File

@@ -13,13 +13,13 @@ class W3DHub
@game_settings = GameSettings.new(@app_id, @channel) @game_settings = GameSettings.new(@app_id, @channel)
background 0xee_444444 background 0xaa_525252
stack(width: 1.0, max_width: 720, height: 1.0, max_height: 680, v_align: :center, h_align: :center, background: 0xee_222222, border_thickness: 2, border_color: 0xff_444444, padding: 10) do stack(width: 1.0, max_width: 720, height: 1.0, max_height: 680, v_align: :center, h_align: :center, background: 0xee_222222, border_thickness: 2, border_color: 0xff_444444, padding: 10) do
flow(width: 1.0, height: 0.1, padding: 8) do flow(width: 1.0, height: 36, padding: 8) do
background Store.application_manager.color(@app_id) background Store.application_manager.color(@app_id)
title @options[:title] || Store.application_manager.name(@app_id) || "Game Settings", fill: true, text_align: :center title @options[:title] || Store.application_manager.name(@app_id) || "Game Settings", fill: true, text_align: :center, font: BOLD_FONT
end end
stack(width: 1.0, fill: true, padding: 16, margin_top: 10) do stack(width: 1.0, fill: true, padding: 16, margin_top: 10) do
@@ -28,49 +28,49 @@ class W3DHub
tagline "General" tagline "General"
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Default to First Person", fill: true para "Default to First Person", fill: true, text_wrap: :none
toggle_button tip: "Default to First Person", checked: @game_settings.get_value(:default_to_first_person), **BUTTON_STYLE do |btn| toggle_button tip: "Default to First Person", checked: @game_settings.get_value(:default_to_first_person), **BUTTON_STYLE do |btn|
@game_settings.set_value(:default_to_first_person, btn.value) @game_settings.set_value(:default_to_first_person, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Background Downloads", fill: true para "Background Downloads", fill: true, text_wrap: :none
toggle_button tip: "Background Downloads", checked: @game_settings.get_value(:background_downloads), **BUTTON_STYLE do |btn| toggle_button tip: "Background Downloads", checked: @game_settings.get_value(:background_downloads), **BUTTON_STYLE do |btn|
@game_settings.set_value(:background_downloads, btn.value) @game_settings.set_value(:background_downloads, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Enable Hints", fill: true para "Enable Hints", fill: true, text_wrap: :none
toggle_button tip: "Enable Hints", checked: @game_settings.get_value(:hints_enabled), **BUTTON_STYLE do |btn| toggle_button tip: "Enable Hints", checked: @game_settings.get_value(:hints_enabled), **BUTTON_STYLE do |btn|
@game_settings.set_value(:hints_enabled, btn.value) @game_settings.set_value(:hints_enabled, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Enable Chat Log", fill: true para "Enable Chat Log", fill: true, text_wrap: :none
toggle_button tip: "Enable Chat Log", checked: @game_settings.get_value(:chat_log), **BUTTON_STYLE do |btn| toggle_button tip: "Enable Chat Log", checked: @game_settings.get_value(:chat_log), **BUTTON_STYLE do |btn|
@game_settings.set_value(:chat_log, btn.value) @game_settings.set_value(:chat_log, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Show FPS", fill: true para "Show FPS", fill: true, text_wrap: :none
toggle_button tip: "Show FPS", checked: @game_settings.get_value(:show_fps), **BUTTON_STYLE do |btn| toggle_button tip: "Show FPS", checked: @game_settings.get_value(:show_fps), **BUTTON_STYLE do |btn|
@game_settings.set_value(:show_fps, btn.value) @game_settings.set_value(:show_fps, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Show Velocity", fill: true para "Show Velocity", fill: true, text_wrap: :none
toggle_button tip: "Show Velocity", checked: @game_settings.get_value(:show_velocity), **BUTTON_STYLE do |btn| toggle_button tip: "Show Velocity", checked: @game_settings.get_value(:show_velocity), **BUTTON_STYLE do |btn|
@game_settings.set_value(:show_velocity, btn.value) @game_settings.set_value(:show_velocity, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Show Damage Numbers", fill: true para "Show Damage Numbers", fill: true, text_wrap: :none
toggle_button tip: "Show Damage Numbers", checked: @game_settings.get_value(:show_damage_numbers), **BUTTON_STYLE do |btn| toggle_button tip: "Show Damage Numbers", checked: @game_settings.get_value(:show_damage_numbers), **BUTTON_STYLE do |btn|
@game_settings.set_value(:show_damage_numbers, btn.value) @game_settings.set_value(:show_damage_numbers, btn.value)
end end
@@ -87,7 +87,7 @@ class W3DHub
current_res = "#{@game_settings.get_value(:resolution_width)}x#{@game_settings.get_value(:resolution_height)}" current_res = "#{@game_settings.get_value(:resolution_width)}x#{@game_settings.get_value(:resolution_height)}"
para "Resolution", fill: true para "Resolution", fill: true, text_wrap: :none
list_box items: res_options, choose: current_res, width: 172, **BUTTON_STYLE do |value| list_box items: res_options, choose: current_res, width: 172, **BUTTON_STYLE do |value|
w, h = value.split("x", 2) w, h = value.split("x", 2)
@@ -97,21 +97,21 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Windowed Mode", fill: true para "Windowed Mode", fill: true, text_wrap: :none
list_box items: @game_settings.get(:windowed_mode).options.map { |v| v[0] }, choose: @game_settings.get_value(:windowed_mode), width: 172, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:windowed_mode).options.map { |v| v[0] }, choose: @game_settings.get_value(:windowed_mode), width: 172, **BUTTON_STYLE do |value|
@game_settings.set_value(:windowed_mode, value) @game_settings.set_value(:windowed_mode, value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Enable VSync", fill: true para "Enable VSync", fill: true, text_wrap: :none
toggle_button tip: "Enable VSync", checked: @game_settings.get_value(:vsync), **BUTTON_STYLE do |btn| toggle_button tip: "Enable VSync", checked: @game_settings.get_value(:vsync), **BUTTON_STYLE do |btn|
@game_settings.set_value(:vsync, btn.value) @game_settings.set_value(:vsync, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Anti-aliasing", fill: true para "Anti-aliasing", fill: true, text_wrap: :none
list_box items: @game_settings.get(:anti_aliasing).options.map { |v| v[0] }, choose: @game_settings.get_value(:anti_aliasing), width: 72, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:anti_aliasing).options.map { |v| v[0] }, choose: @game_settings.get_value(:anti_aliasing), width: 72, **BUTTON_STYLE do |value|
@game_settings.set_value(:anti_aliasing, value) @game_settings.set_value(:anti_aliasing, value)
end end
@@ -124,7 +124,7 @@ class W3DHub
tagline "Audio" tagline "Audio"
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Master Volume", fill: true para "Master Volume", fill: true, text_wrap: :none
slider(height: 1.0, width: 172, value: @game_settings.get_value(:master_volume), margin_right: 8).subscribe(:changed) do |slider| slider(height: 1.0, width: 172, value: @game_settings.get_value(:master_volume), margin_right: 8).subscribe(:changed) do |slider|
@game_settings.set_value(:master_volume, slider.value) @game_settings.set_value(:master_volume, slider.value)
end end
@@ -135,7 +135,7 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Sound Effects", fill: true para "Sound Effects", fill: true, text_wrap: :none
slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_effects_volume), margin_right: 8).subscribe(:changed) do |slider| slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_effects_volume), margin_right: 8).subscribe(:changed) do |slider|
@game_settings.set_value(:sound_effects_volume, slider.value) @game_settings.set_value(:sound_effects_volume, slider.value)
end end
@@ -146,7 +146,7 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Dialogue", fill: true para "Dialogue", fill: true, text_wrap: :none
slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_dialog_volume), margin_right: 8).subscribe(:changed) do |slider| slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_dialog_volume), margin_right: 8).subscribe(:changed) do |slider|
@game_settings.set_value(:sound_dialog_volume, slider.value) @game_settings.set_value(:sound_dialog_volume, slider.value)
end end
@@ -157,7 +157,7 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Music", fill: true para "Music", fill: true, text_wrap: :none
slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_music_volume), margin_right: 8).subscribe(:changed) do |slider| slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_music_volume), margin_right: 8).subscribe(:changed) do |slider|
@game_settings.set_value(:sound_music_volume, slider.value) @game_settings.set_value(:sound_music_volume, slider.value)
end end
@@ -168,7 +168,7 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Cinematic", fill: true para "Cinematic", fill: true, text_wrap: :none
slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_cinematic_volume), margin_right: 8).subscribe(:changed) do |slider| slider(height: 1.0, width: 172, value: @game_settings.get_value(:sound_cinematic_volume), margin_right: 8).subscribe(:changed) do |slider|
@game_settings.set_value(:sound_cinematic_volume, slider.value) @game_settings.set_value(:sound_cinematic_volume, slider.value)
end end
@@ -179,7 +179,7 @@ class W3DHub
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Play Sound with Game in Background", fill: true para "Play Sound with Game in Background", fill: true, text_wrap: :none
toggle_button tip: "Play Sound with Game in Background", checked: @game_settings.get_value(:sound_in_background), **BUTTON_STYLE do |btn| toggle_button tip: "Play Sound with Game in Background", checked: @game_settings.get_value(:sound_in_background), **BUTTON_STYLE do |btn|
@game_settings.set_value(:sound_in_background, btn.value) @game_settings.set_value(:sound_in_background, btn.value)
end end
@@ -190,14 +190,14 @@ class W3DHub
tagline "Performance" tagline "Performance"
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Texture Detail", fill: true para "Texture Detail", fill: true, text_wrap: :none
list_box items: @game_settings.get(:texture_detail).options.map { |v| v[0] }, choose: @game_settings.get_value(:texture_detail), width: 172, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:texture_detail).options.map { |v| v[0] }, choose: @game_settings.get_value(:texture_detail), width: 172, **BUTTON_STYLE do |value|
@game_settings.set_value(:texture_detail, value) @game_settings.set_value(:texture_detail, value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Texture Filtering", fill: true para "Texture Filtering", fill: true, text_wrap: :none
list_box items: @game_settings.get(:texture_filtering).options.map { |v| v[0] }, choose: @game_settings.get_value(:texture_filtering), width: 172, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:texture_filtering).options.map { |v| v[0] }, choose: @game_settings.get_value(:texture_filtering), width: 172, **BUTTON_STYLE do |value|
@game_settings.set_value(:texture_filtering, value) @game_settings.set_value(:texture_filtering, value)
end end
@@ -218,21 +218,21 @@ class W3DHub
# end # end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "Shadow Resolution", fill: true para "Shadow Resolution", fill: true, text_wrap: :none
list_box items: @game_settings.get(:shadow_resolution).options.map { |v| v[0] }, choose: @game_settings.get_value(:shadow_resolution), width: 172, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:shadow_resolution).options.map { |v| v[0] }, choose: @game_settings.get_value(:shadow_resolution), width: 172, **BUTTON_STYLE do |value|
@game_settings.set_value(:shadow_resolution, value) @game_settings.set_value(:shadow_resolution, value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "High Quality Shadows", fill: true para "High Quality Shadows", fill: true, text_wrap: :none
toggle_button tip: "High Quality Shadows", checked: @game_settings.get_value(:background_downloads), **BUTTON_STYLE do |btn| toggle_button tip: "High Quality Shadows", checked: @game_settings.get_value(:background_downloads), **BUTTON_STYLE do |btn|
@game_settings.set_value(:background_downloads, btn.value) @game_settings.set_value(:background_downloads, btn.value)
end end
end end
flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do flow(width: 1.0, height: 24, margin: 4, margin_left: 10) do
para "FPS Limit", fill: true para "FPS Limit", fill: true, text_wrap: :none
list_box items: @game_settings.get(:fps).options.map { |v| v[0] }, choose: @game_settings.get_value(:fps), width: 172, **BUTTON_STYLE do |value| list_box items: @game_settings.get(:fps).options.map { |v| v[0] }, choose: @game_settings.get_value(:fps), width: 172, **BUTTON_STYLE do |value|
@game_settings.set_value(:fps, value.to_i) @game_settings.set_value(:fps, value.to_i)
end end

View File

@@ -6,22 +6,22 @@ class W3DHub
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0xee_444444 background 0xaa_525252
stack(width: 1.0, max_width: 720, height: 1.0, max_height: 480, v_align: :center, h_align: :center, background: 0xee_222222) do stack(width: 1.0, max_width: 720, height: 1.0, max_height: 480, v_align: :center, h_align: :center, background: 0xee_222222) do
flow(width: 1.0, height: 32, padding: 8) do flow(width: 1.0, height: 36, padding: 8) do
background 0x88_000000 background 0x88_000000
image "#{GAME_ROOT_PATH}/media/ui_icons/warning.png", width: 32, align: :center, color: 0xff_ff8800 image "#{GAME_ROOT_PATH}/media/ui_icons/warning.png", height: 1.0, align: :center, color: 0xff_ff8800
tagline "<b>#{@options[:title]}</b>", width: 0.9, text_align: :center title "<b>#{@options[:title]}</b>", width: 0.9, text_align: :center, font: BOLD_FONT
end end
stack(width: 1.0, fill: true, padding: 16) do stack(width: 1.0, fill: true, padding: 16) do
para @options[:message], width: 1.0 para @options[:message], width: 1.0
end end
stack(width: 1.0, height: 40, padding: 8) do stack(width: 1.0, height: 46, padding: 8) do
button "Okay", width: 1.0 do button "Okay", width: 1.0 do
pop_state pop_state
end end

View File

@@ -6,15 +6,15 @@ class W3DHub
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0xee_444444 background 0xaa_525252
stack(width: 1.0, max_width: 720, height: 1.0, max_height: 256, v_align: :center, h_align: :center, background: 0xee_222222) do stack(width: 1.0, max_width: 720, height: 1.0, max_height: 256, v_align: :center, h_align: :center, background: 0xee_222222) do
flow(width: 1.0, height: 32, padding: 8) do flow(width: 1.0, height: 36, padding: 8) do
background 0x88_000000 background 0x88_000000
image "#{GAME_ROOT_PATH}/media/ui_icons/question.png", width: 32, align: :center, color: 0xff_ff8800 image "#{GAME_ROOT_PATH}/media/ui_icons/question.png", height: 1.0, align: :center, color: 0xff_ff8800
tagline "<b>#{@options[:title]}</b>", fill: true, text_align: :center title "<b>#{@options[:title]}</b>", fill: true, text_align: :center, font: BOLD_FONT
end end
stack(width: 1.0, fill: true, padding: 16) do stack(width: 1.0, fill: true, padding: 16) do
@@ -22,7 +22,7 @@ class W3DHub
@prompt_entry = edit_line @options[:prefill].to_s, margin_top: 24, width: 1.0, autofocus: true, focus: true, type: @options[:input_type] == :password ? :password : :text @prompt_entry = edit_line @options[:prefill].to_s, margin_top: 24, width: 1.0, autofocus: true, focus: true, type: @options[:input_type] == :password ? :password : :text
end end
flow(width: 1.0, height: 40, padding: 8) do flow(width: 1.0, height: 46, padding: 8) do
button "Cancel", width: 0.25 do button "Cancel", width: 0.25 do
pop_state pop_state
@options[:cancel_callback]&.call(@prompt_entry.value) @options[:cancel_callback]&.call(@prompt_entry.value)

View File

@@ -38,36 +38,40 @@ class W3DHub
end end
@navigation_container = stack(fill: true, height: 1.0) do @navigation_container = stack(fill: true, height: 1.0) do
flow(width: 1.0, fill: true) do @nav_padding_top_container = flow(fill: true)
flow(width: 1.0, height: 36) do
# background 0xff_666666 # background 0xff_666666
link I18n.t(:"interface.games").upcase, text_size: 34 do link I18n.t(:"interface.games").upcase, text_size: 34, font: BOLD_FONT do
page(W3DHub::Pages::Games) page(W3DHub::Pages::Games)
end end
link I18n.t(:"interface.servers").upcase, text_size: 34, margin_left: 12 do link I18n.t(:"interface.servers").upcase, text_size: 34, font: BOLD_FONT, margin_left: 12 do
page(W3DHub::Pages::ServerBrowser) page(W3DHub::Pages::ServerBrowser)
end end
link I18n.t(:"interface.community").upcase, text_size: 34, margin_left: 12 do link I18n.t(:"interface.community").upcase, text_size: 34, font: BOLD_FONT, margin_left: 12 do
page(W3DHub::Pages::Community) page(W3DHub::Pages::Community)
end end
link I18n.t(:"interface.downloads").upcase, text_size: 34, margin_left: 12 do link I18n.t(:"interface.downloads").upcase, text_size: 34, font: BOLD_FONT, margin_left: 12 do
page(W3DHub::Pages::DownloadManager) page(W3DHub::Pages::DownloadManager)
end end
link I18n.t(:"interface.settings").upcase, text_size: 34, margin_left: 12 do link I18n.t(:"interface.settings").upcase, text_size: 34, font: BOLD_FONT, margin_left: 12 do
page(W3DHub::Pages::Settings) page(W3DHub::Pages::Settings)
end end
end end
@nav_padding_bottom_container = flow(fill: true)
# Installer task display # Installer task display
flow(width: 1.0, height: 0.5) do @application_taskbar_container = flow(width: 1.0, height: 0.5) do
@application_taskbar_container = stack(width: 1.0, height: 1.0, margin_left: 16, margin_right: 16) do stack(width: 1.0, height: 1.0, margin_left: 16, margin_right: 16) do
flow(width: 1.0, height: 0.65) do flow(width: 1.0, height: 0.65) do
@application_taskbar_label = inscription "", width: 0.60, text_wrap: :none @application_taskbar_label = para "", width: 0.60, text_wrap: :none
@application_taskbar_status_label = inscription "", width: 0.40, text_align: :right, text_wrap: :none @application_taskbar_status_label = para "", width: 0.40, text_align: :right, text_wrap: :none
end end
@application_taskbar_progressbar = progress fraction: 0.0, height: 2, width: 1.0 @application_taskbar_progressbar = progress fraction: 0.0, height: 2, width: 1.0
@@ -89,8 +93,8 @@ class W3DHub
tagline "<b>#{I18n.t(:"interface.not_logged_in")}</b>", text_wrap: :none tagline "<b>#{I18n.t(:"interface.not_logged_in")}</b>", text_wrap: :none
flow(width: 1.0) do flow(width: 1.0) do
link(I18n.t(:"interface.log_in"), text_size: 16, width: 0.5) { page(W3DHub::Pages::Login) } link(I18n.t(:"interface.log_in"), text_size: 22, width: 0.5) { page(W3DHub::Pages::Login) }
link I18n.t(:"interface.register"), text_size: 16, width: 0.49 do link I18n.t(:"interface.register"), text_size: 22, width: 0.49 do
W3DHub.url("https://secure.w3dhub.com/forum/index.php?app=core&module=global&section=register") W3DHub.url("https://secure.w3dhub.com/forum/index.php?app=core&module=global&section=register")
end end
end end
@@ -172,11 +176,15 @@ class W3DHub
end end
def show_application_taskbar def show_application_taskbar
@nav_padding_top_container.hide
@nav_padding_bottom_container.hide
@application_taskbar_container.show @application_taskbar_container.show
end end
def hide_application_taskbar def hide_application_taskbar
@application_taskbar_container.hide @application_taskbar_container.hide
@nav_padding_top_container.show
@nav_padding_bottom_container.show
end end
def update_interface_task_status(task) def update_interface_task_status(task)

View File

@@ -5,14 +5,13 @@ class W3DHub
window.show_cursor = true window.show_cursor = true
theme(W3DHub::THEME) theme(W3DHub::THEME)
background 0x88_252525
flow(width: 1.0, height: 1.0) do flow(width: 1.0, height: 1.0, background_image: "#{GAME_ROOT_PATH}/media/banners/background.png", background_image_color: 0xff_525252, background_image_mode: :fill) do
flow(fill: true) flow(fill: true)
@card_container = stack(width: 1.0, max_width: MAX_PAGE_WIDTH, height: 1.0, max_height: 720, margin: 128, padding: 16) do @card_container = stack(width: 1.0, max_width: MAX_PAGE_WIDTH, height: 1.0, max_height: 720, margin: 128, padding: 16) do
background 0xff_252525 background 0xaa_353535
end end
flow(fill: true) flow(fill: true)
@@ -30,7 +29,7 @@ class W3DHub
caption "The #{I18n.t(:app_name_simple)} 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.", width: 1.0, margin_left: 32 caption "The #{I18n.t(:app_name_simple)} 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.", width: 1.0, margin_left: 32
end end
flow(width: 1.0, height: 40) do flow(width: 1.0, height: 46) do
stack(fill: true, height: 1.0) do stack(fill: true, height: 1.0) do
link "Skip", border_color_bottom: 0xff_777777 do link "Skip", border_color_bottom: 0xff_777777 do
pop_state pop_state
@@ -55,7 +54,7 @@ class W3DHub
caption "Browse our selection of games from the left panel of the Games tab.\n• Interim Apex - Renegade but with hundreds of vehicles and characters.\n• Red Alert: A Path Beyond - DESCRIPTION\n• Tiberian Sun: Reborn - DESCRIPTION\n\nAnd more... Check out the left panel on the Games tab.", width: 1.0, margin_left: 32 caption "Browse our selection of games from the left panel of the Games tab.\n• Interim Apex - Renegade but with hundreds of vehicles and characters.\n• Red Alert: A Path Beyond - DESCRIPTION\n• Tiberian Sun: Reborn - DESCRIPTION\n\nAnd more... Check out the left panel on the Games tab.", width: 1.0, margin_left: 32
end end
flow(width: 1.0, height: 40) do flow(width: 1.0, height: 46) do
flow(fill: true, height: 1.0) do flow(fill: true, height: 1.0) do
button "< Back" do button "< Back" do
@card_container.clear { card_welcome } @card_container.clear { card_welcome }
@@ -88,7 +87,7 @@ class W3DHub
caption "Subscribe to our YouTube channel", margin_left: 32 caption "Subscribe to our YouTube channel", margin_left: 32
end end
flow(width: 1.0, height: 40) do flow(width: 1.0, height: 46) do
flow(fill: true, height: 1.0) do flow(fill: true, height: 1.0) do
button "< Back" do button "< Back" do
@card_container.clear { card_getting_started } @card_container.clear { card_getting_started }

View File

@@ -20,20 +20,47 @@ class W3DHub
THEME = { THEME = {
ToolTip: { ToolTip: {
background: 0xff_dedede, background: 0xff_222222,
color: 0xaa_000000, color: 0xff_f2f2f2,
text_size: 18, text_size: 22,
text_static: true,
text_border: false, text_border: false,
text_shadow: false text_shadow: false
}, },
TextBlock: { TextBlock: {
font: BOLD_FONT, font: REGULAR_FONT,
text_static: true,
text_color: 0xff_f2f2f2, text_color: 0xff_f2f2f2,
text_border: false, text_border: false,
text_shadow: true, text_shadow: true,
text_shadow_size: 1, text_shadow_size: 1,
text_shadow_color: 0x88_000000 text_shadow_color: 0x88_000000
}, },
Banner: { # < TextBlock
text_size: 48,
font: BOLD_FONT
},
Title: { # < TextBlock
text_size: 34,
font: BOLD_FONT
},
Subtitle: { # < TextBlock
text_size: 28,
font: BOLD_FONT
},
Tagline: { # < TextBlock
text_size: 26,
font: BOLD_FONT
},
Caption: { # < TextBlock
text_size: 24
},
Para: { # < TextBlock
text_size: 22
},
Inscription: { # < TextBlock
text_size: 18
},
EditLine: { EditLine: {
border_thickness: 2, border_thickness: 2,
border_color: Gosu::Color::WHITE, border_color: Gosu::Color::WHITE,
@@ -42,14 +69,15 @@ class W3DHub
Link: { Link: {
color: 0xff_cdcdcd, color: 0xff_cdcdcd,
hover: { hover: {
color: Gosu::Color::WHITE color: 0xff_f2f2f2
}, },
active: { active: {
color: 0xff_eeeeee color: 0xff_eeeeee
} }
}, },
Button: { Button: {
text_size: 18, font: BOLD_FONT,
text_size: 22,
padding_top: 8, padding_top: 8,
padding_left: 16, padding_left: 16,
padding_right: 16, padding_right: 16,
@@ -76,6 +104,7 @@ class W3DHub
checkmark_image: "#{GAME_ROOT_PATH}/media/ui_icons/checkmark.png" checkmark_image: "#{GAME_ROOT_PATH}/media/ui_icons/checkmark.png"
}, },
Progress: { Progress: {
background: 0xff_353535,
fraction_background: 0xff_0074e0, fraction_background: 0xff_0074e0,
border_thickness: 0 border_thickness: 0
}, },
@@ -87,7 +116,7 @@ class W3DHub
border_color: 0xff_0074e0 border_color: 0xff_0074e0
}, },
Handle: { Handle: {
text_size: 18, text_size: 22,
padding_top: 8, padding_top: 8,
padding_left: 2, padding_left: 2,
padding_right: 2, padding_right: 2,

View File

@@ -1,4 +1,4 @@
class W3DHub class W3DHub
DIR_NAME = "W3DHubAlt" DIR_NAME = "W3DHubAlt"
VERSION = "0.2.0" VERSION = "0.3.1"
end end