DungeonCrawler/inventory.gd
Andre 8f0ac2227e Magier-Kampfsystem, Castbar, Inventar-Drag und Gegner-Aggro
- Zauberstab als eigener Fernkampf-Skill (20m, magisch, exklusiv mit Autoattack)
- Frostblitz mit 1.5s Castzeit und Castbar (mittig über Aktionsleiste)
- Cast wird durch Bewegung, Springen oder Schaden unterbrochen
- Holzstab als Magier-Startwaffe (+3 INT)
- Frostblitz-Icon (SVG)
- Skills klassenabhängig: Magier=Zauberstab+Frostblitz, Krieger/Schurke=Heavy Strike
- Inventar: Drag & Drop zum Umordnen mit gelbem Highlight
- Gegner aggrot sofort bei Schadenstreffer (nicht nur in Aggro-Range)
- Inventar: swap_items/move_items Funktionen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 21:41:14 +01:00

128 lines
3.2 KiB
GDScript

# Inventory.gd
# Verwaltet das Spieler-Inventar mit Items (Equipment + Consumables) und Gold
extends Resource
class_name Inventory
signal inventory_changed
signal gold_changed(new_amount: int)
const MAX_SLOTS = 20 # Maximale Inventarplätze
var items: Array = [] # Equipment oder Consumable
var gold: int = 0
func _init():
items = []
gold = 0
# Item hinzufügen - gibt true zurück wenn erfolgreich
# Consumables werden gestackt wenn möglich
func add_item(item) -> bool:
# Consumable stacking
if item is Consumable:
for existing in items:
if existing is Consumable and existing.item_name == item.item_name:
var space = existing.max_stack - existing.stack_size
if space > 0:
var transfer = mini(item.stack_size, space)
existing.stack_size += transfer
item.stack_size -= transfer
if item.stack_size <= 0:
inventory_changed.emit()
print("Item gestackt: ", existing.item_name, " x", existing.stack_size)
return true
if items.size() >= MAX_SLOTS:
print("Inventar voll!")
return false
items.append(item)
inventory_changed.emit()
if item is Consumable:
print("Item erhalten: ", item.item_name, " x", item.stack_size)
else:
print("Item erhalten: ", item.item_name)
return true
# Item an Index entfernen
func remove_item_at(index: int):
if index < 0 or index >= items.size():
return null
var item = items[index]
items.remove_at(index)
inventory_changed.emit()
return item
# Item direkt entfernen
func remove_item(item) -> bool:
var index = items.find(item)
if index == -1:
return false
items.remove_at(index)
inventory_changed.emit()
return true
# Gold hinzufügen
func add_gold(amount: int):
gold += amount
gold_changed.emit(gold)
print("+", amount, " Gold (Gesamt: ", gold, ")")
# Gold ausgeben - gibt true zurück wenn genug vorhanden
func spend_gold(amount: int) -> bool:
if gold < amount:
print("Nicht genug Gold!")
return false
gold -= amount
gold_changed.emit(gold)
return true
# Prüfen ob Inventar voll ist
func is_full() -> bool:
return items.size() >= MAX_SLOTS
# Anzahl freier Slots
func free_slots() -> int:
return MAX_SLOTS - items.size()
# Item an Index holen
func get_item(index: int):
if index < 0 or index >= items.size():
return null
return items[index]
# Zwei Items im Inventar tauschen
func swap_items(index_a: int, index_b: int):
if index_a < 0 or index_b < 0:
return
if index_a >= items.size() or index_b >= items.size():
return
var temp = items[index_a]
items[index_a] = items[index_b]
items[index_b] = temp
inventory_changed.emit()
# Item an bestimmten Index verschieben (von aktuellem Platz)
func move_item(from_index: int, to_index: int):
if from_index < 0 or from_index >= items.size():
return
if to_index < 0 or to_index >= MAX_SLOTS:
return
if from_index == to_index:
return
if to_index < items.size():
# Ziel belegt -> tauschen
swap_items(from_index, to_index)
else:
# Ziel leer -> Item verschieben
var item = items[from_index]
items.remove_at(from_index)
# Index anpassen falls nötig
if to_index >= items.size():
items.append(item)
else:
items.insert(to_index, item)
inventory_changed.emit()
# Anzahl Items
func item_count() -> int:
return items.size()