diff options
author | Paul Gilbert | 2015-05-28 08:31:53 -0400 |
---|---|---|
committer | Paul Gilbert | 2015-05-28 08:31:53 -0400 |
commit | f4902b516ec8486338b777354809171112671e5b (patch) | |
tree | 2d286bb33818babf3eade15e5babec8570ba3e7e /engines/sherlock/scene.cpp | |
parent | 45b4989b55a043a9d2f1806db375d9f91476ed89 (diff) | |
download | scummvm-rg350-f4902b516ec8486338b777354809171112671e5b.tar.gz scummvm-rg350-f4902b516ec8486338b777354809171112671e5b.tar.bz2 scummvm-rg350-f4902b516ec8486338b777354809171112671e5b.zip |
SHERLOCK: Moving split up classes into their own files
Diffstat (limited to 'engines/sherlock/scene.cpp')
-rw-r--r-- | engines/sherlock/scene.cpp | 552 |
1 files changed, 2 insertions, 550 deletions
diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 06bbabf6e0..0f0187e215 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -23,8 +23,10 @@ #include "sherlock/scene.h" #include "sherlock/sherlock.h" #include "sherlock/scalpel/scalpel.h" +#include "sherlock/scalpel/scalpel_scene.h" #include "sherlock/screen.h" #include "sherlock/tattoo/tattoo.h" +#include "sherlock/tattoo/tattoo_scene.h" namespace Sherlock { @@ -1325,554 +1327,4 @@ void Scene::checkBgShapes() { } } -/*----------------------------------------------------------------*/ - -namespace Scalpel { - -void ScalpelScene::checkBgShapes() { - People &people = *_vm->_people; - Person &holmes = people._player; - Common::Point pt(holmes._position.x / FIXED_INT_MULTIPLIER, holmes._position.y / FIXED_INT_MULTIPLIER); - - // Call the base scene method to handle bg shapes - Scene::checkBgShapes(); - - // Iterate through the canim list - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &obj = _canimShapes[idx]; - if (obj._type == STATIC_BG_SHAPE || obj._type == ACTIVE_BG_SHAPE) { - if ((obj._flags & 5) == 1) { - obj._misc = (pt.y < (obj._position.y + obj._imageFrame->_frame.h - 1)) ? - NORMAL_FORWARD : NORMAL_BEHIND; - } else if (!(obj._flags & 1)) { - obj._misc = BEHIND; - } else if (obj._flags & 4) { - obj._misc = FORWARD; - } - } - } -} - -void ScalpelScene::doBgAnimCheckCursor() { - Inventory &inv = *_vm->_inventory; - Events &events = *_vm->_events; - Sound &sound = *_vm->_sound; - UserInterface &ui = *_vm->_ui; - Common::Point mousePos = events.mousePos(); - - if (ui._menuMode == LOOK_MODE) { - if (mousePos.y > CONTROLS_Y1) - events.setCursor(ARROW); - else if (mousePos.y < CONTROLS_Y) - events.setCursor(MAGNIFY); - } - - // Check for setting magnifying glass cursor - if (ui._menuMode == INV_MODE || ui._menuMode == USE_MODE || ui._menuMode == GIVE_MODE) { - if (inv._invMode == INVMODE_LOOK) { - // Only show Magnifying glass cursor if it's not on the inventory command line - if (mousePos.y < CONTROLS_Y || mousePos.y >(CONTROLS_Y1 + 13)) - events.setCursor(MAGNIFY); - else - events.setCursor(ARROW); - } else { - events.setCursor(ARROW); - } - } - - if (sound._diskSoundPlaying && !*sound._soundIsOn) { - // Loaded sound just finished playing - sound.freeDigiSound(); - } -} - -void ScalpelScene::doBgAnim() { - Scalpel::ScalpelEngine &vm = *((Scalpel::ScalpelEngine *)_vm); - Events &events = *_vm->_events; - People &people = *_vm->_people; - Screen &screen = *_vm->_screen; - Talk &talk = *_vm->_talk; - - screen.setDisplayBounds(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT)); - talk._talkToAbort = false; - - if (_restoreFlag) { - for (int idx = 0; idx < MAX_CHARACTERS; ++idx) { - if (people[idx]._type == CHARACTER) - people[idx].checkSprite(); - } - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - if (_bgShapes[idx]._type == ACTIVE_BG_SHAPE) - _bgShapes[idx].checkObject(); - } - - if (people._portraitLoaded && people._portrait._type == ACTIVE_BG_SHAPE) - people._portrait.checkObject(); - - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type != INVALID && _canimShapes[idx]._type != REMOVE) - _canimShapes[idx].checkObject(); - } - - if (_currentScene == 12) - vm.eraseMirror12(); - - // Restore the back buffer from the back buffer 2 in the changed area - Common::Rect bounds(people[AL]._oldPosition.x, people[AL]._oldPosition.y, - people[AL]._oldPosition.x + people[AL]._oldSize.x, - people[AL]._oldPosition.y + people[AL]._oldSize.y); - Common::Point pt(bounds.left, bounds.top); - - if (people[AL]._type == CHARACTER) - screen.restoreBackground(bounds); - else if (people[AL]._type == REMOVE) - screen._backBuffer->blitFrom(screen._backBuffer2, pt, bounds); - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE || o._type == HIDE_SHAPE || o._type == REMOVE) - screen.restoreBackground(o.getOldBounds()); - } - - if (people._portraitLoaded) - screen.restoreBackground(Common::Rect( - people._portrait._oldPosition.x, people._portrait._oldPosition.y, - people._portrait._oldPosition.x + people._portrait._oldSize.x, - people._portrait._oldPosition.y + people._portrait._oldSize.y - )); - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == NO_SHAPE && ((o._flags & OBJ_BEHIND) == 0)) { - // Restore screen area - screen._backBuffer->blitFrom(screen._backBuffer2, o._position, - Common::Rect(o._position.x, o._position.y, - o._position.x + o._noShapeSize.x, o._position.y + o._noShapeSize.y)); - - o._oldPosition = o._position; - o._oldSize = o._noShapeSize; - } - } - - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE || o._type == HIDE_SHAPE || o._type == REMOVE) - screen.restoreBackground(Common::Rect(o._oldPosition.x, o._oldPosition.y, - o._oldPosition.x + o._oldSize.x, o._oldPosition.y + o._oldSize.y)); - } - } - - // - // Update the background objects and canimations - // - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE || o._type == NO_SHAPE) - o.adjustObject(); - } - - if (people._portraitLoaded && people._portrait._type == ACTIVE_BG_SHAPE) - people._portrait.adjustObject(); - - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - if (_canimShapes[idx]._type != INVALID) - _canimShapes[idx].adjustObject(); - } - - if (people[AL]._type == CHARACTER && people._holmesOn) - people[AL].adjustSprite(); - - // Flag the bg shapes which need to be redrawn - checkBgShapes(); - - if (_currentScene == 12) - vm.doMirror12(); - - // Draw all active shapes which are behind the person - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE && o._misc == BEHIND) - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - - // Draw all canimations which are behind the person - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE && o._misc == BEHIND) { - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - } - - // Draw all active shapes which are HAPPEN and behind the person - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE && o._misc == NORMAL_BEHIND) - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - - // Draw all canimations which are NORMAL and behind the person - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; - if (o._type == ACTIVE_BG_SHAPE && o._misc == NORMAL_BEHIND) { - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - } - - // Draw the person if not animating - if (people[AL]._type == CHARACTER && people[AL]._walkLoaded) { - // If Holmes is too far to the right, move him back so he's on-screen - int xRight = SHERLOCK_SCREEN_WIDTH - 2 - people[AL]._imageFrame->_frame.w; - int tempX = MIN(people[AL]._position.x / FIXED_INT_MULTIPLIER, xRight); - - bool flipped = people[AL]._sequenceNumber == WALK_LEFT || people[AL]._sequenceNumber == STOP_LEFT || - people[AL]._sequenceNumber == WALK_UPLEFT || people[AL]._sequenceNumber == STOP_UPLEFT || - people[AL]._sequenceNumber == WALK_DOWNRIGHT || people[AL]._sequenceNumber == STOP_DOWNRIGHT; - screen._backBuffer->transBlitFrom(*people[AL]._imageFrame, - Common::Point(tempX, people[AL]._position.y / FIXED_INT_MULTIPLIER - people[AL]._imageFrame->_frame.h), flipped); - } - - // Draw all static and active shapes are NORMAL and are in front of the person - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == NORMAL_FORWARD) - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - - // Draw all static and active canimations that are NORMAL and are in front of the person - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; - if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == NORMAL_FORWARD) { - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - } - - // Draw all static and active shapes that are in front of the person - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == FORWARD) - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - - // Draw any active portrait - if (people._portraitLoaded && people._portrait._type == ACTIVE_BG_SHAPE) - screen._backBuffer->transBlitFrom(*people._portrait._imageFrame, - people._portrait._position, people._portrait._flags & OBJ_FLIPPED); - - // Draw all static and active canimations that are in front of the person - for (uint idx = 0; idx < _canimShapes.size(); ++idx) { - Object &o = _canimShapes[idx]; - if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == FORWARD) { - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - } - - // Draw all NO_SHAPE shapes which have flag bit 0 clear - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == NO_SHAPE && (o._flags & OBJ_BEHIND) == 0) - screen._backBuffer->transBlitFrom(*o._imageFrame, o._position, o._flags & OBJ_FLIPPED); - } - - // Bring the newly built picture to the screen - if (_animating == 2) { - _animating = 0; - screen.slamRect(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT)); - } else { - if (people[AL]._type != INVALID && ((_goToScene == -1 || _canimShapes.empty()))) { - if (people[AL]._type == REMOVE) { - screen.slamRect(Common::Rect( - people[AL]._oldPosition.x, people[AL]._oldPosition.y, - people[AL]._oldPosition.x + people[AL]._oldSize.x, - people[AL]._oldPosition.y + people[AL]._oldSize.y - )); - people[AL]._type = INVALID; - } else { - screen.flushImage(people[AL]._imageFrame, - Common::Point(people[AL]._position.x / FIXED_INT_MULTIPLIER, - people[AL]._position.y / FIXED_INT_MULTIPLIER - people[AL].frameHeight()), - &people[AL]._oldPosition.x, &people[AL]._oldPosition.y, - &people[AL]._oldSize.x, &people[AL]._oldSize.y); - } - } - - if (_currentScene == 12) - vm.flushMirror12(); - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if ((o._type == ACTIVE_BG_SHAPE || o._type == REMOVE) && _goToScene == -1) { - screen.flushImage(o._imageFrame, o._position, - &o._oldPosition.x, &o._oldPosition.y, &o._oldSize.x, &o._oldSize.y); - } - } - - if (people._portraitLoaded) { - if (people._portrait._type == REMOVE) - screen.slamRect(Common::Rect( - people._portrait._position.x, people._portrait._position.y, - people._portrait._position.x + people._portrait._delta.x, - people._portrait._position.y + people._portrait._delta.y - )); - else - screen.flushImage(people._portrait._imageFrame, people._portrait._position, - &people._portrait._oldPosition.x, &people._portrait._oldPosition.y, - &people._portrait._oldSize.x, &people._portrait._oldSize.y); - - if (people._portrait._type == REMOVE) - people._portrait._type = INVALID; - } - - if (_goToScene == -1) { - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &o = _bgShapes[idx]; - if (o._type == NO_SHAPE && (o._flags & OBJ_BEHIND) == 0) { - screen.slamArea(o._position.x, o._position.y, o._oldSize.x, o._oldSize.y); - screen.slamArea(o._oldPosition.x, o._oldPosition.y, o._oldSize.x, o._oldSize.y); - } else if (o._type == HIDE_SHAPE) { - // Hiding shape, so flush it out and mark it as hidden - screen.flushImage(o._imageFrame, o._position, - &o._oldPosition.x, &o._oldPosition.y, &o._oldSize.x, &o._oldSize.y); - o._type = HIDDEN; - } - } - } - - for (int idx = _canimShapes.size() - 1; idx >= 0; --idx) { - Object &o = _canimShapes[idx]; - - if (o._type == INVALID) { - // Anim shape was invalidated by checkEndOfSequence, so at this point we can remove it - _canimShapes.remove_at(idx); - } else if (o._type == REMOVE) { - if (_goToScene == -1) - screen.slamArea(o._position.x, o._position.y, o._delta.x, o._delta.y); - - // Shape for an animation is no longer needed, so remove it completely - _canimShapes.remove_at(idx); - } else if (o._type == ACTIVE_BG_SHAPE) { - screen.flushImage(o._imageFrame, o._position, - &o._oldPosition.x, &o._oldPosition.y, &o._oldSize.x, &o._oldSize.y); - } - } - } - - _restoreFlag = true; - _doBgAnimDone = true; - - events.wait(3); - screen.resetDisplayBounds(); - - // Check if the method was called for calling a portrait, and a talk was - // interrupting it. This talk file would not have been executed at the time, - // since we needed to finish the 'doBgAnim' to finish clearing the portrait - if (people._clearingThePortrait && talk._scriptMoreFlag == 3) { - // Reset the flags and call to talk - people._clearingThePortrait = false; - talk._scriptMoreFlag = 0; - talk.talkTo(talk._scriptName); - } -} - -} // End of namespace Scalpel - -/*----------------------------------------------------------------*/ - -namespace Tattoo { - -TattooScene::TattooScene(SherlockEngine *vm) : Scene(vm) { - _arrowZone = -1; - _mask = _mask1 = nullptr; - _maskCounter = 0; -} - -void TattooScene::checkBgShapes() { - People &people = *_vm->_people; - Person &holmes = people._player; - Common::Point pt(holmes._position.x / FIXED_INT_MULTIPLIER, holmes._position.y / FIXED_INT_MULTIPLIER); - - // Call the base scene method to handle bg shapes - Scene::checkBgShapes(); - - // Check for any active playing animation - if (_activeCAnim._images && _activeCAnim._zPlacement != REMOVE) { - switch (_activeCAnim._flags & 3) { - case 0: - _activeCAnim._zPlacement = BEHIND; - break; - case 1: - _activeCAnim._zPlacement = ((_activeCAnim._position.y + _activeCAnim._imageFrame->_frame.h - 1)) ? - NORMAL_FORWARD : NORMAL_BEHIND; - break; - case 2: - _activeCAnim._zPlacement = FORWARD; - break; - default: - break; - } - } -} - -void TattooScene::doBgAnimCheckCursor() { - Events &events = *_vm->_events; - UserInterface &ui = *_vm->_ui; - Common::Point mousePos = events.mousePos(); - - // If we're in Look Mode, make sure the cursor is the magnifying glass - if (ui._menuMode == LOOK_MODE && events.getCursor() != MAGNIFY) - events.setCursor(MAGNIFY); - - // See if the mouse is over any of the arrow zones, and if so, change the cursor to the correct - // arrow cursor indicating the direcetion of the exit - if (events.getCursor() == ARROW || events.getCursor() >= EXIT_ZONES_START) { - CursorId cursorId = ARROW; - - if (ui._menuMode == STD_MODE && _arrowZone != -1 && _currentScene != 90) { - for (uint idx = 0; idx < _exits.size(); ++idx) { - Exit &exit = _exits[idx]; - if (exit.contains(mousePos)) - cursorId = (CursorId)(exit._image + EXIT_ZONES_START); - } - } - - events.setCursor(cursorId); - } -} - -void TattooScene::doBgAnimEraseBackground() { - TattooEngine &vm = *((TattooEngine *)_vm); - People &people = *_vm->_people; - Screen &screen = *_vm->_screen; - TattooUserInterface &ui = *((TattooUserInterface *)_vm->_ui); - - static const int16 OFFSETS[16] = { -1, -2, -3, -3, -2, -1, -1, 0, 1, 2, 3, 3, 2, 1, 0, 0 }; - - 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())); - else - screen.blitFrom(screen._backBuffer1); - - switch (_currentScene) { - case 7: - if (++_maskCounter == 2) { - _maskCounter = 0; - if (--_maskOffset.x < 0) - _maskOffset.x = SHERLOCK_SCREEN_WIDTH - 1; - } - break; - - case 8: - _maskOffset.x += 2; - if (_maskOffset.x >= SHERLOCK_SCREEN_WIDTH) - _maskOffset.x = 0; - break; - - case 18: - case 68: - ++_maskCounter; - if (_maskCounter / 4 >= 16) - _maskCounter = 0; - - _maskOffset.x = OFFSETS[_maskCounter / 4]; - break; - - case 53: - if (++_maskCounter == 2) { - _maskCounter = 0; - if (++_maskOffset.x == screen._backBuffer1.w()) - _maskOffset.x = 0; - } - break; - - default: - break; - } - } else { - // Standard scene without mask, so call user interface to erase any UI elements as necessary - ui.doBgAnimRestoreUI(); - - // Restore background for any areas covered by characters and shapes - for (uint idx = 0; idx < MAX_CHARACTERS; ++idx) - screen.restoreBackground(Common::Rect(people[idx]._oldPosition.x, people[idx]._oldPosition.y, - people[idx]._oldPosition.x + people[idx]._oldSize.x, people[idx]._oldPosition.y + people[idx]._oldSize.y)); - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &obj = _bgShapes[idx]; - - if ((obj._type == ACTIVE_BG_SHAPE && (obj._maxFrames > 1 || obj._delta.x != 0 || obj._delta.y != 0)) || - obj._type == HIDE_SHAPE || obj._type == REMOVE) - screen._backBuffer1.blitFrom(*obj._imageFrame, obj._oldPosition, - Common::Rect(obj._oldPosition.x, obj._oldPosition.y, obj._oldPosition.x + obj._oldSize.x, - obj._oldPosition.y + obj._oldSize.y)); - } - - // If credits are active, erase the area they cover - if (vm._creditsActive) - vm.eraseCredits(); - } - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - Object &obj = _bgShapes[idx]; - - if (obj._type == NO_SHAPE && (obj._flags & 1) == 0) { - screen._backBuffer1.blitFrom(screen._backBuffer2, obj._position, obj.getNoShapeBounds()); - - obj._oldPosition = obj._position; - obj._oldSize = obj._noShapeSize; - } - } - - // Adjust the Target Scroll if needed - if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - screen._currentScroll) < - (SHERLOCK_SCREEN_WIDTH / 8) && people[people._walkControl]._delta.x < 0) { - - screen._targetScroll = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - - SHERLOCK_SCREEN_WIDTH / 8 - 250); - if (screen._targetScroll < 0) - screen._targetScroll = 0; - } - - if ((people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - screen._currentScroll) > (SHERLOCK_SCREEN_WIDTH / 4 * 3) - && people[people._walkControl]._delta.x > 0) - screen._targetScroll = (short)(people[people._walkControl]._position.x / FIXED_INT_MULTIPLIER - - SHERLOCK_SCREEN_WIDTH / 4 * 3 + 250); - - if (screen._targetScroll > screen._scrollSize) - screen._targetScroll = screen._scrollSize; - - ui.doScroll(); -} - -void TattooScene::doBgAnim() { - doBgAnimCheckCursor(); - -// Events &events = *_vm->_events; - People &people = *_vm->_people; -// Scene &scene = *_vm->_scene; - Screen &screen = *_vm->_screen; - Talk &talk = *_vm->_talk; - - screen.setDisplayBounds(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT)); - talk._talkToAbort = false; - - // Check the characters and sprites for updates - for (int idx = 0; idx < MAX_CHARACTERS; ++idx) { - if (people[idx]._type == CHARACTER) - people[idx].checkSprite(); - } - - for (uint idx = 0; idx < _bgShapes.size(); ++idx) { - if (_bgShapes[idx]._type == ACTIVE_BG_SHAPE) - _bgShapes[idx].checkObject(); - } - - // Erase any affected background areas - doBgAnimEraseBackground(); -} - -} // End of namespace Tattoo - } // End of namespace Sherlock |