Files
dauphincraft/scripts/progression/ComboTracker.gd
Poulpe (Silver Surfer deploy) 26f9609b53 feat(progression): combo de mining + multiplicateur XP
Nouvel autoload ComboTracker: chaque cassage de bloc dans les 1.8s du
précédent étend le combo (+15% par palier, cap x3.0). Le multiplicateur
s'applique au gain XP de base.

HUD: panneau "COMBO xN (+X%)" animé (pop scale) à partir de x2, avec
barre de temps restant qui se vide. Combo ≥5 au break → bonus XP final
(3 * count) avec popup.

Rétention: incite à chaîner les actions, récompense la dextérité et crée
des pics d'intensité dans la boucle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 18:14:02 +00:00

49 lines
1012 B
GDScript

extends Node
signal combo_changed(count: int, multiplier: float)
signal combo_broken(final_count: int)
const WINDOW_SEC: float = 1.8
const STEP_BONUS: float = 0.15 # +15% per combo step
const MAX_MULT: float = 3.0
var count: int = 0
var multiplier: float = 1.0
var _timer: float = 0.0
var _active: bool = false
func _process(delta: float) -> void:
if not _active:
return
_timer -= delta
if _timer <= 0.0:
_break()
func bump() -> float:
# Advances combo and returns multiplier to apply to the triggering gain.
count += 1
multiplier = minf(1.0 + float(count - 1) * STEP_BONUS, MAX_MULT)
_timer = WINDOW_SEC
_active = true
combo_changed.emit(count, multiplier)
return multiplier
func _break() -> void:
var final_count: int = count
_active = false
combo_changed.emit(0, 1.0)
if final_count >= 2:
combo_broken.emit(final_count)
count = 0
multiplier = 1.0
_timer = 0.0
func time_remaining_ratio() -> float:
if not _active:
return 0.0
return clampf(_timer / WINDOW_SEC, 0.0, 1.0)