annotate API/Objects/Requirement/UnitRequiresNParentModelsForMUnitsRequirement.cs @ 487:248df19652f9

Re #410: Create "N units per M models in parent unit" requirement * Add null adding context * Add initial skeleton of "N units per M models in parent unit" requirement * Update use of context * Standardise some of "is applicable" testing
author IBBoard <dev@ibboard.co.uk>
date Fri, 27 Jul 2012 20:31:12 +0100
parents
children c082a312a741
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
487
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 // This file (UnitRequiresNoMoreThanNUnitsPerMModelsInParentUnitRequirement.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2012 IBBoard
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2 //
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
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.
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 using System;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 using IBBoard.WarFoundry.API.Objects.Requirement.Context;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 namespace IBBoard.WarFoundry.API.Objects.Requirement
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 public class UnitRequiresNParentModelsForMUnitsRequirement : AbstractUnitRequirement<UnitType>
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 public static readonly string N_PER_M_IN_PARENT_REQUIREMENT_ID = "RequiresNoMoreThanNUnitsPerMModelsInParent";
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 public UnitRequiresNParentModelsForMUnitsRequirement(UnitType allowedObject, params UnitType[] limitedUnitTypes) : base(allowedObject, limitedUnitTypes)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 //Do nothing special
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 public override string RequirementID
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 get
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 return N_PER_M_IN_PARENT_REQUIREMENT_ID;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 protected override bool IsApplicable(IWarFoundryObject toObject, AddingContext context)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 return GetCountFromContext(context) > 0 && IsApplicable(toObject);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 private bool IsApplicable(IWarFoundryObject toObject)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 bool isApplicable = false;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 UnitType unitType = GetUnitTypeFromObject(toObject);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 if (unitType != null)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 isApplicable = this.AllowedObject.Equals(unitType) || IsApplicable(unitType);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 return isApplicable;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 private bool IsApplicable(UnitType unitType)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46 bool isApplicable = false;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 foreach (UnitCountRequirementData requirement in ConstraintTypes)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 if (requirement.UnitType.Equals(unitType))
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 isApplicable = true;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52 break;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55 return isApplicable;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 protected override int GetObjectCountFromArmy(Army toArmy, UnitType obj)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60 return 0;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63 protected override int GetObjectCountFromObject(IWarFoundryObject wfObject)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65 return base.GetObjectCountFromObject(wfObject);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 private int GetCountFromContext(AddingContext context)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 AddingToParentContext parentContext = context as AddingToParentContext;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
71
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
72 if (parentContext == null || !IsUnitTypeLimited(parentContext.ParentUnit.UnitType))
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
73 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
74 return 0;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 else
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 return parentContext.ParentUnit.Size;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
81
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
82 public override void AddUnitTypeRequirement(UnitType unitType)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
83 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
84 this.ConstraintTypes.Add(new UnitCountRequirementData(unitType, 1, 1));
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
85 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
86
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
87 protected override string GetFailedRequirementsString(Army army)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
88 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
89 return "";
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
90 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
91
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
92 protected override string GetFailedAddingRequirementsString(IWarFoundryObject toAdd, Army toArmy, AddingContext context)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
93 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
94 UnitType unitType = GetUnitTypeFromObject(toAdd);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
95 AddingToParentContext parentContext = context as AddingToParentContext;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
96
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
97 if (unitType != null && parentContext != null)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
98 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
99 return GetFailedAddingRequirementsString(unitType, parentContext.ParentUnit, toArmy);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
100 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
101 else
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
102 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
103 return "";
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
104 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
105 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
106
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
107 private string GetFailedAddingRequirementsString(UnitType unitType, Unit parentUnit, Army toArmy)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
108 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
109 int allowedTypeCount = GetChildCountFromUnit(parentUnit);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
110
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
111 return String.Format("Army can only contain {0} × {1} as a sub-unit of each {2}, would have {3}", allowedTypeCount, unitType.Name, parentUnit.UnitType.Name, (allowedTypeCount + 1));
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
112 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
113
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
114 protected override string AllowsAddingFailedMessage
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
115 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
116 get
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
117 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
118 return "{0}";
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
119 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
120 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
121
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
122 protected override Validation CheckAllowsAdding(IWarFoundryObject wfObject, Army toArmy, AddingContext context)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
123 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
124 AddingToParentContext parentContext = context as AddingToParentContext;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
125 return parentContext == null ? Validation.Passed : CheckAllowsAdding(wfObject, toArmy, parentContext);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
126 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
127
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
128 private Validation CheckAllowsAdding(IWarFoundryObject obj, Army toArmy, AddingToParentContext context)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
129 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
130 Validation canAdd = Validation.Passed;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
131 Unit parentUnit = context.ParentUnit;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
132 //Get count and add one because we're checking if this unit can be added, so it hasn't been added yet
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
133 int allowedTypeCount = GetChildCountFromUnit(parentUnit) + 1;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
134
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
135 foreach (UnitCountRequirementData limit in ConstraintTypes)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
136 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
137 int limitedTypeCount = parentUnit.Size;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
138
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
139 if (!IsValidByRequirement(limit, allowedTypeCount, limitedTypeCount))
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
140 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
141 canAdd = Validation.Failed;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
142 break;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
143 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
144 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
145
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
146 return canAdd;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
147 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
148
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
149 private int GetChildCountFromUnit(Unit parentUnit)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
150 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
151 int count = 0;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
152
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
153 foreach (Unit unit in parentUnit.ContainedUnits)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
154 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
155 if (unit.UnitType.Equals(AllowedObject))
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
156 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
157 count++;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
158 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
159 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
160
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
161 return count;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
162 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
163
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
164 private bool IsValidByRequirement(UnitCountRequirementData limit, int allowedTypeCount, int limitedTypeCount)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
165 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
166 //Round down limited units to get only whole amounts
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
167 double normalisedLimited = Math.Floor(limitedTypeCount / (limit.Count * 1.0));
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
168 double normalisedAllowed = allowedTypeCount / (limit.AllowsCount * 1.0);
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
169 return normalisedLimited >= 1 && normalisedAllowed <= normalisedLimited;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
170 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
171
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
172 public override Validation ValidatesArmy(Army army)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
173 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
174 throw new System.NotImplementedException();
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
175 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
176
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
177 protected override int GetObjectCountFromArmy(Army toArmy)
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
178 {
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
179 return 0;
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
180 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
181 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
182 }
248df19652f9 Re #410: Create "N units per M models in parent unit" requirement
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
183