From b73f9ab41ecada2a9971834e1ef1bb4c106cbec3 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sun, 13 Sep 2009 21:41:29 +0000 Subject: KYRA: - add sfx support for PC98-Version svn-id: r44074 --- engines/kyra/kyra_lok.cpp | 12 ++++++++-- engines/kyra/kyra_lok.h | 3 +++ engines/kyra/seqplayer.cpp | 8 +++++++ engines/kyra/sound.h | 9 +++++++- engines/kyra/sound_adlib.h | 1 + engines/kyra/sound_intern.h | 3 ++- engines/kyra/sound_lok.cpp | 7 ++++++ engines/kyra/sound_towns.cpp | 22 +++++++++++++----- engines/kyra/staticres.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 108 insertions(+), 10 deletions(-) (limited to 'engines/kyra') diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp index cb0499c38b..e68a73bb29 100644 --- a/engines/kyra/kyra_lok.cpp +++ b/engines/kyra/kyra_lok.cpp @@ -195,7 +195,10 @@ Common::Error KyraEngine_LoK::init() { if (!_sound->init()) error("Couldn't init sound"); - _sound->loadSoundFile(0); + if (_flags.platform == Common::kPlatformPC98) + _sound->loadSoundFile(_introSfxDataPC98, _introSfxDataPC98Size); + else + _sound->loadSoundFile(0); setupButtonData(); @@ -334,8 +337,13 @@ Common::Error KyraEngine_LoK::go() { void KyraEngine_LoK::startup() { static const uint8 colorMap[] = { 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0 }; _screen->setTextColorMap(colorMap); + _sound->setSoundList(&_soundData[kMusicIngame]); - _sound->loadSoundFile(0); + if (_flags.platform == Common::kPlatformPC98) + _sound->loadSoundFile("se.dat"); + else + _sound->loadSoundFile(0); + // _screen->setFont(Screen::FID_6_FNT); _screen->setAnimBlockPtr(3750); memset(_sceneAnimTable, 0, sizeof(_sceneAnimTable)); diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index 5d20cb0652..f89caef142 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -510,6 +510,9 @@ protected: static const int8 _amigaTrackMap[]; static const int _amigaTrackMapSize; + static const uint8 _introSfxDataPC98[]; + static const int _introSfxDataPC98Size; + // TODO: get rid of all variables having pointers to the static resources if possible // i.e. let them directly use the _staticres functions void initStaticResource(); diff --git a/engines/kyra/seqplayer.cpp b/engines/kyra/seqplayer.cpp index 3536d2db06..4837fb03dd 100644 --- a/engines/kyra/seqplayer.cpp +++ b/engines/kyra/seqplayer.cpp @@ -415,6 +415,14 @@ void SeqPlayer::s1_fillRect() { void SeqPlayer::s1_playEffect() { uint8 track = *_seqData++; _vm->delay(3 * _vm->tickLength()); + + if (_vm->gameFlags().platform == Common::kPlatformPC98) { + if (track > 21 && track < 38) + track -= 22; + else + return; + } + _sound->playSoundEffect(track); } diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h index 2f24a264f1..e81b18d8a4 100644 --- a/engines/kyra/sound.h +++ b/engines/kyra/sound.h @@ -107,6 +107,12 @@ public: */ virtual void loadSoundFile(Common::String file) = 0; + /** + * Load hard coded data for playing music + * (and somtimes sound effects) from. + */ + virtual void loadSoundFile(const uint8 *data, int len) { } + /** * Load a sound file for playing sound * effects from. @@ -268,7 +274,8 @@ public: bool hasSoundFile(uint file) const { return _music->hasSoundFile(file) && _sfx->hasSoundFile(file); } void loadSoundFile(uint file) { _music->loadSoundFile(file); _sfx->loadSoundFile(file); } void loadSoundFile(Common::String file) { _music->loadSoundFile(file); _sfx->loadSoundFile(file); } - + + void loadSoundFile(const uint8 *data, int len) { _sfx->loadSoundFile(data, len); } void loadSfxFile(Common::String file) { _sfx->loadSoundFile(file); } void playTrack(uint8 track) { _music->playTrack(track); } diff --git a/engines/kyra/sound_adlib.h b/engines/kyra/sound_adlib.h index f384113af7..e85beff813 100644 --- a/engines/kyra/sound_adlib.h +++ b/engines/kyra/sound_adlib.h @@ -72,6 +72,7 @@ public: void loadSoundFile(uint file); void loadSoundFile(Common::String file); + void loadSoundFile(const uint8 *data, int len) {} void playTrack(uint8 track); void haltTrack(); diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 3ee468b87b..b84b1c4bf5 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -171,7 +171,8 @@ public: void process() {} void loadSoundFile(uint file) {} - void loadSoundFile(Common::String) {} + void loadSoundFile(Common::String file); + void loadSoundFile(const uint8 *data, int len); void playTrack(uint8 track); void haltTrack(); diff --git a/engines/kyra/sound_lok.cpp b/engines/kyra/sound_lok.cpp index 8aab4f6ce7..f14e4eae84 100644 --- a/engines/kyra/sound_lok.cpp +++ b/engines/kyra/sound_lok.cpp @@ -29,6 +29,13 @@ namespace Kyra { void KyraEngine_LoK::snd_playSoundEffect(int track, int volume) { + if (_flags.platform == Common::kPlatformPC98) { + if (track < 16 || track > 119) + track = 58; + else + track -= 16; + } + if ((_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) && track == 49) { snd_playWanderScoreViaMap(56, 1); return; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index fe0a44c052..0c67b1e83a 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -4069,12 +4069,25 @@ SoundPC98::~SoundPC98() { bool SoundPC98::init() { _driver = new TownsPC98_OpnDriver(_mixer, TownsPC98_OpnDriver::OD_TYPE26); - _sfxTrackData = _vm->resource()->fileData("se.dat", 0); - if (!_sfxTrackData) - return false; + return _driver->init(); } +void SoundPC98::loadSoundFile(Common::String file) { + if (_sfxTrackData) + delete _sfxTrackData; + + _sfxTrackData = _vm->resource()->fileData(file.c_str(), 0); +} + +void SoundPC98::loadSoundFile(const uint8 *data, int len) { + if (_sfxTrackData) + delete _sfxTrackData; + + _sfxTrackData = new uint8[len]; + memcpy(_sfxTrackData, data, len); +} + void SoundPC98::playTrack(uint8 track) { track += extraOffset(); @@ -4119,9 +4132,6 @@ void SoundPC98::playSoundEffect(uint8 track) { if (!_sfxTrackData) return; - // This has been disabled for now since I don't know - // how to make up the correct track number. It probably - // needs a map. _driver->loadSoundEffectData(_sfxTrackData, track); } diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index d8928b5dba..5c3f57085e 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -2441,6 +2441,59 @@ const int8 KyraEngine_LoK::_amigaTrackMap[] = { const int KyraEngine_LoK::_amigaTrackMapSize = ARRAYSIZE(KyraEngine_LoK::_amigaTrackMap); +const uint8 KyraEngine_LoK::_introSfxDataPC98[] = { + 0x56, 0x00, 0x43, 0x00, 0x7C, 0x00, 0x69, 0x00, 0xA2, 0x00, 0x8F, 0x00, 0x00, 0x00, 0xB5, 0x00, + 0x00, 0x00, 0xE5, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x45, 0x01, + 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x68, 0x01, 0x8D, 0x01, 0x7C, 0x01, 0xBD, 0x01, 0x9E, 0x01, + 0xF0, 0x01, 0xDC, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x2B, 0x02, 0x59, 0x02, 0x40, 0x02, + 0xF1, 0x00, 0xFF, 0xF1, 0x09, 0x32, 0x81, 0x49, 0x81, 0x52, 0x81, 0x59, 0x81, 0xF7, 0x01, 0x03, + 0xC7, 0x00, 0xFF, 0x42, 0x32, 0xFF, 0xF1, 0x05, 0x30, 0x81, 0x47, 0x81, 0x50, 0x81, 0x57, 0x81, + 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x41, 0x32, 0xFF, 0xF1, 0x0C, 0x32, 0x81, 0x49, 0x81, 0x52, + 0x81, 0x59, 0x81, 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x42, 0x32, 0xFF, 0xF1, 0x08, 0x30, 0x81, + 0x47, 0x81, 0x50, 0x81, 0x57, 0x81, 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x41, 0x32, 0xFF, 0xF1, + 0x0F, 0x32, 0x81, 0x49, 0x81, 0x52, 0x81, 0x59, 0x81, 0xF7, 0x01, 0x03, 0xC7, 0x00, 0xFF, 0x42, + 0x32, 0xFF, 0xF1, 0x0C, 0x30, 0x81, 0x47, 0x81, 0x50, 0x81, 0x57, 0x81, 0xF7, 0x01, 0x03, 0xC7, + 0x00, 0xFF, 0x41, 0x32, 0xFF, 0xF1, 0x0A, 0x39, 0x01, 0x44, 0x01, 0x49, 0x01, 0xFC, 0xF6, 0x05, + 0x05, 0xB7, 0x00, 0x39, 0x01, 0x44, 0x01, 0x49, 0x01, 0xF6, 0x02, 0x02, 0xC3, 0x00, 0xFB, 0xFB, + 0xFB, 0xFB, 0x39, 0x01, 0x44, 0x01, 0x49, 0x01, 0xF6, 0x02, 0x02, 0xD2, 0x00, 0xFC, 0xFC, 0xF6, + 0x05, 0x05, 0xC3, 0x00, 0xFF, 0xF1, 0x0F, 0x69, 0x81, 0x59, 0x81, 0x49, 0x01, 0x39, 0x81, 0x54, + 0x01, 0xF6, 0x02, 0x02, 0xED, 0x00, 0x80, 0x04, 0xFB, 0xFB, 0xFB, 0xF6, 0x03, 0x03, 0xED, 0x00, + 0xFF, 0xF1, 0x0C, 0x69, 0x81, 0x49, 0x81, 0x59, 0x81, 0x39, 0x01, 0x62, 0x81, 0x57, 0x01, 0x60, + 0x01, 0xFC, 0xF6, 0x03, 0x03, 0x0B, 0x01, 0x62, 0x81, 0x57, 0x01, 0x60, 0x01, 0xFB, 0xF6, 0x03, + 0x03, 0x17, 0x01, 0xFB, 0xFB, 0xFB, 0xF6, 0x05, 0x05, 0x0B, 0x01, 0xFF, 0xF1, 0x0F, 0xF4, 0x09, + 0xF7, 0x01, 0x01, 0x54, 0x01, 0xC8, 0x27, 0x09, 0xF4, 0x42, 0x10, 0x08, 0xFB, 0xF6, 0x0E, 0x0E, + 0x3A, 0x01, 0xF4, 0x80, 0xFF, 0xF1, 0x08, 0xF4, 0x41, 0x10, 0x01, 0xFC, 0xF6, 0x07, 0x07, 0x49, + 0x01, 0xF4, 0x80, 0xFF, 0xF1, 0x0C, 0xF9, 0x0E, 0xFA, 0x12, 0x64, 0x04, 0x0B, 0x60, 0x03, 0x80, + 0x03, 0x60, 0x03, 0x80, 0x03, 0x60, 0x12, 0xFF, 0xF1, 0x0C, 0xF9, 0x0E, 0xFA, 0x12, 0x18, 0x04, + 0x0B, 0x70, 0x02, 0x80, 0x02, 0x72, 0x02, 0x80, 0x02, 0x73, 0x0B, 0xFF, 0xF1, 0x0E, 0xF3, 0x00, + 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x30, 0x30, 0xF1, 0x07, 0x3B, 0x0A, 0xFF, 0xF1, 0x0C, 0xF3, + 0x0A, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x60, 0x30, 0xF1, 0x05, 0x6B, 0x0A, 0xFF, 0xF1, 0x0E, + 0xF3, 0x00, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x30, 0x30, 0xF1, 0x0C, 0x69, 0x01, 0x75, 0x02, + 0x72, 0x01, 0x64, 0x02, 0x70, 0x01, 0xFB, 0xF6, 0x0B, 0x0B, 0xAC, 0x01, 0xFF, 0xF1, 0x0C, 0xF3, + 0x0A, 0xF7, 0x01, 0x05, 0x39, 0xFF, 0xFF, 0x60, 0x31, 0xF1, 0x0A, 0x69, 0x01, 0x75, 0x02, 0x72, + 0x01, 0x64, 0x02, 0x70, 0x01, 0xFB, 0xF6, 0x09, 0x09, 0xCB, 0x01, 0xFF, 0xF1, 0x0F, 0xF3, 0x00, + 0x24, 0x81, 0x29, 0x01, 0xF6, 0x08, 0x08, 0xE0, 0x01, 0xFB, 0xF6, 0x0E, 0x0E, 0xE0, 0x01, 0xFF, + 0xF1, 0x0F, 0xF3, 0x0D, 0x24, 0x81, 0x22, 0x01, 0xF6, 0x08, 0x08, 0xF4, 0x01, 0xFB, 0xF6, 0x0E, + 0x0E, 0xF4, 0x01, 0xFF, 0xF1, 0x0C, 0x29, 0x81, 0xFC, 0x24, 0x81, 0xFC, 0x29, 0x81, 0xFC, 0x34, + 0x81, 0x35, 0x81, 0x36, 0x81, 0x35, 0x81, 0x34, 0x81, 0x33, 0x81, 0x32, 0x81, 0x33, 0x01, 0xF6, + 0x02, 0x02, 0x0F, 0x02, 0xFB, 0xF6, 0x0E, 0x0E, 0x0F, 0x02, 0xFF, 0xF1, 0x0F, 0xF4, 0x0B, 0x29, + 0x81, 0x27, 0x81, 0xF4, 0x43, 0x29, 0x02, 0xFB, 0xF6, 0x0E, 0x0E, 0x35, 0x02, 0xF4, 0x80, 0xFF, + 0xF1, 0x0E, 0xF7, 0x01, 0x01, 0x09, 0x03, 0xFF, 0x44, 0x08, 0xF1, 0x0C, 0xF7, 0x01, 0x04, 0xC8, + 0x00, 0xFF, 0x1B, 0x1E, 0xF1, 0x06, 0x1B, 0x1E, 0xFF, 0xF1, 0x0F, 0xF4, 0x4F, 0xF7, 0x01, 0x05, + 0xC7, 0x00, 0xFF, 0x19, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0xFB, 0x10, 0x04, + 0xFB, 0xF6, 0x07, 0x07, 0x6E, 0x02, 0xF1, 0x08, 0x10, 0x04, 0xFB, 0xF6, 0x07, 0x07, 0x78, 0x02, + 0xF4, 0x80, 0xFF, 0xF1, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +const int KyraEngine_LoK::_introSfxDataPC98Size = ARRAYSIZE(KyraEngine_LoK::_introSfxDataPC98); + // kyra engine v2 static data const int GUI_v2::_sliderBarsPosition[] = { -- cgit v1.2.3