diff options
-rw-r--r-- | engines/sherlock/scene.cpp | 2 | ||||
-rw-r--r-- | engines/sherlock/screen.cpp | 23 | ||||
-rw-r--r-- | engines/sherlock/screen.h | 14 | ||||
-rw-r--r-- | engines/sherlock/tattoo/tattoo_scene.cpp | 72 | ||||
-rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.cpp | 46 | ||||
-rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.h | 8 | ||||
-rw-r--r-- | engines/sherlock/user_interface.h | 5 |
7 files changed, 102 insertions, 68 deletions
diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 76fb7ae3a7..5b2cd9c1f4 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -336,7 +336,7 @@ bool Scene::loadScene(const Common::String &filename) { screen.translatePalette(screen._cMap); screen.setupBGArea(screen._cMap); - screen.initScrollVars(); + ui.initScrollVars(); // Read in background if (_lzwMode) { diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp index a3af5559c7..708493cd30 100644 --- a/engines/sherlock/screen.cpp +++ b/engines/sherlock/screen.cpp @@ -44,10 +44,6 @@ Screen::Screen(SherlockEngine *vm) : Surface(g_system->getWidth(), g_system->get // Rose Tattoo specific fields _fadeBytesRead = _fadeBytesToRead = 0; _oldFadePercent = 0; - _scrollSize = 0; - _scrollSpeed = 0; - _currentScroll = 0; - _targetScroll = 0; _flushScreen = false; } @@ -310,6 +306,16 @@ void Screen::flushScaleImage(ImageFrame *frame, const Common::Point &pt, int16 * *height = newBounds.height(); } +void Screen::blockMove(const Common::Rect &r, const Common::Point &scrollPos) { + Common::Rect bounds = r; + bounds.translate(scrollPos.x, scrollPos.y); + slamRect(bounds); +} + +void Screen::blockMove(const Common::Point &scrollPos) { + blockMove(Common::Rect(0, 0, w(), h()), scrollPos); +} + void Screen::print(const Common::Point &pt, byte color, const char *formatStr, ...) { // Create the string to display va_list args; @@ -491,15 +497,6 @@ void Screen::setupBGArea(const byte cMap[PALETTE_SIZE]) { warning("TODO"); } -/** - * Initializes scroll variables - */ -void Screen::initScrollVars() { - _scrollSize = 0; - _currentScroll = 0; - _targetScroll = 0; -} - void Screen::translatePalette(byte palette[PALETTE_SIZE]) { for (int idx = 0; idx < PALETTE_SIZE; ++idx) palette[idx] = VGA_COLOR_TRANS(palette[idx]); diff --git a/engines/sherlock/screen.h b/engines/sherlock/screen.h index 8fda9cbb9c..27746731e8 100644 --- a/engines/sherlock/screen.h +++ b/engines/sherlock/screen.h @@ -99,8 +99,6 @@ public: byte _cMap[PALETTE_SIZE]; byte _sMap[PALETTE_SIZE]; byte _tMap[PALETTE_SIZE]; - int _currentScroll, _targetScroll; - int _scrollSize, _scrollSpeed; bool _flushScreen; public: Screen(SherlockEngine *vm); @@ -192,6 +190,16 @@ public: int16 *width, int16 *height, int scaleVal); /** + * Copies data from the back buffer to the screen, taking into account scrolling position + */ + void blockMove(const Common::Rect &r, const Common::Point &scrollPos); + + /** + * Copies the entire screen from the back buffer, taking into account scrolling position + */ + void blockMove(const Common::Point &scorllPos); + + /** * Returns the width of a string in pixels */ int stringWidth(const Common::String &str); @@ -257,8 +265,6 @@ public: void setupBGArea(const byte cMap[PALETTE_SIZE]); - void initScrollVars(); - /** * Translate a palette from 6-bit RGB values to full 8-bit values suitable for passing * to the underlying palette manager diff --git a/engines/sherlock/tattoo/tattoo_scene.cpp b/engines/sherlock/tattoo/tattoo_scene.cpp index 2a13b2a450..cd86a58d1a 100644 --- a/engines/sherlock/tattoo/tattoo_scene.cpp +++ b/engines/sherlock/tattoo/tattoo_scene.cpp @@ -99,8 +99,8 @@ void TattooScene::doBgAnimEraseBackground() { if (_mask != nullptr) { if (screen._backBuffer1.w() > screen.w()) - screen.blitFrom(screen._backBuffer1, Common::Point(0, 0), Common::Rect(screen._currentScroll, 0, - screen._currentScroll + screen.w(), screen.h())); + screen.blitFrom(screen._backBuffer1, Common::Point(0, 0), Common::Rect(ui._currentScroll.x, 0, + ui._currentScroll.x + screen.w(), screen.h())); else screen.blitFrom(screen._backBuffer1); @@ -175,22 +175,22 @@ void TattooScene::doBgAnimEraseBackground() { } // Adjust the Target Scroll if needed - if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - screen._currentScroll) < + if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - ui._currentScroll.x) < (SHERLOCK_SCREEN_WIDTH / 8) && people[people._walkControl]._delta.x < 0) { - screen._targetScroll = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - + ui._targetScroll.x = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - SHERLOCK_SCREEN_WIDTH / 8 - 250); - if (screen._targetScroll < 0) - screen._targetScroll = 0; + if (ui._targetScroll.x < 0) + ui._targetScroll.x = 0; } - if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - screen._currentScroll) > (SHERLOCK_SCREEN_WIDTH / 4 * 3) + if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - ui._currentScroll.x) > (SHERLOCK_SCREEN_WIDTH / 4 * 3) && people[people._walkControl]._delta.x > 0) - screen._targetScroll = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - + ui._targetScroll.x = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - SHERLOCK_SCREEN_WIDTH / 4 * 3 + 250); - if (screen._targetScroll > screen._scrollSize) - screen._targetScroll = screen._scrollSize; + if (ui._targetScroll.x > ui._scrollSize) + ui._targetScroll.x = ui._scrollSize; ui.doScroll(); } @@ -231,6 +231,7 @@ void TattooScene::doBgAnim() { void TattooScene::doBgAnimUpdateBgObjectsAndAnim() { People &people = *_vm->_people; Screen &screen = *_vm->_screen; + TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui; for (uint idx = 0; idx < _bgShapes.size(); ++idx) { Object &obj = _bgShapes[idx]; @@ -255,33 +256,33 @@ void TattooScene::doBgAnimUpdateBgObjectsAndAnim() { if (_mask != nullptr) { switch (_currentScene) { case 7: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 110), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 110), ui._currentScroll.x); break; case 8: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 180), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 180), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 180), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 180), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 180), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 180), ui._currentScroll.x); if (!_vm->readFlags(880)) - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(940, 300), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(940, 300), ui._currentScroll.x); break; case 18: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 203), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 203), ui._currentScroll.x); if (!_vm->readFlags(189)) - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124 + _maskOffset.x, 239), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124 + _maskOffset.x, 239), ui._currentScroll.x); break; case 53: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), ui._currentScroll.x); break; case 68: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 203), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124 + _maskOffset.x, 239), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 203), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124 + _maskOffset.x, 239), ui._currentScroll.x); break; } } @@ -291,38 +292,39 @@ void TattooScene::doBgAnimUpdateBgObjectsAndAnim() { void TattooScene::updateBackground() { People &people = *_vm->_people; Screen &screen = *_vm->_screen; + TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui; Scene::updateBackground(); if (_mask != nullptr) { switch (_currentScene) { case 7: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 110), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 110), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 110), ui._currentScroll.x); break; case 8: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 180), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 180), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 180), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x - SHERLOCK_SCREEN_WIDTH, 180), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 180), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x + SHERLOCK_SCREEN_WIDTH, 180), ui._currentScroll.x); if (!_vm->readFlags(880)) - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(940, 300), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(940, 300), ui._currentScroll.x); break; case 18: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(0, 203), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(0, 203), ui._currentScroll.x); if (!_vm->readFlags(189)) - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124, 239), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124, 239), ui._currentScroll.x); break; case 53: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(_maskOffset.x, 110), ui._currentScroll.x); break; case 68: - screen._backBuffer1.maskArea((*_mask)[0], Common::Point(0, 203), screen._currentScroll); - screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124, 239), screen._currentScroll); + screen._backBuffer1.maskArea((*_mask)[0], Common::Point(0, 203), ui._currentScroll.x); + screen._backBuffer1.maskArea((*_mask1)[0], Common::Point(124, 239), ui._currentScroll.x); break; default: diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp index e76322833f..a97b6f78cf 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.cpp +++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp @@ -33,6 +33,13 @@ TattooUserInterface::TattooUserInterface(SherlockEngine *vm): UserInterface(vm) _invMenuBuffer = nullptr; _tagBuffer = nullptr; _invGraphic = nullptr; + _scrollSize = _scrollSpeed = 0; +} + +void TattooUserInterface::initScrollVars() { + _scrollSize = 0; + _currentScroll.x = _currentScroll.y = 0; + _targetScroll.x = _targetScroll.y = 0; } void TattooUserInterface::handleInput() { @@ -41,13 +48,14 @@ void TattooUserInterface::handleInput() { } void TattooUserInterface::drawInterface(int bufferNum) { + TattooScene &scene = *(TattooScene *)_vm->_scene; Screen &screen = *_vm->_screen; - TattooEngine &vm = *((TattooEngine *)_vm); + TattooEngine &vm = *(TattooEngine *)_vm; if (_invMenuBuffer != nullptr) { Common::Rect r = _invMenuBounds; r.grow(-3); - r.translate(-screen._currentScroll, 0); + r.translate(-_currentScroll.x, 0); _grayAreas.clear(); _grayAreas.push_back(r); @@ -58,7 +66,7 @@ void TattooUserInterface::drawInterface(int bufferNum) { if (_menuBuffer != nullptr) { Common::Rect r = _menuBounds; r.grow(-3); - r.translate(-screen._currentScroll, 0); + r.translate(-_currentScroll.x, 0); _grayAreas.clear(); _grayAreas.push_back(r); @@ -76,6 +84,14 @@ void TattooUserInterface::drawInterface(int bufferNum) { if (vm._creditsActive) vm.drawCredits(); + + // Bring the widgets to the screen + if (scene._mask != nullptr) + screen._flushScreen = true; + + //if (screen._flushScreen) + // screen.blockMove(_currentScroll.x); + } void TattooUserInterface::doBgAnimRestoreUI() { @@ -118,27 +134,27 @@ void TattooUserInterface::doBgAnimRestoreUI() { void TattooUserInterface::doScroll() { Screen &screen = *_vm->_screen; - int oldScroll = screen._currentScroll; + int oldScroll = _currentScroll.x; // If we're already at the target scroll position, nothing needs to be done - if (screen._targetScroll == screen._currentScroll) + if (_targetScroll.x == _currentScroll.x) return; screen._flushScreen = true; - if (screen._targetScroll > screen._currentScroll) { - screen._currentScroll += screen._scrollSpeed; - if (screen._currentScroll > screen._targetScroll) - screen._currentScroll = screen._targetScroll; - } else if (screen._targetScroll < screen._currentScroll) { - screen._currentScroll -= screen._scrollSpeed; - if (screen._currentScroll < screen._targetScroll) - screen._currentScroll = screen._targetScroll; + if (_targetScroll.x > _currentScroll.x) { + _currentScroll.x += _scrollSpeed; + if (_currentScroll.x > _targetScroll.x) + _currentScroll.x = _targetScroll.x; + } else if (_targetScroll.x < _currentScroll.x) { + _currentScroll.x -= _scrollSpeed; + if (_currentScroll.x < _targetScroll.x) + _currentScroll.x = _targetScroll.x; } if (_menuBuffer != nullptr) - _menuBounds.translate(screen._currentScroll - oldScroll, 0); + _menuBounds.translate(_currentScroll.x - oldScroll, 0); if (_invMenuBuffer != nullptr) - _invMenuBounds.translate(screen._currentScroll - oldScroll, 0); + _invMenuBounds.translate(_currentScroll.x - oldScroll, 0); } void TattooUserInterface::drawGrayAreas() { diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h index 2125f1ba07..fea9ca8442 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.h +++ b/engines/sherlock/tattoo/tattoo_user_interface.h @@ -51,6 +51,9 @@ private: */ void drawGrayAreas(); public: + Common::Point _currentScroll, _targetScroll; + int _scrollSize, _scrollSpeed; +public: TattooUserInterface(SherlockEngine *vm); /** @@ -74,6 +77,11 @@ public: * Draw the user interface onto the screen's back buffers */ virtual void drawInterface(int bufferNum = 3); + + /** + * Initializes scroll variables + */ + virtual void initScrollVars(); }; } // End of namespace Tattoo diff --git a/engines/sherlock/user_interface.h b/engines/sherlock/user_interface.h index 042997a3e2..c7a398741e 100644 --- a/engines/sherlock/user_interface.h +++ b/engines/sherlock/user_interface.h @@ -123,6 +123,11 @@ public: * Print the previously selected object's decription */ virtual void printObjectDesc() {} + + /** + * Initializes scroll variables + */ + virtual void initScrollVars() {} }; } // End of namespace Sherlock |