Ejemplo n.º 1
0
    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);
        }
    }
Ejemplo n.º 2
0
    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();
    }