diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/mohawk/dialogs.cpp | 13 | ||||
-rw-r--r-- | engines/mohawk/dialogs.h | 4 | ||||
-rw-r--r-- | engines/mohawk/myst.cpp | 2 | ||||
-rw-r--r-- | engines/mohawk/riven.cpp | 2 | ||||
-rw-r--r-- | engines/titanic/core/game_object.cpp | 12 | ||||
-rw-r--r-- | engines/titanic/core/game_object.h | 2 | ||||
-rw-r--r-- | engines/titanic/module.mk | 2 | ||||
-rw-r--r-- | engines/titanic/sound/proximity.cpp (renamed from engines/titanic/support/proximity.cpp) | 2 | ||||
-rw-r--r-- | engines/titanic/sound/proximity.h (renamed from engines/titanic/support/proximity.h) | 0 | ||||
-rw-r--r-- | engines/titanic/sound/sound.cpp | 114 | ||||
-rw-r--r-- | engines/titanic/sound/sound.h | 64 | ||||
-rw-r--r-- | engines/titanic/sound/sound_manager.cpp | 13 | ||||
-rw-r--r-- | engines/titanic/sound/sound_manager.h | 55 | ||||
-rw-r--r-- | engines/titanic/sound/wave_file.cpp | 5 | ||||
-rw-r--r-- | engines/titanic/sound/wave_file.h | 2 | ||||
-rw-r--r-- | engines/titanic/true_talk/dialogue_file.h | 6 | ||||
-rw-r--r-- | engines/titanic/true_talk/true_talk_manager.cpp | 6 | ||||
-rw-r--r-- | engines/wage/detection.cpp | 15 | ||||
-rw-r--r-- | engines/wage/saveload.cpp | 6 |
19 files changed, 244 insertions, 81 deletions
diff --git a/engines/mohawk/dialogs.cpp b/engines/mohawk/dialogs.cpp index 8c11e3a5e9..38be98dfec 100644 --- a/engines/mohawk/dialogs.cpp +++ b/engines/mohawk/dialogs.cpp @@ -92,7 +92,7 @@ enum { MohawkOptionsDialog::MohawkOptionsDialog(MohawkEngine *vm) : GUI::Dialog(0, 0, 360, 200), - _vm(vm) { + _vm(vm), _loadSlot(-1) { _loadButton = new GUI::ButtonWidget(this, 245, 25, 100, 25, _("~L~oad"), 0, kLoadCmd); _saveButton = new GUI::ButtonWidget(this, 245, 60, 100, 25, _("~S~ave"), 0, kSaveCmd); new GUI::ButtonWidget(this, 245, 95, 100, 25, _("~Q~uit"), 0, kQuitCmd); @@ -112,6 +112,7 @@ MohawkOptionsDialog::~MohawkOptionsDialog() { void MohawkOptionsDialog::open() { GUI::Dialog::open(); + _loadSlot = -1; _loadButton->setEnabled(_vm->canLoadGameStateCurrently()); _saveButton->setEnabled(_vm->canSaveGameStateCurrently()); } @@ -133,12 +134,14 @@ void MohawkOptionsDialog::save() { } void MohawkOptionsDialog::load() { - int slot = _loadDialog->runModalWithCurrentTarget(); + // Do not load the game state from insite the dialog loop to + // avoid mouse cursor glitches (see bug #7164). Instead store + // the slot to load and let the code exectuting the dialog do + // the load after the dialog finished running. + _loadSlot = _loadDialog->runModalWithCurrentTarget(); - if (slot >= 0) { - _vm->loadGameState(slot); + if (_loadSlot >= 0) close(); - } } void MohawkOptionsDialog::reflowLayout() { diff --git a/engines/mohawk/dialogs.h b/engines/mohawk/dialogs.h index 3cfb628f9d..99db641948 100644 --- a/engines/mohawk/dialogs.h +++ b/engines/mohawk/dialogs.h @@ -81,6 +81,8 @@ public: virtual void open() override; virtual void reflowLayout() override; virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override; + + int getLoadSlot() const {return _loadSlot;} private: MohawkEngine *_vm; @@ -90,6 +92,8 @@ private: GUI::SaveLoadChooser *_loadDialog; GUI::SaveLoadChooser *_saveDialog; + + int _loadSlot; void save(); void load(); diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 633b67f7e9..a1c6d0e748 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -309,6 +309,8 @@ Common::Error MohawkEngine_Myst::run() { _canSafelySaveLoad = true; runDialog(*_optionsDialog); + if (_optionsDialog->getLoadSlot() >= 0) + loadGameState(_optionsDialog->getLoadSlot()); _canSafelySaveLoad = false; if (_needsPageDrop) { diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index aa168a38d8..b05b76da30 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -258,6 +258,8 @@ void MohawkEngine_Riven::handleEvents() { break; case Common::KEYCODE_F5: runDialog(*_optionsDialog); + if (_optionsDialog->getLoadSlot() >= 0) + loadGameState(_optionsDialog->getLoadSlot()); updateZipMode(); break; case Common::KEYCODE_r: diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index c04f2e17f4..30366398c1 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -644,7 +644,17 @@ int CGameObject::playSound(const CString &name, int val2, int val3, int val4) { int CGameObject::playSound(const CString &name, CProximity &prox) { if (prox._field28 == 2) { - // TODO + // If the proximity doesn't have a position defined, default it to + // the position of the view to which the game object belongs + if (prox._posX == 0.0 && prox._posY == 0.0 && prox._posZ == 0.0) + findView()->getPosition(prox._posX, prox._posY, prox._posZ); + } + + CGameManager *gameManager = getGameManager(); + if (gameManager) { + g_vm->_filesManager->preload(name); + + gameManager->_sound.playSound(name, prox); } return 0; diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index abb7e999d6..ec7f77cff6 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -26,7 +26,7 @@ #include "titanic/support/mouse_cursor.h" #include "titanic/support/credit_text.h" #include "titanic/support/movie_range_info.h" -#include "titanic/support/proximity.h" +#include "titanic/sound/proximity.h" #include "titanic/support/rect.h" #include "titanic/support/movie_clip.h" #include "titanic/core/named_item.h" diff --git a/engines/titanic/module.mk b/engines/titanic/module.mk index 61e8071fba..b4780d8a5c 100644 --- a/engines/titanic/module.mk +++ b/engines/titanic/module.mk @@ -402,6 +402,7 @@ MODULE_OBJS := \ sound/music_room.o \ sound/music_player.o \ sound/node_auto_sound_player.o \ + sound/proximity.o \ sound/restricted_auto_music_player.o \ sound/room_auto_sound_player.o \ sound/room_trigger_auto_music_player.o \ @@ -460,7 +461,6 @@ MODULE_OBJS := \ support/movie_range_info.o \ support/movie_manager.o \ support/credit_text.o \ - support/proximity.o \ support/rect.o \ support/screen_manager.o \ support/simple_file.o \ diff --git a/engines/titanic/support/proximity.cpp b/engines/titanic/sound/proximity.cpp index 9784ae353b..af23b7bd5f 100644 --- a/engines/titanic/support/proximity.cpp +++ b/engines/titanic/sound/proximity.cpp @@ -20,7 +20,7 @@ * */ -#include "titanic/support/proximity.h" +#include "titanic/sound/proximity.h" #include "titanic/true_talk/tt_talker.h" namespace Titanic { diff --git a/engines/titanic/support/proximity.h b/engines/titanic/sound/proximity.h index 4427574f40..4427574f40 100644 --- a/engines/titanic/support/proximity.h +++ b/engines/titanic/sound/proximity.h diff --git a/engines/titanic/sound/sound.cpp b/engines/titanic/sound/sound.cpp index 7968a088da..e8084d79e0 100644 --- a/engines/titanic/sound/sound.cpp +++ b/engines/titanic/sound/sound.cpp @@ -71,12 +71,39 @@ void CSound::fn3(int handle, int val2, int val3) { warning("TODO: CSound::fn3"); } -int CSound::playSpeech(CDialogueFile *dialogueFile, int speechId, const CProximity &prox) { - warning("TODO: CSound::playSpeech"); - return 0; +void CSound::fn4(WaveFile *waveFile, int val) { + // TODO } -uint CSound::loadSound(const CString &name) { +void CSound::checkSounds() { + for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { + CSoundItem *soundItem = *i; + if (soundItem->_field24 && soundItem->_field28) { + if (_soundManager.isActive(soundItem->_waveFile)) { + _sounds.remove(soundItem); + delete soundItem; + } + } + } +} + +void CSound::removeOldest() { + for (CSoundItemList::iterator i = _sounds.reverse_begin(); + i != _sounds.end(); --i) { + CSoundItem *soundItem = *i; + if (soundItem->_field28 && !_soundManager.isActive(soundItem->_waveFile)) { + _sounds.remove(soundItem); + delete soundItem; + break; + } + } +} + +WaveFile *CSound::getTrueTalkSound(CDialogueFile *dialogueFile, int index) { + return loadSpeech(dialogueFile, index); +} + +WaveFile *CSound::loadSound(const CString &name) { checkSounds(); // Check whether an entry for the given name is already active @@ -86,16 +113,16 @@ uint CSound::loadSound(const CString &name) { // Found it, so move it to the front of the list and return _sounds.remove(soundItem); _sounds.push_front(soundItem); - return soundItem->_soundHandle; + return soundItem->_waveFile; } } // Create new sound item CSoundItem *soundItem = new CSoundItem(name); - soundItem->_soundHandle = _soundManager.loadSound(name); + soundItem->_waveFile = _soundManager.loadSound(name); - if (!soundItem->_soundHandle) { - // Could load sound, so destroy new item and return + if (!soundItem->_waveFile) { + // Couldn't load sound, so destroy new item and return delete soundItem; return 0; } @@ -108,36 +135,65 @@ uint CSound::loadSound(const CString &name) { if (_sounds.size() > 10) removeOldest(); - return soundItem->_soundHandle; + return soundItem->_waveFile; } -void CSound::checkSounds() { - for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { - CSoundItem *soundItem = *i; - if (soundItem->_field24 && soundItem->_field28) { - if (_soundManager.isActive(soundItem->_soundHandle)) { - _sounds.remove(soundItem); - delete soundItem; - } - } - } +int CSound::playSound(const CString &name, CProximity &prox) { + WaveFile *waveFile = loadSound(name); + if (!waveFile) + return -1; + + prox._field6C = waveFile->fn1(); + fn4(waveFile, prox._field60); + + return _soundManager.playSound(*waveFile, prox); } -void CSound::removeOldest() { - for (CSoundItemList::iterator i = _sounds.reverse_begin(); - i != _sounds.end(); --i) { +WaveFile *CSound::loadSpeech(CDialogueFile *dialogueFile, int speechId) { + checkSounds(); + + // Check whether an entry for the given name is already active + for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { CSoundItem *soundItem = *i; - if (soundItem->_field28 && !_soundManager.isActive(soundItem->_soundHandle)) { + if (soundItem->_dialogueFileHandle == dialogueFile->getFile() + && soundItem->_speechId == speechId) { + // Found it, so move it to the front of the list and return _sounds.remove(soundItem); - delete soundItem; - break; + _sounds.push_front(soundItem); + return soundItem->_waveFile; } } + + // Create new sound item + CSoundItem *soundItem = new CSoundItem(dialogueFile->getFile(), speechId); + soundItem->_waveFile = _soundManager.loadSpeech(dialogueFile, speechId); + + if (!soundItem->_waveFile) { + // Couldn't load speech, so destroy new item and return + delete soundItem; + return 0; + } + + // Add the item to the list of sounds + _sounds.push_front(soundItem); + + // If there are more than 10 sounds loaded, remove the last one, + // which is the least recently used of all of them + if (_sounds.size() > 10) + removeOldest(); + + return soundItem->_waveFile; } -CSoundItem *CSound::getTrueTalkSound(CDialogueFile *dialogueFile, int index) { - warning("TODO: CSound::getTrueTalkSound"); - return nullptr; +int CSound::playSpeech(CDialogueFile *dialogueFile, int speechId, CProximity &prox) { + WaveFile *waveFile = loadSpeech(dialogueFile, speechId); + if (!waveFile) + return -1; + + prox._field6C = waveFile->fn1(); + fn4(waveFile, prox._field60); + + return _soundManager.playSound(*waveFile, prox); } -} // End of namespace Titanic z +} // End of namespace Titanic diff --git a/engines/titanic/sound/sound.h b/engines/titanic/sound/sound.h index f550493624..c14c9e17c4 100644 --- a/engines/titanic/sound/sound.h +++ b/engines/titanic/sound/sound.h @@ -24,8 +24,9 @@ #define TITANIC_SOUND_H #include "titanic/support/simple_file.h" -#include "titanic/support/proximity.h" +#include "titanic/sound/proximity.h" #include "titanic/sound/sound_manager.h" +#include "titanic/sound/wave_file.h" #include "titanic/core/list.h" #include "titanic/core/view_item.h" #include "titanic/true_talk/dialogue_file.h" @@ -37,16 +38,18 @@ class CGameManager; class CSoundItem : public ListItem { public: CString _name; - int _soundHandle; - int _field1C; - int _field20; + WaveFile *_waveFile; + File *_dialogueFileHandle; + int _speechId; int _field24; int _field28; public: - CSoundItem() : ListItem(), _soundHandle(0), _field1C(0), - _field20(0), _field24(0), _field28(0) {} - CSoundItem(const CString &name) : ListItem(), _name(name), - _soundHandle(0), _field1C(0), _field20(0), _field24(0), _field28(0) {} + CSoundItem() : ListItem(), _waveFile(nullptr), _dialogueFileHandle(nullptr), + _speechId(0), _field24(0), _field28(0) {} + CSoundItem(const CString &name) : ListItem(), _name(name), _waveFile(nullptr), + _dialogueFileHandle(nullptr), _speechId(0), _field24(0), _field28(0) {} + CSoundItem(File *dialogueFile, int speechId) : ListItem(), _waveFile(nullptr), + _dialogueFileHandle(dialogueFile), _speechId(speechId), _field24(0), _field28(0) {} int fn1(); }; @@ -109,25 +112,48 @@ public: */ void preEnterView(CViewItem *newView, bool isNewRoom); - /** - * Load a sound - * @param name Name of sound resource - * @returns Sound handle Id - */ - uint loadSound(const CString &name); - bool fn1(int val); void fn2(int handle); void fn3(int handle, int val2, int val3); + void fn4(WaveFile *waveFile, int val); + + void managerProc8(int v) { _soundManager.proc8(v); } + + /** + * Loads a TrueTalk dialogue + * @param dialogueFile Dialogue file reference + * @param speechId Speech Id within dialogue + * @returns Wave file instance + */ + WaveFile *getTrueTalkSound(CDialogueFile *dialogueFile, int index); + + /** + * Load a speech resource + * @param dialogueFile Dialogue file reference + * @param speechId Speech Id within dialogue + * @returns Wave file instance + */ + WaveFile *loadSpeech(CDialogueFile *dialogueFile, int speechId); /** * Play a speech + * @param dialogueFile Dialogue file reference + * @param speechId Speech Id within dialogue + * @param prox Proximity instance */ - int playSpeech(CDialogueFile *dialogueFile, int speechId, const CProximity &prox); - - void managerProc8(int v) { _soundManager.proc8(v); } + int playSpeech(CDialogueFile *dialogueFile, int speechId, CProximity &prox); - CSoundItem *getTrueTalkSound(CDialogueFile *dialogueFile, int index); + /** + * Load a sound + * @param name Name of sound resource + * @returns Sound item record + */ + WaveFile *loadSound(const CString &name); + + /** + * Play a sound + */ + int playSound(const CString &name, CProximity &prox); }; } // End of namespace Titanic diff --git a/engines/titanic/sound/sound_manager.cpp b/engines/titanic/sound/sound_manager.cpp index 1cafe3bafa..61ad59ce7f 100644 --- a/engines/titanic/sound/sound_manager.cpp +++ b/engines/titanic/sound/sound_manager.cpp @@ -34,14 +34,14 @@ QSoundManager::QSoundManager() : _field18(0), _field1C(0) { Common::fill(&_field4A0[0], &_field4A0[16], 0); } -int QSoundManager::loadSound(const CString &name) { +WaveFile *QSoundManager::loadSound(const CString &name) { warning("TODO"); - return 0; + return nullptr; } -int QSoundManager::proc4() const { +WaveFile *QSoundManager::loadSpeech(CDialogueFile *dialogueFile, int speechId) { warning("TODO"); - return 0; + return nullptr; } int QSoundManager::proc5() const { @@ -49,8 +49,9 @@ int QSoundManager::proc5() const { return 0; } -void QSoundManager::proc6() { +int QSoundManager::playSound(WaveFile &soundRes, CProximity &prox) { warning("TODO"); + return 0; } void QSoundManager::proc7() { @@ -86,7 +87,7 @@ bool QSoundManager::proc14() { return false; } -bool QSoundManager::isActive(int handle) const { +bool QSoundManager::isActive(const WaveFile *waveFile) const { warning("TODO"); return false; } diff --git a/engines/titanic/sound/sound_manager.h b/engines/titanic/sound/sound_manager.h index a65162d779..85ee00a3f7 100644 --- a/engines/titanic/sound/sound_manager.h +++ b/engines/titanic/sound/sound_manager.h @@ -24,6 +24,9 @@ #define TITANIC_SOUND_MANAGER_H #include "titanic/support/simple_file.h" +#include "titanic/sound/proximity.h" +#include "titanic/sound/wave_file.h" +#include "titanic/true_talk/dialogue_file.h" namespace Titanic { @@ -41,13 +44,24 @@ public: /** * Loads a sound * @param name Name of sound resource - * @returns Loaded sound handle + * @returns Loaded wave file */ - virtual int loadSound(const CString &name) { return 0; } + virtual WaveFile *loadSound(const CString &name) { return nullptr; } + + /** + * Loads a speech resource from a dialogue file + * @param name Name of sound resource + * @returns Loaded wave file + */ + virtual WaveFile *loadSpeech(CDialogueFile *dialogueFile, int speechId) { return 0; } - virtual int proc4() const { return 0; } virtual int proc5() const { return 0; } - virtual void proc6() = 0; + + /** + * Start playing a previously loaded wave file + */ + virtual int playSound(WaveFile &waveFile, CProximity &prox) = 0; + virtual void proc7() = 0; virtual void proc8(int v) = 0; virtual void proc9() {} @@ -56,7 +70,12 @@ public: virtual void proc12() {} virtual void proc13() {} virtual bool proc14() = 0; - virtual bool isActive(int handle) const { return false; } + + /** + * Returns true if the given sound is currently active + */ + virtual bool isActive(const WaveFile *waveFile) const { return false; } + virtual int proc16() const { return 0; } virtual void WaveMixPump() {} @@ -115,13 +134,24 @@ public: /** * Loads a sound * @param name Name of sound resource - * @returns Loaded sound handle + * @returns Loaded wave file */ - virtual int loadSound(const CString &name); + virtual WaveFile *loadSound(const CString &name); + + /** + * Loads a speech resource from a dialogue file + * @param name Name of sound resource + * @returns Loaded wave file + */ + virtual WaveFile *loadSpeech(CDialogueFile *dialogueFile, int speechId); - virtual int proc4() const; virtual int proc5() const; - virtual void proc6(); + + /** + * Start playing a previously loaded sound resource + */ + virtual int playSound(WaveFile &waveFile, CProximity &prox); + virtual void proc7(); virtual void proc8(int v); virtual void proc9(); @@ -130,7 +160,12 @@ public: virtual void proc12(); virtual void proc13(); virtual bool proc14(); - virtual bool isActive(int handle) const; + + /** + * Returns true if the given sound is currently active + */ + virtual bool isActive(const WaveFile *soundRes) const; + virtual int proc16() const; virtual void WaveMixPump(); diff --git a/engines/titanic/sound/wave_file.cpp b/engines/titanic/sound/wave_file.cpp index 288f5f525d..2459f1eee6 100644 --- a/engines/titanic/sound/wave_file.cpp +++ b/engines/titanic/sound/wave_file.cpp @@ -24,4 +24,9 @@ namespace Titanic { +int WaveFile::fn1() { + // TODO + return 0; +} + } // End of namespace Titanic z diff --git a/engines/titanic/sound/wave_file.h b/engines/titanic/sound/wave_file.h index 0bb836ef74..b27e5e7707 100644 --- a/engines/titanic/sound/wave_file.h +++ b/engines/titanic/sound/wave_file.h @@ -47,6 +47,8 @@ public: WaveFile() : _field0(2), _field4(0), _field8(0), _handle(0), _owner(nullptr), _field14(1), _field18(0), _field1C(0), _field20(0), _field24(0), _field28(0), _field2C(-1) {} + + int fn1(); }; } // End of namespace Titanic diff --git a/engines/titanic/true_talk/dialogue_file.h b/engines/titanic/true_talk/dialogue_file.h index 299d01daa8..19e94cf9b9 100644 --- a/engines/titanic/true_talk/dialogue_file.h +++ b/engines/titanic/true_talk/dialogue_file.h @@ -23,7 +23,7 @@ #ifndef TITANIC_DIALOGUE_FILE_H #define TITANIC_DIALOGUE_FILE_H -#include "common/file.h" +#include "titanic/support/simple_file.h" #include "titanic/support/string.h" namespace Titanic { @@ -51,7 +51,7 @@ struct DialogueResource { class CDialogueFile { private: - Common::File _file; + File _file; Common::Array<DialogueIndexEntry> _index; Common::Array<DialogueResource> _cache; private: @@ -68,6 +68,8 @@ public: */ void clear(); + File *getFile() { return &_file; } + /** * Sets up a text entry within the dialogue file for access */ diff --git a/engines/titanic/true_talk/true_talk_manager.cpp b/engines/titanic/true_talk/true_talk_manager.cpp index 072832af4d..977fc892c6 100644 --- a/engines/titanic/true_talk/true_talk_manager.cpp +++ b/engines/titanic/true_talk/true_talk_manager.cpp @@ -408,10 +408,10 @@ int CTrueTalkManager::readDialogSound() { _field18 = 0; for (uint idx = 0; idx < _titleEngine._indexes.size(); ++idx) { - CSoundItem *soundItem = _gameManager->_sound.getTrueTalkSound( + WaveFile *waveFile = _gameManager->_sound.getTrueTalkSound( _dialogueFile, _titleEngine._indexes[idx] - _dialogueId); - if (soundItem) { - _field18 = soundItem->fn1(); + if (waveFile) { + _field18 = waveFile->fn1(); } } diff --git a/engines/wage/detection.cpp b/engines/wage/detection.cpp index e14a952588..a27bfd7fde 100644 --- a/engines/wage/detection.cpp +++ b/engines/wage/detection.cpp @@ -99,7 +99,7 @@ SaveStateList WageMetaEngine::listSaves(const char *target) const { const uint32 WAGEflag = MKTAG('W','A','G','E'); Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; - char saveDesc[31]; + char saveDesc[128] = {0}; Common::String pattern = target; pattern += ".###"; @@ -113,9 +113,18 @@ SaveStateList WageMetaEngine::listSaves(const char *target) const { if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(*file); if (in) { + saveDesc[0] = 0; + in->seek(in->size() - 8); + uint32 offset = in->readUint32BE(); uint32 type = in->readUint32BE(); - if (type == WAGEflag) - in->read(saveDesc, 31); + if (type == WAGEflag) { + in->seek(offset); + + type = in->readUint32BE(); + if (type == WAGEflag) { + in->read(saveDesc, 127); + } + } saveList.push_back(SaveStateDescriptor(slotNum, saveDesc)); delete in; } diff --git a/engines/wage/saveload.cpp b/engines/wage/saveload.cpp index 78e8d389d3..c3b20bdf2f 100644 --- a/engines/wage/saveload.cpp +++ b/engines/wage/saveload.cpp @@ -335,6 +335,10 @@ int WageEngine::saveGame(const Common::String &fileName, const Common::String &d } // the following is appended by ScummVM + int32 appendixOffset = out->pos(); + if (appendixOffset < 0) { + warning("OutSaveFile::pos() failed"); + } out->writeUint32BE(WAGEflag); // Write description of saved game, limited to WAGE_SAVEDGAME_DESCRIPTION_LEN characters + terminating NUL @@ -352,6 +356,8 @@ int WageEngine::saveGame(const Common::String &fileName, const Common::String &d // Thumbnail Graphics::saveThumbnail(*out); + out->writeUint32BE(appendixOffset); + // this one to make checking easier: // it couldn't be added to the beginning // and we won't be able to find it in the middle, |