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(); } }