diff options
-rw-r--r-- | engines/scumm/actor.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/actor.h | 6 | ||||
-rw-r--r-- | engines/scumm/boxes.cpp | 36 | ||||
-rw-r--r-- | engines/scumm/object.cpp | 8 | ||||
-rw-r--r-- | engines/scumm/script_v2.cpp | 36 | ||||
-rw-r--r-- | engines/scumm/script_v5.cpp | 11 |
6 files changed, 57 insertions, 44 deletions
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index e9f6b87739..569c39dd19 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -950,8 +950,8 @@ AdjustBoxResult Actor::adjustXYToBeInBox(int dstX, int dstY) { return abr; bestDist = (_vm->_game.version >= 7) ? 0x7FFFFFFF : 0xFFFF; - if (_vm->_game.version <= 2) - bestDist *= 8*2; // Adjust for the fact that we multiply x by 8 and y by 2 + if (_vm->_game.version <= 2) // Adjust for the fact that we multiply x by 8 and y by 2 + bestDist *= V12_X_MULTIPLIER * V12_Y_MULTIPLIER; bestBox = kInvalidBox; // We iterate (backwards) over all boxes, searching the one closest diff --git a/engines/scumm/actor.h b/engines/scumm/actor.h index 38636f7746..dd3cd78505 100644 --- a/engines/scumm/actor.h +++ b/engines/scumm/actor.h @@ -32,6 +32,12 @@ namespace Scumm { + +enum { + V12_X_MULTIPLIER = 8, + V12_Y_MULTIPLIER = 2 +}; + enum MoveFlags { MF_NEW_LEG = 1, MF_IN_LEG = 2, diff --git a/engines/scumm/boxes.cpp b/engines/scumm/boxes.cpp index 736915ff08..e6a5f86761 100644 --- a/engines/scumm/boxes.cpp +++ b/engines/scumm/boxes.cpp @@ -596,25 +596,25 @@ BoxCoords ScummEngine::getBoxCoordinates(int boxnum) { SWAP(box->ll, box->lr); } } else if (_game.version == 0) { - box->ul.x = bp->c64.x1 * 8; - box->ul.y = bp->c64.y1 * 2; - box->ur.x = bp->c64.x2 * 8; - box->ur.y = bp->c64.y1 * 2; - - box->ll.x = bp->c64.x1 * 8; - box->ll.y = bp->c64.y2 * 2; - box->lr.x = bp->c64.x2 * 8; - box->lr.y = bp->c64.y2 * 2; + box->ul.x = bp->c64.x1 * V12_X_MULTIPLIER; + box->ul.y = bp->c64.y1 * V12_Y_MULTIPLIER; + box->ur.x = bp->c64.x2 * V12_X_MULTIPLIER; + box->ur.y = bp->c64.y1 * V12_Y_MULTIPLIER; + + box->ll.x = bp->c64.x1 * V12_X_MULTIPLIER; + box->ll.y = bp->c64.y2 * V12_Y_MULTIPLIER; + box->lr.x = bp->c64.x2 * V12_X_MULTIPLIER; + box->lr.y = bp->c64.y2 * V12_Y_MULTIPLIER; } else if (_game.version <= 2) { - box->ul.x = bp->v2.ulx * 8; - box->ul.y = bp->v2.uy * 2; - box->ur.x = bp->v2.urx * 8; - box->ur.y = bp->v2.uy * 2; - - box->ll.x = bp->v2.llx * 8; - box->ll.y = bp->v2.ly * 2; - box->lr.x = bp->v2.lrx * 8; - box->lr.y = bp->v2.ly * 2; + box->ul.x = bp->v2.ulx * V12_X_MULTIPLIER; + box->ul.y = bp->v2.uy * V12_Y_MULTIPLIER; + box->ur.x = bp->v2.urx * V12_X_MULTIPLIER; + box->ur.y = bp->v2.uy * V12_Y_MULTIPLIER; + + box->ll.x = bp->v2.llx * V12_X_MULTIPLIER; + box->ll.y = bp->v2.ly * V12_Y_MULTIPLIER; + box->lr.x = bp->v2.lrx * V12_X_MULTIPLIER; + box->lr.y = bp->v2.ly * V12_Y_MULTIPLIER; } else { box->ul.x = (int16)READ_LE_UINT16(&bp->old.ulx); box->ul.y = (int16)READ_LE_UINT16(&bp->old.uly); diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index c5228add31..b95cfeab12 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -454,10 +454,10 @@ int ScummEngine::getObjActToObjActDist(int a, int b) { // For V1/V2 games, distances are measured in the original "character" // based coordinate system, instead of pixels. Otherwise various scripts // will break. See bugs #853874, #774529 - x /= 8; - y /= 2; - x2 /= 8; - y2 /= 2; + x /= V12_X_MULTIPLIER; + y /= V12_Y_MULTIPLIER; + x2 /= V12_X_MULTIPLIER; + y2 /= V12_Y_MULTIPLIER; } return getDist(x, y, x2, y2); diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index 8224ad5f36..d221eba139 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -818,6 +818,9 @@ void ScummEngine_v2::o2_verbOps() { break; default: { // New Verb + // FIXME: maybe use V12_X_MULTIPLIER here... maybe not. Depends + // on whether verbs can be handled separately from objects and + // actors or not when it comes to handling coordinates. int x = fetchScriptByte() * 8; int y = fetchScriptByte() * 8; slot = getVarOrDirectByte(PARAM_1) + 1; @@ -1130,8 +1133,8 @@ void ScummEngine_v2::o2_walkActorTo() { a = derefActor(act, "o2_walkActorTo"); - x = getVarOrDirectByte(PARAM_2) * 8; - y = getVarOrDirectByte(PARAM_3) * 2; + x = getVarOrDirectByte(PARAM_2) * V12_X_MULTIPLIER; + y = getVarOrDirectByte(PARAM_3) * V12_Y_MULTIPLIER; a->startWalkActor(x, y, -1); } @@ -1143,8 +1146,8 @@ void ScummEngine_v2::o2_putActor() { a = derefActor(act, "o2_putActor"); - x = getVarOrDirectByte(PARAM_2) * 8; - y = getVarOrDirectByte(PARAM_3) * 2; + x = getVarOrDirectByte(PARAM_2) * V12_X_MULTIPLIER; + y = getVarOrDirectByte(PARAM_3) * V12_Y_MULTIPLIER; if (_game.id == GID_MANIAC && _game.version <= 1 && _game.platform != Common::kPlatformNES) a->setFacing(180); @@ -1197,7 +1200,7 @@ void ScummEngine_v2::o2_stopScript() { } void ScummEngine_v2::o2_panCameraTo() { - panCameraTo(getVarOrDirectByte(PARAM_1) * 8, 0); + panCameraTo(getVarOrDirectByte(PARAM_1) * V12_X_MULTIPLIER, 0); } void ScummEngine_v2::o2_walkActorToObject() { @@ -1250,7 +1253,7 @@ void ScummEngine_v2::o2_getActorElevation() { getResultPos(); int act = getVarOrDirectByte(PARAM_1); Actor *a = derefActor(act, "o2_getActorElevation"); - setResult(a->getElevation() / 2); + setResult(a->getElevation() / V12_Y_MULTIPLIER); } void ScummEngine_v2::o2_setActorElevation() { @@ -1258,22 +1261,22 @@ void ScummEngine_v2::o2_setActorElevation() { int elevation = (int8)getVarOrDirectByte(PARAM_2); Actor *a = derefActor(act, "o2_setActorElevation"); - a->setElevation(elevation * 2); + a->setElevation(elevation * V12_Y_MULTIPLIER); } void ScummEngine_v2::o2_actorFromPos() { int x, y; getResultPos(); - x = getVarOrDirectByte(PARAM_1) * 8; - y = getVarOrDirectByte(PARAM_2) * 2; + x = getVarOrDirectByte(PARAM_1) * V12_X_MULTIPLIER; + y = getVarOrDirectByte(PARAM_2) * V12_Y_MULTIPLIER; setResult(getActorFromPos(x, y)); } void ScummEngine_v2::o2_findObject() { int obj; getResultPos(); - int x = getVarOrDirectByte(PARAM_1) * 8; - int y = getVarOrDirectByte(PARAM_2) * 2; + int x = getVarOrDirectByte(PARAM_1) * V12_X_MULTIPLIER; + int y = getVarOrDirectByte(PARAM_2) * V12_Y_MULTIPLIER; obj = findObject(x, y); if (obj == 0 && (_game.platform == Common::kPlatformNES) && (_userState & 0x40)) { if (_mouseOverBoxV2 >= 0 && _mouseOverBoxV2 < 4) @@ -1287,7 +1290,7 @@ void ScummEngine_v2::o2_getActorX() { getResultPos(); a = getVarOrDirectByte(PARAM_1); - setResult(getObjX(a) / 8); + setResult(getObjX(a) / V12_X_MULTIPLIER); } void ScummEngine_v2::o2_getActorY() { @@ -1295,7 +1298,7 @@ void ScummEngine_v2::o2_getActorY() { getResultPos(); a = getVarOrDirectByte(PARAM_1); - setResult(getObjY(a) / 2); + setResult(getObjY(a) / V12_Y_MULTIPLIER); } void ScummEngine_v2::o2_isGreater() { @@ -1376,8 +1379,8 @@ void ScummEngine_v2::o2_loadRoomWithEgo() { a->putActor(0, 0, room); _egoPositioned = false; - x = (int8)fetchScriptByte() * 8; - y = (int8)fetchScriptByte() * 2; + x = (int8)fetchScriptByte() * V12_X_MULTIPLIER; + y = (int8)fetchScriptByte() * V12_Y_MULTIPLIER; startScene(a->_room, a, obj); @@ -1428,7 +1431,7 @@ void ScummEngine_v2::o2_setBoxFlags() { } void ScummEngine_v2::o2_setCameraAt() { - setCameraAtEx(getVarOrDirectByte(PARAM_1) * 8); + setCameraAtEx(getVarOrDirectByte(PARAM_1) * V12_X_MULTIPLIER); } void ScummEngine_v2::o2_roomOps() { @@ -1438,6 +1441,7 @@ void ScummEngine_v2::o2_roomOps() { _opcode = fetchScriptByte(); switch (_opcode & 0x1F) { case 1: // SO_ROOM_SCROLL + // FIXME: Use V12_X_MULTIPLIER... ? a *= 8; b *= 8; if (a < (_screenWidth / 2)) diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index b9389f226c..41f963faf3 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -1980,9 +1980,12 @@ void ScummEngine_v5::o5_roomOps() { int len = 256, cnt = 0; ptr = (byte *)malloc(len); while (ptr) { - int r = file->read(ptr + cnt, len - cnt); - if ((cnt += r) < len) break; - ptr = (byte *)realloc(ptr, len *= 2); + int r = file->read(ptr + cnt, len - cnt); + cnt += r; + if (cnt < len) + break; + len *= 2; + ptr = (byte *)realloc(ptr, len); } ptr[cnt] = '\0'; loadPtrToResource(rtString, a, ptr); @@ -2615,7 +2618,7 @@ void ScummEngine_v5::o5_walkActorToActor() { return; if (_game.version <= 2) - dist *= 8; + dist *= V12_X_MULTIPLIER; else if (dist == 0xFF) { dist = a->_scalex * a->_width / 0xFF; dist += (a2->_scalex * a2->_width / 0xFF) / 2; |