StatisticsValue.cs 10 KB

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