Mercurial > repos > IBBoard.WarFoundry.API
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 |