Example #1
0
    private void OnEnable()
    {
        loadingBackground.SetActive(true);
        lobby.SetActive(false);
        startGameButton.gameObject.SetActive(false);

        clientState.ConnectionState
        .TakeUntilDestroy(this)
        .Subscribe(state => {
            if (state == ClientState.ServerConnection.CONNECTED)
            {
                clientState.GameState.Value = ClientState.GameMode.LOBBY_WAITING;
            }
        });

        clientState.GameState
        .TakeUntilDisable(this)
        .Subscribe(HandleGameStateChanged);

        startGameButton.OnClickAsObservable()
        .First()
        .TakeUntilDisable(this)
        .Subscribe(_ =>
        {
            startGameButton.interactable = false;
            clientListener.SendMessage(new NetworkData
            {
                Type = MessageType.READY,
                Data = JsonConvert.SerializeObject(new ReadyData {
                    Ready = true
                })
            });
        });
    }
Example #2
0
 public void OnReady()
 {
     clientListener.SendMessage(new NetworkData {
         Type = MessageType.READY,
         Data = JsonConvert.SerializeObject(new ReadyData {
             Ready = true
         })
     });
 }
Example #3
0
    public void OnClick()
    {
        if (clientState.ButtonInteractable == false)
        {
            return;
        }

        if (buttonInfo.Type == ButtonType.TOGGLE)
        {
            buttonInfo.On = !buttonInfo.On;
        }

        client.SendMessage(new NetworkData {
            Type = MessageType.RESPONSE,
            Data = JsonConvert.SerializeObject(buttonInfo)
        });
    }
Example #4
0
    public void SetupPlayArea()
    {
        var levelObservable = clientState.CurrentLevel
                              .Where(level => level != null)
                              .DistinctUntilChanged();

        levelObservable
        .TakeUntilDisable(this)
        .Subscribe(level => {
            buttonList.ForEach(button => Destroy(button.gameObject));
            buttonList.Clear();

            foreach (var buttonData in level.Buttons)
            {
                var button = GetButton(buttonData);
                buttonList.Add(button);
            }
            TextAreaText.text = "Wait for instructions";
            // set health to max locally
            var levelCon  = levelConfig.LevelInfo[clientState.CurrentLevel.Value.Index];
            var maxHealth = levelCon.MaxHealth;
            clientState.CurrentHealth.Value = maxHealth;

            var texts       = levelCon.Names.Split(',');
            var loadingText = texts[UnityEngine.Random.Range(0, texts.Count())];

            LoadingText.text = loadingText;
        });

        levelObservable
        .TakeUntilDisable(this)
        .Do(_ => Loading.SetActive(true))
        .SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(LevelInfo.WaitTime / 2)).First())
        .Subscribe(level => Loading.SetActive(false));

        var instructionStream = clientState.CurrentInstruction
                                .Where(buttonInfo => buttonInfo != null)
                                .DistinctUntilChanged();

        instructionStream
        .TakeUntilDisable(this)
        .Subscribe(buttonInfo => {
            if (buttonInfo.Type == ButtonType.BUTTON)
            {
                TextAreaText.text = buttonInfo.ButtonTextOptions.Count > 0 ? buttonInfo.ButtonTextOptions[0] : "Not Found";
            }
            else if (buttonInfo.Type == ButtonType.TOGGLE)
            {
                TextAreaText.text = buttonInfo.On ? buttonInfo.ButtonTextOptions[0] : buttonInfo.ButtonTextOptions.Count > 1 ?  buttonInfo.ButtonTextOptions[1] : "Not Found";
            }
        });        //TODO:randomise

        instructionStream
        .TakeUntilDisable(this)
        .Select(_ => levelConfig.LevelInfo[clientState.CurrentLevel.Value.Index].Timeout)
        .SelectMany(totalTime => {
            clientState.ButtonInteractable = true;
            var timerObs = Observable.EveryUpdate()
                           .ObserveOnMainThread()
                           .TakeUntil(instructionStream.Skip(1))
                           .TakeUntil(levelObservable.Skip(1));

            var delta = totalTime;
            return(timerObs
                   .TakeUntil(timerObs.Where(val => {
                delta -= Time.deltaTime;
                return delta < 0;
            }))
                   .Select(val => {
                totalTime -= Time.deltaTime;
                return totalTime;
            })
                   .Finally(() => {
                if (delta <= 0)
                {
                    client.SendMessage(new NetworkData {
                        Type = MessageType.TIMER_OVER,
                        Data = JsonConvert.SerializeObject(clientState.CurrentInstruction.Value)
                    });
                    clientState.ButtonInteractable = false;
                }
            }));
        })
        .Subscribe(val => {
            var max = levelConfig.LevelInfo[clientState.CurrentLevel.Value.Index].Timeout;
            progressBar.fillAmount = val / max;
        });
    }