Mercurial > repos > IBBoard.WarFoundry.API
annotate API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs @ 479:f48c49b53738
Re #410: "N units per M models in parent" requirement
* Add a "context" object that will hold the parent unit (or possibly other stuff)
* Update all method signatures and calls
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Wed, 23 May 2012 20:56:27 +0100 |
parents | 159dc9be36c2 |
children | e0641e0eb86c |
rev | line source |
---|---|
356 | 1 // This file (RequiresNoMoreThanNOfUnitTypeRequirement.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard |
2 // | |
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. | |
4 using System; | |
5 using IBBoard.WarFoundry.API.Objects; | |
6 using System.Collections.Generic; | |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
7 using System.Text; |
356 | 8 |
9 namespace IBBoard.WarFoundry.API.Objects.Requirement | |
10 { | |
11 /// <summary> | |
12 /// A requirement where a WarFoundryObject cannot be taken in an army if more than N of a UnitType will be in the army. | |
13 /// </summary> | |
458 | 14 public abstract class RequiresNoMoreThanNOfUnitTypeRequirement<OBJECT_TYPE> : AbstractUnitRequirement<OBJECT_TYPE> where OBJECT_TYPE : IWarFoundryObject |
356 | 15 { |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
16 public static readonly string REQUIREMENT_ID = "RequiresNoMoreThanNUnits"; |
356 | 17 |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
18 public RequiresNoMoreThanNOfUnitTypeRequirement(OBJECT_TYPE allowedObject, params UnitType[] limitedUnitTypes) : base(allowedObject, limitedUnitTypes) |
356 | 19 { |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
20 //Do nothing special |
356 | 21 } |
22 | |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
23 public override string RequirementID |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
24 { |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
25 get |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
26 { |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
27 return REQUIREMENT_ID; |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
28 } |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
29 } |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
419
diff
changeset
|
30 |
479
f48c49b53738
Re #410: "N units per M models in parent" requirement
IBBoard <dev@ibboard.co.uk>
parents:
462
diff
changeset
|
31 protected override bool IsApplicable(Army toArmy, AddingContext context) |
461
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
32 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
33 return false; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
34 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
35 |
479
f48c49b53738
Re #410: "N units per M models in parent" requirement
IBBoard <dev@ibboard.co.uk>
parents:
462
diff
changeset
|
36 protected override bool IsApplicable(IWarFoundryObject toObject, AddingContext context) |
461
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
37 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
38 bool isApplicable = false; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
39 UnitType unitType = GetUnitTypeFromObject(toObject); |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
40 |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
41 if (unitType != null) |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
42 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
43 isApplicable = IsApplicable(unitType); |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
44 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
45 |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
46 return isApplicable; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
47 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
48 |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
49 private bool IsApplicable(UnitType unitType) |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
50 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
51 bool isApplicable = false; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
52 foreach (UnitCountRequirementData requirement in ConstraintTypes) |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
53 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
54 if (requirement.UnitType.Equals(unitType)) |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
55 { |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
56 isApplicable = true; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
57 break; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
58 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
59 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
60 return isApplicable; |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
61 } |
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
62 |
479
f48c49b53738
Re #410: "N units per M models in parent" requirement
IBBoard <dev@ibboard.co.uk>
parents:
462
diff
changeset
|
63 protected override Validation CheckAllowsAdding(IWarFoundryObject wfObject, Army toArmy, AddingContext context) |
461
f0594621e4a0
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
458
diff
changeset
|
64 { |
356 | 65 Validation canAdd = Validation.Passed; |
66 | |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
67 foreach (UnitCountRequirementData limit in ConstraintTypes) |
356 | 68 { |
69 if (GetUnitTypeCount(toArmy, limit.UnitType, wfObject) > limit.Count) | |
70 { | |
71 canAdd = Validation.Failed; | |
72 break; | |
73 } | |
74 } | |
75 | |
76 return canAdd; | |
77 } | |
78 | |
79 private int GetUnitTypeCount(Army toArmy, UnitType unitType, WarFoundryObject wfObject) | |
80 { | |
81 return toArmy.GetUnitTypeCount(unitType) + GetCountFromObject(wfObject, unitType); | |
82 } | |
83 | |
84 private int GetCountFromObject(WarFoundryObject wfObject, UnitType limitedType) | |
85 { | |
86 return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0; | |
87 } | |
88 | |
89 /// <summary> | |
90 /// Adds a requirement for there to be no more than maxCount of a given UnitType | |
91 /// </summary> | |
92 /// <param name='unitType'> | |
93 /// The unit type to limit. | |
94 /// </param> | |
95 /// <param name='minCount'> | |
96 /// The maximum number of that type that must exist. | |
97 /// </param> | |
98 public void AddUnitTypeRequirement(UnitType unitType, int maxCount) | |
99 { | |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
100 ConstraintTypes.Add(new UnitCountRequirementData(unitType, maxCount)); |
356 | 101 } |
102 | |
103 /// <summary> | |
104 /// Adds a requirement for there to be none of a given UnitType | |
105 /// </summary> | |
106 /// <param name='unitType'> | |
107 /// The unit type to limit. | |
108 /// </param> | |
455
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
109 public override void AddUnitTypeRequirement(UnitType unitType) |
356 | 110 { |
111 AddUnitTypeRequirement(unitType, 0); | |
112 } | |
113 | |
114 /// <summary> | |
115 /// Checks whether the supplied army is currently valid according to this requirement. | |
116 /// </summary> | |
117 /// <returns> | |
118 /// A <code>Validation</code> enum to show the result of the validation | |
119 /// </returns> | |
120 /// <param name='toValidate'> | |
121 /// The army to validate | |
122 /// </param> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
123 public override Validation ValidatesArmy(Army army) |
356 | 124 { |
458 | 125 Validation canAdd = Validation.NotApplicable; |
126 int allowedTypeCount = GetObjectCountFromArmy(army, AllowedObject); | |
127 | |
128 if (allowedTypeCount > 0) | |
356 | 129 { |
458 | 130 canAdd = Validation.Passed; |
131 | |
132 foreach (UnitCountRequirementData limit in ConstraintTypes) | |
356 | 133 { |
458 | 134 if (army.GetUnitTypeCount(limit.UnitType) > limit.Count) |
135 { | |
136 canAdd = Validation.Failed; | |
137 break; | |
138 } | |
356 | 139 } |
140 } | |
458 | 141 else |
142 { | |
143 canAdd = Validation.NotApplicable; | |
144 } | |
356 | 145 |
146 return canAdd; | |
147 } | |
148 | |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
149 protected override string ValidationFailedMessage |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
150 { |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
151 get |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
152 { |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
153 return "Army cannot contain more than: {0}."; |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
154 } |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
155 } |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
156 |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
157 protected override string GetFailedRequirementsString(Army army) |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
158 { |
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
159 return String.Join("; ", GetFailedRequirements(army).ToArray()); |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
160 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
161 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
162 private List<string> GetFailedRequirements(Army army) |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
163 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
164 List<string> failures = new List<string>(); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
165 |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
166 foreach (UnitCountRequirementData requirement in ConstraintTypes) |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
167 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
168 int unitCount = army.GetUnitTypeCount(requirement.UnitType); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
169 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
170 if (unitCount > requirement.Count) |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
171 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
172 failures.Add(requirement.Count + " × " + requirement.UnitType.Name + " (have " + unitCount + ")"); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
173 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
174 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
175 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
176 return failures; |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
177 } |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
178 |
455
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
179 protected override string GetFailedAddingRequirementsString(IWarFoundryObject toAdd, Army toArmy) |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
180 { |
453
dace3b7779ca
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
181 return String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray()); |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
182 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
183 |
455
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
184 private List<string> GetFailedAddingRequirements(IWarFoundryObject toAdd, Army army) |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
185 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
186 List<string> failures = new List<string>(); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
187 |
457
8e01c3174cc3
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
455
diff
changeset
|
188 foreach (UnitCountRequirementData requirement in ConstraintTypes) |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
189 { |
455
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
190 int unitCount = GetUnitTypeCount(army, requirement.UnitType, toAdd); |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
191 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
192 if (unitCount > requirement.Count) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
193 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
194 failures.Add(requirement.Count + " × " + requirement.UnitType.Name + " (would have " + unitCount + ")"); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
195 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
196 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
197 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
198 return failures; |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
199 } |
455
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
200 |
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
201 protected override int GetObjectCountFromArmy(Army toArmy) |
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
202 { |
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
203 return 0; |
afc6410e4efc
Re #379: Fix validation of requirements to check for unit
IBBoard <dev@ibboard.co.uk>
parents:
453
diff
changeset
|
204 } |
356 | 205 } |
206 } | |
207 |