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(CoordPri), SIG_EVERYWHERE, "i(i)", NULL, NULL },
|
||||||
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
|
{ MAP_CALL(CosDiv), SIG_EVERYWHERE, "ii", NULL, NULL },
|
||||||
{ MAP_CALL(DeleteKey), SIG_EVERYWHERE, "l.", 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 },
|
{ 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
|
// ^ 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
|
// 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) {
|
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();
|
int mode = argv[0].toUint16();
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
|
|
@ -138,6 +138,19 @@ const SciWorkaroundEntry kCelWide_workarounds[] = {
|
||||||
SCI_WORKAROUNDENTRY_TERMINATOR
|
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
|
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
|
||||||
const SciWorkaroundEntry kDisplay_workarounds[] = {
|
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
|
{ 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 kAbs_workarounds[];
|
||||||
extern const SciWorkaroundEntry kCelHigh_workarounds[];
|
extern const SciWorkaroundEntry kCelHigh_workarounds[];
|
||||||
extern const SciWorkaroundEntry kCelWide_workarounds[];
|
extern const SciWorkaroundEntry kCelWide_workarounds[];
|
||||||
|
extern const SciWorkaroundEntry kDeviceInfo_workarounds[];
|
||||||
extern const SciWorkaroundEntry kDisplay_workarounds[];
|
extern const SciWorkaroundEntry kDisplay_workarounds[];
|
||||||
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
|
extern const SciWorkaroundEntry kDisposeScript_workarounds[];
|
||||||
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
|
extern const SciWorkaroundEntry kDoSoundFade_workarounds[];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue