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_timer: float = 0.0
|
||||||
var _defend_mode: String = "" # "schildwall" oder "trotz"
|
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
|
# EQUIPMENT
|
||||||
# ═══════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════
|
||||||
|
|
@ -141,6 +146,12 @@ const DURCHBEISSEN_COOLDOWN: float = 12.0
|
||||||
const DURCHBEISSEN_DURATION: float = 4.0
|
const DURCHBEISSEN_DURATION: float = 4.0
|
||||||
const SCHILDWALL_BLOCK: float = 0.85 # 85% Schadensreduktion
|
const SCHILDWALL_BLOCK: float = 0.85 # 85% Schadensreduktion
|
||||||
const TROTZ_MAX_REDUCTION: float = 0.60 # max 60% Reduktion bei 0 HP
|
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
|
# Cast System
|
||||||
var is_casting: bool = false
|
var is_casting: bool = false
|
||||||
|
|
@ -282,6 +293,15 @@ func _init_class_skills():
|
||||||
"cooldown": TEKTONISCHER_SCHLAG_COOLDOWN,
|
"cooldown": TEKTONISCHER_SCHLAG_COOLDOWN,
|
||||||
"cast_time": 0.0,
|
"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:
|
if level >= 10:
|
||||||
var has_offhand = _has_shield()
|
var has_offhand = _has_shield()
|
||||||
available_skills.append({
|
available_skills.append({
|
||||||
|
|
@ -640,6 +660,10 @@ func execute_skill(skill_id: String):
|
||||||
if current_resource < TEKTONISCHER_SCHLAG_RAGE:
|
if current_resource < TEKTONISCHER_SCHLAG_RAGE:
|
||||||
print("Zu wenig Wut!")
|
print("Zu wenig Wut!")
|
||||||
return
|
return
|
||||||
|
if skill_id == "blutrausch":
|
||||||
|
if current_resource < BLUTRAUSCH_RAGE:
|
||||||
|
print("Zu wenig Wut!")
|
||||||
|
return
|
||||||
|
|
||||||
# Cast-Zeit?
|
# Cast-Zeit?
|
||||||
if skill["cast_time"] > 0:
|
if skill["cast_time"] > 0:
|
||||||
|
|
@ -676,6 +700,8 @@ func _apply_skill(skill_id: String):
|
||||||
_do_tektonischer_schlag()
|
_do_tektonischer_schlag()
|
||||||
"durchbeissen":
|
"durchbeissen":
|
||||||
_do_durchbeissen()
|
_do_durchbeissen()
|
||||||
|
"blutrausch":
|
||||||
|
_do_blutrausch()
|
||||||
|
|
||||||
# ─── Autoattack ───────────────────────────────────────────────
|
# ─── Autoattack ───────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
@ -746,6 +772,25 @@ func _do_tektonischer_schlag():
|
||||||
|
|
||||||
# ─── Durchbeißen / Schildwall / Trotz ────────────────────────
|
# ─── 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:
|
func _has_shield() -> bool:
|
||||||
var offhand = equipment[Equipment.Slot.OFFHAND]
|
var offhand = equipment[Equipment.Slot.OFFHAND]
|
||||||
return offhand != null and offhand.item_type == Equipment.ItemType.SHIELD
|
return offhand != null and offhand.item_type == Equipment.ItemType.SHIELD
|
||||||
|
|
@ -1081,6 +1126,19 @@ func _physics_process(delta):
|
||||||
# ── Wut-Verfall ───────────────────────────────────────────
|
# ── Wut-Verfall ───────────────────────────────────────────
|
||||||
_update_rage_decay(delta)
|
_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 ──────────────────────────────────────────
|
# ── Defend-Timer ──────────────────────────────────────────
|
||||||
if is_defending:
|
if is_defending:
|
||||||
_defend_timer -= delta
|
_defend_timer -= delta
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue