#region File Description
//-----------------------------------------------------------------------------
// StatisticsValue.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
{
///
/// The set of relevant statistics for characters.
///
#if WINDOWS
[Serializable]
#endif
public struct StatisticsValue
{
[ContentSerializer(Optional = true)]
public Int32 HealthPoints;
[ContentSerializer(Optional = true)]
public Int32 MagicPoints;
[ContentSerializer(Optional = true)]
public Int32 PhysicalOffense;
[ContentSerializer(Optional = true)]
public Int32 PhysicalDefense;
[ContentSerializer(Optional = true)]
public Int32 MagicalOffense;
[ContentSerializer(Optional = true)]
public Int32 MagicalDefense;
///
/// Returns true if this object is trivial - all values at zero.
///
public bool IsZero
{
get
{
return ((HealthPoints == 0) && (MagicPoints == 0) &&
(PhysicalOffense == 0) && (PhysicalDefense == 0) &&
(MagicalOffense == 0) && (MagicalDefense == 0));
}
}
#region Initialization
///
/// Create a new StatisticsValue object, fully specified by the parameters.
///
public StatisticsValue(int healthPoints, int magicPoints, int physicalOffense,
int physicalDefense, int magicalOffense, int magicalDefense)
{
HealthPoints = healthPoints;
MagicPoints = magicPoints;
PhysicalOffense = physicalOffense;
PhysicalDefense = physicalDefense;
MagicalOffense = magicalOffense;
MagicalDefense = magicalDefense;
}
#endregion
#region Operator: StatisticsValue + StatisticsValue
///
/// Add one value to another, piecewise, and return the result.
///
public static StatisticsValue Add(StatisticsValue value1,
StatisticsValue value2)
{
StatisticsValue outputValue = new StatisticsValue();
outputValue.HealthPoints =
value1.HealthPoints + value2.HealthPoints;
outputValue.MagicPoints =
value1.MagicPoints + value2.MagicPoints;
outputValue.PhysicalOffense =
value1.PhysicalOffense + value2.PhysicalOffense;
outputValue.PhysicalDefense =
value1.PhysicalDefense + value2.PhysicalDefense;
outputValue.MagicalOffense =
value1.MagicalOffense + value2.MagicalOffense;
outputValue.MagicalDefense =
value1.MagicalDefense + value2.MagicalDefense;
return outputValue;
}
///
/// Add one value to another, piecewise, and return the result.
///
public static StatisticsValue operator +(StatisticsValue value1,
StatisticsValue value2)
{
return Add(value1, value2);
}
#endregion
#region Operator: StatisticsValue - StatisticsValue
///
/// Subtract one value from another, piecewise, and return the result.
///
public static StatisticsValue Subtract(StatisticsValue value1,
StatisticsValue value2)
{
StatisticsValue outputValue = new StatisticsValue();
outputValue.HealthPoints =
value1.HealthPoints - value2.HealthPoints;
outputValue.MagicPoints =
value1.MagicPoints - value2.MagicPoints;
outputValue.PhysicalOffense =
value1.PhysicalOffense - value2.PhysicalOffense;
outputValue.PhysicalDefense =
value1.PhysicalDefense - value2.PhysicalDefense;
outputValue.MagicalOffense =
value1.MagicalOffense - value2.MagicalOffense;
outputValue.MagicalDefense =
value1.MagicalDefense - value2.MagicalDefense;
return outputValue;
}
///
/// Subtract one value from another, piecewise, and return the result.
///
public static StatisticsValue operator -(StatisticsValue value1,
StatisticsValue value2)
{
return Subtract(value1, value2);
}
#endregion
// Compound assignment (+=, etc.) operators use the overloaded binary operators,
// so there is no need in this case to override them explicitly
#region Limiting
///
/// Clamp all values piecewise with the provided minimum values.
///
public void ApplyMinimum(StatisticsValue minimumValue)
{
HealthPoints = Math.Max(HealthPoints, minimumValue.HealthPoints);
MagicPoints = Math.Max(MagicPoints, minimumValue.MagicPoints);
PhysicalOffense = Math.Max(PhysicalOffense, minimumValue.PhysicalOffense);
PhysicalDefense = Math.Max(PhysicalDefense, minimumValue.PhysicalDefense);
MagicalOffense = Math.Max(MagicalOffense, minimumValue.MagicalOffense);
MagicalDefense = Math.Max(MagicalDefense, minimumValue.MagicalDefense);
}
///
/// Clamp all values piecewise with the provided maximum values.
///
public void ApplyMaximum(StatisticsValue maximumValue)
{
HealthPoints = Math.Min(HealthPoints, maximumValue.HealthPoints);
MagicPoints = Math.Min(MagicPoints, maximumValue.MagicPoints);
PhysicalOffense = Math.Min(PhysicalOffense, maximumValue.PhysicalOffense);
PhysicalDefense = Math.Min(PhysicalDefense, maximumValue.PhysicalDefense);
MagicalOffense = Math.Min(MagicalOffense, maximumValue.MagicalOffense);
MagicalDefense = Math.Min(MagicalDefense, maximumValue.MagicalDefense);
}
#endregion
#region String Output
///
/// Builds a string that describes this object.
///
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append("HP:");
sb.Append(HealthPoints.ToString());
sb.Append("; MP:");
sb.Append(MagicPoints.ToString());
sb.Append("; PO:");
sb.Append(PhysicalOffense.ToString());
sb.Append("; PD:");
sb.Append(PhysicalDefense.ToString());
sb.Append("; MO:");
sb.Append(MagicalOffense.ToString());
sb.Append("; MD:");
sb.Append(MagicalDefense.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 (HealthPoints != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("HP:");
sb.Append(HealthPoints.ToString());
}
// add the magic points value, if any
if (MagicPoints != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("MP:");
sb.Append(MagicPoints.ToString());
}
// add the physical offense value, if any
if (PhysicalOffense != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("PO:");
sb.Append(PhysicalOffense.ToString());
}
// add the physical defense value, if any
if (PhysicalDefense != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("PD:");
sb.Append(PhysicalDefense.ToString());
}
// add the magical offense value, if any
if (MagicalOffense != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("MO:");
sb.Append(MagicalOffense.ToString());
}
// add the magical defense value, if any
if (MagicalDefense != 0)
{
if (firstStatistic)
{
firstStatistic = false;
}
else
{
sb.Append("; ");
}
sb.Append("MD:");
sb.Append(MagicalDefense.ToString());
}
return sb.ToString();
}
#endregion
#region Content Type Reader
public class StatisticsValueReader : ContentTypeReader
{
protected override StatisticsValue Read(ContentReader input,
StatisticsValue existingInstance)
{
StatisticsValue output = new StatisticsValue();
output.HealthPoints = input.ReadInt32();
output.MagicPoints = input.ReadInt32();
output.PhysicalOffense = input.ReadInt32();
output.PhysicalDefense = input.ReadInt32();
output.MagicalOffense = input.ReadInt32();
output.MagicalDefense = input.ReadInt32();
return output;
}
}
#endregion
}
}