Mercurial > repos > IBDev-IBBoard.WarFoundry.API
annotate API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs @ 453:dace3b7779ca
Re #379: Fix validation of requirements to check for unit
* Restructure all validation messages to a common base system that will translate better
* Update "No More Than" texts to differentiate two contexts (adding and validating)
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 29 Jan 2012 20:05:25 +0000 |
parents | b671085871b7 |
children | afc6410e4efc |
rev | line source |
---|---|
357 | 1 // This file (UnitRequiresAtLeastNUnitsRequirement.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
2 // |
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
3 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. |
357 | 4 using System; |
5 using System.Collections.Generic; | |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
6 using IBBoard.WarFoundry.API.Objects; |
359
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
7 using System.Text; |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
8 |
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
9 namespace IBBoard.WarFoundry.API.Objects.Requirement |
357 | 10 { |
11 /// <summary> | |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
12 /// A requirement where a WarFoundryObject requires at least N units of any of the specified unit types before any number of that object can be taken in an army. |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
13 /// |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
14 /// The definition for how this requirement is built from a data file is defined in the <see cref="UnitRequiresAtLeastNUnitsRequirementFactory"/> class. |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
15 /// </summary> |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
16 public class RequiresAtLeastNUnitsRequirement : AbstractRequirement |
357 | 17 { |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
18 public static readonly string REQUIREMENT_ID = "RequiresAtLeastNUnits"; |
357 | 19 private List<UnitCountRequirementData> requiredTypes; |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
20 |
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
21 public RequiresAtLeastNUnitsRequirement(params UnitType[] requiredUnitTypes) |
357 | 22 { |
23 requiredTypes = new List<UnitCountRequirementData>(); | |
24 | |
25 foreach (UnitType unitType in requiredUnitTypes) | |
26 { | |
27 AddUnitTypeRequirement(unitType); | |
28 } | |
29 } | |
30 | |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
31 public override string RequirementID |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
32 { |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
33 get |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
34 { |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
35 return REQUIREMENT_ID; |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
36 } |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
37 } |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
38 |
452
b671085871b7
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
39 protected override bool TypeEquals(object obj) |
357 | 40 { |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
41 RequiresAtLeastNUnitsRequirement otherReq = (RequiresAtLeastNUnitsRequirement)obj; |
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
42 if (!Collections.Collections.AreEqual(requiredTypes, otherReq.requiredTypes)) |
357 | 43 { |
44 return false; | |
45 } | |
46 else | |
47 { | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
48 return true; |
357 | 49 } |
50 } | |
51 | |
419 | 52 public override int GetHashCode() |
53 { | |
54 int hash = 0; | |
55 | |
56 foreach (UnitCountRequirementData req in requiredTypes) | |
57 { | |
58 hash += req.UnitType.GetHashCode(); | |
59 } | |
60 | |
61 return hash; | |
62 } | |
63 | |
357 | 64 /// <summary> |
65 /// Checks whether the supplied WarFoundryObject can be added to the supplied army. | |
66 /// </summary> | |
67 /// <returns> | |
68 /// A <code>Validation</code> enum to show the result of the validation | |
69 /// </returns> | |
70 /// <param name='wfObject'> | |
71 /// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement | |
72 /// </param> | |
73 /// <param name='toArmy'> | |
74 /// The army to add the object to. | |
75 /// </param> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
76 public override Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy) |
357 | 77 { |
78 return IsApplicable(wfObject, toArmy) ? CheckAllowsAdding(wfObject, toArmy) : Validation.NotApplicable; | |
79 } | |
80 | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
81 protected override bool IsApplicable(Army toArmy) |
357 | 82 { |
83 return false; | |
84 } | |
85 | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
86 protected override bool IsApplicable(WarFoundryObject toObject) |
357 | 87 { |
88 bool isApplicable = false; | |
89 UnitType unitType = GetUnitTypeFromObject(toObject); | |
90 | |
91 if (unitType != null) | |
92 { | |
93 isApplicable = IsApplicable(unitType); | |
94 } | |
95 | |
96 return isApplicable; | |
97 } | |
98 | |
452
b671085871b7
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
99 protected UnitType GetUnitTypeFromObject(WarFoundryObject toObject) |
357 | 100 { |
101 UnitType unitType = null; | |
102 | |
103 if (toObject is UnitType) | |
104 { | |
105 unitType = (UnitType)toObject; | |
106 } | |
107 else if (toObject is Unit) | |
108 { | |
109 unitType = ((Unit)toObject).UnitType; | |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
110 } |
357 | 111 |
112 return unitType; | |
113 } | |
114 | |
452
b671085871b7
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
115 private bool IsApplicable(UnitType unitType) |
357 | 116 { |
117 bool isApplicable = false; | |
118 foreach (UnitCountRequirementData requirement in requiredTypes) | |
119 { | |
120 if (requirement.UnitType.Equals(unitType)) | |
121 { | |
122 isApplicable = true; | |
123 break; | |
124 } | |
125 } | |
126 return isApplicable; | |
127 } | |
128 | |
129 private Validation CheckAllowsAdding(WarFoundryObject wfObject, Army toArmy) | |
130 { | |
131 Validation isValid = Validation.Passed; | |
132 | |
133 foreach (UnitCountRequirementData requirement in requiredTypes) | |
134 { | |
135 if (GetUnitTypeCount(toArmy, requirement.UnitType, wfObject) < requirement.Count) | |
136 { | |
137 isValid = Validation.Failed; | |
138 break; | |
139 } | |
140 } | |
141 | |
142 return isValid; | |
143 } | |
144 | |
145 private int GetUnitTypeCount(Army toArmy, UnitType unitType, WarFoundryObject wfObject) | |
146 { | |
147 return toArmy.GetUnitTypeCount(unitType) + GetCountFromObject(wfObject, unitType); | |
148 } | |
149 | |
150 private int GetCountFromObject(WarFoundryObject wfObject, UnitType limitedType) | |
151 { | |
152 return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0; | |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
153 } |
357 | 154 |
155 /// <summary> | |
156 /// Adds a requirement for there to be at least minCount of a given UnitType | |
157 /// </summary> | |
158 /// <param name='unitType'> | |
159 /// The unit type to require. | |
160 /// </param> | |
161 /// <param name='minCount'> | |
162 /// The minimum number of that type that must exist. | |
163 /// </param> | |
164 public void AddUnitTypeRequirement(UnitType unitType, int minCount) | |
165 { | |
166 requiredTypes.Add(new UnitCountRequirementData(unitType, minCount)); | |
167 } | |
168 | |
169 /// <summary> | |
170 /// Adds a requirement for there to be one or more of a given UnitType | |
171 /// </summary> | |
172 /// <param name='unitType'> | |
173 /// The unit type to require. | |
174 /// </param> | |
452
b671085871b7
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
175 public void AddUnitTypeRequirement(UnitType unitType) |
357 | 176 { |
177 AddUnitTypeRequirement(unitType, 1); | |
178 } | |
179 | |
180 /// <summary> | |
181 /// Checks whether the supplied army is currently valid according to this requirement. | |
182 /// </summary> | |
183 /// <returns> | |
184 /// A <code>Validation</code> enum to show the result of the validation | |
185 /// </returns> | |
186 /// <param name='toValidate'> | |
187 /// The army to validate | |
188 /// </param> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
189 public override Validation ValidatesArmy(Army toValidate) |
357 | 190 { |
191 Validation isValid = Validation.Passed; | |
192 | |
193 foreach (UnitCountRequirementData requirement in requiredTypes) | |
194 { | |
195 if (toValidate.GetUnitTypeCount(requirement.UnitType) < requirement.Count) | |
196 { | |
197 isValid = Validation.Failed; | |
198 break; | |
199 } | |
200 } | |
201 | |
202 return isValid; | |
203 } | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
204 |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
452
diff
changeset
|
205 protected override string GetFailedRequirementsString(Army army) |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
206 { |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
452
diff
changeset
|
207 return String.Join("; ", GetFailedRequirements(army).ToArray()); |
359
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
208 } |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
209 |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
210 private List<string> GetFailedRequirements(Army army) |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
211 { |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
212 List<string> failures = new List<string>(); |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
213 |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
214 foreach (UnitCountRequirementData requirement in requiredTypes) |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
215 { |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
216 int unitCount = army.GetUnitTypeCount(requirement.UnitType); |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
217 |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
218 if (unitCount < requirement.Count) |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
219 { |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
220 failures.Add(requirement.Count + " × " + requirement.UnitType.Name + " (have " + unitCount + ")"); |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
221 } |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
222 } |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
223 |
2a9c046be55a
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
224 return failures; |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
225 } |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
226 |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
452
diff
changeset
|
227 protected override string GetFailedAddingRequirementsString(UnitType toAdd, Army toArmy) |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
228 { |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
452
diff
changeset
|
229 return String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray()); |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
230 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
231 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
232 private List<string> GetFailedAddingRequirements(UnitType unitType, Army army) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
233 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
234 List<string> failures = new List<string>(); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
235 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
236 foreach (UnitCountRequirementData requirement in requiredTypes) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
237 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
238 int unitCount = GetUnitTypeCount(army, requirement.UnitType, unitType); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
239 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
240 if (unitCount < requirement.Count) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
241 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
242 failures.Add(requirement.Count + " × " + requirement.UnitType.Name + " (would have " + unitCount + ")"); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
243 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
244 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
245 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
246 return failures; |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
360
diff
changeset
|
247 } |
337
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
248 } |
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
249 } |
3c4a6403a88c
* Fix capitalisation so that new files are in the namespace
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
250 |