373 lines
10 KiB
C++
Executable File
373 lines
10 KiB
C++
Executable File
#include "math.h"
|
|
#include <windows.h>
|
|
#include <mmsystem.h>
|
|
|
|
#include "stdio.h"
|
|
|
|
#include "global.h"
|
|
#include "exlsound.h"
|
|
#include "text.h"
|
|
#include "fields.h"
|
|
|
|
#define NUM_SOUNDS 100
|
|
|
|
HGLOBAL sound_handles[NUM_SOUNDS];
|
|
char far *snds[NUM_SOUNDS];
|
|
|
|
extern HANDLE store_hInstance;
|
|
extern scenario_data_type far scenario;
|
|
|
|
extern Boolean play_sounds,in_startup_mode;
|
|
extern HWND mainPtr;
|
|
extern Boolean gInBackground;
|
|
extern party_record_type far party;
|
|
extern Boolean cat,cow,chicken,dog,sheep,monsters_going;
|
|
extern short num_chirps_played,overall_mode;
|
|
|
|
short last_played = 10000;
|
|
short error_beeps = 0;
|
|
short store_last_sound_played = 0;
|
|
|
|
Boolean far always_asynch[100] = {FALSE,FALSE,FALSE,FALSE,FALSE,
|
|
TRUE,TRUE,FALSE,FALSE,FALSE,
|
|
TRUE,FALSE,FALSE,FALSE,FALSE, // 10
|
|
FALSE,FALSE,FALSE,FALSE,FALSE,
|
|
FALSE,FALSE,TRUE,FALSE,TRUE, // 20
|
|
TRUE,FALSE,FALSE,FALSE,FALSE,
|
|
FALSE,FALSE,FALSE,FALSE,TRUE, // 30
|
|
FALSE,FALSE,TRUE,FALSE,TRUE,
|
|
FALSE,TRUE,TRUE,TRUE,TRUE, // 40
|
|
TRUE,TRUE,TRUE,TRUE,TRUE,
|
|
TRUE,FALSE,FALSE,TRUE,FALSE, // 50
|
|
TRUE,FALSE,FALSE,FALSE,FALSE,
|
|
FALSE,TRUE,FALSE,FALSE,FALSE, // 60
|
|
FALSE,FALSE,FALSE,FALSE,FALSE,
|
|
FALSE,FALSE,FALSE,FALSE,FALSE, // 70
|
|
FALSE,TRUE,TRUE,TRUE,TRUE,
|
|
TRUE,TRUE,TRUE,TRUE,FALSE, // 80
|
|
TRUE,FALSE,FALSE,FALSE,FALSE,
|
|
FALSE,TRUE,FALSE,FALSE,FALSE, // 90
|
|
FALSE,FALSE,FALSE,FALSE,FALSE};
|
|
Boolean far load_when_play[100] = {
|
|
0,0,1,1,1,0,0,1,1,1,
|
|
0,0,0,1,0,1,1,1,1,1,
|
|
1,1,0,1,1,1,1,0,1,1,
|
|
1,1,1,1,0,1,1,0,1,1,
|
|
1,1,1,1,1,1,1,0,0,0,
|
|
0,1,1,0,1,0,1,1,1,1, // 50
|
|
1,0,1,1,1,1,1,1,1,0,
|
|
0,0,0,0,0,0,0,0,0,0, // 70
|
|
1,1,1,1,1,0,0,0,0,0,
|
|
1,0,1,1,1,1,1,1,1,0
|
|
};
|
|
|
|
short far can_ignore[100] = {
|
|
0,0,0,0,0,5,3,0,0,0,
|
|
5,5,5,0,5,0,0,0,0,0,
|
|
0,0,5,0,0,0,0,0,0,2,
|
|
2,2,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,1,1,1,
|
|
1,0,0,5,0,1,0,0,0,0, // 50
|
|
0,0,0,0,5,0,0,0,0,0,
|
|
0,0,0,0,0, 0,5,5,5,5, // 70
|
|
4,4,4,4,0,0,0,0,0,0,
|
|
0,5,5,0,0,0,0,0,0,0};
|
|
// 1 - polite asych, 1 or 2 or 3- lose easily when pref is set for fewer snds
|
|
// 3 can be async
|
|
// 4 - nostop asynch ... when 4, this sound is NOSTOP, i.e. when played, is played
|
|
// asynch, and refuses all other sounds. Sounds that come in are ignored, and
|
|
// disappear into the ether
|
|
// 5 - finally, bold asynch ... when 5, this sound is NOSTOP, i.e. when played, is played
|
|
// asynch, and refuses all other sounds. When a sound is played on top of this, game
|
|
// hangs on until sound is done, and then and only then plays later sound.
|
|
|
|
|
|
short num_devs;
|
|
Boolean sounds_fucked = FALSE;
|
|
long intro_music_start_time = -1;
|
|
|
|
void load_sounds ()
|
|
{
|
|
short i,t,err;
|
|
HRSRC h;
|
|
char snd_name[20],str[60];
|
|
WAVEOUTCAPS wavecaps;
|
|
|
|
t = waveOutGetNumDevs();
|
|
if (t == 0) {
|
|
sounds_fucked = TRUE;
|
|
return;
|
|
}
|
|
err = waveOutGetDevCaps(0,&wavecaps,sizeof(WAVEOUTCAPS));
|
|
if (err != 0) {
|
|
sounds_fucked = TRUE;
|
|
switch (err) {
|
|
case MMSYSERR_BADDEVICEID:
|
|
MessageBox(mainPtr,"Cannot initialize sounds - No sound device detected. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
case MMSYSERR_NODRIVER:
|
|
MessageBox(mainPtr,"Cannot initialize sounds - No driver installed. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
case MMSYSERR_NOMEM :
|
|
MessageBox(mainPtr,"Cannot initialize sounds - can't find enough memory. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
case MMSYSERR_ALLOCATED:
|
|
MessageBox(mainPtr,"Cannot initialize sounds - sound card already allocated. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
case MMSYSERR_ERROR:
|
|
MessageBox(mainPtr,"Cannot initialize sounds - internal error. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
default:
|
|
MessageBox(mainPtr,"Cannot initialize sounds - unidentified error. Game can still be played, but quietly.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (i = 0; i < NUM_SOUNDS; i++) {
|
|
sound_handles[i] = NULL;
|
|
if (load_when_play[i] == FALSE) {
|
|
sprintf((char *)snd_name,"#%d",i + 1);
|
|
h = FindResource(store_hInstance,snd_name,"#100");
|
|
|
|
sound_handles[i] = LoadResource(store_hInstance,h);
|
|
snds[i] = LockResource(sound_handles[i]);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void play_sound(short which) // if < 0, play asynch
|
|
{
|
|
if (PSD[304][9] > 0)
|
|
return;
|
|
if (in_startup_mode == TRUE) {
|
|
// put some in foreground check here
|
|
}
|
|
if (play_sounds == TRUE)
|
|
force_play_sound(which);
|
|
}
|
|
|
|
|
|
void force_play_sound(short which)
|
|
{
|
|
short i,err,num_fails = 0;
|
|
char snd_name[30],str[60];
|
|
Boolean asyn = FALSE,a_sound_did_get_played = FALSE,sound_played_nostop = FALSE;
|
|
Boolean not_asyn = FALSE,check_sound;
|
|
long dummy;
|
|
HRSRC h;
|
|
char far *snd;
|
|
DWORD size;
|
|
|
|
if ((sounds_fucked == TRUE) || (play_sounds == FALSE))
|
|
return;
|
|
if (which < 0) {
|
|
asyn = TRUE;
|
|
which = which * -1;
|
|
}
|
|
if (which >= 1000) {
|
|
which -= 1000;
|
|
not_asyn = TRUE;
|
|
}
|
|
|
|
if ((which != 22) && (intro_music_start_time > 0) && (GetCurrentTime() - intro_music_start_time < 8000))
|
|
return;
|
|
else if ((intro_music_start_time > 0) && (sound_handles[22] != NULL)) {
|
|
UnlockResource(sound_handles[22]);
|
|
FreeResource(sound_handles[22]);
|
|
sound_handles[22] = NULL;
|
|
}
|
|
if (which == 22)
|
|
intro_music_start_time = GetCurrentTime();
|
|
|
|
if (which >= 100)
|
|
return;
|
|
|
|
if ((always_asynch[which] == TRUE) &&
|
|
((can_ignore[which] == 1) || (can_ignore[which] >= 3)))
|
|
asyn = TRUE;
|
|
if ((can_ignore[which] > 0) && (can_ignore[which] < 5) && (party.stuff_done[305][5] == 1))
|
|
return;
|
|
if ((can_ignore[which] != 1) && (can_ignore[which] < 3))
|
|
asyn = FALSE;
|
|
if ((party.stuff_done[305][5] == 1) && (can_ignore[which] < 5))
|
|
asyn = FALSE;
|
|
if (not_asyn == TRUE)
|
|
asyn = FALSE;
|
|
|
|
//print_nums(1000 + can_ignore[which],which,(short) asyn);
|
|
|
|
if ((load_when_play[which] == TRUE) && (sound_handles[which] == NULL)) {
|
|
// if (can_ignore[which] != 4)
|
|
asyn = FALSE;
|
|
sprintf((char *)snd_name,"#%d",which + 1);
|
|
h = FindResource(store_hInstance,snd_name,"#100");
|
|
|
|
sound_handles[which] = LoadResource(store_hInstance,h);
|
|
snds[which] = LockResource(sound_handles[which]);
|
|
|
|
// ASB("Loaded sound:");
|
|
// print_nums(0,0,which);
|
|
}
|
|
|
|
if (store_last_sound_played == 6) {
|
|
//ASB("Interrupted snd.");
|
|
sndPlaySound(NULL,0);
|
|
}
|
|
|
|
if (asyn == TRUE) {
|
|
if (can_ignore[which] >= 4)
|
|
check_sound = sndPlaySound(snds[which],SND_ASYNC | SND_MEMORY | SND_NOSTOP);
|
|
else check_sound = sndPlaySound(snds[which],SND_ASYNC | SND_MEMORY);
|
|
|
|
while (check_sound == FALSE) {
|
|
|
|
if (can_ignore[store_last_sound_played] == 4) {// then sound goes away
|
|
//ASB("Sound overruled by asynch sound.");
|
|
return;
|
|
}
|
|
|
|
|
|
num_fails++;
|
|
if (num_fails < 40)
|
|
sound_pause(25);
|
|
else {
|
|
MessageBox(mainPtr,"Cannot play sounds - Sounds stuck error a. Game can still be played, but quietly. Check to make sure your sound drivers are up to date and not corrupted.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
print_nums(111,which,num_fails);
|
|
sounds_fucked = TRUE;
|
|
return;
|
|
}
|
|
//ASB ("Asynch clearing buffer!!!");
|
|
//check_sound = sndPlaySound(snds[99],SND_SYNC | SND_MEMORY);
|
|
sndPlaySound(NULL,0);
|
|
|
|
if (can_ignore[which] >= 4)
|
|
check_sound = sndPlaySound(snds[which],SND_ASYNC | SND_MEMORY | SND_NOSTOP);
|
|
else check_sound = sndPlaySound(snds[which],SND_ASYNC | SND_MEMORY);
|
|
}
|
|
a_sound_did_get_played = TRUE;
|
|
}
|
|
else {
|
|
if (can_ignore[which] >= 4)
|
|
check_sound = sndPlaySound(snds[which],SND_SYNC | SND_MEMORY | SND_NOSTOP);
|
|
else check_sound = sndPlaySound(snds[which],SND_SYNC | SND_MEMORY);
|
|
while (check_sound == FALSE) {
|
|
if (can_ignore[store_last_sound_played] == 4) {// then sound goes away
|
|
//ASB("Sound overruled by asynch sound.");
|
|
return;
|
|
}
|
|
|
|
|
|
num_fails++;
|
|
if (num_fails < 40)
|
|
sound_pause(25);
|
|
else {
|
|
MessageBox(mainPtr,"Cannot play sounds - Sounds stuck error b. Game can still be played, but quietly. Check to make sure your sound drivers are up to date and not corrupted.",
|
|
"Sound Error",MB_OK | MB_ICONEXCLAMATION);
|
|
print_nums(222,which,num_fails);
|
|
sounds_fucked = TRUE;
|
|
return;
|
|
}
|
|
//ASB ("Asynch clearing buffer!!!");
|
|
//check_sound = sndPlaySound(snds[99],SND_SYNC | SND_MEMORY);
|
|
sndPlaySound(NULL,0);
|
|
|
|
if (can_ignore[which] >= 4)
|
|
check_sound = sndPlaySound(snds[which],SND_SYNC | SND_MEMORY | SND_NOSTOP);
|
|
else check_sound = sndPlaySound(snds[which],SND_SYNC | SND_MEMORY);
|
|
}
|
|
a_sound_did_get_played = TRUE;
|
|
}
|
|
|
|
store_last_sound_played = which;
|
|
|
|
if ((load_when_play[which] == TRUE) && (asyn == FALSE)) {
|
|
// deleted a seemingly extraneous LoadResource here
|
|
//ASB("Dumped a sound.");
|
|
UnlockResource(sound_handles[which]);
|
|
FreeResource(sound_handles[which]);
|
|
sound_handles[which] = NULL;
|
|
}
|
|
//else if (load_when_play[which] == TRUE) ASB("Kept a temp. sound.");
|
|
for (i = 0; i < NUM_SOUNDS; i++)
|
|
if ((load_when_play[which] == TRUE) && (sound_handles[which] != NULL)
|
|
&& (a_sound_did_get_played == TRUE) && (i != which)){
|
|
// deleted a seemingly extraneous LoadResource here
|
|
UnlockResource(sound_handles[i]);
|
|
FreeResource(sound_handles[i]);
|
|
sound_handles[i] = NULL;
|
|
//ASB("Kept sound dumped:");
|
|
//print_nums(0,0,i);
|
|
}
|
|
|
|
}
|
|
|
|
void kill_sound()
|
|
{
|
|
sndPlaySound(NULL,0);
|
|
}
|
|
void one_sound(short which)
|
|
{
|
|
if (which == last_played)
|
|
return;
|
|
play_sound(which);
|
|
last_played = which;
|
|
}
|
|
|
|
void clear_sound_memory()
|
|
{
|
|
last_played = 100;
|
|
}
|
|
|
|
void flip_sound()
|
|
{
|
|
play_sounds = (play_sounds == TRUE) ? FALSE : TRUE;
|
|
}
|
|
|
|
void sound_pause(long len) {
|
|
long t1,t2;
|
|
|
|
t1 = (long) GetCurrentTime();
|
|
t2 = t1;
|
|
while (t2 - t1 < len) {
|
|
t2 = (long)GetCurrentTime();
|
|
}
|
|
}
|
|
void move_sound(unsigned char ter,short step)
|
|
{
|
|
short pic,spec;
|
|
|
|
pic = scenario.ter_types[ter].picture;
|
|
spec = scenario.ter_types[ter].special;
|
|
|
|
if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_boat >= 0)) {
|
|
if (spec == 21)
|
|
return;
|
|
play_sound(48);
|
|
}
|
|
else if ((monsters_going == FALSE) && (overall_mode < 10) && (party.in_horse >= 0)) {////
|
|
play_sound(85);
|
|
}
|
|
else if ((ter >= 84) && (ter <= 89))
|
|
play_sound(47);
|
|
else if ((pic == 80) || (pic == 76)) // already played in special terrain check
|
|
;
|
|
else if (pic == 180)
|
|
play_sound(55);
|
|
else if (step % 2 == 0)
|
|
play_sound(49);
|
|
else play_sound(50);
|
|
}
|
|
|
|
void incidental_noises()
|
|
{}
|