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