[Scummvm-cvs-logs] SF.net SVN: scummvm: [21637] scummvm/trunk/engines/simon

kirben at users.sourceforge.net kirben at users.sourceforge.net
Wed Apr 5 23:16:00 CEST 2006


Revision: 21637
Author:   kirben
Date:     2006-04-05 23:14:47 -0700 (Wed, 05 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21637&view=rev

Log Message:
-----------
Add some work on scrolling in FF

Modified Paths:
--------------
    scummvm/trunk/engines/simon/debug.cpp
    scummvm/trunk/engines/simon/debug.h
    scummvm/trunk/engines/simon/simon.cpp
    scummvm/trunk/engines/simon/simon.h
    scummvm/trunk/engines/simon/vga.cpp
Modified: scummvm/trunk/engines/simon/debug.cpp
===================================================================
--- scummvm/trunk/engines/simon/debug.cpp	2006-04-06 01:37:29 UTC (rev 21636)
+++ scummvm/trunk/engines/simon/debug.cpp	2006-04-06 06:14:47 UTC (rev 21637)
@@ -210,13 +210,10 @@
 			case 'b':
 				fprintf(_dumpFile, "%d ", *src++);
 				break;
-			case 'd': {
-					int16 tmp = (int16)readUint16Wrapper(src);
-					if (tmp < 0) tmp = vcReadVar(-tmp);
-					fprintf(_dumpFile, "%d ", tmp);
-					src += 2;
-					break;
-				}
+			case 'd':
+				fprintf(_dumpFile, "%d ", (int16)readUint16Wrapper(src));
+				src += 2;
+				break;
 			case 'v':
 				fprintf(_dumpFile, "[%d] ", readUint16Wrapper(src));
 				src += 2;

Modified: scummvm/trunk/engines/simon/debug.h
===================================================================
--- scummvm/trunk/engines/simon/debug.h	2006-04-06 01:37:29 UTC (rev 21636)
+++ scummvm/trunk/engines/simon/debug.h	2006-04-06 06:14:47 UTC (rev 21637)
@@ -145,16 +145,16 @@
 	NULL,
 	/* 96 */
 	"WB|UNK_96",
-	"W|LOAD_VGA",
+	"W|LOAD_ZONE",
 	"WBWWW|START_VGA",
 	"W|KILL_SPRITE",
 	/* 100 */
 	"|VGA_RESET",
-	"BWWWWWW|UNK_101",
-	"B|UNK_102",
+	"BWWWWWW|DEFINE_WINDOW",
+	"B|CHANGE_WINDOW",
 	"|UNK_103",
 	/* 104 */
-	"B|UNK_104",
+	"B|CLOSE_WINDOW",
 	NULL,
 	NULL,
 	"WWWWWIW|ADD_ITEM_HITAREA",
@@ -172,9 +172,9 @@
 	"IB|SET_FLAG",
 	"IB|CLEAR_FLAG",
 	NULL,
-	"W|WAIT_VGA",
+	"W|WAIT_SYNC",
 	/* 120 */
-	"W|UNK_120",
+	"W|SYNC",
 	"BI|SET_VGA_ITEM",
 	NULL,
 	NULL,
@@ -383,16 +383,16 @@
 	NULL,
 	/* 96 */
 	"WB|UNK_96",
-	"W|LOAD_VGA",
+	"W|LOAD_ZONE",
 	"WBWWW|START_VGA",
 	"W|KILL_SPRITE",
 	/* 100 */
 	"|VGA_RESET",
-	"BWWWWWW|UNK_101",
-	"B|UNK_102",
+	"BWWWWWW|DEFINE_WINDOW",
+	"B|CHANGE_WINDOW",
 	"|UNK_103",
 	/* 104 */
-	"B|UNK_104",
+	"B|CLOSE_WINDOW",
 	NULL,
 	NULL,
 	"WWWWWIW|ADD_ITEM_HITAREA",
@@ -410,9 +410,9 @@
 	"IB|SET_FLAG",
 	"IB|CLEAR_FLAG",
 	NULL,
-	"W|WAIT_VGA",
+	"W|WAIT_SYNC",
 	/* 120 */
-	"W|UNK_120",
+	"W|SYNC",
 	"BI|SET_VGA_ITEM",
 	NULL,
 	NULL,
@@ -621,16 +621,16 @@
 	NULL,
 	/* 96 */
 	"WB|UNK_96",
-	"W|LOAD_VGA",
+	"W|LOAD_ZONE",
 	"WWBWWW|START_VGA",
 	"WW|KILL_SPRITE",
 	/* 100 */
 	"|VGA_RESET",
-	"BWWWWWW|UNK_101",
-	"B|UNK_102",
+	"BWWWWWW|DEFINE_WINDOW",
+	"B|CHANGE_WINDOW",
 	"|UNK_103",
 	/* 104 */
-	"B|UNK_104",
+	"B|CLOSE_WINDOW",
 	NULL,
 	NULL,
 	"WWWWWIW|ADD_ITEM_HITAREA",
@@ -648,9 +648,9 @@
 	"IB|SET_FLAG",
 	"IB|CLEAR_FLAG",
 	NULL,
-	"W|WAIT_VGA",
+	"W|WAIT_SYNC",
 	/* 120 */
-	"W|UNK_120",
+	"W|SYNC",
 	"BI|SET_VGA_ITEM",
 	NULL,
 	NULL,
@@ -863,16 +863,16 @@
 	NULL,
 	/* 96 */
 	"WB|UNK_96",
-	"W|LOAD_VGA",
+	"W|LOAD_ZONE",
 	"WWBWWW|START_VGA",
 	"WW|KILL_SPRITE",
 	/* 100 */
 	"|VGA_RESET",
-	"BWWWWWW|UNK_101",
-	"B|UNK_102",
+	"BWWWWWW|DEFINE_WINDOW",
+	"B|CHANGE_WINDOW",
 	"|UNK_103",
 	/* 104 */
-	"B|UNK_104",
+	"B|CLOSE_WINDOW",
 	NULL,
 	NULL,
 	"WWWWWIW|ADD_ITEM_HITAREA",
@@ -890,9 +890,9 @@
 	"IB|SET_FLAG",
 	"IB|CLEAR_FLAG",
 	NULL,
-	"W|WAIT_VGA",
+	"W|WAIT_SYNC",
 	/* 120 */
-	"W|UNK_120",
+	"W|SYNC",
 	"BI|SET_VGA_ITEM",
 	NULL,
 	NULL,
@@ -1105,16 +1105,16 @@
 	NULL,
 	/* 96 */
 	"WB|UNK_96",
-	"W|LOAD_VGA",
+	"W|LOAD_ZONE",
 	"WWBWWW|START_VGA",
 	"WW|KILL_SPRITE",
 	/* 100 */
 	"|VGA_RESET",
-	"BWWWWWW|UNK_101",
-	"B|UNK_102",
+	"BWWWWWW|DEFINE_WINDOW",
+	"B|CHANGE_WINDOW",
 	"|UNK_103",
 	/* 104 */
-	"B|UNK_104",
+	"B|CLOSE_WINDOW",
 	NULL,
 	NULL,
 	"WWWWWIW|ADD_ITEM_HITAREA",
@@ -1132,9 +1132,9 @@
 	"IB|SET_FLAG",
 	"IB|CLEAR_FLAG",
 	NULL,
-	"W|WAIT_VGA",
+	"W|WAIT_SYNC",
 	/* 120 */
-	"W|UNK_120",
+	"W|SYNC",
 	"BI|SET_VGA_ITEM",
 	"ORACLE_TEXT_DOWN",
 	"ORACLE_TEXT_UP",
@@ -1185,7 +1185,7 @@
 	NULL,
 	/* 160 */
 	"B|UNK_160",
-	"BWBW|SETUP_TEXT",
+	"BWWW|SETUP_TEXT",
 	"BBTW|PRINT_STR",
 	"W|SOUND_1",
 	/* 164 */

Modified: scummvm/trunk/engines/simon/simon.cpp
===================================================================
--- scummvm/trunk/engines/simon/simon.cpp	2006-04-06 01:37:29 UTC (rev 21636)
+++ scummvm/trunk/engines/simon/simon.cpp	2006-04-06 06:14:47 UTC (rev 21637)
@@ -392,6 +392,7 @@
 
 	memset(_bitArray, 0, sizeof(_bitArray));
 	memset(_variableArray, 0, sizeof(_variableArray));
+	memset(_variableArray2, 0, sizeof(_variableArray2));
 
 	memset(_windowArray, 0, sizeof(_windowArray));
 
@@ -1054,7 +1055,11 @@
 uint SimonEngine::readVariable(uint variable) {
 	if (variable >= 255)
 		error("Variable %d out of range in read", variable);
-	return _variableArray[variable];
+
+	if (getGameType() == GType_FF && getBitFlag(83))
+		return _variableArray2[variable];
+	else
+		return _variableArray[variable];
 }
 
 void SimonEngine::writeNextVarContents(uint16 contents) {
@@ -1064,7 +1069,11 @@
 void SimonEngine::writeVariable(uint variable, uint16 contents) {
 	if (variable >= 256)
 		error("Variable %d out of range in write", variable);
-	_variableArray[variable] = contents;
+
+	if (getGameType() == GType_FF && getBitFlag(83))
+		_variableArray2[variable] = contents;
+	else
+		_variableArray[variable] = contents;
 }
 
 void SimonEngine::setItemParent(Item *item, Item *parent) {
@@ -2352,8 +2361,11 @@
 		_scrollCount = 0;
 		_scrollFlag = 0;
 		_scrollHeight = 134;
-		if (_variableArray[34] != -1)
+		if (_variableArray[34] != -1) {
+			if (getGameType() == GType_FF)
+				_variableArray[250] = 0;
 			_variableArray[251] = 0;
+		}
 	}
 
 	vc_ptr_org = _vcPtr;
@@ -2612,8 +2624,8 @@
 	if (_paletteFlag == 2)
 		_paletteFlag = 1;
 
-	if (getGameType() == GType_SIMON2 && _scrollFlag) {
-		timer_vga_sprites_helper();
+	if ((getGameType() == GType_SIMON2 || getGameType() == GType_FF) && _scrollFlag) {
+		scrollEvent();
 	}
 
 	vsp = _vgaSprites;
@@ -2653,7 +2665,7 @@
 	_vcPtr = vc_ptr_org;
 }
 
-void SimonEngine::timer_vga_sprites_helper() {
+void SimonEngine::scrollEvent() {
 	byte *dst = getFrontBuf();
 	const byte *src;
 	uint x;
@@ -2664,15 +2676,21 @@
 		memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8);
 	}
 
-	x = _scrollX - 1;
+	x = _scrollX;
+	x -= (getGameType() == GType_FF) ? 8 : 1;
 
 	if (_scrollFlag > 0) {
 		dst += _screenWidth - 8;
-		x += 41;
+		x += (getGameType() == GType_FF) ? 648 : 41;
 	}
 
-	src = _scrollImage + x * 4;
-	decodeStripA(dst, src + READ_BE_UINT32(src), _scrollHeight);
+	if (getGameType() == GType_FF) {
+		src = _scrollImage + x / 2;
+		decodeStripA(dst, src + READ_LE_UINT32(src), _scrollHeight);
+	} else {
+		src = _scrollImage + x * 4;
+		decodeStripA(dst, src + READ_BE_UINT32(src), _scrollHeight);
+	}
 
 	memcpy(_sdl_buf_attached, _sdl_buf, _screenWidth * _screenHeight);
 	dx_copy_from_attached_to_3(_scrollHeight);
@@ -2905,6 +2923,11 @@
 	uint x_diff, y_diff;
 	uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF;
 
+	if (getGameType() == GType_FF) {
+		x += _scrollX;
+		y += _scrollY;
+	}
+
 	if (getGameType() == GType_SIMON2) {
 		x += _scrollX * 8;
 	}
@@ -2933,8 +2956,13 @@
 		}
 	}
 
-	_variableArray[var_1] = best_i;
-	_variableArray[var_2] = best_j;
+	if (getGameType() == GType_FF && getBitFlag(83)) {
+		_variableArray[var_1] = best_i;
+		_variableArray[var_2] = best_j;
+	} else {
+		_variableArray[var_1] = best_i;
+		_variableArray[var_2] = best_j;
+	}
 }
 
 // ok

Modified: scummvm/trunk/engines/simon/simon.h
===================================================================
--- scummvm/trunk/engines/simon/simon.h	2006-04-06 01:37:29 UTC (rev 21636)
+++ scummvm/trunk/engines/simon/simon.h	2006-04-06 06:14:47 UTC (rev 21637)
@@ -371,6 +371,7 @@
 
 	uint16 _bitArray[48];
 	int16 _variableArray[256];
+	int16 _variableArray2[256];
 
 	WindowBlock *_windowArray[8];
 
@@ -814,6 +815,8 @@
 	void vcSkipNextInstruction();
 
 	int getScale(int y, int x);
+	void checkScrollX(int x);
+	void checkScrollY(int y);
 
 	bool itemIsSiblingOf(uint16 val);
 	bool itemIsParentOf(uint16 a, uint16 b);
@@ -901,7 +904,7 @@
 
 	void o_83_helper();
 	void o_waitForMark(uint i);
-	void timer_vga_sprites_helper();
+	void scrollEvent();
 
 	void decodeStripA(byte *dst, const byte *src, int height);
 	void scroll_timeout();

Modified: scummvm/trunk/engines/simon/vga.cpp
===================================================================
--- scummvm/trunk/engines/simon/vga.cpp	2006-04-06 01:37:29 UTC (rev 21636)
+++ scummvm/trunk/engines/simon/vga.cpp	2006-04-06 06:14:47 UTC (rev 21637)
@@ -723,7 +723,31 @@
 
 	if (getGameType() == GType_FF) {
 		if (width > 640) {
-			debug(0, "Horizontal scrolling not supported");
+			debug(0, "Horizontal scrolling");
+
+			const byte *src;
+			byte *dst;
+			uint w;
+
+			_scrollXMax = 640;
+			_scrollYMax = 0;
+			_scrollImage = state.depack_src;
+			_scrollHeight = height;
+			if (_variableArray[34] == -1)
+				state.x = _variableArray[251];
+
+			_scrollX = state.x;
+
+			vcWriteVar(251, _scrollX);
+
+			dst = getBackBuf();
+			src = state.depack_src + (_scrollX - 8) / 2;
+
+			for (w = 0; w < 80; w++) {
+				decodeStripA(dst, src + READ_LE_UINT32(src), height);
+				dst += 8;
+				src += 4;
+			}
 			return;
 		}
 		if (height > 480) {
@@ -1832,7 +1856,7 @@
 
 		y = vsp->y;
 		vsp->y = y1;
-		//checkScrollY(y, diff);
+		checkScrollY(y1 - y);
 
 		_variableArray[11] = readUint16Wrapper(p);
 		_variableArray[13] = pos;
@@ -2311,9 +2335,7 @@
 	vsp->x += getScale(vsp->y, x);
 	_variableArray[var] = vsp->x;
 
-	if (_scrollXMax) {
-		// TODO: Scroll check
-	}
+	checkScrollX(x);
 
 	vsp->flags = kDFScaled;
 }
@@ -2322,11 +2344,14 @@
 	VgaSprite *vsp = findCurSprite();
 
 	vsp->image = vcReadNextWord();
-	int16 x = vcReadNextWord();
+	int16 y = vcReadNextWord();
 	int var = vcReadNextWord();
 
-	vsp->y += getScale(vsp->y, x);
+	vsp->y += getScale(vsp->y, y);
 	_variableArray[var] = vsp->y;
+
+	checkScrollY(y);
+
 	vsp->flags = kDFScaled;
 }
 
@@ -2412,4 +2437,86 @@
 	debug(0, "STUB: vc84_stopSoundLoop");
 }
 
+// Scrolling functions for Feeble Files
+void SimonEngine::checkScrollX(int x) {
+	if (_scrollXMax == 0 || getBitFlag(80) || getBitFlag(82) || x == 0)
+		return;
+
+	int16 tmp;
+	if (x > 0) {
+		if (_scrollCount != 0) {
+			if (_scrollCount >= 0)
+				return;
+			_scrollCount = 0;
+		} else {
+			if (_scrollFlag != 0)
+				return;
+		}
+
+		if (x - _scrollX >= 480) {
+			_scrollCount = 320;
+			tmp = _scrollXMax - _scrollX;
+			if (tmp < 320)
+				_scrollCount = tmp;
+		}
+	} else {
+		if (_scrollCount != 0) {
+			if (_scrollCount < 0)
+				return;
+			_scrollCount = 0;
+		} else {
+			if (_scrollFlag != 0)
+				return;
+		}
+
+		if ((uint16)(x - _scrollX) < 161) {
+			_scrollCount = -320;
+			tmp = _scrollXMax - _scrollX;
+			if (_scrollX < 320)
+				_scrollCount = -_scrollX;
+		}
+	}
+}
+
+void SimonEngine::checkScrollY(int y) {
+	if (_scrollYMax == 0 || getBitFlag(80))
+		return;
+
+	int16 tmp;
+	if (y > 0) {
+		if (_scrollCount != 0) {
+			if (_scrollCount >= 0)
+				return;
+			_scrollCount = 0;
+		} else {
+			if (_scrollFlag != 0)
+				return;
+		}
+
+		if (y - _scrollY >= 440) {
+			_scrollCount = 240;
+			tmp = _scrollYMax - _scrollY;
+			if (tmp < 240)
+				_scrollCount = tmp;
+		}
+	} else {
+		if (_scrollCount != 0) {
+			if (_scrollCount < 0)
+				return;
+			_scrollCount = 0;
+		} else {
+			if (_scrollFlag != 0)
+				return;
+		}
+
+		if ((uint16)(y - _scrollY) < 100) {
+			_scrollCount = -240;
+			tmp = _scrollYMax - _scrollY;
+			if (_scrollY < 240)
+				_scrollCount = -_scrollY;
+		}
+	}
+}
+
+
 } // End of namespace Simon


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