mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-21 03:31:40 +00:00
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:
parent
3d4940b22d
commit
52eee0c696
@ -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++);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user