From aac2758ec0f1a16c09610f37f82ca09b467cd3a1 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Thu, 26 Feb 2026 22:59:26 -0600 Subject: [PATCH] Created SteamAppPanel Create SteamAppPanel to display information about Steam Games by Steam ID. --- UI/Controls/steam_app_panel.gd | 236 +++++++++++++++++++++++ UI/Controls/steam_app_panel.gd.uid | 1 + UI/Controls/steam_app_panel.tscn | 296 +++++++++++++++++++++++++++++ 3 files changed, 533 insertions(+) create mode 100644 UI/Controls/steam_app_panel.gd create mode 100644 UI/Controls/steam_app_panel.gd.uid create mode 100644 UI/Controls/steam_app_panel.tscn diff --git a/UI/Controls/steam_app_panel.gd b/UI/Controls/steam_app_panel.gd new file mode 100644 index 00000000..6e6f0395 --- /dev/null +++ b/UI/Controls/steam_app_panel.gd @@ -0,0 +1,236 @@ +@tool +extends PanelContainer +class_name SteamAppPanel + +#region Test Apps +#region Constants +enum SteamGames{ + BLOOD_AND_MEAD, + RIDICULOUS_SHIPPING, + MEMORI, + BLOCK_SHOP, + FIELD_OF_HEROES, + ZOOIKA, + KOOK, + ALPINE_LAKE, + REPLICAT, + CARBRIX, + KERKER, + XXX_CRAZYMIKE_XXX, + MAGNET_JACK, + ROGUE_BLIGHT, + RISE_OF_PIRACY, + MEGABAT, + WARLOCKS_GANTLET, + ARTIFICIAL, + OCEAN_MIRROR, + SPACE_SCAVANGER2, + SCOPECREEP, + THE_UNWANTED_WAR, + HYPERONS, + EPIC_HERO_GAME, + CYBER_LOUNGE_TYCOON, + OLD_BONES, + GRIME_AND_GOLD, + LONG_GONE, + BOMB_AROUND, + NO_SIGNAL, + HEMOMANCER, + SOPHIAS_PATH, + WAKE_CUP, + PROVIDENCE, + TORSO_TENNIS, + STICK_AND_STACK, + FALINERE_FANTASY, + MR_FARMBOY, + ECHO_SHREDD, +} +const STEAM_APP_IDS: Dictionary[SteamGames, int] = { + SteamGames.BLOOD_AND_MEAD: 1081830, + SteamGames.RIDICULOUS_SHIPPING: 2649940, + SteamGames.MEMORI: 1712700, + SteamGames.BLOCK_SHOP: 2731590, + SteamGames.FIELD_OF_HEROES: 1267290, + SteamGames.ZOOIKA: 2994730, + SteamGames.KOOK: 2329690, + SteamGames.ALPINE_LAKE: 2341620, + SteamGames.REPLICAT: 3509430, + SteamGames.CARBRIX: 3712430, + SteamGames.KERKER: 2645100, + SteamGames.XXX_CRAZYMIKE_XXX: 2468680, + SteamGames.MAGNET_JACK: 1491800, + SteamGames.ROGUE_BLIGHT: 1890310, + SteamGames.RISE_OF_PIRACY: 1400660, + SteamGames.MEGABAT: 2429230, + SteamGames.WARLOCKS_GANTLET: 2391180, + SteamGames.ARTIFICIAL: 904510, + SteamGames.OCEAN_MIRROR: 2725640, + SteamGames.SPACE_SCAVANGER2: 1962010, + SteamGames.SCOPECREEP: 3595710, + SteamGames.THE_UNWANTED_WAR: 2487370, + SteamGames.HYPERONS: 2479500, + SteamGames.EPIC_HERO_GAME: 2081720, + SteamGames.CYBER_LOUNGE_TYCOON: 1852150, + SteamGames.OLD_BONES: 3358260, + SteamGames.GRIME_AND_GOLD: 3165090, + SteamGames.LONG_GONE: 1977610, + SteamGames.BOMB_AROUND: 3539690, + SteamGames.NO_SIGNAL: 2840590, + SteamGames.HEMOMANCER: 3690780, + SteamGames.SOPHIAS_PATH: 3197650, + SteamGames.WAKE_CUP: 2881430, + SteamGames.PROVIDENCE: 3643600, + SteamGames.TORSO_TENNIS: 2824780, + SteamGames.STICK_AND_STACK: 3655080, + SteamGames.FALINERE_FANTASY: 1976930, + SteamGames.MR_FARMBOY: 2795090, + SteamGames.ECHO_SHREDD: 3232000, +} +#endregion + +@warning_ignore("unused_private_class_variable") +@export_tool_button("Search", "Button") var _search = _tool_search +@export var tool_app_id: int +@export var selected_steam_game: SteamGames: + set(val): + selected_steam_game = val + if is_node_ready(): get_app_info(STEAM_APP_IDS[selected_steam_game]) +@export var test_data: SteamAppData +var _save_data: SteamAppData +var _save_bg_texture: ImageTexture +var _save_capsule_texture: ImageTexture +#endregion + +static var _log: TwitchLogger = TwitchLogger.new(&"SteamAppPanel") + +var data: SteamAppData: + set(val): + data = val + if is_node_ready(): + %VisitPage.disabled = data == null + +func _ready() -> void: + %VisitPage.pressed.connect(_on_btn_visit_page_pressed) + %ClosePanel.pressed.connect(_on_btn_close_png_pressed) + if Engine.is_editor_hint(): + if selected_steam_game != 0: + get_app_info(STEAM_APP_IDS[selected_steam_game]) + return + clear() + +func _tool_search() -> void: + if !Engine.is_editor_hint(): + return + if tool_app_id: + get_app_info(tool_app_id) + +func get_app_info(app_id: int) -> SteamAppData: + var _data: SteamAppData = await %SteamService.get_steam_app_data(app_id) + if not _data: + return + + display_app_info(_data) + if Engine.is_editor_hint(): + test_data = _data + return _data + +func display_app_info(_data: SteamAppData) -> void: + data = _data + %AppSearch.text = str(data.steam_app_id) + %GameName.text = data.name + %AuthorName.text = "[font_size=20][i]by [b]%s[/b][/i][/font_size]" % data.developers.front() + %CapsuleImage.texture = await load_texture_from_url(data.header_image) + if !data.screenshots_thumbs.is_empty(): + %Background.texture = await load_texture_from_url(data.screenshots_thumbs.front()) + %ReleaseDate.text = data.release_date.date + %lb_price_desc.visible = !data.is_free + %h_price.visible = data.price_final_formatted != "" or data.is_free + if %h_price.visible: + if data.is_free: + %GamePrice.text = "Free to Play!" + else: + %GamePrice.text = data.price_final_formatted + if data.price_discount_percent != 0: + %GamePrice.text += "(%d%% discount!)" % data.price_discount_percent + + %Description.text = data.short_description + +func clear() -> void: + data = null + %AppSearch.text = "" + %GameName.text = "" + %AuthorName.text = "" + %CapsuleImage.texture = null + %Background.texture = null + %ReleaseDate.text = "" + %GamePrice.text = "" + %h_price.hide() + %Description.text = "" + pass + +func load_texture_from_url(url: String) -> ImageTexture: + var http := HTTPRequest.new() + add_child(http) + var url_no_query: String = url.split("?")[0] + var file_type = url_no_query.get_extension() + if not file_type in ["png", "jpeg", "jpg", "bmp", "webp", "svg"]: + file_type = "webp" + + var _err = http.request(url) + if _err != OK: + print("_err != OK") + return + + var result: Array = await http.request_completed + var _result: int = result[0] + var response_code: int = result[1] + var _headers: PackedStringArray = result[2] + var buffer: PackedByteArray = result[3] + if response_code != HTTPClient.RESPONSE_OK: + print("response_code != HTTPClient.RESPONSE_OK") + return + + var tex_image := Image.new() + match file_type: + "png": tex_image.load_png_from_buffer(buffer) + "jpeg", "jpg": tex_image.load_jpg_from_buffer(buffer) + "bmp": tex_image.load_bmp_from_buffer(buffer) + "webp": tex_image.load_webp_from_buffer(buffer) + "svg": tex_image.load_svg_from_buffer(buffer) + _: + _log.e("%s format not recognized." % file_type) + return null + + var tex = ImageTexture.create_from_image(tex_image) + http.queue_free() + return tex + +func _on_btn_close_png_pressed() -> void: + hide() + +func _on_btn_visit_page_pressed() -> void: + if data: + OS.shell_open(data.short_url) + +func _enter_tree() -> void: + if not Engine.is_editor_hint(): + return + + +func _notification(what: int) -> void: + if not Engine.is_editor_hint(): return + match what: + NOTIFICATION_EDITOR_PRE_SAVE: + _save_data = data + #_save_capsule_texture = %CapsuleImage.texture + #_save_bg_texture = %Background.texture + #test_data = null + clear() + NOTIFICATION_EDITOR_POST_SAVE: + test_data = _save_data + display_app_info.call_deferred(_save_data) + #%CapsuleImage.texture = _save_capsule_texture + #%Background.texture = _save_bg_texture + #_save_capsule_texture = null + #_save_bg_texture = null + diff --git a/UI/Controls/steam_app_panel.gd.uid b/UI/Controls/steam_app_panel.gd.uid new file mode 100644 index 00000000..a69dda7a --- /dev/null +++ b/UI/Controls/steam_app_panel.gd.uid @@ -0,0 +1 @@ +uid://q1gm8286nbuf diff --git a/UI/Controls/steam_app_panel.tscn b/UI/Controls/steam_app_panel.tscn new file mode 100644 index 00000000..7498bf65 --- /dev/null +++ b/UI/Controls/steam_app_panel.tscn @@ -0,0 +1,296 @@ +[gd_scene format=3 uid="uid://685pgmw1cdw3"] + +[ext_resource type="Script" uid="uid://chgufd1youdel" path="res://lib/games_info/steam_service.gd" id="1_uovli"] +[ext_resource type="Script" uid="uid://q1gm8286nbuf" path="res://UI/Controls/steam_app_panel.gd" id="1_vlxh5"] +[ext_resource type="Texture2D" uid="uid://bjrfknk2rkyuy" path="res://UI/assets/font_awesome/steam.svg" id="2_pws53"] +[ext_resource type="Script" uid="uid://bllsv2cy6komw" path="res://lib/models/steam_app_data.gd" id="2_wmir7"] +[ext_resource type="Texture2D" uid="uid://4juherhkw8hp" path="res://addons/script_splitter/assets/Close.svg" id="3_yygdx"] +[ext_resource type="FontFile" uid="uid://cx1a4aqqxhsrn" path="res://UI/assets/neon-wave-theme/polentical_neon/Polentical Neon Italic.ttf" id="4_43mqw"] +[ext_resource type="FontFile" uid="uid://b6u8lwedqawa7" path="res://UI/assets/neon-wave-theme/polentical_neon/Polentical Neon Bold italic.ttf" id="5_vlxh5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yygdx"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +bg_color = Color(0.1, 0.1, 0.1, 0.6) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 + +[sub_resource type="Resource" id="Resource_wmir7"] +script = ExtResource("2_wmir7") +steam_app_id = 3712430 +type = "game" +name = "Carbrix" +short_description = "Carbrix is a sci-fi inspired multiplayer vehicle-building sandbox game where creativity meets action. Design and construct anything you can imagine—from sleek cars and powerful trucks to futuristic planes, bikes, and rockets." +detailed_description = "

Carbrix is a sci-fi inspired multiplayer vehicle-building sandbox game where creativity meets action. Design and construct anything you can imagine, from sleek cars and powerful trucks to futuristic planes, bikes, and rockets.

Play solo or team up with friends in multiplayer to share your creations, race, battle, or simply explore endless possibilities. With intuitive building tools and a physics-driven world, Carbrix offers a playground of imagination, competition, and fun.

With Carbrix, you can build cars, trucks, planes, bikes—and so much more!

Thanks to the intuitive building system, you can build, test, and drive with ease.

Looking for something to sink your teeth into?

With the built-in destruction system, worry no more

Create combat-oriented vehicles and battle your friends!

With multiplayer, the fun never ends!
Team up with your friends to build together—or challenge them in head-to-head battles.

Take part in thrilling races, compete in creative build contests,
or just mess around and see who can come up with the wildest inventions.

With so many ways to play, there’s always something new to try!

" +header_image = "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/a18c9a286445c8553a4eac10ba42df6b96ce63ed/header.jpg?t=1771564874" +capsule_image = "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/0e3354ecdcc92437b51dcc8a7ce5aec3c956d6b8/capsule_231x87.jpg?t=1771564874" +capsule_imagev5 = "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/0e3354ecdcc92437b51dcc8a7ce5aec3c956d6b8/capsule_184x69.jpg?t=1771564874" +developers = Array[String](["Redston4D"]) +publishers = Array[String](["Redston4D"]) +platforms = { +"linux": true, +"mac": false, +"windows": true +} +genres = Array[Dictionary]([{ +"description": "Action", +"id": "1" +}, { +"description": "Adventure", +"id": "25" +}, { +"description": "Casual", +"id": "4" +}, { +"description": "Indie", +"id": "23" +}, { +"description": "Racing", +"id": "9" +}, { +"description": "Simulation", +"id": "28" +}]) +release_date = { +"coming_soon": true, +"date": "Coming soon" +} +screenshots_full = Array[String](["https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/4a0c3b9405921fd84ee530e87c4bb49e5bac47d5/ss_4a0c3b9405921fd84ee530e87c4bb49e5bac47d5.1920x1080.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/c3bfb9c95fafd7e2e42bf22b2e1a6324202ff3b3/ss_c3bfb9c95fafd7e2e42bf22b2e1a6324202ff3b3.1920x1080.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/41a0157dabd641a59f561befa2d36687405f906c/ss_41a0157dabd641a59f561befa2d36687405f906c.1920x1080.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/d6440c8c03850fa478c8c845561c6729bf69b981/ss_d6440c8c03850fa478c8c845561c6729bf69b981.1920x1080.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/8c8af6ab67b663d1860e5ebdfe3943eebe85e222/ss_8c8af6ab67b663d1860e5ebdfe3943eebe85e222.1920x1080.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/7ebb66440d8eef2e94a818d95f0805f89ca881d3/ss_7ebb66440d8eef2e94a818d95f0805f89ca881d3.1920x1080.jpg?t=1771564874"]) +screenshots_thumbs = Array[String](["https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/4a0c3b9405921fd84ee530e87c4bb49e5bac47d5/ss_4a0c3b9405921fd84ee530e87c4bb49e5bac47d5.600x338.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/c3bfb9c95fafd7e2e42bf22b2e1a6324202ff3b3/ss_c3bfb9c95fafd7e2e42bf22b2e1a6324202ff3b3.600x338.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/41a0157dabd641a59f561befa2d36687405f906c/ss_41a0157dabd641a59f561befa2d36687405f906c.600x338.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/d6440c8c03850fa478c8c845561c6729bf69b981/ss_d6440c8c03850fa478c8c845561c6729bf69b981.600x338.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/8c8af6ab67b663d1860e5ebdfe3943eebe85e222/ss_8c8af6ab67b663d1860e5ebdfe3943eebe85e222.600x338.jpg?t=1771564874", "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/3712430/7ebb66440d8eef2e94a818d95f0805f89ca881d3/ss_7ebb66440d8eef2e94a818d95f0805f89ca881d3.600x338.jpg?t=1771564874"]) +categories = Array[Dictionary]([{ +"description": "Single-player", +"id": 2.0 +}, { +"description": "Multi-player", +"id": 1.0 +}, { +"description": "PvP", +"id": 49.0 +}, { +"description": "Online PvP", +"id": 36.0 +}, { +"description": "Co-op", +"id": 9.0 +}, { +"description": "Online Co-op", +"id": 38.0 +}, { +"description": "Steam Achievements", +"id": 22.0 +}, { +"description": "Steam Workshop", +"id": 30.0 +}, { +"description": "Custom Volume Controls", +"id": 68.0 +}, { +"description": "Adjustable Difficulty", +"id": 78.0 +}, { +"description": "Playable without Timed Input", +"id": 74.0 +}, { +"description": "Save Anytime", +"id": 79.0 +}, { +"description": "Stereo Sound", +"id": 69.0 +}, { +"description": "Surround Sound", +"id": 70.0 +}, { +"description": "Partial Controller Support", +"id": 18.0 +}, { +"description": "Family Sharing", +"id": 62.0 +}]) +pc_requirements = "Minimum:
" +mac_requirements = "{ \"minimum\": \"Minimum:
\", \"recommended\": \"Recommended:
\" }" +linux_requirements = "{ \"minimum\": \"Minimum:
\", \"recommended\": \"Recommended:
\" }" +support_email = "CarbrixGame@gmail.com" +background_image = "https://store.akamai.steamstatic.com/images/storepagebackground/app/3712430?t=1771564874" +background_image_raw = "https://store.akamai.steamstatic.com/images/storepagebackground/app/3712430?t=1771564874" + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pws53"] +content_margin_left = 8.0 +content_margin_top = 8.0 +content_margin_right = 8.0 +content_margin_bottom = 8.0 +bg_color = Color(0.1, 0.1, 0.1, 0.6) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.6215238, 0.6215239, 0.62152356, 1) +border_blend = true +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="LabelSettings" id="LabelSettings_43mqw"] +font_size = 24 + +[sub_resource type="LabelSettings" id="LabelSettings_wmir7"] +font = ExtResource("4_43mqw") +font_size = 20 + +[sub_resource type="LabelSettings" id="LabelSettings_312dj"] +font = ExtResource("5_vlxh5") +font_size = 20 + +[node name="SteamAppPanel" type="PanelContainer" unique_id=597550935] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1304.0 +offset_bottom = -220.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_yygdx") +script = ExtResource("1_vlxh5") +selected_steam_game = 9 +test_data = SubResource("Resource_wmir7") + +[node name="SteamService" type="Node" parent="." unique_id=1253608490] +unique_name_in_owner = true +script = ExtResource("1_uovli") +metadata/_custom_type_script = "uid://chgufd1youdel" + +[node name="Background" type="TextureRect" parent="." unique_id=2131684228] +unique_name_in_owner = true +layout_mode = 2 + +[node name="v" type="VBoxContainer" parent="." unique_id=711622106] +layout_mode = 2 + +[node name="m" type="MarginContainer" parent="v" unique_id=326930510] +layout_mode = 2 + +[node name="h" type="HBoxContainer" parent="v/m" unique_id=503322652] +layout_mode = 2 +alignment = 1 + +[node name="Icon" type="TextureRect" parent="v/m/h" unique_id=637511916] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture = ExtResource("2_pws53") +expand_mode = 1 +stretch_mode = 5 + +[node name="Title" type="Label" parent="v/m/h" unique_id=1565364238] +layout_mode = 2 +text = "Steam App Info" + +[node name="ClosePanel" type="Button" parent="v/m" unique_id=1693377160] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 8 +size_flags_vertical = 4 +icon = ExtResource("3_yygdx") +icon_alignment = 1 + +[node name="hsep" type="HSeparator" parent="v" unique_id=110475068] +layout_mode = 2 + +[node name="h" type="HBoxContainer" parent="v" unique_id=1010103611] +layout_mode = 2 + +[node name="Label" type="Label" parent="v/h" unique_id=908847968] +layout_mode = 2 +text = "App ID" + +[node name="AppSearch" type="LineEdit" parent="v/h" unique_id=817183379] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="info" type="PanelContainer" parent="v" unique_id=944205836] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_pws53") + +[node name="sc" type="ScrollContainer" parent="v/info" unique_id=783796096] +layout_mode = 2 + +[node name="v" type="VBoxContainer" parent="v/info/sc" unique_id=315401709] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="GameName" type="Label" parent="v/info/sc/v" unique_id=1985979119] +unique_name_in_owner = true +layout_mode = 2 +label_settings = SubResource("LabelSettings_43mqw") +horizontal_alignment = 1 +text_overrun_behavior = 3 + +[node name="AuthorName" type="RichTextLabel" parent="v/info/sc/v" unique_id=2070779365] +unique_name_in_owner = true +layout_mode = 2 +bbcode_enabled = true +fit_content = true +scroll_active = false +autowrap_mode = 0 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CapsuleImage" type="TextureRect" parent="v/info/sc/v" unique_id=1453640911] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="hr" type="HBoxContainer" parent="v/info/sc/v" unique_id=1399335643] +layout_mode = 2 +alignment = 2 + +[node name="lb" type="Label" parent="v/info/sc/v/hr" unique_id=578554525] +layout_mode = 2 +text = "Release Date:" +label_settings = SubResource("LabelSettings_wmir7") + +[node name="ReleaseDate" type="Label" parent="v/info/sc/v/hr" unique_id=156600009] +unique_name_in_owner = true +layout_mode = 2 +label_settings = SubResource("LabelSettings_312dj") + +[node name="h_price" type="HBoxContainer" parent="v/info/sc/v" unique_id=1445934632] +unique_name_in_owner = true +visible = false +layout_mode = 2 +alignment = 2 + +[node name="lb_price_desc" type="Label" parent="v/info/sc/v/h_price" unique_id=1941918091] +unique_name_in_owner = true +layout_mode = 2 +text = "Price:" +label_settings = SubResource("LabelSettings_wmir7") + +[node name="GamePrice" type="Label" parent="v/info/sc/v/h_price" unique_id=2076721537] +unique_name_in_owner = true +layout_mode = 2 +label_settings = SubResource("LabelSettings_312dj") + +[node name="hsep" type="HSeparator" parent="v/info/sc/v" unique_id=292231258] +layout_mode = 2 + +[node name="Description" type="RichTextLabel" parent="v/info/sc/v" unique_id=771650243] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +bbcode_enabled = true + +[node name="VisitPage" type="Button" parent="v" unique_id=263478236] +unique_name_in_owner = true +layout_mode = 2 +disabled = true +text = "Visit Steam Page"