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:
parent
799ff23f75
commit
76e17cefa9
1 changed files with 58 additions and 0 deletions
58
player.gd
58
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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue