aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2014-04-12 11:00:29 -0400
committerPaul Gilbert2014-04-12 11:00:29 -0400
commit2a979e59a0481f62d67b8b323c79cccaa6552d0a (patch)
treee1286144d595129199438a85899662c33aaa15e0
parent5793daa75ea9364b163acaa83c1be126971444e4 (diff)
downloadscummvm-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.cpp1
-rw-r--r--engines/mads/game.cpp7
-rw-r--r--engines/mads/palette.cpp59
-rw-r--r--engines/mads/palette.h17
-rw-r--r--engines/mads/scene.cpp9
-rw-r--r--engines/mads/scene.h2
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