diff options
-rw-r--r-- | engines/wintermute/base/base_game.cpp | 43 | ||||
-rw-r--r-- | engines/wintermute/base/base_persistence_manager.h | 1 | ||||
-rw-r--r-- | engines/wintermute/base/saveload.cpp | 12 | ||||
-rw-r--r-- | engines/wintermute/base/saveload.h | 1 |
4 files changed, 57 insertions, 0 deletions
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index e389b6795a..58195e6faa 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -1368,6 +1368,49 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack return STATUS_OK; } +#ifdef ENABLE_FOXTAIL + ////////////////////////////////////////////////////////////////////////// + // [FoxTail] GetSaveSlotDescriptionTimestamp + // Return struct with "Description" and "Timestamp" fields in 1.2.362- + // Return array with "Description" and "Timestamp" items in 1.2.527+ + // Timestamps should be comparable types + // Used to sort saved games by timestamps at save.script & load.script + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "GetSaveSlotDescriptionTimestamp") == 0) { + stack->correctParams(1); + int slot = stack->pop()->getInt(); + + TimeDate time; + SaveLoad::getSaveSlotTimestamp(slot, &time); + stack->pushInt(time.tm_sec); + stack->pushInt(time.tm_min); + stack->pushInt(time.tm_hour); + stack->pushInt(time.tm_mday); + stack->pushInt(time.tm_mon + 1); + stack->pushInt(time.tm_year + 1900); + stack->pushInt(6); + BaseScriptable *date = makeSXDate(_gameRef, stack); + stack->pushNative(date, false); + + Common::String desc = SaveLoad::getSaveSlotDescription(slot); + stack->pushString(desc.c_str()); + + BaseScriptable *obj; + if (BaseEngine::instance().isFoxTail(FOXTAIL_1_2_527, FOXTAIL_LATEST_VERSION)) { + stack->pushInt(2); + obj = makeSXArray(_gameRef, stack); + } else { + stack->pushInt(0); + obj = makeSXObject(_gameRef, stack); + obj->scSetProperty("Description", stack->pop()); + obj->scSetProperty("Timestamp", stack->pop()); + } + stack->pushNative(obj, false); + + return STATUS_OK; + } +#endif + ////////////////////////////////////////////////////////////////////////// // EmptySaveSlot ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h index 760b45c907..e8ca663cb7 100644 --- a/engines/wintermute/base/base_persistence_manager.h +++ b/engines/wintermute/base/base_persistence_manager.h @@ -69,6 +69,7 @@ public: uint32 _offset; bool getIsSaving() { return _saving; } + TimeDate getSavedTimestamp() { return _savedTimestamp; } uint32 _richBufferSize; byte *_richBuffer; diff --git a/engines/wintermute/base/saveload.cpp b/engines/wintermute/base/saveload.cpp index e0f97f0d88..bafe8a7a51 100644 --- a/engines/wintermute/base/saveload.cpp +++ b/engines/wintermute/base/saveload.cpp @@ -182,6 +182,18 @@ Common::String SaveLoad::getSaveSlotDescription(int slot) { return description; } +void SaveLoad::getSaveSlotTimestamp(int slot, TimeDate *time) { + memset(time, 0, sizeof(TimeDate)); + Common::String filename = getSaveSlotFilename(slot); + BasePersistenceManager *pm = new BasePersistenceManager(); + if (pm) { + if ((pm->initLoad(filename))) { + *time = pm->getSavedTimestamp(); + } + delete pm; + } +} + bool SaveLoad::isSaveSlotUsed(int slot) { Common::String filename = getSaveSlotFilename(slot); BasePersistenceManager *pm = new BasePersistenceManager(); diff --git a/engines/wintermute/base/saveload.h b/engines/wintermute/base/saveload.h index e98c7b2f73..295d19d543 100644 --- a/engines/wintermute/base/saveload.h +++ b/engines/wintermute/base/saveload.h @@ -38,6 +38,7 @@ public: static bool emptySaveSlot(int slot); static bool isSaveSlotUsed(int slot); static Common::String getSaveSlotDescription(int slot); + static void getSaveSlotTimestamp(int slot, TimeDate *time); static Common::String getSaveSlotFilename(int slot); static bool loadGame(const Common::String &filename, BaseGame *gameRef); |