SHERLOCK: Further FIXED_INT_MULTIPLIER refactoring

Also converted multiplier factor from 100 to 1000, which will be
needed for Rose Tattoo
This commit is contained in:
Paul Gilbert 2015-06-05 21:13:48 -04:00
parent cf76576035
commit 9ada143d14
9 changed files with 76 additions and 62 deletions

View File

@ -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)

View File

@ -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();
}

View File

@ -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

View File

@ -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

View File

@ -110,7 +110,7 @@ public:
Common::Array<PersonData> _characters;
ImageFile *_talkPics;
Common::Point _walkDest;
Common::Point _hSavedPos;
Point32 _hSavedPos;
int _hSavedFacing;
Common::Queue<Common::Point> _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.

View File

@ -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))

View File

@ -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;
}

View File

@ -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;

View File

@ -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) {