Mercurial > repos > IBBoard.WarFoundry.Plugin.Rollcall
annotate RollcallFactory.cs @ 3:2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
* Use new UnitType constructor
* Add units to race
* Cascade up unit loading function hierarchy instead of jumping a step
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 18 Jan 2009 20:54:26 +0000 |
parents | 9b17b3e35b9d |
children | c82b194801dc |
rev | line source |
---|---|
0 | 1 // RollcallFactory.cs |
2 // | |
3 // Copyright (C) 2008 IBBoard | |
4 // | |
5 // This library is free software; you can redistribute it and/or | |
6 // modify it under the terms of the GNU Lesser General Public | |
7 // License as published by the Free Software Foundation; either | |
8 // version 2.1 of the License, or (at your option) any later version. | |
9 // | |
10 // This library is distributed in the hope that it will be useful, | |
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 // Lesser General Public License for more details. | |
14 // | |
15 // You should have received a copy of the GNU Lesser General Public | |
16 // License along with this library; if not, write to the Free Software | |
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 // | |
19 // | |
20 | |
21 using System; | |
22 using System.Collections.Generic; | |
23 using System.IO; | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
24 using IBBoard.Ini; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
25 using IBBoard.IO; |
0 | 26 using IBBoard.Logging; |
27 using IBBoard.WarFoundry.API.Factories; | |
28 using IBBoard.WarFoundry.API.Objects; | |
29 | |
30 namespace IBBoard.WarFoundry.Plugin.Rollcall | |
31 { | |
32 public class RollcallFactory : AbstractNonNativeFileExtensionWarFoundryFactory | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
33 { |
0 | 34 public static RollcallFactory CreateFactory() |
35 { | |
36 return new RollcallFactory(); | |
37 } | |
38 | |
39 public override string NonNativeDataType | |
40 { | |
41 get { return "Rollcall ADF files"; } | |
42 } | |
43 | |
44 | |
45 protected override string ArmyFileExtension { | |
46 get { return null; } | |
47 } | |
48 | |
49 protected override string GameSystemFileExtension { | |
50 get { return null; } | |
51 } | |
52 | |
53 protected override string RaceFileExtension { | |
54 get { return ".adf"; } | |
55 } | |
56 | |
57 protected override ICollection<IWarFoundryObject> DoCreateObjectsFromFile(FileInfo file) | |
58 { | |
59 ICollection<IWarFoundryObject> objects = null; | |
60 IWarFoundryObject obj = null; | |
61 | |
62 if (IsRaceFile(file)) | |
63 { | |
64 obj = CreateRaceFromFile(file); | |
65 } | |
66 else if (IsArmyFile(file)) | |
67 { | |
68 obj = CreateArmyFromFile(file); | |
69 } | |
70 | |
71 if (obj != null) | |
72 { | |
73 objects = new List<IWarFoundryObject>(); | |
74 objects.Add(obj); | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
75 objects.Add(new GameSystem("Rollcall", "Rollcall armies", this)); |
0 | 76 } |
77 | |
78 return objects; | |
79 } | |
80 | |
81 protected override Army CreateArmyFromFile (FileInfo file) | |
82 { | |
83 return null; | |
84 } | |
85 | |
86 protected override Race CreateRaceFromFile(FileInfo file) | |
87 { | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
88 IniFile rollcallFile = IniFileReader.ReadFile(file); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
89 Race race = ReadRaceDetails(rollcallFile); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
90 ReadCategories(rollcallFile, race); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
91 ReadUnitTypeAndEquipmentSections(rollcallFile, race); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
92 return race; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
93 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
94 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
95 private Race ReadRaceDetails(IniFile file) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
96 { |
0 | 97 string id = null, name = null; |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
98 id = "Rollcall" + file["Army"]["BitCodeID"].Value; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
99 name = file["Army"]["Name"].Value; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
100 LogNotifier.Debug(GetType(), "Loading Rollcall race ID "+id); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
101 return new Race(id, name, "Rollcall", this); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
102 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
103 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
104 private void ReadCategories(IniFile file, Race race) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
105 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
106 IniSection section = file["Category"]; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
107 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
108 foreach (string key in section.Keys) |
0 | 109 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
110 string valueString = section[key].Value; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
111 string[] values = valueString.Split(','); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
112 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
113 if (values.Length == 3) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
114 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
115 LogNotifier.Debug(GetType(), "Loading category " + values[0]); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
116 int minPercent = 0; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
117 int.TryParse(values[1], out minPercent); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
118 int maxPercent = 100; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
119 int.TryParse(values[2], out maxPercent); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
120 maxPercent = Math.Max(0, Math.Min(100, Math.Max(minPercent, maxPercent))); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
121 minPercent = Math.Max(0, Math.Min(100, minPercent)); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
122 race.AddCategory(new Category(key, values[0], 0, 0, minPercent, maxPercent, 0, -1, 0, 0, 0)); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
123 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
124 //Special cases (allies and aliases) need to be handled later |
0 | 125 } |
126 } | |
127 | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
128 private void ReadUnitTypeAndEquipmentSections(IniFile file, Race race) |
0 | 129 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
130 foreach (IniSection section in file) |
0 | 131 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
132 string sectionName = section.Name; |
0 | 133 |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
134 if (sectionName == "Army" || sectionName == "Category") |
0 | 135 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
136 continue; |
0 | 137 } |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
138 else if (sectionName.StartsWith("Unit")) |
0 | 139 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
140 ReadUnitTypeSection(file, section, race); |
0 | 141 } |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
142 else |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
143 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
144 ReadEquipmentSection(file, section, race); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
145 } |
0 | 146 } |
147 } | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
148 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
149 private UnitType ReadUnitTypeSectionFromID(IniFile file, String sectionID, Race race) |
0 | 150 { |
3
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
151 return ReadUnitTypeSection(file, "Unit"+sectionID, race); |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
152 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
153 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
154 private UnitType ReadUnitTypeSection(IniFile file, String sectionName, Race race) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
155 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
156 return ReadUnitTypeSection(file, file[sectionName], race); |
0 | 157 } |
158 | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
159 private UnitType ReadUnitTypeSection(IniFile file, IniSection section, Race race) |
0 | 160 { |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
161 UnitType unitType = race.GetUnitType(section.Name); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
162 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
163 if (unitType == null) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
164 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
165 string unitID = GetUnitID(section); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
166 string name = section["Name"].Value; |
3
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
167 unitType = new UnitType(unitID, name, race); |
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
168 Category mainCat = race.GetCategory(section["Category"].Value); |
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
169 unitType.AddCategory(mainCat); |
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
170 unitType.MainCategory = mainCat; |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
171 //Load other values |
3
2a21138f50ed
Re #9 - Make WarFoundry API use smaller methods
IBBoard <dev@ibboard.co.uk>
parents:
2
diff
changeset
|
172 race.AddUnitType(unitType); |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
173 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
174 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
175 return unitType; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
176 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
177 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
178 private string GetUnitID(IniSection section) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
179 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
180 string sectionName = section.Name; |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
181 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
182 if (sectionName != "Unit" + section["UnitID"].Value) |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
183 { |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
184 throw new InvalidFileException("Attribute 'UnitID' for "+sectionName+" did not match section name"); |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
185 } |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
186 |
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
187 return sectionName; |
0 | 188 } |
189 | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
190 private void ReadEquipmentSection(IniFile file, IniSection section, Race race) |
0 | 191 { |
192 } | |
193 | |
194 protected override GameSystem CreateGameSystemFromFile (FileInfo file) | |
195 { | |
196 //Return null because there is no such thing | |
2
9b17b3e35b9d
Fixes #15 - Make Rollcall plugin use IBBoard.Ini
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
197 //TODO Determine whether we should exception |
0 | 198 return null; |
199 } | |
200 } | |
201 } |