diff options
author | Paul Gilbert | 2014-04-12 11:00:29 -0400 |
---|---|---|
committer | Paul Gilbert | 2014-04-12 11:00:29 -0400 |
commit | 2a979e59a0481f62d67b8b323c79cccaa6552d0a (patch) | |
tree | e1286144d595129199438a85899662c33aaa15e0 | |
parent | 5793daa75ea9364b163acaa83c1be126971444e4 (diff) | |
download | scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.tar.gz scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.tar.bz2 scummvm-rg350-2a979e59a0481f62d67b8b323c79cccaa6552d0a.zip |
MADS: Refactoring PaletteUsage to use external data arrays
-rw-r--r-- | engines/mads/animation.cpp | 1 | ||||
-rw-r--r-- | engines/mads/game.cpp | 7 | ||||
-rw-r--r-- | engines/mads/palette.cpp | 59 | ||||
-rw-r--r-- | engines/mads/palette.h | 17 | ||||
-rw-r--r-- | engines/mads/scene.cpp | 9 | ||||
-rw-r--r-- | engines/mads/scene.h | 2 |
6 files changed, 53 insertions, 42 deletions
diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp index 40abdbe26b..0547c6b379 100644 --- a/engines/mads/animation.cpp +++ b/engines/mads/animation.cpp @@ -403,6 +403,7 @@ void Animation::loadInterface(UserInterface &interfaceSurface, MSurface &depthSu AAHeader &header, int flags, Common::Array<RGB4> *palAnimData, SceneInfo *sceneInfo) { _scene->_depthStyle = 0; if (header._animMode <= 2) { + _vm->_palette->_paletteUsage.setEmpty(); sceneInfo->load(header._roomNumber, flags, header._interfaceFile, 0, depthSurface, interfaceSurface); _scene->_depthStyle = sceneInfo->_depthStyle == 2 ? 1 : 0; if (palAnimData) { diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 9296b95d47..9eb2c5c56f 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -189,7 +189,12 @@ void Game::sectionLoop() { _vm->_palette->initPalette(); } - _vm->_palette->_paletteUsage.load(3, 0xF0, 0xF1, 0xF2); + // Set up scene palette usage + _scene._scenePaletteUsage.clear(); + _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF0)); + _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF1)); + _scene._scenePaletteUsage.push_back(PaletteUsage::UsageEntry(0xF2)); + _vm->_palette->_paletteUsage.load(&_scene._scenePaletteUsage); if (!_player._spritesLoaded && _player._loadsFirst) { if (_player.loadSprites("")) diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp index 2ff16fb5c1..a307a08848 100644 --- a/engines/mads/palette.cpp +++ b/engines/mads/palette.cpp @@ -44,27 +44,20 @@ void RGB6::load(Common::SeekableReadStream *f) { PaletteUsage::PaletteUsage(MADSEngine *vm) { _vm = vm; + _data = nullptr; } -void PaletteUsage::load(int count, ...) { - va_list va; - va_start(va, count); - - _data.clear(); - for (int i = 0; i < count; ++i) - _data.push_back(UsageEntry(va_arg(va, int))); - - va_end(va); +void PaletteUsage::load(Common::Array<UsageEntry> *data) { + _data = data; } - void PaletteUsage::getKeyEntries(Common::Array<RGB6> &palette) { - _data.clear(); + _data->clear(); for (uint i = 0; i < palette.size(); ++i) { byte *uPtr = &palette[i]._flags; - if ((*uPtr & 0x10) && _data.size() < 3) { - _data.push_back(UsageEntry(i)); + if ((*uPtr & 0x10) && _data->size() < 3) { + _data->push_back(UsageEntry(i)); } } } @@ -74,12 +67,12 @@ static bool sortHelper(const PaletteUsage::UsageEntry &ue1, const PaletteUsage:: } void PaletteUsage::prioritize(Common::Array<RGB6> &palette) { - for (uint i = 0; i < _data.size(); ++i) { - RGB6 &palEntry = palette[_data[i]._palIndex]; - _data[i]._sortValue = rgbMerge(palEntry); + for (uint i = 0; i < _data->size(); ++i) { + RGB6 &palEntry = palette[(*_data)[i]._palIndex]; + (*_data)[i]._sortValue = rgbMerge(palEntry); } - Common::sort(_data.begin(), _data.end(), sortHelper); + Common::sort(_data->begin(), _data->end(), sortHelper); } static bool rangeSorter(const PaletteUsage::UsageRange &ur1, const PaletteUsage::UsageRange &ur2) { @@ -105,15 +98,15 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) { int rgbIndex = _vm->_palette->_rgbList.scan(); uint32 rgbMask = 1 << rgbIndex; - int varA = flags & 0x8000; - bool hasUsage = !_vm->_palette->_paletteUsage.empty(); + bool noUsageFlag = flags & 0x8000; + bool hasUsage = _data != nullptr; bool flag1 = false; if (hasUsage) { - if (varA || _vm->_palette->_paletteUsage.empty()) + if (noUsageFlag || _data->size() == 0) hasUsage = false; - if (varA && !_vm->_palette->_paletteUsage.empty()) + if (noUsageFlag && _data->size() > 0) flag1 = true; } @@ -155,18 +148,18 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) { } if (hasUsage && palette[v1]._flags & 0x10) { - for (uint usageIndex = 0; usageIndex < _data.size() && !var48; ++usageIndex) { - if (_data[usageIndex]._palIndex == palIndex) { + for (uint usageIndex = 0; usageIndex < _data->size() && !var48; ++usageIndex) { + if ((*_data)[usageIndex]._palIndex == palIndex) { var48 = true; - int dataIndex = MIN(usageIndex, _data.size() - 1); - var4 = _data[dataIndex]._palIndex; + int dataIndex = MIN(usageIndex, _data->size() - 1); + var4 = (*_data)[dataIndex]._palIndex; } } } if (flag1 && palette[palIndex]._flags & 0x10) { - for (uint usageIndex = 0; usageIndex < _data.size() && !var48; ++usageIndex) { - if (_data[usageIndex]._palIndex == palIndex) { + for (uint usageIndex = 0; usageIndex < _data->size() && !var48; ++usageIndex) { + if ((*_data)[usageIndex]._palIndex == palIndex) { var48 = true; var4 = 0xF0 + usageIndex; @@ -180,7 +173,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) { } } - if (!var48 && !varA) { + if (!var48 && !noUsageFlag) { int var2 = (palette[palIndex]._flags & 0x20) || (((flags & 0x2000) || (palette[palIndex]._flags & 0x4000)) && ((flags & 0x1000) || (palCount == 0))) ? 0x7fff : 1; @@ -229,7 +222,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) { } assert(var48); - int var52 = (varA && palette[palIndex]._u2) ? 2 : 0; + int var52 = (noUsageFlag && palette[palIndex]._u2) ? 2 : 0; _vm->_palette->_palFlags[var4] |= var52 | rgbMask; palette[palIndex]._palIndex = var4; @@ -248,9 +241,9 @@ int PaletteUsage::rgbMerge(RGB6 &palEntry) { void PaletteUsage::transform(Common::Array<RGB6> &palette) { if (!empty()) { - for (uint i = 0; i < _data.size(); ++i) { - int palIndex = _data[i]._palIndex; - _data[i]._palIndex = palette[palIndex]._palIndex; + for (uint i = 0; i < _data->size(); ++i) { + int palIndex = (*_data)[i]._palIndex; + (*_data)[i]._palIndex = palette[palIndex]._palIndex; } } } @@ -433,7 +426,7 @@ void Palette::resetGamePalette(int lowRange, int highRange) { if (highRange) { _palFlags[255] = 1; - Common::fill(&_palFlags[255 - highRange], &_palFlags[254], _palFlags[255]); + Common::fill(&_palFlags[256 - highRange], &_palFlags[254], _palFlags[255]); } _rgbList.clear(); diff --git a/engines/mads/palette.h b/engines/mads/palette.h index cceef09417..74355f8847 100644 --- a/engines/mads/palette.h +++ b/engines/mads/palette.h @@ -71,7 +71,7 @@ public: uint16 _palIndex; int _sortValue; - UsageEntry(int palIndex) { _palIndex = palIndex; } + UsageEntry(int palIndex) { _palIndex = palIndex; _sortValue = -1; } }; struct UsageRange { byte _v1, _v2; @@ -80,27 +80,34 @@ public: }; private: MADSEngine *_vm; - Common::Array<UsageEntry> _data; + Common::Array<UsageEntry> *_data; int rgbMerge(RGB6 &palEntry); int getGamePalFreeIndex(int *palIndex); int rgbFactor(byte *palEntry, RGB6 &pal6); + + Common::Array<UsageEntry> _nullUsage; public: /** * Constructor */ PaletteUsage(MADSEngine *vm); - void load(int count, ...); + void load(Common::Array<UsageEntry> *data); /** * Returns whether the usage list is empty */ - bool empty() const { return _data.size() == 0; } + bool empty() const { return _data == nullptr; } + + uint16 &operator[](int index) { return (*_data)[index]._palIndex; } - uint16 &operator[](int index) { return _data[index]._palIndex; } + /** + * Assigns the class to an empty usage array + */ + void setEmpty() { _data = &_nullUsage; } /** * Gets key entries from the passed palette diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp index 9f8c922861..92c5cedc04 100644 --- a/engines/mads/scene.cpp +++ b/engines/mads/scene.cpp @@ -50,6 +50,8 @@ Scene::Scene(MADSEngine *vm): _vm(vm), _action(_vm), _depthSurface(vm), _layer = LAYER_GUI; _lookFlag = false; + _paletteUsageF.push_back(PaletteUsage::UsageEntry(0xF)); + _verbList.push_back(VerbInit(VERB_LOOK, VERB_THAT, PREP_NONE)); _verbList.push_back(VerbInit(VERB_TAKE, VERB_THAT, PREP_NONE)); _verbList.push_back(VerbInit(VERB_PUSH, VERB_THAT, PREP_NONE)); @@ -121,8 +123,8 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) { _spriteSlots.reset(false); _sequences.clear(); _kernelMessages.clear(); + _vm->_palette->_paletteUsage.load(&_scenePaletteUsage); - // TODO: palletteUsage reset? setPalette(_nullPalette); int flags = SCENEFLAG_LOAD_SHADOW; if (_vm->_dithering) flags |= SCENEFLAG_DITHER; @@ -144,7 +146,7 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) { loadVocab(); // Load palette usage - _vm->_palette->_paletteUsage.load(1, 0xF); + _vm->_palette->_paletteUsage.load(&_paletteUsageF); // Load interface flags = PALFLAG_RESERVED | ANIMFLAG_LOAD_BACKGROUND; @@ -157,7 +159,7 @@ void Scene::loadScene(int sceneId, const Common::String &prefix, bool palFlag) { MSurface depthSurface; _animationData->load(_userInterface, depthSurface, prefix, flags, nullptr, nullptr); - _vm->_palette->_paletteUsage.load(0); + _vm->_palette->_paletteUsage.load(&_scenePaletteUsage); _bandsRange = _sceneInfo->_yBandsEnd - _sceneInfo->_yBandsStart; _scaleRange = _sceneInfo->_maxScale - _sceneInfo->_minScale; @@ -576,6 +578,7 @@ void Scene::free() { _activeAnimation = nullptr; } + _vm->_palette->_paletteUsage.load(nullptr); _hotspots.clear(); _backgroundSurface.free(); _depthSurface.free(); diff --git a/engines/mads/scene.h b/engines/mads/scene.h index a49692dc5b..4d9a3f8efa 100644 --- a/engines/mads/scene.h +++ b/engines/mads/scene.h @@ -128,6 +128,8 @@ public: Layer _layer; bool _lookFlag; Common::Point _customDest; + Common::Array<PaletteUsage::UsageEntry> _paletteUsageF; + Common::Array<PaletteUsage::UsageEntry> _scenePaletteUsage; /** * Constructor |