[Scummvm-git-logs] scummvm master -> 284f42d55507edfdede43f302d7fefd413ac7f50

aquadran aquadran at gmail.com
Tue Nov 17 05:36:47 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

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


Commit: 284f42d55507edfdede43f302d7fefd413ac7f50
    https://github.com/scummvm/scummvm/commit/284f42d55507edfdede43f302d7fefd413ac7f50
Author: AndywinXp (andywinxp at gmail.com)
Date: 2020-11-17T06:36:43+01:00

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

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

Changed paths:
    engines/scumm/imuse_digi/dimuse.h
    engines/scumm/imuse_digi/dimuse_music.cpp
    engines/scumm/imuse_digi/dimuse_script.cpp
    engines/scumm/imuse_digi/dimuse_tables.cpp
    engines/scumm/imuse_digi/dimuse_tables.h


diff --git a/engines/scumm/imuse_digi/dimuse.h b/engines/scumm/imuse_digi/dimuse.h
index 485922d3fc..df173867fb 100644
--- a/engines/scumm/imuse_digi/dimuse.h
+++ b/engines/scumm/imuse_digi/dimuse.h
@@ -116,7 +116,9 @@ private:
 
 	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);
diff --git a/engines/scumm/imuse_digi/dimuse_music.cpp b/engines/scumm/imuse_digi/dimuse_music.cpp
index 5c3cf30dbd..48cac62eeb 100644
--- a/engines/scumm/imuse_digi/dimuse_music.cpp
+++ b/engines/scumm/imuse_digi/dimuse_music.cpp
@@ -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;
 
@@ -343,6 +365,52 @@ 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);
+		} else {
+			fadeOutMusic(table->fadeOutDelay);
+			startMusic(table->filename, table->soundId, hookId, 127);
+		}
+		break;
+	}
+}
+
 void IMuseDigital::setFtMusicState(int stateId) {
 	if (stateId > 48)
 		return;
diff --git a/engines/scumm/imuse_digi/dimuse_script.cpp b/engines/scumm/imuse_digi/dimuse_script.cpp
index f5b5f19560..c906a927c2 100644
--- a/engines/scumm/imuse_digi/dimuse_script.cpp
+++ b/engines/scumm/imuse_digi/dimuse_script.cpp
@@ -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) {
diff --git a/engines/scumm/imuse_digi/dimuse_tables.cpp b/engines/scumm/imuse_digi/dimuse_tables.cpp
index bae081b308..9bbafb8278 100644
--- a/engines/scumm/imuse_digi/dimuse_tables.cpp
+++ b/engines/scumm/imuse_digi/dimuse_tables.cpp
@@ -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"  },
diff --git a/engines/scumm/imuse_digi/dimuse_tables.h b/engines/scumm/imuse_digi/dimuse_tables.h
index cb8393d4d7..1c981d8124 100644
--- a/engines/scumm/imuse_digi/dimuse_tables.h
+++ b/engines/scumm/imuse_digi/dimuse_tables.h
@@ -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[];




More information about the Scummvm-git-logs mailing list