public GKTurnBasedMatch(Dictionary <string, object> dict)
    {
        if (dict.ContainsKey("matchId"))
        {
            matchId = dict["matchId"].ToString();
        }

        if (dict.ContainsKey("status"))
        {
            status = (GKTurnBasedMatchStatus)int.Parse(dict["status"].ToString());
        }

        if (dict.ContainsKey("message"))
        {
            message = dict["message"].ToString();
        }

        // grab and convert the date
        if (dict.ContainsKey("creationDate"))
        {
            var timeSinceEpoch = double.Parse(dict["creationDate"].ToString());
            var intermediate   = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            creationDate = intermediate.AddSeconds(timeSinceEpoch);
        }

        // get the participants
        if (dict.ContainsKey("participants"))
        {
            var participantsList = dict["participants"] as List <object>;
            participants = new List <GKTurnBasedParticipant>(participantsList.Count);

            foreach (Dictionary <string, object> particpantDict in participantsList)
            {
                if (particpantDict != null)
                {
                    participants.Add(new GKTurnBasedParticipant(particpantDict));
                }
                else
                {
                    participants.Add(new GKTurnBasedParticipant());
                }
            }
        }

        // get the current participant
        if (dict.ContainsKey("currentParticipant"))
        {
            currentParticipant = new GKTurnBasedParticipant(dict["currentParticipant"] as Dictionary <string, object>);
        }
    }
Example #2
0
        /// <summary>
        /// Constructs a new instance from the <see cref="EasyMobile.iOS.GameKit.GKTurnBasedParticipant"/> object.
        /// </summary>
        /// <returns>The GK turn based participant.</returns>
        /// <param name="gkParticipant">Gk participant.</param>
        internal static Participant FromGKTurnBasedParticipant(GKTurnBasedParticipant gkParticipant)
        {
            if (gkParticipant == null)
            {
                return(null);
            }

            var gkPlayer = gkParticipant.Player;

            return(new Participant(
                       gkPlayer != null ? gkPlayer.DisplayName : null,
                       gkPlayer != null ? gkPlayer.PlayerID : null,
                       gkParticipant.Status.ToParticipantStatus(),
                       Player.FromGKPlayer(gkPlayer),
                       gkParticipant.IsConnectedToRoom()));
        }
 public static bool IsConnectedToRoom(this GKTurnBasedParticipant participant)
 {
     return(participant.Status == GKTurnBasedParticipant.GKTurnBasedParticipantStatus.Active);
 }
Example #4
0
        /// <summary>
        /// Update versus match status
        /// </summary>
        public static void UpdateMatchFromPuzzle(PuzzleData puzzle, Action <NSError> callback)
        {
            if (puzzle.Match == null)
            {
                Logger.E("This puzzle contains no match data... Can't do anything!");
                return;
            }

            // Match data -> Puzzle + Image
            // -- Image as Base64 string
            UIImage image = UIImage.FromFile(puzzle.Filename);

            Byte[] byteArray = null;
            using (NSData nsImageData = image.AsPNG()) {
                byteArray = new Byte[nsImageData.Length];
                System.Runtime.InteropServices.Marshal.Copy(nsImageData.Bytes, byteArray, 0, Convert.ToInt32(nsImageData.Length));
            }

            string base64image = Convert.ToBase64String(byteArray);

            // -- Data
            TransferablePuzzleData tp = new TransferablePuzzleData();

            tp.Puzzle      = puzzle;
            tp.Base64Image = base64image;

            // Build an XML text
            string        xml           = string.Empty;
            XmlSerializer xmlSerializer = new XmlSerializer(tp.GetType());

            using (StringWriter textWriter = new StringWriter()) {
                xmlSerializer.Serialize(textWriter, tp);
                xml = textWriter.ToString();
            }

            xmlSerializer = null;

            // Xml to bytes
            NSData puzzleData = NSData.FromString(xml);

            // Next participant
            GKTurnBasedParticipant nextPlayer = null;

            foreach (var participant in puzzle.Match.Participants)
            {
                if (participant.PlayerID != GKLocalPlayer.LocalPlayer.PlayerID)
                {
                    nextPlayer = participant;
                    break;
                }
            }

            // Game center match progress
            // -- Already an opponent score? End
            if (puzzle.GetBestPlayerScore(nextPlayer.PlayerID).HasValue)
            {
                puzzle.Match.EndMatchInTurn(
                    puzzleData,
                    (err) => {
                    if (callback != null)
                    {
                        callback(err);
                    }
                }
                    );
            }
            else
            {
                // -- Send current score
                puzzle.Match.EndTurn(
                    new GKTurnBasedParticipant[] { nextPlayer },
                    120,
                    puzzleData,
                    callback
                    );
            }
        }