/// <summary> /// Saves the player document. /// </summary> /// <param name="playerDocument">The player document to be saved.</param> public static void SavePlayerDocument(PlayerDocument playerDocument) { using (var ravenSession = DalUtils.GetRavenSession()) { // RavenDB will automatically either insert a new document or update the // existing document with this document ID, as appropriate. ravenSession.Store(playerDocument); ravenSession.SaveChanges(); } }
/// <summary>Translates from <see cref="PlayerDocument"/> to a <see cref="Thing"/>.</summary> /// <param name="player">The player.</param> /// <param name="playerDocument">The player document.</param> private void TranslateFromPlayerDocument(ref Thing player, PlayerDocument playerDocument) { foreach (var persistedAsBehavior in playerDocument.Behaviors.ToArray()) { player.Behaviors.Add(persistedAsBehavior as Behavior); } foreach (var persistedStat in playerDocument.Stats) { player.Stats.Add(persistedStat.Key, persistedStat.Value as GameStat); } foreach (var persistedSecondary in playerDocument.SecondaryStats) { player.Attributes.Add(persistedSecondary.Key, persistedSecondary.Value as GameAttribute); } foreach (var persistedSkill in playerDocument.Skills) { player.Skills.Add(persistedSkill.Key, persistedSkill.Value as GameSkill); } foreach (var persistedChild in playerDocument.SubThings) { player.Children.Add(persistedChild as Thing); } }
/// <summary> /// Save the whole player Thing (not just this PlayerBehavior). /// </summary> public void SaveWholePlayer() { var player = this.Parent; if (player != null) { this.Save(); // Set the behavior id to correspond to the database id of the player. // @@@ TODO: Why? Shouldn't Behavior IDs be unique too? var playerBehaviors = player.Behaviors.AllBehaviors; foreach (var behavior in playerBehaviors) { behavior.ID = this.PlayerData.ID; } // Link our unique player ID and PlayerBehavior ID but in a RavenDB-friendly format. player.ID = "player/" + this.PlayerData.ID; // Create a PlayerDocument to be saved. var bundle = new PlayerDocument { DatabaseId = this.PlayerData.ID, Name = player.Name, LastUpdatedDate = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"), Behaviors = new List<IPersistsWithPlayer>(), Stats = new Dictionary<string, IPersistsWithPlayer>(), SecondaryStats = new Dictionary<string, IPersistsWithPlayer>(), Skills = new Dictionary<string, IPersistsWithPlayer>(), SubThings = new List<IThing>(), PlayerPrompt = this.Prompt, }; bundle.Behaviors.AddRange(playerBehaviors); foreach (var stat in player.Stats) { bundle.Stats.Add(stat.Key, stat.Value); } foreach (var attribute in player.Attributes) { bundle.SecondaryStats.Add(attribute.Key, attribute.Value); } foreach (var skill in player.Skills) { bundle.Skills.Add(skill.Key, skill.Value); } foreach (var child in player.Children) { // Do not save any player as a sub-document of this one. if (child.Behaviors.FindFirst<PlayerBehavior>() == null) { bundle.SubThings.Add(child); } } // Save to the document database DocumentManager.SavePlayerDocument(bundle); } }