SKY: Ensure _systemVars is freed when quiting the game

Returning to launcher via ScummVM popup menu would retain the values of _systemVars

This would cause relaunching the game (after returning back to launcher) to have wrong value for eg. pastIntro, thus allowing "Save" from the ScummVM popup menu during the intro sequence.
This commit is contained in:
antoniou79 2020-07-29 17:25:26 +03:00
parent 3d4940b22d
commit 52eee0c696
15 changed files with 169 additions and 132 deletions

View File

@ -215,7 +215,7 @@ SkyCompact::SkyCompact() {
uint16 diffSize = _cptFile->readUint16LE();
uint16 *diffBuf = (uint16 *)malloc(diffSize * sizeof(uint16));
_cptFile->read(diffBuf, diffSize * sizeof(uint16));
if (SkyEngine::_systemVars.gameVersion == 288) {
if (SkyEngine::_systemVars->gameVersion == 288) {
uint16 *diffPos = diffBuf;
for (cnt = 0; cnt < numDiffs; cnt++) {
uint16 cptId = READ_LE_UINT16(diffPos++);

View File

@ -281,7 +281,7 @@ void Control::initPanel() {
memset(_screenBuf, 0, GAME_SCREEN_WIDTH * FULL_SCREEN_HEIGHT);
uint16 volY = (127 - _skyMusic->giveVolume()) / 4 + 59 - MPNL_Y; // volume slider's Y coordinate
uint16 spdY = (SkyEngine::_systemVars.gameSpeed - 2) / SPEED_MULTIPLY;
uint16 spdY = (SkyEngine::_systemVars->gameSpeed - 2) / SPEED_MULTIPLY;
spdY += MPNL_Y + 83; // speed slider's initial position
_sprites.controlPanel = _skyDisk->loadFile(60500);
@ -293,7 +293,7 @@ void Control::initPanel() {
_sprites.slode = _skyDisk->loadFile(60506);
_sprites.slode2 = _skyDisk->loadFile(60507);
_sprites.slide2 = _skyDisk->loadFile(60508);
if (SkyEngine::_systemVars.gameVersion < 368)
if (SkyEngine::_systemVars->gameVersion < 368)
_sprites.musicBodge = NULL;
else
_sprites.musicBodge = _skyDisk->loadFile(60509);
@ -447,7 +447,7 @@ void Control::drawMainPanel() {
_slide2->drawToScreen(WITH_MASK);
_bodge->drawToScreen(WITH_MASK);
if (SkyEngine::isCDVersion())
drawTextCross(SkyEngine::_systemVars.systemFlags & TEXT_FLAG_MASK);
drawTextCross(SkyEngine::_systemVars->systemFlags & TEXT_FLAG_MASK);
_statusBar->drawToScreen();
}
@ -456,7 +456,7 @@ void Control::doLoadSavePanel() {
return; // I don't think this can even happen
initPanel();
_skyScreen->clearScreen();
if (SkyEngine::_systemVars.gameVersion < 331)
if (SkyEngine::_systemVars->gameVersion < 331)
_skyScreen->setPalette(60509);
else
_skyScreen->setPalette(60510);
@ -474,7 +474,7 @@ void Control::doLoadSavePanel() {
_system->copyRectToScreen(_screenBuf, GAME_SCREEN_WIDTH, 0, 0, GAME_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
_system->updateScreen();
_skyScreen->forceRefresh();
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars->currentPalette));
removePanel();
_skyMouse->spriteMouse(_savedMouse, 0, 0);
_skyText->fnSetFont(_savedCharSet);
@ -491,19 +491,19 @@ void Control::doControlPanel() {
_skyText->fnSetFont(2);
_skyScreen->clearScreen();
if (SkyEngine::_systemVars.gameVersion < 331)
if (SkyEngine::_systemVars->gameVersion < 331)
_skyScreen->setPalette(60509);
else
_skyScreen->setPalette(60510);
// Set initial button lights
_fxPanButton->_curSprite =
(SkyEngine::_systemVars.systemFlags & SF_FX_OFF ? 0 : 2);
(SkyEngine::_systemVars->systemFlags & SF_FX_OFF ? 0 : 2);
// music button only available in floppy version
if (!SkyEngine::isCDVersion())
_musicPanButton->_curSprite =
(SkyEngine::_systemVars.systemFlags & SF_MUS_OFF ? 0 : 2);
(SkyEngine::_systemVars->systemFlags & SF_MUS_OFF ? 0 : 2);
drawMainPanel();
@ -554,7 +554,7 @@ void Control::doControlPanel() {
if (!Engine::shouldQuit())
_system->updateScreen();
_skyScreen->forceRefresh();
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars->currentPalette));
removePanel();
_skyMouse->spriteMouse(_savedMouse, 0, 0);
_skyText->fnSetFont(_savedCharSet);
@ -757,13 +757,13 @@ uint16 Control::doSpeedSlide() {
_text->drawToScreen(WITH_MASK);
_system->updateScreen();
}
SkyEngine::_systemVars.gameSpeed = speedDelay;
SkyEngine::_systemVars->gameSpeed = speedDelay;
return SPEED_CHANGED;
}
void Control::toggleFx(ConResource *pButton) {
SkyEngine::_systemVars.systemFlags ^= SF_FX_OFF;
if (SkyEngine::_systemVars.systemFlags & SF_FX_OFF) {
SkyEngine::_systemVars->systemFlags ^= SF_FX_OFF;
if (SkyEngine::_systemVars->systemFlags & SF_FX_OFF) {
pButton->_curSprite = 0;
_statusBar->setToText(0x7000 + 87);
} else {
@ -771,15 +771,15 @@ void Control::toggleFx(ConResource *pButton) {
_statusBar->setToText(0x7000 + 86);
}
ConfMan.setBool("sfx_mute", (SkyEngine::_systemVars.systemFlags & SF_FX_OFF) != 0);
ConfMan.setBool("sfx_mute", (SkyEngine::_systemVars->systemFlags & SF_FX_OFF) != 0);
pButton->drawToScreen(WITH_MASK);
_system->updateScreen();
}
uint16 Control::toggleText() {
uint32 flags = SkyEngine::_systemVars.systemFlags & TEXT_FLAG_MASK;
SkyEngine::_systemVars.systemFlags &= ~TEXT_FLAG_MASK;
uint32 flags = SkyEngine::_systemVars->systemFlags & TEXT_FLAG_MASK;
SkyEngine::_systemVars->systemFlags &= ~TEXT_FLAG_MASK;
if (flags == SF_ALLOW_TEXT) {
flags = SF_ALLOW_SPEECH;
@ -795,7 +795,7 @@ uint16 Control::toggleText() {
ConfMan.setBool("subtitles", (flags & SF_ALLOW_TEXT) != 0);
ConfMan.setBool("speech_mute", (flags & SF_ALLOW_SPEECH) == 0);
SkyEngine::_systemVars.systemFlags |= flags;
SkyEngine::_systemVars->systemFlags |= flags;
drawTextCross(flags);
@ -804,18 +804,18 @@ uint16 Control::toggleText() {
}
void Control::toggleMusic(ConResource *pButton) {
SkyEngine::_systemVars.systemFlags ^= SF_MUS_OFF;
if (SkyEngine::_systemVars.systemFlags & SF_MUS_OFF) {
SkyEngine::_systemVars->systemFlags ^= SF_MUS_OFF;
if (SkyEngine::_systemVars->systemFlags & SF_MUS_OFF) {
_skyMusic->startMusic(0);
pButton->_curSprite = 0;
_statusBar->setToText(0x7000 + 89);
} else {
_skyMusic->startMusic(SkyEngine::_systemVars.currentMusic);
_skyMusic->startMusic(SkyEngine::_systemVars->currentMusic);
pButton->_curSprite = 2;
_statusBar->setToText(0x7000 + 88);
}
ConfMan.setBool("music_mute", (SkyEngine::_systemVars.systemFlags & SF_MUS_OFF) != 0);
ConfMan.setBool("music_mute", (SkyEngine::_systemVars->systemFlags & SF_MUS_OFF) != 0);
pButton->drawToScreen(WITH_MASK);
_system->updateScreen();
@ -1109,7 +1109,7 @@ void Control::loadDescriptions(Common::StringArray &savenames) {
}
bool Control::loadSaveAllowed() {
if (SkyEngine::_systemVars.systemFlags & SF_CHOOSING)
if (SkyEngine::_systemVars->systemFlags & SF_CHOOSING)
return false; // texts get lost during load/save, so don't allow it during choosing
if (Logic::_scriptVariables[SCREEN] >= 101)
return false; // same problem with LINC terminals
@ -1193,7 +1193,7 @@ uint32 Control::prepareSaveData(uint8 *destBuf) {
memset(destBuf, 0, 4); // space for data size
uint8 *destPos = destBuf + 4;
STOSD(destPos, SAVE_FILE_REVISION);
STOSD(destPos, SkyEngine::_systemVars.gameVersion);
STOSD(destPos, SkyEngine::_systemVars->gameVersion);
STOSW(destPos, _skySound->_saveSounds[0]);
STOSW(destPos, _skySound->_saveSounds[1]);
@ -1201,7 +1201,7 @@ uint32 Control::prepareSaveData(uint8 *destBuf) {
STOSD(destPos, _skyMusic->giveCurrentMusic());
STOSD(destPos, _savedCharSet);
STOSD(destPos, _savedMouse);
STOSD(destPos, SkyEngine::_systemVars.currentPalette);
STOSD(destPos, SkyEngine::_systemVars->currentPalette);
for (cnt = 0; cnt < 838; cnt++)
STOSD(destPos, Logic::_scriptVariables[cnt]);
uint32 *loadedFilesList = _skyDisk->giveLoadedFilesList();
@ -1360,16 +1360,16 @@ uint16 Control::parseSaveData(uint8 *srcBuf) {
return RESTORE_FAILED;
}
LODSD(srcPos, gameVersion);
if (gameVersion != SkyEngine::_systemVars.gameVersion) {
if (gameVersion != SkyEngine::_systemVars->gameVersion) {
if ((!SkyEngine::isCDVersion()) || (gameVersion < 365)) { // cd versions are compatible
displayMessage(NULL, "This saved game was created by\n"
"Beneath a Steel Sky v0.0%03d\n"
"It cannot be loaded by this version (v0.0%3d)",
gameVersion, SkyEngine::_systemVars.gameVersion);
gameVersion, SkyEngine::_systemVars->gameVersion);
return RESTORE_FAILED;
}
}
SkyEngine::_systemVars.systemFlags |= SF_GAME_RESTORED;
SkyEngine::_systemVars->systemFlags |= SF_GAME_RESTORED;
LODSW(srcPos, _skySound->_saveSounds[0]);
LODSW(srcPos, _skySound->_saveSounds[1]);
@ -1424,11 +1424,11 @@ uint16 Control::parseSaveData(uint8 *srcBuf) {
error("Restore failed! Savegame data = %lu bytes. Expected size: %d", (long)(srcPos-srcBuf), size);
_skyDisk->refreshFilesList(reloadList);
SkyEngine::_systemVars.currentMusic = (uint16)music;
if (!(SkyEngine::_systemVars.systemFlags & SF_MUS_OFF))
SkyEngine::_systemVars->currentMusic = (uint16)music;
if (!(SkyEngine::_systemVars->systemFlags & SF_MUS_OFF))
_skyMusic->startMusic((uint16)music);
_savedMouse = (uint16)mouseType;
SkyEngine::_systemVars.currentPalette = palette; // will be set when doControlPanel ends
SkyEngine::_systemVars->currentPalette = palette; // will be set when doControlPanel ends
return GAME_RESTORED;
}
@ -1457,7 +1457,7 @@ uint16 Control::restoreGameFromFile(bool autoSave) {
}
uint16 res = parseSaveData(saveData);
SkyEngine::_systemVars.pastIntro = true;
SkyEngine::_systemVars->pastIntro = true;
delete inf;
free(saveData);
return res;
@ -1479,7 +1479,7 @@ uint16 Control::quickXRestore(uint16 slot) {
_system->copyRectToScreen(_screenBuf, GAME_SCREEN_WIDTH, 0, 0, FULL_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
_system->updateScreen();
if (SkyEngine::_systemVars.gameVersion < 331)
if (SkyEngine::_systemVars->gameVersion < 331)
_skyScreen->setPalette(60509);
else
_skyScreen->setPalette(60510);
@ -1497,7 +1497,7 @@ uint16 Control::quickXRestore(uint16 slot) {
memset(_skyScreen->giveCurrent(), 0, GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT);
_skyScreen->showScreen(_skyScreen->giveCurrent());
_skyScreen->forceRefresh();
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars->currentPalette));
} else {
memset(_screenBuf, 0, FULL_SCREEN_WIDTH * FULL_SCREEN_HEIGHT);
_system->copyRectToScreen(_screenBuf, GAME_SCREEN_WIDTH, 0, 0, GAME_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
@ -1512,20 +1512,25 @@ uint16 Control::quickXRestore(uint16 slot) {
return result;
}
/**
* Restarts the game (skipping intro) and places Foster (the player)
* already on the top level of the factory.
*
*/
void Control::restartGame() {
if (SkyEngine::_systemVars.gameVersion <= 267)
if (SkyEngine::_systemVars->gameVersion <= 267)
return; // no restart for floppy demo
uint8 *resetData = _skyCompact->createResetData((uint16)SkyEngine::_systemVars.gameVersion);
uint8 *resetData = _skyCompact->createResetData((uint16)SkyEngine::_systemVars->gameVersion);
parseSaveData((uint8 *)resetData);
free(resetData);
_skyScreen->forceRefresh();
memset(_skyScreen->giveCurrent(), 0, GAME_SCREEN_WIDTH * FULL_SCREEN_HEIGHT);
_skyScreen->showScreen(_skyScreen->giveCurrent());
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars->currentPalette));
_skyMouse->spriteMouse(_savedMouse, 0, 0);
SkyEngine::_systemVars.pastIntro = true;
SkyEngine::_systemVars->pastIntro = true;
}
void Control::delay(unsigned int amount) {
@ -1547,7 +1552,7 @@ void Control::delay(unsigned int amount) {
_keyPressed = event.kbd;
break;
case Common::EVENT_MOUSEMOVE:
if (!(SkyEngine::_systemVars.systemFlags & SF_MOUSE_LOCKED))
if (!(SkyEngine::_systemVars->systemFlags & SF_MOUSE_LOCKED))
_skyMouse->mouseMoved(event.mouse.x, event.mouse.y);
break;
case Common::EVENT_LBUTTONDOWN:
@ -1593,8 +1598,8 @@ void Control::showGameQuitMsg() {
_skyText->displayText(_quitTexts[8 * 2 + 0], textBuf1, true, 320, 255);
_skyText->displayText(_quitTexts[8 * 2 + 1], textBuf2, true, 320, 255);
} else {
_skyText->displayText(_quitTexts[SkyEngine::_systemVars.language * 2 + 0], textBuf1, true, 320, 255);
_skyText->displayText(_quitTexts[SkyEngine::_systemVars.language * 2 + 1], textBuf2, true, 320, 255);
_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 0], textBuf1, true, 320, 255);
_skyText->displayText(_quitTexts[SkyEngine::_systemVars->language * 2 + 1], textBuf2, true, 320, 255);
}
uint8 *curLine1 = textBuf1 + sizeof(DataFileHeader);
uint8 *curLine2 = textBuf2 + sizeof(DataFileHeader);

View File

@ -1275,9 +1275,9 @@ bool Debugger::Cmd_LogicCommand(int argc, const char **argv) {
}
bool Debugger::Cmd_Info(int argc, const char **argv) {
debugPrintf("Beneath a Steel Sky version: 0.0%d\n", SkyEngine::_systemVars.gameVersion);
debugPrintf("Speech: %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_SPEECH) ? "on" : "off");
debugPrintf("Text : %s\n", (SkyEngine::_systemVars.systemFlags & SF_ALLOW_TEXT) ? "on" : "off");
debugPrintf("Beneath a Steel Sky version: 0.0%d\n", SkyEngine::_systemVars->gameVersion);
debugPrintf("Speech: %s\n", (SkyEngine::_systemVars->systemFlags & SF_ALLOW_SPEECH) ? "on" : "off");
debugPrintf("Text : %s\n", (SkyEngine::_systemVars->systemFlags & SF_ALLOW_TEXT) ? "on" : "off");
return true;
}

View File

@ -431,11 +431,11 @@ Common::Error SkyEngine::saveGameState(int slot, const Common::String &desc, boo
}
bool SkyEngine::canLoadGameStateCurrently() {
return _systemVars.pastIntro && _skyControl->loadSaveAllowed();
return _systemVars->pastIntro && _skyControl->loadSaveAllowed();
}
bool SkyEngine::canSaveGameStateCurrently() {
return _systemVars.pastIntro && _skyControl->loadSaveAllowed();
return _systemVars->pastIntro && _skyControl->loadSaveAllowed();
}
} // End of namespace Sky

View File

@ -98,7 +98,7 @@ uint8 *Disk::loadFile(uint16 fileNr) {
fileOffset &= 0x7FFFFF;
if (cflag) {
if (SkyEngine::_systemVars.gameVersion == 331)
if (SkyEngine::_systemVars->gameVersion == 331)
fileOffset <<= 3;
else
fileOffset <<= 4;

View File

@ -105,7 +105,7 @@ Logic::~Logic() {
void Logic::initScreen0() {
fnEnterSection(0, 0, 0);
_skyMusic->startMusic(2);
SkyEngine::_systemVars.currentMusic = 2;
SkyEngine::_systemVars->currentMusic = 2;
}
void Logic::parseSaveData(uint32 *data) {
@ -541,7 +541,7 @@ void Logic::talk() {
if (_skyMouse->wasClicked())
for (int i = 0; i < ARRAYSIZE(clickTable); i++)
if (clickTable[i] == (uint16)_scriptVariables[CUR_ID]) {
if ((SkyEngine::_systemVars.systemFlags & SF_ALLOW_SPEECH) && (!_skySound->speechFinished()))
if ((SkyEngine::_systemVars->systemFlags & SF_ALLOW_SPEECH) && (!_skySound->speechFinished()))
_skySound->stopSpeech();
if ((_compact->spTextId > 0) &&
(_compact->spTextId < 0xFFFF)) {
@ -648,7 +648,7 @@ void Logic::choose() {
fnNoHuman(0, 0, 0); // kill mouse again
SkyEngine::_systemVars.systemFlags &= ~SF_CHOOSING; // restore save/restore
SkyEngine::_systemVars->systemFlags &= ~SF_CHOOSING; // restore save/restore
_compact->logic = L_SCRIPT; // and continue script
logicScript();
@ -1158,7 +1158,7 @@ void Logic::initScriptVariables() {
_scriptVariables[SC40_LOCKER_4_FLAG] = 1;
_scriptVariables[SC40_LOCKER_5_FLAG] = 1;
if (SkyEngine::_systemVars.gameVersion == 288)
if (SkyEngine::_systemVars->gameVersion == 288)
memcpy(_scriptVariables + 352, forwardList1b288, sizeof(forwardList1b288));
else
memcpy(_scriptVariables + 352, forwardList1b, sizeof(forwardList1b));
@ -1407,7 +1407,7 @@ bool Logic::fnCacheFast(uint32 a, uint32 b, uint32 c) {
bool Logic::fnDrawScreen(uint32 a, uint32 b, uint32 c) {
debug(5, "Call: fnDrawScreen(%X, %X)",a,b);
SkyEngine::_systemVars.currentPalette = a;
SkyEngine::_systemVars->currentPalette = a;
_skyScreen->fnDrawScreen(a, b);
if (Logic::_scriptVariables[SCREEN] == 32) {
@ -1746,7 +1746,7 @@ bool Logic::fnChooser(uint32 a, uint32 b, uint32 c) {
// setup the text questions to be clicked on
// read from TEXT1 until 0
SkyEngine::_systemVars.systemFlags |= SF_CHOOSING; // can't save/restore while choosing
SkyEngine::_systemVars->systemFlags |= SF_CHOOSING; // can't save/restore while choosing
_scriptVariables[THE_CHOSEN_ONE] = 0; // clear result
@ -2233,7 +2233,7 @@ bool Logic::fnCustomJoey(uint32 id, uint32 b, uint32 c) {
bool Logic::fnSetPalette(uint32 a, uint32 b, uint32 c) {
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(a));
SkyEngine::_systemVars.currentPalette = a;
SkyEngine::_systemVars->currentPalette = a;
return true;
}
@ -2312,19 +2312,19 @@ bool Logic::fnEnterSection(uint32 sectionNo, uint32 b, uint32 c) {
_skyControl->showGameQuitMsg();
_scriptVariables[CUR_SECTION] = sectionNo;
SkyEngine::_systemVars.currentMusic = 0;
SkyEngine::_systemVars->currentMusic = 0;
if (sectionNo == 5) //linc section - has different mouse icons
_skyMouse->replaceMouseCursors(60302);
if ((sectionNo != _currentSection) || (SkyEngine::_systemVars.systemFlags & SF_GAME_RESTORED)) {
if ((sectionNo != _currentSection) || (SkyEngine::_systemVars->systemFlags & SF_GAME_RESTORED)) {
_currentSection = sectionNo;
sectionNo++;
_skyMusic->loadSection((byte)sectionNo);
_skySound->loadSection((byte)sectionNo);
_skyGrid->loadGrids();
SkyEngine::_systemVars.systemFlags &= ~SF_GAME_RESTORED;
SkyEngine::_systemVars->systemFlags &= ~SF_GAME_RESTORED;
}
return true;
@ -2355,8 +2355,14 @@ bool Logic::fnWaitSwingEnd(uint32 a, uint32 b, uint32 c) {
return true;
}
/**
* This function is called by the script logic
* even when the intro sequence has completed without skipping it.
* This means that it (also) gets called at the point after the intro
* when Foster in on the top level of the factory and finished his monologue.
*/
bool Logic::fnSkipIntroCode(uint32 a, uint32 b, uint32 c) {
SkyEngine::_systemVars.pastIntro = true;
SkyEngine::_systemVars->pastIntro = true;
return true;
}
@ -2452,15 +2458,15 @@ bool Logic::fnStopFx(uint32 a, uint32 b, uint32 c) {
}
bool Logic::fnStartMusic(uint32 a, uint32 b, uint32 c) {
if (!(SkyEngine::_systemVars.systemFlags & SF_MUS_OFF))
if (!(SkyEngine::_systemVars->systemFlags & SF_MUS_OFF))
_skyMusic->startMusic((uint16)a);
SkyEngine::_systemVars.currentMusic = (uint16)a;
SkyEngine::_systemVars->currentMusic = (uint16)a;
return true;
}
bool Logic::fnStopMusic(uint32 a, uint32 b, uint32 c) {
_skyMusic->startMusic(0);
SkyEngine::_systemVars.currentMusic = 0;
SkyEngine::_systemVars->currentMusic = 0;
return true;
}
@ -2470,7 +2476,7 @@ bool Logic::fnFadeDown(uint32 a, uint32 b, uint32 c) {
}
bool Logic::fnFadeUp(uint32 a, uint32 b, uint32 c) {
SkyEngine::_systemVars.currentPalette = a;
SkyEngine::_systemVars->currentPalette = a;
_skyScreen->fnFadeUp(a,b);
return true;
}
@ -2524,7 +2530,7 @@ void Logic::stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32 bas
_skyScreen->setFocusRectangle(Common::Rect::center(x, y, 192, 128));
if ((SkyEngine::_systemVars.systemFlags & SF_ALLOW_TEXT) || !speechFileFound) {
if ((SkyEngine::_systemVars->systemFlags & SF_ALLOW_TEXT) || !speechFileFound) {
// form the text sprite, if player wants subtitles or
// if we couldn't find the speech file
DisplayedText textInfo;

View File

@ -150,11 +150,11 @@ void Mouse::fnSaveCoods() {
}
void Mouse::lockMouse() {
SkyEngine::_systemVars.systemFlags |= SF_MOUSE_LOCKED;
SkyEngine::_systemVars->systemFlags |= SF_MOUSE_LOCKED;
}
void Mouse::unlockMouse() {
SkyEngine::_systemVars.systemFlags &= ~SF_MOUSE_LOCKED;
SkyEngine::_systemVars->systemFlags &= ~SF_MOUSE_LOCKED;
}
void Mouse::restoreMouseData(uint16 frameNum) {

View File

@ -49,7 +49,7 @@ AdLibChannel::AdLibChannel(OPL::OPL *opl, uint8 *pMusicData, uint16 startOfData)
uint16 instrumentDataLoc;
if (SkyEngine::_systemVars.gameVersion == 109) {
if (SkyEngine::_systemVars->gameVersion == 109) {
//instrumentDataLoc = (_musicData[0x11D0] << 8) | _musicData[0x11CF];
//_frequenceTable = (uint16 *)(_musicData + 0x835);
//_registerTable = _musicData + 0xE35;
@ -61,7 +61,7 @@ AdLibChannel::AdLibChannel(OPL::OPL *opl, uint8 *pMusicData, uint16 startOfData)
_registerTable = _musicData + 0xE68;
_opOutputTable = _musicData + 0xE7A;
_adlibRegMirror = _musicData + 0xF7D;
} else if (SkyEngine::_systemVars.gameVersion == 267) {
} else if (SkyEngine::_systemVars->gameVersion == 267) {
instrumentDataLoc = READ_LE_UINT16(_musicData + 0x11FB);
_frequenceTable = (uint16 *)(_musicData + 0x7F4);
_registerTable = _musicData + 0xDF4;

View File

@ -55,14 +55,14 @@ void AdLibMusic::onTimer() {
}
void AdLibMusic::setupPointers() {
if (SkyEngine::_systemVars.gameVersion == 109) {
if (SkyEngine::_systemVars->gameVersion == 109) {
// disk demo uses a different AdLib driver version, some offsets have changed
//_musicDataLoc = (_musicData[0x11CC] << 8) | _musicData[0x11CB];
//_initSequence = _musicData + 0xEC8;
_musicDataLoc = READ_LE_UINT16(_musicData + 0x1200);
_initSequence = _musicData + 0xEFB;
} else if (SkyEngine::_systemVars.gameVersion == 267) {
} else if (SkyEngine::_systemVars->gameVersion == 267) {
_musicDataLoc = READ_LE_UINT16(_musicData + 0x11F7);
_initSequence = _musicData + 0xE87;
} else {

View File

@ -75,7 +75,7 @@ void GmMusic::timerCall() {
}
void GmMusic::setupPointers() {
if (SkyEngine::_systemVars.gameVersion == 109) {
if (SkyEngine::_systemVars->gameVersion == 109) {
_musicDataLoc = READ_LE_UINT16(_musicData + 0x79B);
_sysExSequence = _musicData + 0x1EF2;
} else {

View File

@ -245,7 +245,7 @@ void Screen::fnDrawScreen(uint32 palette, uint32 scroll) {
}
void Screen::fnFadeDown(uint32 scroll) {
if (((scroll != 123) && (scroll != 321)) || (SkyEngine::_systemVars.systemFlags & SF_NO_SCROLL)) {
if (((scroll != 123) && (scroll != 321)) || (SkyEngine::_systemVars->systemFlags & SF_NO_SCROLL)) {
uint32 delayTime = _system->getMillis();
for (uint8 cnt = 0; cnt < 32; cnt++) {
delayTime += 20;
@ -328,7 +328,7 @@ void Screen::fnFadeUp(uint32 palNum, uint32 scroll) {
if ((scroll != 123) && (scroll != 321))
scroll = 0;
if ((scroll == 0) || (SkyEngine::_systemVars.systemFlags & SF_NO_SCROLL)) {
if ((scroll == 0) || (SkyEngine::_systemVars->systemFlags & SF_NO_SCROLL)) {
uint8 *palette = (uint8 *)_skyCompact->fetchCpt(palNum);
if (palette == NULL)
error("Screen::fnFadeUp: can't fetch compact %X", palNum);

View File

@ -69,13 +69,33 @@
namespace Sky {
void *SkyEngine::_itemList[300];
SystemVars SkyEngine::_systemVars = {0, 0, 0, 0, 4316, 0, 0, false, false };
SystemVars *SkyEngine::_systemVars = nullptr;
const char *SkyEngine::shortcutsKeymapId = "sky-shortcuts";
SkyEngine::SkyEngine(OSystem *syst)
: Engine(syst), _fastMode(0), _debugger(0) {
: Engine(syst), _fastMode(0), _debugger(0) {
_systemVars = new SystemVars();
_systemVars->systemFlags = 0;
_systemVars->gameVersion = 0;
_systemVars->mouseFlag = 0;
_systemVars->language = 0;
_systemVars->currentPalette = 4316;
_systemVars->gameSpeed = 0;
_systemVars->currentMusic = 0;
_systemVars->pastIntro = false;
_systemVars->paused = false;
_action = kSkyActionNone;
_skyLogic = nullptr;
_skySound = nullptr;
_skyMusic = nullptr;
_skyText = nullptr;
_skyMouse = nullptr;
_skyScreen = nullptr;
_skyDisk = nullptr;
_skyControl = nullptr;
_skyCompact = nullptr;
}
SkyEngine::~SkyEngine() {
@ -93,6 +113,8 @@ SkyEngine::~SkyEngine() {
for (int i = 0; i < 300; i++)
if (_itemList[i])
free(_itemList[i]);
delete _systemVars;
}
void SkyEngine::syncSoundSettings() {
@ -103,10 +125,10 @@ void SkyEngine::syncSoundSettings() {
mute = ConfMan.getBool("mute");
if (ConfMan.getBool("sfx_mute")) // set mute sfx status for native options menu (F5)
SkyEngine::_systemVars.systemFlags |= SF_FX_OFF;
SkyEngine::_systemVars->systemFlags |= SF_FX_OFF;
if (ConfMan.getBool("music_mute")) { // CD version allows to mute music from native options menu (F5)
SkyEngine::_systemVars.systemFlags |= SF_MUS_OFF;
SkyEngine::_systemVars->systemFlags |= SF_MUS_OFF;
}
// SkyEngine native sound volume range is [0, 127]
// However, via ScummVM UI, the volume range can be set within [0, 256]
@ -123,10 +145,10 @@ void SkyEngine::initVirgin() {
}
void SkyEngine::handleKey() {
if ((_action != kSkyActionNone || _keyPressed.keycode) && _systemVars.paused) {
if ((_action != kSkyActionNone || _keyPressed.keycode) && _systemVars->paused) {
_skySound->fnUnPauseFx();
_systemVars.paused = false;
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
_systemVars->paused = false;
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars->currentPalette));
} else {
switch (_action) {
case kSkyActionToggleFastMode:
@ -142,7 +164,7 @@ void SkyEngine::handleKey() {
break;
case kSkyActionSkip:
if (!_systemVars.pastIntro)
if (!_systemVars->pastIntro)
_skyControl->restartGame();
break;
@ -153,7 +175,7 @@ void SkyEngine::handleKey() {
case kSkyActionPause:
_skyScreen->halvePalette();
_skySound->fnPauseFx();
_systemVars.paused = true;
_systemVars->paused = true;
break;
default:
@ -177,7 +199,10 @@ Common::Error SkyEngine::go() {
if (result != GAME_RESTORED) {
bool introSkipped = false;
if (_systemVars.gameVersion > 272) { // don't do intro for floppydemos
// Clear pastIntro here (set to false) explicilty
// It should be false already, but better to ensure it
_systemVars->pastIntro = false;
if (_systemVars->gameVersion > 272) { // don't do intro for floppydemos
Intro *skyIntro = new Intro(_skyDisk, _skyScreen, _skyMusic, _skySound, _skyText, _mixer, _system);
bool floppyIntro = ConfMan.getBool("alt_intro");
introSkipped = !skyIntro->doIntro(floppyIntro);
@ -190,10 +215,13 @@ Common::Error SkyEngine::go() {
// initial animation where Foster is being chased. initScreen0()
// shows the first scene together with that animation. We can't
// call both, as they both load the same scene.
if (introSkipped)
if (introSkipped) {
// restart game sets the _systemVars->pastIntro = true;
_skyControl->restartGame();
else
} else {
_skyLogic->initScreen0();
}
}
}
@ -202,12 +230,12 @@ Common::Error SkyEngine::go() {
_skySound->checkFxQueue();
_skyMouse->mouseEngine();
handleKey();
if (_systemVars.paused) {
if (_systemVars->paused) {
do {
_system->updateScreen();
delay(50);
handleKey();
} while (_systemVars.paused);
} while (_systemVars->paused);
delayCount = _system->getMillis();
}
@ -229,9 +257,9 @@ Common::Error SkyEngine::go() {
else if (_fastMode & 1)
delay(10);
else {
delayCount += _systemVars.gameSpeed;
delayCount += _systemVars->gameSpeed;
int needDelay = delayCount - (int)_system->getMillis();
if ((needDelay < 0) || (needDelay > _systemVars.gameSpeed)) {
if ((needDelay < 0) || (needDelay > _systemVars->gameSpeed)) {
needDelay = 0;
delayCount = _system->getMillis();
}
@ -252,14 +280,14 @@ Common::Error SkyEngine::init() {
_skyDisk = new Disk();
_skySound = new Sound(_mixer, _skyDisk, Audio::Mixer::kMaxChannelVolume);
_systemVars.gameVersion = _skyDisk->determineGameVersion();
_systemVars->gameVersion = _skyDisk->determineGameVersion();
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_ADLIB | MDT_MIDI | MDT_PREFER_MT32);
if (MidiDriver::getMusicType(dev) == MT_ADLIB) {
_systemVars.systemFlags |= SF_SBLASTER;
_systemVars->systemFlags |= SF_SBLASTER;
_skyMusic = new AdLibMusic(_mixer, _skyDisk);
} else {
_systemVars.systemFlags |= SF_ROLAND;
_systemVars->systemFlags |= SF_ROLAND;
if ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"))
_skyMusic = new MT32Music(MidiDriver::createMidi(dev), _mixer, _skyDisk);
else
@ -270,20 +298,20 @@ Common::Error SkyEngine::init() {
if (ConfMan.hasKey("nosubtitles")) {
warning("Configuration key 'nosubtitles' is deprecated. Use 'subtitles' instead");
if (!ConfMan.getBool("nosubtitles"))
_systemVars.systemFlags |= SF_ALLOW_TEXT;
_systemVars->systemFlags |= SF_ALLOW_TEXT;
}
if (ConfMan.getBool("subtitles"))
_systemVars.systemFlags |= SF_ALLOW_TEXT;
_systemVars->systemFlags |= SF_ALLOW_TEXT;
if (!ConfMan.getBool("speech_mute"))
_systemVars.systemFlags |= SF_ALLOW_SPEECH;
_systemVars->systemFlags |= SF_ALLOW_SPEECH;
} else
_systemVars.systemFlags |= SF_ALLOW_TEXT;
_systemVars->systemFlags |= SF_ALLOW_TEXT;
_systemVars.systemFlags |= SF_PLAY_VOCS;
_systemVars.gameSpeed = 80;
_systemVars->systemFlags |= SF_PLAY_VOCS;
_systemVars->gameSpeed = 80;
_skyCompact = new SkyCompact();
_skyText = new Text(_skyDisk, _skyCompact);
@ -305,44 +333,44 @@ Common::Error SkyEngine::init() {
switch (Common::parseLanguage(ConfMan.get("language"))) {
case Common::EN_USA:
_systemVars.language = SKY_USA;
_systemVars->language = SKY_USA;
break;
case Common::DE_DEU:
_systemVars.language = SKY_GERMAN;
_systemVars->language = SKY_GERMAN;
break;
case Common::FR_FRA:
_systemVars.language = SKY_FRENCH;
_systemVars->language = SKY_FRENCH;
break;
case Common::IT_ITA:
_systemVars.language = SKY_ITALIAN;
_systemVars->language = SKY_ITALIAN;
break;
case Common::PT_BRA:
_systemVars.language = SKY_PORTUGUESE;
_systemVars->language = SKY_PORTUGUESE;
break;
case Common::ES_ESP:
_systemVars.language = SKY_SPANISH;
_systemVars->language = SKY_SPANISH;
break;
case Common::SE_SWE:
_systemVars.language = SKY_SWEDISH;
_systemVars->language = SKY_SWEDISH;
break;
case Common::EN_GRB:
_systemVars.language = SKY_ENGLISH;
_systemVars->language = SKY_ENGLISH;
break;
default:
_systemVars.language = SKY_ENGLISH;
_systemVars->language = SKY_ENGLISH;
break;
}
if (!_skyDisk->fileExists(60600 + SkyEngine::_systemVars.language * 8)) {
if (!_skyDisk->fileExists(60600 + SkyEngine::_systemVars->language * 8)) {
warning("The language you selected does not exist in your BASS version");
if (_skyDisk->fileExists(60600))
SkyEngine::_systemVars.language = SKY_ENGLISH; // default to GB english if it exists..
SkyEngine::_systemVars->language = SKY_ENGLISH; // default to GB english if it exists..
else if (_skyDisk->fileExists(60600 + SKY_USA * 8))
SkyEngine::_systemVars.language = SKY_USA; // try US english...
SkyEngine::_systemVars->language = SKY_USA; // try US english...
else
for (uint8 cnt = SKY_ENGLISH; cnt <= SKY_SPANISH; cnt++)
if (_skyDisk->fileExists(60600 + cnt * 8)) { // pick the first language we can find
SkyEngine::_systemVars.language = cnt;
SkyEngine::_systemVars->language = cnt;
break;
}
}
@ -410,16 +438,16 @@ void SkyEngine::delay(int32 amount) {
_keyPressed = event.kbd;
break;
case Common::EVENT_MOUSEMOVE:
if (!(_systemVars.systemFlags & SF_MOUSE_LOCKED))
if (!(_systemVars->systemFlags & SF_MOUSE_LOCKED))
_skyMouse->mouseMoved(event.mouse.x, event.mouse.y);
break;
case Common::EVENT_LBUTTONDOWN:
if (!(_systemVars.systemFlags & SF_MOUSE_LOCKED))
if (!(_systemVars->systemFlags & SF_MOUSE_LOCKED))
_skyMouse->mouseMoved(event.mouse.x, event.mouse.y);
_skyMouse->buttonPressed(2);
break;
case Common::EVENT_RBUTTONDOWN:
if (!(_systemVars.systemFlags & SF_MOUSE_LOCKED))
if (!(_systemVars->systemFlags & SF_MOUSE_LOCKED))
_skyMouse->mouseMoved(event.mouse.x, event.mouse.y);
_skyMouse->buttonPressed(1);
break;
@ -437,7 +465,7 @@ void SkyEngine::delay(int32 amount) {
}
bool SkyEngine::isDemo() {
switch (_systemVars.gameVersion) {
switch (_systemVars->gameVersion) {
case 109: // PC Gamer demo
case 267: // English floppy demo
case 272: // German floppy demo
@ -451,12 +479,12 @@ bool SkyEngine::isDemo() {
case 372:
return false;
default:
error("Unknown game version %d", _systemVars.gameVersion);
error("Unknown game version %d", _systemVars->gameVersion);
}
}
bool SkyEngine::isCDVersion() {
switch (_systemVars.gameVersion) {
switch (_systemVars->gameVersion) {
case 109:
case 267:
case 272:
@ -470,7 +498,7 @@ bool SkyEngine::isCDVersion() {
case 372:
return true;
default:
error("Unknown game version %d", _systemVars.gameVersion);
error("Unknown game version %d", _systemVars->gameVersion);
}
}

View File

@ -108,9 +108,7 @@ public:
static void *fetchItem(uint32 num);
static void *_itemList[300];
static SystemVars _systemVars;
static SystemVars *_systemVars;
static const char *shortcutsKeymapId;
protected:

View File

@ -1055,7 +1055,7 @@ void Sound::loadSection(uint8 pSection) {
free(_soundData);
_soundData = _skyDisk->loadFile(pSection * 4 + SOUND_FILE_BASE);
uint16 asmOfs;
if (SkyEngine::_systemVars.gameVersion == 109) {
if (SkyEngine::_systemVars->gameVersion == 109) {
if (pSection == 0)
asmOfs = 0x78;
else
@ -1075,7 +1075,7 @@ void Sound::loadSection(uint8 pSection) {
_sfxInfo = _soundData + _sfxBaseOfs;
// if we just restored a savegame, the sfxqueue holds the sound we need to restart
if (!(SkyEngine::_systemVars.systemFlags & SF_GAME_RESTORED))
if (!(SkyEngine::_systemVars->systemFlags & SF_GAME_RESTORED))
for (uint8 cnt = 0; cnt < 4; cnt++)
_sfxQueue[cnt].count = 0;
}
@ -1132,7 +1132,7 @@ void Sound::playSound(uint16 sound, uint16 volume, uint8 channel) {
void Sound::fnStartFx(uint32 sound, uint8 channel) {
_saveSounds[channel] = 0xFFFF;
if (sound < 256 || sound > MAX_FX_NUMBER || (SkyEngine::_systemVars.systemFlags & SF_FX_OFF))
if (sound < 256 || sound > MAX_FX_NUMBER || (SkyEngine::_systemVars->systemFlags & SF_FX_OFF))
return;
uint8 screen = (uint8)(Logic::_scriptVariables[SCREEN] & 0xff);
@ -1156,9 +1156,9 @@ void Sound::fnStartFx(uint32 sound, uint8 channel) {
uint8 volume = _mainSfxVolume; // start with standard vol
if (SkyEngine::_systemVars.systemFlags & SF_SBLASTER)
if (SkyEngine::_systemVars->systemFlags & SF_SBLASTER)
volume = roomList[i].adlibVolume;
else if (SkyEngine::_systemVars.systemFlags & SF_ROLAND)
else if (SkyEngine::_systemVars->systemFlags & SF_ROLAND)
volume = roomList[i].rolandVolume;
volume = (volume * _mainSfxVolume) >> 8;
@ -1222,7 +1222,7 @@ void Sound::stopSpeech() {
}
bool Sound::startSpeech(uint16 textNum) {
if (!(SkyEngine::_systemVars.systemFlags & SF_ALLOW_SPEECH))
if (!(SkyEngine::_systemVars->systemFlags & SF_ALLOW_SPEECH))
return false;
uint16 speechFileNum = _speechConvertTable[textNum >> 12] + (textNum & 0xFFF);

View File

@ -125,7 +125,7 @@ void Text::getText(uint32 textNr) { //load text #"textNr" into textBuffer
if (SkyEngine::_itemList[FIRST_TEXT_SEC + sectionNo] == NULL) { //check if already loaded
debug(5, "Loading Text item(s) for Section %d", (sectionNo >> 2));
uint32 fileNo = sectionNo + ((SkyEngine::_systemVars.language * NO_OF_TEXT_SECTIONS) + 60600);
uint32 fileNo = sectionNo + ((SkyEngine::_systemVars->language * NO_OF_TEXT_SECTIONS) + 60600);
SkyEngine::_itemList[FIRST_TEXT_SEC + sectionNo] = (void **)_skyDisk->loadFile((uint16)fileNo);
}
uint8 *textDataPtr = (uint8 *)SkyEngine::_itemList[FIRST_TEXT_SEC + sectionNo];
@ -417,7 +417,7 @@ uint32 Text::giveCurrentCharSet() {
}
void Text::initHuffTree() {
switch (SkyEngine::_systemVars.gameVersion) {
switch (SkyEngine::_systemVars->gameVersion) {
case 109:
_huffTree = _huffTree_00109;
break;
@ -447,13 +447,13 @@ void Text::initHuffTree() {
_huffTree = _huffTree_00372;
break;
default:
error("Unknown game version %d", SkyEngine::_systemVars.gameVersion);
error("Unknown game version %d", SkyEngine::_systemVars->gameVersion);
}
}
bool Text::patchMessage(uint32 textNum) {
uint16 patchIdx = _patchLangIdx[SkyEngine::_systemVars.language];
uint16 patchNum = _patchLangNum[SkyEngine::_systemVars.language];
uint16 patchIdx = _patchLangIdx[SkyEngine::_systemVars->language];
uint16 patchNum = _patchLangNum[SkyEngine::_systemVars->language];
for (uint16 cnt = 0; cnt < patchNum; cnt++) {
if (_patchedMessages[cnt + patchIdx].textNr == textNum) {
strcpy(_textBuffer, _patchedMessages[cnt + patchIdx].text);