comparison 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
comparison
equal deleted inserted replaced
438:410f3d85c9c5 439:5252dfb9cdfb
50 } 50 }
51 } 51 }
52 52
53 protected string FailureStringPrefix { get; set; } 53 protected string FailureStringPrefix { get; set; }
54 54
55 protected override string GetValidationFailedMessage(Army army)
56 {
57 return "";
58 }
59
60 protected override string GetAllowsAddingFailedMessage(UnitType toAdd, Army toArmy) 55 protected override string GetAllowsAddingFailedMessage(UnitType toAdd, Army toArmy)
61 { 56 {
62 StringBuilder sb = new StringBuilder(); 57 StringBuilder sb = new StringBuilder();
63 sb.Append(FailureStringPrefix); 58 sb.Append(FailureStringPrefix);
64 sb.Append(String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray())); 59 sb.Append(String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray()));
88 { 83 {
89 int limitedTypeCount = GetUnitTypeCount(toArmy, limit.UnitType, wfObject); 84 int limitedTypeCount = GetUnitTypeCount(toArmy, limit.UnitType, wfObject);
90 return IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount); 85 return IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount);
91 } 86 }
92 87
93 private bool IsValidByRequirement (UnitCountRequirementData limit, int allowedTypeCount, int limitedTypeCount) 88 private bool IsValidByRequirement(UnitCountRequirementData limit, int allowedTypeCount, int limitedTypeCount)
94 { 89 {
95 double limitedTypeMultiplier = limitedTypeCount / (limit.Count * 1.0); 90 double limitedTypeMultiplier = limitedTypeCount / (limit.Count * 1.0);
96 double allowedTypeMultiplier = allowedTypeCount / (limit.AllowsCount * 1.0); 91 double allowedTypeMultiplier = allowedTypeCount / (limit.AllowsCount * 1.0);
97 return allowedTypeMultiplier <= limitedTypeMultiplier; 92 return allowedTypeMultiplier <= limitedTypeMultiplier;
98 } 93 }
133 return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0; 128 return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0;
134 } 129 }
135 130
136 public override Validation ValidatesArmy(Army army) 131 public override Validation ValidatesArmy(Army army)
137 { 132 {
138 return Validation.NotApplicable; 133 Validation canAdd = Validation.NotApplicable;
134 int allowedTypeCount = army.GetUnitTypeCount(allowedType);
135 bool typeFound = (allowedTypeCount > 0);
136
137 foreach (UnitCountRequirementData limit in requiredTypes)
138 {
139 int limitedTypeCount = army.GetUnitTypeCount(limit.UnitType);
140 typeFound |= (limitedTypeCount > 0);
141
142 if (!IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount))
143 {
144 canAdd = Validation.Failed;
145 break;
146 }
147 }
148
149 if (typeFound && canAdd == Validation.NotApplicable)
150 {
151 canAdd = Validation.Passed;
152 }
153
154 return canAdd;
155 }
156
157 protected override string GetValidationFailedMessage(Army army)
158 {
159 StringBuilder sb = new StringBuilder();
160 sb.Append(FailureStringPrefix);
161 sb.Append(String.Join("; ", GetFailedValidationRequirements(army).ToArray()));
162 sb.Append(".");
163 return sb.ToString();
164 }
165
166 private List<string> GetFailedValidationRequirements(Army army)
167 {
168 List<string> failures = new List<string>();
169 int allowedTypeCount = army.GetUnitTypeCount(allowedType);
170
171 foreach (UnitCountRequirementData limit in requiredTypes)
172 {
173 int limitedTypeCount = army.GetUnitTypeCount(limit.UnitType);
174
175 if (!IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount))
176 {
177 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));
178 }
179 }
180
181 return failures;
139 } 182 }
140 183
141 public override string RequirementID 184 public override string RequirementID
142 { 185 {
143 get 186 get