diff options
| -rw-r--r-- | engines/m4/animation.cpp | 1 | ||||
| -rw-r--r-- | engines/m4/events.cpp | 4 | ||||
| -rw-r--r-- | engines/m4/events.h | 1 | ||||
| -rw-r--r-- | engines/m4/globals.cpp | 26 | ||||
| -rw-r--r-- | engines/m4/globals.h | 2 | ||||
| -rw-r--r-- | engines/m4/m4.cpp | 11 | ||||
| -rw-r--r-- | engines/m4/m4.h | 10 | ||||
| -rw-r--r-- | engines/m4/mads_menus.cpp | 7 | ||||
| -rw-r--r-- | engines/m4/scene.cpp | 1 | ||||
| -rw-r--r-- | engines/m4/sound.cpp | 38 | ||||
| -rw-r--r-- | engines/m4/sound.h | 2 | 
11 files changed, 58 insertions, 45 deletions
| diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 1d9b1161c2..a9d52a54c1 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -328,7 +328,6 @@ void MadsAnimation::update() {  	// Handle starting any sound for this frame  	AnimMiscEntry &misc = _miscEntries[_currentFrame]; -printf("frame %d delay %d\n", _currentFrame, misc.numTicks);  	if (misc.soundNum)  		_vm->_sound->playSound(misc.soundNum); diff --git a/engines/m4/events.cpp b/engines/m4/events.cpp index c0ca412f11..65378c5d6a 100644 --- a/engines/m4/events.cpp +++ b/engines/m4/events.cpp @@ -57,6 +57,10 @@ Events::Events(MadsM4Engine *vm) : _vm(vm) {  		_console = new MadsConsole(_madsVm);  } +Events::~Events() { +	delete _console; +} +  M4EventType Events::handleEvents() {  	static int oldX = -1, oldY = -1;  	static uint32 dclickTime = 0; diff --git a/engines/m4/events.h b/engines/m4/events.h index 43b61c8f0d..1c1418d5f8 100644 --- a/engines/m4/events.h +++ b/engines/m4/events.h @@ -78,6 +78,7 @@ private:  public:  	bool quitFlag;  	Events(MadsM4Engine *vm); +	virtual ~Events();  	Common::Event &event() { return _event; }  	Common::EventType type() { return _event.type; } diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index 1768c71787..e63504ad73 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -351,16 +351,16 @@ void MadsGlobals::loadMadsMessagesInfo() {  	//printf("%i messages\n", count);  	for (int i = 0; i < count; i++) { -		MessageItem *curMessage = new MessageItem(); -		curMessage->id = messageS->readUint32LE(); -		curMessage->offset = messageS->readUint32LE(); -		curMessage->uncompSize = messageS->readUint16LE(); +		MessageItem curMessage; +		curMessage.id = messageS->readUint32LE(); +		curMessage.offset = messageS->readUint32LE(); +		curMessage.uncompSize = messageS->readUint16LE();  		if (i > 0) -			_madsMessages[i - 1]->compSize = curMessage->offset - _madsMessages[i - 1]->offset; +			_madsMessages[i - 1].compSize = curMessage.offset - _madsMessages[i - 1].offset;  		if (i == count - 1) -			curMessage->compSize = messageS->size() - curMessage->offset; +			curMessage.compSize = messageS->size() - curMessage.offset;  		//printf("id: %i, offset: %i, uncomp size: %i\n", curMessage->id, curMessage->offset, curMessage->uncompSize);  		_madsMessages.push_back(curMessage); @@ -382,7 +382,7 @@ void MadsGlobals::loadMadsObjects() {  int MadsGlobals::messageIndexOf(uint32 messageId) {  	for (uint i = 0; i < _madsMessages.size(); ++i)  	{ -		if (_madsMessages[i]->id == messageId) +		if (_madsMessages[i].id == messageId)  			return i;  	}  	return -1; @@ -395,15 +395,15 @@ const char *MadsGlobals::loadMessage(uint index) {  	}  	FabDecompressor fab; -	byte *compData = new byte[_madsMessages[index]->compSize]; -	byte *buffer = new byte[_madsMessages[index]->uncompSize]; +	byte *compData = new byte[_madsMessages[index].compSize]; +	byte *buffer = new byte[_madsMessages[index].uncompSize];  	Common::SeekableReadStream *messageS = _vm->res()->get("messages.dat"); -	messageS->seek(_madsMessages[index]->offset, SEEK_SET); -	messageS->read(compData, _madsMessages[index]->compSize); -	fab.decompress(compData, _madsMessages[index]->compSize, buffer, _madsMessages[index]->uncompSize); +	messageS->seek(_madsMessages[index].offset, SEEK_SET); +	messageS->read(compData, _madsMessages[index].compSize); +	fab.decompress(compData, _madsMessages[index].compSize, buffer, _madsMessages[index].uncompSize); -	for (int i = 0; i < _madsMessages[index]->uncompSize - 1; i++) +	for (int i = 0; i < _madsMessages[index].uncompSize - 1; i++)  		if (buffer[i] == '\0') buffer[i] = '\n';  	_vm->res()->toss("messages.dat"); diff --git a/engines/m4/globals.h b/engines/m4/globals.h index de6e716ece..1714d223ce 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -235,7 +235,7 @@ private:  	MadsEngine *_vm;  	Common::Array<char* > _madsVocab;  	Common::Array<char* > _madsQuotes; -	Common::Array<MessageItem* > _madsMessages; +	Common::Array<MessageItem> _madsMessages;  	MadsObjectArray _madsObjects;  	Common::List<int> _visitedScenes;  public: diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index c30e946653..446f2bf974 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -148,6 +148,7 @@ MadsM4Engine::~MadsM4Engine() {  	delete _palette;  	delete _globals;  	delete _sound; +	delete _driver;  	delete _resourceManager;  } @@ -158,11 +159,11 @@ Common::Error MadsM4Engine::run() {  	MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);  	bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); -	MidiDriver *driver = MidiDriver::createMidi(midiDriver); +	_driver = MidiDriver::createMidi(midiDriver);  	if (native_mt32) -		driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); +		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); -	_midi = new MidiPlayer(this, driver); +	_midi = new MidiPlayer(this, _driver);  	_midi->setGM(true);  	_midi->setNativeMT32(native_mt32); @@ -513,7 +514,6 @@ Common::Error MadsEngine::run() {  	// Set up needed common functionality  	MadsM4Engine::run(); -	_scene = new MadsScene(this);  	_palette->setMadsSystemPalette();  	_mouse->init("cursor.ss", NULL); @@ -538,9 +538,12 @@ Common::Error MadsEngine::run() {  	//printf("%s\n----------\n", _globals->loadMessage(i));  	if ((getGameType() == GType_RexNebular) || (getGameType() == GType_DragonSphere)) { +		_scene = NULL;  		loadMenu(MAIN_MENU);  	} else { +		_scene = new MadsScene(this); +  		if (getGameType() == GType_DragonSphere) {  			_scene->loadScene(FIRST_SCENE);  		} else if (getGameType() == GType_Phantom) { diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 9937107668..f5ddcc28be 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -29,6 +29,7 @@  #include "common/scummsys.h"  #include "common/util.h"  #include "common/random.h" +#include "sound/mididrv.h"  #include "engines/engine.h" @@ -123,7 +124,7 @@ enum {  struct M4GameDescription; -#define GAME_FRAME_DELAY 50 +#define GAME_FRAME_DELAY 20  #define VALIDATE_MADS assert(!_vm->isM4()) @@ -144,6 +145,7 @@ protected:  	void shutdown(); +	MidiDriver *_driver;  	MidiPlayer *_midi;  public: @@ -219,6 +221,12 @@ public:  	MadsGlobals *globals() { return (MadsGlobals *)_globals; }  	MadsScene *scene() { return (MadsScene *)_scene; } +	void startScene(int sceneNum) { +		if (!_scene) +			_scene = new MadsScene(this); +		_scene->show(); +		_scene->loadScene(101); +	}  };  class M4Engine : public MadsM4Engine { diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index 94894e78be..43b9031692 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -293,7 +293,7 @@ int RexMainMenuView::getHighlightedItem(int x, int y) {  }  void RexMainMenuView::handleAction(MadsGameAction action) { -	MadsM4Engine *vm = _vm; +	MadsEngine *vm = (MadsEngine *)_vm;  	vm->_mouse->cursorOff();  	vm->_viewManager->deleteView(this); @@ -303,8 +303,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) {  		// Load a sample starting scene - note that, currently, calling loadScene automatically  		// removes this menu screen from being displayed  		vm->_mouse->cursorOn(); -		vm->_scene->show(); -		vm->_scene->loadScene(101); +		vm->startScene(101);  		return;  	case SHOW_INTRO: @@ -325,7 +324,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) {  			// Activate the scene display with the specified scene  			bool altAdvert = vm->_random->getRandomNumber(1000) >= 500; -			vm->_scene->loadScene(altAdvert ? 995 : 996); +			vm->startScene(altAdvert ? 995 : 996);  			vm->_viewManager->addView(vm->_scene);  			vm->_viewManager->refreshAll(); diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 15c68f276c..e78d7f865e 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -55,6 +55,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0,  Scene::~Scene() {  	leaveScene(); +	_vm->_scene = NULL;  }  void Scene::loadScene(int sceneNumber) { diff --git a/engines/m4/sound.cpp b/engines/m4/sound.cpp index 69ab8c0516..e0fbd2f7a9 100644 --- a/engines/m4/sound.cpp +++ b/engines/m4/sound.cpp @@ -197,20 +197,20 @@ void Sound::loadDSRFile(const char *fileName) {  	//printf("DSR has %i entries\n", _dsrFile.entryCount);  	for (int i = 0; i < _dsrFile.entryCount; i++) { -		DSREntry* newEntry = new DSREntry(); -		newEntry->frequency = fileStream->readUint16LE(); -		newEntry->channels = fileStream->readUint32LE(); -		newEntry->compSize = fileStream->readUint32LE(); -		newEntry->uncompSize = fileStream->readUint32LE(); -		newEntry->offset = fileStream->readUint32LE(); +		DSREntry newEntry; +		newEntry.frequency = fileStream->readUint16LE(); +		newEntry.channels = fileStream->readUint32LE(); +		newEntry.compSize = fileStream->readUint32LE(); +		newEntry.uncompSize = fileStream->readUint32LE(); +		newEntry.offset = fileStream->readUint32LE();  		_dsrFile.dsrEntries.push_back(newEntry);  		/*  		printf("%i: ", i);  		printf("frequency: %i ", newEntry->frequency);  		printf("channels: %i ", newEntry->channels); -		printf("comp: %i ", newEntry->compSize); -		printf("uncomp: %i ", newEntry->uncompSize); +		printf("comp: %i ", newEntry.compSize); +		printf("uncomp: %i ", newEntry.uncompSize);  		printf("offset: %i ", newEntry->offset);  		printf("\n");  		*/ @@ -225,9 +225,7 @@ void Sound::unloadDSRFile() {  	if (!_dsrFileLoaded)  		return; -	for (int i = 0; i < _dsrFile.entryCount; i++) { -		_dsrFile.dsrEntries.remove_at(0); -	} +	_dsrFile.dsrEntries.clear();  	_dsrFile.entryCount = 0;  	strcpy(_dsrFile.fileName, ""); @@ -251,28 +249,28 @@ void Sound::playDSRSound(int soundIndex, int volume, bool loop) {  	// Get sound data  	FabDecompressor fab; -	byte *compData = new byte[_dsrFile.dsrEntries[soundIndex]->compSize]; -	byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex]->uncompSize]; +	byte *compData = new byte[_dsrFile.dsrEntries[soundIndex].compSize]; +	byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex].uncompSize];  	Common::SeekableReadStream *fileStream = _vm->res()->get(_dsrFile.fileName); -	fileStream->seek(_dsrFile.dsrEntries[soundIndex]->offset, SEEK_SET); -	fileStream->read(compData, _dsrFile.dsrEntries[soundIndex]->compSize); +	fileStream->seek(_dsrFile.dsrEntries[soundIndex].offset, SEEK_SET); +	fileStream->read(compData, _dsrFile.dsrEntries[soundIndex].compSize);  	_vm->res()->toss(_dsrFile.fileName); -	fab.decompress(compData, _dsrFile.dsrEntries[soundIndex]->compSize, -				   buffer, _dsrFile.dsrEntries[soundIndex]->uncompSize); +	fab.decompress(compData, _dsrFile.dsrEntries[soundIndex].compSize, +				   buffer, _dsrFile.dsrEntries[soundIndex].uncompSize);  	// Play sound  	Audio::AudioStream *stream = Audio::makeLoopingAudioStream(  				Audio::makeRawStream(buffer, -					_dsrFile.dsrEntries[soundIndex]->uncompSize, -					_dsrFile.dsrEntries[soundIndex]->frequency, Audio::FLAG_UNSIGNED), +					_dsrFile.dsrEntries[soundIndex].uncompSize, +					_dsrFile.dsrEntries[soundIndex].frequency, Audio::FLAG_UNSIGNED),  				loop ? 0 : 1);  	_mixer->playStream(Audio::Mixer::kSFXSoundType, &handle->handle, stream, -1, volume);  	/*  	// Dump the sound file  	FILE *destFile = fopen("sound.raw", "wb"); -	fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex]->uncompSize, 1, destFile); +	fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex].uncompSize, 1, destFile);  	fclose(destFile);  	*/  } diff --git a/engines/m4/sound.h b/engines/m4/sound.h index 7d442a73cc..5587810506 100644 --- a/engines/m4/sound.h +++ b/engines/m4/sound.h @@ -65,7 +65,7 @@ struct DSREntry {  struct DSRFile {  	char fileName[20];  	int entryCount; -	Common::Array<DSREntry *> dsrEntries; +	Common::Array<DSREntry> dsrEntries;  };  class MadsM4Engine; | 
