[Scummvm-cvs-logs] SF.net SVN: scummvm:[34242] scummvm/trunk/engines/agi

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Mon Sep 1 19:46:06 CEST 2008


Revision: 34242
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34242&view=rev
Author:   fingolfin
Date:     2008-09-01 17:46:05 +0000 (Mon, 01 Sep 2008)

Log Message:
-----------
Merging more of the GSoC 2008 RTL branch: AGI

Modified Paths:
--------------
    scummvm/trunk/engines/agi/agi.cpp
    scummvm/trunk/engines/agi/agi.h
    scummvm/trunk/engines/agi/cycle.cpp
    scummvm/trunk/engines/agi/detection.cpp
    scummvm/trunk/engines/agi/loader_v3.cpp
    scummvm/trunk/engines/agi/op_cmd.cpp
    scummvm/trunk/engines/agi/op_test.cpp
    scummvm/trunk/engines/agi/preagi.cpp
    scummvm/trunk/engines/agi/preagi_common.cpp
    scummvm/trunk/engines/agi/preagi_mickey.cpp
    scummvm/trunk/engines/agi/preagi_troll.cpp
    scummvm/trunk/engines/agi/preagi_winnie.cpp
    scummvm/trunk/engines/agi/saveload.cpp

Modified: scummvm/trunk/engines/agi/agi.cpp
===================================================================
--- scummvm/trunk/engines/agi/agi.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/agi.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -25,7 +25,6 @@
 
 
 #include "common/md5.h"
-#include "common/events.h"
 #include "common/file.h"
 #include "common/savefile.h"
 #include "common/config-manager.h"
@@ -61,9 +60,6 @@
 
 	while (_eventMan->pollEvent(event)) {
 		switch (event.type) {
-		case Common::EVENT_QUIT:
-			_game.quitProgNow = true;
-			break;
 		case Common::EVENT_PREDICTIVE_DIALOG:
 			if (_predictiveDialogRunning)
 				break;
@@ -738,6 +734,8 @@
 	_gfx->initVideo();
 	_sound->initSound();
 
+	_lastSaveTime = 0;
+
 	_timer->installTimerProc(agiTimerFunctionLow, 10 * 1000, NULL);
 
 	_game.ver = -1;		/* Don't display the conf file warning */
@@ -809,7 +807,17 @@
 
 	runGame();
 
-	return 0;
+	return _eventMan->shouldRTL();
 }
 
+void AgiEngine::syncSoundSettings() {
+	int soundVolumeMusic = ConfMan.getInt("music_volume");
+	int soundVolumeSFX = ConfMan.getInt("music_volume");
+	int soundVolumeSpeech = ConfMan.getInt("music_volume");
+
+	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, soundVolumeMusic);
+	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, soundVolumeSFX);
+	_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
+}
+
 } // End of namespace Agi

Modified: scummvm/trunk/engines/agi/agi.h
===================================================================
--- scummvm/trunk/engines/agi/agi.h	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/agi.h	2008-09-01 17:46:05 UTC (rev 34242)
@@ -530,7 +530,6 @@
 
 	/* internal flags */
 	int playerControl;		/**< player is in control */
-	int quitProgNow;		/**< quit now */
 	int statusLine;		/**< status line on/off */
 	int clockEnabled;		/**< clock is on/off */
 	int exitAllLogics;	/**< break cycle after new.room */
@@ -747,6 +746,8 @@
 	int go();
 	void initialize();
 
+	uint32 _lastSaveTime;
+
 public:
 	AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc);
 	virtual ~AgiEngine();
@@ -754,6 +755,8 @@
 		return _gameId;
 	}
 
+	virtual void syncSoundSettings();
+
 private:
 
 	int _keyQueue[KEY_QUEUE_SIZE];

Modified: scummvm/trunk/engines/agi/cycle.cpp
===================================================================
--- scummvm/trunk/engines/agi/cycle.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/cycle.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -24,7 +24,6 @@
  */
 
 
-
 #include "agi/agi.h"
 #include "agi/sprite.h"
 #include "agi/graphics.h"
@@ -116,7 +115,7 @@
 	oldSound = getflag(fSoundOn);
 
 	_game.exitAllLogics = false;
-	while (runLogic(0) == 0 && !_game.quitProgNow) {
+	while (runLogic(0) == 0 && !quit()) {
 		_game.vars[vWordNotFound] = 0;
 		_game.vars[vBorderTouchObj] = 0;
 		_game.vars[vBorderCode] = 0;
@@ -314,7 +313,6 @@
 	setvar(vTimeDelay, 2);	/* "normal" speed */
 
 	_game.gfxMode = true;
-	_game.quitProgNow = false;
 	_game.clockEnabled = true;
 	_game.lineUserInput = 22;
 
@@ -354,11 +352,15 @@
 			_game.vars[vKey] = 0;
 		}
 
-		if (_game.quitProgNow == 0xff)
+		if (quit() == 0xff)
 			ec = errRestartGame;
 
-	} while (_game.quitProgNow == 0);
+		if (shouldPerformAutoSave(_lastSaveTime)) {
+			saveGame(getSavegameFilename(0), "Autosave");
+		}
 
+	} while (quit() == 0);
+
 	_sound->stopSound();
 
 	return ec;

Modified: scummvm/trunk/engines/agi/detection.cpp
===================================================================
--- scummvm/trunk/engines/agi/detection.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/detection.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -2122,11 +2122,22 @@
 		return "Sierra AGI Engine (C) Sierra On-Line Software";
 	}
 
+	virtual bool hasFeature(MetaEngineFeature f) const;
 	virtual bool createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const;
-
+	virtual SaveStateList listSaves(const char *target) const;
+	
 	const Common::ADGameDescription *fallbackDetect(const FSList *fslist) const;
 };
 
+bool AgiMetaEngine::hasFeature(MetaEngineFeature f) const {
+	return
+		(f == kSupportsRTL) ||
+		(f == kSupportsListSaves) ||
+		(f == kSupportsDirectLoad) ||
+		(f == kSupportsDeleteSave);
+}
+
+
 bool AgiMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
 	const Agi::AGIGameDescription *gd = (const Agi::AGIGameDescription *)desc;
 	bool res = true;
@@ -2147,6 +2158,37 @@
 	return res;
 }
 
+SaveStateList AgiMetaEngine::listSaves(const char *target) const {
+	const uint32 AGIflag = MKID_BE('AGI:');
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Common::StringList filenames;
+	char saveDesc[31];
+	Common::String pattern = target;
+	pattern += ".???";
+
+	filenames = saveFileMan->listSavefiles(pattern.c_str());
+	sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
+
+	SaveStateList saveList;
+	for (Common::StringList::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+		// Obtain the last 3 digits of the filename, since they correspond to the save slot
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+		
+		if (slotNum >= 0 && slotNum <= 999) {
+			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
+			if (in) {
+				uint32 type = in->readUint32BE();
+				if (type == AGIflag)
+					in->read(saveDesc, 31);
+				saveList.push_back(SaveStateDescriptor(slotNum, Common::String(saveDesc), *file));
+				delete in;
+			}
+		}
+	}
+
+	return saveList;
+}
+
 const Common::ADGameDescription *AgiMetaEngine::fallbackDetect(const FSList *fslist) const {
 	typedef Common::HashMap<Common::String, int32> IntMap;
 	IntMap allFiles;

Modified: scummvm/trunk/engines/agi/loader_v3.cpp
===================================================================
--- scummvm/trunk/engines/agi/loader_v3.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/loader_v3.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -230,8 +230,8 @@
 			debugC(3, kDebugLevelResources, "offset = %d", agid->offset);
 			debugC(3, kDebugLevelResources, "x = %x %x", x[0], x[1]);
 			error("ACK! BAD RESOURCE");
-
-			g_system->quit();
+			
+			_vm->quitGame();
 		}
 
 		agid->len = READ_LE_UINT16((uint8 *) x + 3);	/* uncompressed size */

Modified: scummvm/trunk/engines/agi/op_cmd.cpp
===================================================================
--- scummvm/trunk/engines/agi/op_cmd.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/op_cmd.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -1213,11 +1213,11 @@
 
 	g_sound->stopSound();
 	if (p0) {
-		game.quitProgNow = true;
+		g_agi->quitGame();
 	} else {
 		if (g_agi->selectionBox
 				(" Quit the game, or continue? \n\n\n", buttons) == 0) {
-			game.quitProgNow = true;
+			g_agi->quitGame();
 		}
 	}
 }
@@ -1231,7 +1231,7 @@
 		g_agi->selectionBox(" Restart game, or continue? \n\n\n", buttons);
 
 	if (sel == 0) {
-		game.quitProgNow = 0xff;
+		g_agi->quitGame();
 		g_agi->setflag(fRestartGame, true);
 		g_agi->_menu->enableAll();
 	}
@@ -1739,7 +1739,7 @@
 	curLogic->cIP = curLogic->sIP;
 
 	timerHack = 0;
-	while (ip < _game.logics[n].size && !_game.quitProgNow) {
+	while (ip < _game.logics[n].size && !quit()) {
 		if (_debug.enabled) {
 			if (_debug.steps > 0) {
 				if (_debug.logic0 || n) {

Modified: scummvm/trunk/engines/agi/op_test.cpp
===================================================================
--- scummvm/trunk/engines/agi/op_test.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/op_test.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -24,7 +24,6 @@
  */
 
 
-
 #include "agi/agi.h"
 #include "agi/keyboard.h"
 #include "agi/opcodes.h"
@@ -232,7 +231,7 @@
 	uint8 p[16] = { 0 };
 	bool end_test = false;
 
-	while (retval && !game.quitProgNow && !end_test) {
+	while (retval && !quit() && !end_test) {
 		if (_debug.enabled && (_debug.logic0 || lognum))
 			debugConsole(lognum, lTEST_MODE, NULL);
 

Modified: scummvm/trunk/engines/agi/preagi.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/preagi.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -23,7 +23,6 @@
  *
  */
 
-#include "common/events.h"
 #include "common/file.h"
 #include "common/savefile.h"
 #include "common/config-manager.h"
@@ -228,7 +227,7 @@
 		error("Unknown preagi engine");
 		break;
 	}
-	return 0;
+	return _eventMan->shouldRTL();
 }
 
 } // End of namespace Agi

Modified: scummvm/trunk/engines/agi/preagi_common.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_common.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/preagi_common.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -23,8 +23,6 @@
  *
  */
 
-#include "common/events.h"
-
 #include "agi/preagi.h"
 #include "agi/font.h"
 #include "agi/graphics.h"
@@ -122,11 +120,12 @@
 int PreAgiEngine::getSelection(SelectionTypes type) {
 	Common::Event event;
 
-	for (;;) {
+	while (!quit()) {
 		while (_eventMan->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				_system->quit();
+				return 0;
 			case Common::EVENT_RBUTTONUP:
 				return 0;
 			case Common::EVENT_LBUTTONUP:

Modified: scummvm/trunk/engines/agi/preagi_mickey.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_mickey.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/preagi_mickey.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -23,7 +23,6 @@
  *
  */
 
-#include "common/events.h"
 #include "common/savefile.h"
 #include "common/stream.h"
 
@@ -343,11 +342,12 @@
 
 	drawMenu(menu, *sel0, *sel1);
 
-	for (;;) {
+	for(;;) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				exit(0);
+				return 0;
 			case Common::EVENT_MOUSEMOVE:
 				if (iRow < 2) {
 					x = event.mouse.x / 8;
@@ -640,8 +640,8 @@
 			if (iSound == IDI_MSA_SND_THEME) {
 				while (_vm->_system->getEventManager()->pollEvent(event)) {
 					switch(event.type) {
+					case Common::EVENT_RTL:
 					case Common::EVENT_QUIT:
-						_vm->_system->quit();
 					case Common::EVENT_LBUTTONUP:
 					case Common::EVENT_RBUTTONUP:
 					case Common::EVENT_KEYDOWN:
@@ -1221,7 +1221,7 @@
 	}
 
 	waitAnyKey();
-	exit(0);
+	_vm->quitGame();
 }
 
 void Mickey::flipSwitch() {
@@ -2060,8 +2060,8 @@
 	for (;;) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				_vm->_system->quit();
 			case Common::EVENT_KEYDOWN:
 			case Common::EVENT_LBUTTONUP:
 			case Common::EVENT_RBUTTONUP:
@@ -2160,7 +2160,7 @@
 	intro();
 
 	// Game loop
-	for (;;) {
+	while (!_vm->quit()) {
 		drawRoom();
 
 		if (_game.fIntro) {

Modified: scummvm/trunk/engines/agi/preagi_troll.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_troll.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/preagi_troll.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -30,8 +30,6 @@
 
 #include "graphics/cursorman.h"
 
-#include "common/events.h"
-
 namespace Agi {
 
 Troll::Troll(PreAgiEngine* vm) : _vm(vm) {
@@ -58,11 +56,12 @@
 
 	drawMenu(szMenu, *iSel);
 
-	for (;;) {
+	while (!_vm->quit()) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				_vm->_system->quit();
+				return 0;
 			case Common::EVENT_MOUSEMOVE:
 				y = event.mouse.y / 8;
 
@@ -205,8 +204,8 @@
 	for (;;) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				_vm->_system->quit();
 			case Common::EVENT_LBUTTONUP:
 			case Common::EVENT_KEYDOWN:
 				return;
@@ -269,7 +268,7 @@
 	int iSel = 0;
 	//char szTreasure[16] = {0};
 
-	for (;;) {
+	while (!_vm->quit()) {
 		_vm->clearScreen(0xFF);
 
 		_vm->printStr(IDS_TRO_TUTORIAL_0);

Modified: scummvm/trunk/engines/agi/preagi_winnie.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_winnie.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/preagi_winnie.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -29,7 +29,6 @@
 
 #include "graphics/cursorman.h"
 
-#include "common/events.h"
 #include "common/savefile.h"
 #include "common/stream.h"
 
@@ -797,12 +796,12 @@
 	// Show the mouse cursor for the menu
 	CursorMan.showMouse(true);
 
-	for (;;) {
+	while (!_vm->quit()) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
 			switch(event.type) {
+			case Common::EVENT_RTL:
 			case Common::EVENT_QUIT:
-				_vm->_system->quit();
-				break;
+				return;
 			case Common::EVENT_MOUSEMOVE:
 				x = event.mouse.x / 8;
 				y = event.mouse.y / 8;
@@ -1014,7 +1013,7 @@
 		if (parser(hdr.ofsDesc[iBlock] - _roomOffset, iBlock, roomdata) == IDI_WTP_PAR_BACK)
 			goto phase1;
 	}
-	for (;;) {
+	while (!_vm->quit()) {
 		for (iBlock = 0; iBlock < IDI_WTP_MAX_BLOCK; iBlock++) {
 			switch(parser(hdr.ofsBlock[iBlock] - _roomOffset, iBlock, roomdata)) {
 			case IDI_WTP_PAR_GOTO:

Modified: scummvm/trunk/engines/agi/saveload.cpp
===================================================================
--- scummvm/trunk/engines/agi/saveload.cpp	2008-09-01 17:30:03 UTC (rev 34241)
+++ scummvm/trunk/engines/agi/saveload.cpp	2008-09-01 17:46:05 UTC (rev 34242)
@@ -91,7 +91,7 @@
 	out->writeSint16BE((int16)_game.lognum);
 
 	out->writeSint16BE((int16)_game.playerControl);
-	out->writeSint16BE((int16)_game.quitProgNow);
+	out->writeSint16BE((int16)quit());
 	out->writeSint16BE((int16)_game.statusLine);
 	out->writeSint16BE((int16)_game.clockEnabled);
 	out->writeSint16BE((int16)_game.exitAllLogics);
@@ -214,6 +214,9 @@
 
 	delete out;
 	debugC(3, kDebugLevelMain | kDebugLevelSavegame, "Closed %s", fileName);
+
+	_lastSaveTime = _system->getMillis();
+
 	return result;
 }
 
@@ -281,7 +284,8 @@
 	_game.lognum = in->readSint16BE();
 
 	_game.playerControl = in->readSint16BE();
-	_game.quitProgNow = in->readSint16BE();
+	if (in->readSint16BE())
+		quitGame();
 	_game.statusLine = in->readSint16BE();
 	_game.clockEnabled = in->readSint16BE();
 	_game.exitAllLogics = in->readSint16BE();
@@ -698,13 +702,18 @@
 
 	sprintf(fileName, "%s", getSavegameFilename(slot));
 
-	drawWindow(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
-	printText("Select a slot in which you wish to\nsave the game:",
-			0, hm + 1, vm + 1, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
 
-	slot = selectSlot();
-	if (slot < 0)
-		return errOK;
+	do {
+		drawWindow(hp, vp, GFX_WIDTH - hp, GFX_HEIGHT - vp);
+		printText("Select a slot in which you wish to\nsave the game:",
+				0, hm + 1, vm + 1, w, MSG_BOX_TEXT, MSG_BOX_COLOUR);
+		slot = selectSlot();
+		if (slot == 0)
+			messageBox("That slot is for Autosave only.");
+		else if (slot < 0)
+			return errOK;
+	}
+	while (slot == 0);
 
 	drawWindow(hp, vp + 5 * CHAR_LINES, GFX_WIDTH - hp,
 			GFX_HEIGHT - vp - 9 * CHAR_LINES);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list