diff options
| author | Colin Snover | 2016-10-29 19:50:35 -0500 | 
|---|---|---|
| committer | Colin Snover | 2016-11-02 15:43:07 -0500 | 
| commit | e8c429832f7b6393f853fd6d9ce8ba2e62f6a93c (patch) | |
| tree | f9a8cbf4f2dea3f1a3ce34012aaa8e18b7006ee7 /engines | |
| parent | c42e74c562c3a55cb72901e8ecb56da600bfcb42 (diff) | |
| download | scummvm-rg350-e8c429832f7b6393f853fd6d9ce8ba2e62f6a93c.tar.gz scummvm-rg350-e8c429832f7b6393f853fd6d9ce8ba2e62f6a93c.tar.bz2 scummvm-rg350-e8c429832f7b6393f853fd6d9ce8ba2e62f6a93c.zip  | |
SCI32: Automate kNumCels workaround
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/sci/engine/workarounds.cpp | 15 | ||||
| -rw-r--r-- | engines/sci/engine/workarounds.h | 1 | ||||
| -rw-r--r-- | engines/sci/graphics/celobj32.cpp | 28 | 
3 files changed, 9 insertions, 35 deletions
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index dabf79a54b..52c5c33066 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -684,21 +684,6 @@ const SciWorkaroundEntry kNewWindow_workarounds[] = {  };  //    gameID,           room,script,lvl,          object-name, method-name, local-call-signature, index,                workaround -const SciWorkaroundEntry kNumCels_workarounds[] = { -	{ GID_GK1,           460, 64998, -1,              "GKEgo", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 5 } }, // when Gabriel clicks "ask" on the bartender from a distance -	{ GID_GK1,           808, 64998, -1,          "sDJEnters", "changeState",               NULL,    -1, { WORKAROUND_FAKE, 6 } }, // -	{ GID_GK2,           470, 64998, -1,        "pLookieLoos", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 50 } }, // random background movement in the crime scene in Munich city centre -	{ GID_GK2,           470, 64998, -1,          "pNewsCrew", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 18 } }, // random background movement in the crime scene in Munich city centre -	{ GID_GK2,           470, 64998, -1,        "pLeberGroup", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 22 } }, // random background movement in the crime scene in Munich city centre -	{ GID_SQ6,           270, 64998, -1,           "offWorld", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 3 } }, // when exiting the kidnapping room -	{ GID_SQ6,           320, 64998, -1,          "wandererB", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 8 } }, // random background movement on Polysorbate LX street 3 -	{ GID_SQ6,           340, 64998, -1,          "wandererB", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 8 } }, // random background movement on Polysorbate LX street 1 -	{ GID_SQ6,           530, 64998, -1,           "monitors", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 5 } }, // random background movement during cutscene -	{ GID_SQ6,           680, 64998, -1,                "ego", "lastCel",                   NULL,    -1, { WORKAROUND_FAKE, 44 } }, // when double-clicking hand icon on blockage -	SCI_WORKAROUNDENTRY_TERMINATOR -}; - -//    gameID,           room,script,lvl,          object-name, method-name, local-call-signature, index,                workaround  const SciWorkaroundEntry kPalVarySetPercent_workarounds[] = {  	{ GID_GK1,           370,   370,  0,        "graceComeOut", "changeState",              NULL,     0, { WORKAROUND_STILLCALL, 0 } }, // there's an extra parameter in GK1, when changing chapters. This extra parameter seems to be a bug or just unimplemented functionality, as there's no visible change from the original in the chapter change room  	SCI_WORKAROUNDENTRY_TERMINATOR diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index c50a7fb04e..2d72ae5811 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -85,7 +85,6 @@ extern const SciWorkaroundEntry kIsObject_workarounds[];  extern const SciWorkaroundEntry kMemory_workarounds[];  extern const SciWorkaroundEntry kMoveCursor_workarounds[];  extern const SciWorkaroundEntry kNewWindow_workarounds[]; -extern const SciWorkaroundEntry kNumCels_workarounds[];  extern const SciWorkaroundEntry kPalVarySetPercent_workarounds[];  extern const SciWorkaroundEntry kRandom_workarounds[];  extern const SciWorkaroundEntry kReadNumber_workarounds[]; diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp index 430500ce1e..09ea05bd59 100644 --- a/engines/sci/graphics/celobj32.cpp +++ b/engines/sci/graphics/celobj32.cpp @@ -800,7 +800,7 @@ int16 CelObjView::getNumLoops(const GuiResourceId viewId) {  	return resource->data[2];  } -int16 CelObjView::getNumCels(const GuiResourceId viewId, const int16 loopNo) { +int16 CelObjView::getNumCels(const GuiResourceId viewId, int16 loopNo) {  	const Resource *const resource = g_sci->getResMan()->findResource(ResourceId(kResourceTypeView, viewId), false);  	if (!resource) { @@ -813,25 +813,15 @@ int16 CelObjView::getNumCels(const GuiResourceId viewId, const int16 loopNo) {  	// Every version of SCI32 has a logic error in this function that causes  	// random memory to be read if a script requests the cel count for one -	// past the maximum loop index. At least GK1 room 800 does this, and gets -	// stuck in an infinite loop because the game script expects this method -	// to return a non-zero value. -	// The scope of this bug means it is likely to pop up in other games, so we -	// explicitly trap the bad condition here and report it so that any other -	// game scripts relying on this broken behavior can be fixed as well +	// past the maximum loop index. For example, GK1 room 808 does this, and +	// gets stuck in an infinite loop because the game script expects this +	// method to return a non-zero value. +	// This bug is triggered in basically every SCI32 game and appears to be +	// universally fixable simply by always using the next lowest loop instead.  	if (loopNo == loopCount) { -		SciCallOrigin origin; -		SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, kNumCels_workarounds, &origin); -		switch (solution.type) { -		case WORKAROUND_NONE: -			error("[CelObjView::getNumCels]: loop number %d is equal to loop count in view %u, %s", loopNo, viewId, origin.toString().c_str()); -		case WORKAROUND_FAKE: -			return (int16)solution.value; -		case WORKAROUND_IGNORE: -			return 0; -		case WORKAROUND_STILLCALL: -			break; -		} +		const SciCallOrigin origin = g_sci->getEngineState()->getCurrentCallOrigin(); +		debugC(kDebugLevelWorkarounds, "Workaround: kNumCels loop %d -> loop %d in view %u, %s", loopNo, loopNo - 1, viewId, origin.toString().c_str()); +		--loopNo;  	}  	if (loopNo > loopCount || loopNo < 0) {  | 
