- 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>
104 lines
4.6 KiB
GDScript
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)
|