public override void HandleCardPlayed(Seats source, Suits suit, Ranks rank)
            {
#if syncTrace
                Log.Trace(4, "HostBoardResult.HandleCardPlayed {0} plays {2}{1}", source, suit.ToXML(), rank.ToXML());
#endif
                this.host.ThinkTime[source.Direction()].Stop();
                //this.host.boardTime[source.Direction()] = this.host.boardTime[source.Direction()].Add(timer.Elapsed.Subtract(new TimeSpan(this.host.clients[source].communicationLag)));
                base.HandleCardPlayed(source, suit, rank);
                for (Seats s = Seats.North; s <= Seats.West; s++)
                {
                    if ((s != source && !(s == this.Auction.Declarer && source == this.Play.Dummy)) ||
                        (s == source && source == this.Play.Dummy)
                        )
                    {
                        this.host.clients[s].WriteData("{0} plays {2}{1}", source, suit.ToXML(), rank.ToXML());
                    }

                    if (this.Play.currentTrick == 1 && this.Play.man == 2)
                    {   // 1st card: need to send dummies cards
#if syncTrace
                        //Log.Trace("HostBoardResult.HandleCardPlayed 1st card to {0}", s);
#endif
                        var mustPause = s == this.Play.Dummy;
                        lock (this.host.clients) this.host.clients[s].Pause = mustPause;
                        this.host.clients[s].state = s == this.Play.Dummy ? TableManagerProtocolState.GiveDummiesCards : TableManagerProtocolState.WaitForDummiesCards;
                    }
                }
            }
        internal static string Translate(Seats s, Distribution d)
        {
            // "North's cards : S A K J 6.H A K J.D 8 6 2.C A 7 6."
            // Meadowlark expects ". " between suits
            var cards = string.Format("{0}'s cards : ", s.ToXMLFull());

            for (Suits suit = Suits.Spades; suit >= Suits.Clubs; suit--)
            {
                cards += suit.ToXML();
                for (Ranks rank = Ranks.Ace; rank >= Ranks.Two; rank--)
                {
                    if (d.Owns(s, suit, rank))
                    {
                        cards += " " + rank.ToXML();
                    }
                }
                cards += ".";
            }

            return(cards);
        }
        public override void HandleCardPlayed(Seats source, Suits suit, Ranks rank)
        {
            Log.Trace(4, "{3}.BoardResultRecorder.HandleCardPlayed: {0} played {2}{1}", source, suit.ToXML().ToLower(), rank.ToXML(), this.Owner);
            if (this.thePlay != null && this.theDistribution != null)
            {
                this.thePlay.Record(suit, rank);
                if (!this.theDistribution.Owns(source, suit, rank))
                {
                    //  throw new FatalBridgeException(string.Format("{0} does not own {1}", source, card));
                    /// 18-03-08: cannot check here: hosted tournaments get a card at the moment the card is played
                    this.Distribution.Give(source, suit, rank);
                }

                this.theDistribution.Played(source, suit, rank);
            }
        }
 public override void HandleCardPosition(Seats seat, Suits suit, Ranks rank)
 {
     if (this.theDistribution.Incomplete)
     {       // this should only happen in a hosted tournament
         Log.Trace(4, "{3}.BoardResultRecorder.HandleCardPosition: {0} gets {2}{1}", seat, suit.ToXML().ToLower(), rank.ToXML(), this.Owner);
         this.theDistribution.Give(seat, suit, rank);
     }
 }