[Scummvm-cvs-logs] SF.net SVN: scummvm:[54502] scummvm/trunk/engines/hugo

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Fri Nov 26 23:15:31 CET 2010


Revision: 54502
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54502&view=rev
Author:   strangerke
Date:     2010-11-26 22:15:31 +0000 (Fri, 26 Nov 2010)

Log Message:
-----------
HUGO: Clean up Scheduler

Modified Paths:
--------------
    scummvm/trunk/engines/hugo/schedule.cpp
    scummvm/trunk/engines/hugo/schedule.h
    scummvm/trunk/engines/hugo/schedule_v1d.cpp
    scummvm/trunk/engines/hugo/schedule_v1w.cpp
    scummvm/trunk/engines/hugo/schedule_v2d.cpp
    scummvm/trunk/engines/hugo/schedule_v3d.cpp

Modified: scummvm/trunk/engines/hugo/schedule.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule.cpp	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule.cpp	2010-11-26 22:15:31 UTC (rev 54502)
@@ -111,7 +111,7 @@
 * Return system time in ticks.  A tick is 1/TICKS_PER_SEC mS
 */
 uint32 Scheduler::getWinTicks() {
-	debugC(3, kDebugSchedule, "getTicks");
+	debugC(3, kDebugSchedule, "getWinTicks");
 
 	return _vm->getGameStatus().tick;
 }
@@ -123,7 +123,7 @@
 * a real tick, in which case the system tick is simply incremented
 */
 uint32 Scheduler::getDosTicks(bool updateFl) {
-	debugC(5, kDebugSchedule, "getTicks");
+	debugC(5, kDebugSchedule, "getDosTicks(%s)", (updateFl) ? 1 : 0);
 
 	static  uint32 tick = 0;                        // Current system time in ticks
 	static  uint32 t_old = 0;                       // The previous wall time in ticks
@@ -881,4 +881,71 @@
 	}
 }
 
+/**
+* Write the event queue to the file with handle f
+* Note that we convert all the event structure ptrs to indexes
+* using -1 for NULL.  We can't convert the action ptrs to indexes
+* so we save address of first dummy action ptr to compare on restore.
+*/
+void Scheduler::saveEvents(Common::WriteStream *f) {
+	debugC(1, kDebugSchedule, "saveEvents()");
+
+	f->writeUint32BE(getTicks());
+
+	int16 freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events;
+	int16 headIndex = (_headEvent == 0) ? -1 : _headEvent - _events;
+	int16 tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events;
+
+	f->writeSint16BE(freeIndex);
+	f->writeSint16BE(headIndex);
+	f->writeSint16BE(tailIndex);
+
+	// Convert event ptrs to indexes
+	event_t  saveEventArr[kMaxEvents];              // Convert event ptrs to indexes
+	for (int16 i = 0; i < kMaxEvents; i++) {
+		event_t *wrkEvent = &_events[i];
+		saveEventArr[i] = *wrkEvent;
+		saveEventArr[i].prevEvent = (wrkEvent->prevEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->prevEvent - _events);
+		saveEventArr[i].nextEvent = (wrkEvent->nextEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->nextEvent - _events);
+	}
+
+	f->write(saveEventArr, sizeof(saveEventArr));
+	warning("TODO: serialize saveEventArr");
+}
+
+/**
+* Restore the event list from file with handle f
+*/
+void Scheduler::restoreEvents(Common::SeekableReadStream *f) {
+	debugC(1, kDebugSchedule, "restoreEvents");
+
+	event_t  savedEvents[kMaxEvents];               // Convert event ptrs to indexes
+
+	uint32 saveTime = f->readUint32BE();            // time of save
+	int16 freeIndex = f->readSint16BE();            // Free list index
+	int16 headIndex = f->readSint16BE();            // Head of list index
+	int16 tailIndex = f->readSint16BE();            // Tail of list index
+	f->read(savedEvents, sizeof(savedEvents));
+
+	event_t *wrkEvent;
+	// Restore events indexes to pointers
+	for (int i = 0; i < kMaxEvents; i++) {
+		wrkEvent = &savedEvents[i];
+		_events[i] = *wrkEvent;
+		_events[i].prevEvent = (wrkEvent->prevEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->prevEvent ];
+		_events[i].nextEvent = (wrkEvent->nextEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->nextEvent ];
+	}
+	_freeEvent = (freeIndex == -1) ? 0 : &_events[freeIndex];
+	_headEvent = (headIndex == -1) ? 0 : &_events[headIndex];
+	_tailEvent = (tailIndex == -1) ? 0 : &_events[tailIndex];
+
+	// Adjust times to fit our time
+	uint32 curTime = getTicks();
+	wrkEvent = _headEvent;                              // The earliest event
+	while (wrkEvent) {                              // While mature events found
+		wrkEvent->time = wrkEvent->time - saveTime + curTime;
+		wrkEvent = wrkEvent->nextEvent;
+	}
+}
+
 } // End of namespace Hugo

Modified: scummvm/trunk/engines/hugo/schedule.h
===================================================================
--- scummvm/trunk/engines/hugo/schedule.h	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule.h	2010-11-26 22:15:31 UTC (rev 54502)
@@ -53,21 +53,23 @@
 	Scheduler(HugoEngine *vm);
 	virtual ~Scheduler();
 
-	virtual void restoreEvents(Common::SeekableReadStream *f) = 0;
+	virtual uint32 getTicks() = 0;
+
 	virtual void runScheduler() = 0;
-	virtual void saveEvents(Common::WriteStream *f) = 0;
 
-	void   decodeString(char *line);
-	void   freeActListArr();
-	void   initEventQueue();
-	void   insertActionList(uint16 actIndex);
-	void   loadActListArr(Common::File &in);
-	void   loadAlNewscrIndex(Common::File &in);
-	void   newScreen(int screenIndex);
-	void   processBonus(int bonusIndex);
-	void   processMaze(int x1, int x2, int y1, int y2);
-	void   restoreScreen(int screenIndex);
-	void   waitForRefresh(void);
+	void decodeString(char *line);
+	void freeActListArr();
+	void initEventQueue();
+	void insertActionList(uint16 actIndex);
+	void loadActListArr(Common::File &in);
+	void loadAlNewscrIndex(Common::File &in);
+	void newScreen(int screenIndex);
+	void processBonus(int bonusIndex);
+	void processMaze(int x1, int x2, int y1, int y2);
+	void restoreScreen(int screenIndex);
+	void restoreEvents(Common::SeekableReadStream *f);
+	void saveEvents(Common::WriteStream *f);
+	void waitForRefresh(void);
 
 protected:
 	HugoEngine *_vm;
@@ -100,9 +102,10 @@
 	~Scheduler_v1d();
 
 	virtual const char *getCypher();
+
+	virtual uint32 getTicks();
+
 	virtual void insertAction(act *action);
-	virtual void restoreEvents(Common::SeekableReadStream *f);
-	virtual void saveEvents(Common::WriteStream *f);
 	virtual void runScheduler();
 protected:
 	virtual void delQueue(event_t *curEvent);
@@ -115,10 +118,10 @@
 	virtual ~Scheduler_v2d();
 
 	virtual const char *getCypher();
-	virtual void insertAction(act *action);
+	void insertAction(act *action);
 protected:
-	virtual void delQueue(event_t *curEvent);
-	virtual event_t *doAction(event_t *curEvent);
+	void delQueue(event_t *curEvent);
+	event_t *doAction(event_t *curEvent);
 };
 
 class Scheduler_v3d : public Scheduler_v2d {
@@ -127,9 +130,6 @@
 	~Scheduler_v3d();
 
 	const char *getCypher();
-protected:
-	virtual event_t *doAction(event_t *curEvent);
-
 };
 
 class Scheduler_v1w : public Scheduler_v3d {
@@ -137,11 +137,9 @@
 	Scheduler_v1w(HugoEngine *vm);
 	~Scheduler_v1w();
 
-	virtual event_t *doAction(event_t *curEvent);
-	void insertAction(act *action);
-	void restoreEvents(Common::SeekableReadStream *f);
+	uint32 getTicks();
+
 	void runScheduler();
-	void saveEvents(Common::WriteStream *f);
 };
 } // End of namespace Hugo
 #endif //HUGO_SCHEDULE_H

Modified: scummvm/trunk/engines/hugo/schedule_v1d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule_v1d.cpp	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule_v1d.cpp	2010-11-26 22:15:31 UTC (rev 54502)
@@ -56,6 +56,10 @@
 	return "Copyright (c) 1990, Gray Design Associates";
 }
 
+uint32 Scheduler_v1d::getTicks() {
+	return getDosTicks(false);
+}
+
 /**
 * Delete an event structure (i.e. return it to the free list)
 * Note that event is assumed at head of queue (i.e. earliest).  To delete
@@ -80,52 +84,6 @@
 }
 
 /**
-* Insert the action pointed to by p into the timer event queue
-* The queue goes from head (earliest) to tail (latest) timewise
-*/
-void Scheduler_v1d::insertAction(act *action) {
-	debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType);
-
-	// First, get and initialise the event structure
-	event_t *curEvent = getQueue();
-	curEvent->action = action;
-
-	curEvent->localActionFl = true;             // Rest are for current screen only
-
-	curEvent->time = action->a0.timer + getDosTicks(false); // Convert rel to abs time
-
-	// Now find the place to insert the event
-	if (!_tailEvent) {                              // Empty queue
-		_tailEvent = _headEvent = curEvent;
-		curEvent->nextEvent = curEvent->prevEvent = 0;
-	} else {
-		event_t *wrkEvent = _tailEvent;             // Search from latest time back
-		bool found = false;
-
-		while (wrkEvent && !found) {
-			if (wrkEvent->time <= curEvent->time) { // Found if new event later
-				found = true;
-				if (wrkEvent == _tailEvent)         // New latest in list
-					_tailEvent = curEvent;
-				else
-					wrkEvent->nextEvent->prevEvent = curEvent;
-				curEvent->nextEvent = wrkEvent->nextEvent;
-				wrkEvent->nextEvent = curEvent;
-				curEvent->prevEvent = wrkEvent;
-			}
-			wrkEvent = wrkEvent->prevEvent;
-		}
-
-		if (!found) {                               // Must be earliest in list
-			_headEvent->prevEvent = curEvent;       // So insert as new head
-			curEvent->nextEvent = _headEvent;
-			curEvent->prevEvent = 0;
-			_headEvent = curEvent;
-		}
-	}
-}
-
-/**
 * This function performs the action in the event structure pointed to by p
 * It dequeues the event and returns it to the free list.  It returns a ptr
 * to the next action in the list, except special case of NEW_SCREEN
@@ -328,74 +286,49 @@
 }
 
 /**
-* Write the event queue to the file with handle f
-* Note that we convert all the event structure ptrs to indexes
-* using -1 for NULL.  We can't convert the action ptrs to indexes
-* so we save address of first dummy action ptr to compare on restore.
+* Insert the action pointed to by p into the timer event queue
+* The queue goes from head (earliest) to tail (latest) timewise
 */
-void Scheduler_v1d::saveEvents(Common::WriteStream *f) {
-	debugC(1, kDebugSchedule, "saveEvents()");
+void Scheduler_v1d::insertAction(act *action) {
+	debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType);
 
-	uint32 curTime = getDosTicks(false);
-	event_t  saveEventArr[kMaxEvents];              // Convert event ptrs to indexes
+	// First, get and initialise the event structure
+	event_t *curEvent = getQueue();
+	curEvent->action = action;
 
-	// Convert event ptrs to indexes
-	for (int16 i = 0; i < kMaxEvents; i++) {
-		event_t *wrkEvent = &_events[i];
-		saveEventArr[i] = *wrkEvent;
-		saveEventArr[i].prevEvent = (wrkEvent->prevEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->prevEvent - _events);
-		saveEventArr[i].nextEvent = (wrkEvent->nextEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->nextEvent - _events);
-	}
+	curEvent->localActionFl = true;                 // Rest are for current screen only
 
-	int16 freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events;
-	int16 headIndex = (_headEvent == 0) ? -1 : _headEvent - _events;
-	int16 tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events;
+	curEvent->time = action->a0.timer + getTicks(); // Convert rel to abs time
 
-	f->writeUint32BE(curTime);
-	f->writeSint16BE(freeIndex);
-	f->writeSint16BE(headIndex);
-	f->writeSint16BE(tailIndex);
-	f->write(saveEventArr, sizeof(saveEventArr));
-	warning("TODO: serialize saveEventArr");
-}
+	// Now find the place to insert the event
+	if (!_tailEvent) {                              // Empty queue
+		_tailEvent = _headEvent = curEvent;
+		curEvent->nextEvent = curEvent->prevEvent = 0;
+	} else {
+		event_t *wrkEvent = _tailEvent;             // Search from latest time back
+		bool found = false;
 
-/**
-* Restore the event list from file with handle f
-*/
-void Scheduler_v1d::restoreEvents(Common::SeekableReadStream *f) {
-	debugC(1, kDebugSchedule, "restoreEvents");
+		while (wrkEvent && !found) {
+			if (wrkEvent->time <= curEvent->time) { // Found if new event later
+				found = true;
+				if (wrkEvent == _tailEvent)         // New latest in list
+					_tailEvent = curEvent;
+				else
+					wrkEvent->nextEvent->prevEvent = curEvent;
+				curEvent->nextEvent = wrkEvent->nextEvent;
+				wrkEvent->nextEvent = curEvent;
+				curEvent->prevEvent = wrkEvent;
+			}
+			wrkEvent = wrkEvent->prevEvent;
+		}
 
-	uint32   saveTime;
-	int16    freeIndex;                             // Free list index
-	int16    headIndex;                             // Head of list index
-	int16    tailIndex;                             // Tail of list index
-	event_t  savedEvents[kMaxEvents];               // Convert event ptrs to indexes
-
-	saveTime = f->readUint32BE();                   // time of save
-	freeIndex = f->readSint16BE();
-	headIndex = f->readSint16BE();
-	tailIndex = f->readSint16BE();
-	f->read(savedEvents, sizeof(savedEvents));
-
-	event_t *wrkEvent;
-	// Restore events indexes to pointers
-	for (int i = 0; i < kMaxEvents; i++) {
-		wrkEvent = &savedEvents[i];
-		_events[i] = *wrkEvent;
-		_events[i].prevEvent = (wrkEvent->prevEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->prevEvent ];
-		_events[i].nextEvent = (wrkEvent->nextEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->nextEvent ];
+		if (!found) {                               // Must be earliest in list
+			_headEvent->prevEvent = curEvent;       // So insert as new head
+			curEvent->nextEvent = _headEvent;
+			curEvent->prevEvent = 0;
+			_headEvent = curEvent;
+		}
 	}
-	_freeEvent = (freeIndex == -1) ? 0 : &_events[freeIndex];
-	_headEvent = (headIndex == -1) ? 0 : &_events[headIndex];
-	_tailEvent = (tailIndex == -1) ? 0 : &_events[tailIndex];
-
-	// Adjust times to fit our time
-	uint32 curTime = getDosTicks(false);
-	wrkEvent = _headEvent;                              // The earliest event
-	while (wrkEvent) {                              // While mature events found
-		wrkEvent->time = wrkEvent->time - saveTime + curTime;
-		wrkEvent = wrkEvent->nextEvent;
-	}
 }
 
 /**
@@ -406,13 +339,10 @@
 void Scheduler_v1d::runScheduler() {
 	debugC(6, kDebugSchedule, "runScheduler");
 
-	uint32 ticker;                                  // The time now, in ticks
-	event_t *curEvent;                              // Event ptr
+	uint32 ticker = getTicks();                     // The time now, in ticks
+	event_t *curEvent = _headEvent;                 // The earliest event
 
-	ticker = getDosTicks(false);
-
-	curEvent = _headEvent;                          // The earliest event
-	while (curEvent && curEvent->time <= ticker)    // While mature events found
+	while (curEvent && (curEvent->time <= ticker))  // While mature events found
 		curEvent = doAction(curEvent);              // Perform the action (returns next_p)
 }
 

Modified: scummvm/trunk/engines/hugo/schedule_v1w.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule_v1w.cpp	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule_v1w.cpp	2010-11-26 22:15:31 UTC (rev 54502)
@@ -53,431 +53,11 @@
 Scheduler_v1w::~Scheduler_v1w() {
 }
 
-/**
-* This function performs the action in the event structure pointed to by p
-* It dequeues the event and returns it to the free list.  It returns a ptr
-* to the next action in the list, except special case of NEW_SCREEN
-*/
-event_t *Scheduler_v1w::doAction(event_t *curEvent) {
-	debugC(1, kDebugSchedule, "doAction - Event action type : %d", curEvent->action->a0.actType);
-
-	status_t &gameStatus = _vm->getGameStatus();
-	act *action = curEvent->action;
-	char     *response;                             // User's response string
-	object_t *obj1;
-	object_t *obj2;
-	int       dx, dy;
-	event_t  *wrkEvent;                             // Save ev_p->next_p for return
-	event_t  *saveEvent;                            // Used in DEL_EVENTS
-
-	switch (action->a0.actType) {
-	case ANULL:                                     // Big NOP from DEL_EVENTS
-		break;
-	case ASCHEDULE:                                 // act0: Schedule an action list
-		insertActionList(action->a0.actIndex);
-		break;
-	case START_OBJ:                                 // act1: Start an object cycling
-		_vm->_object->_objects[action->a1.objNumb].cycleNumb = action->a1.cycleNumb;
-		_vm->_object->_objects[action->a1.objNumb].cycling = action->a1.cycle;
-		break;
-	case INIT_OBJXY:                                // act2: Initialise an object
-		_vm->_object->_objects[action->a2.objNumb].x = action->a2.x;          // Coordinates
-		_vm->_object->_objects[action->a2.objNumb].y = action->a2.y;
-		break;
-	case PROMPT: {                                  // act3: Prompt user for key phrase
-		response = Utils::Box(BOX_PROMPT, "%s", _vm->_file->fetchString(action->a3.promptIndex));
-
-		warning("STUB: doAction(act3), expecting answer %s", _vm->_file->fetchString(action->a3.responsePtr[0]));
-
-		// TODO: The answer of the player is not handled currently! Once it'll be read in the messageBox, uncomment this block
-#if 0
-		bool      found;
-		char     *tmpStr;                           // General purpose string ptr
-
-		for (found = false, dx = 0; !found && (action->a3.responsePtr[dx] != -1); dx++) {
-			tmpStr = _vm->_file->fetchString(action->a3.responsePtr[dx]);
-			if (strstr(Utils::strlwr(response) , tmpStr))
-				found = true;
-		}
-
-		if (found)
-			insertActionList(action->a3.actPassIndex);
-		else
-			insertActionList(action->a3.actFailIndex);
-#endif
-
-		// HACK: As the answer is not read, currently it's always considered correct
-		insertActionList(action->a3.actPassIndex);
-		break;
-		}
-	case BKGD_COLOR:                                // act4: Set new background color
-		_vm->_screen->setBackgroundColor(action->a4.newBackgroundColor);
-		break;
-	case INIT_OBJVXY:                               // act5: Initialise an object velocity
-		_vm->_object->setVelocity(action->a5.objNumb, action->a5.vx, action->a5.vy);
-		break;
-	case INIT_CARRY:                                // act6: Initialise an object
-		_vm->_object->setCarry(action->a6.objNumb, action->a6.carriedFl);  // carried status
-		break;
-	case INIT_HF_COORD:                             // act7: Initialise an object to hero's "feet" coords
-		_vm->_object->_objects[action->a7.objNumb].x = _vm->_hero->x - 1;
-		_vm->_object->_objects[action->a7.objNumb].y = _vm->_hero->y + _vm->_hero->currImagePtr->y2 - 1;
-		_vm->_object->_objects[action->a7.objNumb].screenIndex = *_vm->_screen_p;  // Don't forget screen!
-		break;
-	case NEW_SCREEN:                                // act8: Start new screen
-		newScreen(action->a8.screenIndex);
-		break;
-	case INIT_OBJSTATE:                             // act9: Initialise an object state
-		_vm->_object->_objects[action->a9.objNumb].state = action->a9.newState;
-		break;
-	case INIT_PATH:                                 // act10: Initialise an object path and velocity
-		_vm->_object->setPath(action->a10.objNumb, (path_t) action->a10.newPathType, action->a10.vxPath, action->a10.vyPath);
-		break;
-	case COND_R:                                    // act11: action lists conditional on object state
-		if (_vm->_object->_objects[action->a11.objNumb].state == action->a11.stateReq)
-			insertActionList(action->a11.actPassIndex);
-		else
-			insertActionList(action->a11.actFailIndex);
-		break;
-	case TEXT:                                      // act12: Text box (CF WARN)
-		Utils::Box(BOX_ANY, "%s", _vm->_file->fetchString(action->a12.stringIndex));   // Fetch string from file
-		break;
-	case SWAP_IMAGES:                               // act13: Swap 2 object images
-		_vm->_object->swapImages(action->a13.obj1, action->a13.obj2);
-		break;
-	case COND_SCR:                                  // act14: Conditional on current screen
-		if (_vm->_object->_objects[action->a14.objNumb].screenIndex == action->a14.screenReq)
-			insertActionList(action->a14.actPassIndex);
-		else
-			insertActionList(action->a14.actFailIndex);
-		break;
-	case AUTOPILOT:                                 // act15: Home in on a (stationary) object
-		// object p1 will home in on object p2
-		obj1 = &_vm->_object->_objects[action->a15.obj1];
-		obj2 = &_vm->_object->_objects[action->a15.obj2];
-		obj1->pathType = AUTO;
-		dx = obj1->x + obj1->currImagePtr->x1 - obj2->x - obj2->currImagePtr->x1;
-		dy = obj1->y + obj1->currImagePtr->y1 - obj2->y - obj2->currImagePtr->y1;
-
-		if (dx == 0)                                // Don't EVER divide by zero!
-			dx = 1;
-		if (dy == 0)
-			dy = 1;
-
-		if (abs(dx) > abs(dy)) {
-			obj1->vx = action->a15.dx * -SIGN(dx);
-			obj1->vy = abs((action->a15.dy * dy) / dx) * -SIGN(dy);
-		} else {
-			obj1->vy = action->a15.dy * -SIGN(dy);
-			obj1->vx = abs((action->a15.dx * dx) / dy) * -SIGN(dx);
-		}
-		break;
-	case INIT_OBJ_SEQ:                              // act16: Set sequence number to use
-		// Note: Don't set a sequence at time 0 of a new screen, it causes
-		// problems clearing the boundary bits of the object!  t>0 is safe
-		_vm->_object->_objects[action->a16.objNumb].currImagePtr = _vm->_object->_objects[action->a16.objNumb].seqList[action->a16.seqIndex].seqPtr;
-		break;
-	case SET_STATE_BITS:                            // act17: OR mask with curr obj state
-		_vm->_object->_objects[action->a17.objNumb].state |= action->a17.stateMask;
-		break;
-	case CLEAR_STATE_BITS:                          // act18: AND ~mask with curr obj state
-		_vm->_object->_objects[action->a18.objNumb].state &= ~action->a18.stateMask;
-		break;
-	case TEST_STATE_BITS:                           // act19: If all bits set, do apass else afail
-		if ((_vm->_object->_objects[action->a19.objNumb].state & action->a19.stateMask) == action->a19.stateMask)
-			insertActionList(action->a19.actPassIndex);
-		else
-			insertActionList(action->a19.actFailIndex);
-		break;
-	case DEL_EVENTS:                                // act20: Remove all events of this action type
-		// Note: actions are not deleted here, simply turned into NOPs!
-		wrkEvent = _headEvent;                      // The earliest event
-		while (wrkEvent) {                          // While events found in list
-			saveEvent = wrkEvent->nextEvent;
-			if (wrkEvent->action->a20.actType == action->a20.actTypeDel)
-				delQueue(wrkEvent);
-			wrkEvent = saveEvent;
-		}
-		break;
-	case GAMEOVER:                                  // act21: Game over!
-		// NOTE: Must wait at least 1 tick before issuing this action if
-		// any objects are to be made invisible!
-		gameStatus.gameOverFl = true;
-		break;
-	case INIT_HH_COORD:                             // act22: Initialise an object to hero's actual coords
-		_vm->_object->_objects[action->a22.objNumb].x = _vm->_hero->x;
-		_vm->_object->_objects[action->a22.objNumb].y = _vm->_hero->y;
-		_vm->_object->_objects[action->a22.objNumb].screenIndex = *_vm->_screen_p;// Don't forget screen!
-		break;
-	case EXIT:                                      // act23: Exit game back to DOS
-		_vm->endGame();
-		break;
-	case BONUS:                                     // act24: Get bonus score for action
-		processBonus(action->a24.pointIndex);
-		break;
-	case COND_BOX:                                  // act25: Conditional on bounding box
-		obj1 = &_vm->_object->_objects[action->a25.objNumb];
-		dx = obj1->x + obj1->currImagePtr->x1;
-		dy = obj1->y + obj1->currImagePtr->y2;
-		if ((dx >= action->a25.x1) && (dx <= action->a25.x2) &&
-		        (dy >= action->a25.y1) && (dy <= action->a25.y2))
-			insertActionList(action->a25.actPassIndex);
-		else
-			insertActionList(action->a25.actFailIndex);
-		break;
-	case SOUND:                                     // act26: Play a sound (or tune)
-		if (action->a26.soundIndex < _vm->_tunesNbr)
-			_vm->_sound->playMusic(action->a26.soundIndex);
-		else
-			_vm->_sound->playSound(action->a26.soundIndex, BOTH_CHANNELS, MED_PRI);
-		break;
-	case ADD_SCORE:                                 // act27: Add object's value to score
-		_vm->adjustScore(_vm->_object->_objects[action->a27.objNumb].objValue);
-		break;
-	case SUB_SCORE:                                 // act28: Subtract object's value from score
-		_vm->adjustScore(-_vm->_object->_objects[action->a28.objNumb].objValue);
-		break;
-	case COND_CARRY:                                // act29: Conditional on object being carried
-		if (_vm->_object->isCarried(action->a29.objNumb))
-			insertActionList(action->a29.actPassIndex);
-		else
-			insertActionList(action->a29.actFailIndex);
-		break;
-	case INIT_MAZE:                                 // act30: Enable and init maze structure
-		_maze.enabledFl = true;
-		_maze.size = action->a30.mazeSize;
-		_maze.x1 = action->a30.x1;
-		_maze.y1 = action->a30.y1;
-		_maze.x2 = action->a30.x2;
-		_maze.y2 = action->a30.y2;
-		_maze.x3 = action->a30.x3;
-		_maze.x4 = action->a30.x4;
-		_maze.firstScreenIndex = action->a30.firstScreenIndex;
-		break;
-	case EXIT_MAZE:                                 // act31: Disable maze mode
-		_maze.enabledFl = false;
-		break;
-	case INIT_PRIORITY:
-		_vm->_object->_objects[action->a32.objNumb].priority = action->a32.priority;
-		break;
-	case INIT_SCREEN:
-		_vm->_object->_objects[action->a33.objNumb].screenIndex = action->a33.screenIndex;
-		break;
-	case AGSCHEDULE:                                // act34: Schedule a (global) action list
-		insertActionList(action->a34.actIndex);
-		break;
-	case REMAPPAL:                                  // act35: Remap a palette color
-		_vm->_screen->remapPal(action->a35.oldColorIndex, action->a35.newColorIndex);
-		break;
-	case COND_NOUN:                                 // act36: Conditional on noun mentioned
-		if (_vm->_parser->isWordPresent(_vm->_arrayNouns[action->a36.nounIndex]))
-			insertActionList(action->a36.actPassIndex);
-		else
-			insertActionList(action->a36.actFailIndex);
-		break;
-	case SCREEN_STATE:                              // act37: Set new screen state
-		_vm->_screenStates[action->a37.screenIndex] = action->a37.newState;
-		break;
-	case INIT_LIPS:                                 // act38: Position lips on object
-		_vm->_object->_objects[action->a38.lipsObjNumb].x = _vm->_object->_objects[action->a38.objNumb].x + action->a38.dxLips;
-		_vm->_object->_objects[action->a38.lipsObjNumb].y = _vm->_object->_objects[action->a38.objNumb].y + action->a38.dyLips;
-		_vm->_object->_objects[action->a38.lipsObjNumb].screenIndex = *_vm->_screen_p; // Don't forget screen!
-		_vm->_object->_objects[action->a38.lipsObjNumb].cycling = CYCLE_FORWARD;
-		break;
-	case INIT_STORY_MODE:                           // act39: Init story_mode flag
-		// This is similar to the QUIET path mode, except that it is
-		// independant of it and it additionally disables the ">" prompt
-		gameStatus.storyModeFl = action->a39.storyModeFl;
-
-		// End the game after story if this is special vendor demo mode
-		if (gameStatus.demoFl && action->a39.storyModeFl == false)
-			_vm->endGame();
-		break;
-	case WARN:                                      // act40: Text box (CF TEXT)
-		Utils::Box(BOX_OK, "%s", _vm->_file->fetchString(action->a40.stringIndex));
-		break;
-	case COND_BONUS:                                // act41: Perform action if got bonus
-		if (_vm->_points[action->a41.BonusIndex].scoredFl)
-			insertActionList(action->a41.actPassIndex);
-		else
-			insertActionList(action->a41.actFailIndex);
-		break;
-	case TEXT_TAKE:                                 // act42: Text box with "take" message
-		Utils::Box(BOX_ANY, TAKE_TEXT, _vm->_arrayNouns[_vm->_object->_objects[action->a42.objNumb].nounIndex][TAKE_NAME]);
-		break;
-	case YESNO:                                     // act43: Prompt user for Yes or No
-		warning("doAction(act43) - Yes/No Box");
-		if (Utils::Box(BOX_YESNO, "%s", _vm->_file->fetchString(action->a43.promptIndex)) != 0)
-			insertActionList(action->a43.actYesIndex);
-		else
-			insertActionList(action->a43.actNoIndex);
-		break;
-	case STOP_ROUTE:                                // act44: Stop any route in progress
-		gameStatus.routeIndex = -1;
-		break;
-	case COND_ROUTE:                                // act45: Conditional on route in progress
-		if (gameStatus.routeIndex >= action->a45.routeIndex)
-			insertActionList(action->a45.actPassIndex);
-		else
-			insertActionList(action->a45.actFailIndex);
-		break;
-	case INIT_JUMPEXIT:                             // act46: Init status.jumpexit flag
-		// This is to allow left click on exit to get there immediately
-		// For example the plane crash in Hugo2 where hero is invisible
-		// Couldn't use INVISIBLE flag since conflicts with boat in Hugo1
-		gameStatus.jumpExitFl = action->a46.jumpExitFl;
-		break;
-	case INIT_VIEW:                                 // act47: Init object.viewx, viewy, dir
-		_vm->_object->_objects[action->a47.objNumb].viewx = action->a47.viewx;
-		_vm->_object->_objects[action->a47.objNumb].viewy = action->a47.viewy;
-		_vm->_object->_objects[action->a47.objNumb].direction = action->a47.direction;
-		break;
-	case INIT_OBJ_FRAME:                            // act48: Set seq,frame number to use
-		// Note: Don't set a sequence at time 0 of a new screen, it causes
-		// problems clearing the boundary bits of the object!  t>0 is safe
-		_vm->_object->_objects[action->a48.objNumb].currImagePtr = _vm->_object->_objects[action->a48.objNumb].seqList[action->a48.seqIndex].seqPtr;
-		for (dx = 0; dx < action->a48.frameIndex; dx++)
-			_vm->_object->_objects[action->a48.objNumb].currImagePtr = _vm->_object->_objects[action->a48.objNumb].currImagePtr->nextSeqPtr;
-		break;
-	default:
-		error("An error has occurred: %s", "doAction");
-		break;
-	}
-
-	if (action->a0.actType == NEW_SCREEN) {         // New_screen() deletes entire list
-		return 0;                                   // next_p = 0 since list now empty
-	} else {
-		wrkEvent = curEvent->nextEvent;
-		delQueue(curEvent);                         // Return event to free list
-		return wrkEvent;                            // Return next event ptr
-	}
+uint32 Scheduler_v1w::getTicks() {
+	return getWinTicks();
 }
 
 /**
-* Write the event queue to the file with handle f
-* Note that we convert all the event structure ptrs to indexes
-* using -1 for NULL.  We can't convert the action ptrs to indexes
-* so we save address of first dummy action ptr to compare on restore.
-*/
-void Scheduler_v1w::saveEvents(Common::WriteStream *f) {
-	debugC(1, kDebugSchedule, "saveEvents()");
-
-	uint32 curTime = getWinTicks();
-	event_t  saveEventArr[kMaxEvents];              // Convert event ptrs to indexes
-
-	// Convert event ptrs to indexes
-	for (int16 i = 0; i < kMaxEvents; i++) {
-		event_t *wrkEvent = &_events[i];
-		saveEventArr[i] = *wrkEvent;
-		saveEventArr[i].prevEvent = (wrkEvent->prevEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->prevEvent - _events);
-		saveEventArr[i].nextEvent = (wrkEvent->nextEvent == 0) ? (event_t *) - 1 : (event_t *)(wrkEvent->nextEvent - _events);
-	}
-
-	int16 freeIndex = (_freeEvent == 0) ? -1 : _freeEvent - _events;
-	int16 headIndex = (_headEvent == 0) ? -1 : _headEvent - _events;
-	int16 tailIndex = (_tailEvent == 0) ? -1 : _tailEvent - _events;
-
-	f->writeUint32BE(curTime);
-	f->writeSint16BE(freeIndex);
-	f->writeSint16BE(headIndex);
-	f->writeSint16BE(tailIndex);
-	f->write(saveEventArr, sizeof(saveEventArr));
-	warning("TODO: serialize saveEventArr");
-}
-
-/**
-* Restore the event list from file with handle f
-*/
-void Scheduler_v1w::restoreEvents(Common::SeekableReadStream *f) {
-	debugC(1, kDebugSchedule, "restoreEvents");
-
-	uint32   saveTime;
-	int16    freeIndex;                             // Free list index
-	int16    headIndex;                             // Head of list index
-	int16    tailIndex;                             // Tail of list index
-	event_t  savedEvents[kMaxEvents];               // Convert event ptrs to indexes
-
-	saveTime = f->readUint32BE();                   // time of save
-	freeIndex = f->readSint16BE();
-	headIndex = f->readSint16BE();
-	tailIndex = f->readSint16BE();
-
-	f->read(savedEvents, sizeof(savedEvents));
-
-	event_t *wrkEvent;
-	// Restore events indexes to pointers
-	for (int i = 0; i < kMaxEvents; i++) {
-		wrkEvent = &savedEvents[i];
-		_events[i] = *wrkEvent;
-		_events[i].prevEvent = (wrkEvent->prevEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->prevEvent ];
-		_events[i].nextEvent = (wrkEvent->nextEvent == (event_t *) - 1) ? (event_t *)0 : &_events[(size_t)wrkEvent->nextEvent ];
-	}
-	_freeEvent = (freeIndex == -1) ? 0 : &_events[freeIndex];
-	_headEvent = (headIndex == -1) ? 0 : &_events[headIndex];
-	_tailEvent = (tailIndex == -1) ? 0 : &_events[tailIndex];
-
-	// Adjust times to fit our time
-	uint32 curTime = getWinTicks();
-	wrkEvent = _headEvent;                              // The earliest event
-	while (wrkEvent) {                              // While mature events found
-		wrkEvent->time = wrkEvent->time - saveTime + curTime;
-		wrkEvent = wrkEvent->nextEvent;
-	}
-}
-
-/**
-* Insert the action pointed to by p into the timer event queue
-* The queue goes from head (earliest) to tail (latest) timewise
-*/
-void Scheduler_v1w::insertAction(act *action) {
-	debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType);
-
-	// First, get and initialise the event structure
-	event_t *curEvent = getQueue();
-	curEvent->action = action;
-	switch (action->a0.actType) {                   // Assign whether local or global
-	case AGSCHEDULE:
-		curEvent->localActionFl = false;            // Lasts over a new screen
-		break;
-	default:
-		curEvent->localActionFl = true;             // Rest are for current screen only
-		break;
-	}
-
-	curEvent->time = action->a0.timer + getWinTicks(); // Convert rel to abs time
-
-	// Now find the place to insert the event
-	if (!_tailEvent) {                              // Empty queue
-		_tailEvent = _headEvent = curEvent;
-		curEvent->nextEvent = curEvent->prevEvent = 0;
-	} else {
-		event_t *wrkEvent = _tailEvent;             // Search from latest time back
-		bool found = false;
-
-		while (wrkEvent && !found) {
-			if (wrkEvent->time <= curEvent->time) { // Found if new event later
-				found = true;
-				if (wrkEvent == _tailEvent)         // New latest in list
-					_tailEvent = curEvent;
-				else
-					wrkEvent->nextEvent->prevEvent = curEvent;
-				curEvent->nextEvent = wrkEvent->nextEvent;
-				wrkEvent->nextEvent = curEvent;
-				curEvent->prevEvent = wrkEvent;
-			}
-			wrkEvent = wrkEvent->prevEvent;
-		}
-
-		if (!found) {                               // Must be earliest in list
-			_headEvent->prevEvent = curEvent;       // So insert as new head
-			curEvent->nextEvent = _headEvent;
-			curEvent->prevEvent = 0;
-			_headEvent = curEvent;
-		}
-	}
-}
-
-/**
 * This is the scheduler which runs every tick.  It examines the event queue
 * for any events whose time has come.  It dequeues these events and performs
 * the action associated with the event, returning it to the free queue
@@ -485,11 +65,12 @@
 void Scheduler_v1w::runScheduler() {
 	debugC(6, kDebugSchedule, "runScheduler");
 
-	status_t &gameStatus = _vm->getGameStatus();
+	uint32 ticker = getTicks();                     // The time now, in ticks
 	event_t *curEvent = _headEvent;                 // The earliest event
 
-	while (curEvent && curEvent->time <= gameStatus.tick) // While mature events found
+	while (curEvent && (curEvent->time <= ticker))  // While mature events found
 		curEvent = doAction(curEvent);              // Perform the action (returns next_p)
-	gameStatus.tick++;                              // Accessed elsewhere via getTicks()
+
+	_vm->getGameStatus().tick++;                    // Accessed elsewhere via getTicks()
 }
 } // End of namespace Hugo

Modified: scummvm/trunk/engines/hugo/schedule_v2d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule_v2d.cpp	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule_v2d.cpp	2010-11-26 22:15:31 UTC (rev 54502)
@@ -91,58 +91,6 @@
 }
 
 /**
-* Insert the action pointed to by p into the timer event queue
-* The queue goes from head (earliest) to tail (latest) timewise
-*/
-void Scheduler_v2d::insertAction(act *action) {
-	debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType);
-
-	// First, get and initialise the event structure
-	event_t *curEvent = getQueue();
-	curEvent->action = action;
-	switch (action->a0.actType) {                   // Assign whether local or global
-	case AGSCHEDULE:
-		curEvent->localActionFl = false;            // Lasts over a new screen
-		break;
-	default:
-		curEvent->localActionFl = true;             // Rest are for current screen only
-		break;
-	}
-
-	curEvent->time = action->a0.timer + getDosTicks(false); // Convert rel to abs time
-
-	// Now find the place to insert the event
-	if (!_tailEvent) {                              // Empty queue
-		_tailEvent = _headEvent = curEvent;
-		curEvent->nextEvent = curEvent->prevEvent = 0;
-	} else {
-		event_t *wrkEvent = _tailEvent;             // Search from latest time back
-		bool found = false;
-
-		while (wrkEvent && !found) {
-			if (wrkEvent->time <= curEvent->time) { // Found if new event later
-				found = true;
-				if (wrkEvent == _tailEvent)         // New latest in list
-					_tailEvent = curEvent;
-				else
-					wrkEvent->nextEvent->prevEvent = curEvent;
-				curEvent->nextEvent = wrkEvent->nextEvent;
-				wrkEvent->nextEvent = curEvent;
-				curEvent->prevEvent = wrkEvent;
-			}
-			wrkEvent = wrkEvent->prevEvent;
-		}
-
-		if (!found) {                               // Must be earliest in list
-			_headEvent->prevEvent = curEvent;       // So insert as new head
-			curEvent->nextEvent = _headEvent;
-			curEvent->prevEvent = 0;
-			_headEvent = curEvent;
-		}
-	}
-}
-
-/**
 * This function performs the action in the event structure pointed to by p
 * It dequeues the event and returns it to the free list.  It returns a ptr
 * to the next action in the list, except special case of NEW_SCREEN
@@ -314,12 +262,12 @@
 		else
 			insertActionList(action->a25.actFailIndex);
 		break;
-//	case SOUND:                                     // act26: Play a sound (or tune)
-//		if (action->a26.soundIndex < _vm->_tunesNbr)
-//			_vm->_sound->playMusic(action->a26.soundIndex);
-//		else
-//			_vm->_sound->playSound(action->a26.soundIndex, BOTH_CHANNELS, MED_PRI);
-//		break;
+	case SOUND:                                     // act26: Play a sound (or tune)
+		if (action->a26.soundIndex < _vm->_tunesNbr)
+			_vm->_sound->playMusic(action->a26.soundIndex);
+		else
+			_vm->_sound->playSound(action->a26.soundIndex, BOTH_CHANNELS, MED_PRI);
+		break;
 	case ADD_SCORE:                                 // act27: Add object's value to score
 		_vm->adjustScore(_vm->_object->_objects[action->a27.objNumb].objValue);
 		break;
@@ -373,6 +321,61 @@
 		_vm->_object->_objects[action->a38.lipsObjNumb].screenIndex = *_vm->_screen_p; // Don't forget screen!
 		_vm->_object->_objects[action->a38.lipsObjNumb].cycling = CYCLE_FORWARD;
 		break;
+	case INIT_STORY_MODE:                           // act39: Init story_mode flag
+		// This is similar to the QUIET path mode, except that it is
+		// independant of it and it additionally disables the ">" prompt
+		gameStatus.storyModeFl = action->a39.storyModeFl;
+
+		// End the game after story if this is special vendor demo mode
+		if (gameStatus.demoFl && action->a39.storyModeFl == false)
+			_vm->endGame();
+		break;
+	case WARN:                                      // act40: Text box (CF TEXT)
+		Utils::Box(BOX_OK, "%s", _vm->_file->fetchString(action->a40.stringIndex));
+		break;
+	case COND_BONUS:                                // act41: Perform action if got bonus
+		if (_vm->_points[action->a41.BonusIndex].scoredFl)
+			insertActionList(action->a41.actPassIndex);
+		else
+			insertActionList(action->a41.actFailIndex);
+		break;
+	case TEXT_TAKE:                                 // act42: Text box with "take" message
+		Utils::Box(BOX_ANY, TAKE_TEXT, _vm->_arrayNouns[_vm->_object->_objects[action->a42.objNumb].nounIndex][TAKE_NAME]);
+		break;
+	case YESNO:                                     // act43: Prompt user for Yes or No
+		warning("doAction(act43) - Yes/No Box");
+		if (Utils::Box(BOX_YESNO, "%s", _vm->_file->fetchString(action->a43.promptIndex)) != 0)
+			insertActionList(action->a43.actYesIndex);
+		else
+			insertActionList(action->a43.actNoIndex);
+		break;
+	case STOP_ROUTE:                                // act44: Stop any route in progress
+		gameStatus.routeIndex = -1;
+		break;
+	case COND_ROUTE:                                // act45: Conditional on route in progress
+		if (gameStatus.routeIndex >= action->a45.routeIndex)
+			insertActionList(action->a45.actPassIndex);
+		else
+			insertActionList(action->a45.actFailIndex);
+		break;
+	case INIT_JUMPEXIT:                             // act46: Init status.jumpexit flag
+		// This is to allow left click on exit to get there immediately
+		// For example the plane crash in Hugo2 where hero is invisible
+		// Couldn't use INVISIBLE flag since conflicts with boat in Hugo1
+		gameStatus.jumpExitFl = action->a46.jumpExitFl;
+		break;
+	case INIT_VIEW:                                 // act47: Init object.viewx, viewy, dir
+		_vm->_object->_objects[action->a47.objNumb].viewx = action->a47.viewx;
+		_vm->_object->_objects[action->a47.objNumb].viewy = action->a47.viewy;
+		_vm->_object->_objects[action->a47.objNumb].direction = action->a47.direction;
+		break;
+	case INIT_OBJ_FRAME:                            // act48: Set seq,frame number to use
+		// Note: Don't set a sequence at time 0 of a new screen, it causes
+		// problems clearing the boundary bits of the object!  t>0 is safe
+		_vm->_object->_objects[action->a48.objNumb].currImagePtr = _vm->_object->_objects[action->a48.objNumb].seqList[action->a48.seqIndex].seqPtr;
+		for (dx = 0; dx < action->a48.frameIndex; dx++)
+			_vm->_object->_objects[action->a48.objNumb].currImagePtr = _vm->_object->_objects[action->a48.objNumb].currImagePtr->nextSeqPtr;
+		break;
 	case OLD_SONG:
 		//TODO For Hugo 1 and Hugo2 DOS: The songs were not stored in a DAT file, but directly as
 		//strings. the current play_music should be modified to use a strings instead of reading
@@ -392,4 +395,56 @@
 		return wrkEvent;                            // Return next event ptr
 	}
 }
+
+/**
+* Insert the action pointed to by p into the timer event queue
+* The queue goes from head (earliest) to tail (latest) timewise
+*/
+void Scheduler_v2d::insertAction(act *action) {
+	debugC(1, kDebugSchedule, "insertAction() - Action type A%d", action->a0.actType);
+
+	// First, get and initialise the event structure
+	event_t *curEvent = getQueue();
+	curEvent->action = action;
+	switch (action->a0.actType) {                   // Assign whether local or global
+	case AGSCHEDULE:
+		curEvent->localActionFl = false;            // Lasts over a new screen
+		break;
+	default:
+		curEvent->localActionFl = true;             // Rest are for current screen only
+		break;
+	}
+
+	curEvent->time = action->a0.timer + getTicks(); // Convert rel to abs time
+
+	// Now find the place to insert the event
+	if (!_tailEvent) {                              // Empty queue
+		_tailEvent = _headEvent = curEvent;
+		curEvent->nextEvent = curEvent->prevEvent = 0;
+	} else {
+		event_t *wrkEvent = _tailEvent;             // Search from latest time back
+		bool found = false;
+
+		while (wrkEvent && !found) {
+			if (wrkEvent->time <= curEvent->time) { // Found if new event later
+				found = true;
+				if (wrkEvent == _tailEvent)         // New latest in list
+					_tailEvent = curEvent;
+				else
+					wrkEvent->nextEvent->prevEvent = curEvent;
+				curEvent->nextEvent = wrkEvent->nextEvent;
+				wrkEvent->nextEvent = curEvent;
+				curEvent->prevEvent = wrkEvent;
+			}
+			wrkEvent = wrkEvent->prevEvent;
+		}
+
+		if (!found) {                               // Must be earliest in list
+			_headEvent->prevEvent = curEvent;       // So insert as new head
+			curEvent->nextEvent = _headEvent;
+			curEvent->prevEvent = 0;
+			_headEvent = curEvent;
+		}
+	}
+}
 } // End of namespace Hugo

Modified: scummvm/trunk/engines/hugo/schedule_v3d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule_v3d.cpp	2010-11-26 15:06:35 UTC (rev 54501)
+++ scummvm/trunk/engines/hugo/schedule_v3d.cpp	2010-11-26 22:15:31 UTC (rev 54502)
@@ -57,272 +57,4 @@
 	return "Copyright 1992, Gray Design Associates";
 }
 
-/**
-* This function performs the action in the event structure pointed to by p
-* It dequeues the event and returns it to the free list.  It returns a ptr
-* to the next action in the list, except special case of NEW_SCREEN
-*/
-event_t *Scheduler_v3d::doAction(event_t *curEvent) {
-	debugC(1, kDebugSchedule, "doAction - Event action type : %d", curEvent->action->a0.actType);
-
-	status_t &gameStatus = _vm->getGameStatus();
-	act *action = curEvent->action;
-	char     *response;                             // User's response string
-	object_t *obj1;
-	object_t *obj2;
-	int       dx, dy;
-	event_t  *wrkEvent;                             // Save ev_p->next_p for return
-	event_t  *saveEvent;                            // Used in DEL_EVENTS
-
-	switch (action->a0.actType) {
-	case ANULL:                                     // Big NOP from DEL_EVENTS
-		break;
-	case ASCHEDULE:                                 // act0: Schedule an action list
-		insertActionList(action->a0.actIndex);
-		break;
-	case START_OBJ:                                 // act1: Start an object cycling
-		_vm->_object->_objects[action->a1.objNumb].cycleNumb = action->a1.cycleNumb;
-		_vm->_object->_objects[action->a1.objNumb].cycling = action->a1.cycle;
-		break;
-	case INIT_OBJXY:                                // act2: Initialise an object
-		_vm->_object->_objects[action->a2.objNumb].x = action->a2.x;          // Coordinates
-		_vm->_object->_objects[action->a2.objNumb].y = action->a2.y;
-		break;
-	case PROMPT: {                                  // act3: Prompt user for key phrase
-		response = Utils::Box(BOX_PROMPT, "%s", _vm->_file->fetchString(action->a3.promptIndex));
-
-		warning("STUB: doAction(act3), expecting answer %s", _vm->_file->fetchString(action->a3.responsePtr[0]));
-
-		// TODO: The answer of the player is not handled currently! Once it'll be read in the messageBox, uncomment this block
-#if 0
-		bool      found;
-		char     *tmpStr;                           // General purpose string ptr
-
-		for (found = false, dx = 0; !found && (action->a3.responsePtr[dx] != -1); dx++) {
-			tmpStr = _vm->_file->fetchString(action->a3.responsePtr[dx]);
-			if (strstr(Utils::strlwr(response) , tmpStr))
-				found = true;
-		}
-
-		if (found)
-			insertActionList(action->a3.actPassIndex);
-		else
-			insertActionList(action->a3.actFailIndex);
-#endif
-
-		// HACK: As the answer is not read, currently it's always considered correct
-		insertActionList(action->a3.actPassIndex);
-		break;
-		}
-	case BKGD_COLOR:                                // act4: Set new background color
-		_vm->_screen->setBackgroundColor(action->a4.newBackgroundColor);
-		break;
-	case INIT_OBJVXY:                               // act5: Initialise an object velocity
-		_vm->_object->setVelocity(action->a5.objNumb, action->a5.vx, action->a5.vy);
-		break;
-	case INIT_CARRY:                                // act6: Initialise an object
-		_vm->_object->setCarry(action->a6.objNumb, action->a6.carriedFl);  // carried status
-		break;
-	case INIT_HF_COORD:                             // act7: Initialise an object to hero's "feet" coords
-		_vm->_object->_objects[action->a7.objNumb].x = _vm->_hero->x - 1;
-		_vm->_object->_objects[action->a7.objNumb].y = _vm->_hero->y + _vm->_hero->currImagePtr->y2 - 1;
-		_vm->_object->_objects[action->a7.objNumb].screenIndex = *_vm->_screen_p;  // Don't forget screen!
-		break;
-	case NEW_SCREEN:                                // act8: Start new screen
-		newScreen(action->a8.screenIndex);
-		break;
-	case INIT_OBJSTATE:                             // act9: Initialise an object state
-		_vm->_object->_objects[action->a9.objNumb].state = action->a9.newState;
-		break;
-	case INIT_PATH:                                 // act10: Initialise an object path and velocity
-		_vm->_object->setPath(action->a10.objNumb, (path_t) action->a10.newPathType, action->a10.vxPath, action->a10.vyPath);
-		break;
-	case COND_R:                                    // act11: action lists conditional on object state
-		if (_vm->_object->_objects[action->a11.objNumb].state == action->a11.stateReq)
-			insertActionList(action->a11.actPassIndex);
-		else
-			insertActionList(action->a11.actFailIndex);
-		break;
-	case TEXT:                                      // act12: Text box (CF WARN)
-		Utils::Box(BOX_ANY, "%s", _vm->_file->fetchString(action->a12.stringIndex));   // Fetch string from file
-		break;
-	case SWAP_IMAGES:                               // act13: Swap 2 object images
-		_vm->_object->swapImages(action->a13.obj1, action->a13.obj2);
-		break;
-	case COND_SCR:                                  // act14: Conditional on current screen
-		if (_vm->_object->_objects[action->a14.objNumb].screenIndex == action->a14.screenReq)
-			insertActionList(action->a14.actPassIndex);
-		else
-			insertActionList(action->a14.actFailIndex);
-		break;
-	case AUTOPILOT:                                 // act15: Home in on a (stationary) object
-		// object p1 will home in on object p2
-		obj1 = &_vm->_object->_objects[action->a15.obj1];
-		obj2 = &_vm->_object->_objects[action->a15.obj2];
-		obj1->pathType = AUTO;
-		dx = obj1->x + obj1->currImagePtr->x1 - obj2->x - obj2->currImagePtr->x1;
-		dy = obj1->y + obj1->currImagePtr->y1 - obj2->y - obj2->currImagePtr->y1;
-
-		if (dx == 0)                                // Don't EVER divide by zero!
-			dx = 1;
-		if (dy == 0)
-			dy = 1;
-
-		if (abs(dx) > abs(dy)) {
-			obj1->vx = action->a15.dx * -SIGN(dx);
-			obj1->vy = abs((action->a15.dy * dy) / dx) * -SIGN(dy);
-		} else {
-			obj1->vy = action->a15.dy * -SIGN(dy);
-			obj1->vx = abs((action->a15.dx * dx) / dy) * -SIGN(dx);
-		}
-		break;
-	case INIT_OBJ_SEQ:                              // act16: Set sequence number to use
-		// Note: Don't set a sequence at time 0 of a new screen, it causes
-		// problems clearing the boundary bits of the object!  t>0 is safe
-		_vm->_object->_objects[action->a16.objNumb].currImagePtr = _vm->_object->_objects[action->a16.objNumb].seqList[action->a16.seqIndex].seqPtr;
-		break;
-	case SET_STATE_BITS:                            // act17: OR mask with curr obj state
-		_vm->_object->_objects[action->a17.objNumb].state |= action->a17.stateMask;
-		break;
-	case CLEAR_STATE_BITS:                          // act18: AND ~mask with curr obj state
-		_vm->_object->_objects[action->a18.objNumb].state &= ~action->a18.stateMask;
-		break;
-	case TEST_STATE_BITS:                           // act19: If all bits set, do apass else afail
-		if ((_vm->_object->_objects[action->a19.objNumb].state & action->a19.stateMask) == action->a19.stateMask)
-			insertActionList(action->a19.actPassIndex);
-		else
-			insertActionList(action->a19.actFailIndex);
-		break;
-	case DEL_EVENTS:                                // act20: Remove all events of this action type
-		// Note: actions are not deleted here, simply turned into NOPs!
-		wrkEvent = _headEvent;                      // The earliest event
-		while (wrkEvent) {                          // While events found in list
-			saveEvent = wrkEvent->nextEvent;
-			if (wrkEvent->action->a20.actType == action->a20.actTypeDel)
-				delQueue(wrkEvent);
-			wrkEvent = saveEvent;
-		}
-		break;
-	case GAMEOVER:                                  // act21: Game over!
-		// NOTE: Must wait at least 1 tick before issuing this action if
-		// any objects are to be made invisible!
-		gameStatus.gameOverFl = true;
-		break;
-	case INIT_HH_COORD:                             // act22: Initialise an object to hero's actual coords
-		_vm->_object->_objects[action->a22.objNumb].x = _vm->_hero->x;
-		_vm->_object->_objects[action->a22.objNumb].y = _vm->_hero->y;
-		_vm->_object->_objects[action->a22.objNumb].screenIndex = *_vm->_screen_p;// Don't forget screen!
-		break;
-	case EXIT:                                      // act23: Exit game back to DOS
-		_vm->endGame();
-		break;
-	case BONUS:                                     // act24: Get bonus score for action
-		processBonus(action->a24.pointIndex);
-		break;
-	case COND_BOX:                                  // act25: Conditional on bounding box
-		obj1 = &_vm->_object->_objects[action->a25.objNumb];
-		dx = obj1->x + obj1->currImagePtr->x1;
-		dy = obj1->y + obj1->currImagePtr->y2;
-		if ((dx >= action->a25.x1) && (dx <= action->a25.x2) &&
-		        (dy >= action->a25.y1) && (dy <= action->a25.y2))
-			insertActionList(action->a25.actPassIndex);
-		else
-			insertActionList(action->a25.actFailIndex);
-		break;
-//	case SOUND:                                     // act26: Play a sound (or tune)
-//		if (action->a26.soundIndex < _vm->_tunesNbr)
-//			_vm->_sound->playMusic(action->a26.soundIndex);
-//		else
-//			_vm->_sound->playSound(action->a26.soundIndex, BOTH_CHANNELS, MED_PRI);
-//		break;
-	case ADD_SCORE:                                 // act27: Add object's value to score
-		_vm->adjustScore(_vm->_object->_objects[action->a27.objNumb].objValue);
-		break;
-	case SUB_SCORE:                                 // act28: Subtract object's value from score
-		_vm->adjustScore(-_vm->_object->_objects[action->a28.objNumb].objValue);
-		break;
-	case COND_CARRY:                                // act29: Conditional on object being carried
-		if (_vm->_object->isCarried(action->a29.objNumb))
-			insertActionList(action->a29.actPassIndex);
-		else
-			insertActionList(action->a29.actFailIndex);
-		break;
-	case INIT_MAZE:                                 // act30: Enable and init maze structure
-		_maze.enabledFl = true;
-		_maze.size = action->a30.mazeSize;
-		_maze.x1 = action->a30.x1;
-		_maze.y1 = action->a30.y1;
-		_maze.x2 = action->a30.x2;
-		_maze.y2 = action->a30.y2;
-		_maze.x3 = action->a30.x3;
-		_maze.x4 = action->a30.x4;
-		_maze.firstScreenIndex = action->a30.firstScreenIndex;
-		break;
-	case EXIT_MAZE:                                 // act31: Disable maze mode
-		_maze.enabledFl = false;
-		break;
-	case INIT_PRIORITY:
-		_vm->_object->_objects[action->a32.objNumb].priority = action->a32.priority;
-		break;
-	case INIT_SCREEN:
-		_vm->_object->_objects[action->a33.objNumb].screenIndex = action->a33.screenIndex;
-		break;
-	case AGSCHEDULE:                                // act34: Schedule a (global) action list
-		insertActionList(action->a34.actIndex);
-		break;
-	case REMAPPAL:                                  // act35: Remap a palette color
-		_vm->_screen->remapPal(action->a35.oldColorIndex, action->a35.newColorIndex);
-		break;
-	case COND_NOUN:                                 // act36: Conditional on noun mentioned
-		if (_vm->_parser->isWordPresent(_vm->_arrayNouns[action->a36.nounIndex]))
-			insertActionList(action->a36.actPassIndex);
-		else
-			insertActionList(action->a36.actFailIndex);
-		break;
-	case SCREEN_STATE:                              // act37: Set new screen state
-		_vm->_screenStates[action->a37.screenIndex] = action->a37.newState;
-		break;
-	case INIT_LIPS:                                 // act38: Position lips on object
-		_vm->_object->_objects[action->a38.lipsObjNumb].x = _vm->_object->_objects[action->a38.objNumb].x + action->a38.dxLips;
-		_vm->_object->_objects[action->a38.lipsObjNumb].y = _vm->_object->_objects[action->a38.objNumb].y + action->a38.dyLips;
-		_vm->_object->_objects[action->a38.lipsObjNumb].screenIndex = *_vm->_screen_p; // Don't forget screen!
-		_vm->_object->_objects[action->a38.lipsObjNumb].cycling = CYCLE_FORWARD;
-		break;
-	case INIT_STORY_MODE:                           // act39: Init story_mode flag
-		// This is similar to the QUIET path mode, except that it is
-		// independant of it and it additionally disables the ">" prompt
-		gameStatus.storyModeFl = action->a39.storyModeFl;
-
-		// End the game after story if this is special vendor demo mode
-		if (gameStatus.demoFl && action->a39.storyModeFl == false)
-			_vm->endGame();
-		break;
-	case WARN:                                      // act40: Text box (CF TEXT)
-		Utils::Box(BOX_OK, "%s", _vm->_file->fetchString(action->a40.stringIndex));
-		break;
-	case COND_BONUS:                                // act41: Perform action if got bonus
-		if (_vm->_points[action->a41.BonusIndex].scoredFl)
-			insertActionList(action->a41.actPassIndex);
-		else
-			insertActionList(action->a41.actFailIndex);
-		break;
-	case OLD_SONG:
-		//TODO For Hugo 1 and Hugo2 DOS: The songs were not stored in a DAT file, but directly as
-		//strings. the current play_music should be modified to use a strings instead of reading
-		//the file, in those cases. This replaces, for those DOS versions, act26.
-		warning("STUB: doAction(act49)");
-		break;
-	default:
-		error("An error has occurred: %s", "doAction");
-		break;
-	}
-
-	if (action->a0.actType == NEW_SCREEN) {         // New_screen() deletes entire list
-		return 0;                                   // next_p = 0 since list now empty
-	} else {
-		wrkEvent = curEvent->nextEvent;
-		delQueue(curEvent);                         // Return event to free list
-		return wrkEvent;                            // Return next event ptr
-	}
-}
 } // End of namespace Hugo


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