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

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Sun Sep 2 17:17:42 CEST 2007


Revision: 28824
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28824&view=rev
Author:   peres001
Date:     2007-09-02 08:17:41 -0700 (Sun, 02 Sep 2007)

Log Message:
-----------
Jobs are now members of the engine and are handled with a table, instead of being external functions.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/debug.cpp
    scummvm/trunk/engines/parallaction/exec_ns.cpp
    scummvm/trunk/engines/parallaction/graphics.cpp
    scummvm/trunk/engines/parallaction/inventory.cpp
    scummvm/trunk/engines/parallaction/parallaction.cpp
    scummvm/trunk/engines/parallaction/parallaction.h
    scummvm/trunk/engines/parallaction/parallaction_br.cpp
    scummvm/trunk/engines/parallaction/parallaction_ns.cpp
    scummvm/trunk/engines/parallaction/walk.cpp

Modified: scummvm/trunk/engines/parallaction/debug.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/debug.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/debug.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -135,7 +135,7 @@
 				"|tag| description                                                 |\n"
 				"+---+-------------------------------------------------------------+\n");
 	for ( ; b != e; b++) {
-		DebugPrintf("|%3i| %-60s|\n", (*b)->_tag, _jobDescriptions[(*b)->_tag] );
+		DebugPrintf("|%3i| %-60s|\n", (*b)->_job->_tag, _jobDescriptions[(*b)->_job->_tag] );
 	}
 	DebugPrintf("+---+-------------------------------------------------------------+\n");
 

Modified: scummvm/trunk/engines/parallaction/exec_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/exec_ns.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/exec_ns.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -181,7 +181,7 @@
 	int16 y = inst->_opB.getRValue();
 
 	WalkNodeList *v4 = _char._builder.buildPath(x, y);
-	addJob(&jobWalk, v4, kPriority19 );
+	addJob(kJobWalk, v4, kPriority19 );
 	_engineFlags |= kEngineWalking;
 }
 
@@ -259,7 +259,7 @@
 DECLARE_COMMAND_OPCODE(open) {
 	_cmdRunCtxt.cmd->u._zone->_flags &= ~kFlagsClosed;
 	if (_cmdRunCtxt.cmd->u._zone->u.door->_cnv) {
-		addJob(&jobToggleDoor, (void*)_cmdRunCtxt.cmd->u._zone, kPriority18 );
+		addJob(kJobToggleDoor, (void*)_cmdRunCtxt.cmd->u._zone, kPriority18 );
 	}
 }
 
@@ -267,7 +267,7 @@
 DECLARE_COMMAND_OPCODE(close) {
 	_cmdRunCtxt.cmd->u._zone->_flags |= kFlagsClosed;
 	if (_cmdRunCtxt.cmd->u._zone->u.door->_cnv) {
-		addJob(&jobToggleDoor, (void*)_cmdRunCtxt.cmd->u._zone, kPriority18 );
+		addJob(kJobToggleDoor, (void*)_cmdRunCtxt.cmd->u._zone, kPriority18 );
 	}
 }
 
@@ -283,7 +283,7 @@
 		_cmdRunCtxt.cmd->u._zone->_flags &= ~kFlagsRemove;
 		_cmdRunCtxt.cmd->u._zone->_flags |= kFlagsActive;
 		if ((_cmdRunCtxt.cmd->u._zone->_type & 0xFFFF) == kZoneGet) {
-			addJob(&jobDisplayDroppedItem, _cmdRunCtxt.cmd->u._zone, kPriority17 );
+			addJob(kJobDisplayDroppedItem, _cmdRunCtxt.cmd->u._zone, kPriority17 );
 		}
 	}
 }
@@ -326,7 +326,7 @@
 
 	WalkNodeList *vC = _char._builder.buildPath(_cmdRunCtxt.cmd->u._move.x, _cmdRunCtxt.cmd->u._move.y);
 
-	addJob(&jobWalk, vC, kPriority19 );
+	addJob(kJobWalk, vC, kPriority19 );
 	_engineFlags |= kEngineWalking;
 }
 
@@ -336,7 +336,7 @@
 }
 
 
-void jobDisplayAnimations(void *parm, Job *j) {
+void Parallaction_ns::jobDisplayAnimations(void *parm, Job *j) {
 
 	Graphics::Surface v14;
 
@@ -380,7 +380,7 @@
 }
 
 
-void jobEraseAnimations(void *arg_0, Job *j) {
+void Parallaction_ns::jobEraseAnimations(void *arg_0, Job *j) {
 	debugC(3, kDebugJobs, "jobEraseAnimations");
 
 	for (AnimationList::iterator it = _vm->_animations.begin(); it != _vm->_animations.end(); it++) {
@@ -404,7 +404,7 @@
 }
 
 
-void jobRunScripts(void *parm, Job *j) {
+void Parallaction_ns::jobRunScripts(void *parm, Job *j) {
 	debugC(3, kDebugJobs, "jobRunScripts");
 
 	static uint16 modCounter = 0;
@@ -594,7 +594,7 @@
 		if (z->_flags & kFlagsLocked) break;
 		z->_flags ^= kFlagsClosed;
 		if (z->u.door->_cnv == NULL) break;
-		addJob(&jobToggleDoor, z, kPriority18 );
+		addJob(kJobToggleDoor, z, kPriority18 );
 		break;
 
 	case kZoneHear:
@@ -615,7 +615,7 @@
 //
 //	ZONE TYPE: DOOR
 //
-void jobToggleDoor(void *parm, Job *j) {
+void Parallaction_ns::jobToggleDoor(void *parm, Job *j) {
 
 	static byte count = 0;
 
@@ -652,12 +652,12 @@
 int16 Parallaction::pickupItem(Zone *z) {
 	int r = addInventoryItem(z->u.get->_icon);
 	if (r == 0)
-		addJob(&jobRemovePickedItem, z, kPriority17 );
+		addJob(kJobRemovePickedItem, z, kPriority17 );
 
 	return r;
 }
 
-void jobRemovePickedItem(void *parm, Job *j) {
+void Parallaction_ns::jobRemovePickedItem(void *parm, Job *j) {
 
 	Zone *z = (Zone*)parm;
 
@@ -678,7 +678,7 @@
 	return;
 }
 
-void jobDisplayDroppedItem(void *parm, Job *j) {
+void Parallaction_ns::jobDisplayDroppedItem(void *parm, Job *j) {
 //	printf("jobDisplayDroppedItem...");
 
 	Zone *z = (Zone*)parm;
@@ -853,4 +853,75 @@
 
 
 
+void Parallaction_ns::jobDisplayLabel(void *parm, Job *j) {
+
+	Label *label = (Label*)parm;
+	debugC(9, kDebugJobs, "jobDisplayLabel (%p)", (const void*) label);
+
+	if (label->_cnv.w == 0)
+		return;
+	_vm->_gfx->flatBlitCnv(&label->_cnv, _vm->_gfx->_labelPosition[0].x, _vm->_gfx->_labelPosition[0].y, Gfx::kBitBack);
+
+	return;
+}
+
+void Parallaction_ns::jobEraseLabel(void *parm, Job *j) {
+	Label *label = (Label*)parm;
+
+	debugC(9, kDebugJobs, "jobEraseLabel (%p)", (const void*) label);
+
+	int16 _si, _di;
+
+	if (_vm->_activeItem._id != 0) {
+		_si = _vm->_mousePos.x + 16 - label->_cnv.w/2;
+		_di = _vm->_mousePos.y + 34;
+	} else {
+		_si = _vm->_mousePos.x + 8 - label->_cnv.w/2;
+		_di = _vm->_mousePos.y + 21;
+	}
+
+	if (_si < 0) _si = 0;
+	if (_di > 190) _di = 190;
+
+	if (label->_cnv.w + _si > _vm->_screenWidth)
+		_si = _vm->_screenWidth - label->_cnv.w;
+
+	Common::Rect r(label->_cnv.w, label->_cnv.h);
+	r.moveTo(_vm->_gfx->_labelPosition[1]);
+	_vm->_gfx->restoreBackground(r);
+
+	_vm->_gfx->_labelPosition[1] = _vm->_gfx->_labelPosition[0];
+	_vm->_gfx->_labelPosition[0].x = _si;
+	_vm->_gfx->_labelPosition[0].y = _di;
+
+	return;
+}
+
+
+
+// this Job uses a static counter to delay removal
+// and is in fact only used to remove jEraseLabel jobs
+//
+void Parallaction_ns::jobWaitRemoveJob(void *parm, Job *j) {
+	Job *arg = (Job*)parm;
+
+	static uint16 count = 0;
+
+	debugC(3, kDebugJobs, "jobWaitRemoveJob: count = %i", count);
+
+	_engineFlags |= kEngineBlockInput;
+
+	count++;
+	if (count == 2) {
+		count = 0;
+		_vm->removeJob(arg);
+		_engineFlags &= ~kEngineBlockInput;
+		j->_finished = 1;
+	}
+
+	return;
+}
+
+
+
 }	// namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/graphics.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/graphics.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/graphics.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -410,56 +410,13 @@
 }
 
 
-void jobDisplayLabel(void *parm, Job *j) {
 
-	Label *label = (Label*)parm;
-	debugC(9, kDebugJobs, "jobDisplayLabel (%p)", (const void*) label);
 
-	if (label->_cnv.w == 0)
-		return;
-	_vm->_gfx->flatBlitCnv(&label->_cnv, _vm->_gfx->_labelPosition[0].x, _vm->_gfx->_labelPosition[0].y, Gfx::kBitBack);
 
-	return;
-}
 
-void jobEraseLabel(void *parm, Job *j) {
-	Label *label = (Label*)parm;
 
-	debugC(9, kDebugJobs, "jobEraseLabel (%p)", (const void*) label);
 
-	int16 _si, _di;
 
-	if (_vm->_activeItem._id != 0) {
-		_si = _vm->_mousePos.x + 16 - label->_cnv.w/2;
-		_di = _vm->_mousePos.y + 34;
-	} else {
-		_si = _vm->_mousePos.x + 8 - label->_cnv.w/2;
-		_di = _vm->_mousePos.y + 21;
-	}
-
-	if (_si < 0) _si = 0;
-	if (_di > 190) _di = 190;
-
-	if (label->_cnv.w + _si > _vm->_screenWidth)
-		_si = _vm->_screenWidth - label->_cnv.w;
-
-	Common::Rect r(label->_cnv.w, label->_cnv.h);
-	r.moveTo(_vm->_gfx->_labelPosition[1]);
-	_vm->_gfx->restoreBackground(r);
-
-	_vm->_gfx->_labelPosition[1] = _vm->_gfx->_labelPosition[0];
-	_vm->_gfx->_labelPosition[0].x = _si;
-	_vm->_gfx->_labelPosition[0].y = _di;
-
-	return;
-}
-
-
-
-
-
-
-
 //
 //	Cnv management
 //

Modified: scummvm/trunk/engines/parallaction/inventory.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/inventory.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/inventory.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -233,7 +233,7 @@
 
 
 
-void jobShowInventory(void *parm, Job *j) {
+void Parallaction_ns::jobShowInventory(void *parm, Job *j) {
 //	printf("job_showInventory()...");
 
 	int16 slot = getNumUsedSlots();
@@ -255,7 +255,7 @@
 
 
 
-void jobHideInventory(void *parm, Job *j) {
+void Parallaction_ns::jobHideInventory(void *parm, Job *j) {
 //	printf("job_hideInventory()\n");
 
 	static uint16 count = 0;

Modified: scummvm/trunk/engines/parallaction/parallaction.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/parallaction.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -283,9 +283,9 @@
 
 void Parallaction::runGame() {
 
-	addJob(&jobEraseAnimations, (void*)1, kPriority20);
-	_jRunScripts = addJob(&jobRunScripts, 0, kPriority15);
-	addJob(&jobDisplayAnimations, 0, kPriority3);
+	addJob(kJobEraseAnimations, (void*)1, kPriority20);
+	_jRunScripts = addJob(kJobRunScripts, 0, kPriority15);
+	addJob(kJobDisplayAnimations, 0, kPriority3);
 
 	_gfx->copyScreen(Gfx::kBitBack, Gfx::kBit2);
 
@@ -364,14 +364,14 @@
 		_gfx->_labelPosition[1].y = -1000;
 		_gfx->_labelPosition[0].x = -1000;
 		_gfx->_labelPosition[0].y = -1000;
-		_jDrawLabel = addJob(&jobDisplayLabel, (void*)data->_label, kPriority0);
-		_jEraseLabel = addJob(&jobEraseLabel, (void*)data->_label, kPriority20);
+		_jDrawLabel = addJob(kJobDisplayLabel, (void*)data->_label, kPriority0);
+		_jEraseLabel = addJob(kJobEraseLabel, (void*)data->_label, kPriority20);
 		break;
 
 	case kEvExitZone:
 		debugC(2, kDebugInput, "processInput: kEvExitZone");
 		removeJob(_jDrawLabel);
-		addJob(&jobWaitRemoveJob, _jEraseLabel, kPriority15);
+		addJob(kJobWaitRemoveJob, _jEraseLabel, kPriority15);
 		_jDrawLabel = NULL;
 		break;
 
@@ -393,12 +393,12 @@
 		if (_jDrawLabel != 0) {
 			removeJob(_jDrawLabel);
 			_jDrawLabel = NULL;
-			addJob(&jobWaitRemoveJob, _jEraseLabel, kPriority2);
+			addJob(kJobWaitRemoveJob, _jEraseLabel, kPriority2);
 		}
 		if (hitZone(kZoneYou, _mousePos.x, _mousePos.y) == 0)
 		changeCursor(kCursorArrow);
 		removeJob(_jRunScripts);
-		_jDrawInventory = addJob(&jobShowInventory, 0, kPriority2);
+		_jDrawInventory = addJob(kJobShowInventory, 0, kPriority2);
 		openInventory();
 		break;
 
@@ -408,8 +408,8 @@
 			// activates item
 			changeCursor(data->_inventoryIndex);
 		}
-		_jRunScripts = addJob(&jobRunScripts, 0, kPriority15);
-		addJob(&jobHideInventory, 0, kPriority20);
+		_jRunScripts = addJob(kJobRunScripts, 0, kPriority15);
+		addJob(kJobHideInventory, 0, kPriority20);
 		removeJob(_jDrawInventory);
 		break;
 
@@ -426,7 +426,7 @@
 		if (_char._ani._flags & kFlagsRemove) break;
 		if ((_char._ani._flags & kFlagsActive) == 0) break;
 		WalkNodeList *v4 = _char._builder.buildPath(data->_mousePos.x, data->_mousePos.y);
-		addJob(&jobWalk, v4, kPriority19);
+		addJob(kJobWalk, v4, kPriority19);
 		_engineFlags |= kEngineWalking; 								   // inhibits processing of input until walking is over
 		}
 		break;
@@ -621,7 +621,7 @@
 
 		if (_jDrawLabel != NULL) {
 			removeJob(_jDrawLabel);
-			addJob(&jobWaitRemoveJob, _jEraseLabel, kPriority15 );
+			addJob(kJobWaitRemoveJob, _jEraseLabel, kPriority15 );
 			_jDrawLabel = NULL;
 		}
 
@@ -672,22 +672,23 @@
 	(higher priorities values comes first in the list)
 */
 int compareJobPriority(const JobPointer &j1, const JobPointer &j2) {
-	return (j1->_tag >= j2->_tag ? -1 : 1);
+	return (j1->_job->_tag >= j2->_job->_tag ? -1 : 1);
 }
 
-Job *Parallaction::addJob(JobFn fn, void *parm, uint16 tag) {
+Job *Parallaction::addJob(uint functionId, void *parm, uint16 tag) {
 	debugC(3, kDebugJobs, "addJob(%i)", tag);
 
 	Job *v8 = new Job;
 
 	v8->_parm = parm;
-	v8->_fn = fn;
 	v8->_tag = tag;
 	v8->_finished = 0;
 	v8->_count = 0;
 
-	_jobs.insertSorted(v8, compareJobPriority);
+	JobOpcode *op = createJobOpcode(functionId, v8);
 
+	_jobs.insertSorted(op, compareJobPriority);
+
 	return v8;
 }
 
@@ -718,7 +719,8 @@
 
 	JobList::iterator it = _jobs.begin();
 	while (it != _jobs.end()) {
-		if ((*it)->_finished == 1)
+		Job *job = (*it)->_job;
+		if (job->_finished == 1)
 			it = _jobs.erase(it);
 		else
 			it++;
@@ -726,8 +728,9 @@
 
 	it = _jobs.begin();
 	while (it != _jobs.end()) {
-		debugC(9, kDebugJobs, "runJobs: %i", (*it)->_tag);
-		(*(*it)->_fn)((*it)->_parm, (*it));
+		Job *job = (*it)->_job;
+		debugC(9, kDebugJobs, "runJobs: %i", job->_tag);
+		(*(*it))();
 		it++;
 	}
 
@@ -735,31 +738,7 @@
 	return;
 }
 
-// this Job uses a static counter to delay removal
-// and is in fact only used to remove jEraseLabel jobs
-//
-void jobWaitRemoveJob(void *parm, Job *j) {
-	Job *arg = (Job*)parm;
 
-	static uint16 count = 0;
-
-	debugC(3, kDebugJobs, "jobWaitRemoveJob: count = %i", count);
-
-	_engineFlags |= kEngineBlockInput;
-
-	count++;
-	if (count == 2) {
-		count = 0;
-		_vm->removeJob(arg);
-		_engineFlags &= ~kEngineBlockInput;
-		j->_finished = 1;
-	}
-
-	return;
-}
-
-
-
 Table::Table(uint32 size) : _size(size), _used(0), _disposeMemory(true) {
 	_data = (char**)malloc(sizeof(char*)*size);
 }

Modified: scummvm/trunk/engines/parallaction/parallaction.h
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.h	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/parallaction.h	2007-09-02 15:17:41 UTC (rev 28824)
@@ -140,22 +140,18 @@
 
 
 struct Job;
-typedef void (*JobFn)(void*, Job*);
 
 struct Job {
 	uint16		_count; 		// # of executions left
 	uint16		_tag;			// used for ordering
 	uint16		_finished;
 	void *		_parm;
-	JobFn		_fn;
 
 public:
-	Job() : _count(0), _tag(0), _finished(0), _parm(NULL), _fn(NULL) {
+	Job() : _count(0), _tag(0), _finished(0), _parm(NULL) {
 	}
 };
 
-typedef Job* JobPointer;
-typedef ManagedList<JobPointer> JobList;
 
 extern uint16 		_mouseButtons;
 extern uint16 		_score;
@@ -192,21 +188,8 @@
 void waitUntilLeftClick();
 
 
-void jobRemovePickedItem(void*, Job *j);
-void jobDisplayDroppedItem(void*, Job *j);
-void jobToggleDoor(void*, Job *j);
-void jobEraseAnimations(void *arg_0, Job *j);
-void jobWalk(void*, Job *j);
-void jobRunScripts(void*, Job *j);
-void jobDisplayAnimations(void*, Job *j);
-void jobDisplayLabel(void *parm, Job *j);
-void jobWaitRemoveJob(void *parm, Job *j);
-void jobShowInventory(void *parm, Job *j);
-void jobHideInventory(void *parm, Job *j);
-void jobEraseLabel(void *parm, Job *j);
 
 
-
 class Debugger;
 class Gfx;
 class Menu;
@@ -337,11 +320,67 @@
 
 };
 
-
 typedef Common::Array<const Opcode*>	OpcodeSet;
 
+class JobOpcode {
 
+public:
+	Job *_job;
 
+	JobOpcode(Job *job) : _job(job) { }
+
+	virtual void operator()() const = 0;
+	virtual ~JobOpcode() {
+		delete _job;
+	}
+};
+
+template <class T>
+class OpcodeImpl2 : public JobOpcode {
+
+	typedef void (T::*Fn)(void *, Job*);
+
+	T*	_instance;
+	Fn	_fn;
+
+public:
+	OpcodeImpl2(T* instance, const Fn &fn, Job* job) : JobOpcode(job), _instance(instance), _fn(fn) { }
+
+	void operator()() const {
+		(_instance->*_fn)(_job->_parm, _job);
+	}
+
+};
+
+typedef JobOpcode* JobPointer;
+typedef ManagedList<JobPointer> JobList;
+
+enum Jobs {
+	kJobDisplayAnimations = 0,
+	kJobEraseAnimations = 1,
+	kJobDisplayDroppedItem = 2,
+	kJobRemovePickedItem = 3,
+	kJobRunScripts = 4,
+	kJobWalk = 5,
+	kJobDisplayLabel = 6,
+	kJobEraseLabel = 7,
+	kJobWaitRemoveJob = 8,
+	kJobToggleDoor = 9,
+
+	// NS specific
+	kJobShowInventory = 10,
+	kJobHideInventory,
+
+	// BRA specific
+	kJobClearSubtitle = 10,
+	kJobDrawSubtitle,
+	kJobWaitRemoveSubtitleJob,
+	kJobPauseSfx,
+	kJobStopFollower,
+	kJobScroll
+};
+
+
 #define DECLARE_UNQUALIFIED_ZONE_PARSER(sig) void locZoneParse_##sig()
 #define DECLARE_UNQUALIFIED_ANIM_PARSER(sig) void locAnimParse_##sig()
 #define DECLARE_UNQUALIFIED_COMMAND_PARSER(sig) void cmdParse_##sig()
@@ -400,12 +439,12 @@
 	void 		changeCursor(int32 index);
 	void		showCursor(bool visible);
 
-
-	Job 		*addJob(JobFn fn, void *parm, uint16 tag);
+	Job 		*addJob(uint functionId, void *parm, uint16 tag);
 	void 		removeJob(Job *j);
 	void 		pauseJobs();
 	void 		resumeJobs();
 	void 		runJobs();
+	virtual		JobOpcode* createJobOpcode(uint functionId, Job *job) = 0;
 
 	void 		finalizeWalk(WalkNodeList *list);
 	int16 		selectWalkFrame(const Common::Point& pos, const WalkNode* from);
@@ -563,6 +602,18 @@
 
 	virtual void parseLocation(const char* name) = 0;
 
+	virtual void jobDisplayAnimations(void*, Job *j) = 0;
+	virtual void jobEraseAnimations(void *arg_0, Job *j) = 0;
+	virtual void jobRunScripts(void*, Job *j) = 0;
+	virtual void jobDisplayDroppedItem(void*, Job *j) = 0;
+	virtual void jobRemovePickedItem(void*, Job *j) = 0;
+	virtual void jobToggleDoor(void*, Job *j) = 0;
+	virtual void jobWalk(void*, Job *j) = 0;
+	virtual void jobDisplayLabel(void *parm, Job *j) = 0;
+	virtual void jobEraseLabel(void *parm, Job *j) = 0;
+	virtual void jobWaitRemoveJob(void *parm, Job *j) = 0;
+
+
 public:
 	const char **_zoneFlagNamesRes;
 	const char **_zoneTypeNamesRes;
@@ -589,6 +640,13 @@
 	void renderLabel(Graphics::Surface *cnv, char *text);
 	void setMousePointer(int16 index);
 
+	void	initJobs();
+
+	typedef void (Parallaction_ns::*JobFn)(void*, Job*);
+
+	const JobFn 	*_jobsFn;
+	JobOpcode* 	createJobOpcode(uint functionId, Job *job);
+
 	void loadGame();
 	void saveGame();
 
@@ -653,6 +711,19 @@
 	const Callable *_callables;
 
 protected:
+	void jobDisplayAnimations(void*, Job *j);
+	void jobEraseAnimations(void *arg_0, Job *j);
+	void jobRunScripts(void*, Job *j);
+	void jobDisplayDroppedItem(void*, Job *j);
+	void jobRemovePickedItem(void*, Job *j);
+	void jobToggleDoor(void*, Job *j);
+	void jobWalk(void*, Job *j);
+	void jobDisplayLabel(void *parm, Job *j);
+	void jobEraseLabel(void *parm, Job *j);
+	void jobWaitRemoveJob(void *parm, Job *j);
+	void jobShowInventory(void *parm, Job *j);
+	void jobHideInventory(void *parm, Job *j);
+
 	// location parser
 	OpcodeSet	_locationParsers;
 	OpcodeSet	_locationZoneParsers;
@@ -860,7 +931,13 @@
 	void 		freeFonts();
 	void 		initOpcodes();
 	void 		initParsers();
+	void		initJobs();
 
+	typedef void (*JobFn)(void*, Job*);
+	const JobFn 	*_jobsFn;
+	JobOpcode* 		createJobOpcode(uint functionId, Job *job);
+
+
 	void 		changeLocation(char *location);
 	void		changeCharacter(const char *name);
 

Modified: scummvm/trunk/engines/parallaction/parallaction_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction_br.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/parallaction_br.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -357,5 +357,35 @@
 
 }
 
+void Parallaction_br::initJobs() {
+/*
+	static const JobFn jobs[] = {
+		&Parallaction_br::jobDisplayAnimations,
+		&Parallaction_br::jobEraseAnimations,
+		&Parallaction_br::jobDisplayDroppedItem,
+		&Parallaction_br::jobRemovePickedItem,
+		&Parallaction_br::jobRunScripts,
+		&Parallaction_br::jobWalk,
+		&Parallaction_br::jobDrawLabel,
+		&Parallaction_br::jobEraseLabel,
+		&Parallaction_br::jobWaitRemoveLabelJob,
+		&Parallaction_br::jobToggleDoor,
+		&Parallaction_br::jobClearSubtitle,
+		&Parallaction_br::jobDrawSubtitle,
+		&Parallaction_br::jobWaitRemoveSubtitleJob,
+		&Parallaction_br::jobPauseSfx,
+		&Parallaction_br::jobStopFollower,
+		&Parallaction_br::jobScroll
+	};
 
+	_jobsFn = jobs;
+*/
+
+};
+
+JobOpcode* Parallaction_br::createJobOpcode(uint functionId, Job *job) {
+	//return new OpcodeImpl2<Parallaction_br>(this, _jobsFn[functionId], job);
+}
+
+
 } // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/parallaction_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction_ns.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/parallaction_ns.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -71,6 +71,7 @@
 		_soundMan = new AmigaSoundMan(this);
 	}
 
+	initJobs();
 	initResources();
 	initFonts();
 	initCursors();
@@ -384,4 +385,29 @@
 	return;
 }
 
+void Parallaction_ns::initJobs() {
+
+	static const JobFn jobs[] = {
+		&Parallaction_ns::jobDisplayAnimations,
+		&Parallaction_ns::jobEraseAnimations,
+		&Parallaction_ns::jobDisplayDroppedItem,
+		&Parallaction_ns::jobRemovePickedItem,
+		&Parallaction_ns::jobRunScripts,
+		&Parallaction_ns::jobWalk,
+		&Parallaction_ns::jobDisplayLabel,
+		&Parallaction_ns::jobEraseLabel,
+		&Parallaction_ns::jobWaitRemoveJob,
+		&Parallaction_ns::jobToggleDoor,
+		&Parallaction_ns::jobShowInventory,
+		&Parallaction_ns::jobHideInventory
+	};
+
+	_jobsFn = jobs;
+
+
+};
+
+JobOpcode* Parallaction_ns::createJobOpcode(uint functionId, Job *job) {
+	return new OpcodeImpl2<Parallaction_ns>(this, _jobsFn[functionId], job);
+}
 } // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/walk.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/walk.cpp	2007-09-02 14:25:03 UTC (rev 28823)
+++ scummvm/trunk/engines/parallaction/walk.cpp	2007-09-02 15:17:41 UTC (rev 28824)
@@ -384,7 +384,7 @@
 	delete list;
 }
 
-void jobWalk(void *parm, Job *j) {
+void Parallaction_ns::jobWalk(void *parm, Job *j) {
 	WalkNodeList *list = (WalkNodeList*)parm;
 
 	_vm->_char._ani._oldPos.x = _vm->_char._ani._left;


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