From b10cd22d510e063d647ac03930800e3df7c514e8 Mon Sep 17 00:00:00 2001 From: Andrew Kurushin Date: Sat, 23 Oct 2010 23:07:10 +0000 Subject: SAGA: replace Events malloc base linked list with Common::List svn-id: r53751 --- engines/saga/events.cpp | 103 +++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 71 deletions(-) (limited to 'engines/saga/events.cpp') 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 -- cgit v1.2.3