diff options
author | athrxx | 2019-04-01 00:55:17 +0200 |
---|---|---|
committer | athrxx | 2019-04-13 18:55:02 +0200 |
commit | 0ea6650837cce3007f0820acd17518f9809fd4a7 (patch) | |
tree | 507986e06df0d230cc2d1ee64b47efb87546b4e7 /engines/kyra/engine | |
parent | 972f4e201ade5660723f6348480437e2a02fa6de (diff) | |
download | scummvm-rg350-0ea6650837cce3007f0820acd17518f9809fd4a7.tar.gz scummvm-rg350-0ea6650837cce3007f0820acd17518f9809fd4a7.tar.bz2 scummvm-rg350-0ea6650837cce3007f0820acd17518f9809fd4a7.zip |
KYRA: (EOB2/Amiga) - implement proper sound file loading
(also fix some sound related bugs)
Diffstat (limited to 'engines/kyra/engine')
-rw-r--r-- | engines/kyra/engine/chargen.cpp | 6 | ||||
-rw-r--r-- | engines/kyra/engine/darkmoon.cpp | 90 | ||||
-rw-r--r-- | engines/kyra/engine/darkmoon.h | 10 | ||||
-rw-r--r-- | engines/kyra/engine/eob.cpp | 33 | ||||
-rw-r--r-- | engines/kyra/engine/eob.h | 3 | ||||
-rw-r--r-- | engines/kyra/engine/eobcommon.cpp | 6 | ||||
-rw-r--r-- | engines/kyra/engine/eobcommon.h | 7 | ||||
-rw-r--r-- | engines/kyra/engine/scene_eob.cpp | 10 | ||||
-rw-r--r-- | engines/kyra/engine/sprites_eob.cpp | 5 |
9 files changed, 164 insertions, 6 deletions
diff --git a/engines/kyra/engine/chargen.cpp b/engines/kyra/engine/chargen.cpp index 2ae9682ed2..7a4c9672c6 100644 --- a/engines/kyra/engine/chargen.cpp +++ b/engines/kyra/engine/chargen.cpp @@ -634,16 +634,20 @@ int CharacterGenerator::alignmentMenu(int cClass) { } int CharacterGenerator::getInput(Button *buttonList) { + if (_vm->gameFlags().platform == Common::kPlatformAmiga) + return _vm->checkInput(buttonList, false, 0); + if (_vm->game() == GI_EOB1 && _vm->sound()->checkTrigger()) { _vm->sound()->resetTrigger(); _vm->snd_playSong(20); - } else if (_vm->game() == GI_EOB2 && _vm->gameFlags().platform != Common::kPlatformAmiga && !_vm->sound()->isPlaying()) { + } else if (_vm->game() == GI_EOB2 && !_vm->sound()->isPlaying()) { // WORKAROUND for EOB II: The original implements the same sound trigger check as in EOB I. // However, Westwood seems to have forgotten to set the trigger at the end of the AdLib song, // so that the music will not loop. We simply check whether the sound driver is still playing. _vm->delay(3 * _vm->_tickLength); _vm->snd_playSong(13); } + return _vm->checkInput(buttonList, false, 0); } diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp index 8d621b9bc9..efe66a4d43 100644 --- a/engines/kyra/engine/darkmoon.cpp +++ b/engines/kyra/engine/darkmoon.cpp @@ -37,6 +37,11 @@ DarkMoonEngine::DarkMoonEngine(OSystem *system, const GameFlags &flags) : EoBCor _utilMenuStrings = _ascii2SjisTables = _ascii2SjisTables2 = 0; _npcShpData = _dscDoorType5Offs = _hornSounds = 0; _dreamSteps = 0; + + _amigaSoundMapExtra = _amigaSoundFiles2 = 0; + _amigaSoundIndex1 = 0; + _amigaSoundIndex2 = 0; + _amigaCurSoundIndex = 0; } DarkMoonEngine::~DarkMoonEngine() { @@ -415,6 +420,91 @@ bool DarkMoonEngine::restParty_extraAbortCondition() { return true; } +void DarkMoonEngine::snd_loadAmigaSounds(int level, int sub) { + if (_flags.platform != Common::kPlatformAmiga) + return; + + int fileNum = _amigaSoundIndex2[level]; + if (fileNum != _amigaCurSoundFile) { + for (int i = 52; i < 68; ++i) { + if (_amigaSoundMap[i]) { + _sound->unloadSoundFile(_amigaSoundMap[i]); + _amigaSoundMap[i] = 0; + } + } + + _sound->loadSoundFile(_amigaSoundFiles2[fileNum]); + _amigaCurSoundFile = fileNum; + + int mapCnt = 0; + for (int i = 0; i < fileNum + 1; ) { + if (!_amigaSoundMapExtra[mapCnt++][0]) + i++; + } + + for (int i = 52; i < 68; ++i) { + if (!_amigaSoundMapExtra[mapCnt][0]) { + _amigaSoundMap[i] = 0; + break; + } + _amigaSoundMap[i] = _amigaSoundMapExtra[mapCnt++]; + } + } + + if (level == 10 || (level == 8 && sub)) + return; + + uint16 sndIndex = 0; + + for (int i = 0; i != level; ) { + int8 val = _amigaSoundIndex1[sndIndex++]; + if (val == -1) + i++; + } + + if (sub) + sndIndex += 4; + + if (_amigaCurSoundIndex) { + for (int i = 0; i < 4; ++i) { + int8 valCur = _amigaSoundIndex1[_amigaCurSoundIndex + i]; + int8 valNew = _amigaSoundIndex1[sndIndex + i]; + if (valCur < 0) + continue; + + if (i < 2) { + for (int ii = 1; ii < 5; ++ii) + _sound->unloadSoundFile(Common::String::format("%s%d", _amigaLevelSoundList2[valCur], ii)); + } else { + if (valCur != valNew) + _sound->unloadSoundFile(Common::String::format("%s.SAM", _amigaLevelSoundList1[valCur])); + _sound->unloadSoundFile(Common::String::format("%s1", _amigaLevelSoundList2[valCur])); + } + } + } + + for (int i = 0; i < 4; ++i) { + int8 valCur = _amigaCurSoundIndex ? _amigaSoundIndex1[_amigaCurSoundIndex + i] : -5; + int8 valNew = _amigaSoundIndex1[sndIndex + i]; + + if (valNew >= 0 && valNew != valCur) { + if (i < 2 && valCur >= 0 && _amigaCurSoundIndex) + _sound->unloadSoundFile(Common::String::format("%s.SAM", _amigaLevelSoundList1[_amigaSoundIndex1[_amigaCurSoundIndex]])); + _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList1[valNew])); + assert(_amigaLevelSoundList2[valNew]); + _amigaSoundMap[36 + i] = _amigaLevelSoundList2[valNew][0] ? _amigaLevelSoundList2[valNew] : 0; + } else if (valNew == -2) { + _amigaSoundMap[36 + i] = 0; + } else if (valNew == -3) { + _amigaSoundMap[36 + i] = _amigaSoundMap[35 + i]; + } + } + + _sound->loadSoundFile(Common::String::format(sub ? "LEVEL%da.SAM" : "LEVEL%d.SAM", level)); + + _amigaCurSoundIndex = sndIndex; +} + void DarkMoonEngine::useHorn(int charIndex, int weaponSlot) { int v = _items[_characters[charIndex].inventory[weaponSlot]].value - 1; _txt->printMessage(_hornStrings[v]); diff --git a/engines/kyra/engine/darkmoon.h b/engines/kyra/engine/darkmoon.h index 71bfc75370..b3a69d254a 100644 --- a/engines/kyra/engine/darkmoon.h +++ b/engines/kyra/engine/darkmoon.h @@ -115,6 +115,16 @@ private: void restParty_npc(); bool restParty_extraAbortCondition(); + // Sound + void snd_loadAmigaSounds(int level, int sub); + + const char *const *_amigaSoundFiles2; + const char *const *_amigaSoundMapExtra; + const int8 *_amigaSoundIndex1; + const uint8 *_amigaSoundIndex2; + + int _amigaCurSoundIndex; + // misc void useHorn(int charIndex, int weaponSlot); bool checkPartyStatusExtra(); diff --git a/engines/kyra/engine/eob.cpp b/engines/kyra/engine/eob.cpp index f2d06e0a59..dc653fa38e 100644 --- a/engines/kyra/engine/eob.cpp +++ b/engines/kyra/engine/eob.cpp @@ -513,6 +513,39 @@ void EoBEngine::turnUndeadAutoHit() { sparkEffectOffensive(); } +void EoBEngine::snd_loadAmigaSounds(int level, int) { + if (_flags.platform != Common::kPlatformAmiga || level == _amigaCurSoundFile) + return; + + if (_amigaCurSoundFile != -1) { + _sound->unloadSoundFile(Common::String::format("L%dM1A1", _amigaCurSoundFile)); + _sound->unloadSoundFile(Common::String::format("L%dM2A1", _amigaCurSoundFile)); + + for (int i = 1; i < 5; ++i) { + _sound->unloadSoundFile(Common::String::format("L%dM1M%d", _amigaCurSoundFile, i)); + _sound->unloadSoundFile(Common::String::format("L%dM2M%d", _amigaCurSoundFile, i)); + } + + for (int i = 0; i < 2; ++i) { + if (_amigaLevelSoundList1[_amigaCurSoundFile * 2 + i][0]) + _sound->unloadSoundFile(_amigaLevelSoundList1[_amigaCurSoundFile * 2 + i]); + if (_amigaLevelSoundList2[_amigaCurSoundFile * 2 + i][0]) + _sound->unloadSoundFile(_amigaLevelSoundList2[_amigaCurSoundFile * 2 + i]); + } + } + + for (int i = 0; i < 2; ++i) { + if (_amigaLevelSoundList1[level * 2 + i][0]) + _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList1[level * 2 + i])); + if (_amigaLevelSoundList2[level * 2 + i][0]) + _sound->loadSoundFile(Common::String::format("%s.CPS", _amigaLevelSoundList2[level * 2 + i])); + } + + _sound->loadSoundFile(Common::String::format("LEVELSAM%d.CPS", level)); + + _amigaCurSoundFile = level; +} + bool EoBEngine::checkPartyStatusExtra() { _screen->copyPage(0, 10); int cd = _screen->curDimIndex(); diff --git a/engines/kyra/engine/eob.h b/engines/kyra/engine/eob.h index de98a91899..efb6c47b30 100644 --- a/engines/kyra/engine/eob.h +++ b/engines/kyra/engine/eob.h @@ -109,6 +109,9 @@ private: const char *const *_turnUndeadString; + // Sound + void snd_loadAmigaSounds(int level, int); + // Misc bool checkPartyStatusExtra(); int resurrectionSelectDialogue(); diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp index 16f9088945..153d17971f 100644 --- a/engines/kyra/engine/eobcommon.cpp +++ b/engines/kyra/engine/eobcommon.cpp @@ -221,6 +221,9 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE _mnNumWord = _numSpells = _mageSpellListSize = _spellLevelsMageSize = _spellLevelsClericSize = 0; _inventorySlotsX = _slotValidationFlags = _encodeMonsterShpTable = 0; _cgaMappingDefault = _cgaMappingAlt = _cgaMappingInv = _cgaLevelMappingIndex = _cgaMappingItemsL = _cgaMappingItemsS = _cgaMappingThrown = _cgaMappingIcons = _cgaMappingDeco = 0; + _amigaLevelSoundList1 = _amigaLevelSoundList2 = 0; + _amigaSoundMap = 0; + _amigaCurSoundFile = -1; memset(_cgaMappingLevel, 0, sizeof(_cgaMappingLevel)); memset(_expRequirementTables, 0, sizeof(_expRequirementTables)); memset(_saveThrowTables, 0, sizeof(_saveThrowTables)); @@ -322,6 +325,9 @@ EoBCoreEngine::~EoBCoreEngine() { delete[] _menuDefs; _menuDefs = 0; + delete[] _amigaSoundMap; + _amigaSoundMap = 0; + delete _inf; _inf = 0; delete _timer; diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h index 3566ea4345..c4340a2348 100644 --- a/engines/kyra/engine/eobcommon.h +++ b/engines/kyra/engine/eobcommon.h @@ -1180,6 +1180,13 @@ protected: void snd_playSoundEffect(int id, int volume=0xFF); void snd_stopSound(); void snd_fadeOut(int speed = 160); + virtual void snd_loadAmigaSounds(int level, int sub) = 0; + + const char **_amigaSoundMap; + const char *const *_amigaLevelSoundList1; + const char *const *_amigaLevelSoundList2; + + int _amigaCurSoundFile; // keymap static const char *const kKeymapName; diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp index 7f3c464939..110bf0d12c 100644 --- a/engines/kyra/engine/scene_eob.cpp +++ b/engines/kyra/engine/scene_eob.cpp @@ -222,13 +222,15 @@ Common::String EoBCoreEngine::initLevelData(int sub) { } } - if (_flags.gameID == GI_EOB2) { + if (_flags.platform == Common::kPlatformAmiga) { + delay(3 * _tickLength); + snd_loadAmigaSounds(_currentLevel, sub); + if (_flags.gameID == GI_EOB2) + pos += 13; + } else if (_flags.gameID == GI_EOB2) { delay(3 * _tickLength); _sound->loadSoundFile((const char *)pos); pos += 13; - } else if (_flags.platform == Common::kPlatformAmiga) { - delay(3 * _tickLength); - _sound->loadSoundFile(_currentLevel); } releaseDoorShapes(); diff --git a/engines/kyra/engine/sprites_eob.cpp b/engines/kyra/engine/sprites_eob.cpp index f7e65f2133..17a5f555ed 100644 --- a/engines/kyra/engine/sprites_eob.cpp +++ b/engines/kyra/engine/sprites_eob.cpp @@ -1038,7 +1038,10 @@ bool EoBCoreEngine::updateMonsterTryDistanceAttack(EoBMonsterInPlay *m) { if (s < 20) { monsterSpellCast(m, s); } else if (s == 20) { - snd_processEnvironmentalSoundEffect(103, m->block); + if (_flags.platform == Common::kPlatformAmiga) + snd_processEnvironmentalSoundEffect(39, _currentBlock + 1); + else + snd_processEnvironmentalSoundEffect(103, m->block); _txt->printMessage(_monsterSpecAttStrings[0]); for (int i = 0; i < 6; i++) statusAttack(i, 4, _monsterSpecAttStrings[1], 1, 5, 9, 1); |