Quest.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // Quest.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using Microsoft.Xna.Framework.Content;
  14. #endregion
  15. namespace RolePlayingGameData
  16. {
  17. /// <summary>
  18. /// A quest that the party can embark on, with goals and rewards.
  19. /// </summary>
  20. public class Quest : ContentObject
  21. #if WINDOWS
  22. , ICloneable
  23. #endif
  24. {
  25. #region Quest Stage
  26. /// <summary>
  27. /// The possible stages of a quest.
  28. /// </summary>
  29. public enum QuestStage
  30. {
  31. NotStarted,
  32. InProgress,
  33. RequirementsMet,
  34. Completed
  35. };
  36. /// <summary>
  37. /// The current stage of this quest.
  38. /// </summary>
  39. private QuestStage stage = QuestStage.NotStarted;
  40. /// <summary>
  41. /// The current stage of this quest.
  42. /// </summary>
  43. [ContentSerializerIgnore]
  44. public QuestStage Stage
  45. {
  46. get { return stage; }
  47. set { stage = value; }
  48. }
  49. #endregion
  50. #region Description
  51. /// <summary>
  52. /// The name of the quest.
  53. /// </summary>
  54. private string name;
  55. /// <summary>
  56. /// The name of the quest.
  57. /// </summary>
  58. public string Name
  59. {
  60. get { return name; }
  61. set { name = value; }
  62. }
  63. /// <summary>
  64. /// A description of the quest.
  65. /// </summary>
  66. private string description;
  67. /// <summary>
  68. /// A description of the quest.
  69. /// </summary>
  70. public string Description
  71. {
  72. get { return description; }
  73. set { description = value; }
  74. }
  75. /// <summary>
  76. /// A message describing the objective of the quest,
  77. /// presented when the player receives the quest.
  78. /// </summary>
  79. private string objectiveMessage;
  80. /// <summary>
  81. /// A message describing the objective of the quest,
  82. /// presented when the player receives the quest.
  83. /// </summary>
  84. public string ObjectiveMessage
  85. {
  86. get { return objectiveMessage; }
  87. set { objectiveMessage = value; }
  88. }
  89. /// <summary>
  90. /// A message announcing the completion of the quest,
  91. /// presented when the player reaches the goals of the quest.
  92. /// </summary>
  93. private string completionMessage;
  94. public string CompletionMessage
  95. {
  96. get { return completionMessage; }
  97. set { completionMessage = value; }
  98. }
  99. #endregion
  100. #region Requirements
  101. /// <summary>
  102. /// The gear that the player must have to finish the quest.
  103. /// </summary>
  104. private List<QuestRequirement<Gear>> gearRequirements =
  105. new List<QuestRequirement<Gear>>();
  106. /// <summary>
  107. /// The gear that the player must have to finish the quest.
  108. /// </summary>
  109. public List<QuestRequirement<Gear>> GearRequirements
  110. {
  111. get { return gearRequirements; }
  112. set { gearRequirements = value; }
  113. }
  114. /// <summary>
  115. /// The monsters that must be killed to finish the quest.
  116. /// </summary>
  117. private List<QuestRequirement<Monster>> monsterRequirements =
  118. new List<QuestRequirement<Monster>>();
  119. /// <summary>
  120. /// The monsters that must be killed to finish the quest.
  121. /// </summary>
  122. public List<QuestRequirement<Monster>> MonsterRequirements
  123. {
  124. get { return monsterRequirements; }
  125. set { monsterRequirements = value; }
  126. }
  127. /// <summary>
  128. /// Returns true if all requirements for this quest have been met.
  129. /// </summary>
  130. public bool AreRequirementsMet
  131. {
  132. get
  133. {
  134. foreach (QuestRequirement<Gear> gearRequirement in gearRequirements)
  135. {
  136. if (gearRequirement.CompletedCount < gearRequirement.Count)
  137. {
  138. return false;
  139. }
  140. }
  141. foreach (QuestRequirement<Monster> monsterRequirement
  142. in monsterRequirements)
  143. {
  144. if (monsterRequirement.CompletedCount < monsterRequirement.Count)
  145. {
  146. return false;
  147. }
  148. }
  149. return true;
  150. }
  151. }
  152. #endregion
  153. #region Quest Content
  154. /// <summary>
  155. /// The fixed combat encounters added to the world when this quest is active.
  156. /// </summary>
  157. private List<WorldEntry<FixedCombat>> fixedCombatEntries =
  158. new List<WorldEntry<FixedCombat>>();
  159. /// <summary>
  160. /// The fixed combat encounters added to the world when this quest is active.
  161. /// </summary>
  162. public List<WorldEntry<FixedCombat>> FixedCombatEntries
  163. {
  164. get { return fixedCombatEntries; }
  165. set { fixedCombatEntries = value; }
  166. }
  167. /// <summary>
  168. /// The chests added to thew orld when this quest is active.
  169. /// </summary>
  170. private List<WorldEntry<Chest>> chestEntries = new List<WorldEntry<Chest>>();
  171. /// <summary>
  172. /// The chests added to thew orld when this quest is active.
  173. /// </summary>
  174. public List<WorldEntry<Chest>> ChestEntries
  175. {
  176. get { return chestEntries; }
  177. set { chestEntries = value; }
  178. }
  179. #endregion
  180. #region Destination
  181. /// <summary>
  182. /// The map with the destination Npc, if any.
  183. /// </summary>
  184. private string destinationMapContentName;
  185. /// <summary>
  186. /// The map with the destination Npc, if any.
  187. /// </summary>
  188. [ContentSerializer(Optional = true)]
  189. public string DestinationMapContentName
  190. {
  191. get { return destinationMapContentName; }
  192. set { destinationMapContentName = value; }
  193. }
  194. /// <summary>
  195. /// The Npc that the party must visit to finish the quest, if any.
  196. /// </summary>
  197. private string destinationNpcContentName;
  198. /// <summary>
  199. /// The Npc that the party must visit to finish the quest, if any.
  200. /// </summary>
  201. [ContentSerializer(Optional = true)]
  202. public string DestinationNpcContentName
  203. {
  204. get { return destinationNpcContentName; }
  205. set { destinationNpcContentName = value; }
  206. }
  207. /// <summary>
  208. /// The message shown when the party is eligible to complete the quest, if any.
  209. /// </summary>
  210. private string destinationObjectiveMessage;
  211. /// <summary>
  212. /// The message shown when the party is eligible to complete the quest, if any.
  213. /// </summary>
  214. [ContentSerializer(Optional = true)]
  215. public string DestinationObjectiveMessage
  216. {
  217. get { return destinationObjectiveMessage; }
  218. set { destinationObjectiveMessage = value; }
  219. }
  220. #endregion
  221. #region Reward
  222. /// <summary>
  223. /// The number of experience points given to each party member as a reward.
  224. /// </summary>
  225. private int experienceReward;
  226. /// <summary>
  227. /// The number of experience points given to each party member as a reward.
  228. /// </summary>
  229. [ContentSerializer(Optional = true)]
  230. public int ExperienceReward
  231. {
  232. get { return experienceReward; }
  233. set { experienceReward = value; }
  234. }
  235. /// <summary>
  236. /// The amount of gold given to the party as a reward.
  237. /// </summary>
  238. private int goldReward;
  239. /// <summary>
  240. /// The amount of gold given to the party as a reward.
  241. /// </summary>
  242. [ContentSerializer(Optional = true)]
  243. public int GoldReward
  244. {
  245. get { return goldReward; }
  246. set { goldReward = value; }
  247. }
  248. /// <summary>
  249. /// The content names of the gear given to the party as a reward.
  250. /// </summary>
  251. private List<string> gearRewardContentNames = new List<string>();
  252. /// <summary>
  253. /// The content names of the gear given to the party as a reward.
  254. /// </summary>
  255. [ContentSerializer(Optional = true)]
  256. public List<string> GearRewardContentNames
  257. {
  258. get { return gearRewardContentNames; }
  259. set { gearRewardContentNames = value; }
  260. }
  261. /// <summary>
  262. /// The gear given to the party as a reward.
  263. /// </summary>
  264. private List<Gear> gearRewards = new List<Gear>();
  265. /// <summary>
  266. /// The gear given to the party as a reward.
  267. /// </summary>
  268. [ContentSerializerIgnore]
  269. public List<Gear> GearRewards
  270. {
  271. get { return gearRewards; }
  272. set { gearRewards = value; }
  273. }
  274. #endregion
  275. #region Content Type Reader
  276. /// <summary>
  277. /// Reads a Quest object from the content pipeline.
  278. /// </summary>
  279. public class QuestReader : ContentTypeReader<Quest>
  280. {
  281. /// <summary>
  282. /// Reads a Quest object from the content pipeline.
  283. /// </summary>
  284. protected override Quest Read(ContentReader input, Quest existingInstance)
  285. {
  286. Quest quest = existingInstance;
  287. if (quest == null)
  288. {
  289. quest = new Quest();
  290. }
  291. quest.AssetName = input.AssetName;
  292. quest.Name = input.ReadString();
  293. quest.Description = input.ReadString();
  294. quest.ObjectiveMessage = input.ReadString();
  295. quest.CompletionMessage = input.ReadString();
  296. quest.GearRequirements.AddRange(
  297. input.ReadObject<List<QuestRequirement<Gear>>>());
  298. quest.MonsterRequirements.AddRange(
  299. input.ReadObject<List<QuestRequirement<Monster>>>());
  300. // load the fixed combat entries
  301. Random random = new Random();
  302. quest.FixedCombatEntries.AddRange(
  303. input.ReadObject<List<WorldEntry<FixedCombat>>>());
  304. foreach (WorldEntry<FixedCombat> fixedCombatEntry in
  305. quest.FixedCombatEntries)
  306. {
  307. fixedCombatEntry.Content =
  308. input.ContentManager.Load<FixedCombat>(
  309. System.IO.Path.Combine(@"Maps\FixedCombats",
  310. fixedCombatEntry.ContentName));
  311. // clone the map sprite in the entry, as there may be many entries
  312. // per FixedCombat
  313. fixedCombatEntry.MapSprite =
  314. fixedCombatEntry.Content.Entries[0].Content.MapSprite.Clone()
  315. as AnimatingSprite;
  316. // play the idle animation
  317. fixedCombatEntry.MapSprite.PlayAnimation("Idle",
  318. fixedCombatEntry.Direction);
  319. // advance in a random amount so the animations aren't synchronized
  320. fixedCombatEntry.MapSprite.UpdateAnimation(
  321. 4f * (float)random.NextDouble());
  322. }
  323. quest.ChestEntries.AddRange(
  324. input.ReadObject<List<WorldEntry<Chest>>>());
  325. foreach (WorldEntry<Chest> chestEntry in quest.ChestEntries)
  326. {
  327. chestEntry.Content = input.ContentManager.Load<Chest>(
  328. System.IO.Path.Combine(@"Maps\Chests",
  329. chestEntry.ContentName)).Clone() as Chest;
  330. }
  331. quest.DestinationMapContentName = input.ReadString();
  332. quest.DestinationNpcContentName = input.ReadString();
  333. quest.DestinationObjectiveMessage = input.ReadString();
  334. quest.experienceReward = input.ReadInt32();
  335. quest.goldReward = input.ReadInt32();
  336. quest.GearRewardContentNames.AddRange(
  337. input.ReadObject<List<string>>());
  338. foreach (string contentName in quest.GearRewardContentNames)
  339. {
  340. quest.GearRewards.Add(input.ContentManager.Load<Gear>(
  341. Path.Combine("Gear", contentName)));
  342. }
  343. return quest;
  344. }
  345. }
  346. #endregion
  347. #region ICloneable Members
  348. public object Clone()
  349. {
  350. Quest quest = new Quest();
  351. quest.AssetName = AssetName;
  352. foreach (WorldEntry<Chest> chestEntry in chestEntries)
  353. {
  354. WorldEntry<Chest> worldEntry = new WorldEntry<Chest>();
  355. worldEntry.Content = chestEntry.Content.Clone() as Chest;
  356. worldEntry.ContentName = chestEntry.ContentName;
  357. worldEntry.Count = chestEntry.Count;
  358. worldEntry.Direction = chestEntry.Direction;
  359. worldEntry.MapContentName = chestEntry.MapContentName;
  360. worldEntry.MapPosition = chestEntry.MapPosition;
  361. quest.chestEntries.Add(worldEntry);
  362. }
  363. quest.completionMessage = completionMessage;
  364. quest.description = description;
  365. quest.destinationMapContentName = destinationMapContentName;
  366. quest.destinationNpcContentName = destinationNpcContentName;
  367. quest.destinationObjectiveMessage = destinationObjectiveMessage;
  368. quest.experienceReward = experienceReward;
  369. quest.fixedCombatEntries.AddRange(fixedCombatEntries);
  370. quest.gearRequirements.AddRange(gearRequirements);
  371. quest.gearRewardContentNames.AddRange(gearRewardContentNames);
  372. quest.gearRewards.AddRange(gearRewards);
  373. quest.goldReward = goldReward;
  374. quest.monsterRequirements.AddRange(monsterRequirements);
  375. quest.name = name;
  376. quest.objectiveMessage = objectiveMessage;
  377. quest.stage = stage;
  378. return quest;
  379. }
  380. #endregion
  381. }
  382. }