From 9ada143d1450fcc61c6e3fbd505e1b04fe45140d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 5 Jun 2015 21:13:48 -0400 Subject: SHERLOCK: Further FIXED_INT_MULTIPLIER refactoring Also converted multiplier factor from 100 to 1000, which will be needed for Rose Tattoo --- engines/sherlock/map.cpp | 8 ++-- engines/sherlock/objects.cpp | 34 ++++++++----- engines/sherlock/objects.h | 10 ++-- engines/sherlock/people.cpp | 55 ++++++++++++---------- engines/sherlock/people.h | 4 +- engines/sherlock/scalpel/scalpel.cpp | 6 +-- .../sherlock/scalpel/scalpel_user_interface.cpp | 6 +-- engines/sherlock/scene.cpp | 9 ++-- engines/sherlock/talk.cpp | 6 +-- 9 files changed, 76 insertions(+), 62 deletions(-) diff --git a/engines/sherlock/map.cpp b/engines/sherlock/map.cpp index ffbca3fb42..dfc9798822 100644 --- a/engines/sherlock/map.cpp +++ b/engines/sherlock/map.cpp @@ -392,8 +392,8 @@ void Map::updateMap(bool flushScreen) { people[AL].adjustSprite(); - _lDrawnPos.x = hPos.x = people[AL]._position.x / 100 - _bigPos.x; - _lDrawnPos.y = hPos.y = people[AL]._position.y / 100 - people[AL].frameHeight() - _bigPos.y; + _lDrawnPos.x = hPos.x = people[AL]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x; + _lDrawnPos.y = hPos.y = people[AL]._position.y / FIXED_INT_MULTIPLIER - people[AL].frameHeight() - _bigPos.y; // Draw the person icon saveIcon(people[AL]._imageFrame, hPos); @@ -407,8 +407,8 @@ void Map::updateMap(bool flushScreen) { screen.slamArea(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); } else if (!_drawMap) { if (hPos.x > 0 && hPos.y >= 0 && hPos.x < SHERLOCK_SCREEN_WIDTH && hPos.y < SHERLOCK_SCREEN_HEIGHT) - screen.flushImage(people[AL]._imageFrame, Common::Point(people[AL]._position.x / 100 - _bigPos.x, - people[AL]._position.y / 100 - people[AL].frameHeight() - _bigPos.y), + screen.flushImage(people[AL]._imageFrame, Common::Point(people[AL]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x, + people[AL]._position.y / FIXED_INT_MULTIPLIER - people[AL].frameHeight() - _bigPos.y), &people[AL]._oldPosition.x, &people[AL]._oldPosition.y, &people[AL]._oldSize.x, &people[AL]._oldSize.y); if (osPos.x != -1) diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp index 0b3c294376..625371267f 100644 --- a/engines/sherlock/objects.cpp +++ b/engines/sherlock/objects.cpp @@ -146,18 +146,18 @@ void Sprite::adjustSprite() { } if (_type == CHARACTER && !map._active) { - if ((_position.y / 100) > LOWER_LIMIT) { - _position.y = LOWER_LIMIT * 100; + if ((_position.y / FIXED_INT_MULTIPLIER) > LOWER_LIMIT) { + _position.y = LOWER_LIMIT * FIXED_INT_MULTIPLIER; people.gotoStand(*this); } - if ((_position.y / 100) < UPPER_LIMIT) { - _position.y = UPPER_LIMIT * 100; + if ((_position.y / FIXED_INT_MULTIPLIER) < UPPER_LIMIT) { + _position.y = UPPER_LIMIT * FIXED_INT_MULTIPLIER; people.gotoStand(*this); } - if ((_position.x / 100) < LEFT_LIMIT) { - _position.x = LEFT_LIMIT * 100; + if ((_position.x / FIXED_INT_MULTIPLIER) < LEFT_LIMIT) { + _position.x = LEFT_LIMIT * FIXED_INT_MULTIPLIER; people.gotoStand(*this); } } else if (!map._active) { @@ -196,8 +196,8 @@ void Sprite::adjustSprite() { // Check to see if character has entered an exit zone if (!_walkCount && scene._walkedInScene && scene._goToScene == -1) { - Common::Rect charRect(_position.x / 100 - 5, _position.y / 100 - 2, - _position.x / 100 + 5, _position.y / 100 + 2); + Common::Rect charRect(_position.x / FIXED_INT_MULTIPLIER - 5, _position.y / FIXED_INT_MULTIPLIER - 2, + _position.x / FIXED_INT_MULTIPLIER + 5, _position.y / FIXED_INT_MULTIPLIER + 2); Exit *exit = scene.checkForExit(charRect); if (exit) { @@ -222,7 +222,7 @@ void Sprite::checkSprite() { Talk &talk = *_vm->_talk; Point32 pt; Common::Rect objBounds; - Common::Point spritePt(_position.x / 100, _position.y / 100); + Common::Point spritePt(_position.x / FIXED_INT_MULTIPLIER, _position.y / FIXED_INT_MULTIPLIER); if (!talk._talkCounter && _type == CHARACTER) { pt = _walkCount ? _position + _delta : _position; @@ -657,8 +657,13 @@ void Object::load(Common::SeekableReadStream &s, bool isRoseTattoo) { _oldPosition.y = s.readSint16LE(); _oldSize.x = s.readUint16LE(); _oldSize.y = s.readUint16LE(); + _goto.x = s.readSint16LE(); _goto.y = s.readSint16LE(); + if (!isRoseTattoo) { + _goto.x = _goto.x * FIXED_INT_MULTIPLIER / 100; + _goto.y = _goto.y * FIXED_INT_MULTIPLIER / 100; + } _pickup = isRoseTattoo ? 0 : s.readByte(); _defaultCommand = isRoseTattoo ? 0 : s.readByte(); @@ -678,8 +683,8 @@ void Object::load(Common::SeekableReadStream &s, bool isRoseTattoo) { _aType = (AType)s.readByte(); _lookFrames = s.readByte(); _seqCounter = s.readByte(); - _lookPosition.x = s.readUint16LE(); - _lookPosition.y = isRoseTattoo ? s.readSint16LE() : s.readByte(); + _lookPosition.x = s.readUint16LE() * FIXED_INT_MULTIPLIER / 100; + _lookPosition.y = (isRoseTattoo ? s.readSint16LE() : s.readByte()) * FIXED_INT_MULTIPLIER; _lookFacing = s.readByte(); _lookcAnim = s.readByte(); @@ -1418,6 +1423,13 @@ void CAnim::load(Common::SeekableReadStream &s, bool isRoseTattoo) { _gotoDir = s.readSint16LE(); _teleportPos.x = s.readSint16LE(); _teleportPos.y = s.readSint16LE(); + if (!isRoseTattoo) { + _goto.x = _goto.x * FIXED_INT_MULTIPLIER / 100; + _goto.y = _goto.y * FIXED_INT_MULTIPLIER / 100; + _teleportPos.x = _teleportPos.x * FIXED_INT_MULTIPLIER / 100; + _teleportPos.y = _teleportPos.y * FIXED_INT_MULTIPLIER / 100; + } + _teleportDir = s.readSint16LE(); } diff --git a/engines/sherlock/objects.h b/engines/sherlock/objects.h index 65840af532..88e9db116e 100644 --- a/engines/sherlock/objects.h +++ b/engines/sherlock/objects.h @@ -76,7 +76,7 @@ enum { #define MAX_HOLMES_SEQUENCE 16 #define MAX_FRAME 30 -#define FIXED_INT_MULTIPLIER 100 +#define FIXED_INT_MULTIPLIER 1000 // code put into sequences to defines 1-10 type seqs #define SEQ_TO_CODE 67 @@ -328,7 +328,7 @@ public: Common::Point _delta; // Momvement amount Common::Point _oldPosition; // Old position Common::Point _oldSize; // Image's old size - Common::Point _goto; // Walk destination + Point32 _goto; // Walk destination int _pickup; int _defaultCommand; // Default right-click command @@ -342,7 +342,7 @@ public: AType _aType; // Tells if this is an object, person, talk, etc. int _lookFrames; // How many frames to play of the look anim before pausing int _seqCounter; // How many times this sequence has been executed - Common::Point _lookPosition; // Where to walk when examining object + Point32 _lookPosition; // Where to walk when examining object int _lookFacing; // Direction to face when examining object int _lookcAnim; int _seqStack; // Allows gosubs to return to calling frame @@ -439,9 +439,9 @@ struct CAnim { Common::Point _position; // Position int _size; // Size of uncompressed animation int _flags; // Tells if can be walked behind - Common::Point _goto; // coords holmes should walk to before starting canim + Point32 _goto; // coords holmes should walk to before starting canim int _gotoDir; - Common::Point _teleportPos; // Location Holmes shoul teleport to after + Point32 _teleportPos; // Location Holmes shoul teleport to after int _teleportDir; // playing canim // Scalpel specific diff --git a/engines/sherlock/people.cpp b/engines/sherlock/people.cpp index ec67b4469f..f4060f65da 100644 --- a/engines/sherlock/people.cpp +++ b/engines/sherlock/people.cpp @@ -98,7 +98,7 @@ People::People(SherlockEngine *vm) : _vm(vm), _player(_data[0]) { _speakerFlip = false; _holmesFlip = false; _holmesQuotient = 0; - _hSavedPos = Common::Point(-1, -1); + _hSavedPos = Point32(-1, -1); _hSavedFacing = -1; _forceWalkReload = false; _useWalkLib = false; @@ -134,7 +134,7 @@ void People::reset() { p._sequenceNumber = STOP_DOWNRIGHT; p._imageFrame = nullptr; p._frameNumber = 1; - p._delta = Common::Point(0, 0); + p._delta = Point32(0, 0); p._oldPosition = Common::Point(0, 0); p._oldSize = Common::Point(0, 0); p._misc = 0; @@ -297,8 +297,8 @@ void People::setWalking() { _walkDest.x -= temp; delta = Common::Point( - ABS(_player._position.x / 100 - _walkDest.x), - ABS(_player._position.y / 100 - _walkDest.y) + ABS(_player._position.x / FIXED_INT_MULTIPLIER - _walkDest.x), + ABS(_player._position.y / FIXED_INT_MULTIPLIER - _walkDest.y) ); // If we're ready to move a sufficient distance, that's it. Otherwise, @@ -316,20 +316,20 @@ void People::setWalking() { if (delta.x >= delta.y) { // Set the initial frame sequence for the left and right, as well // as setting the delta x depending on direction - if (_walkDest.x < (_player._position.x / 100)) { + if (_walkDest.x < (_player._position.x / FIXED_INT_MULTIPLIER)) { _player._sequenceNumber = (map._active ? (int)MAP_LEFT : (int)WALK_LEFT); - _player._delta.x = speed.x * -100; + _player._delta.x = speed.x * -FIXED_INT_MULTIPLIER; } else { _player._sequenceNumber = (map._active ? (int)MAP_RIGHT : (int)WALK_RIGHT); - _player._delta.x = speed.x * 100; + _player._delta.x = speed.x * FIXED_INT_MULTIPLIER; } // See if the x delta is too small to be divided by the speed, since // this would cause a divide by zero error if (delta.x >= speed.x) { // Det the delta y - _player._delta.y = (delta.y * 100) / (delta.x / speed.x); - if (_walkDest.y < (_player._position.y / 100)) + _player._delta.y = (delta.y * FIXED_INT_MULTIPLIER) / (delta.x / speed.x); + if (_walkDest.y < (_player._position.y / FIXED_INT_MULTIPLIER)) _player._delta.y = -_player._delta.y; // Set how many times we should add the delta to the player's position @@ -337,8 +337,9 @@ void People::setWalking() { } else { // The delta x was less than the speed (ie. we're really close to // the destination). So set delta to 0 so the player won't move - _player._delta = Common::Point(0, 0); - _player._position = Common::Point(_walkDest.x * 100, _walkDest.y * 100); + _player._delta = Point32(0, 0); + _player._position = Point32(_walkDest.x * FIXED_INT_MULTIPLIER, _walkDest.y * FIXED_INT_MULTIPLIER); +assert(_player._position.y >= 10000);/***DEBUG****/ _player._walkCount = 1; } @@ -369,12 +370,12 @@ void People::setWalking() { } else { // Major movement is vertical, so set the sequence for up and down, // and set the delta Y depending on the direction - if (_walkDest.y < (_player._position.y / 100)) { + if (_walkDest.y < (_player._position.y / FIXED_INT_MULTIPLIER)) { _player._sequenceNumber = WALK_UP; - _player._delta.y = speed.y * -100; + _player._delta.y = speed.y * -FIXED_INT_MULTIPLIER; } else { _player._sequenceNumber = WALK_DOWN; - _player._delta.y = speed.y * 100; + _player._delta.y = speed.y * FIXED_INT_MULTIPLIER; } // If we're on the overhead map, set the sequence so we keep moving @@ -383,8 +384,8 @@ void People::setWalking() { _player._sequenceNumber = (oldDirection == -1) ? MAP_RIGHT : oldDirection; // Set the delta x - _player._delta.x = (delta.x * 100) / (delta.y / speed.y); - if (_walkDest.x < (_player._position.x / 100)) + _player._delta.x = (delta.x * FIXED_INT_MULTIPLIER) / (delta.y / speed.y); + if (_walkDest.x < (_player._position.x / FIXED_INT_MULTIPLIER)) _player._delta.x = -_player._delta.x; _player._walkCount = delta.y / speed.y; @@ -451,15 +452,15 @@ void People::gotoStand(Sprite &sprite) { if (map._active) { sprite._sequenceNumber = 0; - _player._position.x = (map[map._charPoint].x - 6) * 100; - _player._position.y = (map[map._charPoint].y + 10) * 100; + _player._position.x = (map[map._charPoint].x - 6) * FIXED_INT_MULTIPLIER; + _player._position.y = (map[map._charPoint].y + 10) * FIXED_INT_MULTIPLIER; } _oldWalkSequence = -1; _allowWalkAbort = true; } -void People::walkToCoords(const Common::Point &destPos, int destDir) { +void People::walkToCoords(const Point32 &destPos, int destDir) { Events &events = *_vm->_events; Scene &scene = *_vm->_scene; Talk &talk = *_vm->_talk; @@ -467,7 +468,7 @@ void People::walkToCoords(const Common::Point &destPos, int destDir) { CursorId oldCursor = events.getCursor(); events.setCursor(WAIT); - _walkDest = Common::Point(destPos.x / 100 + 10, destPos.y / 100); + _walkDest = Common::Point(destPos.x / FIXED_INT_MULTIPLIER + 10, destPos.y / FIXED_INT_MULTIPLIER); _allowWalkAbort = true; goAllTheWay(); @@ -480,6 +481,8 @@ void People::walkToCoords(const Common::Point &destPos, int destDir) { if (!talk._talkToAbort) { // Put player exactly on destination position, and set direction _player._position = destPos; +assert(_player._position.y >= 10000);/***DEBUG****/ + _player._sequenceNumber = destDir; gotoStand(_player); @@ -493,8 +496,8 @@ void People::walkToCoords(const Common::Point &destPos, int destDir) { void People::goAllTheWay() { Scene &scene = *_vm->_scene; - Common::Point srcPt(_player._position.x / 100 + _player.frameWidth() / 2, - _player._position.y / 100); + Common::Point srcPt(_player._position.x / FIXED_INT_MULTIPLIER + _player.frameWidth() / 2, + _player._position.y / FIXED_INT_MULTIPLIER); // Get the zone the player is currently in _srcZone = scene.whichZone(srcPt); @@ -516,17 +519,17 @@ void People::goAllTheWay() { const Common::Point destCenter((destRect.left + destRect.right) / 2, (destRect.top + destRect.bottom) / 2); const Common::Point delta = _walkDest - destCenter; - Common::Point pt(destCenter.x * 100, destCenter.y * 100); + Point32 pt(destCenter.x * FIXED_INT_MULTIPLIER, destCenter.y * FIXED_INT_MULTIPLIER); // Move along the line until the zone is left do { pt += delta; - } while (destRect.contains(pt.x / 100, pt.y / 100)); + } while (destRect.contains(pt.x / FIXED_INT_MULTIPLIER, pt.y / FIXED_INT_MULTIPLIER)); // Set the new walk destination to the last point that was in the // zone just before it was left - _walkDest = Common::Point((pt.x - delta.x * 2) / 100, - (pt.y - delta.y * 2) / 100); + _walkDest = Common::Point((pt.x - delta.x * 2) / FIXED_INT_MULTIPLIER, + (pt.y - delta.y * 2) / FIXED_INT_MULTIPLIER); } // Only do a walk if both zones are acceptable diff --git a/engines/sherlock/people.h b/engines/sherlock/people.h index 102d740fb5..c26630c431 100644 --- a/engines/sherlock/people.h +++ b/engines/sherlock/people.h @@ -110,7 +110,7 @@ public: Common::Array _characters; ImageFile *_talkPics; Common::Point _walkDest; - Common::Point _hSavedPos; + Point32 _hSavedPos; int _hSavedFacing; Common::Queue _walkTo; Person &_player; @@ -172,7 +172,7 @@ public: /** * Walk to the co-ordinates passed, and then face the given direction */ - void walkToCoords(const Common::Point &destPos, int destDir); + void walkToCoords(const Point32 &destPos, int destDir); /** * Called to set the character walking to the current cursor location. diff --git a/engines/sherlock/scalpel/scalpel.cpp b/engines/sherlock/scalpel/scalpel.cpp index ed531a06c5..39d4437918 100644 --- a/engines/sherlock/scalpel/scalpel.cpp +++ b/engines/sherlock/scalpel/scalpel.cpp @@ -687,7 +687,7 @@ void ScalpelEngine::startScene() { } void ScalpelEngine::eraseMirror12() { - Common::Point pt((*_people)[AL]._position.x / 100, (*_people)[AL]._position.y / 100); + Common::Point pt((*_people)[AL]._position.x / FIXED_INT_MULTIPLIER, (*_people)[AL]._position.y / FIXED_INT_MULTIPLIER); // If player is in range of the mirror, then restore background from the secondary back buffer if (Common::Rect(70, 100, 200, 200).contains(pt)) { @@ -700,7 +700,7 @@ void ScalpelEngine::doMirror12() { People &people = *_people; Person &player = people._player; - Common::Point pt((*_people)[AL]._position.x / 100, (*_people)[AL]._position.y / 100); + Common::Point pt((*_people)[AL]._position.x / FIXED_INT_MULTIPLIER, (*_people)[AL]._position.y / FIXED_INT_MULTIPLIER); int frameNum = player._walkSequences[player._sequenceNumber][player._frameNumber] + player._walkSequences[player._sequenceNumber][0] - 2; @@ -772,7 +772,7 @@ void ScalpelEngine::doMirror12() { } void ScalpelEngine::flushMirror12() { - Common::Point pt((*_people)[AL]._position.x / 100, (*_people)[AL]._position.y / 100); + Common::Point pt((*_people)[AL]._position.x / FIXED_INT_MULTIPLIER, (*_people)[AL]._position.y / FIXED_INT_MULTIPLIER); // If player is in range of the mirror, then draw the entire mirror area to the screen if (Common::Rect(70, 100, 200, 200).contains(pt)) diff --git a/engines/sherlock/scalpel/scalpel_user_interface.cpp b/engines/sherlock/scalpel/scalpel_user_interface.cpp index 16f16594f1..e2c66789ad 100644 --- a/engines/sherlock/scalpel/scalpel_user_interface.cpp +++ b/engines/sherlock/scalpel/scalpel_user_interface.cpp @@ -500,7 +500,7 @@ void ScalpelUserInterface::examine() { scene.startCAnim(_cNum, canimSpeed); } else if (obj._lookPosition.y != 0) { // Need to walk to the object to be examined - people.walkToCoords(Common::Point(obj._lookPosition.x, obj._lookPosition.y * 100), obj._lookFacing); + people.walkToCoords(obj._lookPosition, obj._lookFacing); } if (!talk._talkToAbort) { @@ -2158,7 +2158,7 @@ void ScalpelUserInterface::checkAction(ActionType &action, const char *const mes Scene &scene = *_vm->_scene; Screen &screen = *_vm->_screen; Talk &talk = *_vm->_talk; - Common::Point pt(-1, -1); + Point32 pt(-1, -1); if (objNum >= 1000) // Ignore actions done on characters @@ -2197,7 +2197,7 @@ void ScalpelUserInterface::checkAction(ActionType &action, const char *const mes } } } else { - pt = Common::Point(-1, -1); + pt = Point32(-1, -1); dir = -1; } diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index edb52f3640..ec189ee270 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -756,7 +756,7 @@ void Scene::transitionToScene() { SaveManager &saves = *_vm->_saves; Screen &screen = *_vm->_screen; Talk &talk = *_vm->_talk; - Common::Point &hSavedPos = people._hSavedPos; + Point32 &hSavedPos = people._hSavedPos; int &hSavedFacing = people._hSavedFacing; if (hSavedPos.x < 1) { @@ -764,7 +764,7 @@ void Scene::transitionToScene() { if (_entrance._startPosition.x < 1) { // No entrance info either, so use defaults if (IS_SERRATED_SCALPEL) { - hSavedPos = Common::Point(160 * FIXED_INT_MULTIPLIER, 100 * FIXED_INT_MULTIPLIER); + hSavedPos = Point32(160 * FIXED_INT_MULTIPLIER, 100 * FIXED_INT_MULTIPLIER); hSavedFacing = 4; } else { hSavedPos = people[PLAYER]._position; @@ -772,7 +772,8 @@ void Scene::transitionToScene() { } } else { // setup entrance info - hSavedPos = _entrance._startPosition; + hSavedPos.x = _entrance._startPosition.x * FIXED_INT_MULTIPLIER / 100; + hSavedPos.y = _entrance._startPosition.y * FIXED_INT_MULTIPLIER / 100; hSavedFacing = _entrance._startDir; } } else { @@ -919,7 +920,7 @@ int Scene::startCAnim(int cAnimNum, int playRate) { Resources &res = *_vm->_res; Talk &talk = *_vm->_talk; UserInterface &ui = *_vm->_ui; - Common::Point tpPos, walkPos; + Point32 tpPos, walkPos; int tpDir, walkDir; int tFrames = 0; int gotoCode = -1; diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp index d48b66cf8b..dd00d47fb2 100644 --- a/engines/sherlock/talk.cpp +++ b/engines/sherlock/talk.cpp @@ -636,8 +636,7 @@ void Talk::talk(int objNum) { events.setCursor(WAIT); if (obj._lookPosition.y != 0) // Need to walk to character first - people.walkToCoords(Common::Point(obj._lookPosition.x, obj._lookPosition.y * 100), - obj._lookFacing); + people.walkToCoords(obj._lookPosition, obj._lookFacing); events.setCursor(ARROW); if (!_talkToAbort) @@ -652,8 +651,7 @@ void Talk::talk(int objNum) { events.setCursor(WAIT); if (obj._lookPosition.y != 0) // Walk over to person to talk to - people.walkToCoords(Common::Point(obj._lookPosition.x, obj._lookPosition.y * 100), - obj._lookFacing); + people.walkToCoords(obj._lookPosition, obj._lookFacing); events.setCursor(ARROW); if (!_talkToAbort) { -- cgit v1.2.3