diff --git a/engines/dragons/background.cpp b/engines/dragons/background.cpp index 93bebaf3765..3170333a81e 100644 --- a/engines/dragons/background.cpp +++ b/engines/dragons/background.cpp @@ -88,7 +88,9 @@ Background::Background() : _priorityLayer(0), _points1(0), _points2(0), _data(0) _layerSurface[0] = NULL; _layerSurface[1] = NULL; _layerSurface[2] = NULL; - _xOffset = 0; + layerOffset[0] = Common::Point(0,0); + layerOffset[1] = Common::Point(0,0); + layerOffset[2] = Common::Point(0,0); } Background::~Background() { @@ -274,12 +276,14 @@ void Background::setPalette(byte *newPalette) { } } -void Background::setXOffset(int16 xOffset) { - _xOffset = xOffset; +void Background::setLayerOffset(uint8 layerNumber, Common::Point offset) { + assert(layerNumber < 4); + layerOffset[layerNumber] = offset; } -int16 Background::getXOffset() { - return _xOffset; +Common::Point Background::getLayerOffset(uint8 layerNumber) { + assert(layerNumber < 4); + return layerOffset[layerNumber]; } BackgroundResourceLoader::BackgroundResourceLoader(BigfileArchive *bigFileArchive, DragonRMS *dragonRMS) : _bigFileArchive( diff --git a/engines/dragons/background.h b/engines/dragons/background.h index bf36f59732d..3c6f1a76c68 100644 --- a/engines/dragons/background.h +++ b/engines/dragons/background.h @@ -62,8 +62,7 @@ private: Common::Point *_points1; Common::Point *_points2; uint8 layerPriority[3]; - int16 _xOffset; - + Common::Point layerOffset[3]; public: Background(); ~Background(); @@ -91,8 +90,8 @@ public: void overlayImage(uint16 layerNum, byte *data, int16 x, int16 y, int16 w, int16 h); void restoreTiles(uint16 layerNum, int16 x, int16 y, int16 w, int16 h); void setPalette(byte *newPalette); - void setXOffset(int16 xOffset); - int16 getXOffset(); + void setLayerOffset(uint8 layerNumber, Common::Point offset); + Common::Point getLayerOffset(uint8 layerNumber); private: Common::Point *loadPoints(Common::SeekableReadStream &stream); Graphics::Surface *initGfxLayer(TileMap &tileMap); diff --git a/engines/dragons/minigame3.cpp b/engines/dragons/minigame3.cpp index 77ea85bb897..18ef0c2f961 100644 --- a/engines/dragons/minigame3.cpp +++ b/engines/dragons/minigame3.cpp @@ -766,13 +766,7 @@ void Minigame3::run() { } void Minigame3::updateBackgroundLayerOffset(uint32 layerNumber, int16 xOffset, int16 yOffset) { - _vm->_scene->setLayerXOffset(layerNumber, xOffset); -// int iVar1; -// -// iVar1 = (param_1 & 0xffff) * 0x24; -// *(undefined2 *)(&DAT_80069644 + iVar1) = param_2; -// *(short *)(&DAT_80069646 + iVar1) = param_3 + 8; - + _vm->_scene->setLayerOffset(layerNumber, Common::Point(xOffset, yOffset)); } void Minigame3::FUN_80017f70_paletteRelated(uint16 param_1) { diff --git a/engines/dragons/scene.cpp b/engines/dragons/scene.cpp index 03b8910994f..f3c87284d8d 100644 --- a/engines/dragons/scene.cpp +++ b/engines/dragons/scene.cpp @@ -339,7 +339,7 @@ void Scene::loadSceneData(uint32 sceneId, uint32 cameraPointId) { } void Scene::draw() { - Common::Rect rect(_camera.x + _stage->getXOffset(), _camera.y, _camera.x + 320 + _stage->getXOffset(), _camera.y + 200); + Common::Rect rect(_camera.x, _camera.y, _camera.x + 320, _camera.y + 200); _vm->_screen->clearScreen(); for(uint16 priority = 1; priority < 16; priority++) { @@ -348,11 +348,11 @@ void Scene::draw() { } if (priority == _stage->getBgLayerPriority()) { - _screen->copyRectToSurface8bpp(*_stage->getBgLayer(), _screen->getPalette(0), 0, 0, rect, false, 128); + drawBgLayer(0, rect, _stage->getBgLayer()); } else if (priority == _stage->getMgLayerPriority()) { - _screen->copyRectToSurface8bpp(*_stage->getMgLayer(), _screen->getPalette(0), 0, 0, rect, false, 128); + drawBgLayer(1, rect, _stage->getMgLayer()); } else if (priority == _stage->getFgLayerPriority()) { - _screen->copyRectToSurface8bpp(*_stage->getFgLayer(), _screen->getPalette(0), 0, 0, rect, false, 128); + drawBgLayer(2, rect, _stage->getFgLayer()); } else if (priority == 5) { if (_vm->isFlagSet(ENGINE_FLAG_80)) { _vm->_inventory->draw(); @@ -490,10 +490,22 @@ void Scene::drawActorNumber(int16 x, int16 y, uint16 actorId) { _vm->_fontManager->addText(x, y, text, strlen(text8), 1); } -void Scene::setLayerXOffset(uint8 layerNumber, uint16 xOffset) { - if (layerNumber == 2) { - _stage->setXOffset(xOffset); - } +void Scene::setLayerOffset(uint8 layerNumber, Common::Point offset) { + _stage->setLayerOffset(layerNumber, offset); +} + +Common::Point Scene::getLayerOffset(uint8 layerNumber) { + return _stage->getLayerOffset(layerNumber); +} + +void Scene::drawBgLayer(uint8 layerNumber, Common::Rect rect, Graphics::Surface *surface) { + Common::Point offset = _stage->getLayerOffset(layerNumber); + Common::Rect clippedRect = _screen->clipRectToRect(offset.x, offset.y, rect, Common::Rect(_stage->getBgLayer()->w, _stage->getBgLayer()->h)); + clippedRect.left += offset.x < 0 ? -offset.x : 0; + clippedRect.right += offset.x < 0 ? -offset.x : 0; + clippedRect.top += offset.y < 0 ? -offset.y : 0; + clippedRect.bottom += offset.y < 0 ? -offset.y : 0; + _screen->copyRectToSurface8bpp(*surface, _screen->getPalette(0), 0, 0, clippedRect, false, 128); } } // End of namespace Dragons diff --git a/engines/dragons/scene.h b/engines/dragons/scene.h index 3959d6bf39a..c615b80a01d 100644 --- a/engines/dragons/scene.h +++ b/engines/dragons/scene.h @@ -81,10 +81,12 @@ public: void setMgLayerPriority(uint8 newPriority); void setFgLayerPriority(uint8 newPriority); - void setLayerXOffset(uint8 layerNumber, uint16 xOffset); + void setLayerOffset(uint8 layerNumber, Common::Point offset); + Common::Point getLayerOffset(uint8 layerNumber); private: void resetActorFrameFlags(); void drawActorNumber(int16 x, int16 y, uint16 actorId); + void drawBgLayer(uint8 layerNumber, Common::Rect rect, Graphics::Surface *surface); }; } // End of namespace Dragons diff --git a/engines/dragons/screen.cpp b/engines/dragons/screen.cpp index 4e9df61f955..7df1518578b 100644 --- a/engines/dragons/screen.cpp +++ b/engines/dragons/screen.cpp @@ -157,17 +157,21 @@ void Screen::copyRectToSurface8bpp(const void *buffer, byte* palette, int srcPit } Common::Rect Screen::clipRectToScreen(int destX, int destY, const Common::Rect rect) { + return clipRectToRect(destX, destY, rect, Common::Rect(320, 200)); +} + +Common::Rect Screen::clipRectToRect(int destX, int destY, const Common::Rect rect, const Common::Rect containerRect) { int16 x, y, w, h; x = rect.left; y = rect.top; w = rect.width(); h = rect.height(); - if (destX >= 320) { + if (destX >= containerRect.width()) { w = 0; } - if (destY >= 200) { + if (destY >= containerRect.height()) { h = 0; } @@ -181,12 +185,12 @@ Common::Rect Screen::clipRectToScreen(int destX, int destY, const Common::Rect r y += -destY; } - if (w > 0 && destX + w >= 320) { - w -= (destX + w) - 320; + if (w > 0 && destX + w >= containerRect.width()) { + w -= (destX + w) - containerRect.width(); } - if (h > 0 && destY + h >= 200) { - h -= (destY + h) - 200; + if (h > 0 && destY + h >= containerRect.height()) { + h -= (destY + h) - containerRect.height(); } if (w < 0) { diff --git a/engines/dragons/screen.h b/engines/dragons/screen.h index 2adf2e314a8..eb20da2e421 100644 --- a/engines/dragons/screen.h +++ b/engines/dragons/screen.h @@ -48,10 +48,12 @@ public: void updatePaletteTransparency(uint16 paletteNum, uint16 startOffset, uint16 endOffset, bool isTransparent); void clearScreen(); void drawRect(uint16 colour, Common::Rect rect, int id); + Common::Rect clipRectToScreen(int destX, int destY, const Common::Rect rect); + Common::Rect clipRectToRect(int destX, int destY, const Common::Rect rect, const Common::Rect containerRect); + private: void copyRectToSurface(const void *buffer, int srcPitch, int srcWidth, int srcXOffset, int destX, int destY, int width, int height, bool flipX, uint8 alpha); void copyRectToSurface8bpp(const void *buffer, byte* palette, int srcPitch, int srcWidth, int srcXOffset, int destX, int destY, int width, int height, bool flipX, uint8 alpha); - Common::Rect clipRectToScreen(int destX, int destY, const Common::Rect rect); }; } // End of namespace Dragons diff --git a/engines/dragons/scriptopcodes.cpp b/engines/dragons/scriptopcodes.cpp index da45aa0eaaf..0f85318b60d 100644 --- a/engines/dragons/scriptopcodes.cpp +++ b/engines/dragons/scriptopcodes.cpp @@ -164,30 +164,30 @@ bool ScriptOpcodes::runScript4(ScriptOpCall &scriptOpCall) { } void ScriptOpcodes::executeScriptLoop(ScriptOpCall &scriptOpCall) { - - if (scriptOpCall._code >= scriptOpCall._codeEnd || scriptOpCall._result & 1) { - return; - } - - if (_vm->isFlagSet(Dragons::ENGINE_FLAG_100000)) { - return; - } - - if (_vm->isFlagSet(Dragons::ENGINE_FLAG_80000)) { - //TODO -// if (IsPressedStart(0)) { -// Dragons::getEngine()->setFlags(Dragons::ENGINE_FLAG_100000); -// } - } - - uint16 opcode = READ_LE_UINT16(scriptOpCall._code) & 0x7fff; - - scriptOpCall._op = (byte) opcode; - if (opcode < DRAGONS_NUM_SCRIPT_OPCODES) { - execOpcode(scriptOpCall); - } - - while (scriptOpCall._code < scriptOpCall._codeEnd && !(scriptOpCall._result & 1) && _data_80071f5c == 0) { +// +// if (scriptOpCall._code >= scriptOpCall._codeEnd || scriptOpCall._result & 1) { +// return; +// } +// +// if (_vm->isFlagSet(Dragons::ENGINE_FLAG_100000)) { +// return; +// } +// +// if (_vm->isFlagSet(Dragons::ENGINE_FLAG_80000)) { +// //TODO +//// if (IsPressedStart(0)) { +//// Dragons::getEngine()->setFlags(Dragons::ENGINE_FLAG_100000); +//// } +// } +// +// uint16 opcode = READ_LE_UINT16(scriptOpCall._code) & 0x7fff; +// +// scriptOpCall._op = (byte) opcode; +// if (opcode < DRAGONS_NUM_SCRIPT_OPCODES) { +// execOpcode(scriptOpCall); +// } +// + while (scriptOpCall._code < scriptOpCall._codeEnd && !(scriptOpCall._result & 1)) { if (_vm->isFlagSet(Dragons::ENGINE_FLAG_100000)) { return; @@ -200,13 +200,18 @@ void ScriptOpcodes::executeScriptLoop(ScriptOpCall &scriptOpCall) { // } } - opcode = READ_LE_UINT16(scriptOpCall._code) & 0x7fff; + uint16 opcode = READ_LE_UINT16(scriptOpCall._code) & 0x7fff; if (opcode >= DRAGONS_NUM_SCRIPT_OPCODES) { return; //TODO should continue here. } scriptOpCall._op = (byte) opcode; execOpcode(scriptOpCall); + + if (_data_80071f5c != 0) { + scriptOpCall._result |= 1; + break; + } } }