You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.7 KiB
98 lines
2.7 KiB
extends Control |
|
class_name WeaponSlot |
|
## Weapon slot that displays weapon icon and shows tooltip on hover |
|
|
|
# References |
|
@onready var icon_rect: TextureRect = $SlotPanel/MarginContainer/IconRect |
|
var tooltip: PanelContainer = null |
|
|
|
# Weapon data |
|
var weapon_data: WeaponData = null |
|
var slot_name: String = "Main Hand" |
|
|
|
func _ready(): |
|
# Create tooltip as a top-level CanvasLayer child so it's not clipped |
|
_create_tooltip() |
|
|
|
# Connect mouse events |
|
mouse_entered.connect(_on_mouse_entered) |
|
mouse_exited.connect(_on_mouse_exited) |
|
|
|
## Create tooltip as a top-level node to avoid clipping |
|
func _create_tooltip(): |
|
# Load tooltip scene template |
|
var tooltip_scene = load("res://level/ui/scenes/weapon_tooltip.tscn") |
|
if tooltip_scene: |
|
tooltip = tooltip_scene.instantiate() |
|
# Add to the root CanvasLayer (HUD) so it's not clipped |
|
var hud = get_node_or_null("/root/HUD") |
|
if hud: |
|
hud.add_child(tooltip) |
|
tooltip.hide() |
|
else: |
|
push_error("[WeaponSlot] Could not find HUD node") |
|
else: |
|
push_error("[WeaponSlot] Failed to load weapon_tooltip.tscn") |
|
|
|
## Set weapon data and update display |
|
func set_weapon(data: WeaponData, name: String = "Main Hand"): |
|
weapon_data = data |
|
slot_name = name |
|
_update_display() |
|
|
|
## Clear the weapon slot |
|
func clear_weapon(): |
|
weapon_data = null |
|
_update_display() |
|
|
|
## Update the icon display |
|
func _update_display(): |
|
if not icon_rect: |
|
return |
|
|
|
if weapon_data and weapon_data.icon: |
|
icon_rect.texture = weapon_data.icon |
|
icon_rect.modulate = Color.WHITE |
|
else: |
|
icon_rect.texture = null |
|
icon_rect.modulate = Color(0.3, 0.3, 0.3, 0.5) # Dim empty slot |
|
|
|
## Show tooltip on mouse enter |
|
func _on_mouse_entered(): |
|
if weapon_data and tooltip: |
|
_update_tooltip() |
|
# Position tooltip to the right of the slot |
|
var global_pos = global_position |
|
tooltip.position = Vector2(global_pos.x + size.x + 10, global_pos.y) |
|
tooltip.show() |
|
|
|
## Hide tooltip on mouse exit |
|
func _on_mouse_exited(): |
|
if tooltip: |
|
tooltip.hide() |
|
|
|
## Update tooltip content |
|
func _update_tooltip(): |
|
if not tooltip or not weapon_data: |
|
return |
|
|
|
var tooltip_label = tooltip.get_node_or_null("MarginContainer/VBoxContainer/StatsLabel") |
|
if not tooltip_label: |
|
return |
|
|
|
var text = "" |
|
text += slot_name.to_upper() + "\n" |
|
text += weapon_data.weapon_name + "\n" |
|
text += "---\n" |
|
text += "Damage: " + str(weapon_data.damage) + "\n" |
|
text += "Range: " + str(weapon_data.attack_range) + "\n" |
|
text += "Cooldown: " + str(weapon_data.attack_cooldown) + "s\n" |
|
text += "Knockback: " + str(weapon_data.knockback_force) + "\n" |
|
|
|
if weapon_data.can_block: |
|
text += "Block: " + str(int(weapon_data.block_reduction * 100)) + "%\n" |
|
|
|
if weapon_data.description: |
|
text += "\n" + weapon_data.description |
|
|
|
tooltip_label.text = text
|
|
|