Skip to content

Commit

Permalink
SCI: Change kSave() to be a kernel function with subops
Browse files Browse the repository at this point in the history
  • Loading branch information
bluegr committed Jun 13, 2012
1 parent 5a17ea0 commit 944a774
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 29 deletions.
1 change: 1 addition & 0 deletions engines/sci/engine/kernel.h
Expand Up @@ -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);
Expand Down
14 changes: 13 additions & 1 deletion engines/sci/engine/kernel_tables.h
Expand Up @@ -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[] = {
Expand Down Expand Up @@ -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 },
Expand Down
42 changes: 14 additions & 28 deletions engines/sci/engine/kfile.cpp
Expand Up @@ -946,35 +946,21 @@ reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv) {
return argv[0];
}

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;
}

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)

// This function has to return something other than 0 to proceed
return s->r_acc;
default:
kStub(s, argc, argv);
return NULL_REG;
}
if (!s)
return make_reg(0, getSciVersion());
error("not supposed to call this");
}

#endif
Expand Down

0 comments on commit 944a774

Please sign in to comment.