# HG changeset patch # User IBBoard # Date 1309809746 0 # Node ID c3b0b28bad48423baae4666cde314a30497041cd # Parent e50682387d6361ab5013a4d6fd4fe740511d61ac Re #353: Handle unloaded units being referenced outside factory * Create interface for race factories * Start to pull out common methods and add "try unit and fall back to factory" method for getting unit types * Make XML Race Factory implement interface * Use new factory diff -r e50682387d63 -r c3b0b28bad48 API/Factories/IRaceFactory.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API/Factories/IRaceFactory.cs Mon Jul 04 20:02:26 2011 +0000 @@ -0,0 +1,20 @@ +// This file (IRaceFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard +// +// 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. +using System; +using IBBoard.WarFoundry.API.Objects; + +namespace IBBoard.WarFoundry.API.Factories +{ + /// + /// Interface for factory that creates races. SOURCE_FILE_TYPE is the class of the source 'file' or object. ENTRY_TYPE is the class of the object that data is loaded from. + /// + public interface IRaceFactory + { + Race CreateRace(ENTRY_TYPE entry); + void CompleteLoading(Race race); + UnitType GetUnitType(string id, Race parentRace); + UnitType GetUnitType(string id, Race parentRace, SOURCE_FILE_TYPE src); + } +} + diff -r e50682387d63 -r c3b0b28bad48 API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs --- a/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs Sat Jul 02 19:58:28 2011 +0000 +++ b/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs Mon Jul 04 20:02:26 2011 +0000 @@ -14,21 +14,21 @@ //Do nothing special } - public UnitRequiresAtLeastNUnitsRequirement CreateRequirement(UnitType type, string data) + public UnitRequiresAtLeastNUnitsRequirement CreateRequirement(UnitType type, string data, IRaceFactory raceFactory) { UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(type); Race race = type.Race; - AddRequirements(req, race, data); + AddRequirements(req, race, data, raceFactory); return req; } - private void AddRequirements(UnitRequiresAtLeastNUnitsRequirement req, Race race, string data) + private void AddRequirements(UnitRequiresAtLeastNUnitsRequirement req, Race race, string data, IRaceFactory raceFactory) { foreach (string requirement in data.Split('|')) { string[] requirementParts = requirement.Split(':'); string unitID = requirementParts[0]; - UnitType unitType = race.GetUnitType(unitID); + UnitType unitType = raceFactory.GetUnitType(unitID, race); if (unitType == null) { diff -r e50682387d63 -r c3b0b28bad48 API/Factories/Xml/WarFoundryXmlFactory.cs --- a/API/Factories/Xml/WarFoundryXmlFactory.cs Sat Jul 02 19:58:28 2011 +0000 +++ b/API/Factories/Xml/WarFoundryXmlFactory.cs Mon Jul 04 20:02:26 2011 +0000 @@ -139,7 +139,7 @@ { XmlElement elem = GetRootElementFromStream(dataStream, WarFoundryXmlElementName.RACE_ELEMENT); LogNotifier.Debug(GetType(), "Create Race"); - return raceFactory.CreateRaceFromElement(file, elem); + return raceFactory.CreateRaceFromElement(elem); } protected override void CleanUpFileAsSupportedType(ZipFile typedFile) diff -r e50682387d63 -r c3b0b28bad48 API/Factories/Xml/WarFoundryXmlRaceFactory.cs --- a/API/Factories/Xml/WarFoundryXmlRaceFactory.cs Sat Jul 02 19:58:28 2011 +0000 +++ b/API/Factories/Xml/WarFoundryXmlRaceFactory.cs Mon Jul 04 20:02:26 2011 +0000 @@ -20,7 +20,7 @@ /// /// A sub-factory for loading WarFoundry Race XML files /// - public class WarFoundryXmlRaceFactory + public class WarFoundryXmlRaceFactory : IRaceFactory { private Dictionary extraData = new Dictionary(); private WarFoundryXmlLimitParser limitParser = new WarFoundryXmlLimitParser(); @@ -41,9 +41,14 @@ XmlDocument extra = null; extraData.TryGetValue(obj, out extra); return extra; + } + + public Race CreateRace(XmlElement elem) + { + return CreateRaceFromElement(elem); } - public Race CreateRaceFromElement(ZipFile file, XmlElement elem) + public Race CreateRaceFromElement(XmlElement elem) { string id = elem.GetAttribute("id"); string subid = elem.GetAttribute("subid"); @@ -106,6 +111,24 @@ Category cat = CategoryLoader.CreateFromElement(elem); parentRace.AddCategory(cat); return cat; + } + + + public UnitType GetUnitType(string id, Race parentRace) + { + return GetUnitType(id, parentRace, GetExtraData(parentRace)); + } + + public UnitType GetUnitType(string id, Race parentRace, XmlDocument doc) + { + UnitType type = parentRace.GetUnitType(id); + + if (type==null) + { + type = GetUnitTypeFromDocument(doc, id, parentRace); + } + + return type; } private UnitType GetUnitTypeFromDocument(XmlDocument doc, string id, Race parentRace) @@ -383,7 +406,7 @@ if (reqFactory != null) { string data = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "race:data").InnerText; - UnitRequiresAtLeastNUnitsRequirement req = reqFactory.CreateRequirement(type, data); + UnitRequiresAtLeastNUnitsRequirement req = reqFactory.CreateRequirement(type, data, this); type.AddRequirement(req); } } diff -r e50682387d63 -r c3b0b28bad48 IBBoard.WarFoundry.API.csproj --- a/IBBoard.WarFoundry.API.csproj Sat Jul 02 19:58:28 2011 +0000 +++ b/IBBoard.WarFoundry.API.csproj Mon Jul 04 20:02:26 2011 +0000 @@ -181,6 +181,7 @@ +