[Scummvm-cvs-logs] SF.net SVN: scummvm:[33891] scummvm/trunk/engines/parallaction

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Fri Aug 15 05:59:46 CEST 2008


Revision: 33891
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33891&view=rev
Author:   peres001
Date:     2008-08-15 03:59:45 +0000 (Fri, 15 Aug 2008)

Log Message:
-----------
Made scripts access Animation fields via accessors and mutators, instead of using raw pointers.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/objects.cpp
    scummvm/trunk/engines/parallaction/objects.h
    scummvm/trunk/engines/parallaction/parser_br.cpp
    scummvm/trunk/engines/parallaction/parser_ns.cpp

Modified: scummvm/trunk/engines/parallaction/objects.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/objects.cpp	2008-08-15 03:36:01 UTC (rev 33890)
+++ scummvm/trunk/engines/parallaction/objects.cpp	2008-08-15 03:59:45 UTC (rev 33891)
@@ -289,7 +289,7 @@
 	}
 
 	if (_flags & kParaField) {
-		return *_pvalue;
+		return _field->getValue();
 	}
 
 	if (_flags & kParaRandom) {
@@ -311,7 +311,7 @@
 	}
 
 	if (_flags & kParaField) {
-		*_pvalue = value;
+		_field->setValue(value);
 	}
 
 }
@@ -321,11 +321,16 @@
 	_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 @@
 	_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*));
 }

Modified: scummvm/trunk/engines/parallaction/objects.h
===================================================================
--- scummvm/trunk/engines/parallaction/objects.h	2008-08-15 03:36:01 UTC (rev 33890)
+++ scummvm/trunk/engines/parallaction/objects.h	2008-08-15 03:59:45 UTC (rev 33891)
@@ -357,20 +357,61 @@
 };
 
 
+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 @@
 	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 {

Modified: scummvm/trunk/engines/parallaction/parser_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parser_br.cpp	2008-08-15 03:36:01 UTC (rev 33890)
+++ scummvm/trunk/engines/parallaction/parser_br.cpp	2008-08-15 03:59:45 UTC (rev 33891)
@@ -991,16 +991,16 @@
 		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());

Modified: scummvm/trunk/engines/parallaction/parser_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parser_ns.cpp	2008-08-15 03:36:01 UTC (rev 33890)
+++ scummvm/trunk/engines/parallaction/parser_ns.cpp	2008-08-15 03:59:45 UTC (rev 33891)
@@ -551,16 +551,16 @@
 	}
 
 	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 @@
 	}
 
 	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);
 	}
 
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list