Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SCUMM: COMI (Demo): properly handle demo music and transitions #2622

Merged
merged 4 commits into from Nov 17, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions engines/scumm/imuse_digi/dimuse.h
Expand Up @@ -116,7 +116,9 @@ class IMuseDigital : public MusicEngine {

void setComiMusicState(int stateId);
void setComiMusicSequence(int seqId);
void setComiDemoMusicState(int stateId);
void playComiMusic(const char *songName, const imuseComiTable *table, int attribPos, bool sequence);
void playComiDemoMusic(const char *songName, const imuseComiTable *table, int attribPos);

void setDigMusicState(int stateId);
void setDigMusicSequence(int seqId);
Expand Down
69 changes: 69 additions & 0 deletions engines/scumm/imuse_digi/dimuse_music.cpp
Expand Up @@ -277,6 +277,28 @@ void IMuseDigital::setComiMusicSequence(int seqId) {
_curMusicSeq = num;
}

void IMuseDigital::setComiDemoMusicState(int stateNum) {
if (stateNum == -1)
return;

if (_curMusicState == stateNum)
return;

if (stateNum != 0 && stateNum != 2 && stateNum != 4 && stateNum != 8 && stateNum != 9 && stateNum != 16) {
debug(5, "Tried to set music state to num: %d, defaulting to 0", stateNum);
stateNum = 0;
}

if (_curMusicSeq == 0) {
if (stateNum == 0)
playComiDemoMusic(NULL, &_comiDemoStateMusicTable[0], stateNum);
else
playComiDemoMusic(_comiDemoStateMusicTable[stateNum].name, &_comiDemoStateMusicTable[stateNum], stateNum);
}

_curMusicState = stateNum;
}

void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *table, int attribPos, bool sequence) {
int hookId = 0;

Expand Down Expand Up @@ -343,6 +365,53 @@ void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *tab
}
}

void IMuseDigital::playComiDemoMusic(const char *songName, const imuseComiTable *table, int attribPos) {
int hookId = 0;

if ((songName != NULL) && (attribPos != 0)) {
if (table->attribPos != 0)
attribPos = table->attribPos;
hookId = _attributes[COMI_STATE_OFFSET + attribPos];
if (table->hookId != 0) {
if ((hookId != 0) && (table->hookId > 1)) {
_attributes[COMI_STATE_OFFSET + attribPos] = 2;
}
else {
_attributes[COMI_STATE_OFFSET + attribPos] = hookId + 1;
if (table->hookId < hookId + 1)
_attributes[COMI_STATE_OFFSET + attribPos] = 1;
}
}
}

if (!songName) {
fadeOutMusic(120);
return;
}

switch (table->transitionType) {
case 0:
default:
break;
case 3:
if (table->filename[0] == 0) {
fadeOutMusic(60);
return;
}
if (getCurMusicSoundId() == table->soundId)
return;
if ((table->attribPos != 0) &&
(table->attribPos == _comiDemoStateMusicTable[_curMusicState].attribPos)) {
fadeOutMusicAndStartNew(table->fadeOutDelay, table->filename, table->soundId);
}
AndywinXp marked this conversation as resolved.
Show resolved Hide resolved
else {
fadeOutMusic(table->fadeOutDelay);
startMusic(table->filename, table->soundId, hookId, 127);
}
break;
}
}

void IMuseDigital::setFtMusicState(int stateId) {
if (stateId > 48)
return;
Expand Down
19 changes: 1 addition & 18 deletions engines/scumm/imuse_digi/dimuse_script.cpp
Expand Up @@ -100,24 +100,7 @@ void IMuseDigital::parseScriptCmds(int cmd, int b, int c, int d, int e, int f, i
}
}
} else if ((_vm->_game.id == GID_CMI) && (_vm->_game.features & GF_DEMO)) {
if (b == 2) {
fadeOutMusic(108);
startMusic("in1.imx", 1100, 0, 127);
} else if (b == 4) {
fadeOutMusic(108);
startMusic("in2.imx", 1120, 0, 127);
} else if (b == 8) {
fadeOutMusic(108);
startMusic("out1.imx", 1140, 0, 127);
} else if (b == 9) {
fadeOutMusic(108);
startMusic("out2.imx", 1150, 0, 127);
} else if (b == 16) {
fadeOutMusic(108);
startMusic("gun.imx", 1210, 0, 127);
} else {
fadeOutMusic(120);
}
setComiDemoMusicState(b);
} else if (_vm->_game.id == GID_DIG) {
setDigMusicState(b);
} else if (_vm->_game.id == GID_CMI) {
Expand Down
21 changes: 21 additions & 0 deletions engines/scumm/imuse_digi/dimuse_tables.cpp
Expand Up @@ -473,6 +473,27 @@ const imuseComiTable _comiSeqMusicTable[] = {
{0, -1, "", 0, 0, 0, ""}
};

const imuseComiTable _comiDemoStateMusicTable[] = {
{ 0, 1000, "STATE_NULL", 0, 0, 0, "" }, /* 00 */
{ 0, 1001, "stateNoChange", 0, 0, 0, "" }, /* 01 */
{ 3, 1100, "stateHold1", 2, 0, 60, "in1.imx" }, /* 02 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 03 */
{ 3, 1120, "stateHold2", 4, 0, 60, "in2.imx" }, /* 04 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 05 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 06 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 07 */
{ 3, 1140, "stateWaterline1", 2, 0, 60, "out1.imx" }, /* 08 */
{ 3, 1150, "stateWaterline2", 4, 0, 60, "out2.imx" }, /* 09 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 10 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 11 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 12 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 13 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 14 */
{ 0, 1001, "empty", 0, 0, 0, "" }, /* 15 */
{ 3, 1210, "stateCannon", 4, 0, 60, "gun.imx" }, /* 16 */
{ 0, -1, "", 0, 0, 0, "" }
};

const imuseFtStateTable _ftStateMusicTable[] = {
{"", 0, 0, "STATE_NULL" },
{"", 4, 127, "stateKstandOutside" },
Expand Down
1 change: 1 addition & 0 deletions engines/scumm/imuse_digi/dimuse_tables.h
Expand Up @@ -78,6 +78,7 @@ extern const imuseDigTable _digStateMusicTable[];
extern const imuseDigTable _digSeqMusicTable[];
extern const imuseComiTable _comiStateMusicTable[];
extern const imuseComiTable _comiSeqMusicTable[];
extern const imuseComiTable _comiDemoStateMusicTable[];
extern const imuseFtStateTable _ftStateMusicTable[];
extern const imuseFtSeqTable _ftSeqMusicTable[];
extern const imuseFtNames _ftSeqNames[];
Expand Down