Opened 18 years ago

Closed 18 years ago

Last modified 21 months ago

#8088 closed patch

SAM: ImSetTrigger implementation

Reported by: SF/jamieson630 Owned by: SF/ender
Priority: normal Component: Engine: SCUMM
Keywords: Cc:
Game: Sam and Max

Description

The included patch implements the ImSetTrigger function (do_command param == 0, cmd == 17) for Sam & Max. This is the first observed correlation between Sam & Max script commands and SysEx blocks in the S&M MIDI resources.

ImSetTrigger provides a set of parameters with which to invoke do_command, at the time that a marker matching the specified marker ID is encountered in a MIDI music resource that is playing. The marker is identified using the following SysEx event: 00 xx (F7), where "xx" is the marker ID.

The use of do_command (0/17) has been observed in two locations in Sam & Max. The first is in the opening credits -- the following do_command call is made after all the credits have finished coming up on the screen:

IMuseInternal::do_command (17, 89, 0, 1, 8, 6, 0, 0);

At the end of the credits music (sound resource #89), the following SysEx event is encountered:

SysEx: 00 01 F7

The last four parameters of the do_command call actually map to the first four parameters of the do_command call that should occur once the marker is encountered.

The other location where do_command (0/17) is observed is at the Gator Golf entrance. A short intro music is played, which is then supposed to flow into a much longer main song. Upon entrance to the room, the following do_command call is made:

IMuseInternal::do_command (17, 31, 0, 1, 8, 30, 0, 0);

At the end of the short intro music (sound resource #31), the following SysEx event is encountered:

SysEx: 00 01 F7

This implementation properly transitions into the main Gator Golf music. However, its correctness of behavior has not been validated with the opening credit music (which should flow into the "walking into the office" music after the credits), possibly because the office scene is brought up (and at least one other music resource activated) long before the credits music finishes playing. This is an issue related to the use of do_command (param == 1, cmd == 0), which I am still investigating.

Note that other music resources include SysEx 00 xx (F7) events (including a whole glut of them during the credits music that seem to use marker IDs corresponding to measure numbers). However, there is no expected exceptional behavior at these points in the music, and since no calls to do_command (0/17) are ever made that relate to these markers, no action is taken by this implementation. I believe this is correct: for most music, the SysEx 00 01 (F7) seems to appear as a general-purpose end-of-song marker for most songs.

Regarding the implementation of ImSetTrigger, I have deviated slightly from the implementation notes that Mike provided to Ender in his disassembly efforts for the Sam & Max IMuse. In those notes, the 16 possible triggers are scoped at the IMuseInternal level, and include the player ID they are related to. In my implementation, I have put the trigger information into each of the players (16 max players, BTW) directly. This may not be the right thing to do; if certain calls to do_command (0/17) involve sound resources that have not started playing yet, this implementation would fail to set up the trigger. Maybe somebody more familiar with the scope of Mike's work could tell me if I'm taking his interpretation of the IMuse opcodes too literally.

Finally, the implementation of ImCheckTrigger and ImClearTrigger should follow easily from this implementation. I will submit a separate patch with those implementations, once this patch has been validated.

NOTE: Part of patch #620994 (do_command param == 1, cmd == 1) is included in this patch, just because the outstanding mods I have on imuse.cpp are starting to get extensive and intermingled. Sorry....

Ticket imported from: #621821. Ticket imported from: patches/193.

Attachments (2)

imuse.imsettrigger.diff (4.9 KB ) - added by SF/jamieson630 18 years ago.
Patch against imuse.cpp 1.45 (October 9)
imuse.imsettrigger2.diff (4.0 KB ) - added by SF/jamieson630 18 years ago.
Revised patch against imuse.cpp 1.52 (October 11)

Download all attachments as: .zip

Change History (8)

by SF/jamieson630, 18 years ago

Attachment: imuse.imsettrigger.diff added

Patch against imuse.cpp 1.45 (October 9)

comment:1 by SF/ender, 18 years ago

Owner: set to SF/ender

comment:2 by SF/ender, 18 years ago

I can't tell what of this is an intermingled patch and whats part of the setTrigger implementation :P

Can you please checkout another tree with the latest CVS, apply the mods you want, and either submit a revision to this patch or commit it yourself... I don't understand enough of this code to work out which of this I can apply.

by SF/jamieson630, 18 years ago

Attachment: imuse.imsettrigger2.diff added

Revised patch against imuse.cpp 1.52 (October 11)

comment:3 by SF/jamieson630, 18 years ago

Revised patch is based on 1.52, and is solely related to ImSetTrigger changes.

Okay, I take that back. It also implements do_command (param == 1, cmd == 1), which is an unconditional jump from what I can tell. The only place I've observed this is in the Sam & Max USA Map, where the music is supposed to change as soon as you click on your destination. That change appears to be effected through the use of do_command (a = 257 means param == 1, cmd == 1).

comment:4 by SF/ender, 18 years ago

Was applied.

comment:5 by SF/ender, 18 years ago

Status: newclosed

comment:6 by digitall, 21 months ago

Component: Engine: SCUMM
Game: Sam and Max
Note: See TracTickets for help on using tickets.