diff options
Diffstat (limited to 'engines/parallaction/objects.cpp')
-rw-r--r-- | engines/parallaction/objects.cpp | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index d4eba330bb..add2f87b5e 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -81,15 +81,41 @@ byte* Animation::getFrameData(uint32 index) const { } +#define NUM_LOCALS 10 +char _localNames[NUM_LOCALS][10]; + Program::Program() { _loopCounter = 0; - _locals = new LocalVariable[10]; + _locals = new LocalVariable[NUM_LOCALS]; + _numLocals = 0; } Program::~Program() { delete[] _locals; } +int16 Program::findLocal(const char* name) { + for (uint16 _si = 0; _si < NUM_LOCALS; _si++) { + if (!scumm_stricmp(name, _localNames[_si])) + return _si; + } + + return -1; +} + +int16 Program::addLocal(const char *name, int16 value, int16 min, int16 max) { + assert(_numLocals < NUM_LOCALS); + + strcpy(_localNames[_numLocals], name); + _locals[_numLocals]._value = value; + + _locals[_numLocals]._min = min; + _locals[_numLocals]._max = max; + + return _numLocals++; +} + + Zone::Zone() { _left = _top = _right = _bottom = 0; @@ -208,8 +234,81 @@ Question::~Question() { free(_text); } +Instruction::Instruction() { + memset(this, 0, sizeof(Instruction)); +} + +Instruction::~Instruction() { + if (_text) + free(_text); + if (_text2) + free(_text2); +} + +int16 ScriptVar::getRValue() { + + if (_flags & kParaImmediate) { + return _value; + } + + if (_flags & kParaLocal) { + return _local->_value; + } + + if (_flags & kParaField) { + return *_pvalue; + } + + if (_flags & kParaRandom) { + return (rand() * _value) / 32767; + } + + error("Parameter is not an r-value"); + + return 0; +} + +int16* ScriptVar::getLValue() { + if (_flags & kParaLocal) { + return &_local->_value; + } + + if (_flags & kParaField) { + return _pvalue; + } + + error("Parameter is not an l-value"); + +} +void ScriptVar::setLocal(LocalVariable *local) { + _local = local; + _flags |= kParaLocal; +} + +void ScriptVar::setField(int16 *field) { + _pvalue = field; + _flags |= kParaField; +} + +void ScriptVar::setImmediate(int16 value) { + _value = value; + _flags |= kParaImmediate; +} + +void ScriptVar::setRandom(int16 seed) { + _value = seed; + _flags |= kParaRandom; +} + + +ScriptVar::ScriptVar() { + _flags = 0; + _local = 0; + _value = 0; + _pvalue = 0; +} } // namespace Parallaction |