diff options
author | Paul Gilbert | 2017-12-28 23:36:29 -0500 |
---|---|---|
committer | Paul Gilbert | 2017-12-28 23:36:29 -0500 |
commit | a37b0e8181f055d4778c53aa873816af4349aa9d (patch) | |
tree | dfbf8025f2ade4c07f5770b9101f1d181d275b7d /engines/xeen | |
parent | 26c096d39df27e8460af6ff8c28f381ca90e0422 (diff) | |
download | scummvm-rg350-a37b0e8181f055d4778c53aa873816af4349aa9d.tar.gz scummvm-rg350-a37b0e8181f055d4778c53aa873816af4349aa9d.tar.bz2 scummvm-rg350-a37b0e8181f055d4778c53aa873816af4349aa9d.zip |
XEEN: Change _gameFlags to it's own class
Byte 6 of the flags data, for flags 48 to 55, is directly used
in several places. I didn't think it was needed, but turns out
it is. So I've had to refactor the bool array I had previously
to have this as a bitset, so byte 6 can be accessed
Diffstat (limited to 'engines/xeen')
-rw-r--r-- | engines/xeen/combat.cpp | 6 | ||||
-rw-r--r-- | engines/xeen/interface.cpp | 4 | ||||
-rw-r--r-- | engines/xeen/map.cpp | 8 | ||||
-rw-r--r-- | engines/xeen/party.cpp | 45 | ||||
-rw-r--r-- | engines/xeen/party.h | 37 | ||||
-rw-r--r-- | engines/xeen/scripts.cpp | 2 |
6 files changed, 81 insertions, 21 deletions
diff --git a/engines/xeen/combat.cpp b/engines/xeen/combat.cpp index fe2eaa94bf..bcedff2229 100644 --- a/engines/xeen/combat.cpp +++ b/engines/xeen/combat.cpp @@ -1476,16 +1476,16 @@ void Combat::attack2(int damage, RangeType rangeType) { if (monsterDied) { if (!isDarkCc) { if (_monster2Attack == 20 && party._mazeId == 41) - party._gameFlags[0][11] = true; + party._gameFlags.set(11, true); if (_monster2Attack == 8 && party._mazeId == 78) { - party._gameFlags[0][60] = true; + party._gameFlags.set(60, true); party._questFlags[0][23] = false; for (uint idx = 0; idx < party._activeParty.size(); ++idx) party._activeParty[idx].setAward(42, true); if (_monster2Attack == 27 && party._mazeId == 29) - party._gameFlags[0][104] = true; + party._gameFlags.set(104, true); } } diff --git a/engines/xeen/interface.cpp b/engines/xeen/interface.cpp index 0cc509a66a..b4e486ed03 100644 --- a/engines/xeen/interface.cpp +++ b/engines/xeen/interface.cpp @@ -677,7 +677,7 @@ void Interface::doStepCode() { break; } - if (_vm->_files->_isDarkCc && party._gameFlags[1][118]) { + if (_vm->_files->_isDarkCc && party._gameFlags.get(118, 1)) { _falling = false; } else { if (_falling) @@ -711,7 +711,7 @@ void Interface::startFalling(bool flag) { Scripts &scripts = *_vm->_scripts; bool isDarkCc = _vm->_files->_isDarkCc; - if (isDarkCc && party._gameFlags[1][118]) { + if (isDarkCc && party._gameFlags.get(118, 1)) { _falling = 0; return; } diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp index 2b954f5afa..5b7804c9f6 100644 --- a/engines/xeen/map.cpp +++ b/engines/xeen/map.cpp @@ -1058,7 +1058,7 @@ void Map::load(int mapId) { if (isDarkCc && mapId == 50) mazeDataP->setAllTilesStepped(); - if (!isDarkCc && party._gameFlags[0][25] && + if (!isDarkCc && party._gameFlags.get(25) && (mapId == 42 || mapId == 43 || mapId == 4)) { mazeDataP->clearCellSurfaces(); } @@ -1100,7 +1100,7 @@ void Map::load(int mapId) { if ((_mobData._monsters[0]._position.x > 31 || _mobData._monsters[0]._position.y > 31) && (_mobData._monsters[1]._position.x > 31 || _mobData._monsters[1]._position.y > 31) && (_mobData._monsters[2]._position.x > 31 || _mobData._monsters[2]._position.y > 31)) { - party._gameFlags[0][56] = true; + party._gameFlags.set(56, true); } } } @@ -1135,7 +1135,7 @@ void Map::load(int mapId) { _mobData._objects[29]._spriteId = 0; _mobData._objects[29]._id = 8; _mobData._objectSprites[i]._sprites.clear(); - } else if (mapId == 12 && party._gameFlags[0][43] && + } else if (mapId == 12 && party._gameFlags.get(43) && _mobData._objectSprites[i]._spriteId == 118 && !isDarkCc) { filename = "085.obj"; _mobData._objectSprites[0]._spriteId = 85; @@ -1445,7 +1445,7 @@ void Map::saveMap() { for (uint idx = 0; idx < MIN(_mobData._monsters.size(), (uint)3); ++idx) { MazeMonster &mon = _mobData._monsters[idx]; if (mon._position.x > 31 || mon._position.y > 31) { - party._gameFlags[0][56] = true; + party._gameFlags.set(56, true); break; } } diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp index 0a2e5b9f82..8af7db82ad 100644 --- a/engines/xeen/party.cpp +++ b/engines/xeen/party.cpp @@ -72,6 +72,34 @@ Treasure::Treasure() { /*------------------------------------------------------------------------*/ +void Party::GameFlags::clear() { + Common::fill(&_flags[0][0], &_flags[0][0] + (FLAGS_COUNT / 8), 0); + Common::fill(&_flags[1][0], &_flags[1][0] + (FLAGS_COUNT / 8), 0); +} + +bool Party::GameFlags::get(uint flagNum, uint sideNum) const { + if (flagNum >= FLAGS_COUNT) { + sideNum = flagNum / FLAGS_COUNT; + flagNum %= FLAGS_COUNT; + } + + return (_flags[sideNum][flagNum / 8] & (1 << (flagNum % 8))) != 0; +} + +void Party::GameFlags::set(uint flagNum, uint sideNum, bool value) { + byte &b = _flags[sideNum][flagNum / 8]; + b &= ~(1 << (flagNum % 8)); + if (value) + b |= 1 << (flagNum % 8); +} + +void Party::GameFlags::synchronize(Common::Serializer &s) { + s.syncBytes(&_flags[0][0], FLAGS_COUNT / 8); + s.syncBytes(&_flags[1][0], FLAGS_COUNT / 8); +} + +/*------------------------------------------------------------------------*/ + XeenEngine *Party::_vm; Party::Party(XeenEngine *vm) { @@ -112,8 +140,6 @@ Party::Party(XeenEngine *vm) { _totalTime = 0; _rested = false; - Common::fill(&_gameFlags[0][0], &_gameFlags[0][256], false); - Common::fill(&_gameFlags[1][0], &_gameFlags[1][256], false); Common::fill(&_worldFlags[0], &_worldFlags[128], false); Common::fill(&_questFlags[0][0], &_questFlags[0][30], false); Common::fill(&_questFlags[1][0], &_questFlags[1][30], false); @@ -206,8 +232,7 @@ void Party::synchronize(Common::Serializer &s) { s.syncAsUint32LE(_bankGems); s.syncAsUint32LE(_totalTime); s.syncAsByte(_rested); - File::syncBitFlags(s, &_gameFlags[0][0], &_gameFlags[0][256]); - File::syncBitFlags(s, &_gameFlags[1][0], &_gameFlags[1][256]); + _gameFlags.synchronize(s); File::syncBitFlags(s, &_worldFlags[0], &_worldFlags[128]); File::syncBitFlags(s, &_questFlags[0][0], &_questFlags[0][30]); File::syncBitFlags(s, &_questFlags[1][0], &_questFlags[1][30]); @@ -826,7 +851,7 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int break; } case 20: - _gameFlags[files._isDarkCc][takeVal] = false; + _gameFlags.set(takeVal, files._isDarkCc, false); break; case 21: { bool found = false; @@ -1096,7 +1121,7 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int break; } case 20: - _gameFlags[files._isDarkCc][giveVal] = true; + _gameFlags.set(giveVal, files._isDarkCc, true); break; case 21: { int idx; @@ -1405,10 +1430,10 @@ void Party::subPartyTime(int time) { } void Party::resetYearlyBits() { - _gameFlags[0][55] = false; - _gameFlags[0][155] = false; - _gameFlags[0][222] = false; - _gameFlags[0][231] = false; + _gameFlags.set(55, false); + _gameFlags.set(155, false); + _gameFlags.set(222, false); + _gameFlags.set(231, false); } const int BLACKSMITH_DATA1[4][4] = { diff --git a/engines/xeen/party.h b/engines/xeen/party.h index 31feaec503..3abb708c26 100644 --- a/engines/xeen/party.h +++ b/engines/xeen/party.h @@ -47,6 +47,7 @@ enum PartyBank { WHERE_PARTY = 0, WHERE_BANK = 1 }; +#define FLAGS_COUNT 256 #define ITEMS_COUNT 36 #define TOTAL_CHARACTERS 30 #define XEEN_TOTAL_CHARACTERS 24 @@ -82,6 +83,40 @@ public: class Party { friend class Character; friend class InventoryItems; + + class GameFlags { + private: + byte _flags[2][FLAGS_COUNT / 8]; + public: + byte &_state; + public: + GameFlags() : _state(_flags[0][6]) { clear(); } + + /** + * Clears the flags + */ + void clear(); + + /** + * Get a flag value + */ + bool get(uint flagNum, uint sideNum = 0) const; + + /** + * Sets a flag value + */ + void set(uint flagNum, bool value) { set(flagNum % 256, flagNum / 256, value); } + + /** + * Sets a flag value + */ + void set(uint flagNum, uint sideNum, bool value); + + /** + * Synchronize flags + */ + void synchronize(Common::Serializer &s); + }; private: static XeenEngine *_vm; Character _itemsCharacter; @@ -150,7 +185,7 @@ public: uint _bankGems; int _totalTime; bool _rested; - bool _gameFlags[2][256]; + GameFlags _gameFlags; bool _worldFlags[128]; bool _questFlags[2][30]; int _questItems[TOTAL_QUEST_ITEMS]; diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp index 75338eb3f8..b1cfa71585 100644 --- a/engines/xeen/scripts.cpp +++ b/engines/xeen/scripts.cpp @@ -1541,7 +1541,7 @@ bool Scripts::ifProc(int action, uint32 val, int mode, int charIndex) { if (files._isDarkCc) val += 256; assert(val < 512); - v = party._gameFlags[val / 256][val % 256] ? val : 0xffffffff; + v = party._gameFlags.get(val) ? val : 0xffffffff; break; case 21: // Scans inventories for given item number |