diff --git a/player.gd b/player.gd index 6593253..229f0a8 100644 --- a/player.gd +++ b/player.gd @@ -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