[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
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/sky control.cpp,1.32,1.33 control.h,1.16,1.17 logic.cpp,1.116,1.117 sky.cpp,1.81,1.82 sky.h,1.39,1.40
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sky/compacts savedata.cpp,1.3,1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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);
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/sky control.cpp,1.32,1.33 control.h,1.16,1.17 logic.cpp,1.116,1.117 sky.cpp,1.81,1.82 sky.h,1.39,1.40
- Next message: [Scummvm-cvs-logs] CVS: scummvm/sky/compacts savedata.cpp,1.3,1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list