private void attack(BattleEngine.Player.Player source, BattleEngine.Player.Player target) { string details = string.Format ("<u>Round {0}</u>: <i>{1}</i> is <b>attacking</b> <i>{2}</i>", this.round, source.Name, target.Name); this.BattleGui.ShowAttackDialog (details); Location sloc = this.GameMap.GetPlayerOnMap (source); Location tloc = this.GameMap.GetPlayerOnMap (target); double dist = sloc.DistanceTo (tloc); int range = source.GetAttribute ("Range").Current; if ((double)dist <= range) { int attackroll = source.ThrowForAttack (); int defenseroll = target.ThrowForDefense (); this.Console.ConsoleWrite (string.Format ("\t\"{0}\" attack rolls {1} at a distance of {2} with range {3}", source.Name, attackroll, dist, range)); this.Console.ConsoleWrite (string.Format (" : \"{0}\" defense rolls {1}", target.Name, defenseroll)); if (attackroll >= defenseroll) { this.Console.ConsoleWrite (" HIT"); int power = source.RollDamage (); this.Console.ConsoleWrite (string.Format (" for {0} damage", power)); int armor = target.GetAttribute("Armor").Current; int damage = armor - power; if (damage < 0) { target.TakeDamage (damage); this.Console.ConsoleWriteLine(string.Format(" \"{0}\" took {1} damage leaving {2} armor", target.Name, damage, target.GetAttribute("Armor").Current)); } else { this.Console.ConsoleWriteLine(string.Format(" \"{0}\" took no damage \"{1}\" could not penetrate armor of {2}", target.Name, source.Name, target.GetAttribute ("Armor").Current)); } } else { this.Console.ConsoleWriteLine (" MISSED"); } } else { this.Console.ConsoleWriteLine (string.Format ("\tOUT OF RANGE: \"{0}\" is {1} meters away from \"{2}\"", target.Name, dist, source.Name)); int move = source.GetAttribute ("Speed").Current; this.Console.ConsoleWriteLine (string.Format ("{0} closing {1} meters", source.Name, move)); this.GameMap.MovePlayerToTarget (source, move, target); } }