aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/script.cpp')
-rw-r--r--engines/saga/script.cpp101
1 files changed, 40 insertions, 61 deletions
diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp
index f40d15f30c..45f10f35c3 100644
--- a/engines/saga/script.cpp
+++ b/engines/saga/script.cpp
@@ -49,7 +49,8 @@ SAGA1Script::SAGA1Script(SagaEngine *vm) : Script(vm) {
byte *resourcePointer;
size_t resourceLength;
int prevTell;
- int i, j;
+ uint ui;
+ int j;
byte *stringsPointer;
size_t stringsLength;
@@ -67,9 +68,7 @@ SAGA1Script::SAGA1Script(SagaEngine *vm) : Script(vm) {
_pointerObject = ID_NOTHING;
_staticSize = 0;
- _commonBufferSize = COMMON_BUFFER_SIZE;
- _commonBuffer = (byte*)malloc(_commonBufferSize);
- memset(_commonBuffer, 0, _commonBufferSize);
+ _commonBuffer.resize(COMMON_BUFFER_SIZE);
debug(8, "Initializing scripting subsystem");
// Load script resource file context
@@ -98,30 +97,26 @@ SAGA1Script::SAGA1Script(SagaEngine *vm) : Script(vm) {
}
// Calculate number of entries
- _modulesCount = resourceLength / _modulesLUTEntryLen;
+ int modulesCount = resourceLength / _modulesLUTEntryLen;
- debug(3, "LUT has %i entries", _modulesCount);
+ debug(3, "LUT has %i entries", modulesCount);
// Allocate space for logical LUT
- _modules = (ModuleData *)malloc(_modulesCount * sizeof(*_modules));
- if (_modules == NULL) {
- memoryError("Script::Script()");
- }
+ _modules.resize(modulesCount);
// Convert LUT resource to logical LUT
MemoryReadStreamEndian scriptS(resourcePointer, resourceLength, resourceContext->isBigEndian());
- for (i = 0; i < _modulesCount; i++) {
- memset(&_modules[i], 0, sizeof(ModuleData));
+ for (ui = 0; ui < _modules.size(); ui++) {
prevTell = scriptS.pos();
- _modules[i].scriptResourceId = scriptS.readUint16();
- _modules[i].stringsResourceId = scriptS.readUint16();
- _modules[i].voicesResourceId = scriptS.readUint16();
+ _modules[ui].scriptResourceId = scriptS.readUint16();
+ _modules[ui].stringsResourceId = scriptS.readUint16();
+ _modules[ui].voicesResourceId = scriptS.readUint16();
// Skip the unused portion of the structure
for (j = scriptS.pos(); j < prevTell + _modulesLUTEntryLen; j++) {
if (scriptS.readByte() != 0)
- warning("Unused scriptLUT part isn't really unused for LUT %d (pos: %d)", i, j);
+ warning("Unused scriptLUT part isn't really unused for LUT %d (pos: %d)", ui, j);
}
}
@@ -157,13 +152,6 @@ SAGA1Script::SAGA1Script(SagaEngine *vm) : Script(vm) {
SAGA1Script::~SAGA1Script() {
debug(8, "Shutting down scripting subsystem.");
-
- _globalVoiceLUT.freeMem();
-
- freeModules();
- free(_modules);
-
- free(_commonBuffer);
}
SAGA2Script::SAGA2Script(SagaEngine *vm) : Script(vm) {
@@ -188,9 +176,9 @@ SAGA2Script::SAGA2Script(SagaEngine *vm) : Script(vm) {
_modulesLUTEntryLen = sizeof(uint32);
// Calculate number of entries
- _modulesCount = resourceLength / _modulesLUTEntryLen + 1;
+ int modulesCount = resourceLength / _modulesLUTEntryLen + 1;
- debug(3, "LUT has %i entries", _modulesCount);
+ debug(3, "LUT has %i entries", modulesCount);
// Script data segment
/*
@@ -993,8 +981,8 @@ void Script::opSpeak(SCRIPTOP_PARAMS) {
}
} else {
#endif
- if (thread->_voiceLUT->voicesCount > first)
- sampleResourceId = thread->_voiceLUT->voices[first];
+ if (thread->_voiceLUT->size() > uint16(first))
+ sampleResourceId = (*thread->_voiceLUT)[uint16(first)];
#if 0
}
#endif
@@ -1066,12 +1054,12 @@ void Script::opJmpSeedRandom(SCRIPTOP_PARAMS) {
warning("opJmpSeedRandom");
}
-void Script::loadModule(int scriptModuleNumber) {
+void Script::loadModule(uint scriptModuleNumber) {
byte *resourcePointer;
size_t resourceLength;
// Validate script number
- if ((scriptModuleNumber < 0) || (scriptModuleNumber >= _modulesCount)) {
+ if ((scriptModuleNumber < 0) || (scriptModuleNumber >= _modules.size())) {
error("Script::loadScript() Invalid script module number");
}
@@ -1101,60 +1089,56 @@ void Script::loadModule(int scriptModuleNumber) {
_modules[scriptModuleNumber].staticOffset = _staticSize;
_staticSize += _modules[scriptModuleNumber].staticSize;
- if (_staticSize > _commonBufferSize) {
- error("Script::loadModule() _staticSize > _commonBufferSize");
+ if (_staticSize > _commonBuffer.size()) {
+ error("Script::loadModule() _staticSize > _commonBuffer.size()");
}
_modules[scriptModuleNumber].loaded = true;
}
-void Script::freeModules() {
- int i;
- for (i = 0; i < _modulesCount; i++) {
+void Script::clearModules() {
+ uint i;
+ for (i = 0; i < _modules.size(); i++) {
if (_modules[i].loaded) {
- _modules[i].freeMem();
- _modules[i].loaded = false;
+ _modules[i].clear();
}
}
_staticSize = 0;
}
void Script::loadModuleBase(ModuleData &module, const byte *resourcePointer, size_t resourceLength) {
- int i;
+ uint i;
debug(3, "Loading module base...");
- module.moduleBase = (byte*)malloc(resourceLength);
- module.moduleBaseSize = resourceLength;
+ module.moduleBase.resize(resourceLength);
+
+ memcpy(&module.moduleBase.front(), resourcePointer, resourceLength);
- memcpy(module.moduleBase, resourcePointer, resourceLength);
+ MemoryReadStreamEndian scriptS(&module.moduleBase.front(), module.moduleBase.size(), _scriptContext->isBigEndian());
- MemoryReadStreamEndian scriptS(module.moduleBase, module.moduleBaseSize, _scriptContext->isBigEndian());
-
- module.entryPointsCount = scriptS.readUint16();
+ uint entryPointsCount = scriptS.readUint16();
scriptS.readUint16(); //skip
- module.entryPointsTableOffset = scriptS.readUint16();
+ uint16 entryPointsTableOffset; // offset of entrypoint table in moduleBase
+ entryPointsTableOffset = scriptS.readUint16();
scriptS.readUint16(); //skip
- if ((module.moduleBaseSize - module.entryPointsTableOffset) < (module.entryPointsCount * SCRIPT_TBLENTRY_LEN)) {
+ if ((module.moduleBase.size() - entryPointsTableOffset) < (entryPointsCount * SCRIPT_TBLENTRY_LEN)) {
error("Script::loadModuleBase() Invalid table offset");
}
- if (module.entryPointsCount > SCRIPT_MAX) {
+ if (entryPointsCount > SCRIPT_MAX) {
error("Script::loadModuleBase()Script limit exceeded");
}
- module.entryPoints = (EntryPoint *)malloc(module.entryPointsCount * sizeof(*module.entryPoints));
- if (module.entryPoints == NULL) {
- memoryError("Script::loadModuleBase");
- }
+ module.entryPoints.resize(entryPointsCount);
// Read in the entrypoint table
module.staticSize = scriptS.readUint16();
- while (scriptS.pos() < module.entryPointsTableOffset)
+ while (scriptS.pos() < entryPointsTableOffset)
scriptS.readByte();
- for (i = 0; i < module.entryPointsCount; i++) {
+ for (i = 0; i < module.entryPoints.size(); i++) {
// First uint16 is the offset of the entrypoint name from the start
// of the bytecode resource, second uint16 is the offset of the
// bytecode itself for said entrypoint
@@ -1162,7 +1146,7 @@ void Script::loadModuleBase(ModuleData &module, const byte *resourcePointer, siz
module.entryPoints[i].offset = scriptS.readUint16();
// Perform a simple range check on offset values
- if ((module.entryPoints[i].nameOffset >= module.moduleBaseSize) || (module.entryPoints[i].offset >= module.moduleBaseSize)) {
+ if ((module.entryPoints[i].nameOffset >= module.moduleBase.size()) || (module.entryPoints[i].offset >= module.moduleBase.size())) {
error("Script::loadModuleBase() Invalid offset encountered in script entrypoint table");
}
}
@@ -1171,17 +1155,12 @@ void Script::loadModuleBase(ModuleData &module, const byte *resourcePointer, siz
void Script::loadVoiceLUT(VoiceLUT &voiceLUT, const byte *resourcePointer, size_t resourceLength) {
uint16 i;
- voiceLUT.voicesCount = resourceLength / 2;
-
- voiceLUT.voices = (uint16 *)malloc(voiceLUT.voicesCount * sizeof(*voiceLUT.voices));
- if (voiceLUT.voices == NULL) {
- error("Script::loadVoiceLUT() not enough memory");
- }
+ voiceLUT.resize(resourceLength / 2);
MemoryReadStreamEndian scriptS(resourcePointer, resourceLength, _scriptContext->isBigEndian());
- for (i = 0; i < voiceLUT.voicesCount; i++) {
- voiceLUT.voices[i] = scriptS.readUint16();
+ for (i = 0; i < voiceLUT.size(); i++) {
+ voiceLUT[i] = scriptS.readUint16();
}
}