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