private void HandleConnection(TextReader reader, TextWriter writer) { var startPushDto = new StartPushingStateAdminCommandDto(); var startPushJson = startPushDto.ToJson(); writer.WriteLine(startPushJson); reader.ReadLine(); while (!_finish) { var pushDataJson = reader.ReadLine(); var pushData = pushDataJson.FromJson <StatePushDto>(); lock (SynchronizationLock) { _gameEventPublisher.Handle(pushData); } } }
private void HandleConnection(TextReader reader, TextWriter writer) { var startPushDto = new StartPushingStateAdminCommandDto(); var startPushJson = startPushDto.ToJson(); writer.WriteLine(startPushJson); reader.ReadLine(); while (!_finish) { var pushDataJson = reader.ReadLine(); var pushData = pushDataJson.FromJson <StatePushDto>(); var customDataText = pushData.CustomGameModeData; var customData = customDataText.FromJson <ClassicGameModeDataDto>(); _playerStats = customData.PlayerStats.OrderByDescending(x => x.Score).ToList(); var remainingTime = pushData.TurnEndTime - DateTime.UtcNow; lock (SynchronizationLock) { ExecuteOnMainThread.Enqueue(() => { var playerIndex = 0; for (; playerIndex < _playerPanels.Count && playerIndex < _playerStats.Count; playerIndex++) { var panel = _playerPanels[playerIndex]; panel.SetActive(true); var player = _playerStats[playerIndex]; var image = panel.transform.FindChild("Image").gameObject; var imageRenderer = image.GetComponent <Image>(); var playerColor = PlayerColors[player.Id % PlayerColors.Count]; imageRenderer.canvasRenderer.SetColor(playerColor.MainColor); var playerName = panel.transform.FindChild("NameText").gameObject; var playerScore = panel.transform.FindChild("ScoreText").gameObject; playerName.GetComponent <Text>().text = player.Name; playerScore.GetComponent <Text>().text = player.Score.ToString(); } for (; playerIndex < _playerPanels.Count; playerIndex++) { var panel = _playerPanels[playerIndex]; panel.SetActive(false); } var timerText = _timerText.GetComponent <Text>(); var timerTextOutline = _timerText.GetComponent <Outline>(); timerText.text = string.Format("{0}:{1:D2}.{2:D3}", (int)remainingTime.TotalMinutes, remainingTime.Seconds, remainingTime.Milliseconds); if (remainingTime.TotalMilliseconds < 60000) { timerText.color = Color.Lerp(Color.red, Color.white, (float)remainingTime.TotalMilliseconds / 50000.0f); var alpha = 1.0f - (float)remainingTime.TotalMilliseconds / 50000.0f; timerTextOutline.effectColor = Color.Lerp(new Color(0.75f, 0.0f, 0.0f, alpha), new Color(1.0f, 0.5f, 0.0f, alpha), (Mathf.Sin(Time.time * 5.0f) + 1) / 2.0f); } else { timerText.color = Color.white; timerTextOutline.effectColor = new Color(0.0f, 0.0f, 0.0f, 0.0f); } var gameOverSprite = _gameOverSprite.GetComponent <SpriteRenderer>(); if (remainingTime.TotalMilliseconds < 3000) { var slerp = Vector3.Slerp(Vector3.right, Vector3.up * 2, (float)remainingTime.TotalMilliseconds / 3000.0f); var alpha = slerp.x; gameOverSprite.color = new Color(1.0f, 1.0f, 1.0f, alpha); } else { gameOverSprite.color = new Color(0.0f, 0.0f, 0.0f, 0.0f); } }); } foreach (var addedBlob in pushData.AddedBlobs) { var localBlob = addedBlob; lock (SynchronizationLock) { ExecuteOnMainThread.Enqueue(() => { var blobPrefab = localBlob.Type == BlobType.Virus ? _virusPrefab : _blobPrefabs[Random.Range(0, _blobPrefabs.Count)]; var blob = (GameObject)Instantiate(blobPrefab, new Vector3(), Quaternion.identity); blob.SetActive(true); blob.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, Random.Range(0, 360)); var blobAnimation = blob.GetComponent <BlobAnimation>(); switch (localBlob.Type) { case BlobType.Player: var player = _playerStats.FirstOrDefault(x => x.Name == localBlob.Name); if (player == null) { break; } var playerColor = PlayerColors[player.Id % PlayerColors.Count]; blobAnimation.SetColors( playerColor.MainColor, playerColor.SecondaryColor, playerColor.SubColor); break; case BlobType.Virus: blobAnimation.SetColors( ColorFromHex(0xa40000, 0.75f), ColorFromHex(0xef2929, 0.5f), ColorFromHex(0xcc0000, 0.5f)); break; case BlobType.Food: blobAnimation.SetColors( ColorFromHex(0x4e9a06, 0.75f), ColorFromHex(0x8ae234, 0.5f), ColorFromHex(0x73d216, 0.5f)); break; } if (_blobObjects.ContainsKey(localBlob.Id)) { RemoveBlob(localBlob.Id); } _blobObjects.Add(localBlob.Id, blob); SetBlobData(blob, localBlob, pushData.WorldSize); }); } } foreach (var updatedBlob in pushData.UpdatedBlobs) { lock (SynchronizationLock) { var localBlob = updatedBlob; ExecuteOnMainThread.Enqueue(() => { if (!_blobObjects.ContainsKey(localBlob.Id)) { return; } var blob = _blobObjects[localBlob.Id]; SetBlobData(blob, localBlob, pushData.WorldSize); }); } } foreach (var removedBlob in pushData.RemovedBlobs) { lock (SynchronizationLock) { var localBlob = removedBlob; ExecuteOnMainThread.Enqueue(() => { RemoveBlob(localBlob.Id); }); } } } }