public override IEnumerator ReportBombStatus() { IEnumerator baseIEnumerator = base.ReportBombStatus(); while (baseIEnumerator.MoveNext()) { yield return(baseIEnumerator.Current); } List <TwitchBomb> bombHandles = TwitchGame.Instance.Bombs; yield return(new WaitUntil(() => SceneManager.Instance.GameplayState.RoundStarted)); yield return(new WaitForSeconds(0.1f)); _roomLight = (GameObject)_roomLightField.GetValue(_room); PaceMaker paceMaker = SceneManager.Instance.GameplayState.GetPaceMaker(); List <PacingAction> actions = (List <PacingAction>) typeof(PaceMaker).GetField("actions", BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(paceMaker); actions?.RemoveAll(action => action.EventType == PaceEvent.OneMinuteLeft); while (bombHandles.TrueForAll(handle => !handle.Bomb.HasDetonated)) { if (bombHandles.TrueForAll(handle => handle.Bomb.IsSolved())) { yield break; } ToggleEmergencyLights(OtherModes.currentMode != TwitchPlaysMode.Zen && bombHandles.Any(handle => handle.CurrentTimer < 60f && !handle.Bomb.IsSolved()), bombHandles[0]); yield return(null); } }
IEnumerator WaitForPaceMaker() { Settings = PacingSettings.Settings; // Validate config file. if (Settings.Min > Settings.Max) { Settings.Min = Settings.Max; } if (Settings.AbsoluteMinimum > Settings.Min) { Settings.AbsoluteMinimum = Settings.Min; } PaceMaker paceMaker = null; yield return(new WaitUntil(() => { paceMaker = SceneManager.Instance.GameplayState.GetPaceMaker(); return paceMaker != null; })); _paceMakerObj = paceMaker.gameObject; minTime = Math.Max(Math.Min(Settings.Min, Settings.Max), 0); maxTime = Math.Max(Settings.Max, minTime); timeLeft = UnityEngine.Random.Range(minTime, maxTime); UI.SetActive(Settings.Debug); List <PacingAction> actions = paceMaker.GetValue <List <PacingAction> >("actions"); yield return(new WaitUntil(() => paceMaker.GetValue <bool>("isActive"))); paceMaker.CallMethod("PopulatePacingActions"); bool actionsEnabled = actions.Count > 0; Mission mission = paceMaker.GetValue <Mission>("mission"); if (mission.ID != "freeplay" && actionsEnabled) { activeImg.color = Color.yellow; yield return(new WaitUntil(() => { List <PacingAction> idle = GetIdleEvents(actions); eventCount.text = idle.Count.ToString(); return idle.Count == 0; })); paceMaker.CallMethod("PopulatePacingActions"); } paceMaker.SetValue("isActive", false); if (actionsEnabled) { eventCount.text = GetIdleEvents(actions).Count.ToString(); activeImg.color = Color.green; } else { activeImg.color = Color.gray; } Events.AddRange(GetIdleEvents(actions).Select(PacingAction => new PacingEvent(PacingAction, GetEventSettings)).Where(e => GetEventSettings(e._name).Enabled)); yield return(new WaitForSeconds(1f)); while (_paceMakerObj != null) { if (actionsEnabled) { float success = CalculateSuccess(); timeLeft -= success; if (timeLeft <= 0) { timeLeft = UnityEngine.Random.Range(minTime, maxTime); PacingEvent[] validEvents = Events.Where(e => e._timeStamp <= Time.time && e._minDiff <= success).ToArray(); if (validEvents.Length == 0) { Log("Unable to find any events to play! Skipping an event this time."); } else { // Pick a random event based on weights. float targetWeight = UnityEngine.Random.Range(0, validEvents.Sum(e => e._weight)); float currentWeight = 0; PacingEvent idleEvent = null; foreach (PacingEvent e in validEvents) { currentWeight += e._weight; if (currentWeight >= targetWeight) { idleEvent = e; break; } } IEnumerator enumerator = idleEvent.ExecuteAction(); while (enumerator.MoveNext()) { yield return(enumerator.Current); } idleEvent._timeStamp = Time.time + idleEvent._cooldown; } } eventTime.text = timeLeft.ToString("n2"); percent.text = Math.Round((decimal)success * 100, 0, MidpointRounding.AwayFromZero) + "%"; } yield return(new WaitForSeconds(1f)); if (actionsEnabled) { activeImg.color = Color.green; } } OnRoundEnded(); }