StatisticsValue.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // StatisticsValue.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.Text;
  12. using Microsoft.Xna.Framework.Content;
  13. #endregion
  14. namespace RolePlayingGameData
  15. {
  16. /// <summary>
  17. /// The set of relevant statistics for characters.
  18. /// </summary>
  19. #if WINDOWS
  20. [Serializable]
  21. #endif
  22. public struct StatisticsValue
  23. {
  24. [ContentSerializer(Optional = true)]
  25. public Int32 HealthPoints;
  26. [ContentSerializer(Optional = true)]
  27. public Int32 MagicPoints;
  28. [ContentSerializer(Optional = true)]
  29. public Int32 PhysicalOffense;
  30. [ContentSerializer(Optional = true)]
  31. public Int32 PhysicalDefense;
  32. [ContentSerializer(Optional = true)]
  33. public Int32 MagicalOffense;
  34. [ContentSerializer(Optional = true)]
  35. public Int32 MagicalDefense;
  36. /// <summary>
  37. /// Returns true if this object is trivial - all values at zero.
  38. /// </summary>
  39. public bool IsZero
  40. {
  41. get
  42. {
  43. return ((HealthPoints == 0) && (MagicPoints == 0) &&
  44. (PhysicalOffense == 0) && (PhysicalDefense == 0) &&
  45. (MagicalOffense == 0) && (MagicalDefense == 0));
  46. }
  47. }
  48. #region Initialization
  49. /// <summary>
  50. /// Create a new StatisticsValue object, fully specified by the parameters.
  51. /// </summary>
  52. public StatisticsValue(int healthPoints, int magicPoints, int physicalOffense,
  53. int physicalDefense, int magicalOffense, int magicalDefense)
  54. {
  55. HealthPoints = healthPoints;
  56. MagicPoints = magicPoints;
  57. PhysicalOffense = physicalOffense;
  58. PhysicalDefense = physicalDefense;
  59. MagicalOffense = magicalOffense;
  60. MagicalDefense = magicalDefense;
  61. }
  62. #endregion
  63. #region Operator: StatisticsValue + StatisticsValue
  64. /// <summary>
  65. /// Add one value to another, piecewise, and return the result.
  66. /// </summary>
  67. public static StatisticsValue Add(StatisticsValue value1,
  68. StatisticsValue value2)
  69. {
  70. StatisticsValue outputValue = new StatisticsValue();
  71. outputValue.HealthPoints =
  72. value1.HealthPoints + value2.HealthPoints;
  73. outputValue.MagicPoints =
  74. value1.MagicPoints + value2.MagicPoints;
  75. outputValue.PhysicalOffense =
  76. value1.PhysicalOffense + value2.PhysicalOffense;
  77. outputValue.PhysicalDefense =
  78. value1.PhysicalDefense + value2.PhysicalDefense;
  79. outputValue.MagicalOffense =
  80. value1.MagicalOffense + value2.MagicalOffense;
  81. outputValue.MagicalDefense =
  82. value1.MagicalDefense + value2.MagicalDefense;
  83. return outputValue;
  84. }
  85. /// <summary>
  86. /// Add one value to another, piecewise, and return the result.
  87. /// </summary>
  88. public static StatisticsValue operator +(StatisticsValue value1,
  89. StatisticsValue value2)
  90. {
  91. return Add(value1, value2);
  92. }
  93. #endregion
  94. #region Operator: StatisticsValue - StatisticsValue
  95. /// <summary>
  96. /// Subtract one value from another, piecewise, and return the result.
  97. /// </summary>
  98. public static StatisticsValue Subtract(StatisticsValue value1,
  99. StatisticsValue value2)
  100. {
  101. StatisticsValue outputValue = new StatisticsValue();
  102. outputValue.HealthPoints =
  103. value1.HealthPoints - value2.HealthPoints;
  104. outputValue.MagicPoints =
  105. value1.MagicPoints - value2.MagicPoints;
  106. outputValue.PhysicalOffense =
  107. value1.PhysicalOffense - value2.PhysicalOffense;
  108. outputValue.PhysicalDefense =
  109. value1.PhysicalDefense - value2.PhysicalDefense;
  110. outputValue.MagicalOffense =
  111. value1.MagicalOffense - value2.MagicalOffense;
  112. outputValue.MagicalDefense =
  113. value1.MagicalDefense - value2.MagicalDefense;
  114. return outputValue;
  115. }
  116. /// <summary>
  117. /// Subtract one value from another, piecewise, and return the result.
  118. /// </summary>
  119. public static StatisticsValue operator -(StatisticsValue value1,
  120. StatisticsValue value2)
  121. {
  122. return Subtract(value1, value2);
  123. }
  124. #endregion
  125. // Compound assignment (+=, etc.) operators use the overloaded binary operators,
  126. // so there is no need in this case to override them explicitly
  127. #region Limiting
  128. /// <summary>
  129. /// Clamp all values piecewise with the provided minimum values.
  130. /// </summary>
  131. public void ApplyMinimum(StatisticsValue minimumValue)
  132. {
  133. HealthPoints = Math.Max(HealthPoints, minimumValue.HealthPoints);
  134. MagicPoints = Math.Max(MagicPoints, minimumValue.MagicPoints);
  135. PhysicalOffense = Math.Max(PhysicalOffense, minimumValue.PhysicalOffense);
  136. PhysicalDefense = Math.Max(PhysicalDefense, minimumValue.PhysicalDefense);
  137. MagicalOffense = Math.Max(MagicalOffense, minimumValue.MagicalOffense);
  138. MagicalDefense = Math.Max(MagicalDefense, minimumValue.MagicalDefense);
  139. }
  140. /// <summary>
  141. /// Clamp all values piecewise with the provided maximum values.
  142. /// </summary>
  143. public void ApplyMaximum(StatisticsValue maximumValue)
  144. {
  145. HealthPoints = Math.Min(HealthPoints, maximumValue.HealthPoints);
  146. MagicPoints = Math.Min(MagicPoints, maximumValue.MagicPoints);
  147. PhysicalOffense = Math.Min(PhysicalOffense, maximumValue.PhysicalOffense);
  148. PhysicalDefense = Math.Min(PhysicalDefense, maximumValue.PhysicalDefense);
  149. MagicalOffense = Math.Min(MagicalOffense, maximumValue.MagicalOffense);
  150. MagicalDefense = Math.Min(MagicalDefense, maximumValue.MagicalDefense);
  151. }
  152. #endregion
  153. #region String Output
  154. /// <summary>
  155. /// Builds a string that describes this object.
  156. /// </summary>
  157. public override string ToString()
  158. {
  159. StringBuilder sb = new StringBuilder();
  160. sb.Append("HP:");
  161. sb.Append(HealthPoints.ToString());
  162. sb.Append("; MP:");
  163. sb.Append(MagicPoints.ToString());
  164. sb.Append("; PO:");
  165. sb.Append(PhysicalOffense.ToString());
  166. sb.Append("; PD:");
  167. sb.Append(PhysicalDefense.ToString());
  168. sb.Append("; MO:");
  169. sb.Append(MagicalOffense.ToString());
  170. sb.Append("; MD:");
  171. sb.Append(MagicalDefense.ToString());
  172. return sb.ToString();
  173. }
  174. /// <summary>
  175. /// Builds a string that describes a modifier, where non-zero stats are skipped.
  176. /// </summary>
  177. public string GetModifierString()
  178. {
  179. StringBuilder sb = new StringBuilder();
  180. bool firstStatistic = true;
  181. // add the health points value, if any
  182. if (HealthPoints != 0)
  183. {
  184. if (firstStatistic)
  185. {
  186. firstStatistic = false;
  187. }
  188. else
  189. {
  190. sb.Append("; ");
  191. }
  192. sb.Append("HP:");
  193. sb.Append(HealthPoints.ToString());
  194. }
  195. // add the magic points value, if any
  196. if (MagicPoints != 0)
  197. {
  198. if (firstStatistic)
  199. {
  200. firstStatistic = false;
  201. }
  202. else
  203. {
  204. sb.Append("; ");
  205. }
  206. sb.Append("MP:");
  207. sb.Append(MagicPoints.ToString());
  208. }
  209. // add the physical offense value, if any
  210. if (PhysicalOffense != 0)
  211. {
  212. if (firstStatistic)
  213. {
  214. firstStatistic = false;
  215. }
  216. else
  217. {
  218. sb.Append("; ");
  219. }
  220. sb.Append("PO:");
  221. sb.Append(PhysicalOffense.ToString());
  222. }
  223. // add the physical defense value, if any
  224. if (PhysicalDefense != 0)
  225. {
  226. if (firstStatistic)
  227. {
  228. firstStatistic = false;
  229. }
  230. else
  231. {
  232. sb.Append("; ");
  233. }
  234. sb.Append("PD:");
  235. sb.Append(PhysicalDefense.ToString());
  236. }
  237. // add the magical offense value, if any
  238. if (MagicalOffense != 0)
  239. {
  240. if (firstStatistic)
  241. {
  242. firstStatistic = false;
  243. }
  244. else
  245. {
  246. sb.Append("; ");
  247. }
  248. sb.Append("MO:");
  249. sb.Append(MagicalOffense.ToString());
  250. }
  251. // add the magical defense value, if any
  252. if (MagicalDefense != 0)
  253. {
  254. if (firstStatistic)
  255. {
  256. firstStatistic = false;
  257. }
  258. else
  259. {
  260. sb.Append("; ");
  261. }
  262. sb.Append("MD:");
  263. sb.Append(MagicalDefense.ToString());
  264. }
  265. return sb.ToString();
  266. }
  267. #endregion
  268. #region Content Type Reader
  269. public class StatisticsValueReader : ContentTypeReader<StatisticsValue>
  270. {
  271. protected override StatisticsValue Read(ContentReader input,
  272. StatisticsValue existingInstance)
  273. {
  274. StatisticsValue output = new StatisticsValue();
  275. output.HealthPoints = input.ReadInt32();
  276. output.MagicPoints = input.ReadInt32();
  277. output.PhysicalOffense = input.ReadInt32();
  278. output.PhysicalDefense = input.ReadInt32();
  279. output.MagicalOffense = input.ReadInt32();
  280. output.MagicalDefense = input.ReadInt32();
  281. return output;
  282. }
  283. }
  284. #endregion
  285. }
  286. }