aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/sound.cpp249
-rw-r--r--engines/hopkins/sound.h54
2 files changed, 298 insertions, 5 deletions
diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp
index 42eb98ec63..e43f66fd4a 100644
--- a/engines/hopkins/sound.cpp
+++ b/engines/hopkins/sound.cpp
@@ -21,8 +21,11 @@
*/
#include "common/system.h"
+#include "common/file.h"
#include "common/textconsole.h"
#include "hopkins/sound.h"
+#include "hopkins/globals.h"
+#include "hopkins/hopkins.h"
namespace Hopkins {
@@ -39,6 +42,15 @@ SoundManager::SoundManager() {
VOICEOFF = true;
TEXTOFF = false;
SOUND_FLAG = false;
+ VBL_MERDE = false;
+ CARD_SB = false;
+
+ for (int i = 0; i < VOICE_COUNT; ++i)
+ Common::fill((byte *)&Voice[i], (byte *)&Voice[i] + sizeof(VoiceItem), 0);
+ for (int i = 0; i < SWAV_COUNT; ++i)
+ Common::fill((byte *)&Swav[i], (byte *)&Swav[i] + sizeof(SwavItem), 0);
+ for (int i = 0; i < 2; ++i)
+ Common::fill((byte *)&Music[i], (byte *)&Music[i] + sizeof(MusicItem), 0);
}
void SoundManager::setParent(HopkinsEngine *vm) {
@@ -63,16 +75,174 @@ void SoundManager::LOAD_WAV(const Common::String &file, int a2) {
}
void SoundManager::PLAY_ANM_SOUND(int soundNumber) {
- warning("TODO: PLAAY_ANIM_SOUND");
+ if (!_vm->_globals.CENSURE && SPECIAL_SOUND == 2) {
+ if (soundNumber == 20)
+ PLAY_SAMPLE2(5);
+ if (soundNumber == 57)
+ PLAY_SAMPLE2(1);
+ if (soundNumber == 63)
+ PLAY_SAMPLE2(1);
+ if (soundNumber == 69)
+ PLAY_SAMPLE2(1);
+ if (soundNumber == 75)
+ PLAY_SAMPLE2(2);
+ if (soundNumber == 109)
+ PLAY_SAMPLE2(3);
+ if (soundNumber == 122)
+ PLAY_SAMPLE2(4);
+ }
+ if (SPECIAL_SOUND == 1 && soundNumber == 17)
+ PLAY_SOUND("SOUND42.WAV");
+ if (SPECIAL_SOUND == 199 && soundNumber == 72)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 198 && soundNumber == 15)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 16 && soundNumber == 25)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 14 && soundNumber == 625)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 208 && soundNumber == 40)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 210 && soundNumber == 2)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 211 && soundNumber == 22)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 5 && soundNumber == 19)
+ PLAY_WAV(1);
+ if (SPECIAL_SOUND == 17) {
+ if (soundNumber == 6)
+ PLAY_SAMPLE2(1);
+ if (soundNumber == 14)
+ PLAY_SAMPLE2(2);
+ if (soundNumber == 67)
+ PLAY_SAMPLE2(3);
+ }
+ if (SPECIAL_SOUND == 229) {
+ if (soundNumber == 15)
+ PLAY_WAV(1);
+ if (soundNumber == 91)
+ PLAY_WAV(2);
+ }
}
void SoundManager::WSOUND(int soundNumber) {
warning("TODO: WSOUND");
}
-bool SoundManager::VOICE_MIX(int a1, int a2) {
- warning("TODO: VOICE_MIX");
- return false;
+bool SoundManager::VOICE_MIX(int voiceId, int voiceMode) {
+ int fileNumber;
+ int oldMusicVol;
+ bool breakFlag;
+ Common::String prefix;
+ Common::String filename;
+ Common::File f;
+ int catPos;
+
+ fileNumber = voiceId;
+ if (!CARD_SB || VOICEOFF == 1)
+ return false;
+
+ if ((unsigned int)(voiceMode - 1) <= 1
+ && (voiceId == 4
+ || voiceId == 16
+ || voiceId == 121
+ || voiceId == 142
+ || voiceId == 182
+ || voiceId == 191
+ || voiceId == 212
+ || voiceId == 225
+ || voiceId == 239
+ || voiceId == 245
+ || voiceId == 297
+ || voiceId == 308
+ || voiceId == 333
+ || voiceId == 348
+ || voiceId == 352
+ || voiceId == 358
+ || voiceId == 364
+ || voiceId == 371
+ || voiceId == 394
+ || voiceId == 414
+ || voiceId == 429
+ || voiceId == 442
+ || voiceId == 446
+ || voiceId == 461
+ || voiceId == 468
+ || voiceId == 476
+ || voiceId == 484
+ || voiceId == 491
+ || voiceId == 497
+ || voiceId == 501
+ || voiceId == 511
+ || voiceId == 520
+ || voiceId == 536
+ || voiceId == 554
+ || voiceId == 566
+ || voiceId == 573
+ || voiceId == 632
+ || voiceId == 645))
+ fileNumber = 684;
+
+ if ((unsigned int)(voiceMode - 1) <= 1) {
+ prefix = "DF";
+ }
+ if (voiceMode == 3) {
+ prefix = "IF";
+ }
+ if (voiceMode == 4) {
+ prefix = "TF";
+ }
+ if (voiceMode == 5) {
+ prefix = "OF";
+ }
+
+ filename = Common::String::format("%s%d.WAV", prefix.c_str(), fileNumber);
+
+ if (!_vm->_fileManager.RECHERCHE_CAT(filename, 9)) {
+ if (_vm->_globals.FR == 1)
+ _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VFR.RES");
+ if (!_vm->_globals.FR)
+ _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VAN.RES");
+ if (_vm->_globals.FR == 2)
+ _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, "RES_VES.RES");
+
+ catPos = _vm->_globals.CAT_POSI;
+ } else {
+ _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPVOICE, filename);
+
+ if (!f.exists(_vm->_globals.NFICHIER))
+ return false;
+
+ catPos = 0;
+ }
+
+ SDL_LVOICE(catPos);
+ oldMusicVol = MUSICVOL;
+ if (!MUSICOFF && MUSICVOL > 2)
+ MUSICVOL = (signed int)((long double)MUSICVOL - (long double)MUSICVOL / 100.0 * 45.0);
+
+ PLAY_VOICE_SDL();
+
+ breakFlag = 0;
+ do {
+ if (SPECIAL_SOUND != 4 && !VBL_MERDE)
+ _vm->_eventsManager.VBL();
+ if (_vm->_eventsManager.BMOUSE())
+ break;
+ _vm->_eventsManager.CONTROLE_MES();
+ if (_vm->_eventsManager.ESC_KEY)
+ break;
+ if (!VOICE_STAT(2))
+ breakFlag = true;
+ } while (!_vm->shouldQuit() && !breakFlag);
+
+
+ STOP_VOICE(2);
+ DEL_SAMPLE_SDL(20);
+ MUSICVOL = oldMusicVol;
+ _vm->_eventsManager.ESC_KEY = false;
+ VBL_MERDE = 0;
+ return true;
}
void SoundManager::DEL_SAMPLE(int soundNumber) {
@@ -111,4 +281,75 @@ void SoundManager::PLAY_WAV(int a1) {
warning("PLAY_WAV");
}
+bool SoundManager::VOICE_STAT(int voiceIndex) {
+ return Voice[voiceIndex].active;
+}
+
+void SoundManager::STOP_VOICE(int voiceIndex) {
+ int wavIndex;
+
+ if (Voice[voiceIndex].active) {
+ Voice[voiceIndex].active = false;
+ wavIndex = Voice[voiceIndex].wavIndex;
+ if (Swav[wavIndex].active) {
+ if (Swav[wavIndex].field24 == 1)
+ DEL_SAMPLE_SDL(wavIndex);
+ }
+ }
+ Voice[voiceIndex].audioLen = 0;
+ Voice[voiceIndex].fieldC = 0;
+ Voice[voiceIndex].audioBuf = NULL;
+ Voice[voiceIndex].active = false;
+ Voice[voiceIndex].field14 = 0;
+ Voice[voiceIndex].audioStream = NULL;
+}
+
+void SoundManager::SDL_LVOICE(int catPos) {
+ if (!SDL_LoadVoice(_vm->_globals.NFICHIER, catPos, Swav[20]))
+ error("Couldn't load the sample %s", _vm->_globals.NFICHIER.c_str());
+
+ Swav[20].active = true;
+}
+
+void SoundManager::PLAY_VOICE_SDL() {
+ if (!Swav[20].active)
+ error("Bad handle");
+
+ if (!Voice[2].active) {
+ int wavIndex = Voice[2].wavIndex;
+ if (Swav[wavIndex].active && Swav[wavIndex].field24 == 1)
+ DEL_SAMPLE_SDL(wavIndex);
+ }
+
+ Voice[2].audioLen = Swav[20].audioLen;
+ Voice[2].fieldC = 0;
+ Voice[2].audioBuf = Swav[20].audioBuf;
+ Voice[2].active = true;
+ Voice[2].field14 = 4;
+ Voice[2].audioStream = Swav[20].audioStream;
+}
+
+bool SoundManager::DEL_SAMPLE_SDL(int wavIndex) {
+ if (Swav[wavIndex].active) {
+ Swav[wavIndex].active = false;
+ free(Swav[wavIndex].audioBuf);
+ delete Swav[wavIndex].audioStream;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool SoundManager::SDL_LoadVoice(const Common::String &filename, size_t fileOffset, SwavItem &item) {
+ Common::File f;
+ if (!f.open(filename))
+ error("Could not open %s for reading", filename.c_str());
+
+ f.seek(fileOffset);
+ item.audioStream = Audio::makeWAVStream(&f, DisposeAfterUse::NO);
+ f.close();
+
+ return true;
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/sound.h b/engines/hopkins/sound.h
index 2dfdac7749..fc4c0f5231 100644
--- a/engines/hopkins/sound.h
+++ b/engines/hopkins/sound.h
@@ -25,14 +25,61 @@
#include "common/scummsys.h"
#include "common/str.h"
+#include "audio/audiostream.h"
+#include "audio/decoders/wave.h"
namespace Hopkins {
+class VoiceItem {
+public:
+ bool active;
+ int wavIndex;
+ Audio::RewindableAudioStream *audioStream;
+
+ // Decprecated fields
+ int audioLen;
+ int fieldC;
+ byte *audioBuf;
+
+ int field14;
+};
+
+class SwavItem {
+public:
+ bool active;
+ Audio::RewindableAudioStream *audioStream;
+
+ // Deprecated fields
+ int audioSpec;
+ byte *audioBuf;
+ int audioLen;
+
+ int field24;
+};
+
+class MusicItem {
+public:
+ byte field0;
+ byte field1;
+ int field16[50];
+};
+
+#define VOICE_COUNT 3
+#define SWAV_COUNT 50
+
class HopkinsEngine;
class SoundManager {
private:
HopkinsEngine *_vm;
+
+ bool VOICE_STAT(int voiceIndex);
+ void STOP_VOICE(int voiceIndex);
+ void SDL_LVOICE(int catPos);
+ void PLAY_VOICE_SDL();
+ bool DEL_SAMPLE_SDL(int wavIndex);
+ bool SDL_LoadVoice(const Common::String &filename, size_t fileOffset, SwavItem &item);
+
public:
int SPECIAL_SOUND;
int SOUNDVOL;
@@ -46,6 +93,11 @@ public:
bool VOICEOFF;
bool TEXTOFF;
bool SOUND_FLAG;
+ bool VBL_MERDE;
+ bool CARD_SB;
+ VoiceItem Voice[VOICE_COUNT];
+ SwavItem Swav[SWAV_COUNT];
+ MusicItem Music[2];
public:
SoundManager();
void setParent(HopkinsEngine *vm);
@@ -56,7 +108,7 @@ public:
void LOAD_WAV(const Common::String &file, int a2);
void PLAY_ANM_SOUND(int soundNumber);
void WSOUND(int soundNumber);
- bool VOICE_MIX(int a1, int a2);
+ bool VOICE_MIX(int voiceId, int voiceMode);
void DEL_SAMPLE(int soundNumber);
void PLAY_SOUND(const Common::String &file);
void PLAY_SOUND2(const Common::String &file2);