[Scummvm-cvs-logs] CVS: scummvm/scumm script_v6.cpp,1.215,1.216 script_v8.cpp,2.204,2.205 scumm.h,1.328,1.329 scummvm.cpp,2.491,2.492

Travis Howell kirben at users.sourceforge.net
Thu Dec 4 16:03:01 CET 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv18990/scumm

Modified Files:
	script_v6.cpp script_v8.cpp scumm.h scummvm.cpp 
Log Message:

Add keyboard support for derby in FT and cannon battle in COMI, patch #853099 


Index: script_v6.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6.cpp,v
retrieving revision 1.215
retrieving revision 1.216
diff -u -d -r1.215 -r1.216
--- script_v6.cpp	28 Nov 2003 22:29:56 -0000	1.215
+++ script_v6.cpp	5 Dec 2003 00:02:00 -0000	1.216
@@ -2726,6 +2726,13 @@
 		   333 = right
 		 */
 
+		// FIXME: I guess this is applicable to all engines, but lets avoid
+		// regressions
+		if (_gameId == GID_FT) {
+			push(getKeyState(args[1]));
+			return;
+		}
+
 
 		if ((args[1] == 27) && (_lastKeyHit == 27)) {
 			push(1); // abort
@@ -2775,6 +2782,108 @@
 		error("o6_kernelGetFunctions: default case %d", args[0]);
 	}
 }
+
+// FIXME: check either some warning will trigger. I am not sure that those
+// keys are queried in scripts at all
+int ScummEngine::getKeyState(int key) {
+	switch(key) {
+	case 0x145:
+		warning("ScummEngine::getKeyState(%x) 'numlock' is probed", key);
+		return 0;
+		break;
+	case 0x164:
+		warning("ScummEngine::getKeyState(%x) 'left shift' is probed", key);
+		return 0;
+		break;
+	case 0x165:
+		warning("ScummEngine::getKeyState(%x) 'right shift' is probed", key);
+		return 0;
+		break;
+	case 0x166:
+	case 0x167:
+		warning("ScummEngine::getKeyState(%x) 'alt' is probed", key);
+		return 0;
+		break;
+	case 0x168:
+		warning("ScummEngine::getKeyState(%x) 'left ctrl' is probed", key);
+		return 0;
+		break;
+	case 0x202a:
+		warning("ScummEngine::getKeyState(%x) 'gray *' is probed", key);
+		return 0;
+		break;
+	case 0x202d:
+		warning("ScummEngine::getKeyState(%x) 'gray -' is probed", key);
+		return 0;
+		break;
+	case 0x147: // Home
+		return (_keyDownMap[0x107] || _keyDownMap[0x115]) ? 1 : 0;
+		break;
+	case 0x148: // Up
+		return (_keyDownMap[0x108] || _keyDownMap[0x111] ||
+				_keyDownMap[0x38]) ? 1 : 0;
+		break;
+	case 0x149: // PgUp
+		return (_keyDownMap[0x109] || _keyDownMap[0x118]) ? 1 : 0;
+		break;
+	case 0x14A: // Gray-
+		return (_keyDownMap[0x10d] || _keyDownMap[0x2d]) ? 1 : 0;
+		break;
+	case 0x14B: // Left
+		return (_keyDownMap[0x104] || _keyDownMap[0x114] ||
+				_keyDownMap[0x34]) ? 1 : 0;
+		break;
+	case 0x14C: // 5
+		return (_keyDownMap[0x105]) ? 1 : 0;
+		break;
+	case 0x14D: // Right
+		return (_keyDownMap[0x106] || _keyDownMap[0x113] ||
+				_keyDownMap[0x36]) ? 1 : 0;
+		break;
+	case 0x14E: // Gray+
+		return (_keyDownMap[0x10e] || 
+				(_keyDownMap[0x13d] && _keyDownMap[0x12f])) ? 1 : 0;
+		break;
+	case 0x14F: // End
+		return (_keyDownMap[0x101] || _keyDownMap[0x117]) ? 1 : 0;
+		break;
+	case 0x150: // Down
+		return (_keyDownMap[0x102] || _keyDownMap[0x112] ||
+				_keyDownMap[0x32]) ? 1 : 0;
+		break;
+	case 0x151: // PgDn
+		return (_keyDownMap[0x103] || _keyDownMap[0x119]) ? 1 : 0;
+		break;
+	case 0x152: // Ins
+		return (_keyDownMap[0x100] || _keyDownMap[0x115]) ? 1 : 0;
+		break;
+	case 0x153: // Del
+		return (_keyDownMap[0x10a] || _keyDownMap[0x7f]) ? 1 : 0;
+		break;
+	default:
+		break;
+	}
+
+	if (key >= 0x13b && key <= 0x144) { // F1-F10
+		key -= 0x13b - 0x11a;
+	} else if (key >= 0x154 && key <= 0x15d) { // Shift+F1-F10
+		key -= 0x154 - 0x11a; // map it to just F1-F10
+
+		warning("ScummEngine::getKeyState(%x) 'Shift-F%d' is probed", key, key-0x153);
+	} else if (key > 0x8000) { // Alt
+		key -= 0x8000;
+		key += 154; // see ScummEngine::parseEvents()
+	} else if (key > 0x4000) { // Ctrl
+		key -= 0x4000;
+		key -= 0x40;
+	} else if (key > 0x2000) { // Gray keys
+		key -= 0x2000;
+		warning("ScummEngine::getKeyState(%x) 'gray key' is probed", key);
+	}
+
+	return (_keyDownMap[key]) ? 1 : 0;
+}
+
 
 void ScummEngine_v6::o6_delayFrames() {
 	ScriptSlot *ss = &vm.slot[_currentScript];

Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.204
retrieving revision 2.205
diff -u -d -r2.204 -r2.205
--- script_v8.cpp	12 Nov 2003 07:05:52 -0000	2.204
+++ script_v8.cpp	5 Dec 2003 00:02:00 -0000	2.205
@@ -1401,21 +1401,7 @@
 		push(checkXYInBoxBounds(args[3], args[1], args[2]));
 		break;
 	case 0xD3:		// getKeyState
-		switch(args[1]) {
-		// Stub out a few specific cases, just to make things less noisy
-
-		// To actually implement this, we may need a new OSystem call to do
-		// asyncronous keyboard state checking...
-		case 0x14B:	//	Left Arrow depressed?
-		case 0x14D:	//	Right Arrow depressed?
-		case 0x09:	// 	Tab depressed (fire in ship combat)
-			push(0);
-			break;
-		default:
-			warning("getKeyState(0x%X)", args[1]);
-			push(0);
-			break;
-		}
+		push(getKeyState(args[1]));
 		break;
 	case 0xCE:		// getRGBSlot
 	case 0xD7:		// getBox

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.328
retrieving revision 1.329
diff -u -d -r1.328 -r1.329
--- scumm.h	28 Nov 2003 22:29:56 -0000	1.328
+++ scumm.h	5 Dec 2003 00:02:00 -0000	1.329
@@ -420,6 +420,7 @@
 protected:
 	int _keyPressed;
 	uint16 _lastKeyHit;
+	bool _keyDownMap[512]; // FIXME - 512 is a guess. it's max(kbd.ascii)
 
 	Common::Point _mouse;
 	Common::Point _virtualMouse;
@@ -459,6 +460,8 @@
 	void saveOrLoad(Serializer *s, uint32 savegameVersion);
 	void saveLoadResource(Serializer *ser, int type, int index);
 	void makeSavegameName(char *out, int slot, bool compatible);
+
+	int getKeyState(int key);
 
 public:
 	bool getSavegameName(int slot, char *desc, SaveFileManager *mgr);

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.491
retrieving revision 2.492
diff -u -d -r2.491 -r2.492
--- scummvm.cpp	2 Dec 2003 13:10:41 -0000	2.491
+++ scummvm.cpp	5 Dec 2003 00:02:01 -0000	2.492
@@ -1099,6 +1099,10 @@
 		_string[i].t_charset = 0;
 	}
 
+	// all keys are released
+	for (i = 0; i < 512; i++)
+		_keyDownMap[i] = false;
+
 	_numInMsgStack = 0;
 
 	createResource(rtTemp, 6, 500);
@@ -1588,13 +1592,30 @@
 						327, 328, 329
 					};
 				_keyPressed = numpad[event.kbd.ascii - '0'];
-			} else if (event.kbd.ascii < 273 || event.kbd.ascii > 276) {
+			} else if (event.kbd.ascii < 273 || event.kbd.ascii > 276 || _gameId == GID_FT) {
 				// don't let game have arrow keys as we currently steal them
 				// for keyboard cursor control
 				// this fixes bug with up arrow (273) corresponding to
 				// "instant win" cheat in MI2 mentioned above
+				//
+				// This is not applicable to Full Throttle as it processes keyboard
+				// cursor control by itself. Also it fixes derby scene
 				_keyPressed = event.kbd.ascii;	// Normal key press, pass on to the game.
 			}
+
+			if (_keyPressed >= 512)
+				warning("_keyPressed > 512 (%d)", _keyPressed);
+			else
+				_keyDownMap[_keyPressed] = true;
+			break;
+
+		case OSystem::EVENT_KEYUP:
+			// FIXME: for some reason OSystem::KBD_ALT is set sometimes
+			// possible to a bug in sdl-common.cpp
+			if (event.kbd.ascii >= 512)
+				warning("keyPressed > 512 (%d)", event.kbd.ascii);
+			else
+				_keyDownMap[event.kbd.ascii] = false;
 			break;
 
 		case OSystem::EVENT_MOUSEMOVE:





More information about the Scummvm-git-logs mailing list