SCI: Fix saving/restoring games in fan games
The SCI Studio function library incorrectly calls kDeviceInfo with one parameter to get the current device. svn-id: r51514
This commit is contained in:
parent
839ba339ed
commit
75b5ac38fb
4 changed files with 23 additions and 1 deletions
|
@ -319,7 +319,7 @@ static SciKernelMapEntry s_kernelMap[] = {
|
|||
{ MAP_CALL(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL },
|
||||
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
|
||||
{ MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", NULL, NULL },
|
||||
{ MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, NULL }, // subop
|
||||
{ MAP_CALL(DeviceInfo), SIG_EVERYWHERE, "i(r)(r)(i)", NULL, kDeviceInfo_workarounds }, // subop
|
||||
{ MAP_CALL(Display), SIG_EVERYWHERE, "[ir]([ir!]*)", NULL, NULL },
|
||||
// ^ we allow invalid references here, because kDisplay gets called with those in e.g. pq3 during intro
|
||||
// restoreBits() checks and skips invalid handles, so that's fine. Sierra SCI behaved the same
|
||||
|
|
|
@ -282,6 +282,14 @@ enum {
|
|||
};
|
||||
|
||||
reg_t kDeviceInfo(EngineState *s, int argc, reg_t *argv) {
|
||||
if (g_sci->getGameId() == GID_FANMADE && argc == 1) {
|
||||
// WORKAROUND: The fan game script library calls kDeviceInfo with one parameter.
|
||||
// According to the scripts, it wants to call CurDevice. However, it fails to
|
||||
// provide the subop to the function.
|
||||
s->_segMan->strcpy(argv[0], "/");
|
||||
return s->r_acc;
|
||||
}
|
||||
|
||||
int mode = argv[0].toUint16();
|
||||
|
||||
switch (mode) {
|
||||
|
|
|
@ -138,6 +138,19 @@ const SciWorkaroundEntry kCelWide_workarounds[] = {
|
|||
SCI_WORKAROUNDENTRY_TERMINATOR
|
||||
};
|
||||
|
||||
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
|
||||
const SciWorkaroundEntry kDeviceInfo_workarounds[] = {
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "save", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xd1c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Cascade Quest)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe55, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Demo Quest)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe57, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (I Want My C64 Back)
|
||||
{ GID_FANMADE, -1, 994, 1, "Game", "restore", 0xe5c, 0, { WORKAROUND_STILLCALL, 0 } }, // In fanmade games, this is called with one parameter for CurDevice (Most of them)
|
||||
SCI_WORKAROUNDENTRY_TERMINATOR
|
||||
};
|
||||
|
||||
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
|
||||
const SciWorkaroundEntry kDisplay_workarounds[] = {
|
||||
{ GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object
|
||||
|
|
|
@ -75,6 +75,7 @@ extern const SciWorkaroundEntry uninitializedReadWorkarounds[];
|
|||
extern const SciWorkaroundEntry kAbs_workarounds[];
|
||||
extern const SciWorkaroundEntry kCelHigh_workarounds[];
|
||||
extern const SciWorkaroundEntry kCelWide_workarounds[];
|
||||
extern const SciWorkaroundEntry kDeviceInfo_workarounds[];
|
||||
extern const SciWorkaroundEntry kDisplay_workarounds[];
|
||||
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
|
||||
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue