feat: Durchbeißen implementiert (Krieger Level 10)

- Mit Schild im Offhand → Schildwall: 85% Schadensreduktion für 4s
- Ohne Schild → Trotz: Schadensreduktion skaliert mit fehlendem HP (max 60%)
- Cooldown 12s, kein Wut-Kosten (rein defensiv)
- Schadensreduktion greift in take_damage() ein

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Andre 2026-03-19 21:29:59 +01:00
parent 217ce63a28
commit c8ef56d311

View file

@ -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 const RAGE_DECAY_RATE: float = 10.0 # Wut pro Sekunde Verfall
var _rage_decay_timer: float = 0.0 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 # EQUIPMENT
# ═══════════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════════
@ -132,6 +137,10 @@ const HEAVY_STRIKE_RANGE: float = 2.0
const TEKTONISCHER_SCHLAG_COOLDOWN: float = 8.0 const TEKTONISCHER_SCHLAG_COOLDOWN: float = 8.0
const TEKTONISCHER_SCHLAG_RADIUS: float = 4.0 const TEKTONISCHER_SCHLAG_RADIUS: float = 4.0
const TEKTONISCHER_SCHLAG_RAGE: int = 30 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 # Cast System
var is_casting: bool = false var is_casting: bool = false
@ -273,6 +282,16 @@ func _init_class_skills():
"cooldown": TEKTONISCHER_SCHLAG_COOLDOWN, "cooldown": TEKTONISCHER_SCHLAG_COOLDOWN,
"cast_time": 0.0, "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 CharacterClass.MainStat.INTELLIGENCE: # Magier
available_skills.append({ available_skills.append({
@ -428,6 +447,14 @@ func get_dps() -> float:
func take_damage(amount: int): func take_damage(amount: int):
var effective = max(1, amount - int(armor * 0.1)) 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) current_hp = clamp(current_hp - effective, 0, max_hp)
hud.update_health(current_hp, max_hp) hud.update_health(current_hp, max_hp)
_gain_rage(15) _gain_rage(15)
@ -647,6 +674,8 @@ func _apply_skill(skill_id: String):
_do_frostbolt() _do_frostbolt()
"tektonischer_schlag": "tektonischer_schlag":
_do_tektonischer_schlag() _do_tektonischer_schlag()
"durchbeissen":
_do_durchbeissen()
# ─── Autoattack ─────────────────────────────────────────────── # ─── Autoattack ───────────────────────────────────────────────
@ -715,6 +744,17 @@ func _do_tektonischer_schlag():
trigger_global_cooldown() trigger_global_cooldown()
print("Tektonischer Schlag! %d Gegner getroffen" % hit_count) 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) ─────────────────────────────────── # ─── Quick Strike (Schurke) ───────────────────────────────────
func _do_quick_strike(): func _do_quick_strike():
@ -1037,6 +1077,13 @@ func _physics_process(delta):
# ── Wut-Verfall ─────────────────────────────────────────── # ── Wut-Verfall ───────────────────────────────────────────
_update_rage_decay(delta) _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 ────────────────────────────── # ── Cooldowns herunterzählen ──────────────────────────────
var gcd_was_active = global_cooldown > 0 var gcd_was_active = global_cooldown > 0
if global_cooldown > 0: if global_cooldown > 0: