diff options
| -rw-r--r-- | engines/sci/engine/script_patches.cpp | 95 | ||||
| -rw-r--r-- | engines/sci/engine/selector.cpp | 4 | ||||
| -rw-r--r-- | engines/sci/engine/selector.h | 5 | 
3 files changed, 97 insertions, 7 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index f7dc620af4..bc4974955b 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -100,6 +100,9 @@ static const char *const selectorNameTable[] = {  	"number",       // system selector  	"setScript",    // system selector  	"setCycle",     // system selector +	"setStep",      // system selector +	"cycleSpeed",   // system selector +	"handsOff",     // system selector  	"localize",     // Freddy Pharkas  	"put",          // Police Quest 1 VGA  	"say",          // Quest For Glory 1 VGA @@ -168,6 +171,9 @@ enum ScriptPatcherSelectors {  	SELECTOR_number,  	SELECTOR_setScript,  	SELECTOR_setCycle, +	SELECTOR_setStep, +	SELECTOR_cycleSpeed, +	SELECTOR_handsOff,  	SELECTOR_localize,  	SELECTOR_put,  	SELECTOR_say, @@ -5846,14 +5852,89 @@ static const uint16 qfg4BenchmarkPatch[] = {  	PATCH_END  }; -//          script, description,                                      signature                         patch +// Right at the start of the game inside room 800, when automatically sliding down a slope +// an error may happen inside Grooper::doit caused by a timing issue. +// +// We delay a bit, so that hero::cycler should always be set. +// +// Applies to: English CD, English floppy, German floppy +// Responsible method: sFallsBackSide::changeState (script 803) +// Fixes bug #9801 +static const uint16 qfg4SlidingDownSlopeSignature[] = { +	0x87, 0x01,                       // lap param[1] +	0x65, SIG_ADDTOOFFSET(+1),        // aTop state +	0x36,                             // push +	0x3c,                             // dup +	0x35, 0x00,                       // ldi 00 +	0x1a,                             // eq? +	0x31, 0x30,                       // bnt [skip state 0] +	0x38, SIG_SELECTOR16(handsOff),   // pushi handsOff +	0x76,                             // push0 +	0x81, 0x01,                       // lag global[1] +	0x4a, SIG_UINT16(0x0004),         // send 04 +	SIG_MAGICDWORD, +	0x38, SIG_SELECTOR16(cycleSpeed), // pushi cycleSpeed +	0x76,                             // push0 +	0x81, 0x00,                       // lag global[0] +	0x4a, SIG_UINT16(0x0004),         // send 04 +	0xa3, 0x00,                       // sal local[0] +	0x38, SIG_SELECTOR16(setStep),    // pushi setStep +	0x7a,                             // push2 +	0x78,                             // push1 +	0x78,                             // push1 +	0x38, SIG_SELECTOR16(setMotion),  // pushi setMotion +	0x38, SIG_UINT16(0x0004),         // pushi 04 +	0x51, SIG_ADDTOOFFSET(+1),        // class PolyPath +	0x36,                             // push +	0x39, 0x49,                       // pushi $49 +	0x39, 0x50,                       // pushi $50 +	0x7c,                             // pushSelf +	0x81, 0x00,                       // lag global[0] +	0x4a, SIG_UINT16(0x0014),         // send $14 +	SIG_END +}; + +static const uint16 qfg4SlidingDownSlopePatch[] = { +	PATCH_ADDTOOFFSET(+5), +	0x2f, 0x34,                         // bt [skip state 0] +	0x38, PATCH_SELECTOR16(handsOff),   // pushi handsOff +	0x76,                               // push0 +	0x81, 0x01,                         // lag global[1] +	0x4a, PATCH_UINT16(0x0004),         // send 04 + +	0x78,                                     // push1 +	0x39, 0x20,                               // pushi $20 +	0x43, kScummVMWaitId, PATCH_UINT16(0x02), // callk Wait, $2 +	0x38, PATCH_SELECTOR16(setStep),    // pushi setStep +	0x7a,                               // push2 +	0x78,                               // push1 +	0x78,                               // push1 +	0x38, PATCH_SELECTOR16(setMotion),  // pushi setMotion +	0x38, PATCH_UINT16(0x0004),         // pushi 04 +	0x51, PATCH_GETORIGINALBYTE(+44),   // class PolyPath +	0x36,                               // push +	0x39, 0x49,                         // pushi $49 +	0x39, 0x50,                         // pushi $50 +	0x7c,                               // pushSelf +	0x81, 0x00,                         // lag global[0] +	0x38, PATCH_SELECTOR16(cycleSpeed), // pushi cycleSpeed +	0x76,                               // push0 +	0x4a, PATCH_UINT16(0x0018),         // send $18 +	0xa3, 0x00,                         // sal local[0] +	0x3a,                               // toss +	0x48,                               // ret +	PATCH_END +}; + +//          script, description,                                     signature                      patch  static const SciScriptPatcherEntry qfg4Signatures[] = { -	{  true,     1, "disable volume reset on startup",             1, sci2VolumeResetSignature,         sci2VolumeResetPatch }, -	{  true,     1, "disable video benchmarking",                  1, qfg4BenchmarkSignature,           qfg4BenchmarkPatch }, -	{  true,    83, "fix incorrect array type",                    1, qfg4TrapArrayTypeSignature,       qfg4TrapArrayTypePatch }, -	{  true, 64990, "increase number of save games (1/2)",         1, sci2NumSavesSignature1,           sci2NumSavesPatch1 }, -	{  true, 64990, "increase number of save games (2/2)",         1, sci2NumSavesSignature2,           sci2NumSavesPatch2 }, -	{  true, 64990, "disable change directory button",             1, sci2ChangeDirSignature,           sci2ChangeDirPatch }, +	{  true,     1, "disable volume reset on startup",             1, sci2VolumeResetSignature,      sci2VolumeResetPatch }, +	{  true,     1, "disable video benchmarking",                  1, qfg4BenchmarkSignature,        qfg4BenchmarkPatch }, +	{  true,    83, "fix incorrect array type",                    1, qfg4TrapArrayTypeSignature,    qfg4TrapArrayTypePatch }, +	{  true,   803, "fix sliding down slope",                      1, qfg4SlidingDownSlopeSignature, qfg4SlidingDownSlopePatch }, +	{  true, 64990, "increase number of save games (1/2)",         1, sci2NumSavesSignature1,        sci2NumSavesPatch1 }, +	{  true, 64990, "increase number of save games (2/2)",         1, sci2NumSavesSignature2,        sci2NumSavesPatch2 }, +	{  true, 64990, "disable change directory button",             1, sci2ChangeDirSignature,        sci2ChangeDirPatch },  	SCI_SIGNATUREENTRY_TERMINATOR  }; diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 42c71c4d31..d2f6a14797 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -165,6 +165,10 @@ void Kernel::mapSelectors() {  	FIND_SELECTOR(vanishingY);  	FIND_SELECTOR(iconIndex);  	FIND_SELECTOR(select); +	FIND_SELECTOR(handsOff); +	FIND_SELECTOR(setStep); +	FIND_SELECTOR(setMotion); +	FIND_SELECTOR(cycleSpeed);  #ifdef ENABLE_SCI32  	FIND_SELECTOR(data); diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index 2debd3204d..2c1a34e938 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -131,6 +131,11 @@ struct SelectorCache {  	Selector iconIndex; ///< Used to index icon bar objects  	Selector select; +	Selector handsOff; +	Selector setStep; +	Selector setMotion; +	Selector cycleSpeed; +  #ifdef ENABLE_SCI32  	Selector data; // Used by Array()/String()  	Selector picture; // Used to hold the picture ID for SCI32 pictures  | 
