diff options
| -rw-r--r-- | scumm/resource.h | 8 | ||||
| -rw-r--r-- | scumm/script_v6.cpp | 56 | ||||
| -rw-r--r-- | scumm/script_v6he.cpp | 4 | ||||
| -rw-r--r-- | scumm/script_v7he.cpp | 2 | ||||
| -rw-r--r-- | scumm/script_v8.cpp | 16 | 
5 files changed, 50 insertions, 36 deletions
diff --git a/scumm/resource.h b/scumm/resource.h index 77fdd147af..8a2c65ae38 100644 --- a/scumm/resource.h +++ b/scumm/resource.h @@ -31,6 +31,14 @@ struct ResHdr {  	uint32 tag, size;  } GCC_PACK; +enum ArrayType { +	kBitArray = 1, +	kNibbleArray = 2, +	kByteArray = 3, +	kStringArray = 4, +	kIntArray = 5 +}; +  struct ArrayHeader {  	int16 dim1;  	int16 type; diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index dc0714adce..77d5b3d6f7 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -402,13 +402,23 @@ ArrayHeader *ScummEngine_v6::defineArray(int array, int type, int dim2, int dim1  	int id;  	int size;  	ArrayHeader *ah; +	 +	assert(0 <= type && type <= 5); +	  	if (_heversion >= 60) { -		if (type == rtScript || type == rtRoom) -			type = rtCostume; +		// FIXME: Fingolfin asks: What is this change good for? It doesn't hurt, +		// but it also has no effect whatsoever... +		if (type == 1 || type == 2) +			type = 3;  	} else { -		if (type != rtSound) -			type = rtInventory; +		// The following code basically turn all arrays except string arrays  +		// into integer arrays. There seems to be no purpose in this, and it +		// wastes space. However, we can't just change this either, as that +		// would break savegame compatibility. So do not touch this unless you +		// are adding code which updated old savegames, too. +		if (type != 4) +			type = 5;  	}  	nukeArray(array); @@ -423,7 +433,7 @@ ArrayHeader *ScummEngine_v6::defineArray(int array, int type, int dim2, int dim1  			error("Can't define bit variable as array pointer");  		} -		size = (type == 5) ? 32 : 8; +		size = (type == kIntArray) ? 4 : 1;  	} else {  		if (array & 0x4000) {  		} @@ -432,14 +442,13 @@ ArrayHeader *ScummEngine_v6::defineArray(int array, int type, int dim2, int dim1  			error("Can't define bit variable as array pointer");  		} -		size = (type == 5) ? 16 : 8; +		size = (type == kIntArray) ? 2 : 1;  	}  	writeVar(array, id);  	size *= dim2 + 1;  	size *= dim1 + 1; -	size >>= 3;  	ah = (ArrayHeader *)createResource(rtString, id, size + sizeof(ArrayHeader)); @@ -543,10 +552,7 @@ void ScummEngine_v6::readArrayFromIndexFile() {  		a = _fileHandle.readUint16LE();  		b = _fileHandle.readUint16LE();  		c = _fileHandle.readUint16LE(); -		if (c == 1) -			defineArray(num, 1, a, b); -		else -			defineArray(num, 5, a, b); +		defineArray(num, c, a, b);  	}  } @@ -2073,7 +2079,7 @@ void ScummEngine_v6::o6_arrayOps() {  	case 205:		// SO_ASSIGN_STRING  		b = pop();  		len = resStrLen(_scriptPointer); -		ah = defineArray(array, 4, 0, len + 1); +		ah = defineArray(array, kStringArray, 0, len + 1);  		copyScriptString(ah->data + b);  		break;  	case 208:		// SO_ASSIGN_INT_LIST @@ -2081,7 +2087,7 @@ void ScummEngine_v6::o6_arrayOps() {  		c = pop();  		d = readVar(array);  		if (d == 0) { -			defineArray(array, 5, 0, b + c); +			defineArray(array, kIntArray, 0, b + c);  		}  		while (c--) {  			writeArray(array, 0, b + c, pop()); @@ -2364,19 +2370,19 @@ void ScummEngine_v6::o6_dimArray() {  	switch (fetchScriptByte()) {  	case 199:		// SO_INT_ARRAY -		data = 5; +		data = kIntArray;  		break;  	case 200:		// SO_BIT_ARRAY -		data = 1; +		data = kBitArray;  		break;  	case 201:		// SO_NIBBLE_ARRAY -		data = 2; +		data = kNibbleArray;  		break;  	case 202:		// SO_BYTE_ARRAY -		data = 3; +		data = kByteArray;  		break;  	case 203:		// SO_STRING_ARRAY -		data = 4; +		data = kStringArray;  		break;  	case 204:		// SO_UNDIM_ARRAY  		nukeArray(fetchScriptWord()); @@ -2396,19 +2402,19 @@ void ScummEngine_v6::o6_dim2dimArray() {  	int a, b, data;  	switch (fetchScriptByte()) {  	case 199:		// SO_INT_ARRAY -		data = 5; +		data = kIntArray;  		break;  	case 200:		// SO_BIT_ARRAY -		data = 1; +		data = kBitArray;  		break;  	case 201:		// SO_NIBBLE_ARRAY -		data = 2; +		data = kNibbleArray;  		break;  	case 202:		// SO_BYTE_ARRAY -		data = 3; +		data = kByteArray;  		break;  	case 203:		// SO_STRING_ARRAY -		data = 4; +		data = kStringArray;  		break;  	default:  		error("o6_dim2dimArray: default case"); @@ -2957,7 +2963,7 @@ void ScummEngine_v6::o6_findAllObjects() {  	if (a != _currentRoom)  		warning("o6_findAllObjects: current room is not %d", a);  	writeVar(0, 0); -	defineArray(0, 5, 0, _numLocalObjects + 1); +	defineArray(0, kIntArray, 0, _numLocalObjects + 1);  	writeArray(0, 0, 0, _numLocalObjects);  	while (i < _numLocalObjects) { @@ -3001,7 +3007,7 @@ void ScummEngine_v6::o6_pickVarRandom() {  	int value = fetchScriptWord();  	if (readVar(value) == 0) { -		defineArray(value, 5, 0, num + 1); +		defineArray(value, kIntArray, 0, num + 1);  		if (num > 0) {  			int16 counter = 0;  			do { diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index 0609b5b5d3..b2f634ec77 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -838,7 +838,7 @@ void ScummEngine_v6he::o6_kernelGetFunctions() {  		// Fatty Bear's Birthday Surprise  		// XXX gdi_virtScreen = 0;  		writeVar(0, 0); -		defineArray(0, rtCostume, 0, virtScreenSave(0, args[1], args[2], args[3], args[4])); +		defineArray(0, kByteArray, 0, virtScreenSave(0, args[1], args[2], args[3], args[4]));  		retval = readVar(0);  		ah = (ArrayHeader *)getResourceAddress(rtString, retval);  		virtScreenSave(ah->data, args[1], args[2], args[3], args[4]); @@ -1051,7 +1051,7 @@ int ScummEngine_v6he::readFileToArray(int slot, int32 size) {  	writeVar(0, 0); -	ArrayHeader *ah = defineArray(0, rtCostume, 0, size); +	ArrayHeader *ah = defineArray(0, kByteArray, 0, size);  	_hFileTable[slot].read(ah->data, size);  	return readVar(0); diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index ec9fb043e9..ff62eea9e9 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -491,7 +491,7 @@ void ScummEngine_v7he::o7_readINI() {  		push(0);  		break;  	case 2: // string -		defineArray(0, 4, 0, 0); +		defineArray(0, kStringArray, 0, 0);  		retval = readVar(0);  		writeArray(0, 0, 0, 0);  		push(retval); // var ID string diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index eb76c0d4ed..4a33568088 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -545,9 +545,9 @@ void ScummEngine_v8::readArrayFromIndexFile() {  		b = _fileHandle.readUint32LE();  		if (b != 0) -			defineArray(num, 5, b, a); +			defineArray(num, kIntArray, b, a);  		else -			defineArray(num, 5, a, b); +			defineArray(num, kIntArray, a, b);  	}  } @@ -615,10 +615,10 @@ void ScummEngine_v8::o8_dimArray() {  	switch (subOp) {  	case 0x0A:		// SO_ARRAY_SCUMMVAR -		defineArray(array, 5, 0, pop()); +		defineArray(array, kIntArray, 0, pop());  		break;  	case 0x0B:		// SO_ARRAY_STRING -		defineArray(array, 4, 0, pop()); +		defineArray(array, kStringArray, 0, pop());  		break;  	case 0x0C:		// SO_ARRAY_UNDIM  		nukeArray(array); @@ -636,12 +636,12 @@ void ScummEngine_v8::o8_dim2dimArray() {  	case 0x0A:		// SO_ARRAY_SCUMMVAR  		b = pop();  		a = pop(); -		defineArray(array, 5, a, b); +		defineArray(array, kIntArray, a, b);  		break;  	case 0x0B:		// SO_ARRAY_STRING  		b = pop();  		a = pop(); -		defineArray(array, 4, a, b); +		defineArray(array, kStringArray, a, b);  		break;  	case 0x0C:		// SO_ARRAY_UNDIM  		nukeArray(array); @@ -662,7 +662,7 @@ void ScummEngine_v8::o8_arrayOps() {  	case 0x14:		// SO_ASSIGN_STRING  		b = pop();  		len = resStrLen(_scriptPointer); -		ah = defineArray(array, 4, 0, len + 1); +		ah = defineArray(array, kStringArray, 0, len + 1);  		copyScriptString(ah->data + b);  		break;  	case 0x15:		// SO_ASSIGN_SCUMMVAR_LIST @@ -670,7 +670,7 @@ void ScummEngine_v8::o8_arrayOps() {  		len = getStackList(list, ARRAYSIZE(list));  		d = readVar(array);  		if (d == 0) { -			defineArray(array, 5, 0, b + len); +			defineArray(array, kIntArray, 0, b + len);  		}  		while (--len >= 0) {  			writeArray(array, 0, b + len, list[len]);  | 
