diff options
29 files changed, 283 insertions, 94 deletions
| diff --git a/backends/platform/dc/vmsave.cpp b/backends/platform/dc/vmsave.cpp index 75fc1ed0df..d896ba1299 100644 --- a/backends/platform/dc/vmsave.cpp +++ b/backends/platform/dc/vmsave.cpp @@ -269,15 +269,16 @@ public:  class OutVMSave : public Common::OutSaveFile {  private:    char *buffer; -  int pos, size, committed; +  int _pos, size, committed;    char filename[16];    bool iofailed;  public:    uint32 write(const void *buf, uint32 cnt); +  virtual int32 pos() const { return _pos; }    OutVMSave(const char *_filename) -    : pos(0), committed(-1), iofailed(false) +    : _pos(0), committed(-1), iofailed(false)    {      strncpy(filename, _filename, 16);      buffer = new char[size = MAX_SAVE_SIZE]; @@ -320,14 +321,14 @@ void OutVMSave::finalize()    extern const char *gGameName;    extern Icon icon; -  if (committed >= pos) +  if (committed >= _pos)      return;    char *data = buffer; -  int len = pos; +  int len = _pos;    vmsaveResult r = writeSaveGame(gGameName, data, len, filename, icon); -  committed = pos; +  committed = _pos;    if (r != VMSAVE_OK)      iofailed = true;    displaySaveResult(r); @@ -386,13 +387,13 @@ bool InVMSave::seek(int32 offs, int whence)  uint32 OutVMSave::write(const void *buf, uint32 cnt)  {    int nbyt = cnt; -  if (pos + nbyt > size) { -    cnt = (size - pos); +  if (_pos + nbyt > size) { +    cnt = (size - _pos);      nbyt = cnt;    }    if (nbyt) -    memcpy(buffer + pos, buf, nbyt); -  pos += nbyt; +    memcpy(buffer + _pos, buf, nbyt); +  _pos += nbyt;    return cnt;  } diff --git a/backends/platform/n64/framfs_save_manager.h b/backends/platform/n64/framfs_save_manager.h index a066854aab..9bd4ee579e 100644 --- a/backends/platform/n64/framfs_save_manager.h +++ b/backends/platform/n64/framfs_save_manager.h @@ -71,6 +71,9 @@ private:  public:  	uint32 write(const void *buf, uint32 cnt); +	virtual int32 pos() const { +		return framfs_tell(fd); +	}  	OutFRAMSave(const char *_filename) : fd(NULL) {  		fd = framfs_open(_filename, "w"); diff --git a/backends/platform/n64/pakfs_save_manager.h b/backends/platform/n64/pakfs_save_manager.h index ec66c80b73..0c08f0c506 100644 --- a/backends/platform/n64/pakfs_save_manager.h +++ b/backends/platform/n64/pakfs_save_manager.h @@ -72,6 +72,10 @@ private:  public:  	uint32 write(const void *buf, uint32 cnt); +	virtual int32 pos() const { +		return pakfs_tell(fd); +	} +  	OutPAKSave(const char *_filename) : fd(NULL) {  		fd = pakfs_open(_filename, "w");  	} diff --git a/common/file.cpp b/common/file.cpp index 16e6a0df1a..4d9c630076 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -202,4 +202,6 @@ bool DumpFile::flush() {  	return _handle->flush();  } +int32 DumpFile::pos() const { return _handle->pos(); } +  } // End of namespace Common diff --git a/common/file.h b/common/file.h index c055acc57d..3d174834e9 100644 --- a/common/file.h +++ b/common/file.h @@ -161,6 +161,8 @@ public:  	virtual uint32 write(const void *dataPtr, uint32 dataSize);  	virtual bool flush(); + +	virtual int32 pos() const;  };  } // End of namespace Common diff --git a/common/memstream.h b/common/memstream.h index 94407f5cc9..59d5f15b1a 100644 --- a/common/memstream.h +++ b/common/memstream.h @@ -111,7 +111,7 @@ public:  		return dataSize;  	} -	uint32 pos() const { return _pos; } +	int32 pos() const { return _pos; }  	uint32 size() const { return _bufSize; }  	virtual bool err() const { return _err; } @@ -201,7 +201,7 @@ public:  		return dataSize;  	} -	uint32 pos() const { return _pos; } +	int32 pos() const { return _pos; }  	uint32 size() const { return _size; }  	byte *getData() { return _data; } diff --git a/common/stream.cpp b/common/stream.cpp index 45060b9db5..a8446a9086 100644 --- a/common/stream.cpp +++ b/common/stream.cpp @@ -500,6 +500,8 @@ public:  	virtual bool flush() { return flushBuffer(); } +	virtual int32 pos() const { return _pos; } +  };  } // End of anonymous namespace diff --git a/common/stream.h b/common/stream.h index abe5192b70..c6c300fa97 100644 --- a/common/stream.h +++ b/common/stream.h @@ -103,6 +103,14 @@ public:  		flush();  	} +	/** +	* Obtains the current value of the stream position indicator of the +	* stream. +	* +	* @return the current position indicator, or -1 if an error occurred. +	 */ +	virtual int32 pos() const = 0; +  	// The remaining methods all have default implementations; subclasses  	// need not (and should not) overload them. diff --git a/common/zlib.cpp b/common/zlib.cpp index c22ea1e660..39130beb4e 100644 --- a/common/zlib.cpp +++ b/common/zlib.cpp @@ -316,6 +316,7 @@ protected:  	ScopedPtr<WriteStream> _wrapped;  	z_stream _stream;  	int _zlibErr; +	uint32 _pos;  	void processData(int flushType) {  		// This function is called by both write() and finalize(). @@ -333,7 +334,7 @@ protected:  	}  public: -	GZipWriteStream(WriteStream *w) : _wrapped(w), _stream() { +	GZipWriteStream(WriteStream *w) : _wrapped(w), _stream(), _pos(0) {  		assert(w != 0);  		// Adding 16 to windowBits indicates to zlib that it is supposed to @@ -403,8 +404,11 @@ public:  		// ... and flush it to disk  		processData(Z_NO_FLUSH); +		_pos += dataSize - _stream.avail_in;  		return dataSize - _stream.avail_in;  	} + +	virtual int32 pos() const { return _pos; }  };  #endif	// USE_ZLIB 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, diff --git a/graphics/module.mk b/graphics/module.mk index f0f5af6c00..1c87e74ba7 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -15,7 +15,7 @@ MODULE_OBJS := \  	macgui/macmenu.o \  	macgui/macwindow.o \  	macgui/macwindowborder.o \ -	macgui/macwindowmanager.o\ +	macgui/macwindowmanager.o \  	managed_surface.o \  	nine_patch.o \  	pixelformat.o \ | 
