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 // SCI2.1 Kernel Functions
reg_t kText(EngineState *s, int argc, reg_t *argv); reg_t kText(EngineState *s, int argc, reg_t *argv);
reg_t kSave(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 kList(EngineState *s, int argc, reg_t *argv);
reg_t kRobot(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); reg_t kPlayVMD(EngineState *s, int argc, reg_t *argv);

View File

@ -245,6 +245,18 @@ static const SciKernelMapSubEntry kFileIO_subops[] = {
SCI_SUBOPENTRY_TERMINATOR 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 #ifdef ENABLE_SCI32
// version, subId, function-mapping, signature, workarounds // version, subId, function-mapping, signature, workarounds
static const SciKernelMapSubEntry kList_subops[] = { static const SciKernelMapSubEntry kList_subops[] = {
@ -555,7 +567,7 @@ static SciKernelMapEntry s_kernelMap[] = {
{ MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL }, { MAP_CALL(MulDiv), SIG_EVERYWHERE, "iii", NULL, NULL },
{ MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(PlayVMD), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(Robot), 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(Text), SIG_EVERYWHERE, "(.*)", NULL, NULL },
{ MAP_CALL(AddPicAt), SIG_EVERYWHERE, "oiii", NULL, NULL }, { MAP_CALL(AddPicAt), SIG_EVERYWHERE, "oiii", NULL, NULL },
{ MAP_CALL(GetWindowsOption), SIG_EVERYWHERE, "i", 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]; return argv[0];
} }
reg_t kSave(EngineState *s, int argc, reg_t *argv) { reg_t kAutoSave(EngineState *s, int argc, reg_t *argv) {
switch (argv[0].toUint16()) { // TODO
case 0: // This is a timer callback, with 1 parameter: the timer object
return kSaveGame(s, argc - 1,argv + 1); // (e.g. "timers").
case 1: // It's used for auto-saving (i.e. save every X minutes, by checking
return kRestoreGame(s, argc - 1,argv + 1); // the elapsed time from the timer object)
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 // This function has to return something other than 0 to proceed
return s->r_acc; return s->r_acc;
default: }
kStub(s, argc, argv);
return NULL_REG; reg_t kSave(EngineState *s, int argc, reg_t *argv) {
} if (!s)
return make_reg(0, getSciVersion());
error("not supposed to call this");
} }
#endif #endif