2024-11-22 20:04:14 -07:00
|
|
|
class_name BallSFX extends Node3D
|
|
|
|
## Controller for ball sound effects.
|
|
|
|
|
|
|
|
const BASE_VOLUME := -36.0
|
|
|
|
const MAX_VOLUME := 3.0
|
|
|
|
const VELOCITY_ATTENUATION_SCALE := 400.0
|
|
|
|
|
|
|
|
@onready var parent: GameBall = $".."
|
|
|
|
|
|
|
|
@onready var grass_sfx_player: AudioStreamPlayer3D = %GrassSFXPlayer
|
|
|
|
@onready var concrete_sfx_player: AudioStreamPlayer3D = %ConcreteSFXPlayer
|
|
|
|
@onready var sand_sfx_player: AudioStreamPlayer3D = %SandSFXPlayer
|
|
|
|
|
|
|
|
|
|
|
|
func _force_attenuated_volume() -> float:
|
|
|
|
# Attenuate volume based on impact force
|
|
|
|
return lerpf(
|
|
|
|
BASE_VOLUME,
|
|
|
|
MAX_VOLUME,
|
|
|
|
clampf(parent.linear_velocity.length_squared() / VELOCITY_ATTENUATION_SCALE, 0, 1)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2024-11-22 21:15:54 -07:00
|
|
|
func _play(player: AudioStreamPlayer3D) -> void:
|
2024-11-22 20:04:14 -07:00
|
|
|
player.volume_db = _force_attenuated_volume()
|
|
|
|
print("PLAYING: ", player, "... VOLUME: ", player.volume_db)
|
|
|
|
player.play()
|
|
|
|
|
|
|
|
|
2024-11-22 21:15:54 -07:00
|
|
|
func play_sfx(terrain: Terrain.Type) -> void:
|
|
|
|
match terrain:
|
|
|
|
Terrain.Type.ROUGH, Terrain.Type.GREEN, Terrain.Type.FAIRWAY:
|
|
|
|
_play(grass_sfx_player)
|
|
|
|
Terrain.Type.CONCRETE, Terrain.Type.ROCK:
|
|
|
|
_play(concrete_sfx_player)
|
|
|
|
Terrain.Type.SAND:
|
|
|
|
_play(sand_sfx_player)
|