QuestLine.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //-----------------------------------------------------------------------------
  2. // QuestLine.cs
  3. //
  4. // Microsoft XNA Community Game Platform
  5. // Copyright (C) Microsoft Corporation. All rights reserved.
  6. //-----------------------------------------------------------------------------
  7. using Microsoft.Xna.Framework;
  8. using Microsoft.Xna.Framework.Content;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Xml.Linq;
  14. namespace RolePlaying.Data
  15. {
  16. /// <summary>
  17. /// A line of quests, presented to the player in order.
  18. /// </summary>
  19. /// <remarks>
  20. /// In other words, only one quest is presented at a time and
  21. /// must be competed before the line can continue.
  22. /// </remarks>
  23. public class QuestLine : ContentObject
  24. #if WINDOWS
  25. , ICloneable
  26. #endif
  27. {
  28. /// <summary>
  29. /// The name of the quest line.
  30. /// </summary>
  31. private string name;
  32. /// <summary>
  33. /// The name of the quest line.
  34. /// </summary>
  35. public string Name
  36. {
  37. get { return name; }
  38. set { name = value; }
  39. }
  40. /// <summary>
  41. /// An ordered list of content names of quests that will be presented in order.
  42. /// </summary>
  43. private List<string> questContentNames = new List<string>();
  44. /// <summary>
  45. /// An ordered list of content names of quests that will be presented in order.
  46. /// </summary>
  47. public List<string> QuestContentNames
  48. {
  49. get { return questContentNames; }
  50. set { questContentNames = value; }
  51. }
  52. /// <summary>
  53. /// An ordered list of quests that will be presented in order.
  54. /// </summary>
  55. private List<Quest> quests = new List<Quest>();
  56. /// <summary>
  57. /// An ordered list of quests that will be presented in order.
  58. /// </summary>
  59. [ContentSerializerIgnore]
  60. public List<Quest> Quests
  61. {
  62. get { return quests; }
  63. }
  64. /// <summary>
  65. /// Reads a QuestLine object from the content pipeline.
  66. /// </summary>
  67. public class QuestLineReader : ContentTypeReader<QuestLine>
  68. {
  69. /// <summary>
  70. /// Reads a QuestLine object from the content pipeline.
  71. /// </summary>
  72. protected override QuestLine Read(ContentReader input,
  73. QuestLine existingInstance)
  74. {
  75. QuestLine questLine = existingInstance;
  76. if (questLine == null)
  77. {
  78. questLine = new QuestLine();
  79. }
  80. questLine.AssetName = input.AssetName;
  81. questLine.Name = input.ReadString();
  82. questLine.QuestContentNames.AddRange(input.ReadObject<List<string>>());
  83. foreach (string contentName in questLine.QuestContentNames)
  84. {
  85. questLine.quests.Add(input.ContentManager.Load<Quest>(
  86. Path.Combine("Quests", contentName)));
  87. }
  88. return questLine;
  89. }
  90. }
  91. public object Clone()
  92. {
  93. QuestLine questLine = new QuestLine();
  94. questLine.AssetName = AssetName;
  95. questLine.name = name;
  96. questLine.questContentNames.AddRange(questContentNames);
  97. foreach (Quest quest in quests)
  98. {
  99. questLine.quests.Add(quest.Clone() as Quest);
  100. }
  101. return questLine;
  102. }
  103. public static QuestLine Load(string questPath)
  104. {
  105. var asset = XmlHelper.GetAssetElementFromXML(questPath);
  106. var name = asset.Element("Name").Value;
  107. var questContentNames = asset.Element("QuestContentNames")
  108. .Elements("Item")
  109. .Select(x => (string)x)
  110. .ToList();
  111. var loadedQuestLine = new QuestLine
  112. {
  113. Name = name,
  114. QuestContentNames = questContentNames,
  115. };
  116. return loadedQuestLine;
  117. }
  118. }
  119. }