[Scummvm-cvs-logs] scummvm master -> 056c5a7ae71128cbbe55dcf45a8989e71f7d9ae5

sev- sev at scummvm.org
Thu May 26 12:16:12 CEST 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
056c5a7ae7 SCUMM HE: Fixed SCUMM wrapper for nuking array in U32.


Commit: 056c5a7ae71128cbbe55dcf45a8989e71f7d9ae5
    https://github.com/scummvm/scummvm/commit/056c5a7ae71128cbbe55dcf45a8989e71f7d9ae5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T12:16:04+02:00

Commit Message:
SCUMM HE: Fixed SCUMM wrapper for nuking array in U32.

This was leading to an out of bounds assert.

Changed paths:
    engines/scumm/he/moonbase/ai_main.cpp
    engines/scumm/he/moonbase/ai_targetacquisition.cpp
    engines/scumm/he/moonbase/moonbase.cpp
    engines/scumm/he/moonbase/moonbase.h
    engines/scumm/he/script_v72he.cpp



diff --git a/engines/scumm/he/moonbase/ai_main.cpp b/engines/scumm/he/moonbase/ai_main.cpp
index 554d2ee..d34a5c1 100644
--- a/engines/scumm/he/moonbase/ai_main.cpp
+++ b/engines/scumm/he/moonbase/ai_main.cpp
@@ -407,7 +407,7 @@ int masterControlProgram(const int paramCount, const int32 *params) {
 				nextBuilding = _vm->_moonbase->readFromArray(unitsArray, 0, unitsCounter);
 			}
 
-			_vm->nukeArray(unitsArray);
+			_vm->_moonbase->deallocateArray(unitsArray);
 
 			if (!balloonFlag) {
 				launchAction = new int[4];
@@ -907,7 +907,7 @@ int masterControlProgram(const int paramCount, const int32 *params) {
 				opponentBuilding = _vm->_moonbase->readFromArray(nearbyOpponents, 0, opponentCounter);
 			}
 
-			_vm->nukeArray(nearbyOpponents);
+			_vm->_moonbase->deallocateArray(nearbyOpponents);
 
 			if (defenseOn && defenseOff) {
 				if (!_vm->_rnd.getRandomNumber(1)) {
@@ -1164,7 +1164,7 @@ int chooseBehavior() {
 				energyBuilding = _vm->_moonbase->readFromArray(energyUnits, 0, energyCounter);
 			}
 
-			_vm->nukeArray(energyUnits);
+			_vm->_moonbase->deallocateArray(energyUnits);
 
 			if (energyCount < poolMaxCount) {
 				int closestHub = getClosestUnit(poolX, poolY, 300, currentPlayer, 1, BUILDING_MAIN_BASE, 1);
@@ -1257,7 +1257,7 @@ int chooseBehavior() {
 						defenseBuilding = _vm->_moonbase->readFromArray(defArray, 0, defCounter);
 					}
 
-					_vm->nukeArray(defArray);
+					_vm->_moonbase->deallocateArray(defArray);
 
 					if (!numDefenders) {
 						int defArray2 = getUnitsWithinRadius(hubX, hubY, 170);
@@ -1276,7 +1276,7 @@ int chooseBehavior() {
 							defenseBuilding2 = _vm->_moonbase->readFromArray(defArray, 0, defCounter);
 						}
 
-						_vm->nukeArray(defArray2);
+						_vm->_moonbase->deallocateArray(defArray2);
 
 					}
 
@@ -1314,7 +1314,7 @@ int chooseBehavior() {
 			}
 		}
 
-		_vm->nukeArray(enemyArray);
+		_vm->_moonbase->deallocateArray(enemyArray);
 		offCon--;
 	}
 
@@ -1363,7 +1363,7 @@ int chooseBehavior() {
 						closeBuilding = _vm->_moonbase->readFromArray(closeBuildingsArray, 0, closeBuildingCounter);
 					}
 
-					_vm->nukeArray(closeBuildingsArray);
+					_vm->_moonbase->deallocateArray(closeBuildingsArray);
 
 					int defCounter = 0;
 					int defArray = getUnitsWithinRadius(hubX, hubY, 170);
@@ -1382,7 +1382,7 @@ int chooseBehavior() {
 						defenseBuilding = _vm->_moonbase->readFromArray(defArray, 0, defCounter);
 					}
 
-					_vm->nukeArray(defArray);
+					_vm->_moonbase->deallocateArray(defArray);
 
 					if (numDefenders > 2)
 						defCon++;
@@ -1481,7 +1481,7 @@ int chooseTarget(int behavior1) {
 					thisPoolUnit = _vm->_moonbase->readFromArray(poolUnitsArray, 0, j);
 				}
 
-				_vm->nukeArray(poolUnitsArray);
+				_vm->_moonbase->deallocateArray(poolUnitsArray);
 
 				// if enemy collector, put at bottom
 				if (enemyPool) {
@@ -1532,7 +1532,7 @@ int chooseTarget(int behavior1) {
 					if ((getTerrain(getHubX(thisBuilding), getHubY(thisBuilding)) != TERRAIN_TYPE_WATER) || (getPlayerEnergy() > 6)) {
 						if (getClosestUnit(getHubX(thisBuilding), getHubY(thisBuilding), 380, currentPlayer, 1, BUILDING_MAIN_BASE, 1)) {
 							returnBuilding = thisBuilding;
-							_vm->nukeArray(enemyArray);
+							_vm->_moonbase->deallocateArray(enemyArray);
 							return returnBuilding;
 						}
 					} else {
@@ -1558,7 +1558,7 @@ int chooseTarget(int behavior1) {
 			}
 		}
 
-		_vm->nukeArray(enemyArray);
+		_vm->_moonbase->deallocateArray(enemyArray);
 
 		if (attackableIndex) {
 			int thisWorth = 0;
@@ -1718,7 +1718,7 @@ int chooseTarget(int behavior1) {
 						defenseBuilding = _vm->_moonbase->readFromArray(defenseArray, 0, j);
 					}
 
-					_vm->nukeArray(defenseArray);
+					_vm->_moonbase->deallocateArray(defenseArray);
 
 					// Calculate if this unit is attackable
 					// get dist to nearest enemy hub, offense
@@ -1925,7 +1925,7 @@ Tree *initAcquireTarget(int targetX, int targetY, Node **retNode) {
 
 	int thisElement = _vm->_moonbase->readFromArray(unitsArray, 0, 0);
 
-	_vm->nukeArray(unitsArray);
+	_vm->_moonbase->deallocateArray(unitsArray);
 
 	if (!thisElement) {
 		delete myBaseTarget;
@@ -2062,7 +2062,7 @@ int *energizeTarget(int &targetX, int &targetY, int index) {
 	}
 
 	if (poolUnitsArray)
-		_vm->nukeArray(poolUnitsArray);
+		_vm->_moonbase->deallocateArray(poolUnitsArray);
 
 	poolUnitsArray = getUnitsWithinRadius(targetX, targetY, 450);
 	assert(poolUnitsArray);
@@ -2175,14 +2175,14 @@ int *energizeTarget(int &targetX, int &targetY, int index) {
 								if (nextUnit <= 0)
 									retVal[0] = 0;
 
-								_vm->nukeArray(poolUnitsArray);
+								_vm->_moonbase->deallocateArray(poolUnitsArray);
 								poolUnitsArray = 0;
 								return retVal;
 							}
 						}
 
 						if (result > 0) {
-							_vm->nukeArray(poolUnitsArray);
+							_vm->_moonbase->deallocateArray(poolUnitsArray);
 							poolUnitsArray = 0;
 
 							targetX = xPos;
@@ -2205,7 +2205,7 @@ int *energizeTarget(int &targetX, int &targetY, int index) {
 					} else {
 						int *retVal = new int[4];
 						retVal[0] = 0;
-						_vm->nukeArray(poolUnitsArray);
+						_vm->_moonbase->deallocateArray(poolUnitsArray);
 						poolUnitsArray = 0;
 
 						return retVal;
@@ -2224,12 +2224,12 @@ int *energizeTarget(int &targetX, int &targetY, int index) {
 			j = 0;
 		}
 	} else {
-		_vm->nukeArray(poolUnitsArray);
+		_vm->_moonbase->deallocateArray(poolUnitsArray);
 		poolUnitsArray = 0;
 		return NULL;
 	}
 
-	_vm->nukeArray(poolUnitsArray);
+	_vm->_moonbase->deallocateArray(poolUnitsArray);
 	poolUnitsArray = 0;
 	int *retVal = new int[4];
 	retVal[0] = 0;
diff --git a/engines/scumm/he/moonbase/ai_targetacquisition.cpp b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
index fb74d8a..253142a 100644
--- a/engines/scumm/he/moonbase/ai_targetacquisition.cpp
+++ b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
@@ -361,7 +361,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
 		}
 	}
 
-	_vm->nukeArray(unitsArray);
+	_vm->_moonbase->deallocateArray(unitsArray);
 
 	//Check if repair is needed
 	int targetUnit = getClosestUnit(targetX + 5, targetY, 15, currentPlayer, 1, 0, 0, 0);
@@ -384,7 +384,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
 				}
 			}
 
-			_vm->nukeArray(unitsArray);
+			_vm->_moonbase->deallocateArray(unitsArray);
 
 			if (defCount) {
 				//repair
@@ -480,7 +480,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
 				setPower(power);
 				setAngle(angle);
 
-				_vm->nukeArray(unitsArray2);
+				_vm->_moonbase->deallocateArray(unitsArray2);
 				return 1;
 			}
 
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index d7069e7..833d847 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -35,7 +35,13 @@ Moonbase::~Moonbase() {
 int Moonbase::readFromArray(int array, int y, int x) {
 	_vm->VAR(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK) = array;
 
-	return _vm->readArray(116, y, x);
+	return _vm->readArray(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK, y, x);
+}
+
+void Moonbase::deallocateArray(int array) {
+	_vm->VAR(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK) = array;
+
+	return _vm->nukeArray(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK);
 }
 
 int Moonbase::callScummFunction(int scriptNumber, int paramCount,...) {
diff --git a/engines/scumm/he/moonbase/moonbase.h b/engines/scumm/he/moonbase/moonbase.h
index 7d93661..f7d8cdb 100644
--- a/engines/scumm/he/moonbase/moonbase.h
+++ b/engines/scumm/he/moonbase/moonbase.h
@@ -35,6 +35,7 @@ public:
 	~Moonbase();
 
 	int readFromArray(int array, int y, int x);
+	void deallocateArray(int array);
 	int callScummFunction(int scriptNumber, int paramCount,...);
 
 	void blitT14WizImage(uint8 *dst, int dstw, int dsth, int dstPitch, const Common::Rect *clipBox,
diff --git a/engines/scumm/he/script_v72he.cpp b/engines/scumm/he/script_v72he.cpp
index 9b1b617..d32eb76 100644
--- a/engines/scumm/he/script_v72he.cpp
+++ b/engines/scumm/he/script_v72he.cpp
@@ -119,7 +119,7 @@ byte *ScummEngine_v72he::defineArray(int array, int type, int dim2start, int dim
 
 	id = findFreeArrayId();
 
-	debug(9,"defineArray (array %d, dim2start %d, dim2end %d dim1start %d dim1end %d", id, dim2start, dim2end, dim1start, dim1end);
+	debug(9, "defineArray (array %d, dim2start %d, dim2end %d dim1start %d dim1end %d", id, dim2start, dim2end, dim1start, dim1end);
 
 	if (array & 0x80000000) {
 		error("Can't define bit variable as array pointer");






More information about the Scummvm-git-logs mailing list