int Events::handleImmediate(Event *event) { double event_pc = 0.0; // Event completion percentage bool event_done = false; // Duration might be 0 so dont do division then if(event->duration != 0) { event_pc = ((double)event->duration - event->time) / event->duration; } else { // Just make sure that event_pc is 1.0 so event_done is true event_pc = 1.0; } if (event_pc >= 1.0) { // Cap percentage to 100 event_pc = 1.0; event_done = true; } if (event_pc < 0.0) { // Event not signaled, skip it return kEvStBreak; } else if (!(event->code & kEvFSignaled)) { // Signal event event->code |= kEvFSignaled; event_pc = 0.0; } switch (event->code & EVENT_MASK) { case kPalEvent: switch (event->op) { case kEventBlackToPal: _vm->_gfx->blackToPal((PalEntry *)event->data, event_pc); break; case kEventPalToBlack: _vm->_gfx->palToBlack((PalEntry *)event->data, event_pc); break; default: break; } break; case kScriptEvent: case kBgEvent: case kInterfaceEvent: handleOneShot(event); event_done = true; break; default: break; } if (event_done) { return kEvStDelete; } return kEvStBreak; }
// 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. void Events::handleEvents(long msec) { long delta_time; int result; // Advance event times processEventTime(msec); // Process each event in list for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) { Event *event_p = &eventi->front(); // Call the appropriate event handler for the specific event type switch (event_p->type) { case kEvTOneshot: result = handleOneShot(event_p); break; case kEvTContinuous: result = handleContinuous(event_p); break; case kEvTInterval: result = handleInterval(event_p); break; case kEvTImmediate: result = handleImmediate(event_p); break; default: result = kEvStInvalidCode; warning("Invalid event code encountered"); break; } // Process the event appropriately based on result code from // handler if ((result == kEvStDelete) || (result == kEvStInvalidCode)) { // If there is no event chain, delete the base event. 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; eventi->pop_front(); event_p = &eventi->front(); event_p->time += delta_time; --eventi; } } else if (result == kEvStBreak) { break; } } }
// 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) { Event *event_p; long delta_time; int result; // Advance event times processEventTime(msec); // Process each event in list for (EventList::iterator eventi = _eventList.begin(); eventi != _eventList.end(); ++eventi) { event_p = (Event *)eventi.operator->(); // Call the appropriate event handler for the specific event type switch (event_p->type) { case kEvTOneshot: result = handleOneShot(event_p); break; case kEvTContinuous: result = handleContinuous(event_p); break; case kEvTInterval: result = handleInterval(event_p); break; case kEvTImmediate: result = handleImmediate(event_p); break; default: result = kEvStInvalidCode; warning("Invalid event code encountered"); break; } // Process the event appropriately based on result code from // handler if ((result == kEvStDelete) || (result == kEvStInvalidCode)) { // If there is no event chain, delete the base event. if (event_p->chain == NULL) { eventi = _eventList.eraseAndPrev(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); event_p->time += delta_time; --eventi; } } else if (result == kEvStBreak) { break; } } return SUCCESS; }