public void Attack(CreatureBase Target) { Random RndGen = new Random(DateTime.Now.Millisecond); double ChanceToHit = (((double)BaseAim - (double)Target.BaseSpeed) + (double)RndGen.Next(1, 10)) / (double)10 * (double)100; int DamageDone = 0; if (RndGen.Next(0, 100) > ChanceToHit)//Miss { Utilities.MessageLog.AddMsg(FirstName + " swings at " + Target.FirstName + " with a precision that leaves something to be desired."); return; } //Pick limb to use for attack bool HasPickedALimb = false; while (!HasPickedALimb) { foreach (LimbBase Limb in PreferredLimbAttackOrder) { if (RndGen.Next(0, 100) < 95) { DamageDone = Limb.AttackWith(); HasPickedALimb = true; break; } } } //Pick limb on target to strike HasPickedALimb = false; while (!HasPickedALimb) { foreach (LimbBase Limb in Target.Limbs) { if (RndGen.Next(0, 100) < Limb.HitChance) { if (Limb.HP == 0) { Utilities.MessageLog.AddMsg(FirstName + " swings at the empty spot where " + Target.FirstName + "'s " + Limb.Description + " once was, severely injuring the air"); //Miss return; } else { Limb.RecieveDamage(DamageDone); if (Limb.HP < 30) { foreach (LimbDependency Dep in LimbDependencies) { if (Dep.TargetLimb == Limb) { Dep.RequiredLimb.BleedRate++; } } } Utilities.MessageLog.AddMsg(Target.FirstName + "'s " + Limb.Description + " takes the brunt of the impact!"); HasPickedALimb = true; break; } } } } Utilities.DeathData DD = (Utilities.DeathData)Utilities.InterStateResources.Instance.Resources["Game_DeathData"]; DD.Killer = this; Utilities.InterStateResources.Instance.Resources["Game_DeathData"] = DD; }