diff options
| -rw-r--r-- | engines/scumm/gfx.cpp | 3 | ||||
| -rw-r--r-- | engines/scumm/he/intern_he.h | 2 | ||||
| -rw-r--r-- | engines/scumm/intern.h | 16 | ||||
| -rw-r--r-- | engines/scumm/scumm.cpp | 53 | ||||
| -rw-r--r-- | engines/scumm/scumm.h | 11 | 
5 files changed, 53 insertions, 32 deletions
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 46255ef245..663edcdf30 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -790,7 +790,6 @@ void ScummEngine::redrawBGAreas() {  			redrawBGStrip(0, 1);  		} else if (_fullRedraw || diff != 0) {  			_bgNeedsRedraw = false; -			_flashlight.isDrawn = false;  			redrawBGStrip(0, gdi._numStrips);  		}  	} @@ -1090,7 +1089,7 @@ void ScummEngine::drawBox(int x, int y, int x2, int y2, int color) {  	}  } -void ScummEngine::drawFlashlight() { +void ScummEngine_v5::drawFlashlight() {  	int i, j, x, y;  	VirtScreen *vs = &virtscr[kMainVirtScreen]; diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h index 7c3baba193..f06214e1fc 100644 --- a/engines/scumm/he/intern_he.h +++ b/engines/scumm/he/intern_he.h @@ -447,6 +447,8 @@ protected:  	virtual void executeOpcode(byte i);  	virtual const char *getOpcodeDesc(byte i); +	virtual void scummLoop_handleDrawing(); +  	virtual void setupScummVars();  	virtual void initScummVars(); diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index 58bca67183..029e347dec 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -49,6 +49,13 @@ protected:  	uint16 _cursorImages[4][17];  	byte _cursorHotspots[2 * 4]; +	struct { +		int x, y, w, h; +		byte *buffer; +		uint16 xStrips, yStrips; +		bool isDrawn; +	} _flashlight; +  public:  	ScummEngine_v5(OSystem *syst, const DetectorResult &dr); @@ -57,6 +64,8 @@ protected:  	virtual void executeOpcode(byte i);  	virtual const char *getOpcodeDesc(byte i); +	virtual void scummLoop_handleActors(); +  	virtual void setupScummVars();  	virtual void initScummVars();  	virtual void decodeParseString(); @@ -79,6 +88,8 @@ protected:  	void redefineBuiltinCursorFromChar(int index, int chr);  	void redefineBuiltinCursorHotspot(int index, int x, int y); +	void drawFlashlight(); +  	/* Version 5 script opcodes */  	void o5_actorFollowCamera();  	void o5_actorFromPos(); @@ -564,6 +575,8 @@ protected:  	virtual void executeOpcode(byte i);  	virtual const char *getOpcodeDesc(byte i); +	virtual void scummLoop_handleActors(); +  	virtual void setupScummVars();  	virtual void decodeParseString(int a, int b);  	virtual void readArrayFromIndexFile(); @@ -821,6 +834,9 @@ public:  	void clearSubtitleQueue();  protected: +	virtual void scummLoop_handleSound(); +	virtual void scummLoop_handleDrawing(); +  	virtual void setupScummVars();  	virtual void initScummVars(); diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 75097da6e9..c6fc1a04b6 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -371,7 +371,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)  	_doEffect = false;  	_currentLights = 0; -	memset(&_flashlight, 0, sizeof(_flashlight));  	_bompActorPalettePtr = NULL;  	_shakeEnabled = false;  	_shakeFrame = 0; @@ -740,6 +739,12 @@ ScummEngine_v5::ScummEngine_v5(OSystem *syst, const DetectorResult &dr)  		memcpy(_cursorImages[i], default_cursor_images[i], 32);  	}  	memcpy(_cursorHotspots, default_cursor_hotspots, 8); + +	// Setup flashlight +	memset(&_flashlight, 0, sizeof(_flashlight)); +	_flashlight.xStrips = 7; +	_flashlight.yStrips = 7; +	_flashlight.buffer = NULL;  }  ScummEngine_v4::ScummEngine_v4(OSystem *syst, const DetectorResult &dr) @@ -1228,13 +1233,6 @@ void ScummEngine::scummInit() {  	virtscr[0].xstart = 0; -	if (_game.version <= 5) { -		// Setup light -		_flashlight.xStrips = 7; -		_flashlight.yStrips = 7; -		_flashlight.buffer = NULL; -	} -  	_mouse.x = 104;  	_mouse.y = 56; @@ -1554,7 +1552,7 @@ int ScummEngine::go() {  		diff = _system->getMillis();  		delta = scummLoop(delta); -		if (delta < 1)	// Ensure we don't get into a loop +		if (delta < 1)	// Ensure we don't get into an endless loop  			delta = 1;  // by not decreasing sleepers.  		if (_quit) { @@ -1869,32 +1867,44 @@ void ScummEngine::scummLoop_handleSaveLoad() {  }  void ScummEngine::scummLoop_handleDrawing() { -	// FIXME / TODO: Do we really have to check for GF_NEW_CAMERA? -	// Since old games simply don't use the y coord, we should be able to safely -	// use "camera._cur != camera._last" here... -	if (camera._cur.x != camera._last.x || _bgNeedsRedraw || _fullRedraw -			|| ((_game.features & GF_NEW_CAMERA) && camera._cur.y != camera._last.y)) { +	if (camera._cur != camera._last || _bgNeedsRedraw || _fullRedraw) {  		redrawBGAreas();  	}  	processDrawQue(); +} -	if (_game.heversion >= 99) -		_fullRedraw = false; +#ifndef DISABLE_SCUMM_7_8 +void ScummEngine_v7::scummLoop_handleDrawing() { +	ScummEngine_v6::scummLoop_handleDrawing();  	// Full Throttle always redraws verbs and draws verbs before actors  	if (_game.version >= 7)  		redrawVerbs(); +} +#endif  #ifndef DISABLE_HE +void ScummEngine_v90he::scummLoop_handleDrawing() { +	ScummEngine_v80he::scummLoop_handleDrawing(); + +	if (_game.heversion >= 99) +		_fullRedraw = false; +  	if (_game.heversion >= 90) { -		((ScummEngine_v90he *)this)->_sprite->resetBackground(); -		((ScummEngine_v90he *)this)->_sprite->sortActiveSprites(); +		_sprite->resetBackground(); +		_sprite->sortActiveSprites();  	} +}  #endif + +void ScummEngine_v6::scummLoop_handleActors() { +	setActorRedrawFlags(); +	resetActorBgs(); +	processActors();  } -void ScummEngine::scummLoop_handleActors() { +void ScummEngine_v5::scummLoop_handleActors() {  	setActorRedrawFlags();  	resetActorBgs(); @@ -1920,8 +1930,11 @@ void ScummEngine::scummLoop_handleEffects() {  void ScummEngine::scummLoop_handleSound() {  	_sound->processSound(); +}  #ifndef DISABLE_SCUMM_7_8 +void ScummEngine_v7::scummLoop_handleSound() { +	ScummEngine_v6::scummLoop_handleSound();  	if (_imuseDigital) {  		_imuseDigital->flushTracks();  		if ( ((_game.id == GID_DIG) && (!(_game.features & GF_DEMO))) || (_game.id == GID_CMI) ) @@ -1930,8 +1943,8 @@ void ScummEngine::scummLoop_handleSound() {  	if (_smixer) {  		_smixer->flush();  	} -#endif  } +#endif  #pragma mark - diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 8f9a7ec759..98db99fccf 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -475,7 +475,7 @@ protected:  	virtual void scummLoop_updateScummVars();  	virtual void scummLoop_handleSaveLoad();  	virtual void scummLoop_handleDrawing(); -	virtual void scummLoop_handleActors(); +	virtual void scummLoop_handleActors() = 0;  	virtual void scummLoop_handleEffects();  	virtual void scummLoop_handleSound(); @@ -997,13 +997,6 @@ protected:  	byte *_scrollBuffer; -	struct { -		int x, y, w, h; -		byte *buffer; -		uint16 xStrips, yStrips; -		bool isDrawn; -	} _flashlight; -  public:  	bool isLightOn() const; @@ -1088,8 +1081,6 @@ public:  	byte *getMaskBuffer(int x, int y, int z);  protected: -	void drawFlashlight(); -  	void fadeIn(int effect);  	void fadeOut(int effect);  | 
