<xsl:stylesheet version="1.0" xmlns="http://ce.org/cea-2018" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" cdata-section-elements="dc:description" />

<xsl:template match="/">
<xsl:element name="taskModel">
	<xsl:attribute name="about">urn:cetask.wpi.edu:projects:<xsl:value-of select="game/@name"/></xsl:attribute>

	<xsl:comment>Overall game goal</xsl:comment>
	<xsl:element name="task">
		<xsl:attribute name="id">Game</xsl:attribute>
	</xsl:element>
	
	<xsl:comment>Game structure</xsl:comment>
	<xsl:element name="subtasks">
		<xsl:attribute name="id">GameTasks</xsl:attribute>
		<xsl:attribute name="goal">Game</xsl:attribute>
		<xsl:attribute name="ordered">true</xsl:attribute>
		<xsl:for-each select="game/room">
			<xsl:element name="step">
				<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
				<xsl:attribute name="task"><xsl:value-of select="@name"/></xsl:attribute>
			</xsl:element>
		</xsl:for-each>
	</xsl:element>

	<xsl:comment>Rooms</xsl:comment>
	<xsl:for-each select="game/room">
		<xsl:element name="task">
			<xsl:attribute name="id"><xsl:value-of select="@name" /></xsl:attribute>
		</xsl:element>
	</xsl:for-each>
	
	<xsl:for-each select="game/room">
		<xsl:comment>Puzzles in <xsl:value-of select="@name"/></xsl:comment>
		<xsl:element name="subtasks">
			<xsl:attribute name="id"><xsl:value-of select="@name"/>Tasks</xsl:attribute>
			<xsl:attribute name="goal"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="ordered">true</xsl:attribute>
			
			<xsl:for-each select="puzzle">
				<xsl:element name="step">
					<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
					<xsl:attribute name="task"><xsl:value-of select="@name"/></xsl:attribute>
				</xsl:element>
				<xsl:element name="step">
					<xsl:attribute name="name">ResetHints<xsl:value-of select="@name"/></xsl:attribute>
					<xsl:attribute name="task">ResetHints</xsl:attribute>
				</xsl:element>
			</xsl:for-each>
			
		</xsl:element>
	</xsl:for-each>
	
	<xsl:comment>All puzzles</xsl:comment>
	<xsl:for-each select="game/room/puzzle">
		<xsl:element name="task">
			<xsl:attribute name="id"><xsl:value-of select="@name"/></xsl:attribute>
			
			<xsl:element name="postcondition">
				<xsl:value-of select="postcondition"/>
			</xsl:element>
		</xsl:element>
		
		<!-- User-does-it puzzle path -->
		<xsl:element name="subtasks">
			<xsl:attribute name="id">UserDoes<xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="goal"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="ordered">false</xsl:attribute>
			
			<xsl:for-each select="hint">
				<xsl:element name="step">
					<xsl:attribute name="name"><xsl:value-of select="../@name"/>Hint<xsl:value-of select="position()"/></xsl:attribute>
					<xsl:attribute name="task"><xsl:value-of select="../@name"/>Hint<xsl:value-of select="position()"/></xsl:attribute>
				</xsl:element>
			</xsl:for-each>
			
			<xsl:element name="step">
				<xsl:attribute name="name"><xsl:value-of select="@name"/>HintDie</xsl:attribute>
				<xsl:attribute name="task"><xsl:value-of select="@name"/>HintDie</xsl:attribute>
			</xsl:element>
			<xsl:element name="step">
				<xsl:attribute name="name">User<xsl:value-of select="@name"/></xsl:attribute>
				<xsl:attribute name="task">User<xsl:value-of select="@name"/></xsl:attribute>
			</xsl:element>
		</xsl:element>
		
		<xsl:comment>Hints for <xsl:value-of select="@name"/></xsl:comment>
		<xsl:for-each select="hint">
			<xsl:element name="task">
				<xsl:attribute name="id"><xsl:value-of select="../@name"/>Hint<xsl:value-of select="position()"/></xsl:attribute>
				
				<xsl:element name="precondition">isHint(<xsl:value-of select="position()"/>)</xsl:element>
				<xsl:element name="script">printHint("<xsl:value-of select="."/>\n"); hintGiven();</xsl:element>
			</xsl:element>
		</xsl:for-each>
		
		<xsl:element name="task">
			<xsl:attribute name="id"><xsl:value-of select="@name"/>HintDie</xsl:attribute>
			
			<xsl:element name="precondition">isHint(<xsl:value-of select="count(hint)+1"/>)</xsl:element>
			<xsl:element name="script">$this.success = false;</xsl:element>
		</xsl:element>
		
		<xsl:element name="task">
			<xsl:attribute name="id">User<xsl:value-of select="@name"/></xsl:attribute>
			
			<xsl:element name="dc:title"><xsl:value-of select="description"/></xsl:element>
			<xsl:if test="count(./environment) &gt; 0">
				<xsl:element name="dc:description">
					<xsl:value-of select="environment" disable-output-escaping="yes"/>
				</xsl:element>
			</xsl:if>
			<xsl:element name="precondition">hintsGiven() == Packages.zep.HintSingleton.GetInstance().getNumHintsRequested()</xsl:element>
			<xsl:element name="postcondition"><xsl:value-of select="postcondition"/></xsl:element>
		</xsl:element>
		
		<!-- System-does-it puzzle path -->
		<xsl:element name="subtasks">
			<xsl:attribute name="id">SystemDoes<xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="goal"><xsl:value-of select="@name"/></xsl:attribute>
			<xsl:attribute name="ordered">false</xsl:attribute>
			
			<xsl:element name="step">
				<xsl:attribute name="name">System<xsl:value-of select="@name"/></xsl:attribute>
				<xsl:attribute name="task">System<xsl:value-of select="@name"/></xsl:attribute>
			</xsl:element>
			<xsl:element name="step">
				<xsl:attribute name="name">User<xsl:value-of select="@name"/>Again</xsl:attribute>
				<xsl:attribute name="task">User<xsl:value-of select="@name"/>Again</xsl:attribute>
			</xsl:element>
			<xsl:element name="applicable">Packages.zep.HintSingleton.GetInstance().getNumHintsRequested() &gt; <xsl:value-of select="count(hint)"/></xsl:element>
		</xsl:element>
		
		<xsl:element name="task">
			<xsl:attribute name="id">System<xsl:value-of select="@name"/></xsl:attribute>
			
			<xsl:element name="precondition">isHint(<xsl:value-of select="count(hint)+1"/>)</xsl:element>
			<xsl:element name="script">printHint("<xsl:value-of select="solution/text"/>"); setCmd("<xsl:value-of select="solution/script"/>");</xsl:element>
		</xsl:element>
		
		<xsl:element name="task">
			<xsl:attribute name="id">User<xsl:value-of select="@name"/>Again</xsl:attribute>
			
			<xsl:element name="dc:title"><xsl:value-of select="description"/></xsl:element>
			<xsl:if test="count(./environment) &gt; 0">
				<xsl:element name="dc:description">
					<xsl:value-of select="environment" disable-output-escaping="yes"/>
				</xsl:element>
			</xsl:if>
			<xsl:element name="precondition">hintsRequestedGT(<xsl:value-of select="count(hint)"/>) &amp;&amp; cmdIsSet();</xsl:element>
			<xsl:element name="postcondition"><xsl:value-of select="postcondition"/></xsl:element>
		</xsl:element>
	</xsl:for-each>
	
	<xsl:comment>Hint reset</xsl:comment>
	<xsl:element name="task">
		<xsl:attribute name="id">ResetHints</xsl:attribute>
		<xsl:element name="script">resetHints();</xsl:element>
	</xsl:element>
	
	<xsl:comment>Initialization script</xsl:comment>
	<xsl:element name="script">
		<xsl:attribute name="init">true</xsl:attribute>
		
		<xsl:value-of select="game/initScript"/>
		
		function hintsRequestedGT(num) {
	    	return Packages.zep.HintSingleton.GetInstance().getNumHintsRequested() &gt; num;
	    }
	    
	    function hintsGiven() {
	    	return Packages.zep.HintSingleton.GetInstance().getNumHintsGiven();
	    }
	    
	    function hintGiven() {
	    	Packages.zep.HintSingleton.GetInstance().hintGiven();
	    }
	    
	    function resetHints() {
	    	Packages.zep.HintSingleton.GetInstance().reset();
	    }
	    
	    function isHint(num) {
	    	return hintsRequestedGT(num - 1) &amp;&amp; hintsGiven() == num - 1;
	    }
	    
	    function printHint(text) {
	    	Packages.zep.HintSingleton.GetInstance().setHint(text);
	    }
	    
	    function setCmd(text) {
	    	Packages.zep.HintSingleton.GetInstance().setCommand(text);
	    }
	    
	    function cmdIsSet() {
	    	return Packages.zep.HintSingleton.GetInstance().getCommand() != null;
	    }
	</xsl:element>
</xsl:element>
</xsl:template>

</xsl:stylesheet>