From c68fb668d81880c62efbd5207291b1e4277b85df Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Sun, 10 May 2026 21:10:16 +0200 Subject: [PATCH 1/3] assets(sfx): add sprint-21 interactive object SFX placeholders --- assets/audio/sfx/ambulance_siren.ogg | 0 assets/audio/sfx/cradle_rock.ogg | 0 assets/audio/sfx/delivery_cheer.ogg | 0 assets/audio/sfx/gift_open.ogg | 0 assets/audio/sfx/object_tap.ogg | 0 assets/audio/sfx/tea_pour.ogg | 0 assets/audio/sfx/xray_scan.ogg | 0 docs/audio-assets-sprint19.md | 16 ++++++++++++++++ 8 files changed, 16 insertions(+) create mode 100644 assets/audio/sfx/ambulance_siren.ogg create mode 100644 assets/audio/sfx/cradle_rock.ogg create mode 100644 assets/audio/sfx/delivery_cheer.ogg create mode 100644 assets/audio/sfx/gift_open.ogg create mode 100644 assets/audio/sfx/object_tap.ogg create mode 100644 assets/audio/sfx/tea_pour.ogg create mode 100644 assets/audio/sfx/xray_scan.ogg diff --git a/assets/audio/sfx/ambulance_siren.ogg b/assets/audio/sfx/ambulance_siren.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/cradle_rock.ogg b/assets/audio/sfx/cradle_rock.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/delivery_cheer.ogg b/assets/audio/sfx/delivery_cheer.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/gift_open.ogg b/assets/audio/sfx/gift_open.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/object_tap.ogg b/assets/audio/sfx/object_tap.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/tea_pour.ogg b/assets/audio/sfx/tea_pour.ogg new file mode 100644 index 0000000..e69de29 diff --git a/assets/audio/sfx/xray_scan.ogg b/assets/audio/sfx/xray_scan.ogg new file mode 100644 index 0000000..e69de29 diff --git a/docs/audio-assets-sprint19.md b/docs/audio-assets-sprint19.md index 713b47c..c5750b9 100644 --- a/docs/audio-assets-sprint19.md +++ b/docs/audio-assets-sprint19.md @@ -63,3 +63,19 @@ ffmpeg -i input.wav -c:a libvorbis -q:a 4 output.ogg - Prefer the primary pick; use the alt only if the primary is unavailable or unsuitable on preview. - Keep music loops between 30–60 s to minimize file size on mobile. - SFX should be trimmed with a short (~5 ms) fade-out to avoid clicks. + +## Sprint 21 — Interactive Object SFX + +All CC0 or CC-BY from freesound.org. Replace placeholder 0-byte files with the downloads below. + +| File | Description | Freesound suggestion | +|---|---|---| +| `assets/audio/sfx/xray_scan.ogg` | electrical hum / machine beep | search "xray machine beep" or "electrical hum short" | +| `assets/audio/sfx/tea_pour.ogg` | liquid pouring | search "liquid pour short" or "tea pouring" | +| `assets/audio/sfx/cradle_rock.ogg` | gentle creak / lullaby chime | search "gentle creak wood" or "lullaby chime" | +| `assets/audio/sfx/gift_open.ogg` | unwrapping / pop | search "gift unwrap" or "pop sound soft" | +| `assets/audio/sfx/ambulance_siren.ogg` | short siren sting <1.5s child-friendly | search "toy siren short" or "ambulance beep" | +| `assets/audio/sfx/delivery_cheer.ogg` | happy chime / fanfare | search "happy chime short" or "fanfare child" | +| `assets/audio/sfx/object_tap.ogg` | soft tap / click | search "soft tap" or "gentle click" | + +All files must be <1.5 s, child-friendly (no harsh/loud sounds), mono or stereo, 44100 Hz, OGG Vorbis. From 21628c21fd3093156fea8ee3d0e4f3f7937a664a Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Sun, 10 May 2026 21:11:34 +0200 Subject: [PATCH 2/3] feat(sfx): add interactive object SFX keys to AudioManager._SFX_MAP --- scripts/autoload/AudioManager.gd | 7 +++++++ test/unit/test_audio_manager.gd | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/scripts/autoload/AudioManager.gd b/scripts/autoload/AudioManager.gd index f84419c..26617d4 100644 --- a/scripts/autoload/AudioManager.gd +++ b/scripts/autoload/AudioManager.gd @@ -20,6 +20,13 @@ const _SFX_MAP: Dictionary = { "item_drop_outfit": "res://assets/audio/sfx/item_drop_outfit.ogg", "item_return_chest": "res://assets/audio/sfx/item_return_chest.ogg", "item_drop_floor": "res://assets/audio/sfx/item_drop_floor.ogg", + "xray_scan": "res://assets/audio/sfx/xray_scan.ogg", + "tea_pour": "res://assets/audio/sfx/tea_pour.ogg", + "cradle_rock": "res://assets/audio/sfx/cradle_rock.ogg", + "gift_open": "res://assets/audio/sfx/gift_open.ogg", + "ambulance_siren": "res://assets/audio/sfx/ambulance_siren.ogg", + "delivery_cheer": "res://assets/audio/sfx/delivery_cheer.ogg", + "object_tap": "res://assets/audio/sfx/object_tap.ogg", } var _current_floor: int = -1 diff --git a/test/unit/test_audio_manager.gd b/test/unit/test_audio_manager.gd index b33bfa1..b60a702 100644 --- a/test/unit/test_audio_manager.gd +++ b/test/unit/test_audio_manager.gd @@ -73,3 +73,13 @@ func test_music_map_has_all_four_floors() -> void: func test_default_music_volume_constant_is_0_6() -> void: assert_eq(AudioManager.DEFAULT_MUSIC_VOLUME, 0.6) + + +func test_sfx_map_has_all_interactive_object_keys() -> void: + assert_true(AudioManager._SFX_MAP.has("xray_scan")) + assert_true(AudioManager._SFX_MAP.has("tea_pour")) + assert_true(AudioManager._SFX_MAP.has("cradle_rock")) + assert_true(AudioManager._SFX_MAP.has("gift_open")) + assert_true(AudioManager._SFX_MAP.has("ambulance_siren")) + assert_true(AudioManager._SFX_MAP.has("delivery_cheer")) + assert_true(AudioManager._SFX_MAP.has("object_tap")) From 9e1058ab6c7464e73e6d06af412fb585dbf9fafd Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Sun, 10 May 2026 21:13:04 +0200 Subject: [PATCH 3/3] feat(sfx): wire interactive object SFX to AudioManager.play_sfx --- scripts/objects/ambulance.gd | 1 + scripts/objects/cradle.gd | 1 + scripts/objects/delivery_bed.gd | 1 + scripts/objects/gift_box.gd | 1 + scripts/objects/interactive_object.gd | 1 + scripts/objects/tea_pot.gd | 1 + scripts/objects/xray_machine.gd | 1 + 7 files changed, 7 insertions(+) diff --git a/scripts/objects/ambulance.gd b/scripts/objects/ambulance.gd index 5bb5829..2db71db 100644 --- a/scripts/objects/ambulance.gd +++ b/scripts/objects/ambulance.gd @@ -52,6 +52,7 @@ func _input(event: InputEvent) -> void: func _drive_in() -> void: + AudioManager.play_sfx("ambulance_siren") _is_animating = true _is_parked = false var tween: Tween = create_tween() diff --git a/scripts/objects/cradle.gd b/scripts/objects/cradle.gd index b8de782..9f9496b 100644 --- a/scripts/objects/cradle.gd +++ b/scripts/objects/cradle.gd @@ -28,6 +28,7 @@ func _input(event: InputEvent) -> void: func _start_rocking() -> void: + AudioManager.play_sfx("cradle_rock") _state = State.ROCKING var tween: Tween = create_tween() tween.set_ease(Tween.EASE_IN_OUT) diff --git a/scripts/objects/delivery_bed.gd b/scripts/objects/delivery_bed.gd index b95de9f..536a10c 100644 --- a/scripts/objects/delivery_bed.gd +++ b/scripts/objects/delivery_bed.gd @@ -44,6 +44,7 @@ func _input(event: InputEvent) -> void: func _start_arrival() -> void: + AudioManager.play_sfx("delivery_cheer") _state = State.MAMA_ARRIVING var mama: Node2D = get_node_or_null("Mama") as Node2D if mama == null: diff --git a/scripts/objects/gift_box.gd b/scripts/objects/gift_box.gd index c84cd99..d76ba80 100644 --- a/scripts/objects/gift_box.gd +++ b/scripts/objects/gift_box.gd @@ -33,6 +33,7 @@ func _input(event: InputEvent) -> void: func _start_opening() -> void: + AudioManager.play_sfx("gift_open") _state = State.OPENING var lid: Node2D = get_node_or_null("Lid") as Node2D if lid == null: diff --git a/scripts/objects/interactive_object.gd b/scripts/objects/interactive_object.gd index 8abfada..f2430ea 100644 --- a/scripts/objects/interactive_object.gd +++ b/scripts/objects/interactive_object.gd @@ -39,6 +39,7 @@ func _on_area_input_event(_viewport: Node, event: InputEvent, _shape_idx: int) - func _trigger_interaction() -> void: + AudioManager.play_sfx("object_tap") _set_state(State.ACTIVE) object_interacted.emit(self) GameState.set_object_state(object_id, "active") diff --git a/scripts/objects/tea_pot.gd b/scripts/objects/tea_pot.gd index de23f06..0b75338 100644 --- a/scripts/objects/tea_pot.gd +++ b/scripts/objects/tea_pot.gd @@ -27,6 +27,7 @@ func _input(event: InputEvent) -> void: func _start_pouring() -> void: + AudioManager.play_sfx("tea_pour") _state = State.POURING var tween: Tween = create_tween() tween.set_ease(Tween.EASE_IN_OUT) diff --git a/scripts/objects/xray_machine.gd b/scripts/objects/xray_machine.gd index 492b380..46d0616 100644 --- a/scripts/objects/xray_machine.gd +++ b/scripts/objects/xray_machine.gd @@ -39,6 +39,7 @@ func _input(event: InputEvent) -> void: func _start_scan() -> void: + AudioManager.play_sfx("xray_scan") _state = State.SLIDING_IN var plate: Node2D = get_node_or_null("Plate") as Node2D if plate == null: