diff options
author | Arnaud Boutonné | 2011-01-26 20:03:12 +0000 |
---|---|---|
committer | Arnaud Boutonné | 2011-01-26 20:03:12 +0000 |
commit | b0def1089238259aba6da3c839ac7bda689a3468 (patch) | |
tree | 7184466acb07b46959e084b1ed2473cecacc1230 | |
parent | 214d8f1e3e89fdf36585e070cbe5bc20b36d6b40 (diff) | |
download | scummvm-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
-rw-r--r-- | engines/hugo/schedule.cpp | 117 | ||||
-rw-r--r-- | engines/hugo/schedule.h | 8 |
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); }; |