diff --git a/player.gd b/player.gd index 2690d0b..384d191 100644 --- a/player.gd +++ b/player.gd @@ -308,62 +308,70 @@ func _init_class_skills(): "icon": "res://assets/Icons/Heavy_Strike.png", "cooldown": HEAVY_STRIKE_COOLDOWN, "cast_time": 0.0, + "locked": false, + "level_required": 1, + }) + var has_offhand = _has_shield() + available_skills.append({ + "id": "durchbeissen", + "name": "Schildwall" if has_offhand else "Trotz", + "description": "Schildwall: Blockiert großen Teil des eingehenden Schadens." if has_offhand else "Trotz: Schadensreduktion skaliert mit fehlendem Leben.", + "icon": "res://assets/Icons/Durchbeißen.png", + "cooldown": DURCHBEISSEN_COOLDOWN, + "cast_time": 0.0, + "locked": level < 10, + "level_required": 10, + }) + available_skills.append({ + "id": "tektonischer_schlag", + "name": "Tektonischer Schlag", + "description": "Erschüttert den Boden um dich herum. Schlägt alle Gegner in der Nähe und verlangsamt sie.", + "icon": "res://assets/Icons/Tektonischer_Schlag.png", + "cooldown": TEKTONISCHER_SCHLAG_COOLDOWN, + "cast_time": 0.0, + "locked": level < 5, + "level_required": 5, + }) + available_skills.append({ + "id": "blutrausch", + "name": "Blutrausch", + "description": "Reißt eine tiefe Wunde. Sofortschaden + Blutung über 8 Sekunden.", + "icon": "res://assets/Icons/Blutrausch.png", + "cooldown": BLUTRAUSCH_COOLDOWN, + "cast_time": 0.0, + "locked": level < 15, + "level_required": 15, + }) + available_skills.append({ + "id": "wirbelwind", + "name": "Wirbelwind", + "description": "Drehangriff mit voller Wucht. Trifft alle Gegner in der Nähe für hohen Schaden.", + "icon": "res://assets/Icons/Wirbelwind.png", + "cooldown": WIRBELWIND_COOLDOWN, + "cast_time": 0.0, + "locked": level < 20, + "level_required": 20, + }) + available_skills.append({ + "id": "zornfesseln", + "name": "Zornfesseln", + "description": "Reißt einen Gegner heran und schlägt ihn mit voller Wucht.", + "icon": "res://assets/Icons/Zornfesseln.png", + "cooldown": ZORNFESSELN_COOLDOWN, + "cast_time": 0.0, + "locked": level < 28, + "level_required": 28, + }) + available_skills.append({ + "id": "berserker", + "name": "Berserker", + "description": "Entfesselt die gesamte Wut. 10s: schneller, stärker, unaufhaltsamer. Danach 2.5s Erschöpfung.", + "icon": "res://assets/Icons/Berserker.png", + "cooldown": BERSERKER_COOLDOWN, + "cast_time": 0.0, + "locked": level < 35, + "level_required": 35, }) - if level >= 5: - available_skills.append({ - "id": "tektonischer_schlag", - "name": "Tektonischer Schlag", - "description": "Erschüttert den Boden um dich herum. Schlägt alle Gegner in der Nähe und verlangsamt sie.", - "icon": "res://assets/Icons/Tektonischer_Schlag.png", - "cooldown": TEKTONISCHER_SCHLAG_COOLDOWN, - "cast_time": 0.0, - }) - if level >= 35: - available_skills.append({ - "id": "berserker", - "name": "Berserker", - "description": "Entfesselt die gesamte Wut. 10s: schneller, stärker, unaufhaltsamer. Danach 2.5s Erschöpfung.", - "icon": "res://assets/Icons/Berserker.png", - "cooldown": BERSERKER_COOLDOWN, - "cast_time": 0.0, - }) - if level >= 28: - available_skills.append({ - "id": "zornfesseln", - "name": "Zornfesseln", - "description": "Reißt einen Gegner heran und schlägt ihn mit voller Wucht.", - "icon": "res://assets/Icons/Zornfesseln.png", - "cooldown": ZORNFESSELN_COOLDOWN, - "cast_time": 0.0, - }) - if level >= 20: - available_skills.append({ - "id": "wirbelwind", - "name": "Wirbelwind", - "description": "Drehangriff mit voller Wucht. Trifft alle Gegner in der Nähe für hohen Schaden.", - "icon": "res://assets/Icons/Wirbelwind.png", - "cooldown": WIRBELWIND_COOLDOWN, - "cast_time": 0.0, - }) - if level >= 15: - available_skills.append({ - "id": "blutrausch", - "name": "Blutrausch", - "description": "Reißt eine tiefe Wunde. Sofortschaden + Blutung über 8 Sekunden.", - "icon": "res://assets/Icons/Blutrausch.png", - "cooldown": BLUTRAUSCH_COOLDOWN, - "cast_time": 0.0, - }) - if level >= 10: - var has_offhand = _has_shield() - available_skills.append({ - "id": "durchbeissen", - "name": "Schildwall" if has_offhand else "Trotz", - "description": "Schildwall: Blockiert großen Teil des eingehenden Schadens." if has_offhand else "Trotz: Schadensreduktion skaliert mit fehlendem Leben.", - "icon": "res://assets/Icons/Durchbeißen.png", - "cooldown": DURCHBEISSEN_COOLDOWN, - "cast_time": 0.0, - }) CharacterClass.MainStat.INTELLIGENCE: # Magier available_skills.append({ @@ -696,7 +704,7 @@ func execute_skill(skill_id: String): if is_dead or is_casting or is_drinking or is_berserker_crash: return var skill = _find_skill(skill_id) - if skill.is_empty(): + if skill.is_empty() or skill.get("locked", false): return # GCD Check diff --git a/skill_panel.gd b/skill_panel.gd index ae1fc66..9f1cae1 100644 --- a/skill_panel.gd +++ b/skill_panel.gd @@ -33,10 +33,12 @@ func _refresh_skills(): child.queue_free() for skill in player.available_skills: + var is_locked: bool = skill.get("locked", false) + # Hintergrund-Panel für Lesbarkeit var panel = PanelContainer.new() var style = StyleBoxFlat.new() - style.bg_color = Color(0.9, 0.85, 0.75, 0.18) + style.bg_color = Color(0.9, 0.85, 0.75, 0.18) if not is_locked else Color(0.3, 0.3, 0.3, 0.15) style.set_corner_radius_all(4) panel.add_theme_stylebox_override("panel", style) panel.mouse_filter = Control.MOUSE_FILTER_STOP @@ -56,24 +58,42 @@ func _refresh_skills(): icon_rect.custom_minimum_size = Vector2(36, 36) icon_rect.size = Vector2(36, 36) icon_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + if is_locked: + icon_rect.modulate = Color(1, 1, 1, 0.35) hbox.add_child(icon_rect) - # Name + # Name + Level-Anforderung + var vbox = VBoxContainer.new() + vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL + vbox.mouse_filter = Control.MOUSE_FILTER_IGNORE + hbox.add_child(vbox) + var label = Label.new() label.text = skill["name"] label.add_theme_font_size_override("font_size", 14) - label.size_flags_horizontal = Control.SIZE_EXPAND_FILL - label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER label.mouse_filter = Control.MOUSE_FILTER_IGNORE - hbox.add_child(label) + if is_locked: + label.modulate = Color(0.55, 0.55, 0.55, 1.0) + vbox.add_child(label) + + if is_locked: + var req_label = Label.new() + req_label.text = "Benötigt Level %d" % skill.get("level_required", 0) + req_label.add_theme_font_size_override("font_size", 10) + req_label.modulate = Color(0.6, 0.45, 0.3, 1.0) + req_label.mouse_filter = Control.MOUSE_FILTER_IGNORE + vbox.add_child(req_label) # Tooltip panel.tooltip_text = skill["name"] + "\n" + skill["description"] + if is_locked: + panel.tooltip_text += "\n\n[Gesperrt bis Level %d]" % skill.get("level_required", 0) - # Drag starten bei Linksklick - var skill_id = skill["id"] - var skill_icon_path = skill["icon"] - panel.gui_input.connect(_on_skill_input.bind(skill_id, skill_icon_path)) + # Drag nur bei freigeschalteten Skills + if not is_locked: + var skill_id = skill["id"] + var skill_icon_path = skill["icon"] + panel.gui_input.connect(_on_skill_input.bind(skill_id, skill_icon_path)) skill_list.add_child(panel)