diff options
Diffstat (limited to 'sky')
-rw-r--r-- | sky/control.cpp | 37 | ||||
-rw-r--r-- | sky/control.h | 1 | ||||
-rw-r--r-- | sky/sky.cpp | 22 | ||||
-rw-r--r-- | sky/sky.h | 1 |
4 files changed, 54 insertions, 7 deletions
diff --git a/sky/control.cpp b/sky/control.cpp index 0880a5b3c6..c398cb2ea5 100644 --- a/sky/control.cpp +++ b/sky/control.cpp @@ -1461,7 +1461,7 @@ uint16 SkyControl::restoreGameFromFile(bool autoSave) { else sprintf(fName, "SKY-VM%03d.ASD", SkyState::_systemVars.gameVersion); } else - sprintf(fName,"SKY-VM.%03d", _selectedGame); + sprintf(fName,"SKY-VM.%03d", _selectedGame); File inf; if (!inf.open(fName, _savePath)) { @@ -1491,6 +1491,41 @@ uint16 SkyControl::restoreGameFromFile(bool autoSave) { return res; } +uint16 SkyControl::quickXRestore(uint16 slot) { + uint16 result; + initPanel(); + _mouseClicked = false; + + _savedCharSet = _skyText->giveCurrentCharSet(); + _skyText->fnSetFont(0); + + if (SkyState::_systemVars.gameVersion < 331) + _skyScreen->setPalette(60509); + else + _skyScreen->setPalette(60510); + + _savedMouse = _skyMouse->giveCurrentMouseType(); + _skyMouse->spriteMouse(MOUSE_NORMAL,0,0); + + if (slot == 0) + result = restoreGameFromFile(true); + else { + _selectedGame = slot - 1; + result = restoreGameFromFile(false); + } + if (result == GAME_RESTORED) { + memset(_skyScreen->giveCurrent(), 0, GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT); + _skyScreen->showScreen(_skyScreen->giveCurrent()); + _skyScreen->forceRefresh(); + } + _skyScreen->setPaletteEndian((uint8 *)SkyState::fetchCompact(SkyState::_systemVars.currentPalette)); + _skyMouse->spriteMouse(_savedMouse, 0, 0); + _skyText->fnSetFont(_savedCharSet); + + removePanel(); + return result; +} + uint16 *SkyControl::lz77decode(uint16 *data) { uint32 size = READ_LE_UINT32(data); data += 2; diff --git a/sky/control.h b/sky/control.h index 7b23fe3d84..2b754e0a1c 100644 --- a/sky/control.h +++ b/sky/control.h @@ -173,6 +173,7 @@ public: void restartGame(void); void showGameQuitMsg(bool useScreen = true); void doAutoSave(void); + uint16 quickXRestore(uint16 slot); private: void initPanel(void); diff --git a/sky/sky.cpp b/sky/sky.cpp index 3a444da83e..25e51c40a1 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -179,14 +179,15 @@ void SkyState::go() { initialise(); - bool introSkipped; - if (_systemVars.gameVersion != 267) // don't do intro for floppydemo - introSkipped = !intro(); - else introSkipped = false; + bool introSkipped = false; + if (!_quickLaunch) { + if (_systemVars.gameVersion != 267) // don't do intro for floppydemo + introSkipped = !intro(); - _skyDisk->flushPrefetched(); + _skyDisk->flushPrefetched(); - loadBase0(); + loadBase0(); + } if (introSkipped) _skyControl->restartGame(); @@ -266,6 +267,15 @@ void SkyState::initialise(void) { if (_systemVars.gameVersion == 288) SkyCompact::patchFor288(); + + uint16 result = 0; + if (_detector->_save_slot >= 0) + result = _skyControl->quickXRestore(_detector->_save_slot); + + if (result == GAME_RESTORED) + _quickLaunch = true; + else + _quickLaunch = false; } void SkyState::initItemList() { @@ -62,6 +62,7 @@ protected: byte _game; byte _key_pressed; static uint8 _languageTable[11]; + bool _quickLaunch; // set when starting with -x //intro related |