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 }) }); }); }
public void OnReady() { clientListener.SendMessage(new NetworkData { Type = MessageType.READY, Data = JsonConvert.SerializeObject(new ReadyData { Ready = true }) }); }
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) }); }
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; }); }