aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/script.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2007-04-15 14:38:02 +0000
committerJohannes Schickel2007-04-15 14:38:02 +0000
commitb9443dfb60e533d614c4914dfabb4e75e45cdf38 (patch)
tree66bef48dd8ccea80d14c07e2f4646aa0ff5c9fc0 /engines/kyra/script.cpp
parent5668e15b2efb2aa9ab5bff3cf6b257a3986602ff (diff)
downloadscummvm-rg350-b9443dfb60e533d614c4914dfabb4e75e45cdf38.tar.gz
scummvm-rg350-b9443dfb60e533d614c4914dfabb4e75e45cdf38.tar.bz2
scummvm-rg350-b9443dfb60e533d614c4914dfabb4e75e45cdf38.zip
More cleanup.
svn-id: r26502
Diffstat (limited to 'engines/kyra/script.cpp')
-rw-r--r--engines/kyra/script.cpp55
1 files changed, 29 insertions, 26 deletions
diff --git a/engines/kyra/script.cpp b/engines/kyra/script.cpp
index 2e893ced9e..762288a8e0 100644
--- a/engines/kyra/script.cpp
+++ b/engines/kyra/script.cpp
@@ -71,7 +71,7 @@ ScriptHelper::ScriptHelper(KyraEngine *vm) : _vm(vm) {
bool ScriptHelper::loadScript(const char *filename, ScriptData *scriptData) {
uint32 size = 0;
uint8 *data = _vm->resource()->fileData(filename, &size);
- byte *curData = data;
+ const byte *curData = data;
uint32 formBlockSize = getFORMBlockSize(curData);
if (formBlockSize == (uint32)-1) {
@@ -99,20 +99,19 @@ bool ScriptHelper::loadScript(const char *filename, ScriptData *scriptData) {
error("No ORDR chunk found in file: '%s'", filename);
return false;
}
+ chunkSize >>= 1;
- scriptData->ordr = new byte[chunkSize];
+ scriptData->ordr = new uint16[chunkSize];
- if (!loadIFFBlock(data, curData, size, ORDR_CHUNK, scriptData->ordr, chunkSize)) {
+ if (!loadIFFBlock(data, curData, size, ORDR_CHUNK, scriptData->ordr, chunkSize << 1)) {
delete [] data;
unloadScript(scriptData);
error("Couldn't load ORDR chunk from file: '%s'", filename);
return false;
}
- chunkSize = chunkSize / 2;
- while (chunkSize--) {
- ((uint16*)scriptData->ordr)[chunkSize] = READ_BE_UINT16(&((uint16*)scriptData->ordr)[chunkSize]);
- }
+ while (chunkSize--)
+ scriptData->ordr[chunkSize] = READ_BE_UINT16(&scriptData->ordr[chunkSize]);
chunkSize = getIFFBlockSize(data, curData, size, DATA_CHUNK);
if (chunkSize == (uint32)-1) {
@@ -121,16 +120,20 @@ bool ScriptHelper::loadScript(const char *filename, ScriptData *scriptData) {
error("No DATA chunk found in file: '%s'", filename);
return false;
}
+ chunkSize >>= 1;
- scriptData->data = new byte[chunkSize];
+ scriptData->data = new uint16[chunkSize];
- if (!loadIFFBlock(data, curData, size, DATA_CHUNK, scriptData->data, chunkSize)) {
+ if (!loadIFFBlock(data, curData, size, DATA_CHUNK, scriptData->data, chunkSize << 1)) {
delete [] data;
unloadScript(scriptData);
error("Couldn't load DATA chunk from file: '%s'", filename);
return false;
}
- scriptData->dataSize = chunkSize / 2;
+ scriptData->dataSize = chunkSize;
+
+ while (chunkSize--)
+ scriptData->data[chunkSize] = READ_BE_UINT16(&scriptData->data[chunkSize]);
delete [] data;
return true;
@@ -144,7 +147,8 @@ void ScriptHelper::unloadScript(ScriptData *data) {
delete [] data->ordr;
delete [] data->data;
- data->text = data->ordr = data->data = 0;
+ data->text = 0;
+ data->ordr = data->data = 0;
}
void ScriptHelper::initScript(ScriptState *scriptStat, const ScriptData *data) {
@@ -159,14 +163,14 @@ bool ScriptHelper::startScript(ScriptState *script, int function) {
if (!script->dataPtr)
return false;
- uint16 functionOffset = ((uint16*)script->dataPtr->ordr)[function];
+ uint16 functionOffset = script->dataPtr->ordr[function];
if (functionOffset == 0xFFFF)
return false;
if (_vm->gameFlags().platform == Common::kPlatformFMTowns)
- script->ip = &script->dataPtr->data[functionOffset*2+2];
+ script->ip = &script->dataPtr->data[functionOffset+1];
else
- script->ip = &script->dataPtr->data[functionOffset*2];
+ script->ip = &script->dataPtr->data[functionOffset];
return true;
}
@@ -184,7 +188,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
if (!script->ip)
return false;
- int16 code = READ_BE_UINT16(script->ip); script->ip += 2;
+ int16 code = *script->ip++;
int16 opcode = (code >> 8) & 0x1F;
if (code & 0x8000) {
@@ -193,7 +197,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
} else if (code & 0x4000) {
_parameter = (int8)(code);
} else if (code & 0x2000) {
- _parameter = READ_BE_UINT16(script->ip); script->ip += 2;
+ _parameter = *script->ip++;
} else {
_parameter = 0;
}
@@ -208,7 +212,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
return _continue;
}
-uint32 ScriptHelper::getFORMBlockSize(byte *&data) const {
+uint32 ScriptHelper::getFORMBlockSize(const byte *&data) const {
static const uint32 chunkName = FORM_CHUNK;
if (READ_LE_UINT32(data) != chunkName)
@@ -219,7 +223,7 @@ uint32 ScriptHelper::getFORMBlockSize(byte *&data) const {
return retValue;
}
-uint32 ScriptHelper::getIFFBlockSize(byte *start, byte *&data, uint32 maxSize, const uint32 chunkName) const {
+uint32 ScriptHelper::getIFFBlockSize(const byte *start, const byte *&data, uint32 maxSize, const uint32 chunkName) const {
uint32 size = (uint32)-1;
bool special = false;
@@ -247,7 +251,7 @@ uint32 ScriptHelper::getIFFBlockSize(byte *start, byte *&data, uint32 maxSize, c
return size;
}
-bool ScriptHelper::loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const uint32 chunkName, byte *loadTo, uint32 ptrSize) const {
+bool ScriptHelper::loadIFFBlock(const byte *start, const byte *&data, uint32 maxSize, const uint32 chunkName, void *loadTo, uint32 ptrSize) const {
bool special = false;
if (data == (start + maxSize))
@@ -271,9 +275,8 @@ bool ScriptHelper::loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const
loadSize = ptrSize;
memcpy(loadTo, data, loadSize);
chunkSize = (chunkSize + 1) & 0xFFFFFFFE;
- if (chunkSize > loadSize) {
+ if (chunkSize > loadSize)
data += (chunkSize - loadSize);
- }
return true;
}
}
@@ -286,7 +289,7 @@ bool ScriptHelper::loadIFFBlock(byte *start, byte *&data, uint32 maxSize, const
#pragma mark -
void ScriptHelper::c1_jmpTo(ScriptState* script) {
- script->ip = script->dataPtr->data + (_parameter << 1);
+ script->ip = script->dataPtr->data + _parameter;
}
void ScriptHelper::c1_setRetValue(ScriptState* script) {
@@ -300,7 +303,7 @@ void ScriptHelper::c1_pushRetOrPos(ScriptState* script) {
break;
case 1:
- script->stack[--script->sp] = (script->ip - script->dataPtr->data) / 2 + 1;
+ script->stack[--script->sp] = script->ip - script->dataPtr->data + 1;
script->stack[--script->sp] = script->bp;
script->bp = script->sp + 2;
break;
@@ -340,7 +343,7 @@ void ScriptHelper::c1_popRetOrPos(ScriptState* script) {
script->ip = 0;
} else {
script->bp = script->stack[script->sp++];
- script->ip = script->dataPtr->data + (script->stack[script->sp++] << 1);
+ script->ip = script->dataPtr->data + script->stack[script->sp++];
}
break;
@@ -378,7 +381,7 @@ void ScriptHelper::c1_execOpcode(ScriptState* script) {
void ScriptHelper::c1_ifNotJmp(ScriptState* script) {
if (!script->stack[script->sp++]) {
_parameter &= 0x7FFF;
- script->ip = script->dataPtr->data + (_parameter << 1);
+ script->ip = script->dataPtr->data + _parameter;
}
}
@@ -532,7 +535,7 @@ void ScriptHelper::c1_setRetAndJmp(ScriptState* script) {
script->retValue = script->stack[script->sp++];
uint16 temp = script->stack[script->sp++];
script->stack[60] = 0;
- script->ip = &script->dataPtr->data[temp*2];
+ script->ip = &script->dataPtr->data[temp];
}
}
} // end of namespace Kyra