156 lines
5.4 KiB
GDScript
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
|