diff API/Factories/Xml/WarFoundryXmlGameSystemFactory.cs @ 337:3c4a6403a88c

* Fix capitalisation so that new files are in the namespace no-open-ticket
author IBBoard <dev@ibboard.co.uk>
date Sun, 03 Apr 2011 18:50:32 +0000
parents
children e50682387d63
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/API/Factories/Xml/WarFoundryXmlGameSystemFactory.cs	Sun Apr 03 18:50:32 2011 +0000
@@ -0,0 +1,102 @@
+//  This file (WarFoundryXmlGameSystemFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 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 System.Collections.Generic;
+using System.IO;
+using System.Xml;
+using ICSharpCode.SharpZipLib.Zip;
+using IBBoard.Xml;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Factories.Xml
+{
+	/// <summary>
+	/// A sub-factory specifically for loading GameSystems from WarFoundry XML files
+	/// </summary>
+	public class WarFoundryXmlGameSystemFactory : AbstractStagedLoadedSubFactory
+	{	
+		private Dictionary<GameSystem, XmlDocument> extraData = new Dictionary<GameSystem, XmlDocument>();
+		
+		public WarFoundryXmlGameSystemFactory(WarFoundryXmlFactory factory) : base(factory)
+		{
+		}
+		
+		private void StoreExtraData(GameSystem wfObject, XmlElement elem)
+		{
+			extraData[wfObject] = elem.OwnerDocument;
+		}
+	
+		private XmlDocument GetExtraData(GameSystem obj)
+		{
+			XmlDocument extra = null;
+			extraData.TryGetValue(obj, out extra);			
+			return extra;
+		}
+		
+		public GameSystem CreateSystemFromElement(ZipFile file, XmlElement elem)
+		{
+			string id = elem.GetAttribute("id");
+			string name = elem.GetAttribute("name");
+			GameSystem system = new GameSystem(id, name, mainFactory);
+            system.SystemArmyDefaultSize =  XmlTools.GetIntValueFromAttribute (elem, "defaultArmySize");
+            system.SystemPtsAbbrevSingle = elem.GetAttribute ("defaultPtsAbbreviationSingular");
+            system.SystemPtsAbbrevPlural = elem.GetAttribute ("defaultPtsAbbreviationPlural");
+            system.SystemPtsNameSingle = elem.GetAttribute ("defaultPtsNameSingular");
+            system.SystemPtsNamePlural = elem.GetAttribute ("defaultPtsNamePlural");
+			StoreExtraData(system, elem);
+			return system;
+		}		
+		
+		public void CompleteLoading(GameSystem system)
+		{
+			if (!WarFoundryXmlFactoryUtils.CanCompleteLoading(system))
+			{
+				return;
+			}
+			
+			system.SetAsLoading();			
+			XmlDocument extraData = GetExtraData(system);
+			LoadCategoriesForSystem(system, extraData);
+			XmlElement statsElem = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "/system:system/system:sysStatsList");
+			string defaultStatsID = statsElem.GetAttribute("defaultStats");
+			LoadSystemStatsForSystem(system, extraData);
+			system.StandardSystemStatsID = defaultStatsID;
+			XmlElement systemElement = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "/system:system");
+			system.WarnOnError = XmlTools.GetBoolValueFromAttribute(systemElement, "warn");
+			system.AllowAllies = XmlTools.GetBoolValueFromAttribute(systemElement, "allowAllies");
+			system.SetAsFullyLoaded();
+		}
+
+		
+		private void LoadCategoriesForSystem(GameSystem system, XmlNode elem)
+		{
+			foreach (XmlElement cat in WarFoundryXmlFactoryUtils.SelectNodes(elem, "/system:system/system:categories/cat:cat"))
+			{
+				system.AddCategory(CreateCategoryFromElement(cat));
+			}
+		}	
+		
+		private void LoadSystemStatsForSystem(GameSystem system, XmlNode elem)
+		{
+			foreach (XmlElement stats in WarFoundryXmlFactoryUtils.SelectNodes(elem, "/system:system/system:sysStatsList/system:sysStats"))
+			{
+				SystemStats sysStats = CreateSystemStatsFromElement(stats);
+				system.AddSystemStats(sysStats);
+			}
+		}
+		
+		private SystemStats CreateSystemStatsFromElement(XmlElement elem)
+		{
+			SystemStats sysStats = new SystemStats(elem.GetAttribute("id"));
+			
+			foreach (XmlElement slot in WarFoundryXmlFactoryUtils.SelectNodes(elem, "system:sysStat"))
+			{
+				sysStats.AddStatSlot(slot.GetAttribute("name"));
+			}
+
+			return sysStats;
+		}	
+	}
+}
\ No newline at end of file