Mercurial > repos > IBBoard.WarFoundry.API
annotate API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs @ 419:71fceea2725b
Code tidy-up - remove warnings
* Add missing GetHashcode() implementations
* Remove unused exception variables
* Use unused event
* Remove dead code
* Properly override some methods
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 25 Sep 2011 20:52:27 +0100 |
parents | 0dd8dbe8afe9 |
children | 3882b533d99d |
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> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
14 public class RequiresNoMoreThanNOfUnitTypeRequirement : AbstractRequirement |
356 | 15 { |
16 private List<UnitCountRequirementData> limitedTypes; | |
17 | |
18 public RequiresNoMoreThanNOfUnitTypeRequirement(params UnitType[] limitedUnitTypes) | |
19 { | |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
20 FailureStringPrefix = "Army cannot contain more than: "; |
356 | 21 limitedTypes = new List<UnitCountRequirementData>(); |
22 | |
23 foreach (UnitType unitType in limitedUnitTypes) | |
24 { | |
25 AddUnitTypeRequirement(unitType); | |
26 } | |
27 } | |
28 | |
29 /// <summary> | |
30 /// Checks whether the supplied WarFoundryObject can be added to the supplied army. | |
31 /// </summary> | |
32 /// <returns> | |
33 /// A <code>Validation</code> enum to show the result of the validation | |
34 /// </returns> | |
35 /// <param name='wfObject'> | |
36 /// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement | |
37 /// </param> | |
38 /// <param name='toArmy'> | |
39 /// The army to add the object to. | |
40 /// </param> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
41 public override Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy) |
356 | 42 { |
43 Validation canAdd = Validation.Passed; | |
44 | |
45 foreach (UnitCountRequirementData limit in limitedTypes) | |
46 { | |
47 if (GetUnitTypeCount(toArmy, limit.UnitType, wfObject) > limit.Count) | |
48 { | |
49 canAdd = Validation.Failed; | |
50 break; | |
51 } | |
52 } | |
53 | |
54 return canAdd; | |
55 } | |
56 | |
57 private int GetUnitTypeCount(Army toArmy, UnitType unitType, WarFoundryObject wfObject) | |
58 { | |
59 return toArmy.GetUnitTypeCount(unitType) + GetCountFromObject(wfObject, unitType); | |
60 } | |
61 | |
62 private int GetCountFromObject(WarFoundryObject wfObject, UnitType limitedType) | |
63 { | |
64 return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0; | |
65 } | |
66 | |
67 /// <summary> | |
68 /// Adds a requirement for there to be no more than maxCount of a given UnitType | |
69 /// </summary> | |
70 /// <param name='unitType'> | |
71 /// The unit type to limit. | |
72 /// </param> | |
73 /// <param name='minCount'> | |
74 /// The maximum number of that type that must exist. | |
75 /// </param> | |
76 public void AddUnitTypeRequirement(UnitType unitType, int maxCount) | |
77 { | |
78 limitedTypes.Add(new UnitCountRequirementData(unitType, maxCount)); | |
79 } | |
80 | |
81 /// <summary> | |
82 /// Adds a requirement for there to be none of a given UnitType | |
83 /// </summary> | |
84 /// <param name='unitType'> | |
85 /// The unit type to limit. | |
86 /// </param> | |
87 public void AddUnitTypeRequirement(UnitType unitType) | |
88 { | |
89 AddUnitTypeRequirement(unitType, 0); | |
90 } | |
91 | |
92 /// <summary> | |
93 /// Checks whether the supplied army is currently valid according to this requirement. | |
94 /// </summary> | |
95 /// <returns> | |
96 /// A <code>Validation</code> enum to show the result of the validation | |
97 /// </returns> | |
98 /// <param name='toValidate'> | |
99 /// The army to validate | |
100 /// </param> | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
101 public override Validation ValidatesArmy(Army army) |
356 | 102 { |
103 Validation canAdd = Validation.Passed; | |
104 | |
105 foreach (UnitCountRequirementData limit in limitedTypes) | |
106 { | |
107 if (army.GetUnitTypeCount(limit.UnitType) > limit.Count) | |
108 { | |
109 canAdd = Validation.Failed; | |
110 break; | |
111 } | |
112 } | |
113 | |
114 return canAdd; | |
115 } | |
116 | |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
117 protected override bool TypeEquals(object obj) |
356 | 118 { |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
119 RequiresNoMoreThanNOfUnitTypeRequirement other = (RequiresNoMoreThanNOfUnitTypeRequirement)obj; |
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
120 return Collections.Collections.AreEqual(limitedTypes, other.limitedTypes); |
356 | 121 } |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
122 |
419 | 123 public override int GetHashCode() |
124 { | |
125 int hash = 0; | |
126 | |
127 foreach (UnitCountRequirementData limit in limitedTypes) | |
128 { | |
129 hash += limit.UnitType.GetHashCode(); | |
130 } | |
131 | |
132 return hash; | |
133 } | |
134 | |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
135 protected string FailureStringPrefix { get; set; } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
136 |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
137 protected override string GetValidationFailedMessage (Army army) |
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
138 { |
362
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
139 StringBuilder sb = new StringBuilder(); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
140 sb.Append(FailureStringPrefix); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
141 sb.Append(String.Join("; ", GetFailedRequirements(army).ToArray())); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
142 sb.Append("."); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
143 return sb.ToString(); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
144 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
145 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
146 private List<string> GetFailedRequirements(Army army) |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
147 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
148 List<string> failures = new List<string>(); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
149 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
150 foreach (UnitCountRequirementData requirement in limitedTypes) |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
151 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
152 int unitCount = army.GetUnitTypeCount(requirement.UnitType); |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
153 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
154 if (unitCount > requirement.Count) |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
155 { |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
156 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
|
157 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
158 } |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
159 |
c19e61262400
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
358
diff
changeset
|
160 return failures; |
358
dbe7ccb1e557
Re #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
357
diff
changeset
|
161 } |
364
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
162 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
163 protected override string GetAllowsAddingFailedMessage(UnitType toAdd, Army toArmy) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
164 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
165 StringBuilder sb = new StringBuilder(); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
166 sb.Append(FailureStringPrefix); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
167 sb.Append(String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray())); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
168 sb.Append("."); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
169 return sb.ToString(); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
170 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
171 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
172 private List<string> GetFailedAddingRequirements(UnitType unitType, Army army) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
173 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
174 List<string> failures = new List<string>(); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
175 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
176 foreach (UnitCountRequirementData requirement in limitedTypes) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
177 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
178 int unitCount = GetUnitTypeCount(army, requirement.UnitType, unitType); |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
179 |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
180 if (unitCount > requirement.Count) |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
181 { |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
182 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
|
183 } |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
184 } |
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 return failures; |
0dd8dbe8afe9
Fixes #345: Add failure message to requirements
IBBoard <dev@ibboard.co.uk>
parents:
362
diff
changeset
|
187 } |
356 | 188 } |
189 } | |
190 |