From e25bede7f6bb94fec35807fd828c173386899f89 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Mon, 18 Aug 2025 17:51:45 -0600 Subject: [PATCH] Stochastic model for grunk collection SFX --- .../grunk_collection_sfx.gd | 43 ++++++++----------- .../grunk_collection_sfx.tscn | 24 +---------- 2 files changed, 19 insertions(+), 48 deletions(-) diff --git a/src/player/grunk_collection_sfx/grunk_collection_sfx.gd b/src/player/grunk_collection_sfx/grunk_collection_sfx.gd index db2bf75..332dbdc 100644 --- a/src/player/grunk_collection_sfx/grunk_collection_sfx.gd +++ b/src/player/grunk_collection_sfx/grunk_collection_sfx.gd @@ -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) diff --git a/src/player/grunk_collection_sfx/grunk_collection_sfx.tscn b/src/player/grunk_collection_sfx/grunk_collection_sfx.tscn index 1d872f0..b7ce6c0 100644 --- a/src/player/grunk_collection_sfx/grunk_collection_sfx.tscn +++ b/src/player/grunk_collection_sfx/grunk_collection_sfx.tscn @@ -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"]