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