From dca3c8d8bfc6c4db38cf8e8291818dd472041d4e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 31 Oct 2010 01:45:24 +0000 Subject: SCI: Play time related changes - Added support for savegame play time - Removed obsolete variables for calculating the play time (EngineState::gameStartTime and Console::_enterTime) - Renamed some variables to camelCase svn-id: r53974 --- engines/sci/console.cpp | 5 +-- engines/sci/console.h | 1 - engines/sci/detection.cpp | 19 ++++++----- engines/sci/engine/kfile.cpp | 14 ++++---- engines/sci/engine/kmisc.cpp | 3 +- engines/sci/engine/savegame.cpp | 70 ++++++++++++++++++++++----------------- engines/sci/engine/savegame.h | 17 +++++----- engines/sci/engine/state.h | 1 - engines/sci/graphics/frameout.cpp | 4 ++- engines/sci/sci.cpp | 4 ++- 10 files changed, 74 insertions(+), 64 deletions(-) (limited to 'engines/sci') diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index c668ec9436..deab3dadd8 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -68,7 +68,7 @@ bool g_debug_track_mouse_clicks = false; static int parse_reg_t(EngineState *s, const char *str, reg_t *dest, bool mayBeValue); Console::Console(SciEngine *engine) : GUI::Debugger(), - _engine(engine), _debugState(engine->_debugState), _enterTime(0) { + _engine(engine), _debugState(engine->_debugState) { // Variables DVar_Register("sleeptime_factor", &g_debug_sleeptime_factor, DVAR_INT, 0); @@ -222,7 +222,6 @@ Console::~Console() { void Console::preEnter() { _engine->pauseEngine(true); - _enterTime = g_system->getMillis(); } void Console::postEnter() { @@ -283,8 +282,6 @@ void Console::postEnter() { } _engine->pauseEngine(false); - // Subtract the time we were running the debugger from the game running time - _engine->_gamestate->gameStartTime += g_system->getMillis() - _enterTime; } bool Console::cmdHelp(int argc, const char **argv) { diff --git a/engines/sci/console.h b/engines/sci/console.h index 88d26c9e7e..68c2d21e38 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -168,7 +168,6 @@ private: bool _mouseVisible; Common::String _videoFile; int _videoFrameDelay; - uint32 _enterTime; }; } // End of namespace Sci diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index a4d1edf2ed..2292692ac1 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -624,7 +624,8 @@ bool SciMetaEngine::hasFeature(MetaEngineFeature f) const { (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || - (f == kSavesSupportCreationDate); + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime); } bool SciEngine::hasFeature(EngineFeature f) const { @@ -665,7 +666,7 @@ SaveStateList SciMetaEngine::listSaves(const char *target) const { delete in; continue; } - saveList.push_back(SaveStateDescriptor(slotNum, meta.savegame_name)); + saveList.push_back(SaveStateDescriptor(slotNum, meta.name)); delete in; } } @@ -688,7 +689,7 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl return desc; } - SaveStateDescriptor desc(slot, meta.savegame_name); + SaveStateDescriptor desc(slot, meta.name); Graphics::Surface *thumbnail = new Graphics::Surface(); assert(thumbnail); @@ -702,18 +703,18 @@ SaveStateDescriptor SciMetaEngine::querySaveMetaInfos(const char *target, int sl desc.setDeletableFlag(true); desc.setWriteProtectedFlag(false); - int day = (meta.savegame_date >> 24) & 0xFF; - int month = (meta.savegame_date >> 16) & 0xFF; - int year = meta.savegame_date & 0xFFFF; + int day = (meta.saveDate >> 24) & 0xFF; + int month = (meta.saveDate >> 16) & 0xFF; + int year = meta.saveDate & 0xFFFF; desc.setSaveDate(year, month, day); - int hour = (meta.savegame_time >> 16) & 0xFF; - int minutes = (meta.savegame_time >> 8) & 0xFF; + int hour = (meta.saveTime >> 16) & 0xFF; + int minutes = (meta.saveTime >> 8) & 0xFF; desc.setSaveTime(hour, minutes); - // TODO: played time + desc.setPlayTime(meta.playTime * 1000); delete in; diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index b6d67513d2..3b41c851e1 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -422,7 +422,7 @@ static void listSavegames(Common::Array &saves) { Common::SeekableReadStream *in; if ((in = saveFileMan->openForLoading(filename))) { SavegameMetadata meta; - if (!get_savegame_metadata(in, &meta) || meta.savegame_name.empty()) { + if (!get_savegame_metadata(in, &meta) || meta.name.empty()) { // invalid delete in; continue; @@ -431,17 +431,17 @@ static void listSavegames(Common::Array &saves) { SavegameDesc desc; desc.id = strtol(filename.end() - 3, NULL, 10); - desc.date = meta.savegame_date; + desc.date = meta.saveDate; // We need to fix date in here, because we save DDMMYYYY instead of // YYYYMMDD, so sorting wouldn't work desc.date = ((desc.date & 0xFFFF) << 16) | ((desc.date & 0xFF0000) >> 8) | ((desc.date & 0xFF000000) >> 24); - desc.time = meta.savegame_time; - desc.version = meta.savegame_version; + desc.time = meta.saveTime; + desc.version = meta.version; - if (meta.savegame_name.lastChar() == '\n') - meta.savegame_name.deleteLastChar(); + if (meta.name.lastChar() == '\n') + meta.name.deleteLastChar(); - Common::strlcpy(desc.name, meta.savegame_name.c_str(), SCI_MAX_SAVENAME_LENGTH); + Common::strlcpy(desc.name, meta.name.c_str(), SCI_MAX_SAVENAME_LENGTH); debug(3, "Savegame in file %s ok, id %d", filename.c_str(), desc.id); diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index bbade82fef..6d3cd78586 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -180,11 +180,10 @@ enum { reg_t kGetTime(EngineState *s, int argc, reg_t *argv) { TimeDate loc_time; - uint32 elapsedTime; + uint32 elapsedTime = g_engine->getTotalPlayTime(); int retval = 0; // Avoid spurious warning g_system->getTimeAndDate(loc_time); - elapsedTime = g_system->getMillis() - s->gameStartTime; int mode = (argc > 0) ? argv[0].toUint16() : 0; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 87e328592f..4d55febbf9 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -178,24 +178,34 @@ static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) // TODO: It would be a good idea to store a magic number & a header size here, // so that we can implement backward compatibility if the savegame format changes. - s.syncString(obj.savegame_name); + s.syncString(obj.name); s.syncVersion(CURRENT_SAVEGAME_VERSION); - obj.savegame_version = s.getVersion(); - s.syncString(obj.game_version); - s.syncAsSint32LE(obj.savegame_date); - s.syncAsSint32LE(obj.savegame_time); + obj.version = s.getVersion(); + s.syncString(obj.gameVersion); + s.syncAsSint32LE(obj.saveDate); + s.syncAsSint32LE(obj.saveTime); if (s.getVersion() < 22) { - obj.game_object_offset = 0; - obj.script0_size = 0; + obj.gameObjectOffset = 0; + obj.script0Size = 0; } else { - s.syncAsUint16LE(obj.game_object_offset); - s.syncAsUint16LE(obj.script0_size); + s.syncAsUint16LE(obj.gameObjectOffset); + s.syncAsUint16LE(obj.script0Size); + } + + // Playtime + obj.playTime = 0; + if (s.isLoading()) { + if (s.getVersion() >= 26) + s.syncAsUint32LE(obj.playTime); + } else { + obj.playTime = g_engine->getTotalPlayTime() / 1000; + s.syncAsUint32LE(obj.playTime); } } void EngineState::saveLoadWithSerializer(Common::Serializer &s) { Common::String tmp; - s.syncString(tmp, VER(14), VER(23)); // OBSOLETE: Used to be game_version + s.syncString(tmp, VER(14), VER(23)); // OBSOLETE: Used to be gameVersion if (getSciVersion() <= SCI_VERSION_1_1) { // Save/Load picPort as well for SCI0-SCI1.1. Necessary for Castle of Dr. Brain, @@ -520,7 +530,7 @@ void SoundCommandParser::syncPlayList(Common::Serializer &s) { _music->saveLoadWithSerializer(s); } -void SoundCommandParser::reconstructPlayList(int savegame_version) { +void SoundCommandParser::reconstructPlayList(int version) { Common::StackLock lock(_music->_mutex); const MusicList::iterator end = _music->getPlayListEnd(); @@ -681,15 +691,15 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam g_system->getTimeAndDate(curTime); SavegameMetadata meta; - meta.savegame_version = CURRENT_SAVEGAME_VERSION; - meta.savegame_name = savename; - meta.game_version = version; - meta.savegame_date = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); - meta.savegame_time = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); + meta.version = CURRENT_SAVEGAME_VERSION; + meta.name = savename; + meta.gameVersion = version; + meta.saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); + meta.saveTime = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); Resource *script0 = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 0), false); - meta.script0_size = script0->size; - meta.game_object_offset = g_sci->getGameObject().offset; + meta.script0Size = script0->size; + meta.gameObjectOffset = g_sci->getGameObject().offset; // Checking here again if (s->executionStackBase) { @@ -718,13 +728,13 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { return; } - if ((meta.savegame_version < MINIMUM_SAVEGAME_VERSION) || - (meta.savegame_version > CURRENT_SAVEGAME_VERSION)) { + if ((meta.version < MINIMUM_SAVEGAME_VERSION) || + (meta.version > CURRENT_SAVEGAME_VERSION)) { /* - if (meta.savegame_version < MINIMUM_SAVEGAME_VERSION) + if (meta.version < MINIMUM_SAVEGAME_VERSION) warning("Old savegame version detected, unable to load it"); else - warning("Savegame version is %d, maximum supported is %0d", meta.savegame_version, CURRENT_SAVEGAME_VERSION); + warning("Savegame version is %d, maximum supported is %0d", meta.version, CURRENT_SAVEGAME_VERSION); */ showScummVMDialog("The format of this saved game is obsolete, unable to load it"); @@ -733,9 +743,9 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { return; } - if (meta.game_object_offset > 0 && meta.script0_size > 0) { + if (meta.gameObjectOffset > 0 && meta.script0Size > 0) { Resource *script0 = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 0), false); - if (script0->size != meta.script0_size || g_sci->getGameObject().offset != meta.game_object_offset) { + if (script0->size != meta.script0Size || g_sci->getGameObject().offset != meta.gameObjectOffset) { //warning("This saved game was created with a different version of the game, unable to load it"); showScummVMDialog("This saved game was created with a different version of the game, unable to load it"); @@ -761,13 +771,13 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // Time state: s->lastWaitTime = g_system->getMillis(); - s->gameStartTime = g_system->getMillis(); s->_screenUpdateTime = g_system->getMillis(); + g_engine->setTotalPlayTime(meta.playTime * 1000); if (g_sci->_gfxPorts) g_sci->_gfxPorts->reset(); - g_sci->_soundCmd->reconstructPlayList(meta.savegame_version); + g_sci->_soundCmd->reconstructPlayList(meta.version); // Message state: delete s->_msgState; @@ -789,12 +799,12 @@ bool get_savegame_metadata(Common::SeekableReadStream *stream, SavegameMetadata if (stream->eos()) return false; - if ((meta->savegame_version < MINIMUM_SAVEGAME_VERSION) || - (meta->savegame_version > CURRENT_SAVEGAME_VERSION)) { - if (meta->savegame_version < MINIMUM_SAVEGAME_VERSION) + if ((meta->version < MINIMUM_SAVEGAME_VERSION) || + (meta->version > CURRENT_SAVEGAME_VERSION)) { + if (meta->version < MINIMUM_SAVEGAME_VERSION) warning("Old savegame version detected- can't load"); else - warning("Savegame version is %d- maximum supported is %0d", meta->savegame_version, CURRENT_SAVEGAME_VERSION); + warning("Savegame version is %d- maximum supported is %0d", meta->version, CURRENT_SAVEGAME_VERSION); return false; } diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 14eec4aafc..7ab28e126b 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -36,19 +36,20 @@ namespace Sci { struct EngineState; enum { - CURRENT_SAVEGAME_VERSION = 25, + CURRENT_SAVEGAME_VERSION = 26, MINIMUM_SAVEGAME_VERSION = 14 }; // Savegame metadata struct SavegameMetadata { - Common::String savegame_name; - int savegame_version; - Common::String game_version; - int savegame_date; - int savegame_time; - uint16 game_object_offset; - uint16 script0_size; + Common::String name; + int version; + Common::String gameVersion; + int saveDate; + int saveTime; + uint32 playTime; + uint16 gameObjectOffset; + uint16 script0Size; }; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index d0ddd5ca06..e5c9334315 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -125,7 +125,6 @@ public: /* Non-VM information */ - uint32 gameStartTime; /**< The time at which the interpreter was started */ uint32 lastWaitTime; /**< The last time the game invoked Wait() */ uint32 _screenUpdateTime; /**< The last time the game updated the screen */ diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 035a4cfe45..b0d1315d2e 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -44,6 +44,8 @@ namespace Sci { +// TODO/FIXME: This is all guesswork + GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAdjuster *coordAdjuster, GfxCache *cache, GfxScreen *screen, GfxPalette *palette, GfxPaint32 *paint32) : _segMan(segMan), _resMan(resMan), _cache(cache), _screen(screen), _palette(palette), _paint32(paint32) { @@ -249,7 +251,7 @@ int16 GfxFrameout::kernelGetHighPlanePri() { return readSelectorValue(g_sci->getEngineState()->_segMan, _planes.back().object, SELECTOR(priority)); } -// No idea yet how to implement this +// TODO: No idea yet how to implement this void GfxFrameout::kernelAddPicAt(reg_t planeObj, int16 forWidth, GuiResourceId pictureId) { addPlanePicture(planeObj, pictureId, forWidth); } diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 537a7a3697..f8d25efe73 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -554,7 +554,7 @@ bool SciEngine::initGame() { _vocabulary->reset(); } - _gamestate->gameStartTime = _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis(); + _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis(); // Load game language into printLang property of game object setSciLanguage(); @@ -650,6 +650,8 @@ void SciEngine::initStackBaseWithSelector(Selector selector) { } void SciEngine::runGame() { + setTotalPlayTime(0); + initStackBaseWithSelector(SELECTOR(play)); // Call the play selector // Attach the debug console on game startup, if requested -- cgit v1.2.3