Large diffs are not rendered by default.

@@ -16,7 +16,7 @@ public enum ArmourLocation
Arms,
Hands,
LeftFinger,
RightFinder,
RightFinger,
Legs,
Feet,
}
@@ -35,7 +35,7 @@ public void PutOn(IArmour aArmour, bool confirm = true)
WornArmour.Add(aArmour.ArmourLocation, aArmour);
}
else WornArmour.Add(aArmour.ArmourLocation, aArmour);

// fire off events.
if (OnFinishedDressingManeuver != null)
OnFinishedDressingManeuver(this,
@@ -87,6 +87,18 @@ public IEnumerable<IArmour> Where(Func<IArmour, bool> aPredicate)
yield return iArmour;
}

/// <summary>
/// GetWornArmourByLocation
/// </summary>
/// <param name="aArmourLocation">The specific location to get armour at.</param>
/// <returns>The armour on equipped at this location.</returns>
public IArmour GetWornArmourByLocation(ArmourLocation aArmourLocation)
{
if (WornArmour.Keys.Contains(aArmourLocation))
return WornArmour[aArmourLocation];
return null;
}

/// <summary>
/// Confirm delegate for remove armour.
/// </summary>
@@ -106,7 +118,6 @@ public enum DressingActionType { PutOn, TakeOff, Neither };
/// <summary>
/// The associative dictionary of worn Armour.
/// </summary>

[System.Xml.Serialization.XmlIgnore]
public Dictionary<ArmourLocation, IArmour> WornArmour { get; set; }
}
@@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using DotNetHack.Game.Interfaces;
using DotNetHack.Game.Events;

namespace DotNetHack.Game.Items.Potions
{
@@ -37,9 +38,18 @@ public abstract class Potion : Item, IPotion
public PotionStrength PotionStrength { get; set; }

/// <summary>
/// Quaff
/// Quaff, this base triggers event.
/// </summary>
public abstract void Quaff(Actor aTarget);
public virtual void Quaff(Actor aTarget)
{
if (OnQuaff != null)
OnQuaff(this, new PotionEventArgs(aTarget, this));
}

/// <summary>
/// Quaff event handler
/// </summary>
public event EventHandler<PotionEventArgs> OnQuaff;

/// <summary>
/// ToString
@@ -58,6 +58,35 @@ public static char GetChar(string aMessage = "", bool repeat = false)
return Console.ReadKey(repeat).KeyChar;
}

/// <summary>
/// GetDirection returns a unit movement.
/// </summary>
/// <param name="aMessage">optional message</param>
/// <returns>a unit movement.</returns>
public static Location3i GetDirection(string aMessage = "")
{
ConsoleKeyInfo tmpInput;
Location3i tmpUnitLocation = new Location3i(0, 0, 0);

switch (Input.Filter(x =>
x.Key == ConsoleKey.LeftArrow ||
x.Key == ConsoleKey.RightArrow ||
x.Key == ConsoleKey.UpArrow ||
x.Key == ConsoleKey.DownArrow, out tmpInput).Key)
{
case ConsoleKey.RightArrow:
tmpUnitLocation.X++; break;
case ConsoleKey.LeftArrow:
tmpUnitLocation.X--; break;
case ConsoleKey.UpArrow:
tmpUnitLocation.Y--; break;
case ConsoleKey.DownArrow:
tmpUnitLocation.Y++; break;
}

return tmpUnitLocation;
}

/// <summary>
/// GetInt (inplace)
/// <remarks>Gets an integer from standard input
@@ -52,6 +52,11 @@ public static string MonsterFile
get { return Path.Combine(DatDirectory, DAT_MONSTERS); }
}

public static string ExceptionFile
{
get { return Path.Combine(DatDirectory, LOG_EXCEPTION); }
}

/// <summary>
/// InitializePath.
/// Initializes the working path for DNH.
@@ -70,6 +75,7 @@ static bool InitializePath(string aFullPath)

const string DAT_FOLDER = "dat";
const string DAT_MONSTERS = "monsters.dat";
const string LOG_EXCEPTION = "exceptions.log";

/// <summary>
/// Random
@@ -0,0 +1,176 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotNetHack.Game;
using DotNetHack.Game.Items.Equipment.Armor;
using DotNetHack.Game.Interfaces;

namespace DotNetHack.UI
{
/// <summary>
///
/// </summary>
public class CharacterSheet : Window
{
/// <summary>
/// Create a new character sheet for the supplied actor.
/// </summary>
/// <param name="aActor">The supplied actor</param>
public CharacterSheet(Actor aActor)
: base("Character Sheet for \"" + aActor.Name + "\" (lvl." +
aActor.Stats.Level + ")")
{ Character = aActor; }

/// <summary>
/// show the character sheet.
/// </summary>
public override void Show()
{
// called first
base.Show();

int y_coord = 0;

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Mana: {0}", Character.Stats.ManaPoints);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Health: {0}", Character.Stats.HitPoints);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Armour: {0}", Character.Stats.ArmourClass);

y_coord++;

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Strength: {0}", Character.Stats.Strength);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Perception: {0}", Character.Stats.Perception);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Endurance: {0}", Character.Stats.Endurance);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Charisma: {0}", Character.Stats.Charisma);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Intelligence: {0}", Character.Stats.Intelligence);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Agility: {0}", Character.Stats.Agility);

Console.SetCursorPosition(3, 3 + y_coord++);
Console.Write("Luck: {0}", Character.Stats.Luck);

// skip 1
y_coord = 0;

int x_coord = 22;

/// Head
Console.SetCursorPosition(x_coord, 3 + y_coord++);
IArmour armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Head);
if (armour != null)
Console.WriteLine("Head: " + armour.Name);
else Console.WriteLine("Head: (none)");

/// Neck
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Neck);
if (armour != null)
Console.WriteLine("Neck: " + armour.Name);
else Console.WriteLine("Neck: (none)");
armour = null;

/// Chest
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Chest);
if (armour != null)
Console.WriteLine("Chest: " + armour.Name);
else Console.WriteLine("Chest: (none)");
armour = null;

/// Arms
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Arms);
if (armour != null)
Console.WriteLine("Arms: " + armour.Name);
else Console.WriteLine("Arms: (none)");
armour = null;

/// Hands
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Hands);
if (armour != null)
Console.WriteLine("Hands: " + armour.Name);
else Console.WriteLine("Hands: (none)");
armour = null;

/// Legs
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Legs);
if (armour != null)
Console.WriteLine("Legs: " + armour.Name);
else Console.WriteLine("Legs: (none)");
armour = null;

/// Feet
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.Feet);
if (armour != null)
Console.WriteLine("Feet: " + armour.Name);
else Console.WriteLine("Feet: (none)");
armour = null;

/// LeftFinger
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.LeftFinger);
if (armour != null)
Console.WriteLine("LeftFinger: " + armour.Name);
else
Console.WriteLine("LeftFinger: (none)");
armour = null;

/// RightFinger
Console.SetCursorPosition(x_coord, 3 + y_coord++);
armour = null;
armour = Character.WornArmour.GetWornArmourByLocation(
Game.Items.Equipment.Armour.ArmourLocation.RightFinger);
if (armour != null)
Console.WriteLine("RightFinger: " + armour.Name);
else
Console.WriteLine("RightFinger:(none)");

armour = null;





Console.ReadKey(true);
}

/// <summary>
/// The character in this character sheet.
/// </summary>
Actor Character { get; set; }
}
}
@@ -212,7 +212,7 @@ public static void ShowStatsBar(Player aPlayer)
string.Format("Str:{0} Per:{1} End:{2} Chr:{3} Int:{4} Agi:{5} Luck:{6}",
aStats.Strength, aStats.Perception, aStats.Endurance, aStats.Charisma,
aStats.Intelligence, aStats.Agility, aStats.Luck, aStats.Level);

Console.SetCursorPosition(0, Console.WindowHeight - 1);
Console.Write(strStats);
}
@@ -270,6 +270,15 @@ public static void Box(string aTile, int x, int y, int w, int h, bool ralign)
else Box(aTile, Console.WindowWidth - (((aTile.Length > w ? aTile.Length + 2 : w)) + x), y, w, h);
}

/// <summary>
/// Draw a bounding box around a display region.
/// </summary>
/// <param name="dr">The display region to draw a bounding box around.</param>
public static void Box(DisplayRegion dr)
{
Box(dr.P1.X, dr.P1.Y, dr.P2.X, dr.P2.Y);
}

/// <summary>
/// Box
/// </summary>
@@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DotNetHack.Game.Interfaces;

namespace DotNetHack.UI
{
/// <summary>
/// Window
/// </summary>
public class Window
{
/// <summary>
/// Window
/// </summary>
/// <param name="aWindowTitle">The title for the window</param>
public Window(string aWindowTitle)
: this(aWindowTitle, 0, 0, Graphics.ScreenWidth, Graphics.ScreenHeight)
{ }

/// <summary>
/// Window
/// </summary>
/// <param name="aWindowTitle"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="aWindowWidth"></param>
/// <param name="aWindowHeight"></param>
public Window(string aWindowTitle, int x, int y,
int aWindowWidth, int aWindowHeight)
{
if (aWindowHeight <= 0 || aWindowWidth <= 0)
throw new ArgumentException(
"Window size and coorinates must be greater than zero.");

WindowTitle = aWindowTitle;
WindowRegion = new DisplayRegion(x, y,
x + aWindowWidth, y + (aWindowHeight - 1));
}

/// <summary>
///
/// </summary>
DisplayRegion WindowRegion { get; set; }

/// <summary>
///
/// </summary>
public string WindowTitle { get; set; }

/// <summary>
///
/// </summary>
public int WindowWidth
{
get { return WindowRegion.Width; }
}

/// <summary>
///
/// </summary>
public int WindowHeight
{
get { return WindowRegion.Length; }
}

/// <summary>
/// Show this window.
/// </summary>
public virtual void Show()
{
// display bounding box around window region.
UI.Graphics.Display.Box(WindowRegion);
Console.SetCursorPosition(WindowRegion.P1.X + 3, WindowRegion.P1.Y);
Console.Write(string.Format("{0} {1} {2}",
Symbols.W_DBL_V_RIGHT_JUNC, WindowTitle, Symbols.W_DBL_V_LEFT_JUNC));
}
}
}
@@ -10,7 +10,7 @@
<Class Name="DotNetHack.Game.Player">
<Position X="21.25" Y="15.25" Width="2" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAACAQAAAAAAAAAFACAAAAAAAAAAAAAAgEA=</HashCode>
<HashCode>AAAAEAAAAAACAQAAAAAAAAAFACAAAAAAAAAAAAAAAEA=</HashCode>
<FileName>Game\Player.cs</FileName>
</TypeIdentifier>
<Lollipop Position="0.2" />
@@ -56,7 +56,7 @@
<Class Name="DotNetHack.Game.Items.Equipment.Weapons.Weapon">
<Position X="9.25" Y="5.25" Width="1.5" />
<TypeIdentifier>
<HashCode>AAAAgAAAAACAAAAEAAAAAAAAAAAAAAAAAAAAAEAAAAA=</HashCode>
<HashCode>AgAAgAAAAACAAAAEAAAAAACAAAAAAAAABAAAAEAAAAA=</HashCode>
<FileName>Game\Items\Equipment\Weapons\Weapon.cs</FileName>
</TypeIdentifier>
<ShowAsAssociation>
@@ -95,13 +95,13 @@
<Class Name="DotNetHack.Game.Items.Potions.Potion" Collapsed="true">
<Position X="2.5" Y="5.25" Width="1.5" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAIAAAAEAACAAAAAAAAAAAAAAAAAAAGAAAA=</HashCode>
<HashCode>AAAAAAAAAAIAAAAEAACgAAAAAAAAAAAAAAAAAAGAAAA=</HashCode>
<FileName>Game\Items\Potions\Potion.cs</FileName>
</TypeIdentifier>
<Lollipop Position="0.2" />
</Class>
<Class Name="DotNetHack.Game.GameEngine">
<Position X="25" Y="14.75" Width="1.75" />
<Position X="26" Y="15.5" Width="1.75" />
<Compartments>
<Compartment Name="Nested Types" Collapsed="false" />
</Compartments>
@@ -118,17 +118,18 @@
</Enum>
</NestedTypes>
<TypeIdentifier>
<HashCode>AgQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAQI=</HashCode>
<HashCode>AgQAgEAAAiAAAQAAAAAAAAQAAIAAAAAAAAEAAwAAAQI=</HashCode>
<FileName>Game\GameEngine.cs</FileName>
</TypeIdentifier>
<ShowAsAssociation>
<Property Name="Player" />
</ShowAsAssociation>
<Lollipop Position="0.2" />
</Class>
<Class Name="DotNetHack.Game.Actor">
<Position X="21.5" Y="10.75" Width="1.5" />
<TypeIdentifier>
<HashCode>ABAABAAAAAAAAwEAAIIAAAQAAAAAAAAACAEAigAAAAA=</HashCode>
<HashCode>ABAABAAAAAAAAwEAAIIAAAQAACAAAACACAEAigAAgAA=</HashCode>
<FileName>Game\Actor.cs</FileName>
</TypeIdentifier>
<ShowAsAssociation>
@@ -305,7 +306,7 @@
<FileName>Game\Events\ActorEventArgs.cs</FileName>
</TypeIdentifier>
</Class>
<Class Name="DotNetHack.Game.Actions.Action">
<Class Name="DotNetHack.Game.Actions.DAction">
<Position X="14.75" Y="1.5" Width="1.5" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>