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

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Wed Jan 26 21:03:13 CET 2011


Revision: 55555
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55555&view=rev
Author:   strangerke
Date:     2011-01-26 20:03:12 +0000 (Wed, 26 Jan 2011)

Log Message:
-----------
HUGO: Ensure savegames are not impacted by unexpected ANULL actions, by replacing delEventType() and delQueue() in H1 Dos

Modified Paths:
--------------
    scummvm/trunk/engines/hugo/schedule.cpp
    scummvm/trunk/engines/hugo/schedule.h

Modified: scummvm/trunk/engines/hugo/schedule.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule.cpp	2011-01-26 19:13:53 UTC (rev 55554)
+++ scummvm/trunk/engines/hugo/schedule.cpp	2011-01-26 20:03:12 UTC (rev 55555)
@@ -1330,31 +1330,27 @@
 	}
 }
 
-Scheduler_v1d::Scheduler_v1d(HugoEngine *vm) : Scheduler(vm) {
-}
-
-Scheduler_v1d::~Scheduler_v1d() {
-}
-
-const char *Scheduler_v1d::getCypher() {
-	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
-* an event from the middle of the queue, merely overwrite its action type
-* to be ANULL
+* Historical note:  Originally event p was assumed to be at head of queue
+* (i.e. earliest) since all events were deleted in order when proceeding to
+* a new screen.  To delete an event from the middle of the queue, the action
+* was overwritten to be ANULL.  With the advent of GLOBAL events, delQueue
+* was modified to allow deletes anywhere in the list, and the DEL_EVENT
+* action was modified to perform the actual delete.
 */
-void Scheduler_v1d::delQueue(event_t *curEvent) {
+void Scheduler::delQueue(event_t *curEvent) {
 	debugC(4, kDebugSchedule, "delQueue()");
 
-	if (curEvent == _headEvent)                     // If p was the head ptr
+	if (curEvent == _headEvent) {                   // If p was the head ptr
 		_headEvent = curEvent->nextEvent;           // then make new head_p
+	} else {                                        // Unlink p
+		curEvent->prevEvent->nextEvent = curEvent->nextEvent;
+		if (curEvent->nextEvent)
+			curEvent->nextEvent->prevEvent = curEvent->prevEvent;
+		else
+			_tailEvent = curEvent->prevEvent;
+	}
 
 	if (_headEvent)
 		_headEvent->prevEvent = 0;                  // Mark end of list
@@ -1367,6 +1363,33 @@
 	_freeEvent = curEvent;
 }
 
+void Scheduler::delEventType(action_t actTypeDel) {
+	// Note: actions are not deleted here, simply turned into NOPs!
+	event_t *wrkEvent = _headEvent;                 // The earliest event
+	event_t *saveEvent;
+
+	while (wrkEvent) {                              // While events found in list
+		saveEvent = wrkEvent->nextEvent;
+		if (wrkEvent->action->a20.actType == actTypeDel)
+			delQueue(wrkEvent);
+		wrkEvent = saveEvent;
+	}
+}
+
+Scheduler_v1d::Scheduler_v1d(HugoEngine *vm) : Scheduler(vm) {
+}
+
+Scheduler_v1d::~Scheduler_v1d() {
+}
+
+const char *Scheduler_v1d::getCypher() {
+	return "Copyright (c) 1990, Gray Design Associates";
+}
+
+uint32 Scheduler_v1d::getTicks() {
+	return getDosTicks(false);
+}
+
 /**
 * 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
@@ -1382,16 +1405,6 @@
 		curEvent = doAction(curEvent);              // Perform the action (returns next_p)
 }
 
-void Scheduler_v1d::delEventType(action_t actTypeDel) {
-	// Note: actions are not deleted here, simply turned into NOPs!
-	event_t *wrkEvent = _headEvent;                 // The earliest event
-	while (wrkEvent) {                              // While events found in list
-		if (wrkEvent->action->a20.actType == actTypeDel)
-			wrkEvent->action->a20.actType = ANULL;
-		wrkEvent = wrkEvent->nextEvent;
-	}
-}
-
 void Scheduler_v1d::promptAction(act *action) {
 	Utils::Box(kBoxPrompt, "%s", _vm->_file->fetchString(action->a3.promptIndex));
 
@@ -1442,52 +1455,6 @@
 	return "Copyright 1991, Gray Design Associates";
 }
 
-/**
-* Delete an event structure (i.e. return it to the free list)
-* Historical note:  Originally event p was assumed to be at head of queue
-* (i.e. earliest) since all events were deleted in order when proceeding to
-* a new screen.  To delete an event from the middle of the queue, the action
-* was overwritten to be ANULL.  With the advent of GLOBAL events, delQueue
-* was modified to allow deletes anywhere in the list, and the DEL_EVENT
-* action was modified to perform the actual delete.
-*/
-void Scheduler_v2d::delQueue(event_t *curEvent) {
-	debugC(4, kDebugSchedule, "delQueue()");
-
-	if (curEvent == _headEvent) {                   // If p was the head ptr
-		_headEvent = curEvent->nextEvent;           // then make new head_p
-	} else {                                        // Unlink p
-		curEvent->prevEvent->nextEvent = curEvent->nextEvent;
-		if (curEvent->nextEvent)
-			curEvent->nextEvent->prevEvent = curEvent->prevEvent;
-		else
-			_tailEvent = curEvent->prevEvent;
-	}
-
-	if (_headEvent)
-		_headEvent->prevEvent = 0;                  // Mark end of list
-	else
-		_tailEvent = 0;                             // Empty queue
-
-	curEvent->nextEvent = _freeEvent;               // Return p to free list
-	if (_freeEvent)                                 // Special case, if free list was empty
-		_freeEvent->prevEvent = curEvent;
-	_freeEvent = curEvent;
-}
-
-void Scheduler_v2d::delEventType(action_t actTypeDel) {
-	// Note: actions are not deleted here, simply turned into NOPs!
-	event_t *wrkEvent = _headEvent;                 // The earliest event
-	event_t *saveEvent;
-
-	while (wrkEvent) {                              // While events found in list
-		saveEvent = wrkEvent->nextEvent;
-		if (wrkEvent->action->a20.actType == actTypeDel)
-			delQueue(wrkEvent);
-		wrkEvent = saveEvent;
-	}
-}
-
 void Scheduler_v2d::promptAction(act *action) {
 	Utils::Box(kBoxPrompt, "%s", _vm->_file->fetchString(action->a3.promptIndex));
 	warning("STUB: doAction(act3), expecting answer %s", _vm->_file->fetchString(action->a3.responsePtr[0]));

Modified: scummvm/trunk/engines/hugo/schedule.h
===================================================================
--- scummvm/trunk/engines/hugo/schedule.h	2011-01-26 19:13:53 UTC (rev 55554)
+++ scummvm/trunk/engines/hugo/schedule.h	2011-01-26 20:03:12 UTC (rev 55555)
@@ -495,8 +495,6 @@
 
 	virtual uint32 getTicks() = 0;
 
-	virtual void delEventType(action_t actTypeDel) = 0;
-	virtual void delQueue(event_t *curEvent) = 0;
 	virtual void promptAction(act *action) = 0;
 
 	event_t *doAction(event_t *curEvent);
@@ -505,6 +503,8 @@
 	uint32 getDosTicks(bool updateFl);
 	uint32 getWinTicks();
 
+	void delEventType(action_t actTypeDel);
+	void delQueue(event_t *curEvent);
 	void insertAction(act *action);
 };
 
@@ -521,8 +521,6 @@
 
 	virtual uint32 getTicks();
 
-	virtual void delEventType(action_t actTypeDel);
-	virtual void delQueue(event_t *curEvent);
 	virtual void promptAction(act *action);
 };
 
@@ -536,8 +534,6 @@
 protected:
 	virtual const char *getCypher();
 	
-	void delEventType(action_t actTypeDel);
-	void delQueue(event_t *curEvent);
 	void promptAction(act *action);
 };
 


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