<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
  <!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
  <!ENTITY FEATURE "&lt;feature/&gt;">
  <!ENTITY NAME "&lt;name/&gt;">
  <!ENTITY MOVE "&lt;move/&gt;">
  <!ENTITY TURN "&lt;turn/&gt;">
  <!ENTITY GAME "&lt;game/&gt;">
  <!ENTITY xep-game "<span class='ref'><link url='http://pidgin-games.sourceforge.net/xep/instant-gaming.html'>Instant Gaming</link></span> <note>XEP-xxxx: Instant Gaming &lt;<link url='http://pidgin-games.sourceforge.net/xep/instant-gaming.html'>http://pidgin-games.sourceforge.net/xep/instant-gaming.html</link>&gt;.</note>" >
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep>
<header>
  <title>Tic-tac-toe</title>
  <abstract>This document defines how to play a Tic-tac-toe game over XMPP</abstract>
  &LEGALNOTICE;
  <number>xxxx</number>
  <status>ProtoXEP</status>
  <type>Standards Track</type>
  <sig>Standards</sig>
  <approver>Council</approver>
  <dependencies>
    <spec>XMPP Core</spec>
    <spec>XEP-xxxx</spec>
  </dependencies>
  <supersedes/>
  <supersededby/>
  <shortname>Not yet assigned</shortname>
  <author>
    <firstname>Torsten</firstname>
    <surname>Grote</surname>
    <email>Torsten.Grote(&#228;t)fsfe.de</email>
    <jid>Torsten.Grote(&#228;t)jabber.fsfe.org</jid>
  </author>
  <revision>
    <version>0.0.1</version>
    <date>2009-03-14</date>
    <initials>tg</initials>
    <remark>
      <p>First Draft.</p>
    </remark>
  </revision>
</header>
<section1 topic='Introduction' anchor='intro'>
  <p>
    It is quite common to play games over IM networks.
    Since Tic-tac-toe is a well known game, XMPP needs a protocol to support it.
  </p>
</section1>
<section1 topic='Requirements' anchor='reqs'>
  <p>
    This protocol should provide all means to play a regular game of Tic-tac-toe over XMPP.
  </p>
  <p>
	Tic-tac-toe is also one of the simplest games and played "just for fun".
	Therefore no validation support is needed.
	The typical duration is below one minute and the matches are not of great interest for non-players.
	Therefore spectators do not have to be supported as well.
	That is why this document only describes the protocol to play a Tic-tac-toe as a One-to-One match
	without support for game saving and resuming.
  </p>
</section1>
<section1 topic='Discovering Support' anchor='support'>
  <p>
    An entity implementing this protocol MUST also support &xep-game; and answer to disco requests accordingly
    including both the Instant Gaming and the game &FEATURE; elements in the response.
  </p>
    <example caption='Juliet Informs Romeo That She is Capable of Playing Tic-tac-toe'><![CDATA[
<iq type='result'
    from='juliet@capulet.com/garden'
    to='romeo@montague.net/balcony'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    ...
    <feature var='http://jabber.org/protocol/games'/>
    <feature var='http://jabber.org/protocol/games/tictactoe'/>
    ...
  </query>
</iq>]]></example>
</section1>

<section1 topic='Invitation' anchor='invite'>
  <p>
	When inviting to a game of Tic-tac-toe, an entity SHOULD use &xep0004; to specify game options in the REQUIRED &GAME; element.
	Possible options are "role" (of the inviting player), "rows" (height), "cols" (width) and "strike" (number of marks in a row needed to win).
	If these options are missing, all but role default to '3' and role defaults to 'x'.
	An implementation MUST be able to handle the default values.
	Everything beyond that is OPTIONAL.
  </p>
  <example caption='Romeo Invites Juliet'><![CDATA[
<message
    from='romeo@montague.net/garden'
    to='juliet@capulet.com/balcony'>
  <thread>juliet@capulet.com-romeo@montague.net-tictactoe-1591-02-23T11:36:25Z-4321</thread>
  <invite xmlns='http://jabber.org/protocol/games'
      transport='one-to-one'
      type='new'>
    <reason>
      Hello Juliet,
      would you like to play a little game?
    </reason>
    <game var='http://jabber.org/protocol/games/tictactoe'>
      <x xmlns='jabber:x:data' type='submit'>
        <field type='list-single' var='role'>
          <value>x</value>
        </field>
        <field type='text-single' var='rows'>
          <value>3</value>
        </field>
        <field type='text-single' var='cols'>
          <value>3</value>
        </field>
        <field type='text-single' var='strike'>
          <value>3</value>
        </field>
      </x>
    </game>
  </invite>
</message>]]></example>
	<p>
	  When sending an invitation of type "renew",
	  the role option MUST be changed to the opposite of the role the inviting player had in the previous match with that match ID.
	  So both players essentially switch their roles.
	  All other options MUST stay the same.
	</p>
</section1>

<section1 topic='Game Flow' anchor='flow'>
  <p>
    During the game, players change in turn, each of them sending one move at a time.
	The player with the role 'x' makes the first move.
	A game move is represented as a &MESSAGE; stanza addressed to the full JID of the other player.
	It MUST have a &THREAD; child element which specifies the match ID.
	Furthermore, the &MESSAGE; stanza contains a &TURN; element which in turn contains exactly one &MOVE; element
	qualified by 'http://jabber.org/protocol/games/tictactoe'.
    It MUST possess these attributes:
  </p>
  <table caption='&MOVE; attributes'>
    <tr>
      <td><strong>Name</strong></td>
      <td><strong>Type</strong></td>
      <td><strong>Description</strong></td>
    </tr>
    <tr>
      <td>'id'</td>
      <td>REQUIRED</td>
      <td>The number of the move. First move is 1.</td>
    </tr>
    <tr>
      <td>'row'</td>
      <td>REQUIRED</td>
      <td>The horizontal position of the mark.</td>
    </tr>
    <tr>
      <td>'col'</td>
      <td>REQUIRED</td>
      <td>The vertical position of the mark.</td>
    </tr>
  </table>
  <example caption='Part of the Match Between Romeo and Juliet'><![CDATA[
<message
    from='romeo@montague.net/room'
    to='juliet@capulet.com/room'
    type='chat'>
  <thread>juliet@capulet.com-romeo@montague.net-tictactoe-1591-02-23T11:36:25Z-4321</thread>
  <turn xmlns='http://jabber.org/protocol/games'>
    <move xmlns='http://jabber.org/protocol/games/tictactoe'
        row='2'
        col='2'
        id='1'/>
  </turn>
</message>

<message
    from='juliet@capulet.com/room'
    to='romeo@montague.net/room'
    type='chat'>
  <thread>juliet@capulet.com-romeo@montague.net-tictactoe-1591-02-23T11:36:25Z-4321</thread>
  <turn xmlns='http://jabber.org/protocol/games'>
    <move xmlns='http://jabber.org/protocol/games/tictactoe'
        row='2'
        col='3'
        id='2'/>
  </turn>
</message>]]></example>
</section1>

<section1 topic='Game Termination' anchor='term'>
  <p>
    Notifying the players whether they have won or lost is in responsibility of the game client.
	The game is considered terminated when the board is full, i.e. nine moves have been made.
	For further termination conditions see the appropriate section of &xep-game;.
  </p>
</section1>

<section1 topic='Security Considerations' anchor='security'>
  <p>
	The author is not aware of any security issues introduced by this protocol extension.
  </p>
</section1>

<section1 topic='IANA Considerations' anchor='iana'>
  <p>This document requires no interaction with &IANA;.</p>
</section1>

<section1 topic='XMPP Registrar Considerations' anchor='registrar'>
  <p>The &REGISTRAR; shall include 'http://jabber.org/protocol/games/tictactoe' in its registry of protocols.</p>
</section1>

<section1 topic='XML Schema' anchor='schema'>
  <code><![CDATA[
<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='http://jabber.org/protocol/games/tictactoe'
    xmlns='http://jabber.org/protocol/games/tictactoe'
    elementFormDefault='qualified'>

<xs:element name='move'>
  <xs:complexType>
    <xs:attribute name='col' type='positiveInteger'/>
    <xs:attribute name='row' type='positiveInteger'/>
    <xs:attribute name='id' type='positiveInteger'/>
  </xs:complexType>
</xs:element>

</xs:schema>
  ]]></code>
</section1>
</xep>
