[Scummvm-cvs-logs] SF.net SVN: scummvm: [24752] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Mon Nov 20 14:03:30 CET 2006


Revision: 24752
          http://svn.sourceforge.net/scummvm/?rev=24752&view=rev
Author:   drmccoy
Date:     2006-11-20 05:03:30 -0800 (Mon, 20 Nov 2006)

Log Message:
-----------
Changed the way sprites-freeing is handled, now the menu sprites and window decorations are drawn

Modified Paths:
--------------
    scummvm/trunk/engines/gob/draw.cpp
    scummvm/trunk/engines/gob/draw.h
    scummvm/trunk/engines/gob/draw_v1.cpp
    scummvm/trunk/engines/gob/draw_v2.cpp
    scummvm/trunk/engines/gob/game.cpp
    scummvm/trunk/engines/gob/game.h
    scummvm/trunk/engines/gob/game_v1.cpp
    scummvm/trunk/engines/gob/game_v2.cpp
    scummvm/trunk/engines/gob/gob.cpp
    scummvm/trunk/engines/gob/inter.cpp
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v1.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/mult_v1.cpp
    scummvm/trunk/engines/gob/mult_v2.cpp

Modified: scummvm/trunk/engines/gob/draw.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/draw.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -135,8 +135,13 @@
 
 	_cursorTimeKey = 0;
 
-	warning("GOB2 Stub! _word_2E8E2");
+	warning("GOB2 Stub! _word_2E8E2, _word_2FC9C, _word_2FC9E, _word_2E51F, _off_2E51B, _off_2E517");
 	_word_2E8E2 = 2;
+	_word_2FC9C = 0;
+	_word_2FC9E = 0;
+	_word_2E51F = 0;
+	_off_2E51B = 0;
+	_off_2E517 = 0;
 }
 
 void Draw::invalidateRect(int16 left, int16 top, int16 right, int16 bottom) {
@@ -552,4 +557,12 @@
 			0, _vm->_global->_videoMode);
 }
 
+void Draw::initSpriteSurf(int16 index, int16 vidMode, int16 width, int16 height, int16 flags) {
+	if (index != 22)
+		_vm->_video->freeSurfDesc(_spritesArray[index]);
+
+	_spritesArray[index] =
+		_vm->_video->initSurfDesc(vidMode, width, height, flags);
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/draw.h
===================================================================
--- scummvm/trunk/engines/gob/draw.h	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/draw.h	2006-11-20 13:03:30 UTC (rev 24752)
@@ -115,6 +115,11 @@
 	int16 _palLoadData2[4];
 		
 	int16 _word_2E8E2;
+	int16 _word_2FC9C;
+	int16 _word_2FC9E;
+	int16 _word_2E51F;
+	Video::SurfaceDesc *_off_2E51B;
+	Video::SurfaceDesc *_off_2E517;
 
 	void invalidateRect(int16 left, int16 top, int16 right, int16 bottom);
 	void blitInvalidated(void);
@@ -136,12 +141,15 @@
 	void printTextCentered(int16 arg_0, int16 left, int16 top, int16 right,
 			int16 bottom, char *str, int16 fontIndex, int16 color);
 	int32 getSpriteRectSize(int16 index);
+	void initSpriteSurf(int16 index, int16 vidMode, int16 width, int16 height, int16 flags);
 
 	virtual void initBigSprite(int16 index, int16 width, int16 height, int16 flags) = 0;
 	virtual void printText(void) = 0;
 	virtual void spriteOperation(int16 operation) = 0;
 	virtual void blitCursor(void) = 0;
 	virtual void animateCursor(int16 cursor) = 0;
+	virtual void initScreen(void) = 0;
+	virtual void closeScreen(void) = 0;
 
 	Draw(GobEngine *vm);
 	virtual ~Draw() {};
@@ -157,6 +165,8 @@
 	virtual void spriteOperation(int16 operation);
 	virtual void blitCursor(void);
 	virtual void animateCursor(int16 cursor);
+	virtual void initScreen(void);
+	virtual void closeScreen(void);
 
 	Draw_v1(GobEngine *vm);
 	virtual ~Draw_v1() {};
@@ -169,6 +179,8 @@
 	virtual void spriteOperation(int16 operation);
 	virtual void blitCursor(void);
 	virtual void animateCursor(int16 cursor);
+	virtual void initScreen(void);
+	virtual void closeScreen(void);
 
 	Draw_v2(GobEngine *vm);
 	virtual ~Draw_v2() {};

Modified: scummvm/trunk/engines/gob/draw_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_v1.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/draw_v1.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -608,4 +608,11 @@
 	_cursorY = newY;
 }
 
+void Draw_v1::initScreen(void) {
+	_backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
+}
+
+void Draw_v1::closeScreen(void) {
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/draw_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/draw_v2.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/draw_v2.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -62,8 +62,7 @@
 		}
 
 		partsheight = _spritesHeights[index];
-		_spritesArray[index] =
-			_vm->_video->initSurfDesc(_vm->_global->_videoMode, width, partsheight, flags);
+		initSpriteSurf(index, _vm->_global->_videoMode, width, partsheight, flags);
 		fragment = 0;
 		while (partsheight < height) {
 			remainheight = height - partsheight;
@@ -82,8 +81,7 @@
 			fragment++;
 		}
 	} else
-		_spritesArray[index] =
-			_vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, flags);
+		initSpriteSurf(index, _vm->_global->_videoMode, width, height, flags);
 
 	_vm->_video->clearSurf(_spritesArray[index]);
 	// '------
@@ -533,7 +531,7 @@
 	sourceSurface = _sourceSurface;
 
 //	warning("GOB2 Stub! _off_2E51B");
-	if (_vm->_game->_off_2E51B != 0) {
+	if (_off_2E51B != 0) {
 		if ((_frontSurface->height <= _destSpriteY) &&
 				((_destSurface == 20) || (_destSurface == 21))) {
 			_destSpriteY -= _frontSurface->height;
@@ -544,7 +542,7 @@
 			}
 			if (_destSurface == 21)
 				invalidateRect(0, _frontSurface->height, 319,
-						_frontSurface->height + _vm->_game->_off_2E51B->height - 1);
+						_frontSurface->height + _off_2E51B->height - 1);
 			destSurface += 4;
 		}
 		if ((_frontSurface->height <= _spriteTop) && (operation == DRAW_BLITSURF)
@@ -1017,4 +1015,61 @@
 	_cursorY = newY;
 }
 
+void Draw_v2::initScreen(void) {
+	_word_2FC9C = 0;
+	_word_2FC9E = 0;
+
+	if (_word_2E51F != 0) {
+		_off_2E51B = new Video::SurfaceDesc;
+		memcpy(_off_2E51B, _frontSurface, sizeof(Video::SurfaceDesc));
+		_off_2E51B->height = _vm->_global->_primaryHeight - _word_2E51F;
+		_frontSurface->height -= _off_2E51B->height;
+		_frontSurface->vidPtr =
+			_off_2E51B->vidPtr + ((_off_2E51B->width * _off_2E51B->height) / 4);
+
+		_off_2E517 = new Video::SurfaceDesc;
+		memcpy(_off_2E517, _off_2E51B, sizeof(Video::SurfaceDesc));
+		_off_2E517->width = _vm->_global->_primaryWidth;
+		_off_2E517->vidPtr = _frontSurface->vidPtr +
+			((_frontSurface->width * _frontSurface->height ) / 4);
+	}
+	initBigSprite(21, 320, 200, 0);
+	_backSurface = _spritesArray[21];
+	_vm->_video->clearSurf(_backSurface);
+	
+	initBigSprite(23, 32, 16, 2);
+	_cursorSpritesBack = _spritesArray[23];
+	_cursorSprites = _cursorSpritesBack;
+	_scummvmCursor =
+		_vm->_video->initSurfDesc(_vm->_global->_videoMode, 16, 16, SCUMMVM_CURSOR);
+
+	_spritesArray[20] = _frontSurface;
+	_spritesArray[21] = _backSurface;
+
+/*	if (_word_2E51F != 0) {
+		dword_2F92D = _off_2E51B;
+		dword_2F931 = _off_2E517;
+	}*/
+}
+
+void Draw_v2::closeScreen(void) {
+	freeSprite(23);
+	_cursorSprites = 0;
+	_cursorSpritesBack = 0;
+	_vm->_video->freeSurfDesc(_scummvmCursor);
+	_scummvmCursor = 0;
+	if (_off_2E51B != 0) {
+		memcpy(_frontSurface, _off_2E51B, sizeof(Video::SurfaceDesc));
+		_frontSurface->width = 320;
+		_frontSurface->height = 200;
+		delete _off_2E51B;
+		delete _off_2E517;
+		_off_2E51B = 0;
+		_off_2E517 = 0;
+	}
+	if (_frontSurface != _backSurface)
+		freeSprite(21);
+	_spritesArray[21] = 0;
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/game.cpp
===================================================================
--- scummvm/trunk/engines/gob/game.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/game.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -123,13 +123,8 @@
 	_byte_2FC83 = 0;
 	_word_2FC80 = 0;
 
-	warning("GOB2 Stub! _byte_2FC9B, _word_2FC9C, _word_2FC9E, _word_2E51F, _off_2E51B, _off_2E517, _dword_2F2B6");
+	warning("GOB2 Stub! _byte_2FC9B, _dword_2F2B6");
 	_byte_2FC9B = 0;
-	_word_2FC9C = 0;
-	_word_2FC9E = 0;
-	_word_2E51F = 0;
-	_off_2E51B = 0;
-	_off_2E517 = 0;
 	_dword_2F2B6 = 0;
 }
 
@@ -304,6 +299,7 @@
 		_vm->_draw->spriteOperation(0);
 	}
 	_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[30 + _captureCount]);
+	_vm->_draw->_spritesArray[30 + _captureCount] = 0;
 }
 
 char *Game::loadTotResource(int16 id) {
@@ -436,6 +432,8 @@
 }
 
 void Game::start(void) {
+	int i;
+
 	_collisionAreas = new Collision[250];
 	memset(_collisionAreas, 0, 250 * sizeof(Collision));
 
@@ -443,10 +441,14 @@
 	playTot(-2);
 
 	delete[] _collisionAreas;
+	_vm->_draw->closeScreen();
 
-	_vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+	_vm->_draw->_spritesArray[20] = 0;
+	for (i = 0; i < 50; i++) {
+		_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
+		_vm->_draw->_spritesArray[i] = 0;
+	}
 	_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
-	_vm->_video->freeSurfDesc(_vm->_draw->_backSurface);
 }
 
 // flagbits: 0 = freeInterVariables, 1 = skipPlay
@@ -730,61 +732,6 @@
 	}
 }
 
-// "DEVinitscreen"
-void Game::sub_ADD2(void) {
-	_word_2FC9C = 0;
-	_word_2FC9E = 0;
-
-	if (_word_2E51F != 0) {
-		_off_2E51B = new Video::SurfaceDesc;
-		memcpy(_off_2E51B, _vm->_draw->_frontSurface, sizeof(Video::SurfaceDesc));
-		_off_2E51B->height = _vm->_global->_primaryHeight - _word_2E51F;
-		_vm->_draw->_frontSurface->height -= _off_2E51B->height;
-		_vm->_draw->_frontSurface->vidPtr =
-			_off_2E51B->vidPtr + ((_off_2E51B->width * _off_2E51B->height) / 4);
-
-		_off_2E517 = new Video::SurfaceDesc;
-		memcpy(_off_2E517, _off_2E51B, sizeof(Video::SurfaceDesc));
-		_off_2E517->width = _vm->_global->_primaryWidth;
-		_off_2E517->vidPtr = _vm->_draw->_frontSurface->vidPtr +
-			((_vm->_draw->_frontSurface->width * _vm->_draw->_frontSurface->height ) / 4);
-	}
-	_vm->_draw->initBigSprite(21, 320, 200, 0);
-	_vm->_draw->_backSurface = _vm->_draw->_spritesArray[21];
-	_vm->_video->clearSurf(_vm->_draw->_backSurface);
-	
-	_vm->_draw->initBigSprite(23, 32, 16, 2);
-	_vm->_draw->_cursorSpritesBack = _vm->_draw->_spritesArray[23];
-	_vm->_draw->_cursorSprites = _vm->_draw->_cursorSpritesBack;
-	_vm->_draw->_scummvmCursor =
-		_vm->_video->initSurfDesc(_vm->_global->_videoMode, 16, 16, SCUMMVM_CURSOR);
-
-	_vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
-	_vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
-
-/*	if (_word_2E51F != 0) {
-		dword_2F92D = _off_2E51B;
-		dword_2F931 = _off_2E517;
-	}*/
-}
-
-// "DEVclosescreen"
-void Game::sub_BB28(void) {
-	_vm->_draw->freeSprite(23);
-	_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
-	if (_off_2E51B != 0) {
-		memcpy(_vm->_draw->_frontSurface, _off_2E51B, sizeof(Video::SurfaceDesc));
-		_vm->_draw->_frontSurface->width = 320;
-		_vm->_draw->_frontSurface->height = 200;
-		delete _off_2E51B;
-		delete _off_2E517;
-		_off_2E51B = 0;
-		_off_2E517 = 0;
-	}
-	if (_vm->_draw->_frontSurface != _vm->_draw->_backSurface)
-		_vm->_draw->freeSprite(21);
-}
-
 Snd::SoundDesc *Game::loadSND(const char *path, int8 arg_4) {
 	Snd::SoundDesc *soundDesc;
 	int32 dsize;

Modified: scummvm/trunk/engines/gob/game.h
===================================================================
--- scummvm/trunk/engines/gob/game.h	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/game.h	2006-11-20 13:03:30 UTC (rev 24752)
@@ -234,14 +234,7 @@
 	virtual void prepareStart(void) = 0;
 
 	int8 _byte_2FC9B;
-	int16 _word_2FC9C;
-	int16 _word_2FC9E;
-	int16 _word_2E51F;
 	int32 _dword_2F2B6;
-	Video::SurfaceDesc *_off_2E51B;
-	Video::SurfaceDesc *_off_2E517;
-	void sub_ADD2(void);
-	void sub_BB28(void);
 
 protected:
 

Modified: scummvm/trunk/engines/gob/game_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v1.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/game_v1.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -594,8 +594,7 @@
 
 	_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
 
-	_vm->_draw->_backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
-
+	_vm->_draw->initScreen();
 	_vm->_video->fillRect(_vm->_draw->_backSurface, 0, 0, 319, 199, 1);
 	_vm->_draw->_frontSurface = _vm->_global->_pPrimarySurfDesc;
 	_vm->_video->fillRect(_vm->_draw->_frontSurface, 0, 0, 319, 199, 1);

Modified: scummvm/trunk/engines/gob/game_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v2.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/game_v2.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -89,8 +89,8 @@
 				_vm->_mult->initAll();
 				_vm->_mult->zeroMultData();
 
-				for (i = 0; i < 50; i++)
-					_vm->_draw->_spritesArray[i] = 0;
+/*				for (i = 0; i < 50; i++)
+					_vm->_draw->_spritesArray[i] = 0;*/
 
 				_vm->_draw->_spritesArray[20] = _vm->_draw->_frontSurface;
 				_vm->_draw->_spritesArray[21] = _vm->_draw->_backSurface;
@@ -241,11 +241,12 @@
 			if (skipPlay != -1) {
 				_vm->_goblin->freeObjects();
 
-				for (i = 0; i < 20; i++) {
+/*				for (i = 0; i < 50; i++) {
 					if (_vm->_draw->_spritesArray[i] != 0)
 						_vm->_video->freeSurfDesc(_vm->_draw->_spritesArray[i]);
 					_vm->_draw->_spritesArray[i] = 0;
-				}
+				}*/
+
 				_vm->_snd->stopSound(0);
 
 				for (i = 0; i < 60; i++)
@@ -474,66 +475,69 @@
 			width = _vm->_draw->_frontSurface->width;
 			height = _vm->_draw->_frontSurface->height;
 			if ((width > _vm->_global->_primaryWidth) || (height > _vm->_global->_primaryHeight)
-					|| ((_off_2E51B != 0) && (height > _off_2E51B->height))) {
+					|| ((_vm->_draw->_off_2E51B != 0) && (height > _vm->_draw->_off_2E51B->height))) {
 				sWidth = _vm->_global->_primaryWidth;
 				sHeight = _vm->_global->_primaryHeight;
-				if (_off_2E51B != 0)
-					sHeight -= _off_2E51B->height;
-				oldWord_2FC9E = _word_2FC9E;
-				oldWord_2FC9C = _word_2FC9C;
-				if ((width > sWidth) && (_vm->_global->_inter_mouseX >= _word_2FC9E)) {
+				if (_vm->_draw->_off_2E51B != 0)
+					sHeight -= _vm->_draw->_off_2E51B->height;
+				oldWord_2FC9E = _vm->_draw->_word_2FC9E;
+				oldWord_2FC9C = _vm->_draw->_word_2FC9C;
+				if ((width > sWidth) && (_vm->_global->_inter_mouseX >= _vm->_draw->_word_2FC9E)) {
 					cursorRight = _vm->_global->_inter_mouseX + _vm->_draw->_cursorWidth;
-					if (cursorRight > (_word_2FC9E + sWidth))
-						_word_2FC9E = MIN(cursorRight - sWidth, width - sWidth);
-				} else if (_vm->_global->_inter_mouseX < _word_2FC9E)
-					_word_2FC9E = _vm->_global->_inter_mouseX;
+					if (cursorRight > (_vm->_draw->_word_2FC9E + sWidth))
+						_vm->_draw->_word_2FC9E = MIN(cursorRight - sWidth, width - sWidth);
+				} else if (_vm->_global->_inter_mouseX < _vm->_draw->_word_2FC9E)
+					_vm->_draw->_word_2FC9E = _vm->_global->_inter_mouseX;
 				height = _vm->_draw->_frontSurface->height;
-				if ((height > sHeight) && (_vm->_global->_inter_mouseY >= _word_2FC9C)) {
+				if ((height > sHeight) && (_vm->_global->_inter_mouseY >= _vm->_draw->_word_2FC9C)) {
 					cursorBottom = _vm->_global->_inter_mouseY + _vm->_draw->_cursorHeight;
-					if (cursorBottom > (_word_2FC9C + sHeight))
-						_word_2FC9C = MIN(cursorBottom - sHeight, height - sHeight);
-				} else if (_vm->_global->_inter_mouseY < _word_2FC9C)
-					_word_2FC9C = _vm->_global->_inter_mouseY;
-				if ((oldWord_2FC9E != _word_2FC9E) || (oldWord_2FC9C != _word_2FC9C)) {
+					if (cursorBottom > (_vm->_draw->_word_2FC9C + sHeight))
+						_vm->_draw->_word_2FC9C = MIN(cursorBottom - sHeight, height - sHeight);
+				} else if (_vm->_global->_inter_mouseY < _vm->_draw->_word_2FC9C)
+					_vm->_draw->_word_2FC9C = _vm->_global->_inter_mouseY;
+				if ((oldWord_2FC9E != _vm->_draw->_word_2FC9E) ||
+						(oldWord_2FC9C != _vm->_draw->_word_2FC9C)) {
 					if (_byte_2FC9B == 0) {
-						_word_2FC9E = oldWord_2FC9E;
-						_word_2FC9C = oldWord_2FC9C;
+						_vm->_draw->_word_2FC9E = oldWord_2FC9E;
+						_vm->_draw->_word_2FC9C = oldWord_2FC9C;
 						if ((_vm->_draw->_frontSurface->width > sWidth) && 
 								(_vm->_global->_inter_mouseX >= oldWord_2FC9E)) {
 							if ((_vm->_global->_inter_mouseX + _vm->_draw->_cursorWidth) >
-									(_word_2FC9E + sWidth))
-								_vm->_global->_inter_mouseX = _word_2FC9E + sWidth - _vm->_draw->_cursorWidth;
+									(_vm->_draw->_word_2FC9E + sWidth))
+								_vm->_global->_inter_mouseX = _vm->_draw->_word_2FC9E +
+									sWidth - _vm->_draw->_cursorWidth;
 						} else if (_vm->_global->_inter_mouseX < oldWord_2FC9E)
 							_vm->_global->_inter_mouseX = oldWord_2FC9E;
 
 						if ((_vm->_draw->_frontSurface->height > sHeight) && 
-								(_vm->_global->_inter_mouseY >= _word_2FC9C)) {
+								(_vm->_global->_inter_mouseY >= _vm->_draw->_word_2FC9C)) {
 							if ((_vm->_global->_inter_mouseY + _vm->_draw->_cursorHeight) >
-									(_word_2FC9C + sHeight))
-								_vm->_global->_inter_mouseY = _word_2FC9C + sHeight - _vm->_draw->_cursorHeight;
+									(_vm->_draw->_word_2FC9C + sHeight))
+								_vm->_global->_inter_mouseY = _vm->_draw->_word_2FC9C +
+									sHeight - _vm->_draw->_cursorHeight;
 						} else if (_vm->_global->_inter_mouseY < oldWord_2FC9E)
-							_vm->_global->_inter_mouseY = _word_2FC9C;
+							_vm->_global->_inter_mouseY = _vm->_draw->_word_2FC9C;
 					} else {
-						if (oldWord_2FC9E > _word_2FC9E) {
-							_vm->_global->_inter_mouseX += (oldWord_2FC9E - _word_2FC9E) / 2;
-							_word_2FC9E += (oldWord_2FC9E - _word_2FC9E) / 2;
+						if (oldWord_2FC9E > _vm->_draw->_word_2FC9E) {
+							_vm->_global->_inter_mouseX += (oldWord_2FC9E - _vm->_draw->_word_2FC9E) / 2;
+							_vm->_draw->_word_2FC9E += (oldWord_2FC9E - _vm->_draw->_word_2FC9E) / 2;
 						} else {
-							_vm->_global->_inter_mouseX -= (_word_2FC9E - oldWord_2FC9E) / 2;
-							_word_2FC9E -= (_word_2FC9E - oldWord_2FC9E) / 2;
+							_vm->_global->_inter_mouseX -= (_vm->_draw->_word_2FC9E - oldWord_2FC9E) / 2;
+							_vm->_draw->_word_2FC9E -= (_vm->_draw->_word_2FC9E - oldWord_2FC9E) / 2;
 						}
-						if (oldWord_2FC9C > _word_2FC9C) {
-							_vm->_global->_inter_mouseY += (oldWord_2FC9C - _word_2FC9C) / 2;
-							_word_2FC9C += (oldWord_2FC9C - _word_2FC9C) / 2;
-							if (_word_2FC9C < 2)
-								_word_2FC9C = 0;
+						if (oldWord_2FC9C > _vm->_draw->_word_2FC9C) {
+							_vm->_global->_inter_mouseY += (oldWord_2FC9C - _vm->_draw->_word_2FC9C) / 2;
+							_vm->_draw->_word_2FC9C += (oldWord_2FC9C - _vm->_draw->_word_2FC9C) / 2;
+							if (_vm->_draw->_word_2FC9C < 2)
+								_vm->_draw->_word_2FC9C = 0;
 						} else {
-							_vm->_global->_inter_mouseY -= (_word_2FC9C - oldWord_2FC9C) / 2;
-							_word_2FC9C -= (_word_2FC9C - oldWord_2FC9C) / 2;
+							_vm->_global->_inter_mouseY -= (_vm->_draw->_word_2FC9C - oldWord_2FC9C) / 2;
+							_vm->_draw->_word_2FC9C -= (_vm->_draw->_word_2FC9C - oldWord_2FC9C) / 2;
 						}
-						if (_off_2E51B == 0)
-							warning("_vid_setPixelShift(_word_2FC9E, _word_2FC9C);");
+						if (_vm->_draw->_off_2E51B == 0)
+							warning("_vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C);");
 						else
-							warning("_vid_setPixelShift(_word_2FC9E, _word_2FC9C + _off_2E51B->height);");
+							warning("_vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C + _vm->_draw->_off_2E51B->height);");
 					}
 					_vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
 				}
@@ -652,9 +656,7 @@
 
 	_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
 
-	_vm->_draw->_backSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, 320, 200, 0);
-
-	sub_ADD2();
+	_vm->_draw->initScreen();
 	_vm->_video->fillRect(_vm->_draw->_frontSurface, 0, 0, 319, 199, 1);
 
 	_vm->_util->setMousePos(152, 92);

Modified: scummvm/trunk/engines/gob/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/gob.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -189,9 +189,9 @@
 }
 
 GobEngine::~GobEngine() {
+	delete _mult;
 	delete _game;
 	delete _snd;
-	delete _video;
 	delete _global;
 	delete _draw;
 	delete _anim;
@@ -201,7 +201,6 @@
 	delete _init;
 	delete _inter;
 	delete _map;
-	delete _mult;
 	delete _pack;
 	delete _palanim;
 	delete _parse;
@@ -209,6 +208,7 @@
 	delete _gtimer;
 	delete _util;
 	delete _music;
+	delete _video;
 	delete[] _startTot;
 	delete[] _startTot0;
 

Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/inter.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -56,6 +56,9 @@
 	_soundStopVal = 0;
 	_breakFromLevel = 0;
 	_nestLevel = 0;
+
+	memset(_pasteBuf, 0, 300);
+	_pastePos = 0;
 }
 
 int16 Inter::load16(void) {

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/inter.h	2006-11-20 13:03:30 UTC (rev 24752)
@@ -51,6 +51,9 @@
 	int16 peek16(char *ptr);
 	int32 peek32(char *ptr);
 
+	char _pasteBuf[300];
+	int16 _pastePos;
+
 	char evalExpr(int16 *pRes);
 	char evalBoolResult(void);
 	void funcBlock(int16 retFlag);
@@ -332,6 +335,8 @@
 	bool o2_loadTot(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_freeSprite(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_loadSound(char &cmdCount, int16 &counter, int16 &retFlag);
+	void o2_copyVars(void);
+	void o2_pasteVars(void);
 	void o2_loadFontToSprite(void);
 	void o2_renderStatic(void);
 	void o2_loadMapObjects(void);

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -804,7 +804,9 @@
 	    _vm->_draw->_cursorSprites->width != width * count) {
 
 		_vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+		_vm->_draw->_spritesArray[23] = 0;
 		_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
+		_vm->_draw->_scummvmCursor = 0;
 
 		_vm->_draw->_cursorWidth = width;
 		_vm->_draw->_cursorHeight = height;
@@ -1168,9 +1170,11 @@
 
 	flag = load16();
 	if (flag == 1)
-		_vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 2);
+//		_vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 2);
+		_vm->_draw->initSpriteSurf(index, _vm->_global->_videoMode, width, height, 2);
 	else
-		_vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 0);
+//		_vm->_draw->_spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, 0);
+		_vm->_draw->initSpriteSurf(index, _vm->_global->_videoMode, width, height, 0);
 
 	_vm->_video->clearSurf(_vm->_draw->_spritesArray[index]);
 	return false;
@@ -1558,12 +1562,12 @@
 		|| oldAnimHeight != _vm->_anim->_areaHeight)) {
 		_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
 		_vm->_anim->_animSurf = 0;
+		_vm->_draw->_spritesArray[22] = 0;
 	}
 
 	if (_vm->_anim->_animSurf == 0) {
 		_vm->_anim->_animSurf = _vm->_video->initSurfDesc(_vm->_global->_videoMode,
 		    _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
-
 		_vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
 	}
 

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -207,8 +207,8 @@
 		/* 40 */
 		OPCODE(o2_totSub),
 		OPCODE(o2_switchTotSub),
-		OPCODE(o2_drawStub),
-		OPCODE(o2_drawStub),
+		OPCODE(o2_copyVars),
+		OPCODE(o2_pasteVars),
 		/* 44 */
 		{NULL, ""},
 		{NULL, ""},
@@ -671,6 +671,7 @@
 		warning("unimplemented opcodeFunc: %d.%d", i, j);
 	else
 		return (this->*op) (cmdCount, counter, retFlag);
+
 	return false;
 }
 
@@ -833,7 +834,7 @@
 	else
 		_vm->_video->_extraMode = false;
 	
-	_vm->_game->sub_BB28();
+	_vm->_draw->closeScreen();
 	_vm->_util->clearPalette();
 	memset(_vm->_global->_redPalette, 0, 256);
 	memset(_vm->_global->_greenPalette, 0, 256);
@@ -869,12 +870,12 @@
 	_vm->_util->clearPalette();
 
 	if (start == 0)
-		_vm->_game->_word_2E51F = 0;
+		_vm->_draw->_word_2E51F = 0;
 	else
-		_vm->_game->_word_2E51F = _vm->_global->_primaryHeight - start;
-	_vm->_game->sub_ADD2();
+		_vm->_draw->_word_2E51F = _vm->_global->_primaryHeight - start;
+	_vm->_draw->initScreen();
 
-	if (_vm->_game->_off_2E51B != 0) {
+	if (_vm->_draw->_off_2E51B != 0) {
 		warning("GOB2 Stub! _vid_setSplit(_vm->_global->_primaryHeight - start);");
 		warning("GOB2 Stub! _vid_setPixelShift(0, start);");
 	}
@@ -889,16 +890,16 @@
 		if (_vm->_game->_byte_2FC9B != 0)
 			_vm->_game->_byte_2FC9B = 1;
 		_vm->_parse->parseValExpr();
-		WRITE_VAR(2, _vm->_game->_word_2FC9E);
-		WRITE_VAR(3, _vm->_game->_word_2FC9C);
+		WRITE_VAR(2, _vm->_draw->_word_2FC9E);
+		WRITE_VAR(3, _vm->_draw->_word_2FC9C);
 	} else {
-		_vm->_game->_word_2FC9E = expr;
-		_vm->_game->_word_2FC9C = _vm->_parse->parseValExpr();
+		_vm->_draw->_word_2FC9E = expr;
+		_vm->_draw->_word_2FC9C = _vm->_parse->parseValExpr();
 	}
-/*	if (_vm->_game->_off_2E51B != 0)
-		warning("GOB2 Stub! _vid_setPixelShift(_vm->_game->_word_2FC9E, _vm->_game->_word_2FC9C + 200 - _vm->_game->_word_2E51F)");
+/*	if (_vm->_draw->_off_2E51B != 0)
+		warning("GOB2 Stub! _vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C + 200 - _vm->_draw->_word_2E51F)");
 	else
-		warning("GOB2 Stub! _vid_setPixelShift(_vm->_game->_word_2FC9E, _vm->_game->_word_2FC9C);");*/
+		warning("GOB2 Stub! _vid_setPixelShift(_vm->_draw->_word_2FC9E, _vm->_draw->_word_2FC9C);");*/
 }
 
 void Inter_v2::o2_stub0x85(void) {
@@ -1013,6 +1014,46 @@
 	return slot;
 }
 
+void Inter_v2::o2_copyVars(void) {
+	byte count;
+	int16 varOff;
+	int i;
+
+	count = *_vm->_global->_inter_execPtr++;
+	for (i = 0; i < count; i++) {
+		if ((*_vm->_global->_inter_execPtr == 25) || (*_vm->_global->_inter_execPtr == 28)) {
+			varOff = _vm->_parse->parseVarIndex();
+			_vm->_global->_inter_execPtr++;
+			memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff,
+					_vm->_global->_inter_animDataSize * 4);
+			_pastePos += _vm->_global->_inter_animDataSize * 4;
+			_pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
+		} else {
+			if (evalExpr(&varOff) == 20)
+				_vm->_global->_inter_resVal = 0;
+			memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
+			_pastePos += 4;
+			_pasteBuf[_pastePos] = 4;
+		}
+		_pastePos++;
+	}
+}
+
+void Inter_v2::o2_pasteVars(void) {
+	byte count;
+	int16 varOff;
+	int16 size;
+	int i;
+
+	count = *_vm->_global->_inter_execPtr++;
+	for (i = 0; i < count; i++) {
+		varOff = _vm->_parse->parseVarIndex();
+		size = _pasteBuf[--_pastePos];
+		_pastePos -= size;
+		memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, size);
+	}
+}
+
 void Inter_v2::o2_loadFontToSprite(void) {
 	int16 i = load16();
 
@@ -1903,9 +1944,10 @@
 	    (oldAnimWidth != _vm->_anim->_areaWidth
 		|| oldAnimHeight != _vm->_anim->_areaHeight)) {
 		if (_vm->_anim->_animSurf->vidMode & 0x80)
-			_vm->_draw->freeSprite(0x16);
+			_vm->_draw->freeSprite(22);
 		else
 			delete _vm->_anim->_animSurf;
+		_vm->_draw->_spritesArray[22] = 0;
 	}
 
 	_vm->_draw->adjustCoords(0, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
@@ -1918,6 +1960,7 @@
 			_vm->_anim->_animSurf->width -= (_vm->_anim->_areaLeft & 0x0FFF8) - 1;
 			_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
 			_vm->_anim->_animSurf->vidPtr += 0x0C000;
+			_vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
 		} else {
 			if (_vm->_global->_videoMode == 20) {
 				if (((_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2
@@ -1929,10 +1972,13 @@
 					_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
 					_vm->_anim->_animSurf->vidPtr = _vm->_draw->_backSurface->vidPtr +
 						_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height / 4;
+					_vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
 				} else
-					_vm->_draw->initBigSprite(0x16, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+					_vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+					_vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
 			} else
-				_vm->_draw->initBigSprite(0x16, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+				_vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+				_vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
 		}
 		if (_terminate)
 			return;
@@ -2059,8 +2105,12 @@
 	if (width != _vm->_draw->_cursorWidth || height != _vm->_draw->_cursorHeight ||
 	    _vm->_draw->_cursorSprites->width != width * count) {
 
-		_vm->_video->freeSurfDesc(_vm->_draw->_cursorSprites);
+		_vm->_draw->freeSprite(23);
+		_vm->_draw->_cursorSprites = 0;
+		_vm->_draw->_cursorSpritesBack = 0;
+
 		_vm->_video->freeSurfDesc(_vm->_draw->_scummvmCursor);
+		_vm->_draw->_scummvmCursor = 0;
 
 		_vm->_draw->_cursorWidth = width;
 		_vm->_draw->_cursorHeight = height;

Modified: scummvm/trunk/engines/gob/mult_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v1.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/mult_v1.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -319,9 +319,9 @@
 			delete[] _animArrayData;
 			_animArrayData = 0;
 
-			if (_vm->_anim->_animSurf)
-				_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+			_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
 			_vm->_anim->_animSurf = 0;
+			_vm->_draw->_spritesArray[22] = 0;
 
 			_animDataAllocated = 0;
 		}
@@ -891,8 +891,7 @@
 }
 
 void Mult_v1::freeMult(void) {
-	if (_vm->_anim->_animSurf != 0)
-		_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+	_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
 
 	delete[] _objects;
 	delete[] _renderData;
@@ -902,6 +901,7 @@
 	_renderData = 0;
 	_orderArray = 0;
 	_vm->_anim->_animSurf = 0;
+	_vm->_draw->_spritesArray[22] = 0;
 }
 
 void Mult_v1::playSound(Snd::SoundDesc * soundDesc, int16 repCount, int16 freq,
@@ -958,9 +958,9 @@
 		delete[] _animArrayData;
 		_animArrayData = 0;
 
-		if (_vm->_anim->_animSurf)
-			_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+		_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
 		_vm->_anim->_animSurf = 0;
+		_vm->_draw->_spritesArray[22] = 0;
 
 		_animDataAllocated = 0;
 	}

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2006-11-20 03:21:09 UTC (rev 24751)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2006-11-20 13:03:30 UTC (rev 24752)
@@ -483,8 +483,11 @@
 				_vm->_anim->_animSurf->height = _vm->_anim->_areaHeight;
 				_vm->_anim->_animSurf->vidPtr +=
 					(_vm->_draw->_backSurface->width * _vm->_draw->_backSurface->height) / 2;
-			} else
+				_vm->_draw->_spritesArray[22] = _vm->_anim->_animSurf;
+			} else {
 				_vm->_draw->initBigSprite(22, _vm->_anim->_areaWidth, _vm->_anim->_areaHeight, 0);
+				_vm->_anim->_animSurf = _vm->_draw->_spritesArray[22];
+			}
 		
 			_vm->_draw->adjustCoords(1, &_vm->_anim->_areaWidth, &_vm->_anim->_areaHeight);
 			_vm->_draw->_sourceSurface = 21;
@@ -569,9 +572,9 @@
 			delete[] _orderArray;
 			_orderArray = 0;
 
-			if (_vm->_anim->_animSurf)
-				_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
+			_vm->_video->freeSurfDesc(_vm->_anim->_animSurf);
 			_vm->_anim->_animSurf = 0;
+			_vm->_draw->_spritesArray[22] = 0;
 
 			_animDataAllocated = 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