//----------------------------------------------------------------------------- // QuestLine.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; namespace RolePlaying.Data { /// /// A line of quests, presented to the player in order. /// /// /// In other words, only one quest is presented at a time and /// must be competed before the line can continue. /// public class QuestLine : ContentObject #if WINDOWS , ICloneable #endif { /// /// The name of the quest line. /// private string name; /// /// The name of the quest line. /// public string Name { get { return name; } set { name = value; } } /// /// An ordered list of content names of quests that will be presented in order. /// private List questContentNames = new List(); /// /// An ordered list of content names of quests that will be presented in order. /// public List QuestContentNames { get { return questContentNames; } set { questContentNames = value; } } /// /// An ordered list of quests that will be presented in order. /// private List quests = new List(); /// /// An ordered list of quests that will be presented in order. /// [ContentSerializerIgnore] public List Quests { get { return quests; } } /// /// Reads a QuestLine object from the content pipeline. /// public class QuestLineReader : ContentTypeReader { /// /// Reads a QuestLine object from the content pipeline. /// protected override QuestLine Read(ContentReader input, QuestLine existingInstance) { QuestLine questLine = existingInstance; if (questLine == null) { questLine = new QuestLine(); } questLine.AssetName = input.AssetName; questLine.Name = input.ReadString(); questLine.QuestContentNames.AddRange(input.ReadObject>()); foreach (string contentName in questLine.QuestContentNames) { questLine.quests.Add(input.ContentManager.Load( Path.Combine("Quests", contentName))); } return questLine; } } public object Clone() { QuestLine questLine = new QuestLine(); questLine.AssetName = AssetName; questLine.name = name; questLine.questContentNames.AddRange(questContentNames); foreach (Quest quest in quests) { questLine.quests.Add(quest.Clone() as Quest); } return questLine; } public static QuestLine Load(string questPath) { var asset = XmlHelper.GetAssetElementFromXML(questPath); var name = asset.Element("Name").Value; var questContentNames = asset.Element("QuestContentNames") .Elements("Item") .Select(x => (string)x) .ToList(); var loadedQuestLine = new QuestLine { Name = name, QuestContentNames = questContentNames, }; return loadedQuestLine; } } }