aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/actor.cpp2
-rw-r--r--scumm/boxes.cpp60
-rw-r--r--scumm/scumm.h1
3 files changed, 35 insertions, 28 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp
index e6b367a6ee..9609ae41ef 100644
--- a/scumm/actor.cpp
+++ b/scumm/actor.cpp
@@ -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;
diff --git a/scumm/boxes.cpp b/scumm/boxes.cpp
index c3dfc2b2d1..7da38cbd49 100644
--- a/scumm/boxes.cpp
+++ b/scumm/boxes.cpp
@@ -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 (slot)
+ scale = getScaleFromSlot(slot, x, y);
+
+ return scale;
+}
- 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;
+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];
- 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 && s.x1 == s.x2)
+ error("Invalid scale slot %d", slot);
- if (s.y1 == s.y2) {
- scale = scaleX;
- } else {
- scale = (scaleX + scaleY) / 2;
- }
- }
+ if (s.y1 != s.y2) {
+ if (y < 0)
+ y = 0;
- // Clip the scale to range 1-255
- if (scale < 1)
- scale = 1;
- else if (scale > 255)
- scale = 255;
+ 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;
}
diff --git a/scumm/scumm.h b/scumm/scumm.h
index bed8d1137e..61029f4689 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -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