diff options
author | Max Horn | 2006-02-11 22:45:04 +0000 |
---|---|---|
committer | Max Horn | 2006-02-11 22:45:04 +0000 |
commit | 26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch) | |
tree | 26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /engines/scumm/imuse_digi/dimuse_music.cpp | |
parent | 2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff) | |
download | scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2 scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip |
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'engines/scumm/imuse_digi/dimuse_music.cpp')
-rw-r--r-- | engines/scumm/imuse_digi/dimuse_music.cpp | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/engines/scumm/imuse_digi/dimuse_music.cpp b/engines/scumm/imuse_digi/dimuse_music.cpp new file mode 100644 index 0000000000..4c0cedc57c --- /dev/null +++ b/engines/scumm/imuse_digi/dimuse_music.cpp @@ -0,0 +1,444 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "common/stdafx.h" +#include "common/scummsys.h" +#include "scumm/scumm.h" +#include "scumm/imuse_digi/dimuse.h" + +namespace Scumm { + +#define DIG_STATE_OFFSET 11 +#define DIG_SEQ_OFFSET (DIG_STATE_OFFSET + 65) +#define COMI_STATE_OFFSET 3 + +void IMuseDigital::setDigMusicState(int stateId) { + int l, num = -1; + + for (l = 0; _digStateMusicTable[l].soundId != -1; l++) { + if ((_digStateMusicTable[l].soundId == stateId)) { + debug(5, "Set music state: %s, %s", _digStateMusicTable[l].name, _digStateMusicTable[l].filename); + num = l; + break; + } + } + + if (num == -1) { + for (l = 0; _digStateMusicMap[l].roomId != -1; l++) { + if ((_digStateMusicMap[l].roomId == stateId)) { + break; + } + } + num = l; + + int offset = _attributes[_digStateMusicMap[num].offset]; + if (offset == 0) { + if (_attributes[_digStateMusicMap[num].atribPos] != 0) { + num = _digStateMusicMap[num].stateIndex3; + } else { + num = _digStateMusicMap[num].stateIndex1; + } + } else { + int stateIndex2 = _digStateMusicMap[num].stateIndex2; + if (stateIndex2 == 0) { + num = _digStateMusicMap[num].stateIndex1 + offset; + } else { + num = stateIndex2; + } + } + } + + debug(5, "Set music state: %s, %s", _digStateMusicTable[num].name, _digStateMusicTable[num].filename); + + if (_curMusicState == num) + return; + + if (_curMusicSeq == 0) { + if (num == 0) + playDigMusic(NULL, &_digStateMusicTable[0], num, false); + else + playDigMusic(_digStateMusicTable[num].name, &_digStateMusicTable[num], num, false); + } + + _curMusicState = num; +} + +void IMuseDigital::setDigMusicSequence(int seqId) { + int l, num = -1; + + if (seqId == 0) + seqId = 2000; + + for (l = 0; _digSeqMusicTable[l].soundId != -1; l++) { + if ((_digSeqMusicTable[l].soundId == seqId)) { + debug(5, "Set music sequence: %s, %s", _digSeqMusicTable[l].name, _digSeqMusicTable[l].filename); + num = l; + break; + } + } + + if (num == -1) + return; + + if (_curMusicSeq == num) + return; + + if (num != 0) { + if (_curMusicSeq == 0) { + playDigMusic(_digSeqMusicTable[num].name, &_digSeqMusicTable[num], 0, true); + _nextSeqToPlay = 0; + _attributes[DIG_SEQ_OFFSET + num] = 1; + } else { + if ((_digSeqMusicTable[_curMusicSeq].opcode == 4) || (_digSeqMusicTable[_curMusicSeq].opcode == 6)) { + _nextSeqToPlay = num; + return; + } else { + playDigMusic(_digSeqMusicTable[num].name, &_digSeqMusicTable[num], 0, true); + _nextSeqToPlay = 0; + _attributes[DIG_SEQ_OFFSET + num] = 1; + } + } + } else { + if (_nextSeqToPlay != 0) { + playDigMusic(_digSeqMusicTable[_nextSeqToPlay].name, &_digSeqMusicTable[_nextSeqToPlay], 0, true); + _attributes[DIG_SEQ_OFFSET + _nextSeqToPlay] = 1; + num = _nextSeqToPlay; + _nextSeqToPlay = 0; + } else { + if (_curMusicState != 0) { + playDigMusic(_digStateMusicTable[_curMusicState].name, &_digStateMusicTable[_curMusicState], _curMusicState, true); + } else + playDigMusic(NULL, &_digStateMusicTable[0], _curMusicState, true); + num = 0; + } + } + + _curMusicSeq = num; +} + +void IMuseDigital::playDigMusic(const char *songName, const imuseDigTable *table, int atribPos, bool sequence) { + int hookId = 0; + + if (songName != NULL) { + if ((_attributes[DIG_SEQ_OFFSET + 38] != 0) && (_attributes[DIG_SEQ_OFFSET + 41] == _attributes[DIG_SEQ_OFFSET + 38])) { + if ((atribPos == 43) || (atribPos == 44)) + hookId = 3; + } + + if ((_attributes[DIG_SEQ_OFFSET + 46] != 0) && (_attributes[DIG_SEQ_OFFSET + 48] == 0)) { + if ((atribPos == 38) || (atribPos == 39)) + hookId = 3; + } + + if ((_attributes[DIG_SEQ_OFFSET + 53] != 0)) { + if ((atribPos == 50) || (atribPos == 51)) + hookId = 3; + } + + if ((atribPos != 0) && (hookId == 0)) { + if (table->atribPos != 0) + atribPos = table->atribPos; + hookId = _attributes[DIG_STATE_OFFSET + atribPos]; + if (table->hookId != 0) { + if ((hookId != 0) && (table->hookId > 1)) { + _attributes[DIG_STATE_OFFSET + atribPos] = 2; + } else { + _attributes[DIG_STATE_OFFSET + atribPos] = hookId + 1; + if (table->hookId < hookId + 1) + _attributes[DIG_STATE_OFFSET + atribPos] = 1; + } + } + } + } + + fadeOutMusic(120); + + switch(table->opcode) { + case 0: + case 5: + case 6: + break; + case 3: + case 4: + if (table->filename[0] == 0) { + return; + } + if ((!sequence) && (table->atribPos != 0) && + (table->atribPos == _digStateMusicTable[_curMusicState].atribPos)) { + startMusic(table->filename, table->soundId, 0, 127); + return; + } + startMusic(table->filename, table->soundId, hookId, 127); + break; + } +} + +void IMuseDigital::setComiMusicState(int stateId) { + int l, num = -1; + + // This happens at the beginning of Part II, but should apparently not + // do anything since the correct music is already playing. A left-over + // of some kind? + + if (stateId == 4) + return; + + if (stateId == 0) + stateId = 1000; + + for (l = 0; _comiStateMusicTable[l].soundId != -1; l++) { + if ((_comiStateMusicTable[l].soundId == stateId)) { + debug(5, "Set music state: %s, %s", _comiStateMusicTable[l].name, _comiStateMusicTable[l].filename); + num = l; + break; + } + } + assert(num != -1); + + if (_curMusicState == num) + return; + + if (_curMusicSeq == 0) { + if (num == 0) + playComiMusic(NULL, &_comiStateMusicTable[0], num, false); + else + playComiMusic(_comiStateMusicTable[num].name, &_comiStateMusicTable[num], num, false); + } + + _curMusicState = num; +} + +void IMuseDigital::setComiMusicSequence(int seqId) { + int l, num = -1; + + if (seqId == 0) + seqId = 2000; + + for (l = 0; _comiSeqMusicTable[l].soundId != -1; l++) { + if ((_comiSeqMusicTable[l].soundId == seqId)) { + debug(5, "Set music sequence: %s, %s", _comiSeqMusicTable[l].name, _comiSeqMusicTable[l].filename); + num = l; + break; + } + } + assert(num != -1); + + if (_curMusicSeq == num) + return; + + if (num != 0) { + if (_curMusicSeq == 0) { + playComiMusic(_comiSeqMusicTable[num].name, &_comiSeqMusicTable[num], 0, true); + _nextSeqToPlay = 0; + } else { + if ((_comiSeqMusicTable[_curMusicSeq].opcode == 4) || (_comiSeqMusicTable[_curMusicSeq].opcode == 6)) { + _nextSeqToPlay = num; + return; + } else { + playComiMusic(_comiSeqMusicTable[num].name, &_comiSeqMusicTable[num], 0, true); + _nextSeqToPlay = 0; + } + } + } else { + if (_nextSeqToPlay != 0) { + playComiMusic(_comiSeqMusicTable[_nextSeqToPlay].name, &_comiSeqMusicTable[_nextSeqToPlay], 0, true); + num = _nextSeqToPlay; + _nextSeqToPlay = 0; + } else { + if (_curMusicState != 0) { + playComiMusic(_comiStateMusicTable[_curMusicState].name, &_comiStateMusicTable[_curMusicState], _curMusicState, true); + } else + playComiMusic(NULL, &_comiStateMusicTable[0], _curMusicState, true); + num = 0; + } + } + + _curMusicSeq = num; +} + +void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *table, int atribPos, bool sequence) { + int hookId = 0; + + if ((songName != NULL) && (atribPos != 0)) { + if (table->atribPos != 0) + atribPos = table->atribPos; + hookId = _attributes[COMI_STATE_OFFSET + atribPos]; + if (table->hookId != 0) { + if ((hookId != 0) && (table->hookId > 1)) { + _attributes[COMI_STATE_OFFSET + atribPos] = 2; + } else { + _attributes[COMI_STATE_OFFSET + atribPos] = hookId + 1; + if (table->hookId < hookId + 1) + _attributes[COMI_STATE_OFFSET + atribPos] = 1; + } + } + } + + switch(table->opcode) { + case 0: + case 8: + case 9: + fadeOutMusic(120); + break; + case 1: + if (table->filename[0] == 0) { + fadeOutMusic(120); + return; + } + fadeOutMusic(120); + startMusic(table->filename, table->soundId, 0, 1); + setFade(table->soundId, 127, 120); + break; + case 2: + if (table->filename[0] == 0) { + fadeOutMusic(60); + return; + } + fadeOutMusic(table->fadeOut60TicksDelay); + startMusic(table->filename, table->soundId, table->hookId, 127); + break; + case 3: + case 4: + case 12: + if (table->filename[0] == 0) { + fadeOutMusic(60); + return; + } + fadeOutMusic(table->fadeOut60TicksDelay); + if ((!sequence) && (table->atribPos != 0) && + (table->atribPos == _comiStateMusicTable[_curMusicState].atribPos)) { + startMusic(table->filename, table->soundId, 0, 127); + return; + } + if (table->opcode == 12) { + startMusic(table->filename, table->soundId, table->hookId, 127); + } else { + startMusic(table->filename, table->soundId, hookId, 127); + } + break; + } +} + +void IMuseDigital::setFtMusicState(int stateId) { + if (stateId > 48) + return; + + debug(5, "State music: %s, %s", _ftStateMusicTable[stateId].name, _ftStateMusicTable[stateId].audioName); + + if (_curMusicState == stateId) + return; + + if (_curMusicSeq == 0) { + if (stateId == 0) + playFtMusic(NULL, 0, 0); + else + playFtMusic(_ftStateMusicTable[stateId].audioName, _ftStateMusicTable[stateId].opcode, _ftStateMusicTable[stateId].volume); + } + + _curMusicState = stateId; +} + +void IMuseDigital::setFtMusicSequence(int seqId) { + if (seqId > 52) + return; + + debug(5, "Sequence music: %s", _ftSeqNames[seqId].name); + + if (_curMusicSeq == seqId) + return; + + if (seqId == 0) { + if (_curMusicState == 0) + playFtMusic(NULL, 0, 0); + else { + playFtMusic(_ftStateMusicTable[_curMusicState].audioName, _ftStateMusicTable[_curMusicState].opcode, _ftStateMusicTable[_curMusicState].volume); + } + } else { + int seq = (seqId - 1) * 4; + playFtMusic(_ftSeqMusicTable[seq].audioName, _ftSeqMusicTable[seq].opcode, _ftSeqMusicTable[seq].volume); + } + + _curMusicSeq = seqId; + _curMusicCue = 0; +} + +void IMuseDigital::setFtMusicCuePoint(int cueId) { + if (cueId > 3) + return; + + debug(5, "Cue point sequence: %d", cueId); + + if (_curMusicSeq == 0) + return; + + if (_curMusicCue == cueId) + return; + + if (cueId == 0) + playFtMusic(NULL, 0, 0); + else { + int seq = ((_curMusicSeq - 1) * 4) + cueId; + playFtMusic(_ftSeqMusicTable[seq].audioName, _ftSeqMusicTable[seq].opcode, _ftSeqMusicTable[seq].volume); + } + + _curMusicCue = cueId; +} + +void IMuseDigital::setAudioNames(int32 num, char *names) { + free(_audioNames); + _numAudioNames = num; + _audioNames = names; +} + +int IMuseDigital::getSoundIdByName(const char *soundName) { + if (soundName && soundName[0] != 0) { + for (int r = 0; r < _numAudioNames; r++) { + if (strcmp(soundName, &_audioNames[r * 9]) == 0) { + return r; + } + } + } + + return -1; +} + +void IMuseDigital::playFtMusic(const char *songName, int opcode, int volume) { + fadeOutMusic(200); + + switch(opcode) { + case 0: + case 4: + break; + case 1: + case 2: + case 3: + { + int soundId = getSoundIdByName(songName); + if (soundId != -1) { + startMusic(soundId, volume); + } + } + break; + } +} + + +} // End of namespace Scumm |