aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/engine
diff options
context:
space:
mode:
authorathrxx2019-04-01 00:55:17 +0200
committerathrxx2019-04-13 18:55:02 +0200
commit0ea6650837cce3007f0820acd17518f9809fd4a7 (patch)
tree507986e06df0d230cc2d1ee64b47efb87546b4e7 /engines/kyra/engine
parent972f4e201ade5660723f6348480437e2a02fa6de (diff)
downloadscummvm-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.cpp6
-rw-r--r--engines/kyra/engine/darkmoon.cpp90
-rw-r--r--engines/kyra/engine/darkmoon.h10
-rw-r--r--engines/kyra/engine/eob.cpp33
-rw-r--r--engines/kyra/engine/eob.h3
-rw-r--r--engines/kyra/engine/eobcommon.cpp6
-rw-r--r--engines/kyra/engine/eobcommon.h7
-rw-r--r--engines/kyra/engine/scene_eob.cpp10
-rw-r--r--engines/kyra/engine/sprites_eob.cpp5
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);