From 5e3236ac47bcda486642753480b96e6d9848bc54 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 1 Aug 2004 01:54:37 +0000 Subject: Add symbolic names for the array types, which makes the code easier to read/understand (note that array types != res types) svn-id: r14404 --- scumm/resource.h | 8 ++++++++ scumm/script_v6.cpp | 56 ++++++++++++++++++++++++++++----------------------- scumm/script_v6he.cpp | 4 ++-- scumm/script_v7he.cpp | 2 +- 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]); -- cgit v1.2.3