Stochastic model for grunk collection SFX

This commit is contained in:
Rob Kelly 2025-08-18 17:51:45 -06:00
parent 065b9521b6
commit e25bede7f6
2 changed files with 19 additions and 48 deletions

View File

@ -1,11 +1,15 @@
extends AudioStreamPlayer
@export var max_meter := 1000.0
@export var epsilon := 20.0
@export var decay_rate := 0.95
@export var interval_curve: Curve
@export var interval := 200.0
var _meter := 0.0
@export var max_delta := 2000.0
@export var delay_mean := 0.7
@export var delay_st_dev := 0.1
@export var counter_decay := 40.0
var _counter := 0.0
@onready var cooldown: Timer = %Cooldown
@onready var debug_meter: ProgressBar = %DebugMeter
@ -16,27 +20,16 @@ func _ready() -> void:
World.instance.manager.grunk_collected.connect(on_grunk_collected)
func trigger() -> void:
play()
if _meter > epsilon:
restart_interval()
func restart_interval() -> void:
var interval := interval_curve.sample(_meter)
print_debug("meter: ", _meter, "; interval: ", interval)
cooldown.start(interval)
func on_grunk_collected(delta: float) -> void:
var old_meter := _meter
_meter = clampf(_meter + delta, epsilon, max_meter)
if old_meter <= epsilon:
trigger()
delta = min(delta, max_delta)
while delta > _counter:
delta -= _counter
_counter = interval
var delay := randfn(delay_mean, delay_st_dev)
get_tree().create_timer(delay).timeout.connect(play)
print_debug("Playing collect sfx in: ", delay)
_counter -= delta
func _process(delta: float) -> void:
var weight := 1 - exp(-decay_rate * delta)
_meter = lerpf(_meter, 0.0, weight)
debug_meter.value = _meter
_counter = move_toward(_counter, 0.0, counter_decay * delta)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=3 uid="uid://cbtmhu787diev"]
[gd_scene load_steps=7 format=3 uid="uid://cbtmhu787diev"]
[ext_resource type="AudioStream" uid="uid://dxstv7gr5n2yg" path="res://assets/sfx/tools/collect1.wav" id="1_h705l"]
[ext_resource type="AudioStream" uid="uid://b4prjqpwjpv7p" path="res://assets/sfx/tools/collect2.wav" id="2_uq3q4"]
@ -14,36 +14,14 @@ stream_1/stream = ExtResource("2_uq3q4")
stream_2/stream = ExtResource("3_h5hmg")
stream_3/stream = ExtResource("4_8ycea")
[sub_resource type="Curve" id="Curve_h705l"]
_limits = [0.0, 1.0, 0.0, 1000.0]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(580.268, 0.0565841), 0.0, 0.0, 0, 0]
point_count = 2
[node name="GrunkCollectionSFX" type="AudioStreamPlayer"]
stream = SubResource("AudioStreamRandomizer_bgxyk")
volume_db = -4.0
max_polyphony = 4
script = ExtResource("5_ihwko")
epsilon = 100.0
decay_rate = 0.99
interval_curve = SubResource("Curve_h705l")
[node name="Cooldown" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 0.12
one_shot = true
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="DebugMeter" type="ProgressBar" parent="CanvasLayer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(300, 0)
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -27.0
offset_right = 4.0
grow_vertical = 0
max_value = 1000.0
[connection signal="timeout" from="Cooldown" to="." method="trigger"]