/// <summary> /// Checks if a TriggerCall for a given Theme has already been stored in the map for this tick, and updates the map accordingly. /// </summary> /// <param name="triggerCall"></param> private void ProcessTriggerCall(TriggerMusicThemeCall triggerCall) { bool storeNewTriggerCall = false; if (mapThemeIdsToTriggerCalls.ContainsKey(triggerCall.themeId)) { TriggerMusicThemeCall storedTriggerCall = mapThemeIdsToTriggerCalls[triggerCall.themeId]; if (triggerCall.senderBehaviour.addUpIntensities) { triggerCall.intensity += storedTriggerCall.intensity; if (triggerCall.intensity > triggerCall.senderBehaviour.limitIntensitySum) { triggerCall.intensity = triggerCall.senderBehaviour.limitIntensitySum; } storeNewTriggerCall = true; } else { if (storedTriggerCall.intensity < triggerCall.intensity) { storeNewTriggerCall = true; } } } else { storeNewTriggerCall = true; } if (storeNewTriggerCall) { mapThemeIdsToTriggerCalls[triggerCall.themeId] = triggerCall; } }
void ProcessAllIncomingTriggerCallsForThisTick() { mapThemeIdsToTriggerCalls.Clear(); foreach (PsaiSynchronizedTrigger triggerBehaviour in continuousTriggersInScene) { if (triggerBehaviour.EvaluateAllTriggerConditions() == true) { float calculatedIntensity = triggerBehaviour.CalculateTriggerIntensity(); if (triggerBehaviour.TriggerType == PsaiTriggerBase.PsaiTriggerType.triggerMusicTheme) { TriggerMusicThemeCall triggerCall = new TriggerMusicThemeCall(triggerBehaviour, triggerBehaviour.themeId, calculatedIntensity, triggerBehaviour.musicDurationInSeconds); ProcessTriggerCall(triggerCall); } else { CopyControlTriggerValuesToPlaybackCallFiringInThisTick(triggerBehaviour); } } } // Now we check for synchronized One-Shot Triggers foreach (TriggerMusicThemeCall triggerCall in _synchronizedOneShotTriggerCallsForNextTick) { if (triggerCall.intensity > 0) { ProcessTriggerCall(triggerCall); } } _synchronizedOneShotTriggerCallsForNextTick.Clear(); // Execute explicit calls to GoToRest, StopMusic,... if (playbackControlCallFiringInThisTick.playbackControlType != PlaybackControlType.None) { bool executeControlCall = true; if (mapThemeIdsToTriggerCalls.Keys.Count > 0 && playbackControlCallFiringInThisTick.dontExecuteIfOtherTriggersAreFiring == true) { foreach(int themeId in mapThemeIdsToTriggerCalls.Keys) { ThemeInfo themeInfo = PsaiCore.Instance.GetThemeInfo(themeId); if (themeInfo.type == playbackControlCallFiringInThisTick.restrictBlockToThisThemeType) { #if !(PSAI_NOLOG) if (this.logTriggerScripts) { Debug.LogWarning(string.Format("psai [{0}]: skipping {1} as there are other Triggers firing: {2}", (int)(Time.timeSinceLevelLoad * 1000), playbackControlCallFiringInThisTick.playbackControlType, themeInfo.type)); } #endif executeControlCall = false; break; } } } if (executeControlCall) { switch (playbackControlCallFiringInThisTick.playbackControlType) { case PlaybackControlType.ReturnToBasicMood: { PsaiCore.Instance.ReturnToLastBasicMood(playbackControlCallFiringInThisTick.immediately); } break; case PlaybackControlType.GoToRest: { if (playbackControlCallFiringInThisTick.overrideDefaultRestTime) { PsaiCore.Instance.GoToRest(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds, playbackControlCallFiringInThisTick.overrideRestSecondsMin * 1000, playbackControlCallFiringInThisTick.overrideRestSecondsMax * 1000); } else { PsaiCore.Instance.GoToRest(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds); } } break; case PlaybackControlType.StopMusic: { PsaiCore.Instance.StopMusic(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds); } break; } playbackControlCallFiringInThisTick.sendingBehaviour.hasFired = true; } playbackControlCallFiringInThisTick.Init(); } foreach (TriggerMusicThemeCall triggerCall in mapThemeIdsToTriggerCalls.Values) { // adding up triggers may exceed the limit float triggerIntensity = Mathf.Min(1.0f, triggerCall.intensity); if (logTriggerScripts) { Debug.Log(string.Format("psai [{0}]: PsaiCoreManager executing TriggerCall {1}", (int)(Time.timeSinceLevelLoad * 1000), triggerCall.ToString())); } if (triggerCall.forceImmediateStopBeforeTriggering) { PsaiCore.Instance.StopMusic(true); } if (triggerCall.senderBehaviour.overrideMusicDurationInSeconds && triggerCall.musicDurationInSeconds > 0) { PsaiCore.Instance.TriggerMusicTheme(triggerCall.themeId, triggerIntensity, triggerCall.musicDurationInSeconds); triggerCall.senderBehaviour.hasFired = true; } else { PsaiCore.Instance.TriggerMusicTheme(triggerCall.themeId, triggerIntensity); triggerCall.senderBehaviour.hasFired = true; } } }
public void RegisterOneShotTriggerCall(TriggerMusicThemeCall triggerCall) { _synchronizedOneShotTriggerCallsForNextTick.Add(triggerCall); }
void ProcessAllIncomingTriggerCallsForThisTick() { mapThemeIdsToTriggerCalls.Clear(); foreach (PsaiSynchronizedTrigger triggerBehaviour in continuousTriggersInScene) { if (triggerBehaviour.EvaluateAllTriggerConditions() == true) { float calculatedIntensity = triggerBehaviour.CalculateTriggerIntensity(); if (triggerBehaviour.TriggerType == PsaiTriggerBase.PsaiTriggerType.triggerMusicTheme) { TriggerMusicThemeCall triggerCall = new TriggerMusicThemeCall(triggerBehaviour, triggerBehaviour.themeId, calculatedIntensity, triggerBehaviour.musicDurationInSeconds); ProcessTriggerCall(triggerCall); } else { CopyControlTriggerValuesToPlaybackCallFiringInThisTick(triggerBehaviour); } } } // Now we check for synchronized One-Shot Triggers foreach (TriggerMusicThemeCall triggerCall in _synchronizedOneShotTriggerCallsForNextTick) { if (triggerCall.intensity > 0) { ProcessTriggerCall(triggerCall); } } _synchronizedOneShotTriggerCallsForNextTick.Clear(); // Execute explicit calls to GoToRest, StopMusic,... if (playbackControlCallFiringInThisTick.playbackControlType != PlaybackControlType.None) { bool executeControlCall = true; if (mapThemeIdsToTriggerCalls.Keys.Count > 0 && playbackControlCallFiringInThisTick.dontExecuteIfOtherTriggersAreFiring == true) { foreach (int themeId in mapThemeIdsToTriggerCalls.Keys) { ThemeInfo themeInfo = PsaiCore.Instance.GetThemeInfo(themeId); if (themeInfo.type == playbackControlCallFiringInThisTick.restrictBlockToThisThemeType) { #if !(PSAI_NOLOG) if (this.logTriggerScripts) { Debug.LogWarning(string.Format("psai [{0}]: skipping {1} as there are other Triggers firing: {2}", (int)(Time.timeSinceLevelLoad * 1000), playbackControlCallFiringInThisTick.playbackControlType, themeInfo.type)); } #endif executeControlCall = false; break; } } } if (executeControlCall) { switch (playbackControlCallFiringInThisTick.playbackControlType) { case PlaybackControlType.ReturnToBasicMood: { PsaiCore.Instance.ReturnToLastBasicMood(playbackControlCallFiringInThisTick.immediately); } break; case PlaybackControlType.GoToRest: { if (playbackControlCallFiringInThisTick.overrideDefaultRestTime) { PsaiCore.Instance.GoToRest(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds, playbackControlCallFiringInThisTick.overrideRestSecondsMin * 1000, playbackControlCallFiringInThisTick.overrideRestSecondsMax * 1000); } else { PsaiCore.Instance.GoToRest(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds); } } break; case PlaybackControlType.StopMusic: { PsaiCore.Instance.StopMusic(playbackControlCallFiringInThisTick.immediately, playbackControlCallFiringInThisTick.fadeOutSeconds); } break; } playbackControlCallFiringInThisTick.sendingBehaviour.hasFired = true; } playbackControlCallFiringInThisTick.Init(); } foreach (TriggerMusicThemeCall triggerCall in mapThemeIdsToTriggerCalls.Values) { // adding up triggers may exceed the limit float triggerIntensity = Mathf.Min(1.0f, triggerCall.intensity); if (logTriggerScripts) { Debug.Log(string.Format("psai [{0}]: PsaiCoreManager executing TriggerCall {1}", (int)(Time.timeSinceLevelLoad * 1000), triggerCall.ToString())); } if (triggerCall.forceImmediateStopBeforeTriggering) { PsaiCore.Instance.StopMusic(true); } if (triggerCall.senderBehaviour.overrideMusicDurationInSeconds && triggerCall.musicDurationInSeconds > 0) { PsaiCore.Instance.TriggerMusicTheme(triggerCall.themeId, triggerIntensity, triggerCall.musicDurationInSeconds); triggerCall.senderBehaviour.hasFired = true; } else { PsaiCore.Instance.TriggerMusicTheme(triggerCall.themeId, triggerIntensity); triggerCall.senderBehaviour.hasFired = true; } } }