Mercurial > repos > IBBoard.WarFoundry.API
diff API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs @ 439:5252dfb9cdfb
Re #350: Add requirement to allow N of unit for specific other units
* Add code for validating army (based on code for validating adding)
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Wed, 30 Nov 2011 21:06:41 +0000 |
parents | 410f3d85c9c5 |
children | baa34d91031f |
line wrap: on
line diff
--- a/API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs Wed Nov 30 20:44:03 2011 +0000 +++ b/API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs Wed Nov 30 21:06:41 2011 +0000 @@ -52,11 +52,6 @@ protected string FailureStringPrefix { get; set; } - protected override string GetValidationFailedMessage(Army army) - { - return ""; - } - protected override string GetAllowsAddingFailedMessage(UnitType toAdd, Army toArmy) { StringBuilder sb = new StringBuilder(); @@ -90,7 +85,7 @@ return IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount); } - private bool IsValidByRequirement (UnitCountRequirementData limit, int allowedTypeCount, int limitedTypeCount) + private bool IsValidByRequirement(UnitCountRequirementData limit, int allowedTypeCount, int limitedTypeCount) { double limitedTypeMultiplier = limitedTypeCount / (limit.Count * 1.0); double allowedTypeMultiplier = allowedTypeCount / (limit.AllowsCount * 1.0); @@ -135,7 +130,55 @@ public override Validation ValidatesArmy(Army army) { - return Validation.NotApplicable; + Validation canAdd = Validation.NotApplicable; + int allowedTypeCount = army.GetUnitTypeCount(allowedType); + bool typeFound = (allowedTypeCount > 0); + + foreach (UnitCountRequirementData limit in requiredTypes) + { + int limitedTypeCount = army.GetUnitTypeCount(limit.UnitType); + typeFound |= (limitedTypeCount > 0); + + if (!IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount)) + { + canAdd = Validation.Failed; + break; + } + } + + if (typeFound && canAdd == Validation.NotApplicable) + { + canAdd = Validation.Passed; + } + + return canAdd; + } + + protected override string GetValidationFailedMessage(Army army) + { + StringBuilder sb = new StringBuilder(); + sb.Append(FailureStringPrefix); + sb.Append(String.Join("; ", GetFailedValidationRequirements(army).ToArray())); + sb.Append("."); + return sb.ToString(); + } + + private List<string> GetFailedValidationRequirements(Army army) + { + List<string> failures = new List<string>(); + int allowedTypeCount = army.GetUnitTypeCount(allowedType); + + foreach (UnitCountRequirementData limit in requiredTypes) + { + int limitedTypeCount = army.GetUnitTypeCount(limit.UnitType); + + if (!IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount)) + { + failures.Add(String.Format("{0} {1} for every {2} {3} (have {4} for {5})", limit.Count, limit.UnitType.Name, limit.AllowsCount, allowedType.Name, limitedTypeCount, allowedTypeCount)); + } + } + + return failures; } public override string RequirementID