From b099b5504d3d9c16af67463d250dd71163950bf9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 29 Apr 2018 21:45:16 -0400 Subject: XEEN: Support importing Clouds/Darkside savegames to World of Xeen --- engines/xeen/files.cpp | 4 +++- engines/xeen/files.h | 5 +++++ engines/xeen/saves.cpp | 16 +++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) (limited to 'engines/xeen') diff --git a/engines/xeen/files.cpp b/engines/xeen/files.cpp index 0fce5b3741..d18b5c4dd6 100644 --- a/engines/xeen/files.cpp +++ b/engines/xeen/files.cpp @@ -488,8 +488,10 @@ void SaveArchive::load(Common::SeekableReadStream &stream) { _data = new byte[_dataSize]; stream.seek(0); stream.read(_data, _dataSize); +} - // Load in the character stats and active party +void SaveArchive::loadParty() { + // Load in the character roster and active party Common::SeekableReadStream *chr = createReadStreamForMember("maze.chr"); Common::Serializer sChr(chr, nullptr); _party->_roster.synchronize(sChr); diff --git a/engines/xeen/files.h b/engines/xeen/files.h index 08aa3cd8d0..0d421547fb 100644 --- a/engines/xeen/files.h +++ b/engines/xeen/files.h @@ -351,6 +351,11 @@ public: */ void save(Common::WriteStream &s); + /** + * Load the character roster and party + */ + void loadParty(); + /** * Sets a new resource entry */ diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp index 60cac91b75..96490c8937 100644 --- a/engines/xeen/saves.cpp +++ b/engines/xeen/saves.cpp @@ -177,9 +177,13 @@ Common::Error SavesManager::loadGameState(int slot) { uint fileSize = saveFile->readUint32LE(); if (archives[idx]) { - Common::SeekableSubReadStream arcStream(saveFile, saveFile->pos(), - saveFile->pos() + fileSize); - archives[idx]->load(arcStream); + if (fileSize) { + Common::SeekableSubReadStream arcStream(saveFile, saveFile->pos(), + saveFile->pos() + fileSize); + archives[idx]->load(arcStream); + } else { + archives[idx]->reset((idx == 1) ? File::_darkCc : File::_xeenCc); + } } else { assert(!fileSize); } @@ -188,6 +192,9 @@ Common::Error SavesManager::loadGameState(int slot) { // Read in miscellaneous files.load(*saveFile); + // Load the character roster and party + File::_currentSave->loadParty(); + // Reset any combat information from the previous game combat.reset(); party._treasure.reset(); @@ -228,6 +235,9 @@ void SavesManager::newGame() { File::_darkSave : File::_xeenSave; assert(File::_currentSave); + // Load the character roster and party + File::_currentSave->loadParty(); + // Set any final initial values Party &party = *g_vm->_party; party.resetBlacksmithWares(); -- cgit v1.2.3