diff options
author | Nicola Mettifogo | 2008-08-15 03:59:45 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2008-08-15 03:59:45 +0000 |
commit | c70d09bc26c28b565de022491dfa164bc1d720e6 (patch) | |
tree | 8290d7b8cedceafdb848ea3c14ba341842db3874 /engines/parallaction | |
parent | 2679f6ce7ae1d3810187f8472d9cf8fe2368d83c (diff) | |
download | scummvm-rg350-c70d09bc26c28b565de022491dfa164bc1d720e6.tar.gz scummvm-rg350-c70d09bc26c28b565de022491dfa164bc1d720e6.tar.bz2 scummvm-rg350-c70d09bc26c28b565de022491dfa164bc1d720e6.zip |
Made scripts access Animation fields via accessors and mutators, instead of using raw pointers.
svn-id: r33891
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/objects.cpp | 20 | ||||
-rw-r--r-- | engines/parallaction/objects.h | 58 | ||||
-rw-r--r-- | engines/parallaction/parser_br.cpp | 8 | ||||
-rw-r--r-- | engines/parallaction/parser_ns.cpp | 16 |
4 files changed, 83 insertions, 19 deletions
diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index b91644d02d..6aeae3a92f 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -289,7 +289,7 @@ int16 ScriptVar::getValue() { } if (_flags & kParaField) { - return *_pvalue; + return _field->getValue(); } if (_flags & kParaRandom) { @@ -311,7 +311,7 @@ void ScriptVar::setValue(int16 value) { } if (_flags & kParaField) { - *_pvalue = value; + _field->setValue(value); } } @@ -321,11 +321,16 @@ void ScriptVar::setLocal(LocalVariable *local) { _flags |= (kParaLocal | kParaLValue); } -void ScriptVar::setField(int16 *field) { - _pvalue = field; +void ScriptVar::setField(Animation *anim, AnimationField::AccessorFunc accessor, AnimationField::MutatorFunc mutator) { + _field = new AnimationField(anim, accessor, mutator); _flags |= (kParaField | kParaLValue); } +void ScriptVar::setField(Animation *anim, AnimationField::AccessorFunc accessor) { + _field = new AnimationField(anim, accessor); + _flags |= kParaField; +} + void ScriptVar::setImmediate(int16 value) { _value = value; _flags |= kParaImmediate; @@ -341,9 +346,14 @@ ScriptVar::ScriptVar() { _flags = 0; _local = 0; _value = 0; - _pvalue = 0; + _field = 0; } +ScriptVar::~ScriptVar() { + delete _field; +} + + Table::Table(uint32 size) : _size(size), _used(0), _disposeMemory(true) { _data = (char**)calloc(size, sizeof(char*)); } diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index ee681a5dc4..1a724dcd77 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -357,20 +357,61 @@ enum ParaFlags { }; +struct AnimationField { + typedef Common::Functor0Mem<int16, Animation> Accessor; + typedef Common::Functor1Mem<int16, void, Animation> Mutator; + + typedef Accessor::FuncType AccessorFunc; + typedef Mutator::FuncType MutatorFunc; + +protected: + Accessor *_accessor; + Mutator *_mutator; + +public: + AnimationField(Animation* instance, AccessorFunc accessor, MutatorFunc mutator) { + _accessor = new Accessor(instance, accessor); + _mutator = new Mutator(instance, mutator); + } + + AnimationField(Animation* instance, AccessorFunc accessor) { + _accessor = new Accessor(instance, accessor); + _mutator = 0; + } + + ~AnimationField() { + delete _accessor; + delete _mutator; + } + + int16 getValue() const { + assert(_accessor); + return _accessor->operator()(); + } + + void setValue(int16 value) { + assert(_mutator); + _mutator->operator()(value); + } +}; + + struct ScriptVar { uint32 _flags; int16 _value; - int16* _pvalue; LocalVariable* _local; + AnimationField* _field; ScriptVar(); + ~ScriptVar(); int16 getValue(); void setValue(int16 value); void setLocal(LocalVariable *local); - void setField(int16 *field); + void setField(Animation *anim, AnimationField::AccessorFunc accessor, AnimationField::MutatorFunc mutator); + void setField(Animation *anim, AnimationField::AccessorFunc accessor); void setImmediate(int16 value); void setRandom(int16 seed); }; @@ -453,6 +494,19 @@ struct Animation : public Zone { byte* getFrameData(uint32 index) const; void validateScriptVars(); + + // getters/setters used by scripts + int16 getX() { return _left; } + void setX(int16 value) { _left = value; } + + int16 getY() { return _top; } + void setY(int16 value) { _top = value; } + + int16 getZ() { return _z; } + void setZ(int16 value) { _z = value; } + + int16 getF() { return _frame; } + void setF(int16 value) { _frame = value; } }; class Table { diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index b68401a88b..7b208feb95 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -991,16 +991,16 @@ void ProgramParser_br::parseRValue(ScriptVar &v, const char *str) { a = AnimationPtr(ctxt.a); if (str[0] == 'X') { - v.setField(&a->_left); + v.setField(a.get(), &Animation::getX); } else if (str[0] == 'Y') { - v.setField(&a->_top); + v.setField(a.get(), &Animation::getY); } else if (str[0] == 'Z') { - v.setField(&a->_z); + v.setField(a.get(), &Animation::getZ); } else if (str[0] == 'F') { - v.setField(&a->_frame); + v.setField(a.get(), &Animation::getF); } else if (str[0] == 'N') { v.setImmediate(a->getFrameNum()); diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index 52256c341c..f252f7ffdd 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -551,16 +551,16 @@ void ProgramParser_ns::parseRValue(ScriptVar &v, const char *str) { } if (str[0] == 'X') { - v.setField(&a->_left); + v.setField(a.get(), &Animation::getX); } else if (str[0] == 'Y') { - v.setField(&a->_top); + v.setField(a.get(), &Animation::getY); } else if (str[0] == 'Z') { - v.setField(&a->_z); + v.setField(a.get(), &Animation::getZ); } else if (str[0] == 'F') { - v.setField(&a->_frame); + v.setField(a.get(), &Animation::getF); } } @@ -581,16 +581,16 @@ void ProgramParser_ns::parseLValue(ScriptVar &v, const char *str) { } if (str[0] == 'X') { - v.setField(&a->_left); + v.setField(a.get(), &Animation::getX, &Animation::setX); } else if (str[0] == 'Y') { - v.setField(&a->_top); + v.setField(a.get(), &Animation::getY, &Animation::setY); } else if (str[0] == 'Z') { - v.setField(&a->_z); + v.setField(a.get(), &Animation::getZ, &Animation::setZ); } else if (str[0] == 'F') { - v.setField(&a->_frame); + v.setField(a.get(), &Animation::getF, &Animation::setF); } } |