MultiplayerFighter
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.

99 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