Updated Backgroudn Expand mode to cover. Renamed ClosePanel button to Clear Remoevd ClosePanel handler, and added Clear pressed signal connecting to clear function.
233 lines
6.1 KiB
GDScript
233 lines
6.1 KiB
GDScript
@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)
|
|
%Clear.pressed.connect(clear)
|
|
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_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
|
|
|