aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/tsage/core.cpp93
-rw-r--r--engines/tsage/core.h32
-rw-r--r--engines/tsage/ringworld_scenes10.cpp14
3 files changed, 79 insertions, 60 deletions
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 7fff9603e1..4043c42fed 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -1036,18 +1036,35 @@ PaletteModifier::PaletteModifier() {
/*--------------------------------------------------------------------------*/
-PaletteRotation::PaletteRotation() : PaletteModifier() {
- _disabled = false;
- _delayFrames = 0;
+PaletteModifierCached::PaletteModifierCached(): PaletteModifier() {
+ _step = 0;
+ _percent = 0;
+}
+
+void PaletteModifierCached::setPalette(ScenePalette *palette, int step) {
+ _scenePalette = palette;
+ _step = step;
+ _percent = 100;
+}
+
+void PaletteModifierCached::synchronise(Serialiser &s) {
+ PaletteModifier::synchronise(s);
+
+ s.syncAsByte(_step);
+ s.syncAsSint32LE(_percent);
+}
+
+/*--------------------------------------------------------------------------*/
+
+PaletteRotation::PaletteRotation() : PaletteModifierCached() {
+ _percent = 0;
_delayCtr = 0;
_frameNumber = _globals->_events.getFrameNumber();
}
void PaletteRotation::synchronise(Serialiser &s) {
- PaletteModifier::synchronise(s);
+ PaletteModifierCached::synchronise(s);
- s.syncAsByte(_disabled);
- s.syncAsSint32LE(_delayFrames);
s.syncAsSint32LE(_delayCtr);
s.syncAsUint32LE(_frameNumber);
s.syncAsSint32LE(_currIndex);
@@ -1077,8 +1094,8 @@ void PaletteRotation::signal() {
if (_delayCtr)
return;
- _delayCtr = _delayFrames;
- if (_disabled)
+ _delayCtr = _percent;
+ if (_step)
return;
bool flag = true;
@@ -1141,7 +1158,7 @@ void PaletteRotation::remove() {
void PaletteRotation::set(ScenePalette *palette, int start, int end, int rotationMode, int duration, Action *action) {
_duration = duration;
- _disabled = false;
+ _step = false;
_action = action;
_scenePalette = palette;
@@ -1162,12 +1179,6 @@ void PaletteRotation::set(ScenePalette *palette, int start, int end, int rotatio
}
}
-void PaletteRotation::setPalette(ScenePalette *palette, bool disabled) {
- _scenePalette = palette;
- _disabled = disabled;
- _delayFrames = 100;
-}
-
bool PaletteRotation::decDuration() {
if (_duration) {
if (--_duration == 0) {
@@ -1179,18 +1190,16 @@ bool PaletteRotation::decDuration() {
}
void PaletteRotation::setDelay(int amount) {
- _delayFrames = _delayCtr = amount;
+ _percent = _delayCtr = amount;
}
/*--------------------------------------------------------------------------*/
-void PaletteUnknown::synchronise(Serialiser &s) {
- PaletteModifier::synchronise(s);
+void PaletteFader::synchronise(Serialiser &s) {
+ PaletteModifierCached::synchronise(s);
s.syncAsSint16LE(_step);
s.syncAsSint16LE(_percent);
- s.syncAsSint16LE(_field12);
- s.syncAsSint16LE(_field14);
for (int i = 0; i < 256; ++i) {
s.syncAsByte(_palette[i].r);
s.syncAsByte(_palette[i].g);
@@ -1198,7 +1207,7 @@ void PaletteUnknown::synchronise(Serialiser &s) {
}
}
-void PaletteUnknown::signal() {
+void PaletteFader::signal() {
_percent -= _step;
if (_percent > 0) {
_scenePalette->fade((byte *)_palette, true /* 256 */, _percent);
@@ -1207,17 +1216,18 @@ void PaletteUnknown::signal() {
}
}
-void PaletteUnknown::remove() {
- if (_scenePalette) {
- for (int i = 0; i < 256; i++)
- _scenePalette->_palette[i] = _palette[i];
- _scenePalette->refresh();
- _scenePalette->_listeners.remove(this);
- delete this;
- }
+void PaletteFader::remove() {
+ // Save of a copy of the object's action, since it will be used after the object is destroyed
+ Action *action = _action;
- if (_action)
- _action->signal();
+ for (int i = 0; i < 256; i++)
+ _scenePalette->_palette[i] = _palette[i];
+ _scenePalette->refresh();
+ _scenePalette->_listeners.remove(this);
+ delete this;
+
+ if (action)
+ action->signal();
}
/*--------------------------------------------------------------------------*/
@@ -1358,18 +1368,19 @@ PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode,
return obj;
}
-PaletteUnknown *ScenePalette::addUnkPal(RGB8 *arrBufferRGB, int unkNumb, bool disabled, Action *action) {
- PaletteUnknown *paletteUnk = new PaletteUnknown();
- paletteUnk->_action = action;
+PaletteFader *ScenePalette::addFader(RGB8 *arrBufferRGB, int palSize, int percent, Action *action) {
+ PaletteFader *fader = new PaletteFader();
+ fader->_action = action;
for (int i = 0; i < 256; i++) {
- if (unkNumb <= 1)
- paletteUnk->_palette[i] = arrBufferRGB[i];
- else
- paletteUnk->_palette[i] = arrBufferRGB[0];
+ fader->_palette[i] = *arrBufferRGB;
+
+ if (palSize > 1)
+ ++arrBufferRGB;
}
-// PaletteRotation::setPalette(this, disabled);
- _globals->_scenePalette._listeners.push_back(paletteUnk);
- return paletteUnk;
+
+ fader->setPalette(this, percent);
+ _globals->_scenePalette._listeners.push_back(fader);
+ return fader;
}
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 77923606d1..2e3e5365a9 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -317,10 +317,21 @@ public:
virtual void remove() = 0;
};
-class PaletteRotation : public PaletteModifier {
+class PaletteModifierCached: public PaletteModifier {
+public:
+ RGB8 _palette[256];
+ int _step;
+ int _percent;
+
+ PaletteModifierCached();
+
+ void setPalette(ScenePalette *palette, int step);
+ virtual Common::String getClassName() { return "PaletteModifierCached"; }
+ virtual void synchronise(Serialiser &s);
+};
+
+class PaletteRotation: public PaletteModifierCached {
public:
- bool _disabled;
- int _delayFrames;
int _delayCtr;
uint32 _frameNumber;
int _currIndex;
@@ -328,7 +339,6 @@ public:
int _end;
int _rotationMode;
int _duration;
- RGB8 _palette[256];
public:
PaletteRotation();
@@ -337,26 +347,24 @@ public:
virtual void signal();
virtual void remove();
- void setDisabled(bool v) { _disabled = v; }
+ void setStep(int step) { _step = step; }
void set(ScenePalette *palette, int start, int end, int rotationMode, int duration, Action *action);
- void setPalette(ScenePalette *palette, bool disabled);
bool decDuration();
void setDelay(int amount);
};
-/*--------------------------------------------------------------------------*/
-
-class PaletteUnknown : public PaletteModifier {
+class PaletteFader: public PaletteModifierCached {
public:
- int _step, _percent, _field12, _field14;
RGB8 _palette[256];
public:
- virtual Common::String getClassName() { return "PaletteUnknown"; }
+ virtual Common::String getClassName() { return "PaletteFader"; }
virtual void synchronise(Serialiser &s);
virtual void signal();
virtual void remove();
};
+/*--------------------------------------------------------------------------*/
+
enum FadeMode {FADEMODE_NONE = 0, FADEMODE_GRADUAL = 1, FADEMODE_IMMEDIATE = 2};
class ScenePalette : public SavedObject {
@@ -385,7 +393,7 @@ public:
void clearListeners();
void fade(const byte *adjustData, bool fullAdjust, int percent);
PaletteRotation *addRotation(int start, int end, int rotationMode, int duration = 0, Action *action = NULL);
- PaletteUnknown *addUnkPal(RGB8 *arrBufferRGB, int unkNumb, bool disabled, Action *action);
+ PaletteFader *addFader(RGB8 *arrBufferRGB, int palSize, int percent, Action *action);
static void changeBackground(const Rect &bounds, FadeMode fadeMode);
diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp
index 7b3d00d637..9930f047dc 100644
--- a/engines/tsage/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld_scenes10.cpp
@@ -1652,18 +1652,18 @@ void Scene9900::strAction1::signal() {
break;
case 1:
_palette1.getPalette();
- _globals->_scenePalette.addUnkPal(&mask1, 1, true /*10*/, this);
+ _globals->_scenePalette.addFader(&mask1, 1, 10, this);
break;
case 2:
_object9.remove();
- _globals->_scenePalette.addUnkPal(&mask2, 1, true /*5*/, this);
+ _globals->_scenePalette.addFader(&mask2, 1, 5, this);
break;
case 3:
_globals->_soundHandler.startSound(377, 0, 127);
setDelay(120);
break;
case 4:
- _globals->_scenePalette.addUnkPal(_palette1._palette, 256, 1, this);
+ _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this);
break;
case 5:
remove();
@@ -1777,18 +1777,18 @@ void Scene9900::strAction3::signal() {
case 0:
_palette2.getPalette();
_palette3.loadPalette(2003);
- _globals->_scenePalette.addUnkPal(_palette3._palette, 256, true /*5*/, this);
+ _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this);
break;
case 1:
- _globals->_scenePalette.addUnkPal(&mask3, 1, true /*10*/, this);
+ _globals->_scenePalette.addFader(&mask3, 1, 10, this);
break;
case 2:
- _globals->_scenePalette.addUnkPal(&mask4, 1, true /*1*/, this);
+ _globals->_scenePalette.addFader(&mask4, 1, 1, this);
break;
case 3:
_palette2.loadPalette(17);
_globals->_sceneManager._scene->loadScene(17);
- _globals->_scenePalette.addUnkPal(_palette2._palette, 256, true /*5*/, this);
+ _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this);
break;
case 4:
_globals->_game.endGame(9900, 61);