static void intCleanUpIntelMap(void) { MESSAGE *psMessage, *psNext; //remove any research messages that have been read for (psMessage = apsMessages[selectedPlayer]; psMessage != NULL; psMessage = psNext) { psNext = psMessage->psNext; if (psMessage->type == MSG_RESEARCH && psMessage->read) { removeMessage(psMessage, selectedPlayer); } } resetIntelligencePauseState(); immediateMessage = false; cdAudio_Resume(); if (interpProcessorActive()) { debug(LOG_SCRIPT, "intCleanUpIntelMap: interpreter running, storing CALL_VIDEO_QUIT"); if(!msgStackPush(CALL_VIDEO_QUIT,-1,-1,"\0",-1,-1,NULL)) { debug(LOG_ERROR, "intCleanUpIntelMap() - msgStackPush - stack failed"); return; } } else { debug(LOG_SCRIPT, "intCleanUpIntelMap: not running"); eventFireCallbackTrigger((TRIGGER_TYPE)CALL_VIDEO_QUIT); } }
// Activate a callback trigger void eventFireCallbackTrigger(TRIGGER_TYPE callback) { ACTIVE_TRIGGER *psPrev = NULL, *psCurr, *psNext; TRIGGER_DATA *psTrigDat; BOOL fired; if (interpProcessorActive()) { ASSERT(false, "eventFireCallbackTrigger: script interpreter is already running"); return; } //this can be called from eventProcessTriggers and so will wipe out all the current added ones //psAddedTriggers = NULL; for (psCurr = psCallbackList; psCurr && psCurr->type <= (int)callback; psCurr = psNext) { psNext = psCurr->psNext; if (psCurr->type == (int)callback) { // see if the callback should be fired fired = false; if (psCurr->type != TR_PAUSE) { ASSERT(psCurr->trigger >= 0 && psCurr->trigger < psCurr->psContext->psCode->numTriggers, "eventFireCallbackTrigger: invalid trigger number"); psTrigDat = psCurr->psContext->psCode->psTriggerData + psCurr->trigger; } else { psTrigDat = NULL; } if (psTrigDat && psTrigDat->code) { if (!interpRunScript(psCurr->psContext, IRT_TRIGGER, psCurr->trigger, 0)) { ASSERT(false, "eventFireCallbackTrigger: trigger %s: code failed", eventGetTriggerID(psCurr->psContext->psCode, psCurr->trigger)); psPrev = psCurr; continue; } if (!stackPopParams(1, VAL_BOOL, &fired)) { ASSERT(false, "eventFireCallbackTrigger: trigger %s: code failed", eventGetTriggerID(psCurr->psContext->psCode, psCurr->trigger)); psPrev = psCurr; continue; } } else { fired = true; } // run the event if (fired) { DB_TRIGINF(psCurr,1); DB_TRACE(" fired",1); // remove the trigger from the list if (psPrev == NULL) { psCallbackList = psCallbackList->psNext; } else { psPrev->psNext = psNext; } psFiringTrigger = psCurr; if (!interpRunScript(psCurr->psContext, IRT_EVENT, psCurr->event, psCurr->offset)) // this could set psCurr->deactivated { ASSERT(false, "eventFireCallbackTrigger: event %s: code failed", eventGetEventID(psCurr->psContext->psCode, psCurr->event)); } if (psCurr->deactivated) { // don't need to add the trigger again - just free it eventFreeTrigger(psCurr); } else { // make sure the trigger goes back into the system psCurr->psNext = psAddedTriggers; psAddedTriggers = psCurr; } } else { psPrev = psCurr; } } else { psPrev = 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; }