[Scummvm-cvs-logs] CVS: scummvm/sky control.cpp,1.33,1.34 control.h,1.17,1.18 logic.cpp,1.117,1.118 sky.cpp,1.82,1.83

Robert G?ffringmann lavosspawn at users.sourceforge.net
Wed Jul 9 17:09:07 CEST 2003


Update of /cvsroot/scummvm/scummvm/sky
In directory sc8-pr-cvs1:/tmp/cvs-serv5083/sky

Modified Files:
	control.cpp control.h logic.cpp sky.cpp 
Log Message:
implemented fnRestartGame() and skipping of 2nd intro part

Index: control.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sky/control.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- control.cpp	9 Jul 2003 18:12:57 -0000	1.33
+++ control.cpp	10 Jul 2003 00:08:07 -0000	1.34
@@ -391,29 +391,19 @@
 	_statusBar->drawToScreen();
 }
 
-void SkyControl::restartGame(void) {
-	if (SkyState::isDemo() && (!SkyState::isCDVersion()))
-		return; // I don't think this can happen
-
-	/*parseSaveData(_restartData);
-
-	_skyScreen->forceRefresh();
-	_skyScreen->setPalette((uint8 *)SkyState::fetchCompact(SkyState::_systemVars.currentPalette));
-	_skyMouse->spriteMouse(_savedMouse, 0, 0);
-	SkyState::_systemVars.pastIntro = true;*/
-}
-
 void SkyControl::doLoadSavePanel(void) {
 	if (SkyState::isDemo())
 		return; // I don't think this can even happen
 	initPanel();
 	_skyScreen->clearScreen();
-	if ((!SkyState::isCDVersion()) && (SkyState::_systemVars.gameVersion != 348)) 
+	if (SkyState::_systemVars.gameVersion < 331)
 		_skyScreen->setPalette(60509);
 	else
 		_skyScreen->setPalette(60510);
 
 	_savedMouse = _skyMouse->giveCurrentMouseType();
+	_savedCharSet = _skyText->giveCurrentCharSet();
+	_skyText->fnSetFont(0);
 	_skyMouse->spriteMouse(MOUSE_NORMAL,0,0);
 	_lastButton = -1;
 	_curButtonText = 0;
@@ -428,6 +418,7 @@
 	_skyScreen->setPalette((uint8 *)SkyState::fetchCompact(SkyState::_systemVars.currentPalette));
 	removePanel();
 	_skyMouse->spriteMouse(_savedMouse, 0, 0);
+	_skyText->fnSetFont(_savedCharSet);
 }
 
 void SkyControl::doControlPanel(void) {
@@ -1383,8 +1374,10 @@
 	if (srcPos - srcBuf != (int32)size)
 		error("Restore failed! Savegame data = %d bytes. Expected size: %d.\n", srcPos-srcBuf, size);
 
-	_skyLogic->fnLeaveSection(oldSection, 0, 0);
-	_skyLogic->fnEnterSection(SkyLogic::_scriptVariables[CUR_SECTION], 0, 0);
+	if (!SkyState::isDemo()) {
+		_skyLogic->fnLeaveSection(oldSection, 0, 0);
+		_skyLogic->fnEnterSection(SkyLogic::_scriptVariables[CUR_SECTION], 0, 0);
+	}
 	_skyDisk->refreshFilesList(reloadList);
 	_skyMusic->startMusic((uint16)music);
 	_savedMouse = (uint16)mouseType;
@@ -1426,10 +1419,92 @@
 	}
 
 	uint16 res = parseSaveData(saveData);
+	SkyState::_systemVars.pastIntro = true;
 	inf->close();
 	delete inf;
 	free(saveData);
 	return res;
+}
+
+uint16 *SkyControl::lz77decode(uint16 *data) {
+	uint32 size = READ_LE_UINT32(data);
+	data += 2;
+	uint16 *outBuf = (uint16*)malloc(size << 1);
+	uint32 outPos = 0;
+	uint16 lzPos;
+	uint16 lzBuf[0x1000];
+	memset(lzBuf + 0xF00, 0, 0x200);
+	for (lzPos = 0; lzPos < 0xF00; lzPos++)
+		lzBuf[lzPos] = 0xF00 - lzPos;
+	lzPos = 0;
+	uint32 indic = 0;
+	while (outPos < size) {
+		if (!(indic >> 16)) {
+			indic = READ_LE_UINT16(data) | 0xFFFF0000;
+			data++;
+		}
+		if (indic & 1) {
+			lzBuf[lzPos] = outBuf[outPos] = *data;
+			outPos++;
+			lzPos = (lzPos + 1) & 0xFFF;
+		} else {
+			uint16 lzFrom = READ_LE_UINT16(data) >> 4;
+			uint16 lzLen = (READ_LE_UINT16(data) & 0xF) + 2;
+			for (uint16 cnt = 0; cnt < lzLen; cnt++)
+				outBuf[outPos + cnt] = lzBuf[(lzPos + cnt) & 0xFFF] = lzBuf[(lzFrom + cnt) & 0xFFF];
+			
+			outPos += lzLen;
+			lzPos = (lzPos + lzLen) & 0xFFF;
+		}
+		data++;
+		indic >>= 1;
+	}
+	return outBuf;
+}
+
+void SkyControl::applyDiff(uint16 *data, uint16 *diffData) {
+	for (uint16 cnt = 0; cnt < 206; cnt++) {
+		data += READ_LE_UINT16(diffData);
+		diffData++;
+		*data = *diffData;
+		diffData++;
+		data++;
+	}
+}
+
+void SkyControl::restartGame(void) {
+	if (SkyState::_systemVars.gameVersion == 267)
+		return; // no restart for floppy demo
+
+	uint16 *resetData;
+	if (SkyState::isCDVersion())
+		resetData = lz77decode((uint16 *)_resetDataCd);
+	else {
+		resetData = lz77decode((uint16 *)_resetData288);
+		switch (SkyState::_systemVars.gameVersion) {
+			case 303:
+                applyDiff(resetData, (uint16*)_resetDiff303);
+				break;
+			case 331:
+				applyDiff(resetData, (uint16*)_resetDiff331);
+				break;
+			case 348:
+				applyDiff(resetData, (uint16*)_resetDiff348);
+				break;
+			default:
+				break;
+		}
+	}
+	// ok, we finally have our savedata
+
+	parseSaveData((uint8*)resetData);
+	free(resetData);
+	_skyScreen->forceRefresh();
+	memset(_skyScreen->giveCurrent(), GAME_SCREEN_WIDTH * FULL_SCREEN_HEIGHT, 0);
+	//_skyScreen->showScreen(_skyScreen->giveCurrent());
+	_skyScreen->setPalette((uint8 *)SkyState::fetchCompact(SkyState::_systemVars.currentPalette));
+	_skyMouse->spriteMouse(_savedMouse, 0, 0);
+	SkyState::_systemVars.pastIntro = true;
 }
 
 void SkyControl::delay(unsigned int amount) {

Index: control.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sky/control.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- control.h	9 Jul 2003 18:12:57 -0000	1.17
+++ control.h	10 Jul 2003 00:08:07 -0000	1.18
@@ -215,9 +215,15 @@
 	void lodsStr(uint8 **srcPos, uint16 *src);
 	uint16 parseSaveData(uint8 *srcBuf);
 
-	static Compact *_saveLoadCpts[833]; // moved to sky/compacts/savedata.cpp
-	//static uint8 _restartData[0xCC10];
 	const char *_savePath;
+	uint16 *lz77decode(uint16 *data);
+	void applyDiff(uint16 *data, uint16 *diffData);
+	static Compact *_saveLoadCpts[833]; //-----------------
+	static uint8 _resetData288[0x39F2];
+	static uint8 _resetDiff303[824];    // moved to sky/compacts/savedata.cpp
+	static uint8 _resetDiff331[824];
+	static uint8 _resetDiff348[824];
+	static uint8 _resetDataCd[0x3FDC];  //-----------------
 
 	AllocedMem *_memListRoot;
 	void appendMemList(uint16 *pMem);

Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sky/logic.cpp,v
retrieving revision 1.117
retrieving revision 1.118
diff -u -d -r1.117 -r1.118
--- logic.cpp	9 Jul 2003 18:12:57 -0000	1.117
+++ logic.cpp	10 Jul 2003 00:08:07 -0000	1.118
@@ -2262,8 +2262,7 @@
 
 bool SkyLogic::fnRestartGame(uint32 a, uint32 b, uint32 c) {
 	
-	error("Stub: fnRestartGame()");
-	//_skyControl->restartGame();
+	_skyControl->restartGame();
 	return false;
 }
 

Index: sky.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sky/sky.cpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -d -r1.82 -r1.83
--- sky.cpp	9 Jul 2003 18:12:58 -0000	1.82
+++ sky.cpp	10 Jul 2003 00:08:07 -0000	1.83
@@ -116,7 +116,7 @@
 	initialise();
 
 	bool introSkipped;
-	if (!isDemo() || isCDVersion())
+	if (_systemVars.gameVersion != 267) // don't do intro for floppydemo
 		introSkipped = !intro();
 	else introSkipped = false;
 
@@ -126,8 +126,8 @@
 
 	_paintGrid = false;
 
-	/*if (introSkipped)
-		_skyControl->restartGame();*/
+	if (introSkipped)
+		_skyControl->restartGame();
 
 	while (1) {
 		delay(_systemVars.gameSpeed);
@@ -148,8 +148,10 @@
 			_key_pressed = 0;
 			_skyControl->doControlPanel();
 		}			
-		/*if ((_key_pressed == 27) && (!_systemVars.pastIntro))
-			_skyControl->restartGame();*/
+		if ((_key_pressed == 27) && (!_systemVars.pastIntro)) {
+			_skyControl->restartGame();
+			_key_pressed = 0;
+		}
 
 		_skySound->checkFxQueue();
 		_skyMouse->mouseEngine((uint16)_sdl_mouse_x, (uint16)_sdl_mouse_y);





More information about the Scummvm-git-logs mailing list