[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.36,1.37 kyra.h,1.12,1.13 screen.cpp,1.4,1.5 screen.h,1.3,1.4

Gregory Montoir cyx at users.sourceforge.net
Fri Sep 2 04:13:07 CEST 2005


Update of /cvsroot/scummvm/scummvm/kyra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19380/kyra

Modified Files:
	kyra.cpp kyra.h screen.cpp screen.h 
Log Message:
added special sequence opcode 8

Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- kyra.cpp	31 Aug 2005 20:14:19 -0000	1.36
+++ kyra.cpp	2 Sep 2005 11:12:09 -0000	1.37
@@ -184,6 +184,7 @@
 
 int KyraEngine::go() {
 	_quitFlag = false;
+	_screen->setScreenDim(0);
 	seq_intro();
 	return 0;
 }
@@ -237,7 +238,7 @@
 int KyraEngine::dropCRIntoString(char *str, int offs) {
 	debug(9, "KyraEngine::dropCRIntoString('%s', %d)", str, offs);
 	int pos = 0;
-	while (*str != '\0') {
+	while (*str) {
 		if (*str == 0x20) {
 			*str = 0xD;
 			return pos;
@@ -609,7 +610,11 @@
 			}
 			break;
 		case 8:
-			warning("Sequence opcode 8 skipped");
+			_screen->shuffleScreen(0, 16, 320, 128, 2, 0, 0, false);
+			_screen->_curPage = 2;
+			if (_seq_specialSequenceTempBuffer) {
+				_screen->copyCurPageBlock(0, 16, 40, 128, _seq_specialSequenceTempBuffer);
+			}
 			break;
 		case 9:
 			seq_copyView();

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- kyra.h	31 Aug 2005 20:14:19 -0000	1.12
+++ kyra.h	2 Sep 2005 11:12:09 -0000	1.13
@@ -71,6 +71,8 @@
 	Screen *screen() { return _screen; }
 
 	uint8 game() const { return _game; }
+	
+	Common::RandomSource _rnd;
 
 protected:
 

Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- screen.cpp	31 Aug 2005 20:14:19 -0000	1.4
+++ screen.cpp	2 Sep 2005 11:12:09 -0000	1.5
@@ -72,6 +72,7 @@
 
 int Screen::setCurPage(int pageNum) {
 	debug(9, "Screen::setCurPage(%d)", pageNum);
+	assert(pageNum < SCREEN_PAGE_NUM);
 	int previousPage = _curPage;
 	_curPage = pageNum;
 	return previousPage;
@@ -82,6 +83,20 @@
 	memset(getPagePtr(_curPage), 0, SCREEN_PAGE_SIZE);
 }
 
+uint8 Screen::getPagePixel(int pageNum, int x, int y) {
+	debug(9, "Screen::getPagePixel(%d, %d, %d)", pageNum, x, y);
+	assert(pageNum < SCREEN_PAGE_NUM);
+	assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H);
+	return _pagePtrs[pageNum][y * SCREEN_W + x];
+}
+
+void Screen::setPagePixel(int pageNum, int x, int y, uint8 color) {
+	debug(9, "Screen::setPagePixel(%d, %d, %d, %d)", pageNum, x, y, color);
+	assert(pageNum < SCREEN_PAGE_NUM);
+	assert(x >= 0 && x < SCREEN_W && y >= 0 && y < SCREEN_H);
+	_pagePtrs[pageNum][y * SCREEN_W + x] = color;
+}
+
 void Screen::fadeFromBlack() {
 	debug(9, "Screen::fadeFromBlack()");
 	memset(_palette3, 0, 768);
@@ -145,6 +160,74 @@
 	}
 }
 
+void Screen::copyCurPageBlock(int x, int y, int h, int w, uint8 *dst) {
+	debug(9, "Screen::copyCurPageBlock(%d, %d, %d, %d, 0x%X)", x, y, w, h, dst);
+	if (x < 0) {
+		x = 0;	
+	} else if (x >= 40) {
+		return;
+	}
+	if (x + w > 40) {
+		w = 40 - x;
+	}
+	if (y < 0) {
+		y = 0;
+	} else if (y >= 200) {
+		return;
+	}
+	if (y + h > 200) {
+		h = 200 - y;
+	}
+	const uint8 *src = getPagePtr(_curPage) + y * SCREEN_W + x * 8;
+	while (h--) {
+		memcpy(dst, src, w * 8);
+		dst += SCREEN_W;
+		src += SCREEN_H;
+	}
+}
+
+void Screen::shuffleScreen(int sx, int sy, int w, int h, int srcPage, int dstPage, int ticks, bool transparent) {
+	debug(9, "Screen::shuffleScreen(%d, %d, %d, %d, %d, %d, %d, %d)", sx, sy, w, h, srcPage, dstPage, ticks, transparent);
+	assert(sx >= 0 && w <= SCREEN_W);
+	int x;
+	uint16 x_offs[SCREEN_W];
+	for (x = 0; x < SCREEN_W; ++x) {
+		x_offs[x] = x;
+	}
+	for (x = 0; x < w; ++x) {
+		int i = _vm->_rnd.getRandomNumber(w - 1);
+		SWAP(x_offs[x], x_offs[i]);
+	}
+	
+	assert(sy >= 0 && h <= SCREEN_H);
+	int y;
+	uint8 y_offs[SCREEN_H];
+	for (y = 0; y < SCREEN_H; ++y) {
+		y_offs[y] = y;
+	}
+	for (y = 0; y < h; ++y) {
+		int i = _vm->_rnd.getRandomNumber(h - 1);
+		SWAP(y_offs[y], y_offs[i]);
+	}
+	
+	for (y = 0; y < h; ++y) {
+		int y_cur = y;
+		for (x = 0; x < w; ++x) {
+			int i = sx + x_offs[x];
+			int j = sy + y_offs[y_cur];
+			++y_cur;
+			if (y_cur >= h) {
+				y_cur = 0;
+			}
+			uint8 color = getPagePixel(srcPage, i, j);
+			if (!transparent || color != 0) {
+				setPagePixel(dstPage, i, j, color);
+			}
+		}
+		_system->delayMillis(ticks * 1000 / 60);
+	}
+}
+
 void Screen::fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum) {
 	debug(9, "Screen::fillRect(%d, %d, %d, %d, %d, %d)", x1, y1, x2, y2, color, pageNum);
 	assert(x2 < SCREEN_W && y2 < SCREEN_H);
@@ -209,22 +292,22 @@
 	debug(9, "Screen::drawShape(%d, %d, %d, %d, %d)", pageNum, x, y, sd, flags);
 	assert(shapeData);
 	if (flags & 0x8000) {
-		warning("unhandled (flags & 0x8000) in Video::drawShape()");
+		warning("unhandled (flags & 0x8000) in Screen::drawShape()");
 	}
 	if (flags & 0x100) {
-		warning("unhandled (flags & 0x100) in Video::drawShape()");
+		warning("unhandled (flags & 0x100) in Screen::drawShape()");
 	}
 	if (flags & 0x1000) {
-		warning("unhandled (flags & 0x1000) in Video::drawShape()");
+		warning("unhandled (flags & 0x1000) in Screen::drawShape()");
 	}
 	if (flags & 0x200) {
-		warning("unhandled (flags & 0x200) in Video::drawShape()");
+		warning("unhandled (flags & 0x200) in Screen::drawShape()");
 	}
 	if (flags & 0x4000) {
-		warning("unhandled (flags & 0x4000) in Video::drawShape()");
+		warning("unhandled (flags & 0x4000) in Screen::drawShape()");
 	}
 	if (flags & 0x800) {
-		warning("unhandled (flags & 0x800) in Video::drawShape()");
+		warning("unhandled (flags & 0x800) in Screen::drawShape()");
 	}
 	int scale_w, scale_h;
 	if (flags & DSF_SCALE) {

Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- screen.h	31 Aug 2005 20:14:20 -0000	1.3
+++ screen.h	2 Sep 2005 11:12:09 -0000	1.4
@@ -53,12 +53,16 @@
 	void clearPage(int pageNum);
 	int setCurPage(int pageNum);
 	void clearCurPage();
+	uint8 getPagePixel(int pageNum, int x, int y);
+	void setPagePixel(int pageNum, int x, int y, uint8 color);
 	void fadeFromBlack();
 	void fadeToBlack();
 	void setScreenPalette(const uint8 *palData);
 	void copyToPage0(int y, int h, uint8 page, uint8 *seqBuf);
 	void copyRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
 	void copyBlockToPage(int pageNum, int x, int y, int w, int h, const uint8 *src);
+	void copyCurPageBlock(int x, int y, int h, int w, uint8 *dst);
+	void shuffleScreen(int sx, int sy, int w, int h, int srcPage, int dstPage, int ticks, bool transparent);
 	void fillRect(int x1, int y1, int x2, int y2, uint8 color, int pageNum = -1);
 	void setAnimBlockPtr(uint8 *p, int size);
 	void setTextColorMap(const uint8 *cmap);





More information about the Scummvm-git-logs mailing list