gae_wild_jam/scripts/perk_card.gd

156 lines
5.4 KiB
GDScript

extends Control
@export var icon: Texture2D
var on_select: Callable
var play_sound: Callable
var _recipe_panel: Control = null
var _panel_tween: Tween = null
const _PANEL_REST_Y = 18
const _FRUIT_ATLAS = preload("res://assets/16x16 Pixelart Food Icons/Pixel_Foods(ARTLİNE).png")
const _FONT_BOLD = preload("res://assets/fonts/slkscrb.ttf")
func setup(perk: Perk, select: Callable, sound: Callable):
$Button.button_down.connect(_on_button_down)
$Button.modulate.a = 0
$Card/Name.text = perk.name
var content = perk.description
if perk.stats != "":
content += "\n\n" + perk.stats
$Card/Description.text = "[center]" + content + "[/center]"
if perk.icon != null:
$Card/Name/TextureRect.texture = perk.icon
_build_recipe_panel(perk)
animate_in()
$Button.mouse_entered.connect(_on_hover_enter)
$Button.mouse_exited.connect(_on_hover_exit)
on_select = select
play_sound = sound
func _build_recipe_panel(perk: Perk) -> void:
var is_brewed = perk.spell != SpellLibrary.NONE
var panel_w := 240
var panel_h := 74 if is_brewed else 38
_recipe_panel = Control.new()
_recipe_panel.position = Vector2(0, _PANEL_REST_Y)
_recipe_panel.size = Vector2(panel_w, panel_h)
_recipe_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE
var border := ColorRect.new()
border.mouse_filter = Control.MOUSE_FILTER_IGNORE
border.color = Color(0.55, 0.4, 0.1, 1.0)
border.size = Vector2(panel_w, panel_h)
_recipe_panel.add_child(border)
var bg := ColorRect.new()
bg.mouse_filter = Control.MOUSE_FILTER_IGNORE
bg.color = Color(0.08, 0.04, 0.14, 0.96)
bg.position = Vector2(2, 2)
bg.size = Vector2(panel_w - 4, panel_h - 4)
_recipe_panel.add_child(bg)
var header := Label.new()
header.mouse_filter = Control.MOUSE_FILTER_IGNORE
header.add_theme_font_override("font", _FONT_BOLD)
header.add_theme_font_size_override("font_size", 13)
header.add_theme_color_override("font_color", Color(0.85, 0.72, 0.45, 1.0))
header.add_theme_constant_override("outline_size", 2)
header.add_theme_color_override("font_outline_color", Color(0, 0, 0, 1))
header.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
header.size = Vector2(panel_w, 22)
if is_brewed:
header.text = "BREW RECIPE"
header.position = Vector2(0, 6)
_recipe_panel.add_child(header)
var hbox := HBoxContainer.new()
hbox.mouse_filter = Control.MOUSE_FILTER_IGNORE
hbox.add_theme_constant_override("separation", 4)
hbox.alignment = BoxContainer.ALIGNMENT_CENTER
hbox.size = Vector2(panel_w, 36)
hbox.position = Vector2(0, 32)
var recipe := SpellLibrary.get_recipe(perk.spell)
for i in recipe.size():
if i > 0:
var plus := Label.new()
plus.mouse_filter = Control.MOUSE_FILTER_IGNORE
plus.text = "+"
plus.add_theme_font_override("font", _FONT_BOLD)
plus.add_theme_font_size_override("font_size", 14)
plus.add_theme_color_override("font_color", Color(1, 1, 1, 0.6))
plus.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
hbox.add_child(plus)
var fruit := TextureRect.new()
fruit.mouse_filter = Control.MOUSE_FILTER_IGNORE
var atlas := AtlasTexture.new()
atlas.atlas = _FRUIT_ATLAS
atlas.region = Rect2(1, 2, 16, 15) if recipe[i] == SpellLibrary.APPLE else Rect2(55, 19, 15, 16)
fruit.texture = atlas
fruit.custom_minimum_size = Vector2(32, 32)
fruit.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
fruit.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
hbox.add_child(fruit)
_recipe_panel.add_child(hbox)
else:
header.text = "AUTO / PASSIVE"
header.position = Vector2(0, panel_h / 2 - 11)
_recipe_panel.add_child(header)
add_child(_recipe_panel)
move_child(_recipe_panel, 0)
func _on_hover_enter():
if _panel_tween:
_panel_tween.kill()
_panel_tween = create_tween().set_parallel()
_panel_tween.tween_property(self, "scale", Vector2(0.93, 0.93), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
_panel_tween.tween_property(_recipe_panel, "position:y", -float(_recipe_panel.size.y), 0.22).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CUBIC)
func _on_hover_exit():
if _panel_tween:
_panel_tween.kill()
_panel_tween = create_tween().set_parallel()
_panel_tween.tween_property(self, "scale", Vector2(1.0, 1.0), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
_panel_tween.tween_property(_recipe_panel, "position:y", float(_PANEL_REST_Y), 0.15).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_QUAD)
func _on_button_down() -> void:
if _recipe_panel:
_recipe_panel.visible = false
play_sound.call()
await animate_out()
on_select.call()
func animate_in():
await get_tree().process_frame
pivot_offset = size / 2
var icon_node = $Card/Name/TextureRect
icon_node.pivot_offset = icon_node.size / 2
var pulse = create_tween().set_loops()
pulse.tween_property(icon_node, "scale", Vector2(1.12, 1.12), 0.9).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE)
pulse.tween_property(icon_node, "scale", Vector2(1.0, 1.0), 0.9).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE)
var start_y = global_position.y + 500
var end_y = global_position.y
global_position.y = start_y
var tween = create_tween()
tween.tween_property(self, "global_position:y", end_y, 0.3).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUAD)
func animate_out():
var start_y = global_position.y
var end_y = global_position.y - 500
global_position.y = start_y
var tween = create_tween()
tween.tween_property(self, "global_position:y", end_y, 0.3).set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_QUAD)
await tween.finished