SCI: Change kSave() to be a kernel function with subops

This commit is contained in:
Filippos Karapetis 2012-06-13 11:56:13 +03:00
parent 5a17ea0585
commit 944a774e6a
3 changed files with 28 additions and 29 deletions

View File

@ -461,6 +461,7 @@ reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv);
// SCI2.1 Kernel Functions
reg_t kText(EngineState *s, int argc, reg_t *argv);
reg_t kSave(EngineState *s, int argc, reg_t *argv);
reg_t kAutoSave(EngineState *s, int argc, reg_t *argv);
reg_t kList(EngineState *s, int argc, reg_t *argv);
reg_t kRobot(EngineState *s, int argc, reg_t *argv);
reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv);

View File

@ -245,6 +245,18 @@ static const SciKernelMapSubEntry kFileIO_subops[] = {
SCI_SUBOPENTRY_TERMINATOR
};
static const SciKernelMapSubEntry kSave_subops[] = {
{ SIG_SCI32, 0, MAP_CALL(SaveGame), "[r0]i[r0](r)", NULL },
{ SIG_SCI32, 1, MAP_CALL(RestoreGame), "[r0]i[r0]", NULL },
{ SIG_SCI32, 2, MAP_CALL(GetSaveDir), "(r*)", NULL },
{ SIG_SCI32, 3, MAP_CALL(CheckSaveGame), ".*", NULL },
// Subop 4 hasn't been encountered yet
{ SIG_SCI32, 5, MAP_CALL(GetSaveFiles), "rrr", NULL },
{ SIG_SCI32, 6, MAP_CALL(MakeSaveCatName), "rr", NULL },
{ SIG_SCI32, 7, MAP_CALL(MakeSaveFileName), "rri", NULL },
{ SIG_SCI32, 8, MAP_CALL(AutoSave), "[o0]", NULL },
};
#ifdef ENABLE_SCI32
// version, subId, function-mapping, signature, workarounds
static const SciKernelMapSubEntry kList_subops[] = {
@ -555,7 +567,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL },
{ MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(Robot), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(Save), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(Save), SIG_EVERYWHERE, "i(.*)", kSave_subops, NULL },
{ MAP_CALL(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(AddPicAt), SIG_EVERYWHERE, "oiii", NULL, NULL },
{ MAP_CALL(GetWindowsOption), SIG_EVERYWHERE, "i", NULL, NULL },

View File

@ -946,35 +946,21 @@ reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv) {
return argv[0];
}
reg_t kSave(EngineState *s, int argc, reg_t *argv) {
switch (argv[0].toUint16()) {
case 0:
return kSaveGame(s, argc - 1,argv + 1);
case 1:
return kRestoreGame(s, argc - 1,argv + 1);
case 2:
return kGetSaveDir(s, argc - 1, argv + 1);
case 3:
return kCheckSaveGame(s, argc - 1, argv + 1);
case 5:
return kGetSaveFiles(s, argc - 1, argv + 1);
case 6:
return kMakeSaveCatName(s, argc - 1, argv + 1);
case 7:
return kMakeSaveFileName(s, argc - 1, argv + 1);
case 8:
// TODO
// This is a timer callback, with 1 parameter: the timer object
// (e.g. "timers").
// It's used for auto-saving (i.e. save every X minutes, by checking
// the elapsed time from the timer object)
reg_t kAutoSave(EngineState *s, int argc, reg_t *argv) {
// TODO
// This is a timer callback, with 1 parameter: the timer object
// (e.g. "timers").
// It's used for auto-saving (i.e. save every X minutes, by checking
// the elapsed time from the timer object)
// This function has to return something other than 0 to proceed
return s->r_acc;
default:
kStub(s, argc, argv);
return NULL_REG;
}
// This function has to return something other than 0 to proceed
return s->r_acc;
}
reg_t kSave(EngineState *s, int argc, reg_t *argv) {
if (!s)
return make_reg(0, getSciVersion());
error("not supposed to call this");
}
#endif