Protocole de discussion entre le serveur et un client.

Définitions

Remarques

Note sur les termes qui vont suivre: Un message est une série de N*sizeof(type) octets envoyés

  • du serveur vers le client: on note cela S->C(N*type)

  • du client vers le serveur: on note cela C->S(N*type)

Ordre des cartes

Table 1. Ordre des cartes

001 de trefle
012 de trefle
13roi de trefle
141 de pique
152 de pique
27roi de pique
281 de coeur
421 de carreau
56atout 1
57atout 2
76atout 21
77excuse

Enchères

Table 2. Enchères

0Passe
1Petite
2Garde
3Garde sans chien
4Garde contre le chien

Identification du client et du serveur

Table 3. Identification du client et du serveur

Data TypeName/Branch pointComment
C->S(2*gint)LIBMT_NET_DATA_TYPE_GET_ID / N/ALe premier gint est l'identifiant du serveur et le second celui de la version. Si L'identifiant du client n'est pas correct, le premier gint contient -1 et le client est déconnecté.
S->C(2*gint)LIBMT_NET_DATA_TYPE_SEND_ID / N/ALe premier gint est l'identifiant du serveur et le second celui de la version. Si L'identifiant du client n'est pas correct, le premier gint contient -1 et le client est déconnecté.
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_PROTOCOL / N/Aversion du protocole. 1 : version 0.1
C->S(1*gint)LIBMT_NET_DATA_TYPE_GET_PROTOCOL / N/A1 si le client peut utiliser ce protocole, sinon 0 et déconnection.
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_PLACE / N/ALa place occupé par le joueur.
C->S(1*gint)LIBMT_NET_DATA_TYPE_GET_NICK_LEN / N/ALongueur du nickname. Si 0 le serveur utilise le nom par défaut suivant la place du client et l'étape suivante (envoie du nickname) est passée.
C->S(long_nick*gchar)LIBMT_NET_DATA_TYPE_GET_NICK / N/Ale nickname du joueur.

Remarque: La séquence suivante peut être envoyée à tout moment sur le canal 1 par le serveur au client pour réinitialiser les noms des joueurs. Elle est cependent envoyée ici, une seule fois, sur le canal 0.

Table 4. Identification des noms des clients

Data TypeName/Branch pointComment
S->C(4*gint)LIBMT_NET_DATA_TYPE_SEND_NICK_LEN / N/Alongueur de chaque nickname.
S->C(gchar*(long_nick1 + long_nick2 + long_nick3 + long_nick4))LIBMT_NET_DATA_TYPE_SEND_NICKS / N/Ales nickname de tous les joueurs.

Point de branchement

Point de branchement: LIBMT_NET_DATA_BP_NEW_GAME/0

Indique le point de branchement pour une nouvelle partie ou en cas de déconnexion d'un joueur.

Table 5. Point de branchement

Data TypeName/Branch pointComment
S->C(2*gint)LIBMT_NET_DATA_TYPE_BRANCHEMENT_POINT / LIBMT_NET_DATA_BP_NEW_GAMELe point de branchement (1*gint) et une valeur associée au point de branchement (1*gint)

La distribution des cartes

Point de branchement: LIBMT_NET_DATA_BP_DILL_CARDS/0

Table 6. La distribution des cartes

Data TypeName/Branch pointComment
S->C(18*gint)LIBMT_NET_DATA_TYPE_DILL_CARDS / LIBMT_NET_DATA_BP_DILL_CARDSce sont les 18 cartes.

Encheres

Point de branchement: LIBMT_NET_DATA_BP_SEND_BIDS/nombre de passages valides

La séquence suivante est répétée quatre fois:

Table 7. Encheres (séquence)

Data TypeName/Branch pointComment
S->C(4*gint)LIBMT_NET_DATA_TYPE_SEND_BIDS / LIBMT_NET_DATA_BP_SEND_BIDSchaque gint correspond à l'enchère du joueur dans l'ordre des places. Ils sont à -1 si le joueur n'a pas encore parlé. C'est au client de déterminer grace à ces enchères quelle est sa position.
S->C(1*gint)LIBMT_NET_DATA_TYPE_ASK_BID_QUESTION / LIBMT_NET_DATA_BP_SEND_BIDSSi le gint est non nul, le client doit faire une enchère. S'il est est null, on ignore l'étape suivante.
C->S(1*gint)LIBMT_NET_DATA_TYPE_GET_BID / LIBMT_NET_DATA_BP_SEND_BIDSUniquement si le gint précédent était non nul. Mise du client. Si la valeur est erronée, le serveur considère que le client passe.

Fin de la sequence

Table 8. Encheres (fin de la séquence)

Data TypeName/Branch pointComment
S->C(4*gint)LIBMT_NET_DATA_TYPE_SEND_FINAL_BIDS / LIBMT_NET_DATA_BP_GET_CHIENresultat final des enchères. C'est au client de savoir si quelqu'un a pris et qui. Si personne n'a pris, les 4 gint sont à 0, et c'est au client de savoir qu'on va voir le chien puis recommencer la partie.
S->C(6*gint)LIBMT_NET_DATA_TYPE_SHOW_CHIEN / LIBMT_NET_DATA_BP_GET_CHIENLes 6 cartes du chien si l'enchere n'est ni garde sans chien, ni garde contre.

Défausse pour le preneur

Point de branchement: LIBMT_NET_DATA_BP_GET_CHIEN/0

Si la partie continue (si une personne au moins n'a pas passe), et pour le preneur seulement, si l'enchere est petite ou garde :

Table 9. Défausse pour le preneur

Data TypeName/Branch pointComment
C->S(6*gint)LIBMT_NET_DATA_TYPE_GET_CHIEN / LIBMT_NET_DATA_BP_GET_CHIENLes 6 cartes defaussées dans le jeu du preneur. Le serveur vérifie que ces cartes sont bien présente dans le jeu du preneur.
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_ACK_FOR_CHIEN / LIBMT_NET_DATA_BP_GET_CHIEN1 si la defausse est correcte, 0 sinon. si la défausse n'est pas correcte, on retourne à l'étape précédente.

Avant le début de la partie

Point de branchement: LIBMT_NET_DATA_BP_READY_TO_PLAY/0

Avant le début de la partie, on envoie si nécessaire les annonces au serveur. Chaque annonce est optionnelle. L'annonce LIBMT_NET_DATA_TYPE_READY_TO_PLAY est la seule obligatoire, et elle doit être la dernière à être envoyée.

Table 10. Annonces

Data TypeName/Branch pointComment
S->C(0*gint)LIBMT_NET_DATA_TYPE_READY_TO_PLAY / LIBMT_NET_DATA_BP_READY_TO_PLAYIndique au serveur qu'on est prêt à jouer

Partie

Point de branchement: LIBMT_NET_DATA_BP_SEND_TURN_CARD/Nombre de passages validés

Pour chaque pli, on effectue quatre fois la séquence suivante:

  • Donne des cartes du pli courant et du pli précédent (Table 11)

  • Demande si on doit jouer une carte. (Table 12)

    • Si oui, on joue une carte (Table 13)

    • Si non, on ne fait rien

Table 11. Donne des cartes du pli courant et du pli précédent

Data TypeName/Branch pointComment
S->C(8*gint)LIBMT_NET_DATA_TYPE_SEND_TURN_CARDS / LIBMT_NET_DATA_BP_SEND_TURN_CARDLes 4 premiers gint sont les cartes jouées par les joueurs précédents. Les 4 suivants sont les cartes du pli précédent. -1 correspond a un joueur qui n'a pas encore joué. Les cartes sont dans l'ordre des joueurs. REMARQUE: au premier pli, les 4 gint de fin sont à -1.

Table 12. Doit-on jouer une carte ?

Data TypeName/Branch pointComment
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_TURN_CARDS_QUESTION / LIBMT_NET_DATA_BP_SEND_TURN_CARDSi le gint est non nul, cela signifie que le serveur attend que le client joue une carte

Table 13. Jeu d'une carte si le précédent gint était non nul.

Data TypeName/Branch pointComment
C->S(1*gint)LIBMT_NET_DATA_TYPE_GET_TURN_CARD / LIBMT_NET_DATA_BP_SEND_TURN_CARDla carte jouée si le précédent gint était non nul.
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_ACK_FOR_CARD / LIBMT_NET_DATA_BP_SEND_TURN_CARD1 si la carte est correcte, 0 sinon. si la carte n'est pas correcte, on retourne à l'étape précédente.

Fin de partie

Table 14. Fin de partie

Data TypeName/Branch pointComment
S->C(4*gint)LIBMT_NET_DATA_TYPE_SEND_LAST_TURN_CARDS / LIBMT_NET_DATA_BP_NEW_GAMELes 4 cartes du dernier pli.

Fin de partie/Nouvelle partie

Remarque: si la partie n'a pas eu lieu parce que tout le monde a passé, ou pour toute autre raison (le petit sec par exemple), on reprend le protocole à partir d'ici.

Table 15. Fin de partie

Data TypeName/Branch pointComment
S->C(8*gint)LIBMT_NET_DATA_TYPE_SEND_SCORE / LIBMT_NET_DATA_BP_NEW_GAMEVoir ci-dessous
S->C(6*gint)LIBMT_NET_DATA_TYPE_SHOW_CHIEN_AT_END / LIBMT_NET_DATA_BP_NEW_GAMELes 6 cartes du chien.
C->S(1*gint)LIBMT_NET_DATA_TYPE_ACK_REPLAY / LIBMT_NET_DATA_BP_NEW_GAME0 pour arreter, 1 pour rejouer
S->C(1*gint)LIBMT_NET_DATA_TYPE_SEND_REPLAY_ANSWER / LIBMT_NET_DATA_BP_NEW_GAMESi tous les joueurs ont repondu 1, on envoie 1. Et on rejoue une nouvelle partie. Si un joueur a repondu 0 ou s'est déconnecté, alors on envoie 0.

Note: voici le détail des 8*gint du score:

  • 1*gint: contrat (LIBMT_BID_* défini dans maitretarot.h)

  • 1*gint: Le preneur a gagné? O/N (O=1, N=0)

  • 1*gint: Score de la partie (nombre de points du preneur)

  • 1*gint: Nombre d'oudlers du preneur

  • 4*gint: Score total (score de la partie ajouté aux scores précédents, pour chaque joueur)

Si la partie n'a pas été jouée, voici le détail de ces mêmes 8*gint du score:

  • 1*gint: LIBMT_BID_PASSE (défini dans maitretarot.h)

  • 1*gint: non défini

  • 1*gint: non défini

  • 1*gint: non défini

  • 4*gint: Score total (scores précédents, pour chaque joueur)

Réinitialisation d'un client

Cette séquence peut être initiée par un client à tout moment. Elle n'interromp pas le cours des évènements.

Table 16. Réinitialisation d'un client

Data TypeNameComment
C->S(0*gint)LIBMT_NET_DATA_TYPE_ASK_FULL_REINITIALIZATIONLe client demande au serveur de se réinitialiser
S->C(?*gint)LIBMT_NET_DATA_TYPE_SEND_FULL_REINITIALIZATIONLes données de la réinitialisation (à définir)