diff --git a/player.gd b/player.gd index fcf3df8..9d623ae 100644 --- a/player.gd +++ b/player.gd @@ -92,6 +92,11 @@ const RAGE_DECAY_DELAY: float = 5.0 # Sekunden nach letztem Kampfkontakt const RAGE_DECAY_RATE: float = 10.0 # Wut pro Sekunde Verfall var _rage_decay_timer: float = 0.0 +# Durchbeißen / Schildwall / Trotz +var is_defending: bool = false +var _defend_timer: float = 0.0 +var _defend_mode: String = "" # "schildwall" oder "trotz" + # ═══════════════════════════════════════════════════════════════ # EQUIPMENT # ═══════════════════════════════════════════════════════════════ @@ -132,6 +137,10 @@ const HEAVY_STRIKE_RANGE: float = 2.0 const TEKTONISCHER_SCHLAG_COOLDOWN: float = 8.0 const TEKTONISCHER_SCHLAG_RADIUS: float = 4.0 const TEKTONISCHER_SCHLAG_RAGE: int = 30 +const DURCHBEISSEN_COOLDOWN: float = 12.0 +const DURCHBEISSEN_DURATION: float = 4.0 +const SCHILDWALL_BLOCK: float = 0.85 # 85% Schadensreduktion +const TROTZ_MAX_REDUCTION: float = 0.60 # max 60% Reduktion bei 0 HP # Cast System var is_casting: bool = false @@ -273,6 +282,16 @@ func _init_class_skills(): "cooldown": TEKTONISCHER_SCHLAG_COOLDOWN, "cast_time": 0.0, }) + if level >= 10: + var has_offhand = equipment[Equipment.Slot.OFFHAND] != null + 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://icons/durchbeissen_icon.svg", + "cooldown": DURCHBEISSEN_COOLDOWN, + "cast_time": 0.0, + }) CharacterClass.MainStat.INTELLIGENCE: # Magier available_skills.append({ @@ -428,6 +447,14 @@ func get_dps() -> float: func take_damage(amount: int): var effective = max(1, amount - int(armor * 0.1)) + if is_defending: + if _defend_mode == "schildwall": + effective = int(effective * (1.0 - SCHILDWALL_BLOCK)) + elif _defend_mode == "trotz": + var missing_hp = 1.0 - (float(current_hp) / float(max_hp)) + var reduction = missing_hp * TROTZ_MAX_REDUCTION + effective = int(effective * (1.0 - reduction)) + effective = max(1, effective) current_hp = clamp(current_hp - effective, 0, max_hp) hud.update_health(current_hp, max_hp) _gain_rage(15) @@ -647,6 +674,8 @@ func _apply_skill(skill_id: String): _do_frostbolt() "tektonischer_schlag": _do_tektonischer_schlag() + "durchbeissen": + _do_durchbeissen() # ─── Autoattack ─────────────────────────────────────────────── @@ -715,6 +744,17 @@ func _do_tektonischer_schlag(): trigger_global_cooldown() print("Tektonischer Schlag! %d Gegner getroffen" % hit_count) +# ─── Durchbeißen / Schildwall / Trotz ──────────────────────── + +func _do_durchbeissen(): + var has_offhand = equipment[Equipment.Slot.OFFHAND] != null + _defend_mode = "schildwall" if has_offhand else "trotz" + is_defending = true + _defend_timer = DURCHBEISSEN_DURATION + skill_cooldowns["durchbeissen"] = DURCHBEISSEN_COOLDOWN + trigger_global_cooldown() + print("Durchbeißen! Modus: " + _defend_mode) + # ─── Quick Strike (Schurke) ─────────────────────────────────── func _do_quick_strike(): @@ -1037,6 +1077,13 @@ func _physics_process(delta): # ── Wut-Verfall ─────────────────────────────────────────── _update_rage_decay(delta) + # ── Defend-Timer ────────────────────────────────────────── + if is_defending: + _defend_timer -= delta + if _defend_timer <= 0.0: + is_defending = false + _defend_mode = "" + # ── Cooldowns herunterzählen ────────────────────────────── var gcd_was_active = global_cooldown > 0 if global_cooldown > 0: