#region File Description
//-----------------------------------------------------------------------------
// CombatantPlayer.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using Microsoft.Xna.Framework;
using RolePlayingGameData;
#endregion
namespace RolePlaying
{
///
/// Encapsulates all of the combat-runtime data for a particular player combatant.
///
class CombatantPlayer : Combatant
{
///
/// The Player object encapsulated by this object.
///
private Player player;
///
/// The Player object encapsulated by this object.
///
public Player Player
{
get { return player; }
}
///
/// The character encapsulated by this combatant.
///
public override FightingCharacter Character
{
get { return player as FightingCharacter; }
}
#region State Data
///
/// The current state of this combatant.
///
public override Character.CharacterState State
{
get { return player.State; }
set
{
if (value == player.State)
{
return;
}
player.State = value;
switch (player.State)
{
case RolePlayingGameData.Character.CharacterState.Idle:
CombatSprite.PlayAnimation("Idle");
break;
case RolePlayingGameData.Character.CharacterState.Hit:
CombatSprite.PlayAnimation("Hit");
break;
case RolePlayingGameData.Character.CharacterState.Dying:
player.StatisticsModifiers.HealthPoints =
-1 * player.CharacterStatistics.HealthPoints;
CombatSprite.PlayAnimation("Die");
break;
}
}
}
#endregion
#region Graphics Data
///
/// Accessor for the combat sprite for this combatant.
///
public override AnimatingSprite CombatSprite
{
get { return player.CombatSprite; }
}
#endregion
#region Current Statistics
///
/// The current statistics of this combatant.
///
public override StatisticsValue Statistics
{
get { return player.CurrentStatistics + CombatEffects.TotalStatistics; }
}
///
/// Heals the combatant by the given amount.
///
public override void Heal(StatisticsValue healingStatistics, int duration)
{
if (duration > 0)
{
CombatEffects.AddStatistics(healingStatistics, duration);
}
else
{
player.StatisticsModifiers += healingStatistics;
player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
}
base.Heal(healingStatistics, duration);
}
///
/// Damages the combatant by the given amount.
///
public override void Damage(StatisticsValue damageStatistics, int duration)
{
if (duration > 0)
{
CombatEffects.AddStatistics(new StatisticsValue() - damageStatistics,
duration);
}
else
{
player.StatisticsModifiers -= damageStatistics;
player.StatisticsModifiers.ApplyMaximum(new StatisticsValue());
}
base.Damage(damageStatistics, duration);
}
///
/// Pay the cost for the given spell.
///
/// True if the cost could be paid (and therefore was paid).
public override bool PayCostForSpell(Spell spell)
{
// check the parameter.
if (spell == null)
{
throw new ArgumentNullException("spell");
}
// check the requirements
if (Statistics.MagicPoints < spell.MagicPointCost)
{
return false;
}
// reduce the player's magic points by the spell's cost
player.StatisticsModifiers.MagicPoints -= spell.MagicPointCost;
return true;
}
#endregion
#region Initialization
///
/// Construct a new CombatantPlayer object containing the given player.
///
public CombatantPlayer(Player player) : base()
{
// check the parameter
if (player == null)
{
throw new ArgumentNullException("player");
}
// assign the parameters
this.player = player;
// if the player starts dead, make sure the sprite is already "dead"
if (IsDeadOrDying)
{
if (Statistics.HealthPoints > 0)
{
State = RolePlayingGameData.Character.CharacterState.Idle;
}
else
{
CombatSprite.PlayAnimation("Die");
CombatSprite.AdvanceToEnd();
}
}
else
{
State = RolePlayingGameData.Character.CharacterState.Idle;
CombatSprite.PlayAnimation("Idle");
}
}
#endregion
#region Updating
///
/// Update the player for this frame.
///
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
}
#endregion
}
}