claude-code-sounds 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "Metal Gear Solid",
3
+ "description": "Iconic Metal Gear Solid sound effects — codec calls, alert sounds, and Snake voice lines",
4
+ "author": "ryparker",
5
+ "srcBase": "MGS",
6
+ "sounds": {
7
+ "start": {
8
+ "description": "Session starting — codec call incoming",
9
+ "files": [
10
+ { "src": "@myinstants/codec.mp3", "name": "codec-call.mp3" },
11
+ { "src": "@myinstants/metalgearcodec.mp3", "name": "codec-ring.mp3" },
12
+ { "src": "@myinstants/mgs2-snake-kept-you-waiting-huh.mp3", "name": "kept-you-waiting-huh.mp3" },
13
+ { "src": "@myinstants/codec-send.mp3", "name": "this-is-snake.mp3" }
14
+ ]
15
+ },
16
+ "end": {
17
+ "description": "Session over — mission complete",
18
+ "files": [
19
+ { "src": "@myinstants/metal_gear_solid_exit_sound_effect.mp3", "name": "codec-exit.mp3" },
20
+ { "src": "@myinstants/metal_gear_solid_exit_sound_effect_EQbXTbY.mp3", "name": "codec-close.mp3" },
21
+ { "src": "@myinstants/mgs2-snake-sweet-dreams-boyscout.mp3", "name": "sweet-dreams.mp3" },
22
+ { "src": "@myinstants/sfx_s_mission_qualify.mp3", "name": "mission-complete.mp3" }
23
+ ]
24
+ },
25
+ "prompt": {
26
+ "description": "User submitted prompt — acknowledging orders",
27
+ "files": [
28
+ { "src": "@myinstants/mgs2-snake-roger-that-sir.mp3", "name": "roger-that.mp3" },
29
+ { "src": "@myinstants/mgs2-snake-sounds-like-a-plan.mp3", "name": "sounds-like-a-plan.mp3" },
30
+ { "src": "@myinstants/mgs2-snake-ill-do-my-best.mp3", "name": "ill-do-my-best.mp3" },
31
+ { "src": "@myinstants/mgs2-snake-if-you-say-so.mp3", "name": "if-you-say-so.mp3" }
32
+ ]
33
+ },
34
+ "stop": {
35
+ "description": "Done responding — codec transmission end",
36
+ "files": [
37
+ { "src": "@myinstants/metal_gear_solid_exit_sound_effect.mp3", "name": "codec-hangup.mp3" },
38
+ { "src": "@myinstants/mgs2-snake-roger-that-sir.mp3", "name": "roger-that.mp3" },
39
+ { "src": "@myinstants/mgs2-snake-good-shooting.mp3", "name": "good-shooting.mp3" }
40
+ ]
41
+ },
42
+ "permission": {
43
+ "description": "Permission prompt — alert detected",
44
+ "files": [
45
+ { "src": "@myinstants/tindeck_1.mp3", "name": "alert.mp3" },
46
+ { "src": "@myinstants/metal-gear-alert-sound-effect_XKoHReZ.mp3", "name": "alert-sfx.mp3" },
47
+ { "src": "@myinstants/what-was-that-noise.mp3", "name": "what-was-that-noise.mp3" },
48
+ { "src": "@myinstants/untitled_1150.mp3", "name": "alert-mode.mp3" }
49
+ ]
50
+ },
51
+ "idle": {
52
+ "description": "Waiting for input — standing by",
53
+ "files": [
54
+ { "src": "@myinstants/mgs2-snake-kept-you-waiting-huh.mp3", "name": "kept-you-waiting.mp3" },
55
+ { "src": "@myinstants/why_are_we_still_here_just_to_suffer_2.mp3", "name": "just-to-suffer.mp3" },
56
+ { "src": "@myinstants/cigar.mp3", "name": "cigar.mp3" }
57
+ ]
58
+ },
59
+ "subagent": {
60
+ "description": "Spawning subagent — calling for backup",
61
+ "files": [
62
+ { "src": "@myinstants/codec.mp3", "name": "codec-call-out.mp3" },
63
+ { "src": "@myinstants/metalgearcodec.mp3", "name": "codec-dial.mp3" },
64
+ { "src": "@myinstants/mgs2-snake-sounds-like-a-plan.mp3", "name": "sounds-like-a-plan.mp3" }
65
+ ]
66
+ },
67
+ "error": {
68
+ "description": "Tool failure — game over",
69
+ "files": [
70
+ { "src": "@myinstants/metalgeargameov5235.mp3", "name": "game-over.mp3" },
71
+ { "src": "@myinstants/metal-gear-solid-solid-snake-scream.mp3", "name": "snake-scream.mp3" },
72
+ { "src": "@myinstants/snake-dies-game-over.mp3", "name": "snake-dies.mp3" },
73
+ { "src": "@myinstants/metal_gear_solid_game_over_screen_clean_background-1.mp3", "name": "game-over-screen.mp3" },
74
+ { "src": "@myinstants/mgs2-snake-what-the-hell-is-going-on-here.mp3", "name": "what-the-hell.mp3" }
75
+ ]
76
+ },
77
+ "task-completed": {
78
+ "description": "Task finished — mission accomplished",
79
+ "files": [
80
+ { "src": "@myinstants/youre-pretty-good_I5kzLtx.mp3", "name": "youre-pretty-good.mp3" },
81
+ { "src": "@myinstants/sfx_s_mission_qualify.mp3", "name": "mission-qualify.mp3" },
82
+ { "src": "@myinstants/mgs2-snake-good-shooting.mp3", "name": "good-shooting.mp3" },
83
+ { "src": "@myinstants/metal-gear-item-drop.mp3", "name": "item-drop.mp3" }
84
+ ]
85
+ },
86
+ "compact": {
87
+ "description": "Context compaction — stealth camo engaged",
88
+ "files": [
89
+ { "src": "@myinstants/metalgearsolid.swf.mp3", "name": "game-over-fade.mp3" },
90
+ { "src": "@myinstants/original-metal-gear-solid-game-over-screen.mp3", "name": "original-game-over.mp3" },
91
+ { "src": "@myinstants/ocelot-meowing.mp3", "name": "ocelot-meow.mp3" }
92
+ ]
93
+ },
94
+ "teammate-idle": {
95
+ "description": "Teammate went idle — waiting on comms",
96
+ "files": [
97
+ { "src": "@myinstants/codec.mp3", "name": "codec-beep.mp3" },
98
+ { "src": "@myinstants/mgs2-snake-friendly-fire.mp3", "name": "friendly-fire.mp3" },
99
+ { "src": "@myinstants/what-was-that-noise.mp3", "name": "what-was-that.mp3" }
100
+ ]
101
+ }
102
+ }
103
+ }
@@ -0,0 +1,75 @@
1
+ #!/bin/bash
2
+ #
3
+ # Downloads sound files for the pokemon-gen1 theme.
4
+ # Called by install.sh with $1 = target sounds directory, $2 = temp directory.
5
+ #
6
+ set -e
7
+
8
+ # shellcheck disable=SC2034 # passed by install.sh, reserved for theme use
9
+ SOUNDS_DIR="$1"
10
+ TMP_DIR="$2"
11
+ PKM_DIR="$TMP_DIR/PokemonGen1"
12
+
13
+ mkdir -p "$PKM_DIR/SFX" "$PKM_DIR/Cries" "$PKM_DIR/Attacks"
14
+
15
+ # --- General sound effects (menu, items, battle UI) ---
16
+ echo " Downloading Pokemon Red/Blue general sound effects..."
17
+ SFX_ZIP="$TMP_DIR/pokemon-sfx.zip"
18
+ curl -sL -o "$SFX_ZIP" \
19
+ "https://sounds.spriters-resource.com/media/assets/408/410769.zip?updated=1755537434"
20
+
21
+ if ! file "$SFX_ZIP" | grep -q "Zip"; then
22
+ echo " Error: Failed to download general sound effects pack."
23
+ exit 1
24
+ fi
25
+
26
+ unzip -qo "$SFX_ZIP" -d "$TMP_DIR"
27
+ cp "$TMP_DIR/Pokemon Red_Blue Sound Effects/"*.wav "$PKM_DIR/SFX/"
28
+
29
+ # --- Pokemon cries (151 original cries) ---
30
+ echo " Downloading Pokemon Gen 1 cries..."
31
+ CRIES_ZIP="$TMP_DIR/pokemon-cries.zip"
32
+ curl -sL -o "$CRIES_ZIP" \
33
+ "https://sounds.spriters-resource.com/media/assets/411/413821.zip?updated=1755538954"
34
+
35
+ if ! file "$CRIES_ZIP" | grep -q "Zip"; then
36
+ echo " Error: Failed to download Pokemon cries pack."
37
+ exit 1
38
+ fi
39
+
40
+ unzip -qo "$CRIES_ZIP" -d "$TMP_DIR"
41
+ cp "$TMP_DIR/Pokemon RBY Cries/"*.wav "$PKM_DIR/Cries/"
42
+
43
+ # --- Attack move sound effects ---
44
+ echo " Downloading Pokemon Gen 1 attack move sounds..."
45
+ ATTACKS_ZIP="$TMP_DIR/pokemon-attacks.zip"
46
+ curl -sL -o "$ATTACKS_ZIP" \
47
+ "https://sounds.spriters-resource.com/media/assets/408/410768.zip?updated=1755537433"
48
+
49
+ if ! file "$ATTACKS_ZIP" | grep -q "Zip"; then
50
+ echo " Error: Failed to download attack move sound effects pack."
51
+ exit 1
52
+ fi
53
+
54
+ unzip -qo "$ATTACKS_ZIP" -d "$TMP_DIR/pokemon-attacks-raw"
55
+
56
+ # Copy only the specific attack sounds used by this theme
57
+ ATTACK_FILES=(
58
+ "Screech.wav"
59
+ "Rest.wav"
60
+ "Teleport.wav"
61
+ "Confused.wav"
62
+ "SelfDestruct.wav"
63
+ "Splash.wav"
64
+ "Substitute.wav"
65
+ )
66
+
67
+ for FILE in "${ATTACK_FILES[@]}"; do
68
+ if [ -f "$TMP_DIR/pokemon-attacks-raw/$FILE" ]; then
69
+ cp "$TMP_DIR/pokemon-attacks-raw/$FILE" "$PKM_DIR/Attacks/"
70
+ else
71
+ echo " Warning: Attack sound $FILE not found in archive."
72
+ fi
73
+ done
74
+
75
+ echo " Download complete."
@@ -0,0 +1,112 @@
1
+ {
2
+ "name": "Pokemon Gen 1",
3
+ "description": "Pokemon Red/Blue/Yellow sound effects — cries, battle sounds, and menu bleeps from Kanto",
4
+ "author": "ryparker",
5
+ "srcBase": "PokemonGen1",
6
+ "sounds": {
7
+ "start": {
8
+ "description": "Session starting — a wild Claude appeared!",
9
+ "files": [
10
+ { "src": "SFX/SFX_INTRO_LUNGE.wav", "name": "intro-lunge.wav" },
11
+ { "src": "SFX/SFX_BALL_TOSS.wav", "name": "ball-toss.wav" },
12
+ { "src": "SFX/SFX_BALL_POOF.wav", "name": "ball-poof.wav" },
13
+ { "src": "Cries/025.wav", "name": "pikachu-cry.wav" },
14
+ { "src": "SFX/SFX_INTRO_WHOOSH.wav", "name": "intro-whoosh.wav" }
15
+ ]
16
+ },
17
+ "end": {
18
+ "description": "Session over — Pokemon Center healed up",
19
+ "files": [
20
+ { "src": "SFX/SFX_HEAL_UP.wav", "name": "heal-up.wav" },
21
+ { "src": "SFX/SFX_SAVE.wav", "name": "save-game.wav" },
22
+ { "src": "SFX/SFX_GO_OUTSIDE.wav", "name": "go-outside.wav" },
23
+ { "src": "SFX/SFX_TURN_OFF_PC.wav", "name": "turn-off-pc.wav" }
24
+ ]
25
+ },
26
+ "prompt": {
27
+ "description": "User submitted prompt — menu select acknowledgment",
28
+ "files": [
29
+ { "src": "SFX/SFX_PRESS_AB.wav", "name": "press-ab.wav" },
30
+ { "src": "SFX/SFX_START_MENU.wav", "name": "start-menu.wav" },
31
+ { "src": "SFX/SFX_TINK.wav", "name": "tink.wav" },
32
+ { "src": "SFX/SFX_SWAP.wav", "name": "swap.wav" }
33
+ ]
34
+ },
35
+ "stop": {
36
+ "description": "Done responding — move learned, task complete",
37
+ "files": [
38
+ { "src": "SFX/SFX_GET_ITEM_1.wav", "name": "get-item.wav" },
39
+ { "src": "SFX/SFX_DEX_PAGE_ADDED.wav", "name": "dex-page-added.wav" },
40
+ { "src": "SFX/SFX_PURCHASE.wav", "name": "purchase.wav" },
41
+ { "src": "SFX/SFX_HEAL_AILMENT.wav", "name": "heal-ailment.wav" }
42
+ ]
43
+ },
44
+ "permission": {
45
+ "description": "Permission prompt — wild encounter alert!",
46
+ "files": [
47
+ { "src": "SFX/SFX_COLLISION.wav", "name": "collision.wav" },
48
+ { "src": "SFX/SFX_SILPH_SCOPE.wav", "name": "silph-scope.wav" },
49
+ { "src": "SFX/SFX_DENIED.wav", "name": "denied.wav" },
50
+ { "src": "Attacks/Screech.wav", "name": "screech.wav" }
51
+ ]
52
+ },
53
+ "idle": {
54
+ "description": "Waiting for input — idle Pokemon waiting",
55
+ "files": [
56
+ { "src": "SFX/SFX_SLOTS_STOP_WHEEL.wav", "name": "slots-stop.wav" },
57
+ { "src": "SFX/SFX_POISONED.wav", "name": "poisoned.wav" },
58
+ { "src": "Cries/054.wav", "name": "psyduck-cry.wav" },
59
+ { "src": "Attacks/Rest.wav", "name": "rest.wav" }
60
+ ]
61
+ },
62
+ "subagent": {
63
+ "description": "Spawning subagent — I choose you!",
64
+ "files": [
65
+ { "src": "SFX/SFX_BALL_TOSS.wav", "name": "pokeball-throw.wav" },
66
+ { "src": "SFX/SFX_BALL_POOF.wav", "name": "pokeball-open.wav" },
67
+ { "src": "SFX/SFX_SWITCH.wav", "name": "pokemon-switch.wav" },
68
+ { "src": "Cries/006.wav", "name": "charizard-cry.wav" },
69
+ { "src": "Attacks/Teleport.wav", "name": "teleport.wav" }
70
+ ]
71
+ },
72
+ "error": {
73
+ "description": "Tool failure — it's not very effective...",
74
+ "files": [
75
+ { "src": "SFX/SFX_FAINT_FALL.wav", "name": "faint-fall.wav" },
76
+ { "src": "SFX/SFX_FAINT_THUD.wav", "name": "faint-thud.wav" },
77
+ { "src": "Attacks/Confused.wav", "name": "confused.wav" },
78
+ { "src": "Attacks/SelfDestruct.wav", "name": "self-destruct.wav" },
79
+ { "src": "Attacks/Splash.wav", "name": "splash.wav" }
80
+ ]
81
+ },
82
+ "task-completed": {
83
+ "description": "Task finished — badge earned, level up!",
84
+ "files": [
85
+ { "src": "SFX/SFX_LEVEL_UP.wav", "name": "level-up.wav" },
86
+ { "src": "SFX/SFX_GET_KEY_ITEM.wav", "name": "get-key-item.wav" },
87
+ { "src": "SFX/SFX_GET_ITEM_2.wav", "name": "get-item-fanfare.wav" },
88
+ { "src": "SFX/SFX_CAUGHT_MON.wav", "name": "caught-mon.wav" },
89
+ { "src": "SFX/SFX_POKEDEX_RATING.wav", "name": "pokedex-rating.wav" }
90
+ ]
91
+ },
92
+ "compact": {
93
+ "description": "Context compaction — PC storage and transformation",
94
+ "files": [
95
+ { "src": "SFX/SFX_ENTER_PC.wav", "name": "enter-pc.wav" },
96
+ { "src": "SFX/SFX_WITHDRAW_DEPOSIT.wav", "name": "withdraw-deposit.wav" },
97
+ { "src": "SFX/SFX_SHRINK.wav", "name": "shrink.wav" },
98
+ { "src": "Attacks/Substitute.wav", "name": "substitute.wav" },
99
+ { "src": "SFX/SFX_TRADE_MACHINE.wav", "name": "trade-machine.wav" }
100
+ ]
101
+ },
102
+ "teammate-idle": {
103
+ "description": "Teammate went idle — a Pokemon is waiting",
104
+ "files": [
105
+ { "src": "Cries/025.wav", "name": "pikachu-cry.wav" },
106
+ { "src": "Cries/039.wav", "name": "jigglypuff-cry.wav" },
107
+ { "src": "SFX/SFX_SLOTS_NEW_SPIN.wav", "name": "slots-new-spin.wav" },
108
+ { "src": "SFX/SFX_LEDGE.wav", "name": "ledge.wav" }
109
+ ]
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,95 @@
1
+ #!/bin/bash
2
+ #
3
+ # Downloads sound files for the portal theme.
4
+ # Called by install.sh with $1 = target sounds directory, $2 = temp directory.
5
+ #
6
+ set -e
7
+
8
+ # shellcheck disable=SC2034 # passed by install.sh, reserved for theme use
9
+ SOUNDS_DIR="$1"
10
+ TMP_DIR="$2"
11
+ PORTAL_DIR="$TMP_DIR/Portal2"
12
+
13
+ BASE_URL="https://raw.githubusercontent.com/sourcesounds/portal2/master/sound"
14
+
15
+ # All unique sound files needed by this theme, organized by subdirectory
16
+ declare -A DIRS
17
+ DIRS=(
18
+ [weapons/portalgun]="
19
+ portalgun_powerup1.wav
20
+ portal_open1.wav
21
+ portal_close1.wav
22
+ portal_close2.wav
23
+ portal_enter_01.wav
24
+ portal_exit_01.wav
25
+ portalgun_shoot_blue1.wav
26
+ portalgun_shoot_red1.wav
27
+ portal_fizzle_01.wav
28
+ portal_invalid_surface_01.wav
29
+ "
30
+ [npc/turret_floor]="
31
+ active.wav
32
+ alert.wav
33
+ ping.wav
34
+ retract.wav
35
+ turret_active_1.wav
36
+ turret_autosearch_1.wav
37
+ turret_autosearch_2.wav
38
+ turret_search_1.wav
39
+ turret_search_2.wav
40
+ turret_deploy_1.wav
41
+ turret_retire_1.wav
42
+ turret_retire_2.wav
43
+ turret_shotat_1.wav
44
+ turret_disabled_1.wav
45
+ "
46
+ [npc/sphere]="
47
+ corrupt_core_attach_01.wav
48
+ sphere_attach.wav
49
+ "
50
+ [buttons]="
51
+ button_synth_positive_01.wav
52
+ button_synth_negative_01.wav
53
+ portal_button_down_01.wav
54
+ portal_button_up_01.wav
55
+ og_test_chamber_pos_01.wav
56
+ "
57
+ [ui]="
58
+ buttonclick.wav
59
+ "
60
+ [alarms]="
61
+ klaxon1.wav
62
+ "
63
+ [vfx]="
64
+ fizzler_start_01.wav
65
+ fizzler_shutdown_01.wav
66
+ "
67
+ [props]="
68
+ material_emancipation_01.wav
69
+ post_message_announcer_01.wav
70
+ "
71
+ )
72
+
73
+ echo " Downloading Portal 2 sounds..."
74
+
75
+ FAILED=0
76
+ TOTAL=0
77
+
78
+ for DIR in "${!DIRS[@]}"; do
79
+ mkdir -p "$PORTAL_DIR/$DIR"
80
+ for FILE in ${DIRS[$DIR]}; do
81
+ TOTAL=$((TOTAL + 1))
82
+ curl -sL -o "$PORTAL_DIR/$DIR/$FILE" "$BASE_URL/$DIR/$FILE"
83
+ if [ ! -s "$PORTAL_DIR/$DIR/$FILE" ]; then
84
+ echo " Warning: Failed to download $DIR/$FILE"
85
+ rm -f "$PORTAL_DIR/$DIR/$FILE"
86
+ FAILED=$((FAILED + 1))
87
+ fi
88
+ done
89
+ done
90
+
91
+ if [ "$FAILED" -gt 0 ]; then
92
+ echo " Warning: $FAILED of $TOTAL file(s) failed to download."
93
+ fi
94
+
95
+ echo " Download complete ($((TOTAL - FAILED))/$TOTAL files)."
@@ -0,0 +1,105 @@
1
+ {
2
+ "name": "Portal",
3
+ "description": "Portal 2 sound effects — turrets, portal guns, GLaDOS alerts, and Aperture Science ambiance",
4
+ "author": "ryparker",
5
+ "srcBase": "Portal2",
6
+ "sounds": {
7
+ "start": {
8
+ "description": "Session starting — test chamber initiated",
9
+ "files": [
10
+ { "src": "weapons/portalgun/portalgun_powerup1.wav", "name": "portalgun-powerup.wav" },
11
+ { "src": "npc/turret_floor/active.wav", "name": "turret-activated.wav" },
12
+ { "src": "weapons/portalgun/portal_open1.wav", "name": "portal-open.wav" },
13
+ { "src": "buttons/og_test_chamber_pos_01.wav", "name": "test-chamber-start.wav" }
14
+ ]
15
+ },
16
+ "end": {
17
+ "description": "Session over — test complete",
18
+ "files": [
19
+ { "src": "weapons/portalgun/portal_close1.wav", "name": "portal-close.wav" },
20
+ { "src": "weapons/portalgun/portal_close2.wav", "name": "portal-close-alt.wav" },
21
+ { "src": "npc/turret_floor/turret_retire_1.wav", "name": "turret-goodbye.wav" },
22
+ { "src": "vfx/fizzler_shutdown_01.wav", "name": "fizzler-shutdown.wav" }
23
+ ]
24
+ },
25
+ "prompt": {
26
+ "description": "User submitted prompt — input received",
27
+ "files": [
28
+ { "src": "buttons/button_synth_positive_01.wav", "name": "button-positive.wav" },
29
+ { "src": "buttons/portal_button_down_01.wav", "name": "button-press.wav" },
30
+ { "src": "ui/buttonclick.wav", "name": "ui-click.wav" },
31
+ { "src": "weapons/portalgun/portal_enter_01.wav", "name": "portal-enter.wav" }
32
+ ]
33
+ },
34
+ "stop": {
35
+ "description": "Done responding — task acknowledged",
36
+ "files": [
37
+ { "src": "buttons/button_synth_positive_01.wav", "name": "synth-positive.wav" },
38
+ { "src": "buttons/portal_button_up_01.wav", "name": "button-release.wav" },
39
+ { "src": "weapons/portalgun/portal_exit_01.wav", "name": "portal-exit.wav" },
40
+ { "src": "npc/turret_floor/turret_retire_2.wav", "name": "turret-done.wav" }
41
+ ]
42
+ },
43
+ "permission": {
44
+ "description": "Permission prompt — turret alert",
45
+ "files": [
46
+ { "src": "npc/turret_floor/turret_search_1.wav", "name": "turret-whos-there.wav" },
47
+ { "src": "npc/turret_floor/alert.wav", "name": "turret-alert.wav" },
48
+ { "src": "alarms/klaxon1.wav", "name": "klaxon-alarm.wav" },
49
+ { "src": "npc/turret_floor/turret_active_1.wav", "name": "turret-i-see-you.wav" }
50
+ ]
51
+ },
52
+ "idle": {
53
+ "description": "Waiting for input — are you still there?",
54
+ "files": [
55
+ { "src": "npc/turret_floor/turret_autosearch_1.wav", "name": "turret-are-you-still-there.wav" },
56
+ { "src": "npc/turret_floor/turret_autosearch_2.wav", "name": "turret-searching.wav" },
57
+ { "src": "npc/turret_floor/turret_search_2.wav", "name": "turret-hello.wav" },
58
+ { "src": "npc/turret_floor/ping.wav", "name": "turret-ping.wav" }
59
+ ]
60
+ },
61
+ "subagent": {
62
+ "description": "Spawning subagent — deploying through portal",
63
+ "files": [
64
+ { "src": "weapons/portalgun/portalgun_shoot_blue1.wav", "name": "shoot-blue-portal.wav" },
65
+ { "src": "weapons/portalgun/portalgun_shoot_red1.wav", "name": "shoot-orange-portal.wav" },
66
+ { "src": "npc/turret_floor/turret_deploy_1.wav", "name": "turret-deploy.wav" },
67
+ { "src": "npc/sphere/corrupt_core_attach_01.wav", "name": "core-attach.wav" }
68
+ ]
69
+ },
70
+ "error": {
71
+ "description": "Tool failure — fizzled",
72
+ "files": [
73
+ { "src": "npc/turret_floor/turret_shotat_1.wav", "name": "turret-ow.wav" },
74
+ { "src": "weapons/portalgun/portal_fizzle_01.wav", "name": "portal-fizzle.wav" },
75
+ { "src": "props/material_emancipation_01.wav", "name": "emancipation-grill.wav" },
76
+ { "src": "buttons/button_synth_negative_01.wav", "name": "synth-negative.wav" },
77
+ { "src": "weapons/portalgun/portal_invalid_surface_01.wav", "name": "invalid-surface.wav" }
78
+ ]
79
+ },
80
+ "task-completed": {
81
+ "description": "Task finished — test chamber complete",
82
+ "files": [
83
+ { "src": "buttons/og_test_chamber_pos_01.wav", "name": "test-chamber-complete.wav" },
84
+ { "src": "npc/sphere/sphere_attach.wav", "name": "core-complete.wav" },
85
+ { "src": "props/post_message_announcer_01.wav", "name": "announcer-post.wav" }
86
+ ]
87
+ },
88
+ "compact": {
89
+ "description": "Context compaction — memory fizzling",
90
+ "files": [
91
+ { "src": "vfx/fizzler_start_01.wav", "name": "fizzler-start.wav" },
92
+ { "src": "npc/turret_floor/retract.wav", "name": "turret-retract.wav" },
93
+ { "src": "weapons/portalgun/portal_close1.wav", "name": "portal-whoosh-close.wav" }
94
+ ]
95
+ },
96
+ "teammate-idle": {
97
+ "description": "Teammate went idle — turret lost target",
98
+ "files": [
99
+ { "src": "npc/turret_floor/turret_search_1.wav", "name": "turret-target-lost.wav" },
100
+ { "src": "npc/turret_floor/turret_autosearch_1.wav", "name": "turret-hellooo.wav" },
101
+ { "src": "npc/turret_floor/turret_disabled_1.wav", "name": "turret-no-hard-feelings.wav" }
102
+ ]
103
+ }
104
+ }
105
+ }
@@ -0,0 +1,119 @@
1
+ #!/bin/bash
2
+ #
3
+ # Downloads sound files for the star-wars theme.
4
+ # Called by install.sh with $1 = target sounds directory, $2 = temp directory.
5
+ #
6
+ set -e
7
+
8
+ # shellcheck disable=SC2034 # passed by install.sh, reserved for theme use
9
+ SOUNDS_DIR="$1"
10
+ TMP_DIR="$2"
11
+ SW_DIR="$TMP_DIR/StarWars"
12
+
13
+ mkdir -p "$SW_DIR/empire" "$SW_DIR/return"
14
+
15
+ BASE_URL="https://www.thesoundarchive.com/starwars"
16
+ WAVSOURCE_URL="https://www.wavsource.com/snds_2020-10-01_3728627494378403/movies/star_wars"
17
+
18
+ # ── thesoundarchive.com — root-level files ──────────────────────────
19
+ ROOT_FILES=(
20
+ light-saber-on.wav
21
+ light-saber-off.wav
22
+ light-saber-battle.wav
23
+ blaster-firing.wav
24
+ set-for-stun.wav
25
+ force.wav
26
+ forcestrong.wav
27
+ forceisstrong.wav
28
+ disturbence.wav
29
+ chewy_roar.wav
30
+ Chewie-chatting.wav
31
+ R2D2.wav
32
+ R2D2-do.wav
33
+ R2D2-hey-you.wav
34
+ R2D2-yeah.wav
35
+ swvader01.wav
36
+ swvader02.wav
37
+ swvader03.wav
38
+ swvader04.wav
39
+ WilhelmScream.wav
40
+ alwaystwo.wav
41
+ Muchfear.wav
42
+ Revenge.wav
43
+ wipthemout.wav
44
+ obiwan_chosenone.wav
45
+ emp_lordvaderrise.wav
46
+ dange-disturb.wav
47
+ yoda_twisted.wav
48
+ rescue.wav
49
+ swluke01.wav
50
+ fool.wav
51
+ )
52
+
53
+ echo " Downloading Star Wars sounds from thesoundarchive.com..."
54
+
55
+ FAILED=0
56
+ for FILE in "${ROOT_FILES[@]}"; do
57
+ curl -sL -o "$SW_DIR/$FILE" "$BASE_URL/$FILE"
58
+ if [ ! -s "$SW_DIR/$FILE" ]; then
59
+ echo " Warning: Failed to download $FILE"
60
+ rm -f "$SW_DIR/$FILE"
61
+ FAILED=$((FAILED + 1))
62
+ fi
63
+ done
64
+
65
+ # ── thesoundarchive.com — subdirectory files ────────────────────────
66
+ EMPIRE_FILES=(
67
+ yodalaughing.wav
68
+ )
69
+
70
+ for FILE in "${EMPIRE_FILES[@]}"; do
71
+ curl -sL -o "$SW_DIR/empire/$FILE" "$BASE_URL/empire/$FILE"
72
+ if [ ! -s "$SW_DIR/empire/$FILE" ]; then
73
+ echo " Warning: Failed to download empire/$FILE"
74
+ rm -f "$SW_DIR/empire/$FILE"
75
+ FAILED=$((FAILED + 1))
76
+ fi
77
+ done
78
+
79
+ RETURN_FILES=(
80
+ jabba-the-hutt-laughing.wav
81
+ 900yearsold.wav
82
+ )
83
+
84
+ for FILE in "${RETURN_FILES[@]}"; do
85
+ curl -sL -o "$SW_DIR/return/$FILE" "$BASE_URL/return/$FILE"
86
+ if [ ! -s "$SW_DIR/return/$FILE" ]; then
87
+ echo " Warning: Failed to download return/$FILE"
88
+ rm -f "$SW_DIR/return/$FILE"
89
+ FAILED=$((FAILED + 1))
90
+ fi
91
+ done
92
+
93
+ # ── wavsource.com — supplemental clips ──────────────────────────────
94
+ echo " Downloading supplemental clips from wavsource.com..."
95
+
96
+ WAVSOURCE_FILES=(
97
+ bad_feeling.wav
98
+ trap.wav
99
+ your_father.wav
100
+ do_or_do_not.wav
101
+ dark_side.wav
102
+ destroy_you.wav
103
+ destiny.wav
104
+ )
105
+
106
+ for FILE in "${WAVSOURCE_FILES[@]}"; do
107
+ curl -sL -o "$SW_DIR/$FILE" "$WAVSOURCE_URL/$FILE"
108
+ if [ ! -s "$SW_DIR/$FILE" ]; then
109
+ echo " Warning: Failed to download $FILE from wavsource"
110
+ rm -f "$SW_DIR/$FILE"
111
+ FAILED=$((FAILED + 1))
112
+ fi
113
+ done
114
+
115
+ if [ "$FAILED" -gt 0 ]; then
116
+ echo " Warning: $FAILED file(s) failed to download."
117
+ fi
118
+
119
+ echo " Download complete."