void DrasculaEngine::saveGame(char gameName[]) { Common::OutSaveFile *out; int l; if (!(out = _saveFileMan->openForSaving(gameName))) { error("Unable to open the file"); } out->writeSint32LE(currentChapter); out->write(currentData, 20); out->writeSint32LE(curX); out->writeSint32LE(curY); out->writeSint32LE(trackProtagonist); for (l = 1; l < ARRAYSIZE(inventoryObjects); l++) { out->writeSint32LE(inventoryObjects[l]); } for (l = 0; l < NUM_FLAGS; l++) { out->writeSint32LE(flags[l]); } out->writeSint32LE(takeObject); out->writeSint32LE(pickedObject); out->finalize(); if (out->err()) warning("Can't write file '%s'. (Disk full?)", gameName); delete out; }
void SagaEngine::save(const char *fileName, const char *saveName) { Common::OutSaveFile *out; char title[TITLESIZE]; if (!(out = _saveFileMan->openForSaving(fileName))) { return; } _saveHeader.type = MKTAG('S','A','G','A'); _saveHeader.size = 0; _saveHeader.version = CURRENT_SAGA_VER; // Note that IHNM has a smaller save title size than ITE // We allocate the ITE save title size here, to preserve // savegame backwards compatibility Common::strlcpy(_saveHeader.name, saveName, SAVE_TITLE_SIZE); out->writeUint32BE(_saveHeader.type); out->writeUint32LE(_saveHeader.size); out->writeUint32LE(_saveHeader.version); out->write(_saveHeader.name, sizeof(_saveHeader.name)); // Original game title memset(title, 0, TITLESIZE); Common::strlcpy(title, _gameTitle.c_str(), TITLESIZE); out->write(title, TITLESIZE); // Thumbnail // First draw scene without save dialog int oldMode = _interface->getMode(); _interface->setMode(kPanelMain); _render->drawScene(); Graphics::saveThumbnail(*out); _interface->setMode(oldMode); // Date / time TimeDate curTime; _system->getTimeAndDate(curTime); uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF); uint32 playTime = g_engine->getTotalPlayTime() / 1000; out->writeUint32BE(saveDate); out->writeUint16BE(saveTime); out->writeUint32BE(playTime); // Surrounding scene out->writeSint32LE(_scene->getOutsetSceneNumber()); #ifdef ENABLE_IHNM if (getGameId() == GID_IHNM) { out->writeSint32LE(_scene->currentChapterNumber()); out->writeSint32LE(0); // obsolete, was used for the protagonist out->writeSint32LE(_scene->getCurrentMusicTrack()); out->writeSint32LE(_scene->getCurrentMusicRepeat()); } #endif // Inset scene out->writeSint32LE(_scene->currentSceneNumber()); #ifdef ENABLE_IHNM if (getGameId() == GID_IHNM) { out->writeUint32LE(_globalFlags); for (int i = 0; i < ARRAYSIZE(_ethicsPoints); i++) out->writeSint16LE(_ethicsPoints[i]); } #endif _interface->saveState(out); _actor->saveState(out); out->writeSint16LE(_script->_commonBuffer.size()); out->write(_script->_commonBuffer.getBuffer(), _script->_commonBuffer.size()); // ISO map x, y coordinates for ITE if (getGameId() == GID_ITE) { out->writeSint16LE(_isoMap->getMapPosition().x); out->writeSint16LE(_isoMap->getMapPosition().y); } out->finalize(); if (out->err()) warning("Can't write file '%s'. (Disk full?)", fileName); delete out; _interface->resetSaveReminder(); }