aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/mult.cpp
diff options
context:
space:
mode:
authorSven Hesse2007-03-20 14:51:57 +0000
committerSven Hesse2007-03-20 14:51:57 +0000
commit2dc7cb2cd49c20a5f6bcfe5446fb8340f6a555c8 (patch)
tree4b442eb88ed1bcc6b4a664890c0b8d8d10b5a912 /engines/gob/mult.cpp
parentd94979c936c4edca5eaa23532b4814b2bf4cb933 (diff)
downloadscummvm-rg350-2dc7cb2cd49c20a5f6bcfe5446fb8340f6a555c8.tar.gz
scummvm-rg350-2dc7cb2cd49c20a5f6bcfe5446fb8340f6a555c8.tar.bz2
scummvm-rg350-2dc7cb2cd49c20a5f6bcfe5446fb8340f6a555c8.zip
Major clean-up, including:
- Cutting down the code-dup - Plucking leaks - Removing dead/unused code - Properly naming "word_2342F"-style variables and functions (removing the warnings alongside) - Fleshing out the "stubby" functions - Moving functions and variables to more appropriate/logical places - Re-ordering functions and variables - Re-structuring functions - Moving the IMD stuff into a new "Imd" class in the new imd.cpp/.h (still to be completely implemented and cleaned up) - Formatting - Getting rid off the classes "Anim", "Pack" and "Timer", along with their files svn-id: r26252
Diffstat (limited to 'engines/gob/mult.cpp')
-rw-r--r--engines/gob/mult.cpp412
1 files changed, 341 insertions, 71 deletions
diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp
index 8991494e7f..2cf94bd84a 100644
--- a/engines/gob/mult.cpp
+++ b/engines/gob/mult.cpp
@@ -25,50 +25,54 @@
#include "common/endian.h"
#include "gob/gob.h"
-#include "gob/video.h"
-#include "gob/anim.h"
-#include "gob/draw.h"
-#include "gob/scenery.h"
#include "gob/mult.h"
-#include "gob/util.h"
-#include "gob/inter.h"
-#include "gob/parse.h"
#include "gob/global.h"
-#include "gob/sound.h"
-#include "gob/palanim.h"
+#include "gob/util.h"
+#include "gob/draw.h"
#include "gob/game.h"
+#include "gob/palanim.h"
+#include "gob/scenery.h"
+#include "gob/sound.h"
+#include "gob/video.h"
namespace Gob {
Mult::Mult(GobEngine *vm) : _vm(vm) {
- int i;
-
_multData = 0;
+
+ _frame = 0;
+
+ _objCount = 0;
_objects = 0;
+
_renderData = 0;
- _renderData2 = 0;
- _objCount = 0;
- _underAnimSurf = 0;
- _frame = 0;
- _doPalSubst = 0;
+ _renderObjs = 0;
+
+ _orderArray = 0;
+
+ _index = 0;
_counter = 0;
+ _animDataAllocated = false;
+
+ for (int i = 0; i < 8; i++)
+ _multDatas[i] = 0;
+
+ _doPalSubst = false;
_animArrayX = 0;
_animArrayY = 0;
_animArrayData = 0;
- _index = 0;
-
_palKeyIndex = 0;
_oldPalette = 0;
- _palAnimKey = 0;
- for (i = 0; i < 256; i++) {
+ for (int i = 0; i < 256; i++) {
_palAnimPalette[i].red = 0;
_palAnimPalette[i].green = 0;
_palAnimPalette[i].blue = 0;
}
- for (i = 0; i < 4; i++) {
- _palAnimIndices[i] = 0;
+
+ _palAnimKey = 0;
+ for (int i = 0; i < 4; i++) {
_palAnimRed[i] = 0;
_palAnimGreen[i] = 0;
_palAnimBlue[i] = 0;
@@ -78,77 +82,343 @@ Mult::Mult(GobEngine *vm) : _vm(vm) {
_palFadingGreen = 0;
_palFadingBlue = 0;
- _animDataAllocated = 0;
-
- for (i = 0; i < 5; i++)
- for (int j = 0; j < 16; j++) {
- _fadePal[i][j].red = 0;
- _fadePal[i][j].green = 0;
- _fadePal[i][j].blue = 0;
- }
-
- _orderArray = 0;
+ _animSurf = 0;
+ _animLeft = 0;
+ _animTop = 0;
+ _animWidth = 0;
+ _animHeight = 0;
}
Mult::~Mult() {
- if (_objects)
- delete[] _objects;
- if (_orderArray)
- delete[] _orderArray;
- if (_renderData)
- delete[] _renderData;
- if (_renderData2)
- delete[] _renderData2;
- if (_multData)
- delete _multData;
- if (_animArrayX)
- delete[] _animArrayX;
- if (_animArrayY)
- delete[] _animArrayY;
- if (_animArrayData)
- delete[] _animArrayData;
+ delete[] _objects;
+ delete[] _orderArray;
+ delete[] _renderData;
+ delete[] _renderObjs;
+ delete[] _animArrayX;
+ delete[] _animArrayY;
+ delete[] _animArrayData;
+ delete _multData;
}
-void Mult::freeAll(void) {
- int16 i;
+void Mult::initAll(void) {
+ _objects = 0;
+ _animSurf = 0;
+ _renderData = 0;
+}
+void Mult::freeAll(void) {
freeMult();
- for (i = 0; i < 10; i++)
- _vm->_scenery->freeAnim(i);
- for (i = 0; i < 10; i++)
+ for (int i = 0; i < 10; i++) {
+ _vm->_scenery->freeAnim(i);
_vm->_scenery->freeStatic(i);
+ }
+ _vm->_scenery->init();
}
-void Mult::initAll(void) {
- int16 i;
+void Mult::freeMult() {
+ delete[] _objects;
+ delete[] _renderData;
+ delete[] _renderObjs;
+ delete[] _orderArray;
_objects = 0;
- _vm->_anim->_animSurf = 0;
_renderData = 0;
+ _renderObjs = 0;
+ _orderArray = 0;
- for (i = 0; i < 10; i++)
- _vm->_scenery->_animPictCount[i] = 0;
+ _animSurf = 0;
+ _vm->_draw->freeSprite(22);
+}
- for (i = 0; i < 20; i++) {
- _vm->_scenery->_spriteRefs[i] = 0;
- _vm->_scenery->_spriteResId[i] = -1;
+void Mult::checkFreeMult(void) {
+ if (_multData)
+ freeMultKeys();
+}
+
+void Mult::zeroMultData(void) {
+ _multData = 0;
+}
+
+void Mult::playMult(int16 startFrame, int16 endFrame, char checkEscape,
+ char handleMouse) {
+ bool stopNoClear;
+ bool stop;
+
+ if (!_multData)
+ return;
+
+ stopNoClear = false;
+ _frame = startFrame;
+ if (endFrame == -1)
+ endFrame = 32767;
+
+ if (_frame == -1)
+ playMultInit();
+
+ do {
+ stop = true;
+
+ if (VAR(58) == 0) {
+ drawStatics(stop);
+ drawAnims(stop);
+ }
+
+ animate();
+ if (handleMouse)
+ _vm->_draw->animateCursor(-1);
+ else
+ _vm->_draw->blitInvalidated();
+
+ if (VAR(58) == 0)
+ drawText(stop, stopNoClear);
+
+ prepPalAnim(stop);
+ doPalAnim();
+
+ doFadeAnim(stop);
+ doSoundAnim(stop, _frame);
+
+ if (_frame >= endFrame)
+ stopNoClear = true;
+
+ if (_vm->_snd->_playingSound)
+ stop = false;
+
+ _vm->_util->processInput();
+ if (checkEscape && (_vm->_util->checkKey() == 0x11B))
+ stop = true;
+
+ _frame++;
+ _vm->_util->waitEndFrame();
+ } while (!stop && !stopNoClear && !_vm->_quitRequested);
+
+ if (!stopNoClear) {
+ if (_animDataAllocated) {
+ delete[] _objects;
+ delete[] _renderData;
+ delete[] _renderObjs;
+ delete[] _animArrayX;
+ delete[] _animArrayY;
+ delete[] _animArrayData;
+ delete[] _orderArray;
+
+ _objects = 0;
+ _renderObjs = 0;
+ _renderData = 0;
+ _animArrayX = 0;
+ _animArrayY = 0;
+ _animArrayData = 0;
+ _orderArray = 0;
+
+ _animSurf = 0;
+ _vm->_draw->freeSprite(22);
+
+ _animDataAllocated = false;
+ }
+
+ if (_vm->_snd->_playingSound)
+ _vm->_snd->stopSound(10);
+
+ WRITE_VAR(57, (uint32) -1);
+ } else
+ WRITE_VAR(57, _frame - _multData->frameStart - 1);
+}
+
+void Mult::drawText(bool &stop, bool &stopNoClear) {
+ char *savedIP;
+
+ int16 cmd;
+ for (_index = 0; _index < _multData->textKeysCount; _index++) {
+ if (_multData->textKeys[_index].frame != _frame)
+ continue;
+
+ cmd = _multData->textKeys[_index].cmd;
+ if (cmd == 0) {
+ stop = false;
+ } else if (cmd == 1) {
+ stopNoClear = true;
+ _multData->frameStart = 0;
+ } else if (cmd == 3) {
+ stop = false;
+ savedIP = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr = _multData->textKeys[_index].script;
+ }
}
+}
+
+void Mult::prepPalAnim(bool &stop) {
+ _palKeyIndex = -1;
+ do {
+ _palKeyIndex++;
+ if (_palKeyIndex >= _multData->palKeysCount)
+ return;
+ } while (_multData->palKeys[_palKeyIndex].frame != _frame);
- for (i = 0; i < 10; i++)
- _vm->_scenery->_staticPictCount[i] = -1;
+ if (_multData->palKeys[_palKeyIndex].cmd == -1) {
+ stop = false;
+ _doPalSubst = false;
+ _vm->_global->_pPaletteDesc->vgaPal = _oldPalette;
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+ } else {
+ stop = false;
+ _doPalSubst = true;
+ _palAnimKey = _palKeyIndex;
- _vm->_scenery->_curStaticLayer = -1;
- _vm->_scenery->_curStatic = -1;
+ _multData->palAnimIndices[0] = 0;
+ _multData->palAnimIndices[1] = 0;
+ _multData->palAnimIndices[2] = 0;
+ _multData->palAnimIndices[3] = 0;
+
+ memcpy((char *)_palAnimPalette,
+ (char *)_vm->_global->_pPaletteDesc->vgaPal, 768);
+ _vm->_global->_pPaletteDesc->vgaPal = _palAnimPalette;
+ }
}
-void Mult::zeroMultData(void) {
- _multData = 0;
+void Mult::doPalAnim() {
+ int16 off;
+ int16 off2;
+ Video::Color *palPtr;
+ Mult_PalKey *palKey;
+
+ if (!_doPalSubst)
+ return;
+
+ for (_index = 0; _index < 4; _index++) {
+ palKey = &_multData->palKeys[_palAnimKey];
+
+ if ((_frame % palKey->rates[_index]) != 0)
+ continue;
+
+ _palAnimRed[_index] =
+ _vm->_global->_pPaletteDesc->vgaPal[palKey->subst[0][_index] - 1].red;
+ _palAnimGreen[_index] =
+ _vm->_global->_pPaletteDesc->vgaPal[palKey->subst[0][_index] - 1].green;
+ _palAnimBlue[_index] =
+ _vm->_global->_pPaletteDesc->vgaPal[palKey->subst[0][_index] - 1].blue;
+
+ while (1) {
+ off = palKey->subst[(_multData->palAnimIndices[_index] + 1) % 16][_index];
+ if (off == 0) {
+ off = palKey->subst[_multData->palAnimIndices[_index]][_index] - 1;
+
+ _vm->_global->_pPaletteDesc->vgaPal[off].red = _palAnimRed[_index];
+ _vm->_global->_pPaletteDesc->vgaPal[off].green = _palAnimGreen[_index];
+ _vm->_global->_pPaletteDesc->vgaPal[off].blue = _palAnimBlue[_index];
+ } else {
+ off = palKey->subst[(_multData->palAnimIndices[_index] + 1) % 16][_index] - 1;
+ off2 = palKey->subst[_multData->palAnimIndices[_index]][_index] - 1;
+
+ _vm->_global->_pPaletteDesc->vgaPal[off2].red =
+ _vm->_global->_pPaletteDesc->vgaPal[off].red;
+ _vm->_global->_pPaletteDesc->vgaPal[off2].green =
+ _vm->_global->_pPaletteDesc->vgaPal[off].green;
+ _vm->_global->_pPaletteDesc->vgaPal[off2].blue =
+ _vm->_global->_pPaletteDesc->vgaPal[off].blue;
+ }
+
+ _multData->palAnimIndices[_index] = (_multData->palAnimIndices[_index] + 1) % 16;
+
+ off = palKey->subst[_multData->palAnimIndices[_index]][_index];
+
+ if (off == 0) {
+ _multData->palAnimIndices[_index] = 0;
+ off = palKey->subst[0][_index] - 1;
+
+ _palAnimRed[_index] = _vm->_global->_pPaletteDesc->vgaPal[off].red;
+ _palAnimGreen[_index] = _vm->_global->_pPaletteDesc->vgaPal[off].green;
+ _palAnimBlue[_index] = _vm->_global->_pPaletteDesc->vgaPal[off].blue;
+ }
+ if (_multData->palAnimIndices[_index] == 0)
+ break;
+ }
+ }
+
+ if (_vm->_global->_colorCount == 256) {
+ _vm->_video->waitRetrace(_vm->_global->_videoMode);
+
+ palPtr = _vm->_global->_pPaletteDesc->vgaPal;
+ for (_counter = 0; _counter < 16; _counter++, palPtr++)
+ _vm->_video->setPalElem(_counter, palPtr->red, palPtr->green,
+ palPtr->blue, 0, 0x13);
+
+ palPtr = _vm->_global->_pPaletteDesc->vgaPal;
+ for (_counter = 0; _counter < 16; _counter++, palPtr++)
+ _vm->_global->_redPalette[_counter] = palPtr->red;
+ _vm->_global->_greenPalette[_counter] = palPtr->green;
+ _vm->_global->_bluePalette[_counter] = palPtr->blue;
+
+ } else
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
}
-void Mult::checkFreeMult(void) {
- if (_multData)
- freeMultKeys();
+void Mult::doFadeAnim(bool &stop) {
+ Mult_PalFadeKey *fadeKey;
+
+ for (_index = 0; _index < _multData->palFadeKeysCount; _index++) {
+ fadeKey = &_multData->palFadeKeys[_index];
+
+ if (fadeKey->frame != _frame)
+ continue;
+
+ stop = false;
+ if (!(fadeKey->flag & 1)) {
+ if (fadeKey->fade == 0) {
+ _vm->_global->_pPaletteDesc->vgaPal =
+ _multData->fadePal[fadeKey->palIndex];
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+ } else {
+ _vm->_global->_pPaletteDesc->vgaPal =
+ _multData->fadePal[fadeKey->palIndex];
+ _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, fadeKey->fade, 0);
+ }
+ } else {
+ _vm->_global->_pPaletteDesc->vgaPal =
+ _multData->fadePal[fadeKey->palIndex];
+ _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, fadeKey->fade, -1);
+
+ _palFadingRed = (fadeKey->flag >> 1) & 1;
+ _palFadingGreen = (fadeKey->flag >> 2) & 1;
+ _palFadingBlue = (fadeKey->flag >> 3) & 1;
+ }
+ }
+
+ if (_palFadingRed) {
+ _palFadingRed = !_vm->_palAnim->fadeStep(1);
+ stop = false;
+ }
+ if (_palFadingGreen) {
+ _palFadingGreen = !_vm->_palAnim->fadeStep(2);
+ stop = false;
+ }
+ if (_palFadingBlue) {
+ _palFadingBlue = !_vm->_palAnim->fadeStep(3);
+ stop = false;
+ }
+}
+
+void Mult::doSoundAnim(bool &stop, int16 frame) {
+ Mult_SndKey *sndKey;
+ for (_index = 0; _index < _multData->sndKeysCount; _index++) {
+ sndKey = &_multData->sndKeys[_index];
+ if (sndKey->frame != frame)
+ continue;
+
+ if (sndKey->cmd != -1) {
+ if ((sndKey->cmd == 1) || (sndKey->cmd == 4)) {
+ SoundDesc &sample = _vm->_game->_soundSamples[sndKey->soundIndex];
+
+ _vm->_snd->stopSound(0);
+ if (!sample.empty())
+ _vm->_snd->playSample(sample, sndKey->repCount,
+ sndKey->freq, sndKey->fadeLength);
+ }
+ } else {
+ if (_vm->_snd->_playingSound)
+ _vm->_snd->stopSound(sndKey->fadeLength);
+ }
+ }
}
-} // End of namespace Gob
+} // End of namespace Gob