Exemple #1
0
        protected virtual void ProcessJsonEvent(JObject evt)
        {
            var eventName = (string)evt["event"];

            CommunicationLogger.LogDebug("received event {EventName}", eventName);

            bool playNow = false;

            switch (eventName)
            {
            case CurrentPlayerEventName:
            {
                // my turn? not my turn? (legacy)
                var currentPlayer = (string)evt["player"];
                playNow = (currentPlayer == ConnectionManager.MyNickname);
                break;
            }

            case CurrentPlayerOrderEventName:
            {
                // my turn? not my turn?
                var upcomingPlayers = (JArray)evt["order"];
                playNow    = ((string)upcomingPlayers[0] == ConnectionManager.MyNickname);
                NextPlayer = (upcomingPlayers.Count > 1)
                        ? (string)upcomingPlayers[1]
                        : null;
                // if upcomingPlayers.Count <= 2, then NextPlayer == PreviousPlayer
                PreviousPlayer = (upcomingPlayers.Count > 2)
                        ? (string)upcomingPlayers.Last
                        : null;
                // if upcomingPlayers.Count <= 2, then NextButOnePlayer == me
                NextButOnePlayer = (upcomingPlayers.Count > 2)
                        ? (string)upcomingPlayers[2]
                        : null;
                CurrentPlayers.Clear();
                CurrentPlayers.UnionWith(upcomingPlayers.Select(tok => (string)tok));
                break;
            }

            case CardCountsEventName:
            {
                var cardCounts = (JArray)evt["counts"];
                CurrentCardCounts.Clear();
                foreach (var playerAndCount in cardCounts.OfType <JObject>())
                {
                    var player = (string)playerAndCount["player"];
                    var count  = (int)playerAndCount["count"];
                    CurrentCardCounts[player] = count;
                }
                break;
            }

            case TopCardEventName:
            {
                var currentCardName = (string)evt["current_card"];
                TopCard = CardUtils.ParseColorAndValue(currentCardName).Value;
                break;
            }

            case HandInfoEventName:
            {
                var handCards = (JArray)evt["hand"];
                CurrentHand = handCards
                              .Select(e => CardUtils.ParseColorAndValue((string)e))
                              .Where(cav => cav.HasValue)
                              .Select(cav => cav.Value)
                              .ToList();
                if (LastHandCount > 0 && Config.ManyCardsCurseThreshold > 0 && CurrentHand.Count - LastHandCount >= Config.ManyCardsCurseThreshold)
                {
                    StrategyLogger.LogDebug("cursing because of overfilled hand");
                    Curse();
                }
                LastHandCount = CurrentHand.Count;
                break;
            }

            case CardDrawnEventName:
            {
                var player = (string)evt["player"];
                if (player == ConnectionManager.MyNickname)
                {
                    playNow = true;
                }
                break;
            }
            }

            if (playNow)
            {
                PlayACard();
            }
        }