diff options
Diffstat (limited to 'engines/kyra')
-rw-r--r-- | engines/kyra/debugger.cpp | 47 | ||||
-rw-r--r-- | engines/kyra/debugger.h | 10 | ||||
-rw-r--r-- | engines/kyra/gui_lol.cpp | 20 | ||||
-rw-r--r-- | engines/kyra/items_lol.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/kyra_v1.cpp | 3 | ||||
-rw-r--r-- | engines/kyra/lol.cpp | 21 | ||||
-rw-r--r-- | engines/kyra/lol.h | 1 | ||||
-rw-r--r-- | engines/kyra/saveload.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/saveload_lol.cpp | 38 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 18 | ||||
-rw-r--r-- | engines/kyra/script_lol.cpp | 13 | ||||
-rw-r--r-- | engines/kyra/timer_lol.cpp | 2 |
12 files changed, 69 insertions, 108 deletions
diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp index a77ffee299..e0c2c0aa77 100644 --- a/engines/kyra/debugger.cpp +++ b/engines/kyra/debugger.cpp @@ -465,53 +465,6 @@ bool Debugger_HoF::cmd_passcodes(int argc, const char **argv) { #ifdef ENABLE_LOL Debugger_LoL::Debugger_LoL(LoLEngine *vm) : Debugger(vm), _vm(vm) { } - -bool Debugger_LoL::cmd_listFlags(int argc, const char **argv) { - for (int i = 0, p = 0; i < (int)sizeof(_vm->_gameFlags)*8; ++i, ++p) { - const uint8 index = (i >> 4); - const uint8 offset = i & 0xF; - - DebugPrintf("(%-3i): %-2i", i, (_vm->_gameFlags[index] >> offset) & 1); - if (p == 5) { - DebugPrintf("\n"); - p -= 6; - } - } - DebugPrintf("\n"); - return true; -} - -bool Debugger_LoL::cmd_toggleFlag(int argc, const char **argv) { - if (argc > 1) { - uint flag = atoi(argv[1]); - - const uint8 index = (flag >> 4); - const uint8 offset = flag & 0xF; - - _vm->_gameFlags[index] ^= _vm->_gameFlags[index] & (1 << offset); - - DebugPrintf("Flag %i is now %i\n", flag, (_vm->_gameFlags[index] >> offset) & 1); - } else { - DebugPrintf("Syntax: toggleflag <flag>\n"); - } - - return true; -} - -bool Debugger_LoL::cmd_queryFlag(int argc, const char **argv) { - if (argc > 1) { - uint flag = atoi(argv[1]); - - const uint8 index = (flag >> 4); - const uint8 offset = flag & 0xF; - - DebugPrintf("Flag %i is %i\n", flag, (_vm->_gameFlags[index] >> offset) & 1); - } else { - DebugPrintf("Syntax: queryflag <flag>\n"); - } - - return true; -} #endif // ENABLE_LOL } // End of namespace Kyra diff --git a/engines/kyra/debugger.h b/engines/kyra/debugger.h index b01402f7d5..c9cf6dba2a 100644 --- a/engines/kyra/debugger.h +++ b/engines/kyra/debugger.h @@ -47,9 +47,9 @@ protected: bool cmd_loadPalette(int argc, const char **argv); bool cmd_showFacings(int argc, const char **argv); bool cmd_gameSpeed(int argc, const char **argv); - virtual bool cmd_listFlags(int argc, const char **argv); - virtual bool cmd_toggleFlag(int argc, const char **argv); - virtual bool cmd_queryFlag(int argc, const char **argv); + bool cmd_listFlags(int argc, const char **argv); + bool cmd_toggleFlag(int argc, const char **argv); + bool cmd_queryFlag(int argc, const char **argv); bool cmd_listTimers(int argc, const char **argv); bool cmd_setTimerCountdown(int argc, const char **argv); }; @@ -106,10 +106,6 @@ public: protected: LoLEngine *_vm; - - bool cmd_listFlags(int argc, const char **argv); - bool cmd_toggleFlag(int argc, const char **argv); - bool cmd_queryFlag(int argc, const char **argv); }; #endif // ENABLE_LOL diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index 7a7de65e43..af8bc6aa97 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -34,26 +34,26 @@ namespace Kyra { void LoLEngine::gui_drawPlayField() { _screen->loadBitmap("PLAYFLD.CPS", 3, 3, 0); - if (_gameFlags[15] & 0x4000) { + if (_flagsTable[31] & 0x40) { // copy compass shape static const int cx[] = { 112, 152, 224 }; _screen->copyRegion(cx[_lang], 32, 288, 0, 32, 32, 2, 2, Screen::CR_NO_P_CHECK); _compassDirection = -1; } - if (_gameFlags[15] & 0x1000) + if (_flagsTable[31] & 0x10) // draw automap book _screen->drawShape(2, _gameShapes[78], 290, 32, 0, 0); int cp = _screen->setCurPage(2); - if (_gameFlags[15] & 0x2000) { + if (_flagsTable[31] & 0x20) { gui_drawScroll(); } else { _selectedSpell = 0; } - if (_gameFlags[15] & 0x800) + if (_flagsTable[31] & 0x08) resetLampStatus(); updateDrawPage2(); @@ -548,7 +548,7 @@ void LoLEngine::gui_drawMoneyBox(int pageNum) { } void LoLEngine::gui_drawCompass() { - if (!(_gameFlags[15] & 0x4000)) + if (!(_flagsTable[31] & 0x40)) return; if (_compassDirection == -1) { @@ -606,7 +606,7 @@ void LoLEngine::gui_toggleButtonDisplayMode(int shapeIndex, int mode) { static const int16 buttonX[] = { 0x0056, 0x0128, 0x000C, 0x0021, 0x0122, 0x000C, 0x0021, 0x0036, 0x000C, 0x0021, 0x0036 }; static const int16 buttonY[] = { 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x0020, 0x0084, 0x0084, 0x0084, 0x0096, 0x0096, 0x0096 }; - if (shapeIndex == 78 && !(_gameFlags[15] & 0x1000)) + if (shapeIndex == 78 && !(_flagsTable[31] & 0x10)) return; if (_currentControlMode && _needSceneRestore) @@ -836,7 +836,7 @@ void LoLEngine::gui_enableDefaultPlayfieldButtons() { gui_setFaceFramesControlButtons(29, 0); gui_setFaceFramesControlButtons(25, 33); - if (_gameFlags[15] & 0x2000) + if (_flagsTable[31] & 0x20) gui_initMagicScrollButtons(); } @@ -1752,7 +1752,7 @@ int LoLEngine::clickedMoneyBox(Button *button) { } int LoLEngine::clickedCompass(Button *button) { - if (!(_gameFlags[15] & 0x4000)) + if (!(_flagsTable[31] & 0x40)) return 0; if (_compassBroken) { @@ -1766,7 +1766,7 @@ int LoLEngine::clickedCompass(Button *button) { } int LoLEngine::clickedAutomap(Button *button) { - if (!(_gameFlags[15] & 0x1000)) + if (!(_flagsTable[31] & 0x10)) return 0; removeInputTop(); @@ -1778,7 +1778,7 @@ int LoLEngine::clickedAutomap(Button *button) { } int LoLEngine::clickedLamp(Button *button) { - if (!(_gameFlags[15] & 0x800)) + if (!(_flagsTable[31] & 0x08)) return 0; if (_itemsInPlay[_itemInHand].itemPropertyIndex == 248) { diff --git a/engines/kyra/items_lol.cpp b/engines/kyra/items_lol.cpp index 98894154f0..e75a13c870 100644 --- a/engines/kyra/items_lol.cpp +++ b/engines/kyra/items_lol.cpp @@ -279,7 +279,7 @@ void LoLEngine::setHandItem(uint16 itemIndex) { int mouseOffs = 0; - if (itemIndex && !(_gameFlags[15] & 0x200)) { + if (itemIndex && !(_flagsTable[31] & 0x02)) { mouseOffs = 10; if (!_currentControlMode || textEnabled()) _txt->printMessage(0, getLangString(0x403E), getLangString(_itemProperties[_itemsInPlay[itemIndex].itemPropertyIndex].nameStringId)); diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 71045e116d..d9fc8f9d66 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -470,15 +470,18 @@ void KyraEngine_v1::resetSkipFlag(bool removeEvent) { int KyraEngine_v1::setGameFlag(int flag) { + assert((flag >> 3) >= 0 && (flag >> 3) <= ARRAYSIZE(_flagsTable)); _flagsTable[flag >> 3] |= (1 << (flag & 7)); return 1; } int KyraEngine_v1::queryGameFlag(int flag) const { + assert((flag >> 3) >= 0 && (flag >> 3) <= ARRAYSIZE(_flagsTable)); return ((_flagsTable[flag >> 3] >> (flag & 7)) & 1); } int KyraEngine_v1::resetGameFlag(int flag) { + assert((flag >> 3) >= 0 && (flag >> 3) <= ARRAYSIZE(_flagsTable)); _flagsTable[flag >> 3] &= ~(1 << (flag & 7)); return 0; } diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 0f251bc57d..3461fa5da9 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -500,7 +500,6 @@ Common::Error LoLEngine::init() { _flyingObjects = new FlyingObject[8]; memset(_flyingObjects, 0, 8 * sizeof(FlyingObject)); - memset(_gameFlags, 0, sizeof(_gameFlags)); memset(_globalScriptVars, 0, sizeof(_globalScriptVars)); _levelFileData = 0; @@ -643,7 +642,7 @@ void LoLEngine::loadItemIconShapes() { } void LoLEngine::setMouseCursorToIcon(int icon) { - _gameFlags[15] |= 0x200; + _flagsTable[31] |= 0x02; int i = _itemProperties[_itemsInPlay[_itemInHand].itemPropertyIndex].shpIndex; if (i == icon) return; @@ -651,7 +650,7 @@ void LoLEngine::setMouseCursorToIcon(int icon) { } void LoLEngine::setMouseCursorToItemInHand() { - _gameFlags[15] &= 0xFDFF; + _flagsTable[31] &= 0xFD; int o = (_itemInHand == 0) ? 0 : 10; _screen->setMouseCursor(o, o, getItemIconShapePtr(_itemInHand)); } @@ -856,7 +855,7 @@ void LoLEngine::runLoop() { enableSysTimer(2); bool _runFlag = true; - _gameFlags[36] |= 0x800; + _flagsTable[73] |= 0x08; while (!shouldQuit() && _runFlag) { if (_nextScriptFunc) { @@ -891,10 +890,10 @@ void LoLEngine::update() { if (_updateCharNum != -1 && _system->getMillis() > _updatePortraitNext) updatePortraitSpeechAnim(); - if (_gameFlags[15] & 0x800 || !(_updateFlags & 4)) + if (_flagsTable[31] & 0x08 || !(_updateFlags & 4)) updateLampStatus(); - if (_gameFlags[15] & 0x4000 && !(_updateFlags & 4) && (_compassDirection == -1 || (_currentDirection << 6) != _compassDirection || _compassStep)) + if (_flagsTable[31] & 0x40 && !(_updateFlags & 4) && (_compassDirection == -1 || (_currentDirection << 6) != _compassDirection || _compassStep)) updateCompass(); snd_updateCharacterSpeech(); @@ -1595,7 +1594,7 @@ void LoLEngine::generateBrightnessPalette(uint8 *src, uint8 *dst, int brightness memcpy(dst, src, 0x300); _screen->loadSpecialColors(dst); brightness = (8 - brightness) << 5; - if (modifier >= 0 && modifier < 8 && _gameFlags[15] & 0x800) { + if (modifier >= 0 && modifier < 8 && (_flagsTable[31] & 0x08)) { brightness = 256 - ((((modifier & 0xfffe) << 5) * (256 - brightness)) >> 8); if (brightness < 0) brightness = 0; @@ -2124,12 +2123,12 @@ int LoLEngine::processMagicIce(int charNum, int spellLevel) { uint8 *tpal = new uint8[768]; uint8 *swampCol = new uint8[768]; - if (_currentLevel == 11 && !(_gameFlags[26] & 4)) { + if (_currentLevel == 11 && !(_flagsTable[52] & 0x04)) { uint8 *sc = _screen->_currentPalette; uint8 *dc = _screen->getPalette(2); for (int i = 1; i < 768; i++) SWAP(sc[i], dc[i]); - _gameFlags[26] |= 4; + _flagsTable[52] |= 0x04; static const uint8 freezeTimes[] = { 20, 28, 40, 60 }; setCharacterUpdateEvent(charNum, 8, freezeTimes[spellLevel], 1); } @@ -3496,7 +3495,7 @@ void LoLEngine::stunCharacter(int charNum) { } void LoLEngine::restoreSwampPalette() { - _gameFlags[26] &= 0xfffb; + _flagsTable[52] &= 0xFB; if (_currentLevel != 11) return; @@ -3761,7 +3760,7 @@ void LoLEngine::displayAutomap() { } void LoLEngine::updateAutoMap(uint16 block) { - if (!(_gameFlags[15] & 0x1000)) + if (!(_flagsTable[31] & 0x10)) return; _levelBlockProperties[block].flags |= 7; diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 4544faf499..45795a7cab 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -627,7 +627,6 @@ private: uint16 _currentBlock; bool _sceneUpdateRequired; int16 _visibleBlockIndex[18]; - uint16 _gameFlags[40]; int16 _globalScriptVars[24]; // emc opcode diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp index 7349cab9b5..79665068f6 100644 --- a/engines/kyra/saveload.cpp +++ b/engines/kyra/saveload.cpp @@ -30,7 +30,7 @@ #include "kyra/kyra_v1.h" -#define CURRENT_SAVE_VERSION 15 +#define CURRENT_SAVE_VERSION 16 #define GF_FLOPPY (1 << 0) #define GF_TALKIE (1 << 1) diff --git a/engines/kyra/saveload_lol.cpp b/engines/kyra/saveload_lol.cpp index cdfaca3b6d..2090deddfa 100644 --- a/engines/kyra/saveload_lol.cpp +++ b/engines/kyra/saveload_lol.cpp @@ -119,15 +119,33 @@ Common::Error LoLEngine::loadGameState(int slot) { _inventoryCurItem = in.readSint16BE(); _itemInHand = in.readSint16BE(); _lastMouseRegion = in.readSint16BE(); - if (header.version == 14) { - for (int i = 0; i < 16; i++) - _gameFlags[i] = in.readUint16BE(); - _gameFlags[26] = in.readUint16BE(); - _gameFlags[36] = in.readUint16BE(); + + if (header.version <= 15) { + uint16 flags[40]; + memset(flags, 0, sizeof(flags)); + + if (header.version == 14) { + for (int i = 0; i < 16; i++) + flags[i] = in.readUint16BE(); + flags[26] = in.readUint16BE(); + flags[36] = in.readUint16BE(); + } else if (header.version == 15) { + for (int i = 0; i < 40; i++) + flags[i] = in.readUint16BE(); + } + + for (uint i = 0; i < ARRAYSIZE(flags); ++i) { + for (uint k = 0; k < 16; ++k) { + if (flags[i] & (1 << k)) + setGameFlag(((i << 4) & 0xFFF0) | (k & 0x000F)); + } + } } else { - for (int i = 0; i < 40; i++) - _gameFlags[i] = in.readUint16BE(); + uint32 flagsSize = in.readUint32BE(); + assert(flagsSize <= sizeof(_flagsTable)); + in.read(_flagsTable, flagsSize); } + for (int i = 0; i < 24; i++) _globalScriptVars[i] = in.readUint16BE(); _brightness = in.readByte(); @@ -245,7 +263,7 @@ Common::Error LoLEngine::loadGameState(int slot) { loadLevel(_currentLevel); gui_drawPlayField(); timerSpecialCharacterUpdate(0); - _gameFlags[36] |= 0x800; + _flagsTable[73] |= 0x08; while (!_screen->isMouseVisible()) _screen->showMouse(); @@ -323,8 +341,8 @@ Common::Error LoLEngine::saveGameState(int slot, const char *saveName, const Gra out->writeSint16BE(_inventoryCurItem); out->writeSint16BE(_itemInHand); out->writeSint16BE(_lastMouseRegion); - for (int i = 0; i < 40; i++) - out->writeUint16BE(_gameFlags[i]); + out->writeUint32BE(ARRAYSIZE(_flagsTable)); + out->write(_flagsTable, ARRAYSIZE(_flagsTable)); for (int i = 0; i < 24; i++) out->writeUint16BE(_globalScriptVars[i]); out->writeByte(_brightness); diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index df4be0fa1a..0236e4fa7d 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -36,7 +36,7 @@ namespace Kyra { void LoLEngine::loadLevel(int index) { - _gameFlags[36] |= 0x800; + _flagsTable[73] |= 0x08; setMouseCursorToIcon(0x85); _nextScriptFunc = 0; @@ -398,7 +398,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight memcpy(_screen->getPalette(2) + 384, _screen->_currentPalette + 384, 384); delete[] swampPal; - if (_gameFlags[26] & 4) { + if (_flagsTable[52] & 0x04) { uint8 *pal0 = _screen->_currentPalette; uint8 *pal2 = _screen->getPalette(2); for (int i = 1; i < 768; i++) @@ -524,14 +524,14 @@ bool LoLEngine::testWallInvisibility(int block, int direction) { } void LoLEngine::resetLampStatus() { - _gameFlags[15] |= 0x400; + _flagsTable[31] |= 0x04; _lampEffect = -1; updateLampStatus(); } void LoLEngine::setLampMode(bool lampOn) { - _gameFlags[15] &= 0xFBFF; - if (!(_gameFlags[15] & 0x800) || !lampOn) + _flagsTable[31] &= 0xFB; + if (!(_flagsTable[30] & 0x08) || !lampOn) return; _screen->drawShape(0, _gameShapes[43], 291, 56, 0, 0); @@ -542,7 +542,7 @@ void LoLEngine::updateLampStatus() { uint8 newLampEffect = 0; uint8 tmpOilStatus = 0; - if ((_updateFlags & 4) || !(_gameFlags[15] & 0x800)) + if ((_updateFlags & 4) || !(_flagsTable[31] & 0x08)) return; if (!_brightness || !_lampOilStatus) { @@ -584,7 +584,7 @@ void LoLEngine::updateLampStatus() { } void LoLEngine::updateCompass() { - if (!(_gameFlags[15] & 0x4000) || (_updateFlags & 4)) + if (!(_flagsTable[31] & 0x40) || (_updateFlags & 4)) return; if (_compassDirection == -1) { @@ -651,12 +651,12 @@ void LoLEngine::moveParty(uint16 direction, int unk1, int unk2, int buttonShape) _sceneDefaultUpdate = 1; calcCoordinates(_partyPosX, _partyPosY, _currentBlock, 0x80, 0x80); - _gameFlags[36] &= 0xfdff; + _flagsTable[73] &= 0xFD; runLevelScript(opos, 4); runLevelScript(npos, 1); - if (!(_gameFlags[36] & 0x200)) { + if (!(_flagsTable[73] & 0x02)) { initTextFading(2, 0); if (_sceneDefaultUpdate) { diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index 6eb6ca96b6..3d57b23181 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -206,12 +206,10 @@ int LoLEngine::olol_delay(EMCState *script) { int LoLEngine::olol_setGameFlag(EMCState *script) { debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_setGameFlag(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); - assert((stackPos(0) >> 4) < 40); - if (stackPos(1)) - _gameFlags[stackPos(0) >> 4] |= (1 << (stackPos(0) & 0x0f)); + setGameFlag(stackPos(0)); else - _gameFlags[stackPos(0) >> 4] &= (~(1 << (stackPos(0) & 0x0f))); + resetGameFlag(stackPos(0)); return 1; } @@ -221,12 +219,7 @@ int LoLEngine::olol_testGameFlag(EMCState *script) { if (stackPos(0) < 0) return 0; - assert((stackPos(0) >> 4) < 40); - - if (_gameFlags[stackPos(0) >> 4] & (1 << (stackPos(0) & 0x0f))) - return 1; - - return 0; + return queryGameFlag(stackPos(0)); } int LoLEngine::olol_loadLevelGraphics(EMCState *script) { diff --git a/engines/kyra/timer_lol.cpp b/engines/kyra/timer_lol.cpp index 4a66557465..84c4f8b19d 100644 --- a/engines/kyra/timer_lol.cpp +++ b/engines/kyra/timer_lol.cpp @@ -247,7 +247,7 @@ void LoLEngine::timerUpdatePortraitAnimations(int skipUpdate) { } void LoLEngine::timerUpdateLampState(int timerNum) { - if ((_gameFlags[15] & 0x800) && (_gameFlags[15] & 0x400) && _lampOilStatus > 0) + if ((_flagsTable[31] & 0x08) && (_flagsTable[31] & 0x04) && _lampOilStatus > 0) _lampOilStatus--; } |