Player.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // Player.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 Microsoft.Xna.Framework.Content;
  12. using Microsoft.Xna.Framework.Graphics;
  13. #endregion
  14. namespace RolePlayingGameData
  15. {
  16. /// <summary>
  17. /// A member of the player's party, also represented in the world before joining.
  18. /// </summary>
  19. /// <remarks>
  20. /// There is only one of a given Player in the game world at a time, and their
  21. /// current statistics persist after combat. Thererefore, current statistics
  22. /// are tracked here.
  23. /// </remarks>
  24. public class Player : FightingCharacter
  25. #if WINDOWS
  26. , ICloneable
  27. #endif
  28. {
  29. #region Current Statistics
  30. /// <summary>
  31. /// The current set of persistent statistics modifiers - damage, etc.
  32. /// </summary>
  33. [ContentSerializerIgnore]
  34. public StatisticsValue StatisticsModifiers = new StatisticsValue();
  35. /// <summary>
  36. /// The current set of statistics, including damage, etc.
  37. /// </summary>
  38. [ContentSerializerIgnore]
  39. public StatisticsValue CurrentStatistics
  40. {
  41. get { return CharacterStatistics + StatisticsModifiers; }
  42. }
  43. #endregion
  44. #region Initial Data
  45. /// <summary>
  46. /// The amount of gold that the player has when it joins the party.
  47. /// </summary>
  48. private int gold;
  49. /// <summary>
  50. /// The amount of gold that the player has when it joins the party.
  51. /// </summary>
  52. public int Gold
  53. {
  54. get { return gold; }
  55. set { gold = value; }
  56. }
  57. #endregion
  58. #region Dialogue Data
  59. /// <summary>
  60. /// The dialogue that the player says when it is greeted as an Npc in the world.
  61. /// </summary>
  62. private string introductionDialogue;
  63. /// <summary>
  64. /// The dialogue that the player says when it is greeted as an Npc in the world.
  65. /// </summary>
  66. public string IntroductionDialogue
  67. {
  68. get { return introductionDialogue; }
  69. set { introductionDialogue = value; }
  70. }
  71. /// <summary>
  72. /// The dialogue that the player says when its offer to join is accepted.
  73. /// </summary>
  74. private string joinAcceptedDialogue;
  75. /// <summary>
  76. /// The dialogue that the player says when its offer to join is accepted.
  77. /// </summary>
  78. public string JoinAcceptedDialogue
  79. {
  80. get { return joinAcceptedDialogue; }
  81. set { joinAcceptedDialogue = value; }
  82. }
  83. /// <summary>
  84. /// The dialogue that the player says when its offer to join is rejected.
  85. /// </summary>
  86. private string joinRejectedDialogue;
  87. /// <summary>
  88. /// The dialogue that the player says when its offer to join is rejected.
  89. /// </summary>
  90. public string JoinRejectedDialogue
  91. {
  92. get { return joinRejectedDialogue; }
  93. set { joinRejectedDialogue = value; }
  94. }
  95. #endregion
  96. #region Portrait Data
  97. /// <summary>
  98. /// The name of the active portrait texture.
  99. /// </summary>
  100. private string activePortraitTextureName;
  101. /// <summary>
  102. /// The name of the active portrait texture.
  103. /// </summary>
  104. public string ActivePortraitTextureName
  105. {
  106. get { return activePortraitTextureName; }
  107. set { activePortraitTextureName = value; }
  108. }
  109. /// <summary>
  110. /// The active portrait texture.
  111. /// </summary>
  112. private Texture2D activePortraitTexture;
  113. /// <summary>
  114. /// The active portrait texture.
  115. /// </summary>
  116. [ContentSerializerIgnore]
  117. public Texture2D ActivePortraitTexture
  118. {
  119. get { return activePortraitTexture; }
  120. }
  121. /// <summary>
  122. /// The name of the inactive portrait texture.
  123. /// </summary>
  124. private string inactivePortraitTextureName;
  125. /// <summary>
  126. /// The name of the inactive portrait texture.
  127. /// </summary>
  128. public string InactivePortraitTextureName
  129. {
  130. get { return inactivePortraitTextureName; }
  131. set { inactivePortraitTextureName = value; }
  132. }
  133. /// <summary>
  134. /// The inactive portrait texture.
  135. /// </summary>
  136. private Texture2D inactivePortraitTexture;
  137. /// <summary>
  138. /// The inactive portrait texture.
  139. /// </summary>
  140. [ContentSerializerIgnore]
  141. public Texture2D InactivePortraitTexture
  142. {
  143. get { return inactivePortraitTexture; }
  144. }
  145. /// <summary>
  146. /// The name of the unselectable portrait texture.
  147. /// </summary>
  148. private string unselectablePortraitTextureName;
  149. /// <summary>
  150. /// The name of the unselectable portrait texture.
  151. /// </summary>
  152. public string UnselectablePortraitTextureName
  153. {
  154. get { return unselectablePortraitTextureName; }
  155. set { unselectablePortraitTextureName = value; }
  156. }
  157. /// <summary>
  158. /// The unselectable portrait texture.
  159. /// </summary>
  160. private Texture2D unselectablePortraitTexture;
  161. /// <summary>
  162. /// The unselectable portrait texture.
  163. /// </summary>
  164. [ContentSerializerIgnore]
  165. public Texture2D UnselectablePortraitTexture
  166. {
  167. get { return unselectablePortraitTexture; }
  168. }
  169. #endregion
  170. #region Content Type Reader
  171. /// <summary>
  172. /// Read a Player object from the content pipeline.
  173. /// </summary>
  174. public class PlayerReader : ContentTypeReader<Player>
  175. {
  176. protected override Player Read(ContentReader input, Player existingInstance)
  177. {
  178. Player player = existingInstance;
  179. if (player == null)
  180. {
  181. player = new Player();
  182. }
  183. input.ReadRawObject<FightingCharacter>(player as FightingCharacter);
  184. player.Gold = input.ReadInt32();
  185. player.IntroductionDialogue = input.ReadString();
  186. player.JoinAcceptedDialogue = input.ReadString();
  187. player.JoinRejectedDialogue = input.ReadString();
  188. player.ActivePortraitTextureName = input.ReadString();
  189. player.activePortraitTexture =
  190. input.ContentManager.Load<Texture2D>(
  191. System.IO.Path.Combine(@"Textures\Characters\Portraits",
  192. player.ActivePortraitTextureName));
  193. player.InactivePortraitTextureName = input.ReadString();
  194. player.inactivePortraitTexture =
  195. input.ContentManager.Load<Texture2D>(
  196. System.IO.Path.Combine(@"Textures\Characters\Portraits",
  197. player.InactivePortraitTextureName));
  198. player.UnselectablePortraitTextureName = input.ReadString();
  199. player.unselectablePortraitTexture =
  200. input.ContentManager.Load<Texture2D>(
  201. System.IO.Path.Combine(@"Textures\Characters\Portraits",
  202. player.UnselectablePortraitTextureName));
  203. return player;
  204. }
  205. }
  206. #endregion
  207. #region ICloneable Members
  208. public object Clone()
  209. {
  210. Player player = new Player();
  211. player.activePortraitTexture = activePortraitTexture;
  212. player.activePortraitTextureName = activePortraitTextureName;
  213. player.AssetName = AssetName;
  214. player.CharacterClass = CharacterClass;
  215. player.CharacterClassContentName = CharacterClassContentName;
  216. player.CharacterLevel = CharacterLevel;
  217. player.CombatAnimationInterval = CombatAnimationInterval;
  218. player.CombatSprite = CombatSprite.Clone() as AnimatingSprite;
  219. player.Direction = Direction;
  220. player.EquippedEquipment.AddRange(EquippedEquipment);
  221. player.Experience = Experience;
  222. player.gold = gold;
  223. player.inactivePortraitTexture = inactivePortraitTexture;
  224. player.inactivePortraitTextureName = inactivePortraitTextureName;
  225. player.InitialEquipmentContentNames.AddRange(InitialEquipmentContentNames);
  226. player.introductionDialogue = introductionDialogue;
  227. player.Inventory.AddRange(Inventory);
  228. player.joinAcceptedDialogue = joinAcceptedDialogue;
  229. player.joinRejectedDialogue = joinRejectedDialogue;
  230. player.MapIdleAnimationInterval = MapIdleAnimationInterval;
  231. player.MapPosition = MapPosition;
  232. player.MapSprite = MapSprite.Clone() as AnimatingSprite;
  233. player.MapWalkingAnimationInterval = MapWalkingAnimationInterval;
  234. player.Name = Name;
  235. player.ShadowTexture = ShadowTexture;
  236. player.State = State;
  237. player.unselectablePortraitTexture = unselectablePortraitTexture;
  238. player.unselectablePortraitTextureName = unselectablePortraitTextureName;
  239. player.WalkingSprite = WalkingSprite.Clone() as AnimatingSprite;
  240. player.RecalculateEquipmentStatistics();
  241. player.RecalculateTotalDefenseRanges();
  242. player.RecalculateTotalTargetDamageRange();
  243. player.ResetAnimation(false);
  244. player.ResetBaseStatistics();
  245. return player;
  246. }
  247. #endregion
  248. }
  249. }