diff options
| author | Nicola Mettifogo | 2007-02-04 11:16:40 +0000 | 
|---|---|---|
| committer | Nicola Mettifogo | 2007-02-04 11:16:40 +0000 | 
| commit | 854e351e5b68e2d5f4189c80c22050d589f6ad9d (patch) | |
| tree | 67010ff8e86090c9e5af136d6a86dd5e7220c4dd | |
| parent | d89bfde4a674cc9fcd8b48506aaefa94daff2bb8 (diff) | |
| download | scummvm-rg350-854e351e5b68e2d5f4189c80c22050d589f6ad9d.tar.gz scummvm-rg350-854e351e5b68e2d5f4189c80c22050d589f6ad9d.tar.bz2 scummvm-rg350-854e351e5b68e2d5f4189c80c22050d589f6ad9d.zip  | |
Implemented workaround to avoid crashes on location switches, using knowledge from Big Red Adventure.
svn-id: r25378
| -rw-r--r-- | engines/parallaction/parallaction.cpp | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index a437010c54..31c1dc19f2 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -421,9 +421,20 @@ void Parallaction::runGame() {  	while ((_engineFlags & kEngineQuit) == 0) {  		_keyDown = updateInput(); -		if ((_mouseHidden == 0) && ((_engineFlags & kEngineMouse) == 0) && ((_engineFlags & kEngineWalking) == 0)) { -			debugC(1, kDebugLocation, "runGame: checking input"); - +        debugC(1, kDebugLocation, "runGame: input flags (%i, %i, %i, %i)", +            _mouseHidden == 0, +            (_engineFlags & kEngineMouse) == 0, +            (_engineFlags & kEngineWalking) == 0, +            (_engineFlags & kEngineChangeLocation) == 0 +        ); + +        // WORKAROUND: the engine doesn't check for displayed labels before performing a location +        // switch, thus crashing whenever a jobDisplayLabel/jEraseLabel pair is left into the +        // queue after the character enters a door. +        // Skipping input processing when kEngineChangeLocation is set solves the issue. It's +        // noteworthy that the programmers added this very check in Big Red Adventure's engine, +        // so it should be ok here in Nippon Safes too. +		if ((_mouseHidden == 0) && ((_engineFlags & kEngineMouse) == 0) && ((_engineFlags & kEngineWalking) == 0) && ((_engineFlags & kEngineChangeLocation) == 0)) {  			InputData *v8 = translateInput();  			if (v8) processInput(v8);  		} @@ -969,12 +980,12 @@ void runJobs() {  // and is in fact only used to remove jEraseLabel jobs  //  void jobWaitRemoveJob(void *parm, Job *j) { -//	printf("jobWaitRemoveJob(%x)\n", parm); -  	Job *arg = (Job*)parm;  	static uint16 count = 0; +    debugC(1, kDebugLocation, "jobWaitRemoveJob: count = %i", count); +  	_engineFlags |= kEngineMouse;  	count++;  | 
