From e68e82cd8cf309a3b8fc353d2695f45e165311ef Mon Sep 17 00:00:00 2001 From: lolbot-iichan Date: Tue, 21 May 2019 00:00:07 +0300 Subject: WINTERMUTE: Add FoxTail saveslot timestamp getter FoxTail requires Game.GetSaveSlotDescriptionTimestamp for getting information about saved games. Engine 1.2.362 and below returns object with Description and Timestamp fields. Engine 1.2.527 and above returns array[2] with Description and Timestamp as items. --- engines/wintermute/base/base_game.cpp | 43 ++++++++++++++++++++++ engines/wintermute/base/base_persistence_manager.h | 1 + engines/wintermute/base/saveload.cpp | 12 ++++++ engines/wintermute/base/saveload.h | 1 + 4 files changed, 57 insertions(+) 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); -- cgit v1.2.3