// Process all the currently active triggers void eventProcessTriggers(UDWORD currTime) { ACTIVE_TRIGGER *psCurr, *psNext, *psNew; TRIGGER_DATA *psData; // Process all the current triggers psAddedTriggers = NULL; updateTime = currTime; while(psTrigList && psTrigList->testTime <= currTime) { psCurr = psTrigList; psTrigList = psTrigList->psNext; // Run the trigger if (eventFireTrigger(psCurr)) // This might mark the trigger for deletion { if (psCurr->deactivated || psCurr->type == TR_WAIT) { // remove the trigger eventFreeTrigger(psCurr); } else if (psCurr->type == TR_PAUSE) { // restarted a paused event - replace the old trigger if (psCurr->trigger != -1) { if (eventInitTrigger(&psNew, psCurr->psContext, psCurr->event, psCurr->trigger, updateTime)) { psNew->psNext = psAddedTriggers; psAddedTriggers = psNew; } } // remove the TR_PAUSE trigger eventFreeTrigger(psCurr); } else { // Add the trigger again psData = psCurr->psContext->psCode->psTriggerData + psCurr->trigger; psCurr->testTime = currTime + psData->time; psCurr->psNext = psAddedTriggers; psAddedTriggers = psCurr; } } } // Delete marked triggers now eventPruneLists(); // Now add all the new triggers for(psCurr = psAddedTriggers; psCurr; psCurr=psNext) { psNext = psCurr->psNext; eventAddTrigger(psCurr); } //clear out after added them all psAddedTriggers = NULL; }
// Change the trigger assigned to an event - to be called from script functions BOOL eventSetTrigger(void) { ACTIVE_TRIGGER *psTrigger; UDWORD event; SDWORD trigger; SCRIPT_CONTEXT *psContext; if (!stackPopParams(2, VAL_EVENT, &event, VAL_TRIGGER, &trigger)) { return false; } #ifdef REALLY_DEBUG_THIS DB_TRACE(("eventSetTrigger %s %s\n", eventGetEventID(psFiringTrigger->psContext->psCode, event), eventGetTriggerID(psFiringTrigger->psContext->psCode, trigger)),2); #endif // See if this is the event that is running psContext = psFiringTrigger->psContext; if (psFiringTrigger->event == event) { psFiringTrigger->deactivated = true; } else { // Mark the old trigger in the lists eventMarkTriggerInList(&psTrigList, psContext, event, &trigger); eventMarkTriggerInList(&psCallbackList, psContext, event, &trigger); eventMarkTriggerInList(&psAddedTriggers, psContext, event, &trigger); } // Create a new trigger if necessary if (trigger >= 0) { if (!eventInitTrigger(&psTrigger, psFiringTrigger->psContext, event, trigger, updateTime)) { return false; } psTrigger->psNext = psAddedTriggers; psAddedTriggers = psTrigger; } return true; }
// Add a new object to the trigger system // Time is the application time at which all the triggers are to be started BOOL eventRunContext(SCRIPT_CONTEXT *psContext, UDWORD time) { SDWORD event; ACTIVE_TRIGGER *psTrigger; TRIGGER_DATA *psData; SCRIPT_CODE *psCode; ASSERT( psContext != NULL, "eventNewObject: Invalid context pointer" ); // Now setup all the triggers psContext->triggerCount = 0; psCode = psContext->psCode; for(event = 0; event < psCode->numEvents; event++) { if (psCode->pEventLinks[event] >= 0) { // See if this is an init event psData = psCode->psTriggerData + psCode->pEventLinks[event]; if (psData->type == TR_INIT) { if (!interpRunScript(psContext, IRT_EVENT, event, 0)) { return false; } } else { if (!eventInitTrigger(&psTrigger, psContext, event, psCode->pEventLinks[event], time)) { return false; } eventAddTrigger(psTrigger); DB_TRACE(("added "),2); DB_TRIGINF(psTrigger, 2); } } } return true; }