1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
12 #include "libgame/libgame.h"
16 // List values that are not defined in the configuration file are set to
17 // reliable default values. If that value is SND_ARG_UNDEFINED, it will
18 // be dynamically determined, using some of the other list values.
20 struct ConfigTypeInfo sound_config_suffix[] =
22 { ".mode_loop", ARG_UNDEFINED, TYPE_BOOLEAN },
23 { ".volume", "100", TYPE_INTEGER },
24 { ".priority", "0", TYPE_INTEGER },
29 struct ConfigInfo sound_config[] =
31 // some default sounds
32 { "[default].digging", "schlurf.wav" },
33 { "[default].collecting", "pong.wav" },
34 { "[default].snapping", "pong.wav" },
35 { "[default].pushing", "pusch.wav" },
36 { "[default].impact", "klopf.wav" },
37 { "[default].walking", "empty.wav" },
38 { "[default].passing", "gate.wav" },
39 { "[default].dying", "autsch.wav" },
40 { "[default].exploding", "roaaar.wav" },
41 { "[default].hitting", "kink.wav" },
42 { "[sp_default].exploding", "booom.wav" },
43 { "[mm_default].exploding", "kabumm.wav" },
45 // sounds for Boulder Dash style elements and actions
46 { "bd_diamond.collecting", "pong.wav" },
47 { "bd_diamond.impact", "pling.wav" },
48 { "bd_rock.pushing", "pusch.wav" },
49 { "bd_rock.impact", "klopf.wav" },
50 { "bd_magic_wall.activating", "quirk.wav" },
51 { "bd_magic_wall.active", "miep.wav" },
52 { "bd_magic_wall.filling", "quirk.wav" },
53 { "bd_amoeba.waiting", UNDEFINED_FILENAME },
54 { "bd_amoeba.growing", "amoebe.wav" },
55 { "bd_amoeba.turning_to_gem", "pling.wav" },
56 { "bd_amoeba.turning_to_gem.mode_loop", "false" },
57 { "bd_amoeba.turning_to_rock", "klopf.wav" },
58 { "bd_amoeba.turning_to_rock.mode_loop", "false" },
59 { "bd_butterfly.moving", "klapper.wav" },
60 { "bd_butterfly.waiting", "klapper.wav" },
61 { "bd_firefly.moving", "roehr.wav" },
62 { "bd_firefly.waiting", "roehr.wav" },
64 // sounds for Supaplex style elements and actions
65 { "sp_base.digging", "base.wav" },
66 { "sp_buggy_base.digging", "base.wav" },
67 { "sp_buggy_base.active", "bug.wav" },
68 { "sp_infotron.collecting", "infotron.wav" },
69 { "sp_infotron.impact", "pling.wav" },
70 { "sp_zonk.pushing", "zonkpush.wav" },
71 { "sp_zonk.impact", "zonkdown.wav" },
72 { "sp_disk_red.collecting", "infotron.wav" },
73 { "sp_disk_orange.pushing", "zonkpush.wav" },
74 { "sp_disk_yellow.pushing", "pusch.wav" },
75 { "[sp_port].passing", "gate.wav" },
76 { "[sp_exit].passing", "exit.wav" },
77 { "[sp_exit].opening", UNDEFINED_FILENAME },
78 { "[sp_exit].closing", UNDEFINED_FILENAME },
79 { "sp_sniksnak.moving", UNDEFINED_FILENAME },
80 { "sp_sniksnak.waiting", UNDEFINED_FILENAME },
81 { "sp_electron.moving", UNDEFINED_FILENAME },
82 { "sp_electron.waiting", UNDEFINED_FILENAME },
83 { "sp_terminal.activating", UNDEFINED_FILENAME },
84 { "sp_terminal.active", UNDEFINED_FILENAME },
86 // sounds for Sokoban style elements and actions
87 { "[sokoban].pushing", "pusch.wav" },
88 { "[sokoban].filling", "deng.wav" },
89 { "[sokoban].emptying", UNDEFINED_FILENAME },
91 // sounds for Emerald Mine style elements and actions
92 { "[player].moving", "empty.wav" },
93 { "[player].moving.mode_loop", "false" },
94 { "sand.digging", "schlurf.wav" },
95 { "[emerald].collecting", "pong.wav" },
96 { "[emerald].impact", "pling.wav" },
97 { "diamond.collecting", "pong.wav" },
98 { "diamond.impact", "pling.wav" },
99 { "diamond.breaking", "quirk.wav" },
100 { "rock.pushing", "pusch.wav" },
101 { "rock.impact", "klopf.wav" },
102 { "bomb.pushing", "pusch.wav" },
103 { "nut.pushing", "knurk.wav" },
104 { "nut.breaking", "knack.wav" },
105 { "nut.impact", "klumpf.wav" },
106 { "[dynamite].collecting", "pong.wav" },
107 { "[dynamite].dropping", "deng.wav" },
108 { "[dynamite].active", "zisch.wav" },
109 { "[key].collecting", "pong.wav" },
110 { "[gate].passing", "gate.wav" },
111 { "bug.moving", "klapper.wav" },
112 { "bug.waiting", "klapper.wav" },
113 { "spaceship.moving", "roehr.wav" },
114 { "spaceship.waiting", "roehr.wav" },
115 { "yamyam.moving", UNDEFINED_FILENAME },
116 { "yamyam.waiting", "njam.wav" },
117 { "yamyam.digging", "njam.wav" },
118 { "robot.moving", "schlurf.wav" },
119 { "robot.moving.mode_loop", "false" },
120 { "robot.waiting", UNDEFINED_FILENAME },
121 { "robot_wheel.activating", "deng.wav" },
122 { "robot_wheel.active", "miep.wav" },
123 { "magic_wall.activating", "quirk.wav" },
124 { "magic_wall.active", "miep.wav" },
125 { "magic_wall.filling", "quirk.wav" },
126 { "dc_magic_wall.activating", "quirk.wav" },
127 { "dc_magic_wall.active", "miep.wav" },
128 { "dc_magic_wall.filling", "quirk.wav" },
129 { "[amoeba].waiting", UNDEFINED_FILENAME },
130 { "[amoeba].growing", "amoebe.wav" },
131 { "[amoeba].dropping", UNDEFINED_FILENAME },
132 { "acid.splashing", "blurb.wav" },
133 { "[quicksand].filling", UNDEFINED_FILENAME },
134 { "[quicksand].emptying", UNDEFINED_FILENAME },
135 { "[exit].opening", "oeffnen.wav" },
136 { "[exit].closing", "oeffnen.wav" },
137 { "[exit].passing", "buing.wav" },
138 { "[steel_exit].opening", "oeffnen.wav" },
139 { "[steel_exit].closing", "oeffnen.wav" },
140 { "[steel_exit].passing", "buing.wav" },
141 { "[em_exit].opening", "gong.wav" },
142 { "[em_exit].closing", UNDEFINED_FILENAME },
143 { "[em_exit].passing", "buing.wav" },
144 { "[em_steel_exit].opening", "gong.wav" },
145 { "[em_steel_exit].closing", UNDEFINED_FILENAME },
146 { "[em_steel_exit].passing", "buing.wav" },
147 { "penguin.passing", "buing.wav" },
149 // sounds for Emerald Mine Club style elements and actions
150 { "balloon.moving", UNDEFINED_FILENAME },
151 { "balloon.waiting", UNDEFINED_FILENAME },
152 { "balloon.pushing", "schlurf.wav" },
153 { "[balloon_switch].activating", UNDEFINED_FILENAME },
154 { "spring.moving", UNDEFINED_FILENAME },
155 { "spring.pushing", "pusch.wav" },
156 { "spring.impact", "klopf.wav" },
157 { "[wall].growing", UNDEFINED_FILENAME },
158 { "emc_android.pushing", "pusch.wav" },
159 { "emc_android.moving", "roehr.wav" },
160 { "emc_android.moving.mode_loop", "false" },
161 { "emc_android.dropping", "deng.wav" },
162 { "emc_magic_ball.dropping", "deng.wav" },
164 // sounds for Diamond Caves style elements and actions
165 { "pearl.collecting", "pong.wav" },
166 { "pearl.breaking", "knack.wav" },
167 { "pearl.impact", "pling.wav" },
168 { "crystal.collecting", "pong.wav" },
169 { "crystal.impact", "pling.wav" },
170 { "[envelope].collecting", "pong.wav" },
171 { "[envelope].opening", UNDEFINED_FILENAME },
172 { "[envelope].closing", UNDEFINED_FILENAME },
173 { "invisible_sand.digging", "schlurf.wav" },
174 { "invisible_sand.active.digging", "schlurf.wav" },
175 { "shield_normal.collecting", "pong.wav" },
176 { "shield_normal.active", UNDEFINED_FILENAME },
177 { "shield_deadly.collecting", "pong.wav" },
178 { "shield_deadly.active", UNDEFINED_FILENAME },
179 { "extra_time.collecting", "gong.wav" },
180 { "mole.moving", UNDEFINED_FILENAME },
181 { "mole.waiting", UNDEFINED_FILENAME },
182 { "mole.digging", "blurb.wav" },
183 { "[switchgate_switch].activating", UNDEFINED_FILENAME },
184 { "[switchgate].opening", "oeffnen.wav" },
185 { "[switchgate].closing", "oeffnen.wav" },
186 { "[switchgate].passing", "gate.wav" },
187 { "[timegate_switch].activating", "deng.wav" },
188 { "[timegate_switch].active", "miep.wav" },
189 { "[timegate_switch].deactivating", UNDEFINED_FILENAME },
190 { "[timegate].opening", "oeffnen.wav" },
191 { "[timegate].closing", "oeffnen.wav" },
192 { "[timegate].passing", "gate.wav" },
193 { "[conveyor_belt_switch].activating",UNDEFINED_FILENAME },
194 { "[conveyor_belt].active", UNDEFINED_FILENAME },
195 { "[conveyor_belt_switch].deactivating",UNDEFINED_FILENAME },
196 { "light_switch.activating", UNDEFINED_FILENAME },
197 { "light_switch.deactivating", UNDEFINED_FILENAME },
199 // sounds for DX Boulderdash style elements and actions
200 { "dx_supabomb.pushing", "pusch.wav" },
201 { "trap.digging", "schlurf.wav" },
202 { "trap.activating", UNDEFINED_FILENAME },
203 { "[tube].walking", UNDEFINED_FILENAME },
205 // sounds for Rocks'n'Diamonds style elements and actions
206 { "amoeba.turning_to_gem", "pling.wav" },
207 { "amoeba.turning_to_gem.mode_loop", "false" },
208 { "amoeba.turning_to_rock", "klopf.wav" },
209 { "amoeba.turning_to_rock.mode_loop", "false" },
210 { "speed_pill.collecting", "pong.wav" },
211 { "dynabomb_increase_number.collecting","pong.wav" },
212 { "dynabomb_increase_size.collecting","pong.wav" },
213 { "dynabomb_increase_power.collecting","pong.wav" },
214 { "[dynabomb].dropping", "deng.wav" },
215 { "[dynabomb].active", "zisch.wav" },
216 { "satellite.moving", UNDEFINED_FILENAME },
217 { "satellite.waiting", UNDEFINED_FILENAME },
218 { "satellite.pushing", "pusch.wav" },
219 { "lamp.activating", "deng.wav" },
220 { "lamp.deactivating", "deng.wav" },
221 { "time_orb_full.collecting", "gong.wav" },
222 { "time_orb_full.impact", "deng.wav" },
223 { "time_orb_empty.pushing", "pusch.wav" },
224 { "time_orb_empty.impact", "deng.wav" },
225 { "game_of_life.waiting", UNDEFINED_FILENAME },
226 { "game_of_life.growing", "amoebe.wav" },
227 { "biomaze.waiting", UNDEFINED_FILENAME },
228 { "biomaze.growing", "amoebe.wav" },
229 { "pacman.moving", UNDEFINED_FILENAME },
230 { "pacman.waiting", UNDEFINED_FILENAME },
231 { "pacman.digging", UNDEFINED_FILENAME },
232 { "dark_yamyam.moving", UNDEFINED_FILENAME },
233 { "dark_yamyam.waiting", "njam.wav" },
234 { "dark_yamyam.digging", UNDEFINED_FILENAME },
235 { "penguin.moving", UNDEFINED_FILENAME },
236 { "penguin.waiting", UNDEFINED_FILENAME },
237 { "pig.moving", UNDEFINED_FILENAME },
238 { "pig.waiting", UNDEFINED_FILENAME },
239 { "pig.digging", UNDEFINED_FILENAME },
240 { "dragon.moving", UNDEFINED_FILENAME },
241 { "dragon.waiting", UNDEFINED_FILENAME },
242 { "dragon.attacking", UNDEFINED_FILENAME },
244 // sounds for Mirror Magic style elements and actions
245 { "[mm_mcduffin].hitting", "autsch.wav" },
246 { "[mm_mirror].hitting", "laser.wav" },
247 { "[mm_mirror_fixed].hitting", "laser.wav" },
248 { "[mm_prism].hitting", "laser.wav" },
249 { "[mm_exit].hitting", "holz.wav" },
250 { "[mm_exit].opening", "kling.wav" },
251 { "mm_exit_open.hitting", UNDEFINED_FILENAME },
252 { "[df_mirror].hitting", "laser.wav" },
253 { "[df_mirror_rotating].hitting", "laser.wav" },
254 { "[df_refractor].hitting", "laser.wav" },
255 { "[df_receiver].hitting", "holz.wav" },
256 { "[df_receiver].opening", "kling.wav" },
257 { "[mm_wooden_wall].hitting", "holz.wav" },
258 { "[mm_wooden_block].hitting", "holz.wav" },
259 { "[mm_wooden_block].pushing", "bong.wav" },
260 { "[mm_wooden_lock].hitting", "holz.wav" },
261 { "[mm_wooden_grid_fixed].hitting", "holz.wav" },
262 { "[mm_fuse].hitting", "holz.wav" },
263 { "[mm_ice_wall].hitting", "holz.wav" },
264 { "[mm_ice_wall].shrinking", "slurp.wav" },
265 { "[mm_amoeba_wall].hitting", "holz.wav" },
266 { "[mm_amoeba_wall].growing", "amoebe.wav" },
267 { "[mm_amoeba_wall].growing.mode_loop","false" },
268 { "[df_wooden_wall].hitting", "holz.wav" },
269 { "[df_wooden_grid_fixed].hitting", "holz.wav" },
270 { "[df_wooden_grid_rotating].hitting","holz.wav" },
271 { "[mm_steel_wall].hitting", "hui.wav" },
272 { "[mm_steel_grid_fixed].hitting", "hui.wav" },
273 { "[mm_steel_block].hitting", "hui.wav" },
274 { "[mm_steel_block].pushing", "bong.wav" },
275 { "[mm_steel_lock].hitting", "hui.wav" },
276 { "[df_steel_wall].hitting", "hui.wav" },
277 { "[df_steel_grid_fixed].hitting", "hui.wav" },
278 { "[df_steel_grid_rotating].hitting", "hui.wav" },
280 { "[mm_pacman].exploding", "quiek.wav" },
281 { "[mm_mcduffin].exploding", "roaaar.wav" },
282 { "[mm_bomb].exploding", "roaaar.wav" },
283 { "[mm_key].exploding", "kling.wav" },
284 { "[mm_steel_lock].exploding", "whoosh.wav" },
285 { "[mm_wooden_lock].exploding", "whoosh.wav" },
287 // sounds not associated to game elements (used for menu screens etc.)
288 // keyword to stop parser: "NO_MORE_ELEMENT_SOUNDS" <-- do not change!
290 // sounds for other game actions
291 { "game.starting", UNDEFINED_FILENAME },
292 { "game.leveltime_charging", "fuel.wav" },
293 { "game.health_charging", "warnton.wav" },
294 { "game.running_out_of_time", "gong.wav" },
295 { "game.leveltime_bonus", "sirr.wav" },
296 { "game.health_bonus", "sirr.wav" },
297 { "game.losing", UNDEFINED_FILENAME },
298 { "game.winning", UNDEFINED_FILENAME },
299 { "game.sokoban_solving", "buing.wav" },
301 // sounds for other non-game actions
302 { "door.opening", "door.wav" },
303 { "door.closing", "door.wav" },
304 { "door_1.opening", UNDEFINED_FILENAME },
305 { "door_1.closing", UNDEFINED_FILENAME },
306 { "door_2.opening", UNDEFINED_FILENAME },
307 { "door_2.closing", UNDEFINED_FILENAME },
309 { "request.opening", UNDEFINED_FILENAME },
310 { "request.closing", UNDEFINED_FILENAME },
312 // sounds for menu actions
313 { "menu.item.activating", "empty.wav" },
314 { "menu.item.selecting", "base.wav" },
316 { "menu.button.pressing", UNDEFINED_FILENAME },
317 { "menu.button.releasing", UNDEFINED_FILENAME },
319 { "background.TITLE_INITIAL", UNDEFINED_FILENAME },
320 { "background.TITLE", UNDEFINED_FILENAME },
321 { "background.MAIN", UNDEFINED_FILENAME },
322 { "background.NAMES", UNDEFINED_FILENAME },
323 { "background.LEVELS", UNDEFINED_FILENAME },
324 { "background.LEVELNR", UNDEFINED_FILENAME },
325 { "background.SCORES", "halloffame.wav" },
326 { "background.SCORES.mode_loop", "false" },
327 { "background.EDITOR", UNDEFINED_FILENAME },
328 { "background.INFO", UNDEFINED_FILENAME },
329 { "background.INFO[ELEMENTS]", UNDEFINED_FILENAME },
330 { "background.INFO[CREDITS]", UNDEFINED_FILENAME },
331 { "background.INFO[PROGRAM]", UNDEFINED_FILENAME },
332 { "background.INFO[VERSION]", UNDEFINED_FILENAME },
333 { "background.INFO[LEVELSET]", UNDEFINED_FILENAME },
334 { "background.SETUP", UNDEFINED_FILENAME },
336 { "background.titlescreen_initial_1", UNDEFINED_FILENAME },
337 { "background.titlescreen_initial_2", UNDEFINED_FILENAME },
338 { "background.titlescreen_initial_3", UNDEFINED_FILENAME },
339 { "background.titlescreen_initial_4", UNDEFINED_FILENAME },
340 { "background.titlescreen_initial_5", UNDEFINED_FILENAME },
341 { "background.titlescreen_1", UNDEFINED_FILENAME },
342 { "background.titlescreen_2", UNDEFINED_FILENAME },
343 { "background.titlescreen_3", UNDEFINED_FILENAME },
344 { "background.titlescreen_4", UNDEFINED_FILENAME },
345 { "background.titlescreen_5", UNDEFINED_FILENAME },
346 { "background.titlemessage_initial_1",UNDEFINED_FILENAME },
347 { "background.titlemessage_initial_2",UNDEFINED_FILENAME },
348 { "background.titlemessage_initial_3",UNDEFINED_FILENAME },
349 { "background.titlemessage_initial_4",UNDEFINED_FILENAME },
350 { "background.titlemessage_initial_5",UNDEFINED_FILENAME },
351 { "background.titlemessage_1", UNDEFINED_FILENAME },
352 { "background.titlemessage_2", UNDEFINED_FILENAME },
353 { "background.titlemessage_3", UNDEFINED_FILENAME },
354 { "background.titlemessage_4", UNDEFINED_FILENAME },
355 { "background.titlemessage_5", UNDEFINED_FILENAME },