mirror of
https://github.com/moparisthebest/xeps
synced 2024-11-24 18:22:24 -05:00
231 lines
7.9 KiB
XML
231 lines
7.9 KiB
XML
<?xml version='1.0' encoding='UTF-8'?>
|
|
<!DOCTYPE xep SYSTEM 'xep.dtd' [
|
|
<!ENTITY % ents SYSTEM 'xep.ent'>
|
|
%ents;
|
|
<!ENTITY FEATURE "<feature/>">
|
|
<!ENTITY NAME "<name/>">
|
|
<!ENTITY MOVE "<move/>">
|
|
<!ENTITY TURN "<turn/>">
|
|
<!ENTITY GAME "<game/>">
|
|
<!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 <<link url='http://pidgin-games.sourceforge.net/xep/instant-gaming.html'>http://pidgin-games.sourceforge.net/xep/instant-gaming.html</link>>.</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>
|
|
<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(ät)fsfe.de</email>
|
|
<jid>Torsten.Grote(ä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:
|
|
<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>
|
|
</p>
|
|
<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 ®ISTRAR; 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>
|