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.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  Plays sound effects when sessions start, prompts are submitted, responses finish, errors occur, and more.
10
10
 
11
- Ships with a **WC3 Orc Peon** theme and a **Zelda: Ocarina of Time** theme. Bring your own sounds or create new themes.
11
+ Ships with 7 themes. Bring your own sounds or create new ones.
12
12
 
13
13
  *"Something need doing?"*
14
14
 
@@ -53,297 +53,19 @@ npx claude-code-sounds --uninstall # Remove all sounds and hooks
53
53
  npx claude-code-sounds --help # Show help
54
54
  ```
55
55
 
56
- ## WC3 Orc Peon Theme
56
+ ## Themes
57
57
 
58
- 57 sounds from Warcraft 3 Orc units mapped across 11 Claude Code lifecycle events.
59
-
60
- > After installing, preview all sounds with `./preview.sh` or a specific category with `./preview.sh start`
61
-
62
- <details open>
63
- <summary><b>start</b> — Session starting, being summoned (5 sounds)</summary>
64
-
65
- | Sound | Quote | Unit |
66
- |---|---|---|
67
- | `ready-to-work.wav` | *"Ready to work!"* | Peon |
68
- | `something-need-doing.wav` | *"Something need doing?"* | Peon |
69
- | `more-work.mp3` | *"More work?"* | Peon (WC2) |
70
- | `how-can-i-help.wav` | *"How can I help?"* | Shaman |
71
- | `someone-call-for-the-doctor.wav` | *"Someone call for the doctor?"* | Witch Doctor |
72
-
73
- </details>
74
-
75
- <details>
76
- <summary><b>prompt</b> — User submitted a prompt, acknowledging order (7 sounds)</summary>
77
-
78
- | Sound | Quote | Unit |
79
- |---|---|---|
80
- | `yes.wav` | *"Yes"* | Peon |
81
- | `dabu.wav` | *"Dabu"* | Grunt |
82
- | `zug-zug.wav` | *"Zug zug"* | Grunt |
83
- | `right-away.wav` | *"Right away"* | Shaman |
84
- | `immediately.wav` | *"Immediately!"* | Tauren |
85
- | `anything-you-want.wav` | *"Anything you want"* | Headhunter |
86
- | `more-work.mp3` | *"More work?"* | Peon (WC2) |
87
-
88
- </details>
89
-
90
- <details>
91
- <summary><b>stop</b> — Claude finished responding (9 sounds)</summary>
92
-
93
- | Sound | Quote | Unit |
94
- |---|---|---|
95
- | `zug-zug.wav` | *"Zug zug"* | Grunt |
96
- | `get-em.wav` | *"Get 'em!"* | Peon |
97
- | `ok.wav` | *"OK"* | Peon |
98
- | `i-can-do-that.wav` | *"I can do that"* | Peon |
99
- | `be-happy-to.wav` | *"Be happy to"* | Peon |
100
- | `understood.wav` | *"Understood"* | Shaman |
101
- | `of-course.wav` | *"Of course"* | Far Seer |
102
- | `it-is-certain.wav` | *"It is certain"* | Far Seer |
103
- | `whatever-you-say.wav` | *"Whatever you say"* | Grom Hellscream |
104
-
105
- </details>
106
-
107
- <details>
108
- <summary><b>permission</b> — Permission prompt, waiting for approval (5 sounds)</summary>
109
-
110
- | Sound | Quote | Unit |
111
- |---|---|---|
112
- | `hmmm.wav` | *"Hmmm?"* | Peon |
113
- | `what-you-want.wav` | *"What you want?"* | Peon |
114
- | `what-you-want-me-to-do.wav` | *"What you want me to do?"* | Headhunter |
115
- | `who-you-want-me-kill.wav` | *"Who you want me kill?"* | Headhunter |
116
- | `you-seek-me-help.wav` | *"You seek me help?"* | Witch Doctor |
117
-
118
- </details>
119
-
120
- <details>
121
- <summary><b>subagent</b> — Spawning a subagent (7 sounds)</summary>
122
-
123
- | Sound | Quote | Unit |
124
- |---|---|---|
125
- | `work-work.wav` | *"Work, work"* | Peon |
126
- | `zug-zug.wav` | *"Zug zug"* | Grunt |
127
- | `get-em.wav` | *"Get 'em!"* | Peon |
128
- | `ill-try.wav` | *"I'll try"* | Peon |
129
- | `why-not.wav` | *"Why not?"* | Peon |
130
- | `for-the-horde.wav` | *"For the Horde!"* | Grunt |
131
- | `taste-the-fury.wav` | *"Taste the fury of the Warsong!"* | Grom Hellscream |
132
-
133
- </details>
134
-
135
- <details>
136
- <summary><b>idle</b> — Waiting for user input (7 sounds)</summary>
137
-
138
- | Sound | Quote | Unit |
139
- |---|---|---|
140
- | `me-busy-leave-me-alone.wav` | *"Me busy, leave me alone!"* | Peon |
141
- | `no-time-for-play.wav` | *"No time for play!"* | Peon |
142
- | `me-not-that-kind-of-orc.wav` | *"Me not that kind of orc!"* | Peon |
143
- | `why-you-poking-me.wav` | *"Why are you poking me again?"* | Grunt |
144
- | `not-easy-being-green.wav` | *"It's not easy being green"* | Grunt |
145
- | `i-can-wait-no-longer.wav` | *"I can wait no longer!"* | Grom Hellscream |
146
- | `outlook-not-so-good.wav` | *"Outlook... not so good"* | Far Seer |
147
-
148
- </details>
149
-
150
- <details>
151
- <summary><b>error</b> — Tool call failed (4 sounds)</summary>
152
-
153
- | Sound | Quote | Unit |
154
- |---|---|---|
155
- | `peon-death.wav` | *(death sound)* | Peon |
156
- | `grunt-death.wav` | *(death sound)* | Grunt |
157
- | `headhunter-death.wav` | *(death sound)* | Headhunter |
158
- | `reply-hazy-try-again.wav` | *"Reply hazy, try again"* | Far Seer |
159
-
160
- </details>
161
-
162
- <details>
163
- <summary><b>end</b> — Session ending (3 sounds)</summary>
164
-
165
- | Sound | Quote | Unit |
166
- |---|---|---|
167
- | `well-done.wav` | *"Well done!"* | Tauren |
168
- | `finally.wav` | *"Finally!"* | Grom Hellscream |
169
- | `okie-dokie.wav` | *"Okie dokie"* | Peon |
170
-
171
- </details>
172
-
173
- <details>
174
- <summary><b>task-completed</b> — Task marked done (2 sounds)</summary>
175
-
176
- | Sound | Quote | Unit |
177
- |---|---|---|
178
- | `well-done.wav` | *"Well done!"* | Tauren |
179
- | `finally.wav` | *"Finally!"* | Grom Hellscream |
180
-
181
- </details>
182
-
183
- <details>
184
- <summary><b>compact</b> — Context compaction, memory fading (4 sounds)</summary>
185
-
186
- | Sound | Quote | Unit |
187
- |---|---|---|
188
- | `concentrate-and-ask-again.wav` | *"Concentrate... and ask again"* | Far Seer |
189
- | `reply-hazy-try-again.wav` | *"Reply hazy, try again"* | Far Seer |
190
- | `i-can-wait-no-longer.wav` | *"I can wait no longer!"* | Grom Hellscream |
191
- | `death.wav` | *(death sound)* | Peon |
192
-
193
- </details>
194
-
195
- <details>
196
- <summary><b>teammate-idle</b> — Teammate went idle (4 sounds)</summary>
197
-
198
- | Sound | Quote | Unit |
199
- |---|---|---|
200
- | `what.wav` | *"What?!"* | Peon |
201
- | `me-busy-leave-me-alone.wav` | *"Me busy, leave me alone!"* | Peon |
202
- | `no-time-for-play.wav` | *"No time for play!"* | Peon |
203
- | `i-can-wait-no-longer.wav` | *"I can wait no longer!"* | Grom Hellscream |
204
-
205
- </details>
206
-
207
- ## Zelda: Ocarina of Time Theme
208
-
209
- 47 sounds from Navi, Link, Ganondorf, and iconic OOT jingles mapped across 11 Claude Code lifecycle events.
210
-
211
- *"Hey! Listen!"*
212
-
213
- <details open>
214
- <summary><b>start</b> — Session starting, Navi greets you (5 sounds)</summary>
215
-
216
- | Sound | Description | Source |
217
- |---|---|---|
218
- | `hey.wav` | *"Hey!"* | Navi |
219
- | `hello.wav` | *"Hello!"* | Navi |
220
- | `listen.wav` | *"Listen!"* | Navi |
221
- | `great-fairy-laugh.wav` | *(magical laugh)* | Great Fairy |
222
- | `open-chest.wav` | *(opening big chest)* | SFX |
223
-
224
- </details>
225
-
226
- <details>
227
- <summary><b>prompt</b> — User submitted a prompt, adventure continues (5 sounds)</summary>
228
-
229
- | Sound | Description | Source |
230
- |---|---|---|
231
- | `hey.wav` | *"Hey!"* | Navi |
232
- | `look.wav` | *"Look!"* | Navi |
233
- | `menu-select.wav` | *(menu select)* | SFX |
234
- | `dialogue-next.wav` | *(continue dialogue)* | SFX |
235
- | `get-heart.wav` | *(get heart)* | SFX |
236
-
237
- </details>
238
-
239
- <details>
240
- <summary><b>stop</b> — Claude finished responding (5 sounds)</summary>
241
-
242
- | Sound | Description | Source |
243
- |---|---|---|
244
- | `secret-discovered.wav` | *(secret jingle)* | SFX |
245
- | `get-item.wav` | *(get small item)* | SFX |
246
- | `get-rupee.wav` | *(get rupee)* | SFX |
247
- | `open-small-chest.wav` | *(open small chest)* | SFX |
248
- | `song-correct.wav` | *(song played correctly)* | SFX |
249
-
250
- </details>
251
-
252
- <details>
253
- <summary><b>permission</b> — Permission prompt, waiting for approval (5 sounds)</summary>
254
-
255
- | Sound | Description | Source |
256
- |---|---|---|
257
- | `watch-out.wav` | *"Watch out!"* | Navi |
258
- | `hey.wav` | *"Hey!"* | Navi |
259
- | `listen.wav` | *"Listen!"* | Navi |
260
- | `pause-menu.wav` | *(pause menu open)* | SFX |
261
- | `z-target.wav` | *(Z-target enemy)* | SFX |
262
-
263
- </details>
264
-
265
- <details>
266
- <summary><b>subagent</b> — Spawning a subagent (5 sounds)</summary>
267
-
268
- | Sound | Description | Source |
269
- |---|---|---|
270
- | `sword-draw.wav` | *(draw sword)* | SFX |
271
- | `link-attack.wav` | *(attack shout)* | Adult Link |
272
- | `link-strong-attack.wav` | *(strong attack)* | Adult Link |
273
- | `hey.wav` | *"Hey!"* | Navi |
274
- | `spin-attack.wav` | *(spin attack)* | SFX |
275
-
276
- </details>
277
-
278
- <details>
279
- <summary><b>idle</b> — Waiting for user input (5 sounds)</summary>
280
-
281
- | Sound | Description | Source |
58
+ | Theme | Sounds | Vibe |
282
59
  |---|---|---|
283
- | `hey.wav` | *"Hey!"* | Navi |
284
- | `listen.wav` | *"Listen!"* | Navi |
285
- | `watch-out.wav` | *"Watch out!"* | Navi |
286
- | `low-health.wav` | *(low health beep)* | SFX |
287
- | `snore.wav` | *(Talon snoring)* | Talon |
60
+ | **WC3 Orc Peon** (`wc3-peon`) | 57 | *"Something need doing?"* Peons, Grunts, Shamans, and Grom Hellscream |
61
+ | **Zelda: Ocarina of Time** (`zelda-oot`) | 47 | *"Hey! Listen!"* Navi, Link, and iconic OOT jingles |
62
+ | **Super Mario Bros** (`mario`) | 47 | *"Let's-a go!"* Coins, power-ups, and Mario's voice from NES to N64 |
63
+ | **Star Wars** (`star-wars`) | 36 | *"May the Force be with you"* Lightsabers, R2-D2, and the dark side |
64
+ | **Metal Gear Solid** (`mgs`) | 40 | *"Kept you waiting, huh?"* Codec calls, alert sounds, and Snake |
65
+ | **Pokemon Gen 1** (`pokemon-gen1`) | 49 | *"Wild PIKACHU appeared!"* — Cries, battle sounds, and Kanto menus |
66
+ | **Portal** (`portal`) | 42 | *"Are you still there?"* — Turrets, portal guns, and Aperture Science |
288
67
 
289
- </details>
290
-
291
- <details>
292
- <summary><b>error</b> — Tool call failed (4 sounds)</summary>
293
-
294
- | Sound | Description | Source |
295
- |---|---|---|
296
- | `error.wav` | *(error sound)* | SFX |
297
- | `song-error.wav` | *(wrong note)* | SFX |
298
- | `link-hurt.wav` | *(Link hurt)* | Adult Link |
299
- | `ganondorf-laugh.wav` | *(Ganondorf laughing)* | Ganondorf |
300
-
301
- </details>
302
-
303
- <details>
304
- <summary><b>end</b> — Session ending (3 sounds)</summary>
305
-
306
- | Sound | Description | Source |
307
- |---|---|---|
308
- | `item-fanfare.wav` | *(item fanfare)* | SFX |
309
- | `secret-discovered.wav` | *(secret jingle)* | SFX |
310
- | `dialogue-done.wav` | *(dialogue finished)* | SFX |
311
-
312
- </details>
313
-
314
- <details>
315
- <summary><b>task-completed</b> — Task marked done (2 sounds)</summary>
316
-
317
- | Sound | Description | Source |
318
- |---|---|---|
319
- | `item-fanfare.wav` | *(item fanfare)* | SFX |
320
- | `secret-discovered.wav` | *(secret jingle)* | SFX |
321
-
322
- </details>
323
-
324
- <details>
325
- <summary><b>compact</b> — Context compaction, health running low (4 sounds)</summary>
326
-
327
- | Sound | Description | Source |
328
- |---|---|---|
329
- | `low-health.wav` | *(low health beep)* | SFX |
330
- | `pause-close.wav` | *(pause menu close)* | SFX |
331
- | `watch-out.wav` | *"Watch out!"* | Navi |
332
- | `error.wav` | *(error sound)* | SFX |
333
-
334
- </details>
335
-
336
- <details>
337
- <summary><b>teammate-idle</b> — Teammate went idle (4 sounds)</summary>
338
-
339
- | Sound | Description | Source |
340
- |---|---|---|
341
- | `hey.wav` | *"Hey!"* | Navi |
342
- | `listen.wav` | *"Listen!"* | Navi |
343
- | `watch-out.wav` | *"Watch out!"* | Navi |
344
- | `low-health.wav` | *(low health beep)* | SFX |
345
-
346
- </details>
68
+ Each theme maps sounds across all 11 Claude Code lifecycle events. Preview installed sounds with `./preview.sh`.
347
69
 
348
70
  ## Hook Events
349
71
 
@@ -426,4 +148,4 @@ This removes all sound files, the hook script, and the hooks config from `settin
426
148
 
427
149
  ## Disclaimer
428
150
 
429
- Sound files are downloaded from third-party sources at install time and are not included in this repository. Warcraft audio is property of Blizzard Entertainment. Zelda audio is property of Nintendo.
151
+ Sound files are downloaded from third-party sources at install time and are not included in this repository. All game audio is property of its respective owners: Blizzard Entertainment (Warcraft), Nintendo (Zelda, Mario, Pokemon), Lucasfilm/Disney (Star Wars), Konami (Metal Gear Solid), and Valve (Portal).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-sounds",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Sound themes for Claude Code lifecycle hooks",
5
5
  "bin": {
6
6
  "claude-code-sounds": "bin/cli.js"
@@ -0,0 +1,123 @@
1
+ #!/bin/bash
2
+ #
3
+ # Downloads sound files for the mario 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
+ MARIO_DIR="$TMP_DIR/Mario"
12
+
13
+ mkdir -p "$MARIO_DIR/smb" "$MARIO_DIR/sm64" "$MARIO_DIR/smw" "$MARIO_DIR/smb3"
14
+
15
+ BASE="https://themushroomkingdom.net/sounds/wav"
16
+
17
+ # --- Super Mario Bros. (NES) ---
18
+ SMB_FILES=(
19
+ smb_1-up.wav
20
+ smb_breakblock.wav
21
+ smb_bump.wav
22
+ smb_coin.wav
23
+ smb_fireball.wav
24
+ smb_flagpole.wav
25
+ smb_gameover.wav
26
+ smb_mariodie.wav
27
+ smb_pause.wav
28
+ smb_pipe.wav
29
+ smb_powerup.wav
30
+ smb_powerup_appears.wav
31
+ smb_stage_clear.wav
32
+ smb_stomp.wav
33
+ smb_vine.wav
34
+ smb_world_clear.wav
35
+ )
36
+
37
+ # --- Super Mario 64 (N64) ---
38
+ SM64_FILES=(
39
+ sm64_mario_burned.wav
40
+ sm64_mario_doh.wav
41
+ sm64_mario_haha.wav
42
+ sm64_mario_hello.wav
43
+ sm64_mario_here_we_go.wav
44
+ sm64_mario_hurt.wav
45
+ sm64_mario_its_me.wav
46
+ sm64_mario_lets_go.wav
47
+ sm64_mario_mamma-mia.wav
48
+ sm64_mario_okey-dokey.wav
49
+ sm64_mario_oof.wav
50
+ sm64_mario_snore_part1.wav
51
+ sm64_mario_tired.wav
52
+ sm64_mario_waha.wav
53
+ sm64_mario_whoa.wav
54
+ sm64_mario_yahoo.wav
55
+ sm64_mario_yawn.wav
56
+ sm64_mario_yippee.wav
57
+ sm64_happy_message.wav
58
+ sm64_star_appears.wav
59
+ sm64_warp.wav
60
+ )
61
+
62
+ # --- Super Mario World (SNES) ---
63
+ SMW_FILES=(
64
+ smw_1-up.wav
65
+ smw_message_block.wav
66
+ smw_pipe.wav
67
+ smw_power-up.wav
68
+ )
69
+
70
+ # --- Super Mario Bros. 3 (NES) ---
71
+ SMB3_FILES=(
72
+ smb3_level_clear.wav
73
+ smb3_lost_suit.wav
74
+ smb3_power-up.wav
75
+ smb3_raccoon_transform.wav
76
+ smb3_whistle.wav
77
+ )
78
+
79
+ echo " Downloading Super Mario sounds..."
80
+
81
+ FAILED=0
82
+
83
+ for FILE in "${SMB_FILES[@]}"; do
84
+ curl -sL -o "$MARIO_DIR/smb/$FILE" "$BASE/smb/$FILE"
85
+ if ! file "$MARIO_DIR/smb/$FILE" | grep -q "WAVE\|RIFF"; then
86
+ echo " Warning: Failed to download smb/$FILE"
87
+ rm -f "$MARIO_DIR/smb/$FILE"
88
+ FAILED=$((FAILED + 1))
89
+ fi
90
+ done
91
+
92
+ for FILE in "${SM64_FILES[@]}"; do
93
+ curl -sL -o "$MARIO_DIR/sm64/$FILE" "$BASE/sm64/$FILE"
94
+ if ! file "$MARIO_DIR/sm64/$FILE" | grep -q "WAVE\|RIFF"; then
95
+ echo " Warning: Failed to download sm64/$FILE"
96
+ rm -f "$MARIO_DIR/sm64/$FILE"
97
+ FAILED=$((FAILED + 1))
98
+ fi
99
+ done
100
+
101
+ for FILE in "${SMW_FILES[@]}"; do
102
+ curl -sL -o "$MARIO_DIR/smw/$FILE" "$BASE/smw/$FILE"
103
+ if ! file "$MARIO_DIR/smw/$FILE" | grep -q "WAVE\|RIFF"; then
104
+ echo " Warning: Failed to download smw/$FILE"
105
+ rm -f "$MARIO_DIR/smw/$FILE"
106
+ FAILED=$((FAILED + 1))
107
+ fi
108
+ done
109
+
110
+ for FILE in "${SMB3_FILES[@]}"; do
111
+ curl -sL -o "$MARIO_DIR/smb3/$FILE" "$BASE/smb3/$FILE"
112
+ if ! file "$MARIO_DIR/smb3/$FILE" | grep -q "WAVE\|RIFF"; then
113
+ echo " Warning: Failed to download smb3/$FILE"
114
+ rm -f "$MARIO_DIR/smb3/$FILE"
115
+ FAILED=$((FAILED + 1))
116
+ fi
117
+ done
118
+
119
+ if [ "$FAILED" -gt 0 ]; then
120
+ echo " Warning: $FAILED file(s) failed to download."
121
+ fi
122
+
123
+ echo " Download complete."
@@ -0,0 +1,110 @@
1
+ {
2
+ "name": "Super Mario Bros",
3
+ "description": "Iconic Super Mario sound effects from NES, SNES, and N64 — coins, power-ups, and Mario's voice",
4
+ "author": "ryparker",
5
+ "srcBase": "Mario",
6
+ "sounds": {
7
+ "start": {
8
+ "description": "Session starting — here we go!",
9
+ "files": [
10
+ { "src": "sm64/sm64_mario_lets_go.wav", "name": "lets-a-go.wav" },
11
+ { "src": "sm64/sm64_mario_here_we_go.wav", "name": "here-we-go.wav" },
12
+ { "src": "sm64/sm64_mario_its_me.wav", "name": "its-a-me-mario.wav" },
13
+ { "src": "sm64/sm64_mario_hello.wav", "name": "hello.wav" },
14
+ { "src": "smb/smb_1-up.wav", "name": "1-up.wav" }
15
+ ]
16
+ },
17
+ "end": {
18
+ "description": "Session over — course clear",
19
+ "files": [
20
+ { "src": "smb/smb_stage_clear.wav", "name": "stage-clear.wav" },
21
+ { "src": "smb/smb_world_clear.wav", "name": "world-clear.wav" },
22
+ { "src": "smb/smb_flagpole.wav", "name": "flagpole.wav" },
23
+ { "src": "sm64/sm64_mario_okey-dokey.wav", "name": "okey-dokey.wav" }
24
+ ]
25
+ },
26
+ "prompt": {
27
+ "description": "User submitted prompt — coin collected",
28
+ "files": [
29
+ { "src": "smb/smb_coin.wav", "name": "coin.wav" },
30
+ { "src": "smb/smb_bump.wav", "name": "block-bump.wav" },
31
+ { "src": "smb/smb_fireball.wav", "name": "fireball.wav" },
32
+ { "src": "sm64/sm64_mario_haha.wav", "name": "haha.wav" }
33
+ ]
34
+ },
35
+ "stop": {
36
+ "description": "Done responding — power-up complete",
37
+ "files": [
38
+ { "src": "smb/smb_powerup.wav", "name": "power-up.wav" },
39
+ { "src": "smw/smw_power-up.wav", "name": "smw-power-up.wav" },
40
+ { "src": "smb3/smb3_power-up.wav", "name": "smb3-power-up.wav" },
41
+ { "src": "smb/smb_stomp.wav", "name": "stomp.wav" }
42
+ ]
43
+ },
44
+ "permission": {
45
+ "description": "Permission prompt — question block",
46
+ "files": [
47
+ { "src": "smb/smb_pause.wav", "name": "pause.wav" },
48
+ { "src": "smb/smb_powerup_appears.wav", "name": "question-block.wav" },
49
+ { "src": "smw/smw_message_block.wav", "name": "message-block.wav" },
50
+ { "src": "smb3/smb3_whistle.wav", "name": "warp-whistle.wav" }
51
+ ]
52
+ },
53
+ "idle": {
54
+ "description": "Waiting for input — Mario is bored",
55
+ "files": [
56
+ { "src": "sm64/sm64_mario_snore_part1.wav", "name": "snore.wav" },
57
+ { "src": "sm64/sm64_mario_yawn.wav", "name": "yawn.wav" },
58
+ { "src": "sm64/sm64_mario_tired.wav", "name": "tired.wav" },
59
+ { "src": "sm64/sm64_mario_mamma-mia.wav", "name": "mamma-mia.wav" }
60
+ ]
61
+ },
62
+ "subagent": {
63
+ "description": "Spawning subagent — summoning helper",
64
+ "files": [
65
+ { "src": "smb/smb_powerup_appears.wav", "name": "mushroom-appears.wav" },
66
+ { "src": "smb/smb_vine.wav", "name": "vine-grow.wav" },
67
+ { "src": "smb3/smb3_raccoon_transform.wav", "name": "raccoon-transform.wav" },
68
+ { "src": "sm64/sm64_mario_yahoo.wav", "name": "yahoo.wav" }
69
+ ]
70
+ },
71
+ "error": {
72
+ "description": "Tool failure — took damage",
73
+ "files": [
74
+ { "src": "smb/smb_mariodie.wav", "name": "death.wav" },
75
+ { "src": "sm64/sm64_mario_hurt.wav", "name": "hurt.wav" },
76
+ { "src": "sm64/sm64_mario_burned.wav", "name": "burned.wav" },
77
+ { "src": "sm64/sm64_mario_doh.wav", "name": "doh.wav" },
78
+ { "src": "sm64/sm64_mario_oof.wav", "name": "oof.wav" },
79
+ { "src": "smb/smb_gameover.wav", "name": "game-over.wav" }
80
+ ]
81
+ },
82
+ "task-completed": {
83
+ "description": "Task finished — star collected",
84
+ "files": [
85
+ { "src": "sm64/sm64_star_appears.wav", "name": "star-appears.wav" },
86
+ { "src": "smb3/smb3_level_clear.wav", "name": "level-clear.wav" },
87
+ { "src": "sm64/sm64_happy_message.wav", "name": "happy-message.wav" },
88
+ { "src": "sm64/sm64_mario_yippee.wav", "name": "yippee.wav" }
89
+ ]
90
+ },
91
+ "compact": {
92
+ "description": "Context compaction — pipe warp",
93
+ "files": [
94
+ { "src": "smb/smb_pipe.wav", "name": "pipe-warp.wav" },
95
+ { "src": "smw/smw_pipe.wav", "name": "smw-pipe.wav" },
96
+ { "src": "sm64/sm64_warp.wav", "name": "warp.wav" },
97
+ { "src": "smb3/smb3_lost_suit.wav", "name": "shrink.wav" }
98
+ ]
99
+ },
100
+ "teammate-idle": {
101
+ "description": "Teammate went idle — notification",
102
+ "files": [
103
+ { "src": "smw/smw_1-up.wav", "name": "smw-1-up.wav" },
104
+ { "src": "smb/smb_breakblock.wav", "name": "break-block.wav" },
105
+ { "src": "sm64/sm64_mario_whoa.wav", "name": "whoa.wav" },
106
+ { "src": "sm64/sm64_mario_waha.wav", "name": "waha.wav" }
107
+ ]
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,74 @@
1
+ #!/bin/bash
2
+ #
3
+ # Downloads sound files for the mgs (Metal Gear Solid) 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
+ MGS_DIR="$TMP_DIR/MGS"
12
+
13
+ mkdir -p "$MGS_DIR"
14
+
15
+ BASE_URL="https://www.myinstants.com/media/sounds"
16
+
17
+ # All unique sound files needed by this theme
18
+ FILES=(
19
+ codec.mp3
20
+ metalgearcodec.mp3
21
+ mgs2-snake-kept-you-waiting-huh.mp3
22
+ codec-send.mp3
23
+ metal_gear_solid_exit_sound_effect.mp3
24
+ metal_gear_solid_exit_sound_effect_EQbXTbY.mp3
25
+ mgs2-snake-sweet-dreams-boyscout.mp3
26
+ sfx_s_mission_qualify.mp3
27
+ mgs2-snake-roger-that-sir.mp3
28
+ mgs2-snake-sounds-like-a-plan.mp3
29
+ mgs2-snake-ill-do-my-best.mp3
30
+ mgs2-snake-if-you-say-so.mp3
31
+ mgs2-snake-good-shooting.mp3
32
+ tindeck_1.mp3
33
+ metal-gear-alert-sound-effect_XKoHReZ.mp3
34
+ what-was-that-noise.mp3
35
+ untitled_1150.mp3
36
+ why_are_we_still_here_just_to_suffer_2.mp3
37
+ cigar.mp3
38
+ metalgeargameov5235.mp3
39
+ metal-gear-solid-solid-snake-scream.mp3
40
+ snake-dies-game-over.mp3
41
+ metal_gear_solid_game_over_screen_clean_background-1.mp3
42
+ mgs2-snake-what-the-hell-is-going-on-here.mp3
43
+ youre-pretty-good_I5kzLtx.mp3
44
+ metal-gear-item-drop.mp3
45
+ metalgearsolid.swf.mp3
46
+ original-metal-gear-solid-game-over-screen.mp3
47
+ ocelot-meowing.mp3
48
+ mgs2-snake-friendly-fire.mp3
49
+ )
50
+
51
+ echo " Downloading Metal Gear Solid sounds..."
52
+
53
+ FAILED=0
54
+ for FILE in "${FILES[@]}"; do
55
+ if ! curl -sL -o "$MGS_DIR/$FILE" "$BASE_URL/$FILE"; then
56
+ echo " Warning: Failed to download $FILE"
57
+ rm -f "$MGS_DIR/$FILE"
58
+ FAILED=$((FAILED + 1))
59
+ continue
60
+ fi
61
+
62
+ # Verify we got a valid audio file (not an HTML error page)
63
+ if file "$MGS_DIR/$FILE" | grep -q "HTML"; then
64
+ echo " Warning: $FILE returned HTML instead of audio"
65
+ rm -f "$MGS_DIR/$FILE"
66
+ FAILED=$((FAILED + 1))
67
+ fi
68
+ done
69
+
70
+ if [ "$FAILED" -gt 0 ]; then
71
+ echo " Warning: $FAILED file(s) failed to download."
72
+ fi
73
+
74
+ echo " Download complete."