- CharacterClass mit Klassen (Krieger, Schurke, Magier) und unbewaffnetem Schaden - Equipment-System mit 7 Slots, Seltenheiten und Stats - Inventar-System mit 20 Slots und Gold - LootTable/LootEntry für Gegner-Drops - Character Panel (C) mit Stats und Equipment-Anzeige - Inventory Panel (I) mit Item-Grid und Tooltips - Klassenauswahl-Menü bei Spielstart - Waffenschaden in Equipment-Spalte, unbewaffnet klassenabhängig Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
128 lines
3.8 KiB
GDScript
128 lines
3.8 KiB
GDScript
# InventoryPanel.gd
|
|
# UI für das Spieler-Inventar
|
|
extends CanvasLayer
|
|
|
|
signal item_selected(item: Equipment, index: int)
|
|
|
|
var panel_visible = false
|
|
var player = null
|
|
|
|
@onready var panel = $Panel
|
|
@onready var gold_label = $Panel/VBoxContainer/Header/GoldLabel
|
|
@onready var item_grid = $Panel/VBoxContainer/ScrollContainer/ItemGrid
|
|
|
|
const SLOT_SIZE = 50
|
|
|
|
func _ready():
|
|
panel.visible = false
|
|
|
|
func setup(p):
|
|
player = p
|
|
if player and player.inventory:
|
|
player.inventory.inventory_changed.connect(_on_inventory_changed)
|
|
player.inventory.gold_changed.connect(_on_gold_changed)
|
|
_refresh_inventory()
|
|
|
|
func toggle():
|
|
panel_visible = !panel_visible
|
|
panel.visible = panel_visible
|
|
if panel_visible:
|
|
_refresh_inventory()
|
|
|
|
func _on_inventory_changed():
|
|
_refresh_inventory()
|
|
|
|
func _on_gold_changed(new_amount: int):
|
|
gold_label.text = str(new_amount) + " Gold"
|
|
|
|
func _refresh_inventory():
|
|
if player == null or player.inventory == null:
|
|
return
|
|
|
|
# Gold aktualisieren
|
|
gold_label.text = str(player.inventory.gold) + " Gold"
|
|
|
|
# Alte Slots entfernen
|
|
for child in item_grid.get_children():
|
|
child.queue_free()
|
|
|
|
# Slots erstellen (immer MAX_SLOTS anzeigen)
|
|
for i in range(Inventory.MAX_SLOTS):
|
|
var slot = _create_slot(i)
|
|
item_grid.add_child(slot)
|
|
|
|
func _create_slot(index: int) -> Panel:
|
|
var slot = Panel.new()
|
|
slot.custom_minimum_size = Vector2(SLOT_SIZE, SLOT_SIZE)
|
|
|
|
# Slot-Hintergrund stylen
|
|
var style = StyleBoxFlat.new()
|
|
style.bg_color = Color(0.15, 0.15, 0.15)
|
|
style.border_color = Color(0.3, 0.3, 0.3)
|
|
style.set_border_width_all(1)
|
|
slot.add_theme_stylebox_override("panel", style)
|
|
|
|
# Item vorhanden?
|
|
if player.inventory and index < player.inventory.item_count():
|
|
var item = player.inventory.get_item(index)
|
|
if item:
|
|
# Item-Name Label
|
|
var label = Label.new()
|
|
label.text = item.item_name.substr(0, 3) # Erste 3 Buchstaben
|
|
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
|
label.add_theme_font_size_override("font_size", 10)
|
|
label.modulate = Equipment.get_rarity_color(item.rarity)
|
|
label.anchors_preset = Control.PRESET_FULL_RECT
|
|
slot.add_child(label)
|
|
|
|
# Rahmen in Seltenheitsfarbe
|
|
style.border_color = Equipment.get_rarity_color(item.rarity)
|
|
style.set_border_width_all(2)
|
|
|
|
# Klick-Handler
|
|
slot.gui_input.connect(_on_slot_clicked.bind(index, item))
|
|
|
|
# Tooltip
|
|
slot.tooltip_text = _get_item_tooltip(item)
|
|
|
|
return slot
|
|
|
|
func _on_slot_clicked(event: InputEvent, index: int, item: Equipment):
|
|
if event is InputEventMouseButton and event.pressed:
|
|
if event.button_index == MOUSE_BUTTON_LEFT:
|
|
# Linksklick: Item auswählen/anlegen
|
|
item_selected.emit(item, index)
|
|
elif event.button_index == MOUSE_BUTTON_RIGHT:
|
|
# Rechtsklick: Item direkt anlegen
|
|
if player:
|
|
var old_item = player.equip_item(item)
|
|
player.inventory.remove_item(item)
|
|
if old_item:
|
|
player.inventory.add_item(old_item)
|
|
_refresh_inventory()
|
|
|
|
func _get_item_tooltip(item: Equipment) -> String:
|
|
var tooltip = item.item_name + "\n"
|
|
tooltip += Equipment.get_slot_name(item.slot) + "\n"
|
|
tooltip += "---\n"
|
|
|
|
if item.slot == Equipment.Slot.WEAPON:
|
|
tooltip += "Schaden: " + str(item.min_damage) + "-" + str(item.max_damage) + "\n"
|
|
tooltip += "Tempo: " + str(item.attack_speed) + "s\n"
|
|
|
|
if item.armor > 0:
|
|
tooltip += "Rüstung: +" + str(item.armor) + "\n"
|
|
if item.strength > 0:
|
|
tooltip += "Stärke: +" + str(item.strength) + "\n"
|
|
if item.agility > 0:
|
|
tooltip += "Beweglichkeit: +" + str(item.agility) + "\n"
|
|
if item.intelligence > 0:
|
|
tooltip += "Intelligenz: +" + str(item.intelligence) + "\n"
|
|
if item.stamina > 0:
|
|
tooltip += "Ausdauer: +" + str(item.stamina) + "\n"
|
|
if item.haste > 0:
|
|
tooltip += "Tempo: +" + str(int(item.haste * 100)) + "%\n"
|
|
|
|
tooltip += "\n[Rechtsklick zum Anlegen]"
|
|
return tooltip
|