feat: Blutrausch implementiert (Krieger Level 15)

- Einzelziel, Reichweite 2.5m, kostet 25 Wut
- Sofortschaden: 8-14 + 50% Stärke
- Blutung: 4 Schaden/s über 8 Sekunden (DOT-Tick in _physics_process)
- Blutung wird sofort abgebrochen wenn Ziel stirbt/ungültig wird

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Andre 2026-03-19 21:33:12 +01:00
parent 799ff23f75
commit 76e17cefa9

View file

@ -97,6 +97,11 @@ var is_defending: bool = false
var _defend_timer: float = 0.0
var _defend_mode: String = "" # "schildwall" oder "trotz"
# Blutrausch — Blutungs-DOT
var _bleed_target = null
var _bleed_timer: float = 0.0 # verbleibende Dauer
var _bleed_tick_timer: float = 0.0 # bis zum nächsten Tick
# ═══════════════════════════════════════════════════════════════
# EQUIPMENT
# ═══════════════════════════════════════════════════════════════
@ -141,6 +146,12 @@ 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
const BLUTRAUSCH_COOLDOWN: float = 10.0
const BLUTRAUSCH_RANGE: float = 2.5
const BLUTRAUSCH_RAGE: int = 25
const BLUTRAUSCH_DOT_DURATION: float = 8.0 # Blutungsdauer in Sekunden
const BLUTRAUSCH_DOT_INTERVAL: float = 1.0 # Schaden alle 1s
const BLUTRAUSCH_DOT_DAMAGE: int = 4 # Schaden pro Tick
# Cast System
var is_casting: bool = false
@ -282,6 +293,15 @@ func _init_class_skills():
"cooldown": TEKTONISCHER_SCHLAG_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://icons/blutrausch_icon.svg",
"cooldown": BLUTRAUSCH_COOLDOWN,
"cast_time": 0.0,
})
if level >= 10:
var has_offhand = _has_shield()
available_skills.append({
@ -640,6 +660,10 @@ func execute_skill(skill_id: String):
if current_resource < TEKTONISCHER_SCHLAG_RAGE:
print("Zu wenig Wut!")
return
if skill_id == "blutrausch":
if current_resource < BLUTRAUSCH_RAGE:
print("Zu wenig Wut!")
return
# Cast-Zeit?
if skill["cast_time"] > 0:
@ -676,6 +700,8 @@ func _apply_skill(skill_id: String):
_do_tektonischer_schlag()
"durchbeissen":
_do_durchbeissen()
"blutrausch":
_do_blutrausch()
# ─── Autoattack ───────────────────────────────────────────────
@ -746,6 +772,25 @@ func _do_tektonischer_schlag():
# ─── Durchbeißen / Schildwall / Trotz ────────────────────────
# ─── Blutrausch ───────────────────────────────────────────────
func _do_blutrausch():
if target == null or not is_instance_valid(target):
return
if global_position.distance_to(target.global_position) > BLUTRAUSCH_RANGE:
print("Ziel zu weit für Blutrausch!")
return
if not _spend_rage(BLUTRAUSCH_RAGE):
return
var damage = randi_range(8, 14) + int(strength * 0.5)
target.take_damage(damage)
_bleed_target = target
_bleed_timer = BLUTRAUSCH_DOT_DURATION
_bleed_tick_timer = BLUTRAUSCH_DOT_INTERVAL
skill_cooldowns["blutrausch"] = BLUTRAUSCH_COOLDOWN
trigger_global_cooldown()
print("Blutrausch! %d Sofortschaden + Blutung" % damage)
func _has_shield() -> bool:
var offhand = equipment[Equipment.Slot.OFFHAND]
return offhand != null and offhand.item_type == Equipment.ItemType.SHIELD
@ -1081,6 +1126,19 @@ func _physics_process(delta):
# ── Wut-Verfall ───────────────────────────────────────────
_update_rage_decay(delta)
# ── Blutungs-DOT ──────────────────────────────────────────
if _bleed_timer > 0.0:
_bleed_timer -= delta
_bleed_tick_timer -= delta
if _bleed_tick_timer <= 0.0:
_bleed_tick_timer = BLUTRAUSCH_DOT_INTERVAL
if _bleed_target != null and is_instance_valid(_bleed_target):
_bleed_target.take_damage(BLUTRAUSCH_DOT_DAMAGE)
else:
_bleed_timer = 0.0
if _bleed_timer <= 0.0:
_bleed_target = null
# ── Defend-Timer ──────────────────────────────────────────
if is_defending:
_defend_timer -= delta