diff options
author | Benjamin Haisch | 2011-04-11 11:36:53 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2011-11-20 22:43:10 +0100 |
commit | acd4d4098f880aa639895f3cfecbac0764999112 (patch) | |
tree | bbd16a9dc5c7006d738fa183e0e3b580cff664da /engines/toltecs | |
parent | e1fefefff2f2adc26cff5cc8f0c62cb210b31415 (diff) | |
download | scummvm-rg350-acd4d4098f880aa639895f3cfecbac0764999112.tar.gz scummvm-rg350-acd4d4098f880aa639895f3cfecbac0764999112.tar.bz2 scummvm-rg350-acd4d4098f880aa639895f3cfecbac0764999112.zip |
TOLTECS: Fix bugs
- Save scene parameters before playing a movie and restore them afterwards (fixes crash)
- Fix text disappearing too fast
- Implement script function sfGetCameraChanged
- Replace nop script functions with stubs which print debug info when called
- Some cleanup, remove obsolete TODOs
Diffstat (limited to 'engines/toltecs')
-rw-r--r-- | engines/toltecs/animation.cpp | 2 | ||||
-rw-r--r-- | engines/toltecs/menu.h | 1 | ||||
-rw-r--r-- | engines/toltecs/movie.cpp | 17 | ||||
-rw-r--r-- | engines/toltecs/render.cpp | 3 | ||||
-rw-r--r-- | engines/toltecs/resource.cpp | 1 | ||||
-rw-r--r-- | engines/toltecs/saveload.cpp | 1 | ||||
-rw-r--r-- | engines/toltecs/screen.cpp | 10 | ||||
-rw-r--r-- | engines/toltecs/script.cpp | 36 | ||||
-rw-r--r-- | engines/toltecs/script.h | 2 | ||||
-rw-r--r-- | engines/toltecs/segmap.cpp | 2 | ||||
-rw-r--r-- | engines/toltecs/sound.cpp | 2 | ||||
-rw-r--r-- | engines/toltecs/toltecs.cpp | 5 | ||||
-rw-r--r-- | engines/toltecs/toltecs.h | 1 |
13 files changed, 59 insertions, 24 deletions
diff --git a/engines/toltecs/animation.cpp b/engines/toltecs/animation.cpp index 8c0337d1c3..eef9cef9ed 100644 --- a/engines/toltecs/animation.cpp +++ b/engines/toltecs/animation.cpp @@ -147,7 +147,6 @@ void AnimationPlayer::saveState(Common::WriteStream *out) { } void AnimationPlayer::loadState(Common::ReadStream *in) { - _resIndex = in->readUint16LE(); _width = in->readUint16LE(); _height = in->readUint16LE(); @@ -160,7 +159,6 @@ void AnimationPlayer::loadState(Common::ReadStream *in) { _firstCurFrameSize = in->readUint32LE(); _firstNextFrameSize = in->readUint32LE(); _firstNextFrameOffset = in->readUint32LE(); - } } // End of namespace Toltecs diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h index d4cbddcd81..3e2c2da8d9 100644 --- a/engines/toltecs/menu.h +++ b/engines/toltecs/menu.h @@ -94,7 +94,6 @@ protected: struct Item { Common::Rect rect; ItemID id; - //const byte *caption; Common::String caption; byte defaultColor, activeColor; int x, y, w; diff --git a/engines/toltecs/movie.cpp b/engines/toltecs/movie.cpp index 36ba5c738a..c396d6d4b5 100644 --- a/engines/toltecs/movie.cpp +++ b/engines/toltecs/movie.cpp @@ -41,7 +41,12 @@ MoviePlayer::~MoviePlayer() { void MoviePlayer::playMovie(uint resIndex) { - uint32 subtitleSlot; + const uint32 subtitleSlot = kMaxScriptSlots - 1; + int16 savedSceneWidth = _vm->_sceneWidth; + int16 savedSceneHeight = _vm->_sceneHeight; + int16 savedCameraHeight = _vm->_cameraHeight; + int16 savedCameraX = _vm->_cameraX; + int16 savedCameraY = _vm->_cameraY; byte moviePalette[768]; _vm->_isSaveAllowed = false; @@ -53,8 +58,6 @@ void MoviePlayer::playMovie(uint resIndex) { _vm->_arc->openResource(resIndex); - subtitleSlot = kMaxScriptSlots - 1; - _frameCount = _vm->_arc->readUint32LE(); _chunkCount = _vm->_arc->readUint32LE(); @@ -170,6 +173,12 @@ void MoviePlayer::playMovie(uint resIndex) { debug(0, "playMovie() done"); + _vm->_sceneWidth = savedSceneWidth; + _vm->_sceneHeight = savedSceneHeight; + _vm->_cameraHeight = savedCameraHeight; + _vm->_cameraX = savedCameraX; + _vm->_cameraY = savedCameraY; + _vm->_isSaveAllowed = true; } @@ -187,7 +196,7 @@ void MoviePlayer::fetchAudioChunks() { byte chunkType = _vm->_arc->readByte(); uint32 chunkSize = _vm->_arc->readUint32LE(); if (chunkType == 4) { - byte *chunkBuffer = new byte[chunkSize]; + byte *chunkBuffer = (byte*)malloc(chunkSize); _vm->_arc->read(chunkBuffer, chunkSize); _audioStream->queueBuffer(chunkBuffer, chunkSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED); chunkBuffer = NULL; diff --git a/engines/toltecs/render.cpp b/engines/toltecs/render.cpp index b7e859a619..c6dbe939b3 100644 --- a/engines/toltecs/render.cpp +++ b/engines/toltecs/render.cpp @@ -73,7 +73,6 @@ void RenderQueue::addSprite(SpriteDrawItem &sprite) { void RenderQueue::addText(int16 x, int16 y, byte color, uint fontResIndex, byte *text, int len) { - // TODO: Font caching? Font font(_vm->_res->load(fontResIndex)->data); RenderQueueItem item; @@ -248,8 +247,6 @@ RenderQueueItem *RenderQueue::findItemInQueue(RenderQueueArray *queue, const Ren bool RenderQueue::hasItemChanged(const RenderQueueItem &item1, const RenderQueueItem &item2) { - // TODO: Clean up. - if (item1.type != item1.type) return true; diff --git a/engines/toltecs/resource.cpp b/engines/toltecs/resource.cpp index cbd0bcb7f7..ddc1a6e126 100644 --- a/engines/toltecs/resource.cpp +++ b/engines/toltecs/resource.cpp @@ -57,7 +57,6 @@ uint32 ArchiveReader::openResource(uint resIndex) { void ArchiveReader::closeResource() { } - uint32 ArchiveReader::getResourceSize(uint resIndex) { return _offsets[resIndex + 1] - _offsets[resIndex]; } diff --git a/engines/toltecs/saveload.cpp b/engines/toltecs/saveload.cpp index f2bcc1afe8..aa045378f2 100644 --- a/engines/toltecs/saveload.cpp +++ b/engines/toltecs/saveload.cpp @@ -34,7 +34,6 @@ namespace Toltecs { /* TODO: - - Saveload is working so far but only one slot is supported until the game menu is implemented - Save with F7; Load with F9 - Saving during an animation (AnimationPlayer) is not working correctly yet - Maybe switch to SCUMM/Tinsel serialization approach? diff --git a/engines/toltecs/screen.cpp b/engines/toltecs/screen.cpp index b2979b7b05..4eda8f643f 100644 --- a/engines/toltecs/screen.cpp +++ b/engines/toltecs/screen.cpp @@ -125,7 +125,7 @@ void Screen::drawGuiImage(int16 x, int16 y, uint resIndex) { int16 height = imageData[3]; int16 workWidth = width, workHeight = height; imageData += headerSize; - + byte *dest = _frontScreen + x + (y + _vm->_cameraHeight) * 640; //debug(0, "Screen::drawGuiImage() x = %d; y = %d; w = %d; h = %d; resIndex = %d", x, y, width, height, resIndex); @@ -444,9 +444,8 @@ void Screen::updateTalkText(int16 slotIndex, int16 slotOffset) { } int16 textDurationMultiplier = item->duration + 8; - // TODO: Check sound/text flags - if (*textData == 0xFE) { - //textDurationMultiplier += 100; + if (_vm->_doSpeech && *textData == 0xFE) { + textDurationMultiplier += 100; } item->duration = 4 * textDurationMultiplier * durationModifier; @@ -478,7 +477,8 @@ void Screen::addTalkTextItemsToRenderQueue() { if (item->fontNum == -1 || item->duration == 0) continue; - item->duration -= _vm->_counter01; + //item->duration -= _vm->_counter01; + item->duration--; if (item->duration < 0) item->duration = 0; diff --git a/engines/toltecs/script.cpp b/engines/toltecs/script.cpp index fa5eb4d5d9..c128d5a325 100644 --- a/engines/toltecs/script.cpp +++ b/engines/toltecs/script.cpp @@ -66,71 +66,85 @@ typedef Common::Functor0Mem<void, ScriptInterpreter> ScriptFunctionF; _scriptFuncNames.push_back(#x); void ScriptInterpreter::setupScriptFunctions() { + // 0 RegisterScriptFunction(sfNop); RegisterScriptFunction(sfNop); RegisterScriptFunction(sfGetGameVar); RegisterScriptFunction(sfSetGameVar); RegisterScriptFunction(sfUpdateScreen); + // 5 RegisterScriptFunction(sfGetRandomNumber); RegisterScriptFunction(sfDrawGuiTextMulti); RegisterScriptFunction(sfUpdateVerbLine); RegisterScriptFunction(sfSetFontColor); RegisterScriptFunction(sfGetTalkTextDuration); + // 10 RegisterScriptFunction(sfTalk); RegisterScriptFunction(sfFindPaletteFragment); RegisterScriptFunction(sfClearPaletteFragments); RegisterScriptFunction(sfAddPaletteFragment); RegisterScriptFunction(sfSetDeltaAnimPalette); - RegisterScriptFunction(sfNop); // TODO + // 15 + RegisterScriptFunction(sfSetUnkPaletteEffect); RegisterScriptFunction(sfBuildColorTransTable); RegisterScriptFunction(sfSetDeltaMainPalette); RegisterScriptFunction(sfLoadScript); RegisterScriptFunction(sfRegisterFont); + // 20 RegisterScriptFunction(sfLoadAddPalette); RegisterScriptFunction(sfLoadScene); RegisterScriptFunction(sfSetGuiHeight); RegisterScriptFunction(sfFindMouseInRectIndex1); RegisterScriptFunction(sfFindMouseInRectIndex2); + // 25 RegisterScriptFunction(sfDrawGuiImage); RegisterScriptFunction(sfAddAnimatedSpriteNoLoop); RegisterScriptFunction(sfAddAnimatedSprite); RegisterScriptFunction(sfAddStaticSprite); RegisterScriptFunction(sfAddAnimatedSpriteScaled); + // 30 RegisterScriptFunction(sfFindPath); RegisterScriptFunction(sfWalk); RegisterScriptFunction(sfScrollCameraUp); RegisterScriptFunction(sfScrollCameraDown); RegisterScriptFunction(sfScrollCameraLeft); + // 35 RegisterScriptFunction(sfScrollCameraRight); RegisterScriptFunction(sfScrollCameraUpEx); RegisterScriptFunction(sfScrollCameraDownEx); RegisterScriptFunction(sfScrollCameraLeftEx); RegisterScriptFunction(sfScrollCameraRightEx); + // 40 RegisterScriptFunction(sfSetCamera); - RegisterScriptFunction(sfNop); // TODO + RegisterScriptFunction(sfGetCameraChanged); RegisterScriptFunction(sfGetRgbModifiertAtPoint); RegisterScriptFunction(sfStartAnim); RegisterScriptFunction(sfAnimNextFrame); + // 45 RegisterScriptFunction(sfNop); RegisterScriptFunction(sfGetAnimFrameNumber); RegisterScriptFunction(sfGetAnimStatus); RegisterScriptFunction(sfStartShakeScreen); RegisterScriptFunction(sfStopShakeScreen); + // 50 RegisterScriptFunction(sfStartSequence); RegisterScriptFunction(sfEndSequence); RegisterScriptFunction(sfSetSequenceVolume); RegisterScriptFunction(sfPlayPositionalSound); RegisterScriptFunction(sfPlaySound2); + // 55 RegisterScriptFunction(sfClearScreen); RegisterScriptFunction(sfNop); RegisterScriptFunction(sfHandleInput); RegisterScriptFunction(sfRunOptionsScreen); RegisterScriptFunction(sfPrecacheSprites); + // 60 RegisterScriptFunction(sfPrecacheSounds1); RegisterScriptFunction(sfDeletePrecachedFiles); RegisterScriptFunction(sfPrecacheSounds2); RegisterScriptFunction(sfRestoreStackPtr); RegisterScriptFunction(sfSaveStackPtr); + // 65 RegisterScriptFunction(sfPlayMovie); RegisterScriptFunction(sfNop); @@ -849,6 +863,11 @@ void ScriptInterpreter::sfSetDeltaAnimPalette() { _vm->_palette->setDeltaPalette(_vm->_palette->getAnimPalette(), arg8(6), (char)arg8(5), arg8(4), arg8(3)); } +void ScriptInterpreter::sfSetUnkPaletteEffect() { + // TODO + debug("ScriptInterpreter::sfSetUnkPaletteEffect"); +} + void ScriptInterpreter::sfBuildColorTransTable() { _vm->_palette->buildColorTransTable(arg8(4), (char)arg8(3), arg8(5)); } @@ -977,6 +996,10 @@ void ScriptInterpreter::sfSetCamera() { _vm->setCamera(arg16(5), arg16(3)); } +void ScriptInterpreter::sfGetCameraChanged() { + localWrite16(arg16(3), _vm->getCameraChanged() ? 1 : 0); +} + void ScriptInterpreter::sfGetRgbModifiertAtPoint() { byte *rgb = getSlotData(arg16(11)) + arg16(9); _vm->_segmap->getRgbModifiertAtPoint(arg16(5), arg16(3), arg16(7), rgb[0], rgb[1], rgb[2]); @@ -1012,15 +1035,21 @@ void ScriptInterpreter::sfStopShakeScreen() { void ScriptInterpreter::sfStartSequence() { // TODO - //_vm->_arc->dump(arg16(3)); + // DEBUG: Dump music so we know what's in there + int16 sequenceResIndex = arg16(3); + debug("ScriptInterpreter::sfStartSequence(%d)", sequenceResIndex); + if (sequenceResIndex >= 0) + _vm->_arc->dump(sequenceResIndex, "music"); } void ScriptInterpreter::sfEndSequence() { // TODO + debug("ScriptInterpreter::sfEndSequence"); } void ScriptInterpreter::sfSetSequenceVolume() { // TODO + //debug("ScriptInterpreter::sfSetSequenceVolume"); } void ScriptInterpreter::sfPlayPositionalSound() { @@ -1033,6 +1062,7 @@ void ScriptInterpreter::sfPlaySound2() { void ScriptInterpreter::sfClearScreen() { // TODO + debug("ScriptInterpreter::sfClearScreen"); } void ScriptInterpreter::sfHandleInput() { diff --git a/engines/toltecs/script.h b/engines/toltecs/script.h index 04bebdd20c..1a5a9c90ad 100644 --- a/engines/toltecs/script.h +++ b/engines/toltecs/script.h @@ -126,6 +126,7 @@ protected: void sfClearPaletteFragments(); void sfAddPaletteFragment(); void sfSetDeltaAnimPalette(); + void sfSetUnkPaletteEffect(); void sfBuildColorTransTable(); void sfSetDeltaMainPalette(); void sfLoadScript(); @@ -151,6 +152,7 @@ protected: void sfScrollCameraLeftEx(); void sfScrollCameraRightEx(); void sfSetCamera(); + void sfGetCameraChanged(); void sfGetRgbModifiertAtPoint(); void sfStartAnim(); void sfAnimNextFrame(); diff --git a/engines/toltecs/segmap.cpp b/engines/toltecs/segmap.cpp index 40471fee43..6fbc04a9c5 100644 --- a/engines/toltecs/segmap.cpp +++ b/engines/toltecs/segmap.cpp @@ -36,8 +36,6 @@ SegmentMap::~SegmentMap() { void SegmentMap::load(byte *source) { - // TODO: Use MemoryReadStream - freeSegmapMaskRectSurfaces(); _maskRects.clear(); _pathRects.clear(); diff --git a/engines/toltecs/sound.cpp b/engines/toltecs/sound.cpp index 00b4a452d3..3bebd81345 100644 --- a/engines/toltecs/sound.cpp +++ b/engines/toltecs/sound.cpp @@ -51,7 +51,7 @@ void Sound::playSound(int16 resIndex, int16 type, int16 volume) { // TODO: Use the right volumes - debug("playSound(%d, %d, %d)", resIndex, type, volume); + debug(0, "playSound(%d, %d, %d)", resIndex, type, volume); if (volume == -1 || type == -2) { if (type == kChannelTypeBackground) { diff --git a/engines/toltecs/toltecs.cpp b/engines/toltecs/toltecs.cpp index f1d6040399..3fa7f00905 100644 --- a/engines/toltecs/toltecs.cpp +++ b/engines/toltecs/toltecs.cpp @@ -214,7 +214,6 @@ void ToltecsEngine::requestLoadgame(int slotNum) { } void ToltecsEngine::loadScene(uint resIndex) { - // TODO Resource *sceneResource = _res->load(resIndex); byte *scene = sceneResource->data; @@ -431,6 +430,10 @@ void ToltecsEngine::setCamera(int16 x, int16 y) { } +bool ToltecsEngine::getCameraChanged() { + return _cameraX != _newCameraX || _cameraY != _newCameraY; +} + void ToltecsEngine::scrollCameraUp(int16 delta) { if (_newCameraY > 0) { if (_newCameraY < delta) diff --git a/engines/toltecs/toltecs.h b/engines/toltecs/toltecs.h index 38a8952bcc..2aa3585b91 100644 --- a/engines/toltecs/toltecs.h +++ b/engines/toltecs/toltecs.h @@ -112,6 +112,7 @@ public: void setGuiHeight(int16 guiHeight); void setCamera(int16 x, int16 y); + bool getCameraChanged(); void scrollCameraUp(int16 delta); void scrollCameraDown(int16 delta); void scrollCameraLeft(int16 delta); |