aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/events.cpp
diff options
context:
space:
mode:
authorAndrew Kurushin2010-10-23 23:07:10 +0000
committerAndrew Kurushin2010-10-23 23:07:10 +0000
commitb10cd22d510e063d647ac03930800e3df7c514e8 (patch)
tree0d082b18a03abb0603e634b28b03c941ca5775a4 /engines/saga/events.cpp
parent5b7c5e429871ce09465150ef9cca8e6cbeb3f259 (diff)
downloadscummvm-rg350-b10cd22d510e063d647ac03930800e3df7c514e8.tar.gz
scummvm-rg350-b10cd22d510e063d647ac03930800e3df7c514e8.tar.bz2
scummvm-rg350-b10cd22d510e063d647ac03930800e3df7c514e8.zip
SAGA: replace Events malloc base linked list with Common::List
svn-id: r53751
Diffstat (limited to 'engines/saga/events.cpp')
-rw-r--r--engines/saga/events.cpp103
1 files changed, 32 insertions, 71 deletions
diff --git a/engines/saga/events.cpp b/engines/saga/events.cpp
index 057c602608..193d20289d 100644
--- a/engines/saga/events.cpp
+++ b/engines/saga/events.cpp
@@ -55,7 +55,7 @@ Events::~Events() {
// Function to process event list once per frame.
// First advances event times, then processes each event with the appropriate
// handler depending on the type of event.
-int Events::handleEvents(long msec) {
+void Events::handleEvents(long msec) {
long delta_time;
int result;
@@ -64,7 +64,7 @@ int Events::handleEvents(long msec) {
// Process each event in list
for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) {
- Event *event_p = &*eventi;
+ Event *event_p = &eventi->front();
// Call the appropriate event handler for the specific event type
switch (event_p->type) {
@@ -95,17 +95,15 @@ int Events::handleEvents(long msec) {
// handler
if ((result == kEvStDelete) || (result == kEvStInvalidCode)) {
// If there is no event chain, delete the base event.
- if (event_p->chain == NULL) {
+ if (eventi->size() < 2) {
eventi = _eventList.reverse_erase(eventi);
} else {
// If there is an event chain present, move the next event
// in the chain up, adjust it by the previous delta time,
// and reprocess the event
delta_time = event_p->time;
- Event *from_chain = event_p->chain;
- memcpy(event_p, from_chain, sizeof(*event_p));
- free(from_chain);
-
+ eventi->pop_front();
+ event_p = &eventi->front();
event_p->time += delta_time;
--eventi;
}
@@ -113,8 +111,6 @@ int Events::handleEvents(long msec) {
break;
}
}
-
- return SUCCESS;
}
int Events::handleContinuous(Event *event) {
@@ -569,120 +565,85 @@ int Events::handleInterval(Event *event) {
// Schedules an event in the event list; returns a pointer to the scheduled
// event suitable for chaining if desired.
-Event *Events::queue(Event *event) {
- Event *queuedEvent;
+EventColumns *Events::queue(const Event &event) {
+ EventColumns tmp;
+
+ _eventList.push_back(tmp);
+ EventColumns *res;
+ res = &_eventList.back();
+ res->push_back(event);
- _eventList.push_back(*event);
- queuedEvent = &*--_eventList.end();
- initializeEvent(queuedEvent);
+ initializeEvent(res->back());
- return queuedEvent;
+ return res;
}
// Places a 'add_event' on the end of an event chain given by 'head_event'
// (head_event may be in any position in the event chain)
-Event *Events::chain(Event *headEvent, Event *addEvent) {
- if (headEvent == NULL) {
+EventColumns *Events::chain(EventColumns *eventColumns, const Event &addEvent) {
+ if (eventColumns == NULL) {
return queue(addEvent);
}
- Event *walkEvent;
- for (walkEvent = headEvent; walkEvent->chain != NULL; walkEvent = walkEvent->chain) {
- continue;
- }
-
- walkEvent->chain = (Event *)malloc(sizeof(*walkEvent->chain));
- *walkEvent->chain = *addEvent;
- initializeEvent(walkEvent->chain);
+ eventColumns->push_back(addEvent);
+ initializeEvent(eventColumns->back());
- return walkEvent->chain;
+ return eventColumns;
}
-int Events::initializeEvent(Event *event) {
- event->chain = NULL;
- switch (event->type) {
+void Events::initializeEvent(Event &event) {
+ switch (event.type) {
case kEvTOneshot:
break;
case kEvTContinuous:
case kEvTImmediate:
- event->time += event->duration;
+ event.time += event.duration;
break;
case kEvTInterval:
break;
- default:
- return FAILURE;
}
-
- return SUCCESS;
}
-int Events::clearList(bool playQueuedMusic) {
- Event *chain_walk;
- Event *next_chain;
-
+void Events::clearList(bool playQueuedMusic) {
// Walk down event list
for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) {
// Only remove events not marked kEvFNoDestory (engine events)
- if (!(eventi->code & kEvFNoDestory)) {
+ if (!(eventi->front().code & kEvFNoDestory)) {
// Handle queued music change events before deleting them
// This can happen in IHNM by music events set by sfQueueMusic()
// Fixes bug #2057987 - "IHNM: Music stops in Ellen's chapter"
- if (playQueuedMusic && ((eventi->code & EVENT_MASK) == kMusicEvent)) {
+ if (playQueuedMusic && ((eventi->front().code & EVENT_MASK) == kMusicEvent)) {
_vm->_music->stop();
- if (eventi->op == kEventPlay)
- _vm->_music->play(eventi->param, (MusicFlags)eventi->param2);
+ if (eventi->front().op == kEventPlay)
+ _vm->_music->play(eventi->front().param, (MusicFlags)eventi->front().param2);
}
- // Remove any events chained off this one
- for (chain_walk = eventi->chain; chain_walk != NULL; chain_walk = next_chain) {
- next_chain = chain_walk->chain;
- free(chain_walk);
- }
eventi = _eventList.reverse_erase(eventi);
}
}
-
- return SUCCESS;
}
// Removes all events from the list (even kEvFNoDestory)
-int Events::freeList() {
- Event *chain_walk;
- Event *next_chain;
-
- // Walk down event list
- EventList::iterator eventi = _eventList.begin();
- while (eventi != _eventList.end()) {
-
- // Remove any events chained off this one */
- for (chain_walk = eventi->chain; chain_walk != NULL; chain_walk = next_chain) {
- next_chain = chain_walk->chain;
- free(chain_walk);
- }
- eventi = _eventList.erase(eventi);
- }
-
- return SUCCESS;
+void Events::freeList() {
+ _eventList.clear();
}
// Walks down the event list, updating event times by 'msec'.
-int Events::processEventTime(long msec) {
+void Events::processEventTime(long msec) {
uint16 event_count = 0;
for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) {
- eventi->time -= msec;
+ eventi->front().time -= msec;
event_count++;
- if (eventi->type == kEvTImmediate)
+ if (eventi->front().type == kEvTImmediate)
break;
if (event_count > EVENT_WARNINGCOUNT) {
warning("Event list exceeds %u", EVENT_WARNINGCOUNT);
}
}
-
- return SUCCESS;
}
} // End of namespace Saga