aboutsummaryrefslogtreecommitdiff
path: root/engines/hugo
diff options
context:
space:
mode:
authorArnaud Boutonné2011-01-26 20:03:12 +0000
committerArnaud Boutonné2011-01-26 20:03:12 +0000
commitb0def1089238259aba6da3c839ac7bda689a3468 (patch)
tree7184466acb07b46959e084b1ed2473cecacc1230 /engines/hugo
parent214d8f1e3e89fdf36585e070cbe5bc20b36d6b40 (diff)
downloadscummvm-rg350-b0def1089238259aba6da3c839ac7bda689a3468.tar.gz
scummvm-rg350-b0def1089238259aba6da3c839ac7bda689a3468.tar.bz2
scummvm-rg350-b0def1089238259aba6da3c839ac7bda689a3468.zip
HUGO: Ensure savegames are not impacted by unexpected ANULL actions, by replacing delEventType() and delQueue() in H1 Dos
svn-id: r55555
Diffstat (limited to 'engines/hugo')
-rw-r--r--engines/hugo/schedule.cpp117
-rw-r--r--engines/hugo/schedule.h8
2 files changed, 44 insertions, 81 deletions
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
index f23923589a..d182635ff1 100644
--- a/engines/hugo/schedule.cpp
+++ b/engines/hugo/schedule.cpp
@@ -1330,31 +1330,27 @@ event_t *Scheduler::doAction(event_t *curEvent) {
}
}
-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 @@ void Scheduler_v1d::delQueue(event_t *curEvent) {
_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 @@ void Scheduler_v1d::runScheduler() {
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 @@ const char *Scheduler_v2d::getCypher() {
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]));
diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h
index f3d24cad77..5e36a7db01 100644
--- a/engines/hugo/schedule.h
+++ b/engines/hugo/schedule.h
@@ -495,8 +495,6 @@ protected:
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 @@ protected:
uint32 getDosTicks(bool updateFl);
uint32 getWinTicks();
+ void delEventType(action_t actTypeDel);
+ void delQueue(event_t *curEvent);
void insertAction(act *action);
};
@@ -521,8 +521,6 @@ protected:
virtual uint32 getTicks();
- virtual void delEventType(action_t actTypeDel);
- virtual void delQueue(event_t *curEvent);
virtual void promptAction(act *action);
};
@@ -536,8 +534,6 @@ public:
protected:
virtual const char *getCypher();
- void delEventType(action_t actTypeDel);
- void delQueue(event_t *curEvent);
void promptAction(act *action);
};