Quest.cs 14 KB

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