annotate api/DefaultWarFoundryLoader.cs @ 233:a36a0e9cc05d

Re #228: Crash with missing abilityID * Separate out the actual loader implementation from the static "WarFoundryLoader" class * Add a setter method for the current loader * Create an abstract and default implementation of the Loader to reduce coupling and allow easier mocking/testing
author IBBoard <dev@ibboard.co.uk>
date Thu, 24 Dec 2009 19:45:39 +0000
parents
children 5ed39187b0e3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
233
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 // This file (DefaultWarFoundryLoader.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2 //
a36a0e9cc05d Re #228: Crash with missing abilityID
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.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 using System;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 using System.Collections.Generic;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 using IBBoard.WarFoundry.API.Objects;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 namespace IBBoard.WarFoundry.API
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 /// <summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 /// The default implementation of a <see cref="AbstractWarFoundryLoader"/>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 /// </summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 public class DefaultWarFoundryLoader : AbstractWarFoundryLoader
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 private Dictionary<string, GameSystem> systemsTable;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 private Dictionary<string, Dictionary<string, Dictionary<string, Race>>> racesTable; //Keys are: System, Race, SubRace
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 public DefaultWarFoundryLoader ()
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 protected override void PrepareForFileLoad()
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 //Just set up blank dictionaries for now - may try different and more complex handling in future
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 systemsTable = new Dictionary<string,GameSystem>();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 racesTable = new Dictionary<string,Dictionary<string,Dictionary<string,Race>>>();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 protected override GameSystem GetExistingSystemForSystem (GameSystem system)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 return DictionaryUtils.GetValue(systemsTable, system.ID.ToLower());
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 protected override void DoStoreGameSystem (GameSystem system)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 systemsTable[system.ID.ToLower()] = system;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 protected override void DoStoreRace (Race race)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 Dictionary<string, Dictionary<string, Race>> systemRaces;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 string systemID = race.GameSystem.ID.ToLower();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 racesTable.TryGetValue(systemID, out systemRaces);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 if (systemRaces==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 systemRaces = new Dictionary<string,Dictionary<string,Race>>();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 racesTable.Add(systemID, systemRaces);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 Dictionary<string, Race> subRaces;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 systemRaces.TryGetValue(race.ID.ToLower(), out subRaces);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 if (subRaces==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 subRaces = new Dictionary<string,Race>();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 systemRaces.Add(race.ID.ToLower(), subRaces);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62 string subID = race.SubID.ToLower();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 if (subRaces.ContainsKey(subID))
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 Race existingRace = subRaces[subID];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 if (!race.Equals(existingRace))
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 //TODO: Raise an event to say we got a different duplicate
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
71 //We can't just fail, because failing is for completely unhandled files, not for objects in a file
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
72 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
73 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
74 else
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 subRaces.Add(race.SubID.ToLower(), race);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80 public override GameSystem[] GetGameSystems()
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
81 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
82 if (systemsTable==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
83 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
84 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
85 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
86
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
87 return DictionaryUtils.ToArray<string, GameSystem>(systemsTable);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
88 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
89
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
90 public override GameSystem GetGameSystem(string systemID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
91 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
92 if (systemsTable==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
93 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
94 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
95 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
96
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
97 GameSystem system;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
98 systemsTable.TryGetValue(systemID.ToLower(), out system);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
99 return system;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
100 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
101
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
102 protected internal override void RemoveGameSystem(GameSystem system)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
103 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
104 systemsTable.Remove(system.ID.ToLower());
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
105 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
106
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
107 public override Race[] GetRaces(GameSystem system)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
108 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
109 return GetRaces(system.ID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
110 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
111
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
112 /// <summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
113 /// Gets an array of the races for a game system by ID.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
114 /// </summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
115 /// <param name="systemID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
116 /// The <see cref="System.String"/> ID of the game system to get races for
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
117 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
118 /// <returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
119 /// An array of <see cref="Race"/>s for the specified game system
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
120 /// </returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
121 public Race[] GetRaces(string systemID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
122 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
123 if (racesTable==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
124 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
125 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
126 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
127
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
128 systemID = systemID.ToLower();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
129 Dictionary<string, Dictionary<string, Race>> system;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
130 racesTable.TryGetValue(systemID, out system);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
131
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
132 if (system==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
133 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
134 return new Race[0];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
135 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
136
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
137 int count = 0;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
138
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
139 foreach (Dictionary<string, Race> racesDict in system.Values)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
140 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
141 count+= racesDict.Count;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
142 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
143
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
144 Race[] races = new Race[count];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
145 int i = 0;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
146
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
147 foreach (string raceID in system.Keys)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
148 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
149 foreach (string raceSubId in system[raceID].Keys)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
150 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
151 races[i++] = GetRace(systemID, raceID, raceSubId);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
152 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
153 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
154
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
155 return races;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
156 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
157
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
158 public override Race GetRace(GameSystem system, string raceID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
159 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
160 return GetRace(system.ID, raceID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
161 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
162
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
163 /// <summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
164 /// Gets a single race for a given game system by ID of the game system and race.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
165 /// </summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
166 /// <param name="systemID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
167 /// The <see cref="System.String"/> ID of the game system that the race is part of.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
168 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
169 /// <param name="raceID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
170 /// The <see cref="System.String"/> ID for the race to load.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
171 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
172 /// <returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
173 /// A <see cref="Race"/> with the specified ID from the game system with the specified ID, or <code>null</code> if there is no race or game system with those IDs.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
174 /// </returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
175 public Race GetRace(string systemID, string raceID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
176 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
177 return GetRace(systemID, raceID, "");
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
178 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
179
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
180 public override Race GetRace(GameSystem system, string raceID, string raceSubID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
181 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
182 return GetRace(system.ID, raceID, raceSubID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
183 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
184
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
185 /// <summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
186 /// Gets a single race for a given game system by the game system's ID and the race's ID and sub-race ID.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
187 /// </summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
188 /// <param name="systemID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
189 /// The <see cref="System.String"/> ID of the game system that the race is part of.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
190 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
191 /// <param name="raceID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
192 /// The <see cref="System.String"/> ID for the race to load.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
193 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
194 /// <param name="raceSubID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
195 /// A <see cref="System.String"/>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
196 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
197 /// <returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
198 /// A <see cref="Race"/>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
199 /// </returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
200 public Race GetRace(string systemID, string raceID, string raceSubID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
201 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
202 if (racesTable==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
203 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
204 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
205 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
206
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
207 Race race = null;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
208
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
209 Dictionary<string, Race> subraces = GetRaceTable(systemID, raceID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
210
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
211 if (subraces != null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
212 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
213 subraces.TryGetValue(raceSubID.ToLower(), out race);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
214 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
215
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
216 return race;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
217 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
218
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
219 private Dictionary<string, Race> GetRaceTable(string systemID, string raceID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
220 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
221 Dictionary<string, Dictionary<string, Race>> races;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
222 racesTable.TryGetValue(systemID.ToLower(), out races);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
223 Dictionary<string, Race> subraces = null;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
224
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
225 if (races != null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
226 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
227 races.TryGetValue(raceID.ToLower(), out subraces);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
228 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
229
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
230 return subraces;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
231 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
232
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
233 protected internal override void RemoveRace(Race race)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
234 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
235 Dictionary<string, Race> subraces = GetRaceTable(race.GameSystem.ID, race.ID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
236
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
237 if (subraces != null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
238 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
239 subraces.Remove(race.SubID.ToLower());
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
240 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
241 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
242
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
243 public override string[] GetGameSystemIDs()
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
244 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
245 if (systemsTable==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
246 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
247 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
248 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
249
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
250 return DictionaryUtils.ToKeyArray(systemsTable);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
251 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
252
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
253 public override string[] GetSystemRaceIDs(GameSystem system)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
254 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
255 return GetSystemRaceIDs(system.ID);
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
256 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
257
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
258 /// <summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
259 /// Gets the IDs of all of the races of a specified game system.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
260 /// </summary>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
261 /// <param name="systemID">
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
262 /// The <see cref="System.String"/> ID of the game system to get the available races for.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
263 /// </param>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
264 /// <returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
265 /// An array of <see cref="System.String"/>s representing the IDs of the races of the specified game system.
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
266 /// </returns>
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
267 public string[] GetSystemRaceIDs(string systemID)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
268 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
269 if (racesTable == null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
270 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
271 LoadFiles();
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
272 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
273
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
274 Dictionary<string, Dictionary<string, Race>> races = racesTable[systemID.ToLower()];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
275
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
276 if (races==null)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
277 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
278 return new string[0];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
279 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
280 else
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
281 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
282 string[] keys = new string[races.Keys.Count];
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
283 int i = 0;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
284
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
285 foreach (string key in races.Keys)
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
286 {
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
287 keys[i++] = key;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
288 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
289
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
290 return keys;
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
291 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
292 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
293 }
a36a0e9cc05d Re #228: Crash with missing abilityID
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
294 }