#region File Description //----------------------------------------------------------------------------- // StatisticsRange.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Text; using Microsoft.Xna.Framework.Content; #endregion namespace RolePlayingGameData { /// /// A range of character statistics values. /// /// Typically used for constrained random modifiers. #if WINDOWS [Serializable] #endif public class StatisticsRange { [ContentSerializer(Optional = true)] public Int32Range HealthPointsRange; [ContentSerializer(Optional = true)] public Int32Range MagicPointsRange; [ContentSerializer(Optional = true)] public Int32Range PhysicalOffenseRange; [ContentSerializer(Optional = true)] public Int32Range PhysicalDefenseRange; [ContentSerializer(Optional = true)] public Int32Range MagicalOffenseRange; [ContentSerializer(Optional = true)] public Int32Range MagicalDefenseRange; #region Value Generation /// /// Generate a random value between the minimum and maximum, inclusively. /// /// The Random object used to generate the value. public StatisticsValue GenerateValue(Random random) { // check the parameters Random usedRandom = random; if (usedRandom == null) { usedRandom = new Random(); } // generate the new value StatisticsValue outputValue = new StatisticsValue(); outputValue.HealthPoints = HealthPointsRange.GenerateValue(usedRandom); outputValue.MagicPoints = MagicPointsRange.GenerateValue(usedRandom); outputValue.PhysicalOffense = PhysicalOffenseRange.GenerateValue(usedRandom); outputValue.PhysicalDefense = PhysicalDefenseRange.GenerateValue(usedRandom); outputValue.MagicalOffense = MagicalOffenseRange.GenerateValue(usedRandom); outputValue.MagicalDefense = MagicalDefenseRange.GenerateValue(usedRandom); return outputValue; } #endregion #region String Output /// /// Builds a string that describes this object. /// public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("HP:"); sb.Append(HealthPointsRange.ToString()); sb.Append("; MP:"); sb.Append(MagicPointsRange.ToString()); sb.Append("; PO:"); sb.Append(PhysicalOffenseRange.ToString()); sb.Append("; PD:"); sb.Append(PhysicalDefenseRange.ToString()); sb.Append("; MO:"); sb.Append(MagicalOffenseRange.ToString()); sb.Append("; MD:"); sb.Append(MagicalDefenseRange.ToString()); return sb.ToString(); } /// /// Builds a string that describes a modifier, where non-zero stats are skipped. /// public string GetModifierString() { StringBuilder sb = new StringBuilder(); bool firstStatistic = true; // add the health points value, if any if ((HealthPointsRange.Minimum != 0) || (HealthPointsRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("HP:"); sb.Append(HealthPointsRange.ToString()); } // add the magic points value, if any if ((MagicPointsRange.Minimum != 0) || (MagicPointsRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("MP:"); sb.Append(MagicPointsRange.ToString()); } // add the physical offense value, if any if ((PhysicalOffenseRange.Minimum != 0) || (PhysicalOffenseRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("PO:"); sb.Append(PhysicalOffenseRange.ToString()); } // add the physical defense value, if any if ((PhysicalDefenseRange.Minimum != 0) || (PhysicalDefenseRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("PD:"); sb.Append(PhysicalDefenseRange.ToString()); } // add the magical offense value, if any if ((MagicalOffenseRange.Minimum != 0) || (MagicalOffenseRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("MO:"); sb.Append(MagicalOffenseRange.ToString()); } // add the magical defense value, if any if ((MagicalDefenseRange.Minimum != 0) || (MagicalDefenseRange.Maximum != 0)) { if (firstStatistic) { firstStatistic = false; } else { sb.Append("; "); } sb.Append("MD:"); sb.Append(MagicalDefenseRange.ToString()); } return sb.ToString(); } #endregion #region Operator: StatisticsRange + StatisticsValue /// /// Add one value to another, piecewise, and return the result. /// public static StatisticsRange Add(StatisticsRange value1, StatisticsValue value2) { StatisticsRange outputRange = new StatisticsRange(); outputRange.HealthPointsRange = value1.HealthPointsRange + value2.HealthPoints; outputRange.MagicPointsRange = value1.MagicPointsRange + value2.MagicPoints; outputRange.PhysicalOffenseRange = value1.PhysicalOffenseRange + value2.PhysicalOffense; outputRange.PhysicalDefenseRange = value1.PhysicalDefenseRange + value2.PhysicalDefense; outputRange.MagicalOffenseRange = value1.MagicalOffenseRange + value2.MagicalOffense; outputRange.MagicalDefenseRange = value1.MagicalDefenseRange + value2.MagicalDefense; return outputRange; } /// /// Add one value to another, piecewise, and return the result. /// public static StatisticsRange operator +(StatisticsRange value1, StatisticsValue value2) { return Add(value1, value2); } #endregion #region Content Type Reader /// /// Reads a StatisticsRange object from the content pipeline. /// public class StatisticsRangeReader : ContentTypeReader { protected override StatisticsRange Read(ContentReader input, StatisticsRange existingInstance) { StatisticsRange output = new StatisticsRange(); output.HealthPointsRange = input.ReadObject(); output.MagicPointsRange = input.ReadObject(); output.PhysicalOffenseRange = input.ReadObject(); output.PhysicalDefenseRange = input.ReadObject(); output.MagicalOffenseRange = input.ReadObject(); output.MagicalDefenseRange = input.ReadObject(); return output; } } #endregion } }