- 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>
128 lines
3.2 KiB
GDScript
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()
|