diff options
| -rw-r--r-- | engines/sci/engine/script_patches.cpp | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 22006575c6..018b4089aa 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -115,6 +115,8 @@ static const char *const selectorNameTable[] = {  	"posn",         // SCI2 benchmarking script  	"detailLevel",  // GK2 benchmarking  	"view",         // RAMA benchmarking +	"fade",         // Shivers sound fix +	"play",         // Shivers sound fix  	"test",         // Torin  	"get",          // Torin  	"set",          // Torin @@ -166,6 +168,8 @@ enum ScriptPatcherSelectors {  	SELECTOR_posn,  	SELECTOR_detailLevel,  	SELECTOR_view, +	SELECTOR_fade, +	SELECTOR_play,  	SELECTOR_test,  	SELECTOR_get,  	SELECTOR_set, @@ -6193,11 +6197,34 @@ static const uint16 shiversPatchSuperCall[] = {  	PATCH_END  }; +// When the Ixupi is present in the Gods and Items intro room, the game tries to +// play a sound using the play selector, but its arguments are only appropriate +// for the fade selector. +// If the badly constructed sound object from this call ends up receiving a +// signal at any time in the future, the game will try to send to a number and +// crash (because the third argument to play is supposed to be a client object, +// but here it is a number instead). Other rooms make this same call with the +// correct fade selector, so fix the selector here to match. +// Applies to at least: English CD +static const uint16 shiversGodsItemsIxupiPlaySoundSignature[] = { +	SIG_MAGICDWORD, +	0x39, SIG_SELECTOR8(play),     // pushi 33 +	0x38, SIG_UINT16(0x06),        // pushi 0006 +	SIG_END +}; + +static const uint16 shiversGodsItemsIxupiPlaySoundPatch[] = { +	0x38, PATCH_SELECTOR16(fade),  // pushi 00f3 +	0x39, 0x06,                    // pushi 06 +	PATCH_END +}; +  //          script, description,                                      signature                        patch  static const SciScriptPatcherEntry shiversSignatures[] = {  	{  true, 35170, "fix CCTV joystick interaction",               1, shiversSignatureSuperCall,     shiversPatchSuperCall },  	{  true,   990, "fix volume & brightness sliders",             2, shiversSignatureSuperCall,     shiversPatchSuperCall },  	{  true, 64908, "disable video benchmarking",                  1, sci2BenchmarkSignature,        sci2BenchmarkPatch }, +	{  true, 23090, "fix play call in room 23090",                 1, shiversGodsItemsIxupiPlaySoundSignature, shiversGodsItemsIxupiPlaySoundPatch },  	SCI_SIGNATUREENTRY_TERMINATOR  }; | 
