public static HashMap<TowerType, TowerData> loadTowerStats(String xmlFilePath) {
		HashMap<TowerType, TowerData> statsMap = new HashMap<>();
		NodeList types = getElements(xmlFilePath, "type");	
		for(int i = 0; i < types.getLength(); i++){
			Element towerType = (Element) types.item(i);
			RangedAttack attack = (RangedAttack)createAttack(towerType);
			Buff behaviourBuff = null;
			if(towerType.getElementsByTagName("buff").getLength() > 0){
				Element buffElement = (Element) towerType.getElementsByTagName("buff").item(0);
				if(buffElement.getParentNode() == towerType){
					behaviourBuff = new BuffFactory().createBuff(buffElement);
				}
			}
			double specialRange = 0;
			if(towerType.hasAttribute("specialRangeLink")){
				String xpath = towerType.getAttribute("specialRangeLink");
				try {
					XPath xpathObject =  XPathFactory.newInstance().newXPath();
					specialRange = Double.parseDouble((String)xpathObject.evaluate(xpath, towerType, XPathConstants.STRING));	
				} catch (XPathExpressionException e) {
					e.printStackTrace();
					System.exit(0);
				}
			}
			TowerType towerTypeID = TowerType.valueOf(towerType.getAttribute("id"));
			String tooltip = createTooltip(towerType);
			TowerData stats = new TowerData(
					towerType.getAttribute("name"),
					tooltip,
					Integer.parseInt(towerType.getAttribute("maxHealth")),
					Integer.parseInt(towerType.getAttribute("buildCost")),
					Integer.parseInt(towerType.getAttribute("unlockCost")),
					ResourceLoader.createTileScaledAnimation(false,towerType.getAttribute("sprite")),
					ResourceLoader.createImage(towerType.getAttribute("icon")),
					attack, 
					behaviourBuff,
					specialRange
			);
			statsMap.put(towerTypeID, stats);
		}
		return statsMap;
	}