Mercurial > repos > IBBoard.WarFoundry.API
annotate API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs @ 465:7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
* Make UnitRequiresAtLeastNUnitsRequirementFactory handle "alternatives" (Rollcall's "-1,X|Y" notation)
* Make RequiresAtLeastNUnitsRequirement handle alternatives/multiple unit types in one limit
* Move some useful code up the classes
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 24 Mar 2012 20:33:11 +0000 |
parents | 3882b533d99d |
children |
rev | line source |
---|---|
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
1 // This file (UnitRequiresAtLeastNUnitsRequirementFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
2 // |
bfdb95906075
Re #351: Add extensible requirement handling method
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. |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
4 using System; |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
5 using IBBoard.WarFoundry.API.Objects; |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
6 using IBBoard.WarFoundry.API.Objects.Requirement; |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
7 using System.Collections.Generic; |
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
8 |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
9 namespace IBBoard.WarFoundry.API.Factories.Requirement |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
10 { |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
11 /// <summary> |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
12 /// Factory for creating instances of <see cref="UnitRequiresAtLeastNUnitsRequirement" />. Data must be in the format: |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
13 /// |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
14 /// <code>unitID[:count][|unitID[:count][|...]]</code> |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
15 /// |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
16 /// e.g.: |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
17 /// |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
18 /// <code>Swordsmen:2|Bowmen</code> |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
19 /// |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
20 /// would generate a requirement to allow any number of the unit type after 1 unit with ID Bowmen or 2 units with ID Swordsmen were added. |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
21 /// </summary> |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
22 /// <exception cref='InvalidRequirementException'> |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
23 /// Is thrown when the invalid requirement exception. |
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
24 /// </exception> |
379
04f4c2fea356
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
377
diff
changeset
|
25 public class UnitRequiresAtLeastNUnitsRequirementFactory : IRequirementFactory |
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
26 { |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
27 public UnitRequiresAtLeastNUnitsRequirementFactory() |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
28 { |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
29 //Do nothing special |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
30 } |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
31 |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
32 public string AppliesToID |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
33 { |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
34 get |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
35 { |
427
3882b533d99d
Re #27: Define unit requirements
IBBoard <dev@ibboard.co.uk>
parents:
379
diff
changeset
|
36 return UnitRequiresAtLeastNUnitsRequirement.REQUIREMENT_ID; |
379
04f4c2fea356
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
377
diff
changeset
|
37 } |
04f4c2fea356
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
377
diff
changeset
|
38 } |
04f4c2fea356
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
377
diff
changeset
|
39 |
04f4c2fea356
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
377
diff
changeset
|
40 public IRequirement CreateRequirement<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitType type, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory) |
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
41 { |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
42 UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(type); |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
43 Race race = type.Race; |
377
c3b0b28bad48
Re #353: Handle unloaded units being referenced outside factory
IBBoard <dev@ibboard.co.uk>
parents:
376
diff
changeset
|
44 AddRequirements(req, race, data, raceFactory); |
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
45 return req; |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
46 } |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
47 |
377
c3b0b28bad48
Re #353: Handle unloaded units being referenced outside factory
IBBoard <dev@ibboard.co.uk>
parents:
376
diff
changeset
|
48 private void AddRequirements<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitRequiresAtLeastNUnitsRequirement req, Race race, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory) |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
49 { |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
50 foreach (string requirement in data.Split('|')) |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
51 { |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
52 string[] requirementParts = requirement.Split(':'); |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
53 string unitIDs = requirementParts[0]; |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
54 UnitType[] unitTypes = GetUnitTypes(unitIDs, race, raceFactory); |
374
13793f3a2a2e
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
373
diff
changeset
|
55 |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
56 if (requirementParts.Length == 2) |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
57 { |
375
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
58 string amount = requirementParts[1]; |
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
59 |
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
60 try |
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
61 { |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
62 req.AddUnitTypeRequirement(Int32.Parse(amount), unitTypes); |
375
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
63 } |
376
e50682387d63
Re #353: Handle unloaded units being referenced outside factory
IBBoard <dev@ibboard.co.uk>
parents:
375
diff
changeset
|
64 catch (FormatException) |
375
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
65 { |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
66 throw new InvalidRequirementException(String.Format("Invalid amount '{0}' for unit types '{1}' for 'Requires at least N units' requirement", amount, unitIDs)); |
375
d9bf78a8f517
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
374
diff
changeset
|
67 } |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
68 } |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
69 else |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
70 { |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
71 req.AddUnitTypeRequirement(unitTypes); |
373
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
72 } |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
73 } |
e10630f39ec2
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
372
diff
changeset
|
74 } |
465
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
75 |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
76 private UnitType[] GetUnitTypes<SOURCE_FILE_TYPE, ENTRY_TYPE>(string data, Race race, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory) |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
77 { |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
78 List<UnitType> unitTypes = new List<UnitType>(); |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
79 |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
80 foreach (string unitID in data.Split(';')) |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
81 { |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
82 UnitType unitType = raceFactory.GetUnitType(unitID, race); |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
83 |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
84 if (unitType == null) |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
85 { |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
86 throw new InvalidRequirementException(String.Format("Invalid unit type '{0}' for 'Requires at least N units' requirement", unitID)); |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
87 } |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
88 |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
89 unitTypes.Add(unitType); |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
90 } |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
91 |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
92 return unitTypes.ToArray(); |
7b9ff7b1df24
Re #394: Make requirements (or factory) more closely match Rollcall methods
IBBoard <dev@ibboard.co.uk>
parents:
427
diff
changeset
|
93 } |
371
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
94 } |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
95 } |
bfdb95906075
Re #351: Add extensible requirement handling method
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
96 |