view api/Factories/Xml/WarFoundryXmlGameSystemFactory.cs @ 53:1b35eed503ef

Closes #13 - Migrate to XPath * Remove elem.ChildNodes calls and use XPath to make sure we're getting the nodes we think we should
author IBBoard <dev@ibboard.co.uk>
date Wed, 01 Apr 2009 19:20:27 +0000
parents 64ef178c18aa
children e6200220ece3
line wrap: on
line source

//  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 under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
// 

using System;
using System.Collections.Generic;
using System.Xml;
using ICSharpCode.SharpZipLib.Zip;
using IBBoard.Logging;
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);
			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");
			LogNotifier.DebugFormat(GetType(), "Completed loading of GameSystem with ID {0}", system.ID);
			LogNotifier.DebugFormat(GetType(), "GameSystem with ID {0} default stats: {1}", system.ID, system.StandardSystemStatsID);
			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)
		{
			List<StatSlot> slots = new List<StatSlot>();
			string id = elem.GetAttribute("id");	
			
			foreach (XmlElement slot in WarFoundryXmlFactoryUtils.SelectNodes(elem, "system:sysStat"))
			{
				StatSlot statSlot = new StatSlot(slot.GetAttribute("name"));
				slots.Add(statSlot);
			}
			
			return new SystemStats(id, slots.ToArray());
		}	}
}