[Scummvm-cvs-logs] CVS: scummvm/scumm imuse.cpp,1.52,1.53
James Brown
ender at users.sourceforge.net
Fri Oct 11 21:58:03 CEST 2002
Update of /cvsroot/scummvm/scummvm/scumm
In directory usw-pr-cvs1:/tmp/cvs-serv26799/scumm
Modified Files:
imuse.cpp
Log Message:
Patch something: imTrigger implementation
Index: imuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- imuse.cpp 11 Oct 2002 08:35:12 -0000 1.52
+++ imuse.cpp 12 Oct 2002 04:57:49 -0000 1.53
@@ -116,6 +116,8 @@
bool _abort;
HookDatas _hook;
+ byte _def_do_command_trigger;
+ byte _deferred_do_command [4];
bool _mt32emulate;
bool _isGM;
@@ -1410,6 +1412,7 @@
int32 IMuseInternal::do_command(int a, int b, int c, int d, int e, int f, int g, int h)
{
+ int i;
byte cmd = a & 0xFF;
byte param = a >> 8;
Player *player = NULL;
@@ -1433,32 +1436,48 @@
return stop_all_sounds();
case 13:
return get_sound_status(b);
- case 14:{ // Sam and Max: Volume Fader?
- int i;
- Player *player;
-
- for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
- if (player->_active && player->_id == (uint16)b) {
- player->fade_vol(e, f);
- return 0;
- }
+ case 14:
+ // Sam and Max: Volume Fader?
+ for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
+ if (player->_active && player->_id == (uint16)b) {
+ player->fade_vol(e, f);
+ return 0;
}
}
- case 15:{ // Sam and Max: Unconditional Jump?
- int i; // Something to do with position?
- Player *player;
+ return -1;
+ case 15:
+ // Sam & Max: Unconditional Jump?
+ for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
+ if (player->_active && player->_id == (uint16)b) {
+ player->jump(player->_track_index + 1, 0, 0);
+ return 0;
+ }
+ }
+ return -1;
+ case 16:
+ return set_volchan(b, c);
+ case 17:
+ if (g_scumm->_features & GID_SAMNMAX) {
+ // Sam & Max: ImSetTrigger.
+ // Sets a trigger for a particular player and
+ // marker ID, along with do_command parameters
+ // to invoke at the marker. The marker is
+ // represented by MIDI SysEx block 00 xx (F7)
+ // where "xx" is the marker ID.
for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
if (player->_active && player->_id == (uint16)b) {
- player->jump(player->_track_index + 1, 0, 0);
+ player->_def_do_command_trigger = d;
+ player->_deferred_do_command [0] = e;
+ player->_deferred_do_command [1] = f;
+ player->_deferred_do_command [2] = g;
+ player->_deferred_do_command [3] = h;
return 0;
}
}
+ return -1;
}
-
- case 16:
- return set_volchan(b, c);
- case 17:
- return set_channel_volume(b, c);
+ else
+ return set_channel_volume(b, c);
case 18:
return set_volchan_entry(b, c);
case 19:
@@ -1489,7 +1508,10 @@
case 0:
return player->get_param(c, d);
case 1:
- player->set_priority(c);
+ if (g_scumm->_features & GID_SAMNMAX) // Jamieson630: Nasty
+ player->jump (d - 1, (e - 1) * 4 + f, ((g * player->_ticks_per_beat) >> 2) + h);
+ else
+ player->set_priority(c);
return 0;
case 2:
return player->set_vol(c);
@@ -2107,10 +2129,20 @@
debug(2, "%d => turning %s part %d", p[1], (p[1] == 2) ? "OFF" : "ON", a);
part->set_onoff(p[1] != 2);
}
+ } else {
+ // Jamieson630: Sam & Max seems to use this as a marker for
+ // ImSetTrigger. When a marker is encountered whose sound
+ // ID and (presumably) marker ID match what was set by
+ // ImSetTrigger, something magical is supposed to happen....
+ if (_def_do_command_trigger && *p == _def_do_command_trigger) {
+ _def_do_command_trigger = 0;
+ _se->do_command (_deferred_do_command [0],
+ _deferred_do_command [1],
+ _deferred_do_command [2],
+ _deferred_do_command [3],
+ 0, 0, 0, 0);
+ } // end if
} // end if
-
- // Jamieson630: Sam & Max uses this for something entirely different.
- // The data is much shorter, hence the len > 2 check above.
break;
case 1:
More information about the Scummvm-git-logs
mailing list