<?xml version="1.0" encoding="utf-8"?>
<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0">
	<start>
		<element name="map">
			<optional>
				<element name="minreinforcement">
					<data type="unsignedShort"/>
				</element>
			</optional>
			<optional>
				<ref name="reinforcements"/>
			</optional>
			<optional>
				<ref name="positions"/>
			</optional>
			<zeroOrMore>
				<ref name="requirement"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="objective"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="continent"/>
			</zeroOrMore>
			<oneOrMore>
				<ref name="territory"/>
			</oneOrMore>
		</element>
	</start>
	
	<define name="reinforcements">
		<element name="reinforcements">	
			<oneOrMore>
				<element name="reinforcement">
					<element name="lower">
						<data type="unsignedShort"/>
					</element>
					<element name="upper">
						<data type="unsignedShort"/>
					</element>
					<element name="divisor">
						<data type="unsignedShort"/>
					</element>
				</element>
			</oneOrMore>
		</element>
	</define>
	
	<define name="positions">
		<element name="positions">
			<optional>
				<attribute name="max">
					<data type="unsignedShort"/>
				</attribute>
			</optional>
			<oneOrMore>
				<element name="position">
					<oneOrMore>
						<element name="territory">
							<optional>
								<attribute name="start">
									<data type="unsignedShort"/>
								</attribute>
							</optional>
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
					</oneOrMore>
				</element>
			</oneOrMore>
		</element>
	</define>
	
	<define name="requirement">
		<element name="requirement">
			<element name="name">
				<data type="normalizedString">
					<param name="minLength">1</param>
				</data>
			</element>
			<element name="components">
				<oneOrMore>
					<choice>
						<element name="territory">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
						<element name="continent">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
					</choice>
				</oneOrMore>
			</element>
			<optional>
				<element name="required">
					<data type="unsignedShort"/>
				</element>
			</optional>
		</element>
	</define>
	
	<define name="objective">
		<element name="objective">
			<element name="name">
				<data type="normalizedString">
					<param name="minLength">1</param>
				</data>
			</element>
			<element name="components">
				<oneOrMore>
					<choice>
						<element name="territory">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
						<element name="continent">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
					</choice>
				</oneOrMore>
			</element>
			<optional>
				<element name="required">
					<data type="unsignedShort"/>
				</element>
			</optional>
		</element>
	</define>
	
	<define name="continent">
		<element name="continent">
			<element name="name">
				<data type="normalizedString">
					<param name="minLength">1</param>
				</data>
			</element>
			<choice>
				<element name="bonus">
					<data type="short"/>
				</element>
				<element name="bonuses">
					<oneOrMore>
						<element name="bonus">
							<optional>
								<attribute name="required">
									<data type="short"/>
								</attribute>
							</optional>
							<data type="short"/>
						</element>
					</oneOrMore>
				</element>
			</choice>
			<element name="components">
				<oneOrMore>
					<choice>
						<element name="territory">
							<optional>
								<attribute name="type">
									<choice>
										<value>blocker</value>
										<value>mandatory</value>
									</choice>
								</attribute>
							</optional>
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
						<element name="territory">
							<attribute name="type">
								<value>multiplier</value>
							</attribute>
							<attribute name="factor">
								<data type="decimal"/>
							</attribute>
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
						<element name="continent">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</element>
					</choice>
				</oneOrMore>
			</element>
			<optional>
				<element name="required">
					<data type="unsignedShort"/>
				</element>
			</optional>
			<optional>
				<ref name="overrides"/>
			</optional>
		</element>
	</define>
	
	<define name="overrides">
		<element name="overrides">
			<oneOrMore>
				<element name="override">
					<data type="normalizedString">
						<param name="minLength">1</param>
					</data>
				</element>
			</oneOrMore>
		</element>
	</define>
	
	<define name="territory">
		<element name="territory">
			<element name="name">
				<data type="normalizedString">
					<param name="minLength">1</param>
				</data>
			</element>
			<ref name="borders"/>
			<optional>
				<ref name="bombardments"/>
			</optional>
			<element name="coordinates">
				<element name="smallx">
					<data type="unsignedShort"/>
				</element>
				<element name="smally">
					<data type="unsignedShort"/>
				</element>
				<element name="largex">
					<data type="unsignedShort"/>
				</element>
				<element name="largey">
					<data type="unsignedShort"/>
				</element>
			</element>
			<optional>
				<element name="neutral">
					<optional>
						<attribute name="killer">
							<choice>
								<value>yes</value>
								<value>no</value>
							</choice>
						</attribute>
					</optional>
					<data type="unsignedShort"/>
				</element>
			</optional>
			<optional>
				<element name="bonus">
					<data type="short"/>
				</element>
			</optional>
		</element>
	</define>
	
	<define name="borders">
		<element name="borders">
			<zeroOrMore>
				<element name="border">
					<optional>
						<attribute name="condition">
							<data type="normalizedString">
								<param name="minLength">1</param>
							</data>
						</attribute>
					</optional>
					<data type="normalizedString">
						<param name="minLength">1</param>
					</data>
				</element>
			</zeroOrMore>
		</element>
	</define>
	
	<define name="bombardments">
		<element name="bombardments">
			<oneOrMore>
				<element name="bombardment">
					<data type="normalizedString">
						<param name="minLength">1</param>
					</data>
				</element>
			</oneOrMore>
		</element>
	</define>

</grammar>