diff options
| -rw-r--r-- | engines/gob/draw_v2.cpp | 28 | ||||
| -rw-r--r-- | engines/gob/inter.h | 1 | ||||
| -rw-r--r-- | engines/gob/inter_v2.cpp | 50 | ||||
| -rw-r--r-- | engines/gob/inter_v4.cpp | 82 | ||||
| -rw-r--r-- | engines/gob/video.cpp | 19 | 
5 files changed, 122 insertions, 58 deletions
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index 1195e35e93..8c12079b83 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -247,10 +247,7 @@ void Draw_v2::printTotText(int16 id) {  	if (_renderFlags & RENDERFLAG_FROMSPLIT) {  		int16 start; -		if (_vm->_video->_splitHeight1 < _vm->_height) -			start = _vm->_video->_splitHeight1; -		else -			start = _vm->_video->_splitStart; +		start = _vm->_video->_splitStart;  		destY = start;  		spriteBottom = READ_LE_UINT16(ptr + 6) - READ_LE_UINT16(ptr + 2); @@ -654,22 +651,23 @@ void Draw_v2::spriteOperation(int16 operation) {  	int16 destSurface = _destSurface;  	int16 sourceSurface = _sourceSurface; -	if ((_destSpriteY >= _vm->_video->_splitHeight1) && -	    ((_destSurface == 20) || (_destSurface == 21))) { - -		if (_vm->_video->_splitHeight1 < _vm->_height) { -			_destSpriteY = (_destSpriteY - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; +	if (_vm->_video->_splitSurf && ((_destSurface == 20) || (_destSurface == 21))) { +		if ((_destSpriteY >= _vm->_video->_splitStart)) { +			_destSpriteY -= _vm->_video->_splitStart;  			if ((operation == DRAW_DRAWLINE) ||  				 ((operation >= DRAW_DRAWBAR) && (operation <= DRAW_FILLRECTABS))) -				_spriteBottom = (_spriteBottom - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; +				_spriteBottom -= _vm->_video->_splitStart; + +			_destSurface += 4;  		} -	} +		if ((_spriteTop >= _vm->_video->_splitStart) && (operation == DRAW_BLITSURF)) { +			_spriteTop -= _vm->_video->_splitStart; +			if (_destSurface < 24) +				_destSurface += 4; +		} -	if ((_spriteTop >= _vm->_video->_splitHeight1) && (operation == DRAW_BLITSURF) && -	    ((_destSurface == 20) || (_destSurface == 21))) -		if (_vm->_video->_splitHeight1 < _vm->_height) -			_spriteTop = (_spriteTop - _vm->_video->_splitHeight1) + _vm->_video->_splitStart; +	}  	adjustCoords(0, &_destSpriteX, &_destSpriteY);  	if ((operation != DRAW_LOADSPRITE) && (_needAdjust != 2)) { diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 582e57a2d4..e43cb4e891 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -519,6 +519,7 @@ protected:  	virtual const char *getOpcodeFuncDesc(byte i, byte j);  	virtual const char *getOpcodeGoblinDesc(int i); +	void o4_initScreen();  	void o4_playVmdOrMusic();  }; diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 0e2a6c607e..6b7607791e 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -1433,49 +1433,17 @@ void Inter_v2::o2_initScreen() {  	if (height > 0)  		_vm->_video->_surfHeight = height; -	if (videoMode == 0x18) { +	_vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight - offY); +	_vm->_video->_splitHeight2 = offY; +	_vm->_video->_splitStart = _vm->_video->_surfHeight - offY; -		if (_vm->_video->_surfWidth < _vm->_width) -			_vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2; -		else -			_vm->_video->_screenDeltaX = 0; - -		_vm->_global->_mouseMinX = _vm->_video->_screenDeltaX; -		_vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1; - - -		int16 screenHeight = _vm->_video->_surfHeight; +	_vm->_video->_screenDeltaX = 0; +	_vm->_video->_screenDeltaY = 0; -		if (screenHeight < _vm->_height) { -			_vm->_video->_surfHeight += offY; -			_vm->_video->_splitStart = screenHeight; -		} else  -			_vm->_video->_splitStart = screenHeight - offY; - -			_vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, screenHeight - offY); -			_vm->_video->_splitHeight2 = offY; - -			if ((_vm->_video->_surfHeight + offY) < _vm->_height) -				_vm->_video->_screenDeltaY = (_vm->_height - (screenHeight + offY)) / 2; -			else -				_vm->_video->_screenDeltaY = 0; - -			_vm->_global->_mouseMaxY = (screenHeight + _vm->_video->_screenDeltaY) - offY - 1; -			_vm->_global->_mouseMinY = _vm->_video->_screenDeltaY; - -	} else { -		_vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight - offY); -		_vm->_video->_splitHeight2 = offY; -		_vm->_video->_splitStart = _vm->_video->_surfHeight - offY; - -		_vm->_video->_screenDeltaX = 0; -		_vm->_video->_screenDeltaY = 0; - -		_vm->_global->_mouseMinX = 0; -		_vm->_global->_mouseMinY = 0; -		_vm->_global->_mouseMaxX = _vm->_width; -		_vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1; -	} +	_vm->_global->_mouseMinX = 0; +	_vm->_global->_mouseMinY = 0; +	_vm->_global->_mouseMaxX = _vm->_width; +	_vm->_global->_mouseMaxY = _vm->_height - _vm->_video->_splitHeight2 - 1;  	_vm->_draw->closeScreen();  	_vm->_util->clearPalette(); diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp index 920ca59f43..bc92fbf2b0 100644 --- a/engines/gob/inter_v4.cpp +++ b/engines/gob/inter_v4.cpp @@ -29,6 +29,7 @@  #include "gob/gob.h"  #include "gob/inter.h"  #include "gob/global.h" +#include "gob/draw.h"  #include "gob/game.h"  #include "gob/parse.h"  #include "gob/videoplayer.h" @@ -279,7 +280,7 @@ void Inter_v4::setupOpcodes() {  		{NULL, ""},  		{NULL, ""},  		/* 80 */ -		OPCODE(o2_initScreen), +		OPCODE(o4_initScreen),  		OPCODE(o2_scroll),  		OPCODE(o2_setScrollOffset),  		OPCODE(o4_playVmdOrMusic), @@ -716,6 +717,85 @@ const char *Inter_v4::getOpcodeGoblinDesc(int i) {  	return "";  } +void Inter_v4::o4_initScreen() { +	int16 offY; +	int16 videoMode; +	int16 width, height; + +	offY = load16(); + +	videoMode = offY & 0xFF; +	offY = (offY >> 8) & 0xFF; + +	width = _vm->_parse->parseValExpr(); +	height = _vm->_parse->parseValExpr(); + +	_vm->_video->clearScreen(); + +	_vm->_global->_fakeVideoMode = videoMode; + +	// Some versions require this +	if (videoMode == 0xD) +		videoMode = _vm->_mode; + +	if ((videoMode == _vm->_global->_videoMode) && (width == -1)) +		return; + +	if (width > 0) +		_vm->_video->_surfWidth = width; +	if (height > 0) +		_vm->_video->_surfHeight = height; + +	_vm->_video->_screenDeltaX = 0; +	if (_vm->_video->_surfWidth < _vm->_width) +		_vm->_video->_screenDeltaX = (_vm->_width - _vm->_video->_surfWidth) / 2; + +	_vm->_global->_mouseMinX = _vm->_video->_screenDeltaX; +	_vm->_global->_mouseMaxX = _vm->_video->_screenDeltaX + _vm->_video->_surfWidth - 1; + +	_vm->_video->_splitStart = _vm->_video->_surfHeight - offY; + +	_vm->_video->_splitHeight1 = MIN<int16>(_vm->_height, _vm->_video->_surfHeight); +	_vm->_video->_splitHeight2 = offY; + +	if ((_vm->_video->_surfHeight + offY) < _vm->_height) +		_vm->_video->_screenDeltaY = (_vm->_height - (_vm->_video->_surfHeight + offY)) / 2; +	else +		_vm->_video->_screenDeltaY = 0; + +	_vm->_global->_mouseMaxY = (_vm->_video->_surfHeight + _vm->_video->_screenDeltaY) - offY - 1; +	_vm->_global->_mouseMinY = _vm->_video->_screenDeltaY; + +	_vm->_draw->closeScreen(); +	_vm->_util->clearPalette(); +	memset(_vm->_global->_redPalette, 0, 256); +	memset(_vm->_global->_greenPalette, 0, 256); +	memset(_vm->_global->_bluePalette, 0, 256); + +	_vm->_global->_videoMode = videoMode; +	_vm->_video->initPrimary(videoMode); +	WRITE_VAR(15, _vm->_global->_fakeVideoMode); + +	_vm->_global->_setAllPalette = true; + +	_vm->_util->setMousePos(_vm->_global->_inter_mouseX, +			_vm->_global->_inter_mouseY); +	_vm->_util->clearPalette(); + +	_vm->_draw->initScreen(); + +	_vm->_util->setScrollOffset(); + +	_vm->_video->_splitSurf = 0; +	_vm->_draw->_spritesArray[24] = 0; +	_vm->_draw->_spritesArray[25] = 0; +	if (offY > 0) { +		_vm->_draw->_spritesArray[24] = new SurfaceDesc(videoMode, _vm->_width, offY); +		_vm->_draw->_spritesArray[25] = new SurfaceDesc(videoMode, _vm->_width, offY); +		_vm->_video->_splitSurf = _vm->_draw->_spritesArray[25]; +	} +} +  void Inter_v4::o4_playVmdOrMusic() {  	char fileName[128];  	int16 x, y; diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 3034a38079..d2fe979754 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -86,10 +86,14 @@ void SurfaceDesc::swap(SurfaceDesc &surf) {  Video::Video(GobEngine *vm) : _vm(vm) {  	_doRangeClamp = false;  	_videoDriver = 0; +  	_surfWidth = 320;  	_surfHeight = 200; +  	_scrollOffsetX = 0;  	_scrollOffsetY = 0; + +	_splitSurf = 0;  	_splitHeight1 = 200;  	_splitHeight2 = 0;  	_splitStart = 0; @@ -184,7 +188,19 @@ void Video::retrace(bool mouse) {  		g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset,  				_surfWidth, screenX, screenY, screenWidth, screenHeight); -		if (_splitHeight2 > 0) { +		if (_splitSurf) { + +			screenOffset = 0; +			screenX = 0; +			screenY = _vm->_height - _splitSurf->getHeight(); +			screenWidth = MIN<int>(_vm->_width, _splitSurf->getWidth()); +			screenHeight = _splitSurf->getHeight(); + +			g_system->copyRectToScreen(_splitSurf->getVidMem() + screenOffset, +					_splitSurf->getWidth(), screenX, screenY, screenWidth, screenHeight); + +		} else if (_splitHeight2 > 0) { +  			screenOffset = _splitStart * _surfWidth;  			screenX = 0;  			screenY = _vm->_height - _splitHeight2; @@ -193,6 +209,7 @@ void Video::retrace(bool mouse) {  			g_system->copyRectToScreen(_vm->_global->_primarySurfDesc->getVidMem() + screenOffset,  					_surfWidth, screenX, screenY, screenWidth, screenHeight); +  		}  		g_system->updateScreen();  | 
