diff options
Diffstat (limited to 'engines/m4/script.cpp')
-rw-r--r-- | engines/m4/script.cpp | 1389 |
1 files changed, 0 insertions, 1389 deletions
diff --git a/engines/m4/script.cpp b/engines/m4/script.cpp deleted file mode 100644 index 026c025f45..0000000000 --- a/engines/m4/script.cpp +++ /dev/null @@ -1,1389 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "common/system.h" -#include "common/textconsole.h" - -#include "m4/m4.h" -#include "m4/script.h" -#include "m4/resource.h" - -namespace M4 { - -enum OpcodeType { - opRet = 0, - opCall, - opCallKernel, - opPush, - opPush0, - opPush1, - opPushNeg1, - opPop, - opMov, - opAdd, - opSub, - opInc, - opDec, - opCmp, - opJmp, - opJmpByTable, - opJz, - opJnz, - opJe, - opJne, - opJl, - opJle, - opJg, - opJge, - opXor, - opShl, - opShr, - - opDebug, - - opInvalid -}; - -const char *opcodeNames[] = { - "opRet", - "opCall", - "opCallKernel", - "opPush", - "opPush0", - "opPush1", - "opPushNeg1", - "opPop", - "opMov", - "opAdd", - "opSub", - "opInc", - "opDec", - "opCmp", - "opJmp", - "opJmpByTable", - "opJz", - "opJnz", - "opJe", - "opJne", - "opJl", - "opJle", - "opJg", - "opJge", - "opXor", - "opShl", - "opShr", - "opDebug", - "opInvalid" -}; - -StringTable::StringTable() : _stringsData(NULL) { -} - -StringTable::~StringTable() { - delete[] _stringsData; -} - -void StringTable::load(Common::File *fd) { - int stringSize = fd->readUint32LE(); - int stringCount = fd->readUint32LE(); - _stringsData = new char[stringSize]; - fd->read(_stringsData, stringSize); - char *stringPtr = _stringsData; - for (int i = 0; i < stringCount; i++) { - _strings.push_back((const char*)stringPtr); - stringPtr += strlen(stringPtr) + 1; - } -} - -SeriesStreamBreakList::~SeriesStreamBreakList() { -} - -void SeriesStreamBreakList::load(Common::File *fd) { - uint32 count = fd->readUint32LE(); - debugCN(kDebugScript, "SeriesStreamBreakList::load() count = %d\n", count); - for (uint32 i = 0; i < count; i++) { - SeriesStreamBreakItem *item = new SeriesStreamBreakItem(); - item->frameNum = fd->readUint32LE(); - item->digiName = _inter->loadGlobalString(fd); - item->digiChannel = fd->readUint32LE(); - item->digiVolume = fd->readUint32LE(); - item->trigger = fd->readUint32LE(); - item->flags = fd->readUint32LE(); - item->variable.type = kGameVar; - item->variable.value = fd->readUint32LE(); - item->value = fd->readUint32LE(); - _items.push_back(item); - - debugCN(kDebugScript, "%02d: frameNum = %d; digiName = %s; digiChannel = %d; digiVolume = %d; trigger = %d; flags = %d; variable = %d; value = %d\n", - i, item->frameNum, item->digiName, item->digiChannel, item->digiVolume, item->trigger, item->flags, item->variable.value, item->value); - - } -} - -SaidArray::~SaidArray() { -} - -void SaidArray::load(Common::File *fd) { - uint32 count = fd->readUint32LE(); - debugCN(kDebugScript, "SaidArray::load() count = %d\n", count); - for (uint32 i = 0; i < count; i++) { - SaidArrayItem *item = new SaidArrayItem(); - item->itemName = _inter->loadGlobalString(fd); - item->digiNameLook = _inter->loadGlobalString(fd); - item->digiNameTake = _inter->loadGlobalString(fd); - item->digiNameGear = _inter->loadGlobalString(fd); - _items.push_back(item); - - debugCN(kDebugScript, "itemName = %s; digiNameLook = %s; digiNameTake = %s; digiNameGear = %s\n", - item->itemName, item->digiNameLook, item->digiNameTake, item->digiNameGear); - - } -} - -ParserArray::~ParserArray() { -} - -void ParserArray::load(Common::File *fd) { - uint32 count = fd->readUint32LE(); - debugCN(kDebugScript, "ParserArray::load() count = %d\n", count); - for (uint32 i = 0; i < count; i++) { - ParserArrayItem *item = new ParserArrayItem(); - item->w0 = _inter->loadGlobalString(fd); - item->w1 = _inter->loadGlobalString(fd); - item->trigger = fd->readUint32LE(); - item->testVariable.type = kGameVar; - item->testVariable.value = fd->readUint32LE(); - item->testValue = fd->readUint32LE(); - item->variable.type = kGameVar; - item->variable.value = fd->readUint32LE(); - item->value = fd->readUint32LE(); - _items.push_back(item); - - debugCN(kDebugScript, "w0 = %s; w1 = %s; trigger = %d; testVariable = %d; testValue = %d; variable = %d; value = %d\n", - item->w0, item->w1, item->trigger, item->testVariable.value, item->testValue, item->variable.value, item->value); - - } -} - -ScriptFunction::ScriptFunction(ScriptInterpreter *inter) : _inter(inter) { -} - -ScriptFunction::~ScriptFunction() { - delete _code; -} - -void ScriptFunction::load(Common::File *fd) { - debugCN(kDebugScript, "ScriptFunction::load()\n"); - uint32 size = fd->readUint32LE(); - debugCN(kDebugScript, "ScriptFunction::load() size = %d\n", size); - _code = fd->readStream(size); -} - -void ScriptFunction::jumpAbsolute(uint32 ofs) { - _code->seek(ofs); -} - -void ScriptFunction::jumpRelative(int32 ofs) { - _code->seek(ofs, SEEK_CUR); -} - -byte ScriptFunction::readByte() { - return _code->readByte(); -} - -uint32 ScriptFunction::readUint32() { - return _code->readUint32LE(); -} - - -ScriptInterpreter::ScriptInterpreter(MadsM4Engine *vm) : _scriptFile(NULL), _vm(vm) { - initScriptKernel(); - _dataCache = new ScriptDataCache(this); - _runningFunction = NULL; -} - -ScriptInterpreter::~ScriptInterpreter() { - close(); - delete _dataCache; -} - -void ScriptInterpreter::open(const char *filename) { - if (_scriptFile) - close(); - _scriptFile = new Common::File(); - _scriptFile->open(filename); - if (!_scriptFile->isOpen()) - error("ScriptInterpreter::open() Error opening %s", filename); - - _scriptFile->readUint32LE(); // skip magic for now - uint32 version = _scriptFile->readUint32LE(); - if (version != kScriptFileVersion) { - error("ScriptInterpreter::open() DAT file version mismatch; requested %li, got %i", kScriptFileVersion, version); - } - - int functionCount = _scriptFile->readUint32LE(); - debugCN(kDebugScript, "functionCount = %d\n", functionCount); - for (int i = 0; i < functionCount; i++) { - uint32 offset = _scriptFile->readUint32LE(); - debugCN(kDebugScript, "func(%d) offset = %08X\n", i, offset); - uint32 len = _scriptFile->readUint32LE(); - if (len > 0) { - char *funcName = new char[len + 1]; - _scriptFile->read(funcName, len); - funcName[len] = '\0'; - debugCN(kDebugScript, "func(%d) name = %s\n", i, funcName); - _functionNames[Common::String(funcName)] = _functions.size(); - // DEBUG - _scriptFunctionNames.push_back(Common::String(funcName)); - delete[] funcName; - } - _functions.push_back(new ScriptFunctionEntry(offset)); - } - - int dataCount = _scriptFile->readUint32LE(); - debugCN(kDebugScript, "dataCount = %d\n", dataCount); - for (int i = 0; i < dataCount; i++) { - uint32 offset = _scriptFile->readUint32LE(); - ScriptDataType type = (ScriptDataType)_scriptFile->readUint32LE(); - debugCN(kDebugScript, "data(%d) offset = %08X; type = %d\n", i, offset, type); - _data.push_back(new ScriptDataEntry(offset, type)); - } - - _globalVarCount = _scriptFile->readUint32LE(); - debugCN(kDebugScript, "_globalVarCount = %d\n", _globalVarCount); - - uint32 stringOfs = _scriptFile->readUint32LE(); - _scriptFile->seek(stringOfs); - _constStrings.load(_scriptFile); - - for (int i = 0; i < ARRAYSIZE(_globalVars); i++) { - _globalVars[i].type = kInteger; - _globalVars[i].value = 0; - } - - memset(_logicGlobals, 0, sizeof(_logicGlobals)); - - memset(_registers, 0, sizeof(_registers)); - memset(_stack, 0, sizeof(_stack)); - _stackPtr = 0; - -} - -void ScriptInterpreter::close() { - delete _scriptFile; -} - -void ScriptInterpreter::initScriptKernel() { - -#include "m4/scripttab.h" - - _kernelFunctions = kernelFunctions; - _kernelFunctionsMax = ARRAYSIZE(kernelFunctions) + 1; - - _kernelVars = kernelVars; - _kernelVarsMax = ARRAYSIZE(kernelVars) + 1; - -} - - -ScriptFunction *ScriptInterpreter::loadFunction(uint32 index) { - //GONE WHILE DEBUGGING assert(index < _functions.size()); - if (index >= _functions.size()) return NULL; - ScriptFunction *scriptFunction; - scriptFunction = _functions[index]->func; - if (!scriptFunction) { - scriptFunction = new ScriptFunction(this); - _scriptFile->seek(_functions[index]->offset); - scriptFunction->load(_scriptFile); - _functions[index]->func = scriptFunction; - } - return scriptFunction; -} - -ScriptFunction *ScriptInterpreter::loadFunction(const Common::String &name) { - FunctionNameMap::iterator iter = _functionNames.find(name); - if (iter == _functionNames.end()) { - debugCN(kDebugScript, "ScriptInterpreter::loadFunction() Function '%s' not found!\n", name.c_str()); - return NULL; - } - uint32 funcIndex = (*iter)._value; - debugCN(kDebugScript, "ScriptInterpreter::loadFunction() index('%s') = %d\n", name.c_str(), funcIndex); - return loadFunction(funcIndex); -} - -void ScriptInterpreter::unloadFunctions() { - for (uint32 i = 0; i < _functions.size(); i++) { - if (_functions[i]->func) { - delete _functions[i]->func; - _functions[i]->func = NULL; - } - } -} - -int ScriptInterpreter::runFunction(ScriptFunction *scriptFunction) { - bool done = false; - - int oldLocalStackPtr = _localStackPtr; - ScriptFunction *oldRunningFunction = _runningFunction; - - // TODO: Also initialize _localStackPtr - - _runningFunction = scriptFunction; - _runningFunction->jumpAbsolute(0); - while (!done) { - byte opcode = _runningFunction->readByte(); - done = !execOpcode(opcode); - } - - _localStackPtr = oldLocalStackPtr; - _runningFunction = oldRunningFunction; - - return 0; -} - -void ScriptInterpreter::push(const ScriptValue &value) { - if (_stackPtr == ARRAYSIZE(_stack)) - error("ScriptInterpreter::push() Stack overflow"); - _stack[_stackPtr++] = value; -} - -void ScriptInterpreter::pop(ScriptValue &value) { - if (_stackPtr == 0) - error("ScriptInterpreter::pop() Stack underflow"); - value = _stack[_stackPtr--]; -} - -void ScriptInterpreter::dumpStack() { - debugCN(kDebugScript, "ScriptInterpreter::dumpStack()\n"); - for (int i = 0; i < _stackPtr; i++) { - debugCN(kDebugScript, "%03d. type = %02d; value = %d\n", i, _stack[i].type, _stack[i].value); - } -} - -void ScriptInterpreter::dumpRegisters() { - debugCN(kDebugScript, "ScriptInterpreter::dumpRegisters()\n"); - for (int i = 0; i < ARRAYSIZE(_registers); i++) { - debugCN(kDebugScript, "%03d. type = %02d; value = %d\n", i, _registers[i].type, _registers[i].value); - } -} - -void ScriptInterpreter::dumpGlobalVars() { - debugCN(kDebugScript, "ScriptInterpreter::dumpGlobalVars()\n"); - for (int i = 0; i < ARRAYSIZE(_globalVars); i++) { - if (_globalVars[i].type != -1) - debugCN(kDebugScript, "%03d. type = %02d; value = %d\n", i, _globalVars[i].type, _globalVars[i].value); - } -} - -int ScriptInterpreter::toInteger(const ScriptValue &value) { - - switch (value.type) { - - case kInteger: - return value.value; - - default: - debugCN(kDebugScript, "ScriptInterpreter::toInteger() Invalid type %d!\n", value.type); - return 0; - - } - -} - -const char *ScriptInterpreter::toString(const ScriptValue &value) { - - switch (value.type) { - - case kInteger: - return NULL; - - case kConstString: - return _constStrings[value.value]; - - default: - debugCN(kDebugScript, "ScriptInterpreter::toString() Invalid type %d!\n", value.type); - return NULL; - - } - -} - -const char *ScriptInterpreter::loadGlobalString(Common::File *fd) { - uint32 index = fd->readUint32LE(); - if (index != 0xFFFFFFFF) - return getGlobalString(index); - else - return NULL; -} - -void ScriptInterpreter::test() { -} - -void ScriptInterpreter::loadValue(ScriptValue &value) { - - value.type = (ScriptValueType)_runningFunction->readByte(); - - switch (value.type) { - - case kGameVar: - case kInteger: - case kConstString: - case kDataRef: - case kLogicVar: - case kLogicVarRef: - case kKernelVar: - value.value = _runningFunction->readUint32(); - break; - - case kRegister: - value.value = _runningFunction->readByte(); - break; - - default: - debugCN(kDebugScript, "ScriptInterpreter::loadValue() Invalid value type %d!\n", value.type); - - } - -} - -void ScriptInterpreter::copyValue(ScriptValue &destValue, ScriptValue &sourceValue) { - - if (sourceValue.type == -1) { - debugCN(kDebugScript, "ScriptInterpreter::copyValue() Trying to read uninitialized value!\n"); - } - - switch (destValue.type) { - - case kGameVar: - _globalVars[destValue.value] = sourceValue; - break; - - case kRegister: - _registers[destValue.value] = sourceValue; - break; - - case kLogicVar: - // TODO: Move to own method - if (sourceValue.type == kInteger) { - _logicGlobals[destValue.value] = sourceValue.value; - } else { - debugCN(kDebugScript, "ScriptInterpreter::copyValue() Invalid source value type %d!\n", sourceValue.type); - } - break; - - case kKernelVar: - setKernelVar(destValue.value, sourceValue); - break; - - default: - debugCN(kDebugScript, "ScriptInterpreter::copyValue() Invalid dest value type %d!\n", destValue.type); - - } - -} - -void ScriptInterpreter::derefValue(ScriptValue &value) { - - switch (value.type) { - - case kGameVar: - value = _globalVars[value.value]; - break; - - case kInteger: - case kConstString: - case kDataRef: - case kLogicVarRef: - // These need no dereferencing - break; - - case kRegister: - value = _registers[value.value]; - break; - - case kLogicVar: - // TODO: Move to own method - value = _logicGlobals[value.value]; - break; - - case kKernelVar: - getKernelVar(value.value, value); - break; - - default: - debugCN(kDebugScript, "ScriptInterpreter::derefValue() Invalid value type %d!\n", value.type); - - } - -} - -void ScriptInterpreter::callKernelFunction(uint32 index) { - - debugCN(kDebugScript, "ScriptInterpreter::callKernelFunction() index = %d\n", index); - - if (index > _kernelFunctionsMax) { - debugCN(kDebugScript, "ScriptInterpreter::callKernelFunction() Invalid kernel functionindex (%d)\n", index); - return; - } - - debugCN(kDebugScript, "ScriptInterpreter::callKernelFunction() name = %s\n", _kernelFunctions[index].desc); - - int args = (this->*(_kernelFunctions[index].proc))(); - // Now remove values from the stack if the function used any - if (args > 4) - _stackPtr -= args - 4; - - debugCN(kDebugScript, "-------------\n"); - -} - -ScriptValue ScriptInterpreter::getArg(uint32 index) { - if (index < 4) { - return _registers[index]; - } else { - index -= 4; - return _stack[_stackPtr - index - 1]; - } -} - -void ScriptInterpreter::dumpArgs(uint32 count) { - debugCN(kDebugScript, "ScriptInterpreter::dumpArgs() "); - for (uint32 i = 0; i < count; i++) { - ScriptValue argValue = getArg(i); - if (argValue.type == kConstString) { - debugCN(kDebugScript, "'%s'", toString(argValue)); - } else { - debugCN(kDebugScript, "%d", argValue.value); - } - if (i + 1 < count) - debugCN(kDebugScript, ", "); - } - debugCN(kDebugScript, "\n"); -} - -void ScriptInterpreter::callFunction(uint32 index) { - // NOTE: This is a temporary hack for script functions not yet in the m4.dat - if (index == 0xFFFFFFFF) - return; - debugCN(kDebugScript, "ScriptInterpreter::callFunction() index = %d [%s]\n", index, _scriptFunctionNames[index].c_str()); - ScriptFunction *subFunction = loadFunction(index); - if (!subFunction) { - // This *should* never happen since the linker checks this - debugCN(kDebugScript, "ScriptInterpreter::callFunction() Function %d could not be loaded!\n", index); - return; - } - runFunction(subFunction); -} - -bool ScriptInterpreter::execOpcode(byte opcode) { - - debugCN(kDebugScript, "opcode = %d (%s)\n", opcode, opcodeNames[opcode]); - - ScriptValue value1, value2, value3; - uint32 temp; - - /* TODO: Put all opcodes into separate functions and into an array - (but only after all needed opcodes are known and frozen) - */ - - switch (opcode) { - - case opRet: - return false; - - case opPush: - loadValue(value1); - derefValue(value1); - push(value1); - return true; - - case opPush0: - push(ScriptValue(0)); - return true; - - case opPush1: - push(ScriptValue(1)); - return true; - - case opPushNeg1: - push(ScriptValue(-1)); - return true; - - case opPop: - loadValue(value1); - pop(value2); - copyValue(value1, value2); - return true; - - case opMov: - loadValue(value1); - loadValue(value2); - derefValue(value2); - copyValue(value1, value2); - return true; - - // Possibly join all jump variants into one opcode - - case opJmp: - temp = _runningFunction->readUint32(); - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - return true; - - case opJl: - temp = _runningFunction->readUint32(); - if (_cmpFlags < 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJle: - temp = _runningFunction->readUint32(); - if (_cmpFlags <= 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJg: - temp = _runningFunction->readUint32(); - if (_cmpFlags > 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJge: - temp = _runningFunction->readUint32(); - if (_cmpFlags >= 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJz: - temp = _runningFunction->readUint32(); - if (_cmpFlags == 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJnz: - temp = _runningFunction->readUint32(); - if (_cmpFlags != 0) { - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - } - return true; - - case opJmpByTable: - temp = _runningFunction->readUint32(); - debugCN(kDebugScript, "-> index = %d\n", _registers[0].value); - _runningFunction->jumpRelative(_registers[0].value * 4); - temp = _runningFunction->readUint32(); - debugCN(kDebugScript, "-> ofs = %08X\n", temp); - _runningFunction->jumpAbsolute(temp); - return true; - - case opCmp: - loadValue(value1); - loadValue(value2); - derefValue(value1); - derefValue(value2); - if (value1.type != kInteger || value2.type != kInteger) - warning("ScriptInterpreter::execOpcode() Trying to compare non-integer values (%d, %d, line %d)", value1.type, value2.type, _lineNum); - _cmpFlags = value1.value - value2.value; - debugCN(kDebugScript, "-> cmp %d, %d\n", value1.value, value2.value); - debugCN(kDebugScript, "-> _cmpFlags = %d\n", _cmpFlags); - return true; - - case opCall: - temp = _runningFunction->readUint32(); - callFunction(temp); - return true; - - case opCallKernel: - temp = _runningFunction->readUint32(); - callKernelFunction(temp); - return true; - - case opInc: - loadValue(value1); - value2 = value1; - derefValue(value2); - value2.value++; - copyValue(value1, value2); - return true; - - case opDec: - loadValue(value1); - value2 = value1; - derefValue(value2); - value2.value--; - copyValue(value1, value2); - return true; - - case opAdd: - loadValue(value1); - value3 = value1; - loadValue(value2); - derefValue(value3); - derefValue(value2); - value3.value += value2.value; - copyValue(value1, value3); - return true; - - case opSub: - loadValue(value1); - value3 = value1; - loadValue(value2); - derefValue(value3); - derefValue(value2); - value3.value -= value2.value; - copyValue(value1, value3); - return true; - - case opDebug: - _lineNum = (int)_runningFunction->readUint32(); - return true; - - default: - debugCN(kDebugScript, "Invalid opcode %d!\n", opcode); - return false; - - } - -} - -// Kernel functions - -#define STRING(arg) (toString(getArg(arg))) -#define INTEGER(arg) (toInteger(getArg(arg))) -#define DATA(arg, T) (toData<T>(getArg(arg))) -#define RETURN(value) (_registers[0] = (value)) - -int ScriptInterpreter::o1_handleStreamBreak() { - return 0; -} - -int ScriptInterpreter::o1_handlePlayBreak() { - return 0; -} - -int ScriptInterpreter::o1_dispatchTriggerOnSoundState() { - return 0; -} - -int ScriptInterpreter::o1_getTicks() { - return 0; -} - -int ScriptInterpreter::o1_setSoundVolume() { - return 0; -} - -int ScriptInterpreter::o1_getSoundStatus() { - return 0; -} - -int ScriptInterpreter::o1_getSoundDuration() { - return 0; -} - -int ScriptInterpreter::o1_setSeriesFrameRate() { - return 0; -} - -int ScriptInterpreter::o1_terminateMachine() { - return 0; -} - -int ScriptInterpreter::o1_sendWoodScriptMessage() { - return 0; -} - -int ScriptInterpreter::o1_runConversation() { - return 0; -} - -int ScriptInterpreter::o1_exportConversationValue() { - return 0; -} - -int ScriptInterpreter::o1_exportConversationPointer() { - return 0; -} - -int ScriptInterpreter::o1_playBreakSeries() { - return 0; -} - -int ScriptInterpreter::o1_hideWalker() { - return 0; -} - -int ScriptInterpreter::o1_showWalker() { - return 0; -} - -int ScriptInterpreter::o1_walk() { - return 0; -} - -int ScriptInterpreter::o1_overrideCrunchTime() { - return 0; -} - -int ScriptInterpreter::o1_addBlockingRect() { - return 0; -} - -int ScriptInterpreter::o1_setPlayerCommandsAllowed() { - return 0; -} - -int ScriptInterpreter::o1_getPlayerCommandsAllowed() { - return 0; -} - -int ScriptInterpreter::o1_setPlayerFacingAngle() { - return 0; -} - -int ScriptInterpreter::o1_disablePlayerFadeToBlack() { - return 0; -} - -int ScriptInterpreter::o1_enablePlayer() { - return 0; -} - -int ScriptInterpreter::o1_disablePlayer() { - return 0; -} - -int ScriptInterpreter::o1_freshenSentence() { - return 0; -} - -int ScriptInterpreter::o1_playerGiveItem() { - return 0; -} - -int ScriptInterpreter::o1_moveObject() { - return 0; -} - -int ScriptInterpreter::o1_setStopSoundsBetweenRooms() { - return 0; -} - -int ScriptInterpreter::o1_backupPalette() { - return 0; -} - -int ScriptInterpreter::o1_unloadWilburWalker() { - return 0; -} - -int ScriptInterpreter::o1_wilburTalk() { - return 0; -} - -int ScriptInterpreter::o1_wilburFinishedTalking() { - return 0; -} - -int ScriptInterpreter::o1_preloadSound() { - const char *name = STRING(0); - int room = INTEGER(1); - debugCN(kDebugScript, "name = %s; room = %d\n", name, room); - return 2; -} - -int ScriptInterpreter::o1_unloadSound() { - const char *name = STRING(0); - int room = INTEGER(1); - debugCN(kDebugScript, "name = %s; room = %d\n", name, room); - return 2; -} - -int ScriptInterpreter::o1_playSound() { - const char *name = STRING(0); - int channel = INTEGER(1); - int volume = INTEGER(2); - int trigger = INTEGER(3); - int room = INTEGER(4); - debugCN(kDebugScript, "name = %s; channel = %d; volume = %d; trigger = %d; room = %d\n", - name, channel, volume, trigger, room); - - Common::String soundName = Common::String(name) + ".raw"; - _vm->_sound->playVoice(soundName.c_str(), 100); - - // HACK until fixed - _vm->_kernel->sendTrigger(trigger); - - return 5; -} - -int ScriptInterpreter::o1_playLoopingSound() { - const char *name = STRING(0); - int channel = INTEGER(1); - int volume = INTEGER(2); - int trigger = INTEGER(3); - int room = INTEGER(4); - debugCN(kDebugScript, "name = %s; channel = %d; volume = %d; trigger = %d; room = %d\n", - name, channel, volume, trigger, room); - - // HACK until fixed - _vm->_kernel->sendTrigger(trigger); - - return 5; -} - -int ScriptInterpreter::o1_stopSound() { - int channel = INTEGER(0); - debugCN(kDebugScript, "channel = %d\n", channel); - return 1; -} - -int ScriptInterpreter::o1_fadeSetStart() { - // skip arg 0: palette ptr - int percent = INTEGER(1); - debugCN(kDebugScript, "percent = %d\n", percent); - return 2; -} - -int ScriptInterpreter::o1_fadeInit() { - // skip arg 0: palette ptr - int first = INTEGER(1); - int last = INTEGER(2); - int percent = INTEGER(3); - int ticks = INTEGER(4); - int trigger = INTEGER(5); - debugCN(kDebugScript, "first = %d; last = %d; percent = %d; ticks = %d; trigger = %d\n", - first, last, percent, ticks, trigger); - - // HACK until palette fading is implemented - _vm->_kernel->sendTrigger(trigger); - - return 6; -} - -int ScriptInterpreter::o1_fadeToBlack() { - return 0; -} - -int ScriptInterpreter::o1_initPaletteCycle() { - int first = INTEGER(0); - int last = INTEGER(1); - int delay = INTEGER(2); - int ticks = INTEGER(3); - int trigger = INTEGER(4); - debugCN(kDebugScript, "first = %d; last = %d; delay = %d; ticks = %d; trigger = %d\n", - first, last, delay, ticks, trigger); - - // HACK until palette cycling is implemented - _vm->_kernel->sendTrigger(trigger); - - return 5; -} - -int ScriptInterpreter::o1_stopPaletteCycle() { - return 0; -} - -int ScriptInterpreter::o1_hasPlayerSaid() { - const char *words[3]; - for (int i = 0; i < 3; i++) - words[i] = STRING(i); - debugCN(kDebugScript, "'%s', '%s', '%s'\n", words[0], words[1], words[2]); - - int result = _vm->_player->said(words[0], words[1], words[2]); - - debugCN(kDebugScript, " -> '%d'\n", result); - - RETURN(result); - return 3; -} - -int ScriptInterpreter::o1_hasPlayerSaidAny() { - const char *words[10]; - for (int i = 0; i < 10; i++) - words[i] = STRING(i); - - debugCN(kDebugScript, "'%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'\n", - words[0], words[1], words[2], words[3], words[4], words[5], words[6], words[7], words[8], words[9]); - - int result = _vm->_player->saidAny(words[0], words[1], words[2], words[3], words[4], words[5], words[6], words[7], words[8], words[9]); - debugCN(kDebugScript, " -> '%d'\n", result); - - RETURN(result); - return 10; -} - -int ScriptInterpreter::o1_updatePlayerInfo() { - // skip arg 0: player info struct - return 1; -} - -int ScriptInterpreter::o1_playerHotspotWalkOverride() { - int x1 = INTEGER(0); - int y1 = INTEGER(1); - int x2 = INTEGER(2); - int y2 = INTEGER(3); - debugCN(kDebugScript, "(%d, %d); (%d, %d)\n", x1, y1, x2, y2); - return 4; -} - -int ScriptInterpreter::o1_playerHasItem() { - const char *name = STRING(0); - debugCN(kDebugScript, "item = '%s'\n", name); - // TODO - RETURN(0); - return 1; -} - -int ScriptInterpreter::o1_setWalkerLocation() { - // skip arg 0: walker - int x = INTEGER(1); - int y = INTEGER(2); - debugCN(kDebugScript, "x = %d; y = %d\n", x, y); - return 3; -} - -int ScriptInterpreter::o1_setWalkerFacing() { - // skip arg 0: walker - int facing = INTEGER(1); - debugCN(kDebugScript, "facing = %d\n", facing); - return 2; -} - -int ScriptInterpreter::o1_setHotspot() { - // skip arg 0: hotspot list - const char *name = STRING(1); - int value = INTEGER(2); - debugCN(kDebugScript, "name = '%s' -> %d\n", name, value); - - _vm->_scene->getSceneResources().hotspots->setActive(name, (value != 0)); - - return 2; -} - -int ScriptInterpreter::o1_loadConversation() { - const char *name = STRING(0); - //int trigger = INTEGER(1); - //int flag = INTEGER(2); - - // TODO; just to show something - _m4Vm->_converse->startConversation(name); - - return 3; -} - -int ScriptInterpreter::o1_playSeries() { - const char *name = STRING(0); - int layer = INTEGER(1); - int flags = INTEGER(2); - int trigger = INTEGER(3); - int frameRate = INTEGER(4); - int loopCount = INTEGER(5); - int scale = INTEGER(6); - int x = INTEGER(7); - int y = INTEGER(8); - int firstFrame = INTEGER(9); - int lastFrame = INTEGER(10); - - debugCN(kDebugScript, "name = %s; layer = %04X; flags = %08X; trigger = %d; frameRate = %d; loopCount = %d; scale = %d; x = %d; y = %d: firstFrame = %d; lastFrame = %d\n", - name, layer, flags, trigger, frameRate, loopCount, scale, x, y, firstFrame, lastFrame); - - // TODO: Return the machine to the script - _vm->_ws->playSeries(name, layer, flags, trigger, frameRate, loopCount, scale, x, y, firstFrame, lastFrame); - - return 11; -} - -int ScriptInterpreter::o1_showSeries() { - const char *name = STRING(0); - int layer = INTEGER(1); - int flags = INTEGER(2); - int trigger = INTEGER(3); - int duration = INTEGER(4); - int frameIndex = INTEGER(5); - int scale = INTEGER(6); - int x = INTEGER(7); - int y = INTEGER(8); - - debugCN(kDebugScript, "name = %s; layer = %04X; flags = %08X; trigger = %d; duration = %d; frameIndex = %d; scale = %d; x = %d; y = %d\n", - name, layer, flags, trigger, duration, frameIndex, scale, x, y); - - // TODO: Return the machine to the script - _vm->_ws->showSeries(name, layer, flags, trigger, duration, frameIndex, scale, x, y); - - return 9; -} - -int ScriptInterpreter::o1_loadSeries() { - const char *name = STRING(0); - int hash = INTEGER(1); - // skip arg 3: palette ptr - - debugCN(kDebugScript, "name = %s; hash = %d\n", name, hash); - - int result = _vm->_ws->loadSeries(name, hash, NULL); - - RETURN(result); - return 3; -} - -int ScriptInterpreter::o1_unloadSeries() { - return 0; -} - -int ScriptInterpreter::o1_preloadBreakSeries() { - //const SeriesStreamBreakList& seriesStreamBreakList = DATA(0, SeriesStreamBreakList); - return 1; -} - -int ScriptInterpreter::o1_unloadBreakSeries() { - //const SeriesStreamBreakList& seriesStreamBreakList = DATA(0, SeriesStreamBreakList); - return 1; -} - -int ScriptInterpreter::o1_startBreakSeries() { - //const SeriesStreamBreakList& seriesStreamBreakList = DATA(0, SeriesStreamBreakList); - return 1; -} - -int ScriptInterpreter::o1_globalTriggerProc() { - int value1 = INTEGER(0); - int value2 = INTEGER(1); - int value3 = INTEGER(2); - debugCN(kDebugScript, "%d; %d; %d\n", value1, value2, value3); - return 3; -} - -int ScriptInterpreter::o1_triggerTimerProc() { - int value1 = INTEGER(0); - int value2 = INTEGER(1); - int value3 = INTEGER(2); - debugCN(kDebugScript, "%d; %d; %d\n", value1, value2, value3); - return 3; -} - -int ScriptInterpreter::o1_dispatchTrigger() { - int trigger = INTEGER(0); - debugCN(kDebugScript, "trigger = %d\n", trigger); - - _vm->_kernel->sendTrigger(trigger); - //g_system->delayMillis(5000); - - return 1; -} - -int ScriptInterpreter::o1_getRangedRandomValue() { - int minValue = INTEGER(0); - int maxValue = INTEGER(1); - RETURN(_vm->imath_ranged_rand(minValue, maxValue)); - return 2; -} - -int ScriptInterpreter::o1_wilburSaid() { - const SaidArray& saidArray = DATA(0, SaidArray); - - int result = 0; - - // NOTE: The "Common::String soundName" stuff is just temporary until playVoice is fixed. - - for (int i = 0; i < saidArray.size(); i++) { - SaidArrayItem *item = saidArray[i]; - - if (_vm->_player->said("LOOK AT", item->itemName) && item->digiNameLook) { - debugCN(kDebugScript, " -> LOOK AT: '%s'\n", item->digiNameLook); - Common::String soundName = Common::String(item->digiNameLook) + ".raw"; - _vm->_sound->playVoice(soundName.c_str(), 100); - result = 1; - break; - } - - if (_vm->_player->said("TAKE", item->itemName) && item->digiNameTake) { - debugCN(kDebugScript, " -> TAKE: '%s'\n", item->digiNameTake); - Common::String soundName = Common::String(item->digiNameTake) + ".raw"; - _vm->_sound->playVoice(soundName.c_str(), 100); - result = 1; - break; - } - - if (_vm->_player->said("GEAR", item->itemName) && item->digiNameGear) { - debugCN(kDebugScript, " -> GEAR: '%s'\n", item->digiNameGear); - Common::String soundName = Common::String(item->digiNameGear) + ".raw"; - _vm->_sound->playVoice(soundName.c_str(), 100); - result = 1; - break; - } - - /* - debugCN(kDebugScript, "##### itemName = '%s'; digiNameLook = %s; digiNameTake = %s; digiNameGear = %s\n", - item->itemName, item->digiNameLook, item->digiNameTake, item->digiNameGear); - */ - } - debugCN(kDebugScript, " -> '%d'\n", result); - - RETURN(result); - return 1; -} - -int ScriptInterpreter::o1_wilburParse() { - //const ParserArray& parserArray = DATA(0, ParserArray); - RETURN(0); - return 1; -} - -int ScriptInterpreter::o1_wilburSpeech() { - const char *name = STRING(0); - int trigger = INTEGER(1); - int room = INTEGER(2); - int flag = INTEGER(3); - int volume = INTEGER(4); - int slot = INTEGER(5); - - debugCN(kDebugScript, "%s; %d; %d; %d; %d; %d\n", name, trigger, room, flag, volume, slot); - //g_system->delayMillis(5000); - - KernelTriggerType oldTriggerMode = _vm->_kernel->triggerMode; - - // TODO - Common::String soundName = Common::String(name) + ".raw"; - _vm->_sound->playVoice(soundName.c_str(), 100); - - _vm->_kernel->triggerMode = oldTriggerMode; - - return 6; -} - -// Kernel vars - -void ScriptInterpreter::getKernelVar(int index, ScriptValue &value) { - - debugCN(kDebugScript, "ScriptInterpreter::getKernelVar() index = %d\n", index); - - if (index > _kernelVarsMax) { - debugCN(kDebugScript, "ScriptInterpreter::getKernelVar() Invalid kernel var index %d!\n", index); - return; - } - - debugCN(kDebugScript, "ScriptInterpreter::getKernelVar() name = %s\n", _kernelVars[index].desc); - - ScriptKernelVariable var = _kernelVars[index].var; - - switch (var) { - - case kKernelTrigger: - value = _vm->_kernel->trigger; - break; - - case kKernelTriggerMode: - value = (int)_vm->_kernel->triggerMode; - break; - - case kKernelContinueHandlingTrigger: - value = (int)_vm->_kernel->daemonTriggerAvailable; - break; - - case kGameVersion: - // TODO - value = 0; - break; - - case kGameLanguage: - // TODO - value = 0; - break; - - case kGameNewRoom: - // TODO - value = 0; - break; - - case kPlayerCommandReady: - value = (int)_vm->_player->commandReady; - break; - - default: - debugCN(kDebugScript, "ScriptInterpreter::getKernelVar() Invalid kernel var %d!\n", var); - //g_system->delayMillis(2000); - - } - -} - -void ScriptInterpreter::setKernelVar(int index, const ScriptValue &value) { - - debugCN(kDebugScript, "ScriptInterpreter::setKernelVar() index = %d\n", index); - - if (index > _kernelVarsMax) { - debugCN(kDebugScript, "ScriptInterpreter::setKernelVar() Invalid kernel var index %d!\n", index); - return; - } - - debugCN(kDebugScript, "ScriptInterpreter::setKernelVar() name = %s\n", _kernelVars[index].desc); - - ScriptKernelVariable var = _kernelVars[index].var; - - switch (var) { - - case kKernelTrigger: - _vm->_kernel->trigger = toInteger(value); - debugCN(kDebugScript, "kKernelTrigger -> %d\n", toInteger(value)); - break; - - case kKernelTriggerMode: - _vm->_kernel->triggerMode = (KernelTriggerType)toInteger(value); - debugCN(kDebugScript, "kKernelTrigger -> %d\n", toInteger(value)); - break; - - case kKernelContinueHandlingTrigger: - _vm->_kernel->daemonTriggerAvailable = (toInteger(value) != 0); - debugCN(kDebugScript, "kKernelContinueHandlingTrigger -> %d\n", toInteger(value)); - break; - - case kGameNewRoom: - _vm->_kernel->newRoom = toInteger(value); - debugCN(kDebugScript, "kGameNewRoom -> %d\n", toInteger(value)); - break; - - case kPlayerCommandReady: - // TODO - debugCN(kDebugScript, "kPlayerCommandReady -> %d\n", toInteger(value)); - break; - - default: - debugCN(kDebugScript, "ScriptInterpreter::setKernelVar() Invalid kernel var %d!\n", var); - //g_system->delayMillis(2000); - - } - -} - -} // End of namespace M4 |