Add patch #1060453 - MIVGA: Actor Scale Patch

svn-id: r15712
This commit is contained in:
Travis Howell 2004-11-05 05:13:56 +00:00
parent 775bd838c7
commit df17c27ebf
3 changed files with 41 additions and 34 deletions

View File

@ -1036,7 +1036,7 @@ void Actor::drawActorCostume(bool hitTestMode) {
bcr->_clipOverride = _clipOverride;
if (_vm->_version == 4 && boxscale & 0x8000) {
bcr->_scaleX = bcr->_scaleY = _vm->getScale(_walkbox, _pos.x, _pos.y);
bcr->_scaleX = bcr->_scaleY = _vm->getScaleFromSlot((boxscale & 0x7fff) + 1, _pos.x, _pos.y);
} else {
bcr->_scaleX = scalex;
bcr->_scaleY = scaley;

View File

@ -177,40 +177,46 @@ int ScummEngine::getScale(int box, int x, int y) {
// Was a scale slot specified? If so, we compute the effective scale
// from it, ignoring the box scale.
if (slot) {
assert(1 <= slot && slot <= ARRAYSIZE(_scaleSlots));
int scaleX = 0, scaleY = 0;
ScaleSlot &s = _scaleSlots[slot-1];
if (s.y1 == s.y2 && s.x1 == s.x2)
error("Invalid scale slot %d", slot);
if (s.y1 != s.y2) {
if (y < 0)
y = 0;
scaleY = (s.scale2 - s.scale1) * (y - s.y1) / (s.y2 - s.y1) + s.scale1;
}
if (s.x1 == s.x2) {
scale = scaleY;
} else {
scaleX = (s.scale2 - s.scale1) * (x - s.x1) / (s.x2 - s.x1) + s.scale1;
if (s.y1 == s.y2) {
scale = scaleX;
} else {
scale = (scaleX + scaleY) / 2;
}
}
// Clip the scale to range 1-255
if (scale < 1)
scale = 1;
else if (scale > 255)
scale = 255;
}
if (slot)
scale = getScaleFromSlot(slot, x, y);
return scale;
}
int ScummEngine::getScaleFromSlot(int slot, int x, int y) {
assert(1 <= slot && slot <= ARRAYSIZE(_scaleSlots));
int scale;
int scaleX = 0, scaleY = 0;
ScaleSlot &s = _scaleSlots[slot-1];
if (s.y1 == s.y2 && s.x1 == s.x2)
error("Invalid scale slot %d", slot);
if (s.y1 != s.y2) {
if (y < 0)
y = 0;
scaleY = (s.scale2 - s.scale1) * (y - s.y1) / (s.y2 - s.y1) + s.scale1;
}
if (s.x1 == s.x2) {
scale = scaleY;
} else {
scaleX = (s.scale2 - s.scale1) * (x - s.x1) / (s.x2 - s.x1) + s.scale1;
if (s.y1 == s.y2) {
scale = scaleX;
} else {
scale = (scaleX + scaleY) / 2;
}
}
// Clip the scale to range 1-255
if (scale < 1)
scale = 1;
else if (scale > 255)
scale = 255;
// Finally return the scale
return scale;
}

View File

@ -1117,6 +1117,7 @@ public:
int getBoxScale(int box);
int getScale(int box, int x, int y);
int getScaleFromSlot(int slot, int x, int y);
protected:
// Scaling slots/items