[Scummvm-cvs-logs] SF.net SVN: scummvm: [32205] scummvm/trunk/engines/made

john_doe at users.sourceforge.net john_doe at users.sourceforge.net
Wed May 21 12:07:33 CEST 2008


Revision: 32205
          http://scummvm.svn.sourceforge.net/scummvm/?rev=32205&view=rev
Author:   john_doe
Date:     2008-05-21 03:07:33 -0700 (Wed, 21 May 2008)

Log Message:
-----------
- Moved event polling from sfPollEvent to runScript
- LGOP2: Fixed problem where Barth's gun was drawn at the wrong position

Modified Paths:
--------------
    scummvm/trunk/engines/made/made.cpp
    scummvm/trunk/engines/made/made.h
    scummvm/trunk/engines/made/screen.cpp
    scummvm/trunk/engines/made/screen.h
    scummvm/trunk/engines/made/script.cpp
    scummvm/trunk/engines/made/scriptfuncs.cpp

Modified: scummvm/trunk/engines/made/made.cpp
===================================================================
--- scummvm/trunk/engines/made/made.cpp	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/made.cpp	2008-05-21 10:07:33 UTC (rev 32205)
@@ -171,6 +171,64 @@
 	return filename;
 }
 
+void MadeEngine::handleEvents() {
+
+	Common::Event event;
+	Common::EventManager *eventMan = _system->getEventManager();
+
+	// NOTE: Don't reset _eventNum to 0 here or no events will come through to the scripts.
+
+	while (eventMan->pollEvent(event)) {
+		switch (event.type) {
+
+		case Common::EVENT_MOUSEMOVE:
+			_eventMouseX = event.mouse.x;
+			_eventMouseY = event.mouse.y;
+			break;
+
+		case Common::EVENT_LBUTTONDOWN:
+			_eventNum = 1;
+			break;
+
+		/*
+		case Common::EVENT_LBUTTONUP:
+			_eventNum = 2; // TODO: Is this correct?
+			break;
+		*/
+
+		case Common::EVENT_RBUTTONDOWN:
+			_eventNum = 3;
+			break;
+
+		/*
+		case Common::EVENT_RBUTTONUP:
+			eventNum = 4; // TODO: Is this correct?
+			break;
+		*/
+
+		case Common::EVENT_KEYDOWN:
+			_eventKey = event.kbd.ascii;
+			// For unknown reasons, the game accepts ASCII code
+			// 9 as backspace
+			if (_eventKey == Common::KEYCODE_BACKSPACE)
+				_eventKey = 9;
+			_eventNum = 5;
+			break;
+
+		case Common::EVENT_QUIT:
+			_quit = true;
+			break;
+
+		default:
+			break;
+
+		}
+	}
+
+	_system->updateScreen();
+
+}
+
 int MadeEngine::go() {
 
 	for (int i = 0; i < ARRAYSIZE(_timers); i++)
@@ -205,7 +263,11 @@
 		error ("Unknown MADE game");
 	}
 
-	_eventKey = _eventMouseX = _eventMouseY = 0;
+	// FIXME: This should make things a little faster until proper dirty rectangles
+	//        are implemented.
+	_system->setFeatureState(OSystem::kFeatureAutoComputeDirtyRects, true);
+
+	_eventNum = _eventKey = _eventMouseX = _eventMouseY = 0;
 	
 #ifdef DUMP_SCRIPTS
 	_script->dumpAllScripts();

Modified: scummvm/trunk/engines/made/made.h
===================================================================
--- scummvm/trunk/engines/made/made.h	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/made.h	2008-05-21 10:07:33 UTC (rev 32205)
@@ -93,7 +93,6 @@
 	uint32 getFeatures() const;
 	uint16 getVersion() const;
 	Common::Platform getPlatform() const;
-	void update_events();
 
 private:
 public:
@@ -106,6 +105,7 @@
 
 	bool _quit;
 
+	uint16 _eventNum;
 	int _eventMouseX, _eventMouseY;
 	uint16 _eventKey;
 	int _soundRate;
@@ -124,7 +124,9 @@
 
 	const Common::String getTargetName() { return _targetName; }
 	Common::String getSavegameFilename(int16 saveNum);
-	
+
+	void handleEvents();
+
 };
 
 } // End of namespace Made

Modified: scummvm/trunk/engines/made/screen.cpp
===================================================================
--- scummvm/trunk/engines/made/screen.cpp	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/screen.cpp	2008-05-21 10:07:33 UTC (rev 32205)
@@ -266,7 +266,6 @@
 uint16 Screen::setChannelContent(uint16 channelIndex, uint16 index) {
 	if (channelIndex < 1 || channelIndex >= 100 || _channels[channelIndex - 1].type == 0)
 		return 0;
-	//debug(2, "setChannelContent(%d, %04X)\n", channelIndex, index); fflush(stdout); g_system->delayMillis(5000);
 	_channels[channelIndex - 1].index = index;
 	return updateChannel(channelIndex - 1) + 1;
 }
@@ -277,20 +276,6 @@
 	_channels[channelIndex - 1].mask = _mask;
 }
 
-void Screen::setChannelOffsets(uint16 channelIndex, int16 xofs, int16 yofs) {
-	if (channelIndex < 1 || channelIndex >= 100)
-		return;
-	_channels[channelIndex - 1].xofs = xofs;
-	_channels[channelIndex - 1].yofs = yofs;
-}
-
-void Screen::getChannelOffsets(uint16 channelIndex, int16 &xofs, int16 &yofs) {
-	if (channelIndex < 1 || channelIndex >= 100)
-		return;
-	xofs = _channels[channelIndex - 1].xofs;
-	yofs = _channels[channelIndex - 1].yofs;
-}
-
 void Screen::drawSpriteChannels(const ClipInfo &clipInfo, int16 includeStateMask, int16 excludeStateMask) {
 
 	for (int i = 0; i <= 3; i++)
@@ -481,8 +466,6 @@
 		_channels[channelIndex].x2 = x2;
 		_channels[channelIndex].y2 = y2;
 		_channels[channelIndex].area = (x2 - x1) * (y2 - y1);
-		_channels[channelIndex].xofs = 0;
-		_channels[channelIndex].yofs = 0;
 
 		if (_channelsUsedCount <= channelIndex)
 			_channelsUsedCount = channelIndex + 1;
@@ -824,4 +807,21 @@
 	_vm->_system->delayMillis(delay);
 }
 
+int16 Screen::addToSpriteList(int16 index, int16 xofs, int16 yofs) {
+	SpriteListItem item;
+	item.index = index;
+	item.xofs = xofs;
+	item.yofs = yofs;
+	_spriteList.push_back(item);
+	return _spriteList.size();
+}
+
+SpriteListItem Screen::getFromSpriteList(int16 index) {
+	return _spriteList[index - 1];
+}
+
+void Screen::clearSpriteList() {
+	_spriteList.clear();
+}
+
 } // End of namespace Made

Modified: scummvm/trunk/engines/made/screen.h
===================================================================
--- scummvm/trunk/engines/made/screen.h	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/screen.h	2008-05-21 10:07:33 UTC (rev 32205)
@@ -42,7 +42,7 @@
 	int16 state;
 	int16 needRefresh;
 	uint16 index;
-	int16 x, y, xofs, yofs;
+	int16 x, y;
 	int16 x1, y1, x2, y2;
 	uint32 area;
 	uint16 fontNum;
@@ -56,6 +56,10 @@
 	Graphics::Surface *destSurface;
 };
 
+struct SpriteListItem {
+	int16 index, xofs, yofs;
+};
+
 class MadeEngine;
 
 class Screen {
@@ -120,8 +124,6 @@
 	uint16 setChannelLocation(uint16 channelIndex, int16 x, int16 y);
 	uint16 setChannelContent(uint16 channelIndex, uint16 index);
 	void setChannelUseMask(uint16 channelIndex);
-	void setChannelOffsets(uint16 channelIndex, int16 xofs, int16 yofs);
-	void getChannelOffsets(uint16 channelIndex, int16 &xofs, int16 &yofs);
 	void drawSpriteChannels(const ClipInfo &clipInfo, int16 includeStateMask, int16 excludeStateMask);
 	void updateSprites();
 	void clearChannels();
@@ -161,6 +163,10 @@
 	void showWorkScreen();
 	void updateScreenAndWait(int delay);
 
+	int16 addToSpriteList(int16 index, int16 xofs, int16 yofs);
+	SpriteListItem getFromSpriteList(int16 index);
+	void clearSpriteList();
+
 protected:
 	MadeEngine *_vm;
 	ScreenEffects *_fx;
@@ -194,6 +200,8 @@
 	uint16 _channelsUsedCount;
 	SpriteChannel _channels[100];
 	
+	Common::Array<SpriteListItem> _spriteList;
+	
 };
 
 } // End of namespace Made

Modified: scummvm/trunk/engines/made/script.cpp
===================================================================
--- scummvm/trunk/engines/made/script.cpp	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/script.cpp	2008-05-21 10:07:33 UTC (rev 32205)
@@ -196,6 +196,9 @@
 	_codeIp = _codeBase;
 	
 	while (!_vm->_quit) {
+
+		_vm->handleEvents();
+
 		byte opcode = readByte();
 		if (opcode >= 1 && opcode <= _commandsMax) {
 			debug(4, "[%04X:%04X] %s", _runningScriptObjectIndex, (uint) (_codeIp - _codeBase), _commands[opcode - 1].desc);
@@ -203,6 +206,7 @@
 		} else {
 			warning("ScriptInterpreter::runScript(%d) Unknown opcode %02X", _runningScriptObjectIndex, opcode);
 		}
+		
 	}
 }
 

Modified: scummvm/trunk/engines/made/scriptfuncs.cpp
===================================================================
--- scummvm/trunk/engines/made/scriptfuncs.cpp	2008-05-21 07:16:12 UTC (rev 32204)
+++ scummvm/trunk/engines/made/scriptfuncs.cpp	2008-05-21 10:07:33 UTC (rev 32205)
@@ -195,61 +195,8 @@
 }
 
 int16 ScriptFunctions::sfPollEvent(int16 argc, int16 *argv) {
-
-	Common::Event event;
-	Common::EventManager *eventMan = g_system->getEventManager();
-
-	int16 eventNum = 0;
-
-	if (eventMan->pollEvent(event)) {
-		switch (event.type) {
-
-		case Common::EVENT_MOUSEMOVE:
-			_vm->_eventMouseX = event.mouse.x;
-			_vm->_eventMouseY = event.mouse.y;
-			break;
-			
-		case Common::EVENT_LBUTTONDOWN:
-			eventNum = 1;
-			break;
-
-		/*
-		case Common::EVENT_LBUTTONUP:
-			eventNum = 2; // TODO: Is this correct?
-			break;
-		*/
-
-		case Common::EVENT_RBUTTONDOWN:
-			eventNum = 3;
-			break;
-
-		/*
-		case Common::EVENT_RBUTTONUP:
-			eventNum = 4; // TODO: Is this correct?
-			break;
-		*/
-
-		case Common::EVENT_KEYDOWN:
-			_vm->_eventKey = event.kbd.ascii;
-			// For unknown reasons, the game accepts ASCII code
-			// 9 as backspace
-			if (_vm->_eventKey == Common::KEYCODE_BACKSPACE)
-				_vm->_eventKey = 9;
-			eventNum = 5;
-			break;
-
-		case Common::EVENT_QUIT:
-			_vm->_quit = true;
-			break;
-
-		default:
-			break;
-
-		}
-	}
-
-	_vm->_system->updateScreen();
-
+	int16 eventNum = _vm->_eventNum;
+	_vm->_eventNum = 0;
 	return eventNum;
 }
 
@@ -382,7 +329,7 @@
 		// Unused in RTZ
 		return 0;
 	} if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
-		return argv[2];
+		return _vm->_screen->addToSpriteList(argv[2], argv[1], argv[0]);
 	} else {
 		return 0;
 	}
@@ -390,6 +337,9 @@
 
 int16 ScriptFunctions::sfFreeAnim(int16 argc, int16 *argv) {
 	_vm->_screen->clearChannels();
+	if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
+		_vm->_screen->clearSpriteList();
+	}
 	return 0;
 }
 
@@ -397,8 +347,9 @@
 	if (_vm->getGameID() == GID_RTZ) {
 		return _vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
 	} if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) {
-		int16 channel = _vm->_screen->drawSprite(argv[2], argv[1], argv[0]);
-		_vm->_screen->setChannelUseMask(channel);
+		SpriteListItem item = _vm->_screen->getFromSpriteList(argv[2]);
+		int16 channelIndex = _vm->_screen->drawSprite(item.index, argv[1] - item.xofs, argv[0] - item.yofs);
+		_vm->_screen->setChannelUseMask(channelIndex);
 		return 0;
 	} else {
 		return 0;


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