DungeonCrawler/character_panel.gd
Andre 9ab6deddff Inventar, Equipment, Klassensystem und Waffenschaden hinzugefügt
- 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>
2026-03-15 20:10:05 +01:00

104 lines
4.6 KiB
GDScript

# CharacterPanel.gd
# Zeigt Charakterinfos: Klasse, Level, Stats und Equipment
extends CanvasLayer
var panel_visible = false
@onready var panel = $Panel
@onready var class_label = $Panel/HBoxContainer/StatsColumn/ClassLabel
@onready var level_label = $Panel/HBoxContainer/StatsColumn/LevelLabel
@onready var stats_container = $Panel/HBoxContainer/StatsColumn/StatsContainer
@onready var str_label = $Panel/HBoxContainer/StatsColumn/StatsContainer/StrLabel
@onready var agi_label = $Panel/HBoxContainer/StatsColumn/StatsContainer/AgiLabel
@onready var int_label = $Panel/HBoxContainer/StatsColumn/StatsContainer/IntLabel
@onready var sta_label = $Panel/HBoxContainer/StatsColumn/StatsContainer/StaLabel
@onready var armor_label = $Panel/HBoxContainer/StatsColumn/StatsContainer/ArmorLabel
@onready var hp_label = $Panel/HBoxContainer/StatsColumn/HPLabel
@onready var damage_label = $Panel/HBoxContainer/EquipmentColumn/DamageLabel
@onready var dps_label = $Panel/HBoxContainer/EquipmentColumn/DPSLabel
# Equipment Slots
@onready var head_slot = $Panel/HBoxContainer/EquipmentColumn/EquipmentContainer/HeadSlot
@onready var chest_slot = $Panel/HBoxContainer/EquipmentColumn/EquipmentContainer/ChestSlot
@onready var hands_slot = $Panel/HBoxContainer/EquipmentColumn/EquipmentContainer/HandsSlot
@onready var legs_slot = $Panel/HBoxContainer/EquipmentColumn/EquipmentContainer/LegsSlot
@onready var feet_slot = $Panel/HBoxContainer/EquipmentColumn/EquipmentContainer/FeetSlot
@onready var weapon_slot = $Panel/HBoxContainer/EquipmentColumn/WeaponSlot
@onready var offhand_slot = $Panel/HBoxContainer/EquipmentColumn/OffhandSlot
func _ready():
panel.visible = false
func toggle():
panel_visible = !panel_visible
panel.visible = panel_visible
func update_stats(player):
if player.character_class:
var main_stat_name = ""
match player.character_class.main_stat:
CharacterClass.MainStat.STRENGTH:
main_stat_name = "STR"
CharacterClass.MainStat.AGILITY:
main_stat_name = "AGI"
CharacterClass.MainStat.INTELLIGENCE:
main_stat_name = "INT"
class_label.text = player.character_class.class_name_de + " (Haupt: " + main_stat_name + ")"
else:
class_label.text = "Keine Klasse"
level_label.text = "Level " + str(player.level) + " (" + str(player.current_xp) + "/" + str(player.xp_to_next_level) + " XP)"
str_label.text = "Stärke: " + str(player.strength)
agi_label.text = "Beweglichkeit: " + str(player.agility)
int_label.text = "Intelligenz: " + str(player.intelligence)
sta_label.text = "Ausdauer: " + str(player.stamina)
armor_label.text = "Rüstung: " + str(player.armor)
hp_label.text = "HP: " + str(player.current_hp) + " / " + str(player.max_hp)
# Waffen-Stats (jetzt in Equipment-Spalte)
var weapon = player.get_equipped_weapon()
if weapon:
damage_label.text = "Schaden: " + str(weapon.min_damage) + "-" + str(weapon.max_damage) + " (%.1fs)" % weapon.attack_speed
else:
# Unbewaffnet: klassenabhängiger Schaden
if player.character_class:
var min_dmg = player.character_class.unarmed_min_damage
var max_dmg = player.character_class.unarmed_max_damage
var atk_spd = player.character_class.unarmed_attack_speed
damage_label.text = "Unbewaffnet: " + str(min_dmg) + "-" + str(max_dmg) + " (%.1fs)" % atk_spd
else:
damage_label.text = "Unbewaffnet: 1-2 (2.0s)"
dps_label.text = "DPS: %.1f" % player.get_dps()
# Main-Stat hervorheben
str_label.modulate = Color(1, 1, 1)
agi_label.modulate = Color(1, 1, 1)
int_label.modulate = Color(1, 1, 1)
if player.character_class:
match player.character_class.main_stat:
CharacterClass.MainStat.STRENGTH:
str_label.modulate = Color(1, 0.8, 0.2)
CharacterClass.MainStat.AGILITY:
agi_label.modulate = Color(1, 0.8, 0.2)
CharacterClass.MainStat.INTELLIGENCE:
int_label.modulate = Color(1, 0.8, 0.2)
# Equipment aktualisieren
_update_equipment_slot(head_slot, "Kopf", player.equipment[Equipment.Slot.HEAD])
_update_equipment_slot(chest_slot, "Brust", player.equipment[Equipment.Slot.CHEST])
_update_equipment_slot(hands_slot, "Hände", player.equipment[Equipment.Slot.HANDS])
_update_equipment_slot(legs_slot, "Beine", player.equipment[Equipment.Slot.LEGS])
_update_equipment_slot(feet_slot, "Füße", player.equipment[Equipment.Slot.FEET])
_update_equipment_slot(weapon_slot, "Waffe", player.equipment[Equipment.Slot.WEAPON])
_update_equipment_slot(offhand_slot, "Nebenhand", player.equipment[Equipment.Slot.OFFHAND])
func _update_equipment_slot(label: Label, slot_name: String, item: Equipment):
if item == null:
label.text = slot_name + ": -"
label.modulate = Color(0.6, 0.6, 0.6)
else:
label.text = slot_name + ": " + item.item_name
label.modulate = Equipment.get_rarity_color(item.rarity)