mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 06:08:35 +00:00
SCI32: Automate kNumCels workaround
This commit is contained in:
parent
c42e74c562
commit
e8c429832f
@ -683,21 +683,6 @@ const SciWorkaroundEntry kNewWindow_workarounds[] = {
|
||||
SCI_WORKAROUNDENTRY_TERMINATOR
|
||||
};
|
||||
|
||||
// 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
|
||||
|
@ -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[];
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user