extern void awaken_soldiers(struct monst *);
extern int do_play_instrument(struct obj *);
+enum instruments obj_to_instr(struct obj *);
/* ### nhlsel.c ### */
extern void assign_soundlib(int);
extern void activate_chosen_soundlib(void);
extern void get_soundlib_name(char *dest, int maxlen);
+#ifdef SND_SOUNDEFFECTS_AUTOMAP
+extern char *get_sound_effect_filename(int32_t seidint,
+ char *buf, size_t bufsz, int32_t);
+#endif
/* ### sp_lev.c ### */
/* subset for NetHack */
enum instruments {
- ins_choir_aahs = 53, ins_trumpet = 57, ins_trombone = 58,
- ins_french_horn = 61, ins_english_horn = 70, ins_piccolo = 73,
+ ins_cello = 43, ins_orchestral_harp = 47, ins_choir_aahs = 53,
+ ins_trumpet = 57, ins_trombone = 58, ins_french_horn = 61,
+ ins_baritone_sax = 68, ins_english_horn = 70, ins_piccolo = 73,
ins_flute = 74, ins_pan_flute = 76, ins_blown_bottle = 77,
ins_whistle = 79, ins_tinkle_bell = 113, ins_woodblock = 116,
ins_taiko_drum = 117, ins_melodic_tom = 118, ins_seashore = 123,
- ins_fencepost
+ ins_no_instrument
};
#if 0
ins_guitar_fret_noise = 121, ins_breath_noise = 122, ins_seashore = 123,
ins_bird_tweet = 124, ins_telephone_ring = 125, ins_helicopter = 126,
ins_applause = 127, ins_gunshot = 128,
- ins_fencepost
+ ins_no_instrument
};
#endif
enum sound_effect_entries {
+ se_zero_invalid = 0,
se_faint_splashing = 1,
se_crackling_of_hellfire = 2,
se_heart_beat = 3,
se_elephant_trumpet = 177,
se_snake_rattle = 178,
se_hallu_growl = 179,
+ number_of_se_entries
};
#if defined(SND_LIB_QTSOUND) || defined(SND_LIB_PORTAUDIO) \
|| defined(SND_LIB_SOUND_ESCCODES) || defined(SND_LIB_VISSOUND) \
|| defined(SND_LIB_WINDSOUND)
+#define SND_LIB_INTEGRATED /* shortcut for conditional code in other files */
+
+#define Play_usersound(filename, vol, idx) \
+ do { \
+ if (!Deaf && soundprocs.sound_play_usersound \
+ && ((soundprocs.sndcap & SNDCAP_USERSOUNDS) != 0)) \
+ (*soundprocs.sound_play_usersound)((filename), (vol), (idx)); \
+ } while(0)
+
#define Soundeffect(seid, vol) \
do { \
if (!Deaf && soundprocs.sound_soundeffect \
(*soundprocs.sound_soundeffect)(emptystr, (seid), (vol)); \
} while(0)
+#define Hero_playnotes(instrument, str, vol) \
+ do { \
+ if (!Deaf && soundprocs.sound_hero_playnotes \
+ && ((soundprocs.sndcap & SNDCAP_HEROMUSIC) != 0)) \
+ (*soundprocs.sound_hero_playnotes)((instrument), (str), (vol)); \
+ } while(0)
#else
+#ifdef SND_LIB_INTEGRATED
+#undef SND_LIB_INTEGRATED
+#endif
+#define Play_usersound(filename, vol, idx)
#define Soundeffect(seid, vol)
+#define Hero_playnotes(instrument, str, vol)
#endif
#endif /* SNDPROCS_H */
extern void interject_assistance(int, int, genericptr_t, genericptr_t);
extern void interject(int);
+#if defined(SND_LIB_WINDSOUND)
+#define SND_SOUNDEFFECTS_AUTOMAP
+#endif
+
/*
*===============================================
* Compiler-specific adjustments
--- /dev/null
+January 22, 2023 - sounds
+
+Important: For the included se_* wav files, please refer to the file
+'sound/wav attributions.txt' for the details about the
+source, author, and licensing.
+
+There were old aiif versions of some sound samples distributed
+in uuencoded form in earlier versions of NetHack: bell.uu, bugle.uu,
+erthdrum.uu, firehorn.uu, frsthorn.uu, lethdrum.uu, mgcflute.uu,
+mgcharp.uu, toolhorn.uu, wdnflute.uu and wdnharp.uu.
+
+Those had been removed in commit 217671e00f626e53d314757b4687950466efb360
+in May 2019, at the same time built-in speaker support was removed.
+
+Some of those original files have been converted into wav files starting
+with NetHack 3.7. The pitch variation versions offer a chance for very
+simple tune playback on platforms that offer a basic play-sound function
+call, which many do. There is no need to manipulate the underlying sounds
+with those, although sound library interfaces may certainly produce
+music in more elabote and pleasing ways. Contributions are welcome.
+
+While they make the distribution larger, they offer a more immersive
+experience while playing locally on many platforms or with many
+sound libraries. Also, file/distribution size is not the same
+concern in 2023 that it might have been in 1995 or 2003.
+
+This is the note that accompanied those original sound files.
+
+------------------------------------------------------------
+README for the AIFF files:
+
+These files are sound files for the instruments in NetHack.
+There are 11 sounds, one for each distinct instrument.
+The sounds are in 8-bit 22kHz AIFF format, which should be
+readable by a broad range of platforms. Since the sounds
+came from Rolands S-750 sample library (most of them) there
+should be no copyright on them when we treat them like we
+do here (as instruments) - indeed, the sample library I
+got from Roland didn't even bear a (c) symbol.
+
+Some of the sounds are very adequate (Drum of Earthquake,
+Wooden Flute, Magic Harp) while some are less true to the
+original name (how does a Frost Horn sound?) Actually, I
+don't know what a Bugle is (Bugle horn?) so I took a trumpet
+sound for that. Correct me if I'm wrong.
+
+What does this have to do with the main code? Well, nothing
+so far. There are some places that are #ifdef MAC and calls
+mac_speaker; that function takes an object and a tune (in
+capital letters A-G) and plays the tune with the given
+instrument. When playing a specific tune, that tune is of
+course used. For "improvise," I use middle "C."
+
+Ideally, we should do something equal with sound that we
+have with displays, so we can use one common set of calls
+in the main code, and have ports do whatever seems appropriate
+for the available hardware.
+
+Any comment on the sounds or their use is welcome:
+
+ Jon W{tte
+ Mac Team
+ nethack-bugs@nethack.org
--- /dev/null
+/* NetHack 3.7 attributions.txt $NHDT-Date: 1652831519 2022/05/17 23:51:59 $
+
+Attributions and credits and modifications for sounds used are listed below.
+
+File: se_squeak_C.wav
+Source: https://freesound.org/people/seth-m/sounds/269722/
+Original: download/269722__seth-m__wood-creaks.wav
+By: https://freesound.org/people/seth-m/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m02.194s to 00h00m02.765s as selection.
+- Saved selection to file named se_squeak_C.wav
+- .571 seconds
+
+
+File: se_squeak_D_flat.wav
+Source: https://freesound.org/people/AlienXXX/sounds/151346/
+Original: download/151346__alienxxx__creaking-floor-upstairs.wav
+By: https://freesound.org/people/AlienXXX/
+License: https://creativecommons.org/licenses/by/4.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m37.641s to 00h00m39.320s as selection.
+- Used Audacity, Effect to change selection pitch to C#/Dflat 3.
+- Saved selection to file named se_squeak_D_flat.wav
+- 1.679 seconds
+
+
+File: se_squeak_D.wav
+Source: https://freesound.org/people/Talitha5/sounds/321883/
+Original: download/321883__talitha5__floorboard-creaking.mp3
+By: https://freesound.org/people/Talitha5/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m24.447s to 00h00m225.790s as selection.
+- Saved selection to file named se_squeak_D.wav
+- 2.067 seconds
+
+
+File:se_squeak_E_flat.wav
+Source: https://freesound.org/people/tosha73/sounds/570864/
+Original: download/570864__tosha73__creaking-boards.wav
+By: https://freesound.org/people/tosha73/
+License: https://creativecommons.org/licenses/by/4.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m30.192s to 00h00m30.819s as selection.
+- Saved selection to file named se_squeak_E_flat.wav
+- .627 seconds
+
+
+File: se_squeak_E.wav
+Source: https://freesound.org/people/Benboncan/sounds/101381/
+Original: download/101381__benboncan__creaking-floorboard.wav
+By: https://freesound.org/people/Benboncan/
+License: https://creativecommons.org/licenses/by/4.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m12.892s to 00h00m14.709s as selection.
+- Saved selection to file named se_squeak_E.wav
+- 1.817 seconds
+
+
+File: se_squeak_F.wav
+Source: https://freesound.org/people/Talitha5/sounds/321883/
+Original: download/321883__talitha5__floorboard-creaking.mp3
+By: https://freesound.org/people/Talitha5/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m56.926s to 00h00m58.402s as selection.
+- Saved selection to file named se_squeak_F.wav
+- 1.476 seconds.
+
+
+File: se_squeak_F_sharp.wav
+Source: https://freesound.org/people/seth-m/sounds/269722/
+Original: download/269722__seth-m__wood-creaks.wav
+By: https://freesound.org/people/seth-m/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m04.361s to 00h00m04.795s as selection.
+- Saved selection to file named se_squeak_F_sharp.wav
+- .434 seconds
+
+
+File: se_squeak_G.wav
+Source: https://freesound.org/people/Garuda1982/sounds/420856/
+Original: download/420856__garuda1982__floorboards-squeak-field-recording-with-zoom-h2n.wav
+By: https://freesound.org/people/Garuda1982/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m14.369s to 00h00m15.629s as selection.
+- Saved selection to file named se_squeak_G.wav
+- 1.26 seconds
+
+
+File: se_squeak_G_sharp.wav
+Source: https://freesound.org/people/seth-m/sounds/269722/
+Original: download/269722__seth-m__wood-creaks.wav
+By: https://freesound.org/people/seth-m/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m03.331s to 00h00m03.966s as selection.
+- Used Audacity, Effect to change selection pitch to G#/A flat 7
+- Saved selection to file named se_squeak_G_sharp.wav
+- .635 seconds
+
+
+File: se_squeak_A.wav
+Source: https://freesound.org/people/Greg_Surr/sounds/590161/
+Original: download/590161__greg-surr__creaking-in-room-11.wav
+By: https://freesound.org/people/Greg_Surr/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m00.209s to 00h00m01.385s as selection.
+- Saved selection to file named se_squeak_A.wav
+- 1.176s
+
+
+File: se_squeak_B_flat.wav
+Source: https://freesound.org/people/shelbyshark/sounds/487105/
+Original: download/487105__shelbyshark__floorcreak.wav
+By: https://freesound.org/people/shelbyshark/
+License: http://creativecommons.org/publicdomain/zero/1.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m02.350s to 00h00m04.576s as selection.
+- Used Audacity, Effect to change selection pitch to A#/Bflat.
+- Saved selection to file named se_squeak_B_flat.wav
+- 2.226 seconds
+
+
+File:se_squeak_B.wav
+Source: https://freesound.org/people/tosha73/sounds/570864/
+Original: download/570864__tosha73__creaking-boards.wav
+By: https://freesound.org/people/tosha73/
+License: https://creativecommons.org/licenses/by/4.0/
+Download Date: January 21, 2023
+Description of modifications made to the original:
+- 00h00m00.000s to 00h00m00.572s as selection.
+- Saved selection to file named se_squeak_B.wav
+- .572 seconds
+
+
+
struct sound_procs windsound_procs = {
SOUNDID(windsound),
- SNDCAP_USERSOUNDS,
+ SNDCAP_USERSOUNDS | SNDCAP_SOUNDEFFECTS | SNDCAP_HEROMUSIC,
windsound_init_nhsound,
windsound_exit_nhsound,
windsound_achievement,
void
windsound_soundeffect(char *desc, int32_t seid, int32_t volume)
{
+#ifdef SND_SOUNDEFFECTS_AUTOMAP
+ int reslt = 0;
+ char buf[PATHLEN];
+ const char *filename;
+ DWORD fdwsound;
+
+ if (seid >= se_squeak_C || seid <= se_squeak_B) {
+ filename = get_sound_effect_filename(seid, buf, sizeof buf, 1);
+ fdwsound = SND_ASYNC | SND_RESOURCE;
+ } else {
+ filename = get_sound_effect_filename(seid, buf, sizeof buf, 0);
+ fdwsound = SND_ASYNC | SND_NODEFAULT;
+ }
+
+ if (filename) {
+ reslt = PlaySound(filename, NULL, fdwsound);
+// (void) sndPlaySound(filename, fdwsound);
+ }
+#endif
}
+#define WAVEMUSIC_SOUNDS
+
void
windsound_hero_playnotes(int32_t instrument, char *str, int32_t volume)
{
+#ifdef WAVEMUSIC_SOUNDS
+ int reslt = 0;
+ boolean has_note_variations = FALSE;
+ char resourcename[120], *end_of_res = 0, *c = 0;
+
+ if (!str)
+ return;
+ resourcename[0] = '\0';
+ switch(instrument) {
+ case ins_flute: /* WOODEN_FLUTE */
+ Strcpy(resourcename, "sound_Wooden_Flute");
+ has_note_variations = TRUE;
+ break;
+ case ins_pan_flute: /* MAGIC_FLUTE */
+ /* wav files for sound_Magic_Flute not added yet */
+ Strcpy(resourcename, "sound_Wooden_Flute");
+ has_note_variations = TRUE;
+ break;
+ case ins_english_horn: /* TOOLED_HORN */
+ Strcpy(resourcename, "sound_Tooled_Horn");
+ has_note_variations = TRUE;
+ break;
+ case ins_french_horn: /* FROST_HORN */
+ Strcpy(resourcename, "sound_Frost_Horn");
+ break;
+ case ins_baritone_sax: /* FIRE_HORN */
+ Strcpy(resourcename, "sound_Fire_Horn");
+ break;
+ case ins_trumpet: /* BUGLE */
+ Strcpy(resourcename, "sound_Bugle");
+ has_note_variations = TRUE;
+ break;
+ case ins_orchestral_harp: /* WOODEN_HARP */
+ Strcpy(resourcename, "sound_Wooden_Harp");
+ has_note_variations = TRUE;
+ break;
+ case ins_cello: /* MAGIC_HARP */
+ Strcpy(resourcename, "sound_Magic_Harp");
+ has_note_variations = TRUE;
+ case ins_tinkle_bell:
+ Strcpy(resourcename, "sound_Bell");
+ break;
+ case ins_taiko_drum: /* DRUM_OF_EARTHQUAKE */
+ Strcpy(resourcename, "sound_Drum_Of_Earthquake");
+ break;
+ case ins_melodic_tom: /* LEATHER_DRUM */
+ Strcpy(resourcename, "sound_Leather_Drum");
+ break;
+ }
+ if (has_note_variations) {
+ int i, idx = 0, notecount = strlen(str);
+ static const char *const note_suffixes[]
+ = { "_A", "_B", "_C", "_D", "_E", "_F", "_G" };
+
+ end_of_res = eos(resourcename);
+ c = str;
+ for (i = 0; i < notecount; ++i) {
+ if (*c >= 'A' && *c <= 'G') {
+ idx = (*c) - 'A';
+ Strcpy(end_of_res, note_suffixes[idx]);
+ if (i == (notecount - 1))
+ break; /* drop out of for-loop and play it async below */
+ reslt = PlaySound(resourcename, NULL,
+ SND_SYNC | SND_RESOURCE);
+ }
+ c++;
+ }
+ }
+ /* the final, or only, one is played ASYNC */
+ reslt = PlaySound(resourcename, NULL, SND_ASYNC | SND_RESOURCE);
+#endif
}
void
}
#endif /* SND_LIB_WINDSOUND */
-
itmp.otyp -= 1;
mundane = TRUE;
}
-
+ Hero_playnotes(obj_to_instr(&itmp), "C", 50);
#define PLAY_NORMAL 0x00
#define PLAY_STUNNED 0x01
You(!Deaf ? "extract a strange sound from %s!"
: "can feel %s emitting vibrations.", the(xname(instr)));
+ Hero_playnotes(obj_to_instr(instr), buf, 50);
/* Check if there was the Stronghold drawbridge near
return ECMD_OK;
}
+enum instruments
+obj_to_instr(struct obj *obj) {
+ enum instruments ret_instr = ins_no_instrument;
+
+#if defined(SND_LIB_INTEGRATED)
+ switch(obj->otyp) {
+ case WOODEN_FLUTE:
+ ret_instr = ins_flute;
+ break;
+ case MAGIC_FLUTE:
+ ret_instr = ins_pan_flute;
+ break;
+ case TOOLED_HORN:
+ ret_instr = ins_english_horn;
+ break;
+ case FROST_HORN:
+ ret_instr = ins_french_horn;
+ break;
+ case FIRE_HORN:
+ ret_instr = ins_baritone_sax;
+ break;
+ case BUGLE:
+ ret_instr = ins_trumpet;
+ break;
+ case WOODEN_HARP:
+ ret_instr = ins_orchestral_harp;
+ break;
+ case MAGIC_HARP:
+ ret_instr = ins_cello;
+ case BELL:
+ case BELL_OF_OPENING:
+ ret_instr = ins_tinkle_bell;
+ break;
+ case DRUM_OF_EARTHQUAKE:
+ ret_instr = ins_taiko_drum;
+ break;
+ case LEATHER_DRUM:
+ ret_instr = ins_melodic_tom;
+ break;
+ }
+#endif
+ return ret_instr;
+}
/*music.c*/
if (soundprocs.sound_play_usersound) {
snd = sound_matches_message(msg);
- if (snd)
- (*soundprocs.sound_play_usersound)(
- snd->filename, snd->volume, snd->idx);
+ if (snd) {
+ Play_usersound(snd->filename, snd->volume, snd->idx);
+ }
}
}
if (soundprocs.sound_play_usersound) {
snd = sound_matches_message(msg);
- if (snd)
- (*soundprocs.sound_play_usersound)(
- snd->filename, snd->volume, snd->idx);
+ if (snd) {
+ Play_usersound(snd->filename, snd->volume, snd->idx);
+ }
}
}
}
#endif
+#ifdef SND_SOUNDEFFECTS_AUTOMAP
+struct soundeffect_automapping {
+ enum sound_effect_entries seid;
+ const char *base_filename;
+};
+
+static const struct soundeffect_automapping se_mappings_init[number_of_se_entries] = {
+ { se_zero_invalid, "" },
+ { se_faint_splashing, "faint_splashing" },
+ { se_crackling_of_hellfire, "crackling_of_hellfire" },
+ { se_heart_beat, "heart_beat" },
+ { se_typing_noise, "typing_noise" },
+ { se_hollow_sound, "hollow_sound" },
+ { se_rustling_paper, "rustling_paper" },
+ { se_crushing_sound, "crushing_sound" },
+ { se_splash, "splash" },
+ { se_chains_rattling_gears_turning, "chains_rattling_gears_turning" },
+ { se_smashing_and_crushing, "smashing_and_crushing" },
+ { se_gears_turning_chains_rattling, "gears_turning_chains_rattling" },
+ { se_loud_splash, "loud_splash" },
+ { se_lound_crash, "lound_crash" },
+ { se_crashing_rock, "crashing_rock" },
+ { se_sizzling, "sizzling" },
+ { se_crashing_boulder, "crashing_boulder" },
+ { se_boulder_drop, "boulder_drop" },
+ { se_item_tumble_downwards, "item_tumble_downwards" },
+ { se_drain_noises, "drain_noises" },
+ { se_ring_in_drain, "ring_in_drain" },
+ { se_groans_and_moans, "groans_and_moans" },
+ { se_scratching, "scratching" },
+ { se_glass_shattering, "glass_shattering" },
+ { se_egg_cracking, "egg_cracking" },
+ { se_gushing_sound, "gushing_sound" },
+ { se_glass_crashing, "glass_crashing" },
+ { se_egg_splatting, "egg_splatting" },
+ { se_sinister_laughter, "sinister_laughter" },
+ { se_blast, "blast" },
+ { se_stone_breaking, "stone_breaking" },
+ { se_stone_crumbling, "stone_crumbling" },
+ { se_snakes_hissing, "snakes_hissing" },
+ { se_loud_pop, "loud_pop" },
+ { se_clanking_pipe, "clanking_pipe" },
+ { se_sewer_song, "sewer_song" },
+ { se_monster_behind_boulder, "monster_behind_boulder" },
+ { se_wailing_of_the_banshee, "wailing_of_the_banshee" },
+ { se_swoosh, "swoosh" },
+ { se_explosion, "explosion" },
+ { se_crashing_sound, "crashing_sound" },
+ { se_someone_summoning, "someone_summoning" },
+ { se_rushing_wind_noise, "rushing_wind_noise" },
+ { se_splat_from_engulf, "splat_from_engulf" },
+ { se_faint_sloshing, "faint_sloshing" },
+ { se_crunching_sound, "crunching_sound" },
+ { se_slurping_sound, "slurping_sound" },
+ { se_masticating_sound, "masticating_sound" },
+ { se_distant_thunder, "distant_thunder" },
+ { se_applause, "applause" },
+ { se_shrill_whistle, "shrill_whistle" },
+ { se_someone_yells, "someone_yells" },
+ { se_door_unlock_and_open, "door_unlock_and_open" },
+ { se_door_open, "door_open" },
+ { se_door_crash_open, "door_crash_open" },
+ { se_dry_throat_rattle, "dry_throat_rattle" },
+ { se_cough, "cough" },
+ { se_angry_snakes, "angry_snakes" },
+ { se_zap_then_explosion, "zap_then_explosion" },
+ { se_zap, "zap" },
+ { se_horn_being_played, "horn_being_played" },
+ { se_mon_chugging_potion, "mon_chugging_potion" },
+ { se_bugle_playing_reveille, "bugle_playing_reveille" },
+ { se_crash_through_floor, "crash_through_floor" },
+ { se_thump, "thump" },
+ { se_scream, "scream" },
+ { se_tumbler_click, "tumbler_click" },
+ { se_gear_turn, "gear_turn" },
+ { se_divine_music, "divine_music" },
+ { se_thunderclap, "thunderclap" },
+ { se_sad_wailing, "sad_wailing" },
+ { se_maniacal_laughter, "maniacal_laughter" },
+ { se_rumbling_of_earth, "rumbling_of_earth" },
+ { se_clanging_sound, "clanging_sound" },
+ { se_mutter_imprecations, "mutter_imprecations" },
+ { se_mutter_incantation, "mutter_incantation" },
+ { se_angry_voice, "angry_voice" },
+ { se_sceptor_pounding, "sceptor_pounding" },
+ { se_courtly_conversation, "courtly_conversation" },
+ { se_low_buzzing, "low_buzzing" },
+ { se_angry_drone, "angry_drone" },
+ { se_bees, "bees" },
+ { se_someone_searching, "someone_searching" },
+ { se_guards_footsteps, "guards_footsteps" },
+ { se_faint_chime, "faint_chime" },
+ { se_loud_click, "loud_click" },
+ { se_soft_click, "soft_click" },
+ { se_squeak, "squeak" },
+ { se_squeak_C, "squeak_C" },
+ { se_squeak_D_flat, "squeak_D_flat" },
+ { se_squeak_D, "squeak_D" },
+ { se_squeak_E_flat, "squeak_E_flat" },
+ { se_squeak_E, "squeak_E" },
+ { se_squeak_F, "squeak_F" },
+ { se_squeak_F_sharp, "squeak_F_sharp" },
+ { se_squeak_G, "squeak_G" },
+ { se_squeak_G_sharp, "squeak_G_sharp" },
+ { se_squeak_A, "squeak_A" },
+ { se_squeak_B_flat, "squeak_B_flat" },
+ { se_squeak_B, "squeak_B" },
+ { se_someone_bowling, "someone_bowling" },
+ { se_rumbling, "rumbling" },
+ { se_loud_crash, "loud_crash" },
+ { se_deafening_roar_atmospheric, "deafening_roar_atmospheric" },
+ { se_low_hum, "low_hum" },
+ { se_laughter, "laughter" },
+ { se_cockatrice_hiss, "cockatrice_hiss" },
+ { se_chant, "chant" },
+ { se_cracking_sound, "cracking_sound" },
+ { se_ripping_sound, "ripping_sound" },
+ { se_thud, "thud" },
+ { se_clank, "clank" },
+ { se_crumbling_sound, "crumbling_sound" },
+ { se_soft_crackling, "soft_crackling" },
+ { se_crackling, "crackling" },
+ { se_sharp_crack, "sharp_crack" },
+ { se_wall_of_force, "wall_of_force" },
+ { se_alarm, "alarm" },
+ { se_kick_door_it_shatters, "kick_door_it_shatters" },
+ { se_kick_door_it_crashes_open, "kick_door_it_crashes_open" },
+ { se_bubble_rising, "bubble_rising" },
+ { se_bolt_of_lightning, "bolt_of_lightning" },
+ { se_board_squeak, "board_squeak" },
+ { se_board_squeaks_loudly, "board_squeaks_loudly" },
+ { se_boing, "boing" },
+ { se_crashed_ceiling, "crashed_ceiling" },
+ { se_clash, "clash" },
+ { se_crash_door, "crash_door" },
+ { se_crash, "crash" },
+ { se_crash_throne_destroyed, "crash_throne_destroyed" },
+ { se_crash_something_broke, "crash_something_broke" },
+ { se_kadoom_boulder_falls_in, "kadoom_boulder_falls_in" },
+ { se_klunk_pipe, "klunk_pipe" },
+ { se_kerplunk_boulder_gone, "kerplunk_boulder_gone" },
+ { se_klunk, "klunk" },
+ { se_klick, "klick" },
+ { se_kaboom_door_explodes, "kaboom_door_explodes" },
+ { se_kaboom_boom_boom, "kaboom_boom_boom" },
+ { se_kaablamm_of_mine, "kaablamm_of_mine" },
+ { se_kaboom, "kaboom" },
+ { se_splat_egg, "splat_egg" },
+ { se_destroy_web, "destroy_web" },
+ { se_iron_ball_dragging_you, "iron_ball_dragging_you" },
+ { se_iron_ball_hits_you, "iron_ball_hits_you" },
+ { se_lid_slams_open_falls_shut, "lid_slams_open_falls_shut" },
+ { se_chain_shatters, "chain_shatters" },
+ { se_furious_bubbling, "furious_bubbling" },
+ { se_air_crackles, "air_crackles" },
+ { se_potion_crash_and_break, "potion_crash_and_break" },
+ { se_hiss, "hiss" },
+ { se_growl, "growl" },
+ { se_canine_bark, "canine_bark" },
+ { se_canine_growl, "canine_growl" },
+ { se_canine_whine, "canine_whine" },
+ { se_canine_yip, "canine_yip" },
+ { se_canine_howl, "canine_howl" },
+ { se_feline_yowl, "feline_yowl" },
+ { se_feline_meow, "feline_meow" },
+ { se_feline_purr, "feline_purr" },
+ { se_feline_yip, "feline_yip" },
+ { se_feline_mew, "feline_mew" },
+ { se_roar, "roar" },
+ { se_snarl, "snarl" },
+ { se_buzz, "buzz" },
+ { se_squeek, "squeek" },
+ { se_squawk, "squawk" },
+ { se_squeal, "squeal" },
+ { se_screech, "screech" },
+ { se_equine_neigh, "equine_neigh" },
+ { se_equine_whinny, "equine_whinny" },
+ { se_equine_whicker, "equine_whicker" },
+ { se_bovine_moo, "bovine_moo" },
+ { se_bovine_bellow, "bovine_bellow" },
+ { se_wail, "wail" },
+ { se_groan, "groan" },
+ { se_grunt, "grunt" },
+ { se_gurgle, "gurgle" },
+ { se_elephant_trumpet, "elephant_trumpet" },
+ { se_snake_rattle, "snake_rattle" },
+ { se_hallu_growl, "hallu_growl" },
+};
+
+static const char *semap_basenames[SIZE(se_mappings_init)];
+static boolean basenames_initialized = FALSE;
+
+static void
+initialize_semap_basenames(void)
+{
+ int i;
+
+ /* to avoid things getting out of sequence; seid an index to the name */
+ for (i = 1; i < SIZE(se_mappings_init); ++i) {
+ if (se_mappings_init[i].seid > 0
+ && se_mappings_init[i].seid < SIZE(semap_basenames))
+ semap_basenames[se_mappings_init[i].seid]
+ = se_mappings_init[i].base_filename;
+ }
+}
+
+char *
+get_sound_effect_filename(int32_t seidint, char *buf,
+ size_t bufsz,
+ int32_t baseflag) /* non-zero means return without
+ directory or extension suffix */
+{
+ static const char prefix[] = "se_", suffix[] = ".wav";
+ size_t consumes = 0, baselen = 0;
+/* enum sound_effect_entries seid = (enum sound_effect_entries) seidint; */
+ char *ourdir = sounddir; /* sounddir would get set in files.c */
+
+ if (!buf || (!ourdir && baseflag == 0))
+ return (char *) 0;
+
+ if (!basenames_initialized) {
+ initialize_semap_basenames();
+ basenames_initialized = TRUE;
+ }
+
+ if (semap_basenames[seidint])
+ baselen = strlen(semap_basenames[seidint]);
+
+ consumes = (sizeof prefix - 1) + baselen;
+ if (baseflag == 0)
+ consumes += (sizeof suffix - 1) + strlen(ourdir);
+ consumes += 1 + 1; /* '\0' and '/' */
+ if (baselen <= 0 || consumes > bufsz)
+ return (char *) 0;
+
+#if 0
+ if (!baseflag) {
+ Strcpy(buf, ourdir);
+ Strcat(buf, "/");
+ }
+ Strcat(buf, prefix);
+ Strcat(buf, semap_basenames[seidint]);
+ if (!baseflag) {
+ Strcat(buf, suffix);
+ }
+#else
+ if (!baseflag)
+ Snprintf(buf, bufsz , "%s/%s%s%s", ourdir, prefix,
+ semap_basenames[seidint], suffix);
+ else
+ Snprintf(buf, bufsz , "%s%s", prefix, semap_basenames[seidint]);
+#endif
+ return buf;
+}
+#endif /* SND_SOUNDEFFECTS_AUTOMAP */
+
/*sounds.c*/
VALUE "FileDescription", "NetHack for Windows - TTY Interface\0"
VALUE "FileVersion", "3.7.0\0"
VALUE "InternalName", "NetHack\0"
- VALUE "LegalCopyright", "Copyright (C) 1985 - 2020. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0"
+ VALUE "LegalCopyright", "Copyright (C) 1985 - 2023. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0"
VALUE "OriginalFilename", "NetHack.exe\0"
- VALUE "PrivateBuild", "050102\0"
+ VALUE "PrivateBuild", "050107\0"
VALUE "ProductName", "NetHack\0"
VALUE "ProductVersion", "3.7.0\0"
END
VALUE "Translation", 0x409, 1200
END
END
+se_squeak_A WAVE "..\sound\wav\se_squeak_A.wav"
+se_squeak_B WAVE "..\sound\wav\se_squeak_B.wav"
+se_squeak_B_flat WAVE "..\sound\wav\se_squeak_B_flat.wav"
+se_squeak_C WAVE "..\sound\wav\se_squeak_C.wav"
+se_squeak_D WAVE "..\sound\wav\se_squeak_D.wav"
+se_squeak_D_flat WAVE "..\sound\wav\se_squeak_D_flat.wav"
+se_squeak_E WAVE "..\sound\wav\se_squeak_E.wav"
+se_squeak_E_flat WAVE "..\sound\wav\se_squeak_E_flat.wav"
+se_squeak_F WAVE "..\sound\wav\se_squeak_F.wav"
+se_squeak_F_sharp WAVE "..\sound\wav\se_squeak_F_sharp.wav"
+se_squeak_G WAVE "..\sound\wav\se_squeak_G.wav"
+se_squeak_G_share WAVE "..\sound\wav\se_squeak_G_sharp.wav"
+sound_Bell WAVE "..\sound\wav\sound_Bell.wav"
+sound_Bugle_A WAVE "..\sound\wav\sound_Bugle_A.wav"
+sound_Bugle_B WAVE "..\sound\wav\sound_Bugle_B.wav"
+sound_Bugle_C WAVE "..\sound\wav\sound_Bugle_C.wav"
+sound_Bugle_D WAVE "..\sound\wav\sound_Bugle_D.wav"
+sound_Bugle_E WAVE "..\sound\wav\sound_Bugle_E.wav"
+sound_Bugle_F WAVE "..\sound\wav\sound_Bugle_F.wav"
+sound_Bugle_G WAVE "..\sound\wav\sound_Bugle_G.wav"
+sound_Drum_Of_Earthquake WAVE "..\sound\wav\sound_Drum_Of_Earthquake.wav"
+sound_Fire_Horn WAVE "..\sound\wav\sound_Fire_Horn.wav"
+sound_Frost_Horn WAVE "..\sound\wav\sound_Frost_Horn.wav"
+sound_Leather_Drum WAVE "..\sound\wav\sound_Leather_Drum.wav"
+sound_Magic_Harp_A WAVE "..\sound\wav\sound_Magic_Harp_A.wav"
+sound_Magic_Harp_B WAVE "..\sound\wav\sound_Magic_Harp_B.wav"
+sound_Magic_Harp_C WAVE "..\sound\wav\sound_Magic_Harp_C.wav"
+sound_Magic_Harp_D WAVE "..\sound\wav\sound_Magic_Harp_D.wav"
+sound_Magic_Harp_E WAVE "..\sound\wav\sound_Magic_Harp_E.wav"
+sound_Magic_Harp_F WAVE "..\sound\wav\sound_Magic_Harp_F.wav"
+sound_Magic_Harp_G WAVE "..\sound\wav\sound_Magic_Harp_G.wav"
+sound_Tooled_Horn_A WAVE "..\sound\wav\sound_Tooled_Horn_A.wav"
+sound_Tooled_Horn_B WAVE "..\sound\wav\sound_Tooled_Horn_B.wav"
+sound_Tooled_Horn_C WAVE "..\sound\wav\sound_Tooled_Horn_C.wav"
+sound_Tooled_Horn_D WAVE "..\sound\wav\sound_Tooled_Horn_D.wav"
+sound_Tooled_Horn_E WAVE "..\sound\wav\sound_Tooled_Horn_E.wav"
+sound_Tooled_Horn_F WAVE "..\sound\wav\sound_Tooled_Horn_F.wav"
+sound_Tooled_Horn_G WAVE "..\sound\wav\sound_Tooled_Horn_G.wav"
+sound_Wooden_Flute_A WAVE "..\sound\wav\sound_Wooden_Flute_A.wav"
+sound_Wooden_Flute_B WAVE "..\sound\wav\sound_Wooden_Flute_B.wav"
+sound_Wooden_Flute_C WAVE "..\sound\wav\sound_Wooden_Flute_C.wav"
+sound_Wooden_Flute_D WAVE "..\sound\wav\sound_Wooden_Flute_D.wav"
+sound_Wooden_Flute_E WAVE "..\sound\wav\sound_Wooden_Flute_E.wav"
+sound_Wooden_Flute_F WAVE "..\sound\wav\sound_Wooden_Flute_F.wav"
+sound_Wooden_Flute_G WAVE "..\sound\wav\sound_Wooden_Flute_G.wav"
+sound_Wooden_Harp_A WAVE "..\sound\wav\sound_Wooden_Harp_A.wav"
+sound_Wooden_Harp_B WAVE "..\sound\wav\sound_Wooden_Harp_B.wav"
+sound_Wooden_Harp_C WAVE "..\sound\wav\sound_Wooden_Harp_C.wav"
+sound_Wooden_Harp_D WAVE "..\sound\wav\sound_Wooden_Harp_D.wav"
+sound_Wooden_Harp_E WAVE "..\sound\wav\sound_Wooden_Harp_E.wav"
+sound_Wooden_Harp_F WAVE "..\sound\wav\sound_Wooden_Harp_F.wav"
+sound_Wooden_Harp_G WAVE "..\sound\wav\sound_Wooden_Harp_G.wav"
-/*console.rc*/
-
+/*console.rc*/"
IDS_APP_TITLE_SHORT "NetHack for Windows"
END
+se_squeak_A WAVE "..\sound\wav\se_squeak_A.wav"
+se_squeak_B WAVE "..\sound\wav\se_squeak_B.wav"
+se_squeak_B_flat WAVE "..\sound\wav\se_squeak_B_flat.wav"
+se_squeak_C WAVE "..\sound\wav\se_squeak_C.wav"
+se_squeak_D WAVE "..\sound\wav\se_squeak_D.wav"
+se_squeak_D_flat WAVE "..\sound\wav\se_squeak_D_flat.wav"
+se_squeak_E WAVE "..\sound\wav\se_squeak_E.wav"
+se_squeak_E_flat WAVE "..\sound\wav\se_squeak_E_flat.wav"
+se_squeak_F WAVE "..\sound\wav\se_squeak_F.wav"
+se_squeak_F_sharp WAVE "..\sound\wav\se_squeak_F_sharp.wav"
+se_squeak_G WAVE "..\sound\wav\se_squeak_G.wav"
+se_squeak_G_share WAVE "..\sound\wav\se_squeak_G_sharp.wav"
+
+sound_Bell WAVE "..\sound\wav\sound_Bell.wav"
+sound_Bugle_A WAVE "..\sound\wav\sound_Bugle_A.wav"
+sound_Bugle_B WAVE "..\sound\wav\sound_Bugle_B.wav"
+sound_Bugle_C WAVE "..\sound\wav\sound_Bugle_C.wav"
+sound_Bugle_D WAVE "..\sound\wav\sound_Bugle_D.wav"
+sound_Bugle_E WAVE "..\sound\wav\sound_Bugle_E.wav"
+sound_Bugle_F WAVE "..\sound\wav\sound_Bugle_F.wav"
+sound_Bugle_G WAVE "..\sound\wav\sound_Bugle_G.wav"
+sound_Drum_Of_Earthquake WAVE "..\sound\wav\sound_Drum_Of_Earthquake.wav"
+sound_Fire_Horn WAVE "..\sound\wav\sound_Fire_Horn.wav"
+sound_Frost_Horn WAVE "..\sound\wav\sound_Frost_Horn.wav"
+sound_Leather_Drum WAVE "..\sound\wav\sound_Leather_Drum.wav"
+sound_Magic_Harp_A WAVE "..\sound\wav\sound_Magic_Harp_A.wav"
+sound_Magic_Harp_B WAVE "..\sound\wav\sound_Magic_Harp_B.wav"
+sound_Magic_Harp_C WAVE "..\sound\wav\sound_Magic_Harp_C.wav"
+sound_Magic_Harp_D WAVE "..\sound\wav\sound_Magic_Harp_D.wav"
+sound_Magic_Harp_E WAVE "..\sound\wav\sound_Magic_Harp_E.wav"
+sound_Magic_Harp_F WAVE "..\sound\wav\sound_Magic_Harp_F.wav"
+sound_Magic_Harp_G WAVE "..\sound\wav\sound_Magic_Harp_G.wav"
+sound_Tooled_Horn_A WAVE "..\sound\wav\sound_Tooled_Horn_A.wav"
+sound_Tooled_Horn_B WAVE "..\sound\wav\sound_Tooled_Horn_B.wav"
+sound_Tooled_Horn_C WAVE "..\sound\wav\sound_Tooled_Horn_C.wav"
+sound_Tooled_Horn_D WAVE "..\sound\wav\sound_Tooled_Horn_D.wav"
+sound_Tooled_Horn_E WAVE "..\sound\wav\sound_Tooled_Horn_E.wav"
+sound_Tooled_Horn_F WAVE "..\sound\wav\sound_Tooled_Horn_F.wav"
+sound_Tooled_Horn_G WAVE "..\sound\wav\sound_Tooled_Horn_G.wav"
+sound_Wooden_Flute_A WAVE "..\sound\wav\sound_Wooden_Flute_A.wav"
+sound_Wooden_Flute_B WAVE "..\sound\wav\sound_Wooden_Flute_B.wav"
+sound_Wooden_Flute_C WAVE "..\sound\wav\sound_Wooden_Flute_C.wav"
+sound_Wooden_Flute_D WAVE "..\sound\wav\sound_Wooden_Flute_D.wav"
+sound_Wooden_Flute_E WAVE "..\sound\wav\sound_Wooden_Flute_E.wav"
+sound_Wooden_Flute_F WAVE "..\sound\wav\sound_Wooden_Flute_F.wav"
+sound_Wooden_Flute_G WAVE "..\sound\wav\sound_Wooden_Flute_G.wav"
+sound_Wooden_Harp_A WAVE "..\sound\wav\sound_Wooden_Harp_A.wav"
+sound_Wooden_Harp_B WAVE "..\sound\wav\sound_Wooden_Harp_B.wav"
+sound_Wooden_Harp_C WAVE "..\sound\wav\sound_Wooden_Harp_C.wav"
+sound_Wooden_Harp_D WAVE "..\sound\wav\sound_Wooden_Harp_D.wav"
+sound_Wooden_Harp_E WAVE "..\sound\wav\sound_Wooden_Harp_E.wav"
+sound_Wooden_Harp_F WAVE "..\sound\wav\sound_Wooden_Harp_F.wav"
+sound_Wooden_Harp_G WAVE "..\sound\wav\sound_Wooden_Harp_G.wav"
+
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////