private void Update()
    {
        MainThreadQueue.ProcessQueue();

        if (Input.GetKey(KeyCode.Escape))
        {
            InputInterceptor.EnableInput();
            TwitchGame.ModuleCameras?.DisableCameraWall();
        }

        if (Input.GetKeyDown(DebugSequence[_debugSequenceIndex].ToString()))
        {
            _debugSequenceIndex++;
            if (_debugSequenceIndex != DebugSequence.Length)
            {
                return;
            }

            TwitchPlaySettings.data.TwitchPlaysDebugEnabled = !TwitchPlaySettings.data.TwitchPlaysDebugEnabled;
            TwitchPlaySettings.WriteDataToFile();

            chatSimulator.SetActive(TwitchPlaySettings.data.TwitchPlaysDebugEnabled);

            _debugSequenceIndex = 0;
            UserAccess.AddUser("_TPDEBUG".ToLowerInvariant(), AccessLevel.Streamer | AccessLevel.SuperUser | AccessLevel.Admin | AccessLevel.Mod);
            UserAccess.WriteAccessList();
        }
        else if (Input.anyKeyDown)
        {
            _debugSequenceIndex = 0;
        }
    }
    private void Update()
    {
        if (Input.GetKey(KeyCode.Escape))
        {
            InputInterceptor.EnableInput();
        }

        if (Input.GetKeyDown(debugSequence[debugSequenceIndex].ToString()))
        {
            debugSequenceIndex++;
            if (debugSequenceIndex != debugSequence.Length)
            {
                return;
            }

            TwitchPlaySettings.data.TwitchPlaysDebugEnabled = !TwitchPlaySettings.data.TwitchPlaysDebugEnabled;
            TwitchPlaySettings.WriteDataToFile();

            debugSequenceIndex = 0;
            UserAccess.AddUser("_TPDEBUG".ToLowerInvariant(), AccessLevel.Streamer | AccessLevel.SuperUser | AccessLevel.Admin | AccessLevel.Mod);
            UserAccess.WriteAccessList();
        }
        else if (Input.anyKeyDown)
        {
            debugSequenceIndex = 0;
        }
    }
Example #3
0
 public static void EnableTwitchPlays()
 {
     IRCConnection.SendMessage("Twitch Plays Enabled");
     TwitchPlaySettings.data.EnableTwitchPlaysMode = true;
     TwitchPlaySettings.WriteDataToFile();
     TwitchGame.EnableDisableInput();
 }
Example #4
0
 public static void DisableInteractiveMode()
 {
     IRCConnection.SendMessage("Interactive Mode Disabled");
     TwitchPlaySettings.data.EnableInteractiveMode = false;
     TwitchPlaySettings.WriteDataToFile();
     TwitchGame.EnableDisableInput();
 }
    private void OnGUI()
    {
        if (!TwitchPlaySettings.data.TwitchPlaysDebugEnabled)
        {
            return;
        }

        GUILayout.BeginArea(new Rect(50, Screen.height - 75, (Screen.width - 50) * 0.2f, 25));
        GUILayout.BeginHorizontal();
        inputCommand = GUILayout.TextField(inputCommand, GUILayout.MinWidth(50));
        if ((GUILayout.Button("Send") || Event.current.keyCode == KeyCode.Return) && inputCommand.Length != 0)
        {
            if (inputCommand.Equals(debugSequence))
            {
                TwitchPlaySettings.data.TwitchPlaysDebugEnabled = !TwitchPlaySettings.data.TwitchPlaysDebugEnabled;
                TwitchPlaySettings.WriteDataToFile();
                inputCommand = "";
                GUILayout.EndHorizontal();
                GUILayout.EndArea();
                return;
            }
            IRCConnection.Instance.SetDebugUsername();
            IRCConnection.Instance.SendMessage(inputCommand);
            IRCConnection.Instance.OnMessageReceived.Invoke(IRCConnection.Instance.UserNickName, IRCConnection.Instance.CurrentColor, inputCommand, false);
            inputCommand = "";
        }
        GUILayout.EndHorizontal();
        GUILayout.EndArea();
    }
    private bool HandleKey(string[] modulesBefore, string[] modulesAfter, FieldInfo keyTurned, FieldInfo otherKeyTurned, FieldInfo beforeKeyField, MethodInfo onKeyTurn)
    {
        if (!GetValue(_activatedField) || GetValue(keyTurned))
        {
            return(false);
        }
        KMBombInfo   bombInfo   = BombComponent.GetComponent <KMBombInfo>();
        KMBombModule bombModule = BombComponent.GetComponent <KMBombModule>();

        if (TwitchPlaySettings.data.EnforceSolveAllBeforeTurningKeys &&
            modulesAfter.Any(x => bombInfo.GetSolvedModuleNames().Count(x.Equals) != bombInfo.GetSolvableModuleNames().Count(x.Equals)))
        {
            bombModule.HandleStrike();
            return(false);
        }

        beforeKeyField.SetValue(null, TwitchPlaySettings.data.DisableTurnTheKeysSoftLock ? new string[0] : modulesBefore);
        onKeyTurn.Invoke(BombComponent.GetComponent(_componentType), null);
        if (GetValue(keyTurned))
        {
            //Check to see if any forbidden modules for this key were solved.
            if (TwitchPlaySettings.data.DisableTurnTheKeysSoftLock && bombInfo.GetSolvedModuleNames().Any(modulesBefore.Contains))
            {
                bombModule.HandleStrike();  //If so, Award a strike for it.
            }
            if (GetValue(otherKeyTurned))
            {
                int modules = bombInfo.GetSolvedModuleNames().Count(x => RightAfterA.Contains(x) || LeftAfterA.Contains(x));
                TwitchPlaySettings.AddRewardBonus(2 * modules);
                IRCConnection.SendMessage("Reward increased by {0} for defusing module !{1} ({2}).", modules * 2, Code, bombModule.ModuleDisplayName);
            }
        }
        return(false);
    }
    private MessageResponder GetActiveResponder(KMGameInfo.State state)
    {
        switch (state)
        {
        case KMGameInfo.State.Gameplay:
            DefaultCamera();
            return(bombMessageResponder);

        case KMGameInfo.State.Setup:
            DefaultCamera();
            _coroutinesToStart.Enqueue(VanillaRuleModifier.Refresh());
            _coroutinesToStart.Enqueue(MultipleBombs.Refresh());
            _coroutinesToStart.Enqueue(FactoryRoomAPI.Refresh());
            _coroutinesToStart.Enqueue(CreateSolversForAllBombComponents());

            return(missionMessageResponder);

        case KMGameInfo.State.PostGame:
            DefaultCamera();
            return(postGameMessageResponder);

        case KMGameInfo.State.Transitioning:
            ModuleData.LoadDataFromFile();
            TwitchPlaySettings.LoadDataFromFile();
            return(null);

        default:
            return(null);
        }
    }
Example #8
0
 private static void SetTimeModeTimeLimit(object timeLimit)
 {
     if (timeLimit is int intTimeLimit)
     {
         TwitchPlaySettings.data.TimeModeStartingTime = intTimeLimit;
         TwitchPlaySettings.WriteDataToFile();
     }
 }
Example #9
0
 public TwitchPlaysProperties()
 {
     AddProperty("TimeMode", new Property(() => OtherModes.TimeModeOn, x => OtherModes.TimeModeOn = (bool)x));
     AddProperty("ZenMode", new Property(() => OtherModes.ZenModeOn, x => OtherModes.ZenModeOn    = (bool)x));
     AddProperty("TimeModeTimeLimit", new Property(() => TwitchPlaySettings.data.TimeModeStartingTime, SetTimeModeTimeLimit));
     AddProperty("ircConnectionSendMessage", new Property(null, x => IRCConnection.Instance.SendMessage((string)x)));
     AddProperty("Reward", new Property(() => TwitchPlaySettings.GetRewardBonus(), x => TwitchPlaySettings.SetRewardBonus((int)x)));
     AddProperty("CauseFakeStrike", new Property(null, CauseFakeStrike));
 }
Example #10
0
    private void OnStateChange(KMGameInfo.State state)
    {
        CurrentState = state;
        if (!transform.gameObject.activeInHierarchy)
        {
            return;
        }

        StartCoroutine(StopEveryCoroutine());

        if (state != KMGameInfo.State.PostGame && _leaderboardDisplay != null)
        {
            DestroyObject(_leaderboardDisplay);
            _leaderboardDisplay = null;
        }

        twitchGame?.gameObject.SetActive(state == KMGameInfo.State.Gameplay);

        OtherModes.RefreshModes(state);

        // Automatically check for updates after a round is finished or when entering the setup state but never more than once per hour.
        bool hourPassed = DateTime.Now.Subtract(Updater.LastCheck).TotalHours >= 1;

        if ((state == KMGameInfo.State.PostGame || state == KMGameInfo.State.Setup) && hourPassed && !Updater.UpdateAvailable)
        {
            _coroutinesToStart.Enqueue(AutomaticUpdateCheck());
        }

        switch (state)
        {
        case KMGameInfo.State.Gameplay:
            DefaultCamera();
            break;

        case KMGameInfo.State.Setup:
            DefaultCamera();
            _coroutinesToStart.Enqueue(VanillaRuleModifier.Refresh());
            _coroutinesToStart.Enqueue(MultipleBombs.Refresh());
            _coroutinesToStart.Enqueue(FactoryRoomAPI.Refresh());
            _coroutinesToStart.Enqueue(FindSupportedModules());
            break;

        case KMGameInfo.State.PostGame:
            DefaultCamera();
            if (_leaderboardDisplay == null)
            {
                _leaderboardDisplay = Instantiate(TwitchLeaderboardPrefab);
            }
            Leaderboard.Instance.SaveDataToFile();
            break;

        case KMGameInfo.State.Transitioning:
            ModuleData.LoadDataFromFile();
            TwitchPlaySettings.LoadDataFromFile();
            break;
        }
    }
Example #11
0
    private void Start()
    {
        _gameInfo = GetComponent <KMGameInfo>();
        _gameInfo.OnStateChange += OnStateChange;

        _modSettings = GetComponent <KMModSettings>();

        ModSettingsJSON settings = JsonConvert.DeserializeObject <ModSettingsJSON>(_modSettings.Settings);

        if (settings == null)
        {
            DebugHelper.LogError("Failed to read connection settings from mod settings.");
            return;
        }

        DebugMode = (settings.debug == true);

        _ircConnection = new IRCConnection(settings.authToken, settings.userName, settings.channelName, settings.serverName, settings.serverPort);
        _ircConnection.Connect();

        _coroutineCanceller = new CoroutineCanceller();

        _coroutineQueue = GetComponent <CoroutineQueue>();
        _coroutineQueue.coroutineCanceller = _coroutineCanceller;

        logUploader = GetComponent <LogUploader>();
        logUploader.ircConnection = _ircConnection;

        urlHelper = GetComponent <UrlHelper>();
        urlHelper.ChangeMode(settings.shortUrls == true);

        _leaderboard = new Leaderboard();
        _leaderboard.LoadDataFromFile();

        ModuleData.LoadDataFromFile();
        ModuleData.WriteDataToFile();

        TwitchPlaySettings.LoadDataFromFile();

        UserAccess.AddUser(settings.userName, AccessLevel.Streamer | AccessLevel.SuperUser | AccessLevel.Admin | AccessLevel.Mod);
        UserAccess.AddUser(settings.channelName.Replace("#", ""), AccessLevel.Streamer | AccessLevel.SuperUser | AccessLevel.Admin | AccessLevel.Mod);
        UserAccess.WriteAccessList();

        SetupResponder(bombMessageResponder);
        SetupResponder(postGameMessageResponder);
        SetupResponder(missionMessageResponder);
        SetupResponder(miscellaneousMessageResponder);

        bombMessageResponder.leaderboard          = _leaderboard;
        postGameMessageResponder.leaderboard      = _leaderboard;
        miscellaneousMessageResponder.leaderboard = _leaderboard;

        bombMessageResponder.parentService = this;
    }
    public void ProcessResponse(CommandResponse response, int value)
    {
        switch (response)
        {
        case CommandResponse.Start:
            StopAllCoroutines();
            StartCoroutine(DoBackgroundColorChange(highlightColor));
            break;

        case CommandResponse.EndNotComplete:
            StopAllCoroutines();
            StartCoroutine(DoBackgroundColorChange(normalColor));
            break;

        case CommandResponse.EndComplete:
            StopAllCoroutines();
            StartCoroutine(DoBackgroundColorChange(completeColor));
            if (leaderboard != null)
            {
                leaderboard.AddSolve(userName, userColor);
                if (!UserAccess.HasAccess(userName, AccessLevel.NoPoints))
                {
                    leaderboard.AddScore(userName, userColor, value);
                }
                else
                {
                    TwitchPlaySettings.AddRewardBonus(value);
                }
            }
            break;

        case CommandResponse.EndError:
            StopAllCoroutines();
            StartCoroutine(DoBackgroundColorChange(errorColor));
            leaderboard?.AddStrike(userName, userColor, TwitchPlaySettings.data.EnableRewardMultipleStrikes ? value : 1);
            break;

        case CommandResponse.NoResponse:
            StopAllCoroutines();
            StartCoroutine(DoBackgroundColorChange(ignoreColor));
            break;

        case CommandResponse.EndErrorSubtractScore:
            if (!UserAccess.HasAccess(userName, AccessLevel.NoPoints))
            {
                leaderboard?.AddScore(userName, userColor, value);
            }
            break;

        default:
            break;
        }
    }
 public static IEnumerator Retry(string user, bool isWhisper)
 {
     if (!TwitchPlaySettings.data.EnableRetryButton)
     {
         IRCConnection.SendMessage(TwitchPlaySettings.data.RetryInactive, user, isWhisper);
         return(doButton(Object.FindObjectOfType <ResultPage>().ContinueButton));
     }
     else
     {
         TwitchPlaySettings.SetRetryReward();
         return(doButton(Object.FindObjectOfType <ResultPage>().RetryButton));
     }
 }
Example #14
0
    private IEnumerator RefreshIRCBackground()
    {
        yield return(null);

        if (_imageLoadingDisabled)
        {
            yield break;
        }
        yield return(null);

        IRCText.color = TwitchPlaySettings.data.IRCManagerTextColor;
        try
        {
#pragma warning disable IDE0031 // Use null propagation
            MeshRenderer background = _newImageGameObject != null?_newImageGameObject.GetComponent <MeshRenderer>() : null;

#pragma warning restore IDE0031 // Use null propagation
            //Image loading at runtime found at https://forum.unity.com/threads/solved-apply-image-to-plane-primitive.320489/
            if (background == null || !File.Exists(TwitchPlaySettings.data.IRCManagerBackgroundImage))
            {
                _originalImageGameObject.SetActive(true);
                if (_newImageGameObject != null)
                {
                    _newImageGameObject.SetActive(false);
                }
                yield break;
            }

            _originalImageGameObject.SetActive(false);
            if (_newImageGameObject != null)
            {
                _newImageGameObject.SetActive(true);
            }

            byte[]    bytes = File.ReadAllBytes(TwitchPlaySettings.data.IRCManagerBackgroundImage);
            Texture2D tex   = new Texture2D(1, 1);
            tex.LoadImage(bytes);
            background.material.mainTexture = tex;
        }
        catch (Exception ex)
        {
            DebugHelper.LogException(ex, "Could NOT set a custom background image due to an exception. Feature is being disabled for the rest of this session:");
            _imageLoadingDisabled = true;
            TwitchPlaySettings.WriteDataToFile();
            _originalImageGameObject.SetActive(true);
            if (_newImageGameObject != null)
            {
                _newImageGameObject.SetActive(false);
            }
        }
    }
Example #15
0
    private void OnStateChange(KMGameInfo.State state)
    {
        CurrentState = state;
        if (!transform.gameObject.activeInHierarchy)
        {
            return;
        }

        StartCoroutine(StopEveryCoroutine());

        if (state != KMGameInfo.State.PostGame && _leaderboardDisplay != null)
        {
            DestroyObject(_leaderboardDisplay);
            _leaderboardDisplay = null;
        }

        twitchGame?.gameObject.SetActive(state == KMGameInfo.State.Gameplay);

        OtherModes.RefreshModes(state);

        switch (state)
        {
        case KMGameInfo.State.Gameplay:
            DefaultCamera();
            break;

        case KMGameInfo.State.Setup:
            DefaultCamera();
            _coroutinesToStart.Enqueue(VanillaRuleModifier.Refresh());
            _coroutinesToStart.Enqueue(MultipleBombs.Refresh());
            _coroutinesToStart.Enqueue(FactoryRoomAPI.Refresh());
            _coroutinesToStart.Enqueue(FindSupportedModules());
            break;

        case KMGameInfo.State.PostGame:
            DefaultCamera();
            if (_leaderboardDisplay == null)
            {
                _leaderboardDisplay = Instantiate(TwitchLeaderboardPrefab);
            }
            Leaderboard.Instance.SaveDataToFile();
            break;

        case KMGameInfo.State.Transitioning:
            ModuleData.LoadDataFromFile();
            TwitchPlaySettings.LoadDataFromFile();
            break;
        }
    }
Example #16
0
    private void Start()
    {
        Instance = this;

        transform.Find("Prefabs").gameObject.SetActive(false);
        twitchGame = GetComponentInChildren <TwitchGame>(true);

        twitchGame.twitchBombPrefab    = GetComponentInChildren <TwitchBomb>(true);
        twitchGame.twitchModulePrefab  = GetComponentInChildren <TwitchModule>(true);
        twitchGame.moduleCamerasPrefab = GetComponentInChildren <ModuleCameras>(true);

        TwitchGame.Instance = twitchGame;

        GameRoom.InitializeSecondaryCamera();
        _gameInfo = GetComponent <KMGameInfo>();
        _gameInfo.OnStateChange += OnStateChange;

        CoroutineQueue = GetComponent <CoroutineQueue>();

        Leaderboard.Instance.LoadDataFromFile();
        LeaderboardController.Install();

        ModuleData.LoadDataFromFile();
        ModuleData.WriteDataToFile();

        AuditLog.SetupLog();
        MainThreadQueue.Initialize();

        TwitchPlaySettings.LoadDataFromFile();

        MusicPlayer.LoadMusic();

        IRCConnection.Instance.OnMessageReceived.AddListener(OnMessageReceived);

        twitchGame.ParentService = this;

        GameObject infoObject = new GameObject("TwitchPlays_Info");

        infoObject.transform.parent          = gameObject.transform;
        _publicProperties                    = infoObject.AddComponent <TwitchPlaysProperties>();
        _publicProperties.TwitchPlaysService = this;         // TODO: Useless variable?
        if (TwitchPlaySettings.data.SkipModManagerInstructionScreen || IRCConnection.Instance.State == IRCConnectionState.Connected)
        {
            ModManagerManualInstructionScreen.HasShownOnce = true;
        }

        UpdateUiHue();
        SetupChatSimulator();
    }
    public IceCreamConfirm(BombCommander bombCommander, BombComponent bombComponent) :
        base(bombCommander, bombComponent)
    {
        _settings = new Settings();
        modInfo   = ComponentSolverFactory.GetModuleInfo(GetModuleType(), ShimData.HelpMessage + " Check the opening hours with !{0} hours.");
        KMModSettings modSettings = bombComponent.GetComponent <KMModSettings>();

        try
        {
            _settings = JsonConvert.DeserializeObject <Settings>(modSettings.Settings);
        }
        catch (Exception ex)
        {
            DebugHelper.LogException(ex, "Could not deserialize ice cream settings:");
            TwitchPlaySettings.data.ShowHours = false;
            TwitchPlaySettings.WriteDataToFile();
        }
    }
    private void SetupChatSimulator()
    {
        chatSimulator.SetActive(TwitchPlaySettings.data.TwitchPlaysDebugEnabled);
        var num = MouseControls.SCREEN_BOUNDARY_PERCENT * Screen.height + 5;

        chatSimulator.transform.position = new Vector3(num, num, 0);

        var messageInput = chatSimulator.Traverse <InputField>("MessageInput");
        var sendButton   = chatSimulator.Traverse <Button>("SendButton");

        messageInput.onEndEdit.AddListener(_ =>
        {
            if (Input.GetKey(KeyCode.Return))
            {
                sendButton.onClick.Invoke();
                messageInput.ActivateInputField();
            }
        });

        sendButton.onClick.AddListener(() =>
        {
            var message = messageInput.text;
            if (string.IsNullOrEmpty(message))
            {
                return;
            }

            if (message.Equals(DebugSequence))
            {
                TwitchPlaySettings.data.TwitchPlaysDebugEnabled = !TwitchPlaySettings.data.TwitchPlaysDebugEnabled;
                TwitchPlaySettings.WriteDataToFile();

                chatSimulator.SetActive(TwitchPlaySettings.data.TwitchPlaysDebugEnabled);
            }
            else
            {
                IRCConnection.SetDebugUsername();
                IRCConnection.SendMessage(message);
                IRCConnection.ReceiveMessage(IRCConnection.Instance.UserNickName, IRCConnection.Instance.CurrentColor, message);
            }

            messageInput.text = "";
        });
    }
    private void Start()
    {
        transform.Find("Prefabs").gameObject.SetActive(false);
        bombMessageResponder          = GetComponentInChildren <BombMessageResponder>(true);
        postGameMessageResponder      = GetComponentInChildren <PostGameMessageResponder>(true);
        missionMessageResponder       = GetComponentInChildren <MissionMessageResponder>(true);
        miscellaneousMessageResponder = GetComponentInChildren <MiscellaneousMessageResponder>(true);

        bombMessageResponder.twitchBombHandlePrefab      = GetComponentInChildren <TwitchBombHandle>(true);
        bombMessageResponder.twitchComponentHandlePrefab = GetComponentInChildren <TwitchComponentHandle>(true);
        bombMessageResponder.moduleCamerasPrefab         = GetComponentInChildren <ModuleCameras>(true);

        BombMessageResponder.Instance = bombMessageResponder;

        GameRoom.InitializeSecondaryCamera();
        _gameInfo = GetComponent <KMGameInfo>();
        _gameInfo.OnStateChange += OnStateChange;

        _coroutineQueue = GetComponent <CoroutineQueue>();

        Leaderboard.Instance.LoadDataFromFile();

        ModuleData.LoadDataFromFile();
        ModuleData.WriteDataToFile();

        TwitchPlaySettings.LoadDataFromFile();

        SetupResponder(bombMessageResponder);
        SetupResponder(postGameMessageResponder);
        SetupResponder(missionMessageResponder);
        SetupResponder(miscellaneousMessageResponder);

        bombMessageResponder.parentService = this;

        GameObject infoObject = new GameObject("TwitchPlays_Info");

        infoObject.transform.parent          = gameObject.transform;
        _publicProperties                    = infoObject.AddComponent <TwitchPlaysProperties>();
        _publicProperties.TwitchPlaysService = this;
        if (TwitchPlaySettings.data.SkipModManagerInstructionScreen || IRCConnection.Instance.State == IRCConnectionState.Connected)
        {
            ModManagerManualInstructionScreen.HasShownOnce = true;
        }
    }
Example #20
0
    private bool HandleKey(string[] modulesBefore, IEnumerable <string> modulesAfter, FieldInfo keyTurned, FieldInfo otherKeyTurned, FieldInfo beforeKeyField, MethodInfo onKeyTurn, FieldInfo animatorField)
    {
        if (!GetValue(ActivatedField) || GetValue(keyTurned))
        {
            return(false);
        }
        KMBombInfo   bombInfo    = Module.BombComponent.GetComponent <KMBombInfo>();
        KMBombModule bombModule  = Module.BombComponent.GetComponent <KMBombModule>();
        KMAudio      bombAudio   = Module.BombComponent.GetComponent <KMAudio>();
        Animator     keyAnimator = (Animator)animatorField.GetValue(Module.BombComponent.GetComponent(ComponentType));

        if (TwitchPlaySettings.data.EnforceSolveAllBeforeTurningKeys &&
            modulesAfter.Any(x => bombInfo.GetSolvedModuleNames().Count(x.Equals) != bombInfo.GetSolvableModuleNames().Count(x.Equals)))
        {
            keyAnimator.SetTrigger("WrongTurn");
            bombAudio.PlaySoundAtTransform("WrongKeyTurnFK", Module.transform);
            bombModule.HandleStrike();
            return(false);
        }

        beforeKeyField.SetValue(null, TwitchPlaySettings.data.DisableTurnTheKeysSoftLock ? new string[0] : modulesBefore);
        onKeyTurn.Invoke(Module.BombComponent.GetComponent(ComponentType), null);
        if (GetValue(keyTurned))
        {
            //Check to see if any forbidden modules for this key were solved.
            if (TwitchPlaySettings.data.DisableTurnTheKeysSoftLock && bombInfo.GetSolvedModuleNames().Any(modulesBefore.Contains))
            {
                bombModule.HandleStrike();                 //If so, Award a strike for it.
            }
            if (!GetValue(otherKeyTurned))
            {
                return(false);
            }
            int modules = bombInfo.GetSolvedModuleNames().Count(x => RightAfterA.Contains(x) || LeftAfterA.Contains(x));
            TwitchPlaySettings.AddRewardBonus((2 * modules * OtherModes.ScoreMultiplier).RoundToInt());
            IRCConnection.SendMessage($"Reward increased by {modules * 2} for defusing module !{Code} ({bombModule.ModuleDisplayName}).");
        }
        else
        {
            keyAnimator.SetTrigger("WrongTurn");
            bombAudio.PlaySoundAtTransform("WrongKeyTurnFK", Module.transform);
        }
        return(false);
    }
 private void AwardSolve(string userNickName, int ComponentValue)
 {
     if (OtherModes.ZenModeOn)
     {
         ComponentValue = (int)Math.Ceiling(ComponentValue * 0.20f);
     }
     if (userNickName == null)
     {
         TwitchPlaySettings.AddRewardBonus(ComponentValue);
     }
     else
     {
         string headerText = UnsupportedModule ? modInfo.moduleDisplayName : BombComponent.GetModuleDisplayName();
         IRCConnection.Instance.SendMessage(TwitchPlaySettings.data.AwardSolve, Code, userNickName, ComponentValue, headerText);
         string RecordMessageTone = $"Module ID: {Code} | Player: {userNickName} | Module Name: {headerText} | Value: {ComponentValue}";
         Leaderboard.Instance?.AddSolve(userNickName);
         if (!UserAccess.HasAccess(userNickName, AccessLevel.NoPoints))
         {
             Leaderboard.Instance?.AddScore(userNickName, ComponentValue);
         }
         else
         {
             TwitchPlaySettings.AddRewardBonus(ComponentValue);
         }
         TwitchPlaySettings.AppendToSolveStrikeLog(RecordMessageTone);
         TwitchPlaySettings.AppendToPlayerLog(userNickName);
     }
     if (OtherModes.TimeModeOn)
     {
         float time = OtherModes.GetAdjustedMultiplier() * ComponentValue;
         if (time < TwitchPlaySettings.data.TimeModeMinimumTimeGained)
         {
             BombCommander.timerComponent.TimeRemaining = BombCommander.CurrentTimer + TwitchPlaySettings.data.TimeModeMinimumTimeGained;
             IRCConnection.Instance.SendMessage("Bomb time increased by the minimum {0} seconds!", TwitchPlaySettings.data.TimeModeMinimumTimeGained);
         }
         else
         {
             BombCommander.timerComponent.TimeRemaining = BombCommander.CurrentTimer + time;
             IRCConnection.Instance.SendMessage("Bomb time increased by {0} seconds!", Math.Round(time, 1));
         }
         OtherModes.SetMultiplier(OtherModes.GetMultiplier() + TwitchPlaySettings.data.TimeModeSolveBonus);
     }
 }
Example #22
0
    public static void Status(TwitchBomb bomb, string user, bool isWhisper)
    {
        int currentReward = TwitchPlaySettings.GetRewardBonus();

        if (OtherModes.TimeModeOn)
        {
            IRCConnection.SendMessage(string.Format(TwitchPlaySettings.data.BombStatusTimeMode, bomb.GetFullFormattedTime, bomb.GetFullStartingTime,
                                                    OtherModes.GetAdjustedMultiplier(), bomb.BombSolvedModules, bomb.BombSolvableModules, currentReward), user, !isWhisper);
        }
        else if (OtherModes.VSModeOn)
        {
            IRCConnection.SendMessage(string.Format(TwitchPlaySettings.data.BombStatusVsMode, bomb.GetFullFormattedTime,
                                                    bomb.GetFullStartingTime, OtherModes.goodHealth, OtherModes.evilHealth, currentReward), user, !isWhisper);
        }
        else
        {
            IRCConnection.SendMessage(string.Format(TwitchPlaySettings.data.BombStatus, bomb.GetFullFormattedTime, bomb.GetFullStartingTime,
                                                    bomb.StrikeCount, bomb.StrikeLimit, bomb.BombSolvedModules, bomb.BombSolvableModules, currentReward), user, !isWhisper);
        }
    }
Example #23
0
    public static IEnumerator Retry(string user, bool isWhisper)
    {
        var resultPage = Object.FindObjectOfType <ResultPage>();

        if (!TwitchGame.RetryAllowed)
        {
            IRCConnection.SendMessage(TwitchPlaySettings.data.RetryModeOrProfileChange, user, isWhisper);
            return(DoButton(resultPage.ContinueButton));
        }
        if (!TwitchPlaySettings.data.EnableRetryButton || resultPage.RetryButton == null)
        {
            IRCConnection.SendMessage(TwitchPlaySettings.data.RetryInactive, user, isWhisper);
            return(DoButton(resultPage.ContinueButton));
        }
        else
        {
            TwitchPlaySettings.SetRetryReward();
            return(DoButton(resultPage.RetryButton));
        }
    }
Example #24
0
 public void UpdateConfidence()
 {
     if (OtherModes.TimeModeOn)
     {
         float timedMultiplier = OtherModes.GetAdjustedMultiplier();
         ConfidencePrefab.color = Color.yellow;
         string conf = "x" + $"{timedMultiplier:0.0}";
         string pts  = "+" + $"{TwitchPlaySettings.GetRewardBonus():0}";
         ConfidencePrefab.text = pts;
         StrikesPrefab.color   = Color.yellow;
         StrikesPrefab.text    = conf;
     }
     else if (OtherModes.ZenModeOn)
     {
         ConfidencePrefab.color = Color.yellow;
         string pts = "+" + $"{TwitchPlaySettings.GetRewardBonus():0}";
         ConfidencePrefab.text = pts;
         StrikesPrefab.color   = Color.red;
         if (_currentBomb != null)
         {
             StrikesPrefab.text = _currentBomb.StrikeCount.ToString();
         }
     }
     else if (OtherModes.VSModeOn)
     {
         int bossHealth = OtherModes.GetEvilHealth();
         int teamHealth = OtherModes.GetGoodHealth();
         StrikesPrefab.color    = Color.cyan;
         ConfidencePrefab.color = Color.red;
         StrikesPrefab.text     = $"{teamHealth} HP";
         ConfidencePrefab.text  = $"{bossHealth} HP";
     }
     else
     {
         ConfidencePrefab.color = Color.yellow;
         string pts = $"+{TwitchPlaySettings.GetRewardBonus():0}";
         ConfidencePrefab.text = pts;
     }
 }
Example #25
0
    private void AwardSolve(string userNickName, ICommandResponseNotifier responseNotifier, int ComponentValue)
    {
        string headerText = UnsupportedModule ? modInfo.moduleDisplayName : BombComponent.GetModuleDisplayName();

        IRCConnection.SendMessage(TwitchPlaySettings.data.AwardSolve, Code, userNickName, ComponentValue, headerText);
        string RecordMessageTone = $"Module ID: {Code} | Player: {userNickName} | Module Name: {headerText} | Value: {ComponentValue}";

        responseNotifier.ProcessResponse(CommandResponse.EndComplete, ComponentValue);
        TwitchPlaySettings.AppendToSolveStrikeLog(RecordMessageTone);
        TwitchPlaySettings.AppendToPlayerLog(userNickName);
        if (OtherModes.timedModeOn)
        {
            float multiplier = OtherModes.getMultiplier();
            float time       = multiplier * ComponentValue;
            BombCommander.timerComponent.TimeRemaining = BombCommander.CurrentTimer + time;
            IRCConnection.SendMessage("Bomb time increased by {0} seconds!", Math.Round(time, 1));
            if (multiplier < 10)
            {
                multiplier = multiplier + 0.1f;
                OtherModes.setMultiplier(multiplier);
            }
        }
    }
Example #26
0
    public IEnumerator RespondToCommand(string userNickName, string message, ICommandResponseNotifier responseNotifier, bool isWhisper = false)
    {
        Selectable button = null;

        message = message.ToLowerInvariant().Trim();

        if (message.EqualsAny("!continue", "!back"))
        {
            button = ContinueButton;
        }
        else if (message.Equals("!retry"))
        {
            if (!TwitchPlaySettings.data.EnableRetryButton)
            {
                IRCConnection.Instance.SendMessage(TwitchPlaySettings.data.RetryInactive, userNickName, !isWhisper);
            }
            else
            {
                TwitchPlaySettings.SetRetryReward();
            }
            button = TwitchPlaySettings.data.EnableRetryButton ? RetryButton : ContinueButton;
        }

        if (button == null)
        {
            yield break;
        }

        // Press the button twice, in case the first is too early and skips the message instead
        for (int i = 0; i < 2; i++)
        {
            DoInteractionStart(button);
            yield return(new WaitForSeconds(0.1f));

            DoInteractionEnd(button);
        }
    }
Example #27
0
    public static void NewBomb(string user, bool isWhisper)
    {
        if (!OtherModes.ZenModeOn)
        {
            IRCConnection.SendMessage($"Sorry {user}, the newbomb command is only allowed in Zen mode.", user, !isWhisper);
            return;
        }
        if (isWhisper)
        {
            IRCConnection.SendMessage($"Sorry {user}, the newbomb command is not allowed in whispers.", user, !isWhisper);
            return;
        }

        Leaderboard.Instance.GetRank(user, out var entry);
        if (entry.SolveScore < TwitchPlaySettings.data.MinScoreForNewbomb && !UserAccess.HasAccess(user, AccessLevel.Defuser, true))
        {
            IRCConnection.SendMessage($"Sorry {user}, you don’t have enough points to use the newbomb command.");
        }
        else
        {
            TwitchPlaySettings.AddRewardBonus(-TwitchPlaySettings.GetRewardBonus());

            foreach (var bomb in TwitchGame.Instance.Bombs.Where(x => GameRoom.Instance.IsCurrentBomb(x.BombID)))
            {
                bomb.Bomb.GetTimer().StopTimer();
            }

            foreach (var module in TwitchGame.Instance.Modules.Where(x => GameRoom.Instance.IsCurrentBomb(x.BombID)))
            {
                if (!module.Solved)
                {
                    module.SolveSilently();
                }
            }
        }
    }
Example #28
0
    private MessageResponder GetActiveResponder(KMGameInfo.State state)
    {
        switch (state)
        {
        case KMGameInfo.State.Gameplay:
            return(bombMessageResponder);

        case KMGameInfo.State.Setup:
            StartCoroutine(VanillaRuleModifier.Refresh());
            StartCoroutine(MultipleBombs.Refresh());
            return(missionMessageResponder);

        case KMGameInfo.State.PostGame:
            return(postGameMessageResponder);

        case KMGameInfo.State.Transitioning:
            ModuleData.LoadDataFromFile();
            TwitchPlaySettings.LoadDataFromFile();
            return(null);

        default:
            return(null);
        }
    }
Example #29
0
    public override IEnumerator ReportBombStatus()
    {
        if (_gameroom.GetType() == _factoryStaticModeType)
        {
            IEnumerator baseIEnumerator = base.ReportBombStatus();
            while (baseIEnumerator.MoveNext())
            {
                yield return(baseIEnumerator.Current);
            }
            yield break;
        }
        InitializeOnLightsOn = false;

        TwitchBomb bombHandle = TwitchGame.Instance.Bombs[0];

        bombHandle.BombName = _infiniteMode ? "Infinite bombs incoming" : $"{BombCount} bombs incoming";

        yield return(new WaitUntil(() => GetBomb != null || bombHandle.Bomb.HasDetonated));

        if (bombHandle.Bomb.HasDetonated && !_zenMode)
        {
            yield break;
        }

        float currentBombTimer = bombHandle.CurrentTimer + 5;
        int   currentBombID    = 1;

        while (GetBomb != null)
        {
            Object currentBomb = GetBomb;

            TimerComponent timerComponent = bombHandle.Bomb.GetTimer();
            yield return(new WaitUntil(() => timerComponent.IsActive));

            if (Math.Abs(currentBombTimer - bombHandle.CurrentTimer) > 1f)
            {
                yield return(null);

                InitializeGameModes(true);
            }

            bool enableCameraWall = OtherModes.TrainingModeOn && IRCConnection.Instance.State == IRCConnectionState.Connected && TwitchPlaySettings.data.EnableFactoryTrainingModeCameraWall;
            if (enableCameraWall != TwitchGame.ModuleCameras.CameraWallEnabled)
            {
                if (enableCameraWall)
                {
                    TwitchGame.ModuleCameras.EnableCameraWall();
                }
                else
                {
                    TwitchGame.ModuleCameras.DisableCameraWall();
                }
            }
            bombHandle.BombName = $"Bomb {currentBombID} of {(_infiniteMode ? "∞" : BombCount.ToString())}";
            IRCConnection.SendMessage($"Bomb {currentBombID++} of {(_infiniteMode ? "∞" : BombCount.ToString())} is now live.");

            if (TwitchPlaySettings.data.EnableAutomaticEdgework)
            {
                bombHandle.FillEdgework();
            }
            else
            {
                bombHandle.EdgeworkText.text = TwitchPlaySettings.data.BlankBombEdgework;
            }
            if (OtherModes.Unexplodable)
            {
                bombHandle.StrikeLimit += bombHandle.StrikeCount;
            }

            IEnumerator bombHold = bombHandle.HoldBomb();
            while (bombHold.MoveNext())
            {
                yield return(bombHold.Current);
            }

            Bomb bomb1 = (Bomb)_internalBombProperty.GetValue(currentBomb, null);
            yield return(new WaitUntil(() =>
            {
                bool result = bomb1.HasDetonated || bomb1.IsSolved() || !TwitchGame.BombActive;
                if (!result || OtherModes.TimeModeOn)
                {
                    currentBombTimer = bomb1.GetTimer().TimeRemaining;
                }
                return result;
            }));

            if (!TwitchGame.BombActive)
            {
                yield break;
            }

            IRCConnection.SendMessage(TwitchGame.Instance.GetBombResult(false));
            TwitchPlaySettings.SetRetryReward();

            foreach (TwitchModule handle in TwitchGame.Instance.Modules)
            {
                //If the camera is still attached to the bomb component when the bomb gets destroyed, then THAT camera is destroyed as wel.
                TwitchGame.ModuleCameras.UnviewModule(handle);
            }

            if (TwitchPlaySettings.data.EnableFactoryAutomaticNextBomb)
            {
                bombHold = bombHandle.LetGoBomb();
                while (bombHold.MoveNext())
                {
                    yield return(bombHold.Current);
                }
                yield return(new WaitForSeconds(1.0f));

                //If for some reason we are somehow still holding the bomb, then the Let go did not register.
                //Try again exactly one more time.
                if (currentBomb == GetBomb)
                {
                    bombHold = bombHandle.HoldBomb();
                    while (bombHold.MoveNext())
                    {
                        yield return(bombHold.Current);
                    }
                    yield return(new WaitForSeconds(0.10f));

                    bombHold = bombHandle.LetGoBomb();
                    while (bombHold.MoveNext())
                    {
                        yield return(bombHold.Current);
                    }
                }
            }

            //If we are still holding the bomb, wait for it to actually be put down manually, or by a Twitch plays Drop bomb command.
            while (currentBomb == GetBomb)
            {
                yield return(new WaitForSeconds(0.1f));
            }

            bombHandle.StartCoroutine(DestroyBomb(currentBomb));

            if (GetBomb == null)
            {
                continue;
            }
            Bomb bomb = (Bomb)_internalBombProperty.GetValue(GetBomb, null);
            InitializeBomb(bomb, true);
        }
    }
    public string GetBombResult(bool lastBomb = true)
    {
        bool   hasDetonated           = false;
        bool   hasBeenSolved          = true;
        float  timeStarting           = float.MaxValue;
        float  timeRemaining          = float.MaxValue;
        string timeRemainingFormatted = "";

        foreach (TwitchBomb bomb in Bombs)
        {
            if (bomb == null)
            {
                continue;
            }

            hasDetonated  |= bomb.Bomb.HasDetonated;
            hasBeenSolved &= bomb.IsSolved;
            if (timeRemaining > bomb.CurrentTimer)
            {
                timeStarting  = bomb.BombStartingTimer;
                timeRemaining = bomb.CurrentTimer;
            }

            if (!string.IsNullOrEmpty(timeRemainingFormatted))
            {
                timeRemainingFormatted += ", " + bomb.GetFullFormattedTime;
            }
            else
            {
                timeRemainingFormatted = bomb.GetFullFormattedTime;
            }
        }

        string bombMessage = "";

        if (OtherModes.VSModeOn && (hasDetonated || hasBeenSolved))
        {
            OtherModes.Team winner = OtherModes.Team.Good;
            if (OtherModes.GetGoodHealth() == 0)
            {
                winner      = OtherModes.Team.Evil;
                bombMessage = TwitchPlaySettings.data.VersusEvilHeader;
            }
            else if (OtherModes.GetEvilHealth() == 0)
            {
                winner      = OtherModes.Team.Good;
                bombMessage = TwitchPlaySettings.data.VersusGoodHeader;
            }

            bombMessage += string.Format(TwitchPlaySettings.data.VersusEndMessage,
                                         winner == OtherModes.Team.Good ? "good" : "evil", timeRemainingFormatted);
            bombMessage += TwitchPlaySettings.GiveBonusPoints();

            if (winner == OtherModes.Team.Good)
            {
                bombMessage += TwitchPlaySettings.data.VersusGoodFooter;
            }
            else if (winner == OtherModes.Team.Evil)
            {
                bombMessage += TwitchPlaySettings.data.VersusEvilFooter;
            }

            if (lastBomb && hasBeenSolved)
            {
                Leaderboard.Instance.Success = true;
            }
        }
        else if (hasDetonated)
        {
            bombMessage = string.Format(TwitchPlaySettings.data.BombExplodedMessage, timeRemainingFormatted);
            Leaderboard.Instance.BombsExploded += Bombs.Count;
            if (!lastBomb)
            {
                return(bombMessage);
            }

            Leaderboard.Instance.Success = false;
            TwitchPlaySettings.ClearPlayerLog();
        }
        else if (hasBeenSolved)
        {
            bombMessage = string.Format(TwitchPlaySettings.data.BombDefusedMessage, timeRemainingFormatted);

            Leaderboard.Instance.BombsCleared += Bombs.Count;
            bombMessage += TwitchPlaySettings.GiveBonusPoints();

            if (lastBomb)
            {
                Leaderboard.Instance.Success = true;
            }

            if (Leaderboard.Instance.CurrentSolvers.Count != 1)
            {
                return(bombMessage);
            }

            float  elapsedTime = timeStarting - timeRemaining;
            string userName    = "";
            foreach (string uName in Leaderboard.Instance.CurrentSolvers.Keys)
            {
                userName = uName;
                break;
            }
            if (Leaderboard.Instance.CurrentSolvers[userName] == Leaderboard.RequiredSoloSolves * Bombs.Count && OtherModes.currentMode == TwitchPlaysMode.Normal)
            {
                Leaderboard.Instance.AddSoloClear(userName, elapsedTime, out float previousRecord);
                if (TwitchPlaySettings.data.EnableSoloPlayMode)
                {
                    //Still record solo information, should the defuser be the only one to actually defuse a 11 * bomb-count bomb, but display normal leaderboards instead if
                    //solo play is disabled.
                    TimeSpan elapsedTimeSpan = TimeSpan.FromSeconds(elapsedTime);
                    string   soloMessage     = string.Format(TwitchPlaySettings.data.BombSoloDefusalMessage, Leaderboard.Instance.SoloSolver.UserName, (int)elapsedTimeSpan.TotalMinutes, elapsedTimeSpan.Seconds);
                    if (elapsedTime < previousRecord)
                    {
                        TimeSpan previousTimeSpan = TimeSpan.FromSeconds(previousRecord);
                        soloMessage += string.Format(TwitchPlaySettings.data.BombSoloDefusalNewRecordMessage, (int)previousTimeSpan.TotalMinutes, previousTimeSpan.Seconds);
                    }
                    soloMessage += TwitchPlaySettings.data.BombSoloDefusalFooter;
                    ParentService.StartCoroutine(SendDelayedMessage(1.0f, soloMessage));
                }
                else
                {
                    Leaderboard.Instance.ClearSolo();
                }
            }
            else
            {
                Leaderboard.Instance.ClearSolo();
            }
        }
        else
        {
            bombMessage = string.Format(TwitchPlaySettings.data.BombAbortedMessage, timeRemainingFormatted);
            Leaderboard.Instance.Success = false;
            TwitchPlaySettings.ClearPlayerLog();
        }
        return(bombMessage);
    }