home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume14 / okbridge2 / part07 / protocol.h < prev   
Text File  |  1993-01-27  |  18KB  |  505 lines

  1. /* command.h -- Data structures and procedures used for communicating
  2.  *              between the client and server.
  3.  *
  4.  ! Copyright (C) 1990-1992 by Matthew Clegg.  All Rights Reserved
  5.  ! 
  6.  ! OKbridge is made available as a free service to the Internet.
  7.  ! Accordingly, the following restrictions are placed on its use:
  8.  ! 
  9.  ! 1.  OKbridge may not be modified in any way without the explicit 
  10.  !     permission of Matthew Clegg.  
  11.  ! 
  12.  ! 2.  OKbridge may not be used in any way for commercial advantage.
  13.  !     It may not be placed on for-profit networks or on for-profit
  14.  !     computer systems.  It may not be bundled as part of a package
  15.  !     or service provided by a for-profit organization.
  16.  ! 
  17.  ! If you have questions about restrictions on the use of OKbridge,
  18.  ! write to mclegg@cs.ucsd.edu.
  19.  ! 
  20.  ! DISCLAIMER:  The user of OKbridge accepts full responsibility for any
  21.  ! damage which may be caused by OKbridge.
  22.  *
  23.  * This module defines the data structures and procedures used for
  24.  * communicating with between the client and server.  When a command
  25.  * is received from a remote machine, this module unpacks it into
  26.  * a data structure representing the command.  When we wish to send
  27.  * a command to a remote machine, we invoke a procedure which is
  28.  * tailored for that command. 
  29.  */
  30.  
  31. #define PROTOCOL_INCLUDED
  32.  
  33. enum
  34. {
  35.   CMD_ERROR = 0,
  36.   CMD_ACK,
  37.   CMD_ALERT,
  38.   CMD_BEGIN,
  39.   CMD_BID,
  40.   CMD_BOARD,
  41.   CMD_CC,
  42.   CMD_CLAIM,
  43.   CMD_CLAIMREQ,
  44.   CMD_CLAIMRESP,
  45.   CMD_COMMENT,
  46.   CMD_CONNERR,
  47.   CMD_DEAL,
  48.   CMD_ECHO,
  49.   CMD_EMAIL,
  50.   CMD_END,
  51.   CMD_FULLNAME,
  52.   CMD_HELLO,
  53.   CMD_MODE,
  54.   CMD_NAME,
  55.   CMD_PING,
  56.   CMD_PLAY,
  57.   CMD_PLAYREQ,
  58.   CMD_QUIT,
  59.   CMD_RECONNECT,
  60.   CMD_RECORD,
  61.   CMD_REGISTRY,
  62.   CMD_RESET,
  63.   CMD_SCORE,
  64.   CMD_SEAT,
  65.   CMD_SEATERR,
  66.   CMD_SEATPOS,
  67.   CMD_SEATREQ,
  68.   CMD_SERVEREQ,
  69.   CMD_SKIP,
  70.   CMD_SKIPACK,
  71.   CMD_SPEC,
  72.   CMD_TABLE,
  73.   CMD_TABLEREQ,
  74.   CMD_TALK,
  75.   CMD_USEREC,
  76.   CMD_WAKEUP,
  77.   CMD_WHO,
  78.   CMD_WHOIS,
  79.   CMD_WHORESP,
  80.  
  81.   CMD_MAX
  82. };
  83.  
  84. #define TALK_RCPT_LHO  0
  85. #define TALK_RCPT_RHO  1
  86. #define TALK_RCPT_OPPS 2
  87. #define TALK_RCPT_SPEC 3
  88. #define TALK_RCPT_ALL  4
  89.  
  90. #define DUMMY  int
  91.  
  92. typedef struct Connection_struct *Conn;
  93. typedef struct Board_struct *board_ptr;
  94. typedef struct Play_record_struct *play_ptr;
  95. typedef struct Table_struct *Table_ptr;
  96.  
  97. typedef struct player_command_struct {
  98.   int command;
  99.   int player_no;
  100.   name_buffer    player_name;
  101.   command_buffer command_text;
  102.   union {
  103.     struct { message_buffer message;    }  error;
  104.     struct { name_buffer   player_name;
  105.          int           position; }     ack;
  106.     int                                    alert;
  107.     DUMMY                                  begin;
  108.     struct { int level, alert; }           bid;
  109.     struct { name_buffer   board_name;
  110.          int           board_no; 
  111.          board_ptr     record; }       board;
  112.     message_buffer                         cc;
  113.     struct { int no_tricks; }              claim;
  114.     struct { int no_tricks; }              claimreq;
  115.     int                                    claimresp;
  116.     message_buffer                         comment;
  117.     message_buffer                         connerr;
  118.     DUMMY                                  deal;
  119.     struct { name_buffer ping_source; }    echo;
  120.     struct { message_buffer addr; }        email;
  121.     DUMMY                                  end;
  122.     struct { message_buffer  name; }       fullname;
  123.     struct { name_buffer  version;
  124.          name_buffer  player_name; 
  125.          int          seat_req; }      hello;
  126.     int                                    mode;
  127.     struct { name_buffer  new_name; }      name;
  128.     DUMMY                                  ping;
  129.     int                                    play;
  130.     struct { int  card;
  131.              int  play_no; }               playreq;
  132.     DUMMY                                  quit;
  133.     struct {name_buffer ip;
  134.             int         port;
  135.             int         seat; }            reconnect;
  136.     struct { name_buffer board_name;
  137.          int         board_no;
  138.          play_ptr    play; }           record;
  139.     struct { message_buffer id; }          registry;
  140.     DUMMY                                  reset;
  141.     struct { int above[2];
  142.          int below[2]; }               score;
  143.     struct { name_buffer player_name;
  144.              int         old_pos; 
  145.              int         new_pos; }        seat;
  146.     struct { int free_seats[3]; }          seaterr;
  147.     int                                    seatpos;
  148.     int                                    seatreq;
  149.     struct { message_buffer command; }     servereq;
  150.     DUMMY                                  skip;
  151.     DUMMY                                  skipack;
  152.     DUMMY                                  spec;
  153.     int                                    table;
  154.     int                                    tablereq;
  155.     struct { int recipients;
  156.              message_buffer  message; }    talk;
  157.     struct { name_buffer north;
  158.          name_buffer east;
  159.          name_buffer south;
  160.          name_buffer west; }           userec;
  161.     struct { name_buffer recipient; }      wakeup;
  162.     DUMMY                                  who;
  163.     struct { name_buffer name; }           whois;
  164.     struct { name_buffer recipient;
  165.          message_buffer message; }     whoresp;
  166.   } data;
  167. } *player_command;
  168.  
  169.  
  170. /* The following routines define the interface for sending messages
  171.  * to remote processes. */
  172.  
  173. void Send_ack ();
  174. void Send_alert ();
  175. void Send_begin ();
  176. void Send_bid ();
  177. void Send_board ();
  178. void Send_cc ();
  179. void Send_claim ();
  180. void Send_claimreq ();
  181. void Send_claimresp ();
  182. void Send_comment ();
  183. void Send_deal ();
  184. void Send_echo ();
  185. void Send_email ();
  186. void Send_end ();
  187. void Send_fullname ();
  188. void Send_hello ();
  189. void Send_mode ();
  190. void Send_name ();
  191. void Send_ping ();
  192. void Send_play ();
  193. void Send_playreq ();
  194. void Send_quit ();
  195. void Send_reconnect ();
  196. void Send_record ();
  197. void Send_registry ();
  198. void Send_reset ();
  199. void Send_seat  ();
  200. void Send_seaterr ();
  201. void Send_seatreq ();
  202. void Send_score ();
  203. void Send_servereq ();
  204. void Send_skip ();
  205. void Send_skipack ();
  206. void Send_spec ();
  207. void Send_tablereq ();
  208. void Send_table ();
  209. void Send_talk ();
  210. void Send_userec ();
  211. void Send_wakeup ();
  212. void Send_who ();
  213. void Send_whois ();
  214. void Send_whoresp ();
  215.  
  216. /* The following two procedures are for parsing messages which have 
  217.  * received from remote hosts.  The difference is that in the first
  218.  * procedure, we assume that the identifier of the sender is prefixed
  219.  * to the message.  Both procedures assume that the input buffer is
  220.  * stored in the player command record which is passed to the procedure.
  221.  * Both return 0 if no errors were encountered in parsing the message
  222.  * and -1 if an error was encountered.
  223.  */
  224.  
  225. int Parse_Command_for_Client ();
  226. int Parse_Command_for_Server ();
  227.  
  228.  
  229. /* DESCRIPTION OF PROTOCOL.
  230.  
  231. All messages transmitted by okbridge are ASCII strings terminated by
  232. the characters "\015\012" (^M^J).  Each message is interpreted and
  233. converted into a data structure with the help of the parser module.
  234. Each message has a header which identifies the origin of the message.
  235. This is followed by a keyword which identifies the message type.
  236. Following the keyword, there may be additional type-specific
  237. parameters.  The fields in a message are separated by blanks.
  238.  
  239. When a client sends a message to the server, it is of the form
  240.   <client-name> <message-type> <parameters>,
  241. where
  242.   <client-name>  is the 8-character nickname of the client,
  243.   <message-type> is a keyword identifying the type of the message,
  244.   <parameters>   is an optional list of message-specific parameters.
  245.  
  246. When a server sends a message to a client, it is of the form
  247.   <position> <source> <message-type> <parameters>
  248. where
  249.   <position>     is the name of the position occupied by the person
  250.                  who originated the message.  May be North, South,
  251.                  East, West, Mod or Obs.
  252.   <source>       is the nickname of the person who originated the message.
  253.   <message-type> is a keyword identifying the type of the message.
  254.   <parameters>   is an optional list of message-specific parameters.
  255.  
  256. To see the sequence of messages transmitted by the program, compile
  257. with the -DLOGFILE option.
  258.  
  259. There are three kinds of messages: protocol messages, conversational
  260. messages and game messages.  A protocol message affects the
  261. communications behavior of the program, and is typically handled
  262. differently according to whether we are operating in client mode or in
  263. server mode.  For example, the initial handshakes which are performed
  264. when a new client connects to the server are protocol messages.
  265. Conversational messages may affect the state of the game, but not
  266. directly.  Examples of asynchronous messages are talk messages and
  267. claim requests.  Game messages convey changes to the state of the
  268. game.  Examples of game messages are deals, bids and plays.
  269.  
  270. All messages are first received by the network module.  This module
  271. then parses the message, creating a data structure as defined in
  272. protocol.h to represent the message.  The message is then put onto the
  273. protocol queue associated to the table.  The protocol queue is handled
  274. by the cs module.  After a message from the protocol queue is handled,
  275. it may be put onto the conversational queue.  The conversational queue
  276. is handled by the conversation module.  After a message from the
  277. conversational queue is handled, it may finally be put onto the game
  278. queue.  The game queue is handled by the bridge module.
  279.  
  280.  
  281. Protocol Messages
  282. -------- --------
  283.  
  284.    HELLO <version> <player-name> <position>
  285.      When a client first establishes a connection to the server, it sends
  286.      a hello message identifying itself to the server.  If the server
  287.      recognizes the client as using a compatible version of okbridge,
  288.      then the HELLO message is relayed to the other clients.
  289.      <version>     := a string identifying the major revision level
  290.      <player-name> := an eight character name identifying the player
  291.      <position>    := the seat requested by the player
  292.  
  293.    ACK <player-name> <position>
  294.      After verifying that the client is using the same version of okbridge,
  295.      the server sends to the client an ACK message for itself and for each
  296.      of the other clients, identifying all of the current connections.
  297.      <player-name>  := an eight character name identifying the player
  298.      <position>     := the current position of the player.
  299.  
  300.    CONNERR <message>
  301.      Used by the server to transmit error messages in case the client
  302.      is not using the same version of okbridge.  The message is followed
  303.      by closing the socket connection.
  304.  
  305.    ECHO <ping-source>
  306.      A message sent in response to a PING request.
  307.  
  308.    PING
  309.      Sends a message which is automatically echoed by each of the other
  310.      players.  The purpose of this message is to determine how quickly
  311.      the networks are operating.
  312.  
  313.    QUIT
  314.      Transmitted by a player as the final message before closing the
  315.      socket connection.
  316.  
  317.    RECONNECT <ip-name-or-number> <port-number> <seat-name>
  318.      Transmitted by the server to a player, indicating that the player
  319.      should reconnect to a new server at the given ip/port and sit
  320.      at the specified seat.
  321.  
  322.    SEAT <old-seat> <new-seat> <player-name>
  323.      Transmitted by the server to indicate that a player has changed seats.
  324.      If this message names the local player, it should be ignored.
  325.      Otherwise, problems may arise when two people choose the same name.
  326.  
  327.    SEATERR <seat1> <seat2> <seat3>
  328.      Transmitted by the server to indicate that the requested seat
  329.      is not available.  The seats <seat1>, <seat2>, <seat3> list the
  330.      currently free seats.
  331.  
  332.    SEATPOS <seat-assignment>
  333.      Indicates the seat which is assigned to the local player.
  334.      This is a mandatory assignment, and may not necessarily be the
  335.      seat which was requested.  Note that when a player makes a
  336.      seat request, he will receive a SEATPOS assignment and also
  337.      a SEAT message which is broadcast to everyone.
  338.  
  339.    SEATREQ <seat-name>
  340.      Requests a seat assignment from the server.
  341.  
  342.    SERVEREQ <command-name>
  343.      Makes a special request to the server which is not covered by
  344.      the other message types.  The server is free to the <command-name>
  345.      in an implementation-specific way.
  346.  
  347.    TABLEREQ <requested-table-number>
  348.      Transmitted by a player to make a request to sit at the requested
  349.      table.  
  350.  
  351.    TABLE <assigned-table-number>
  352.      Transmitted by the server to the table number assigned to the local
  353.      player.
  354.  
  355.    
  356. Conversational Messages
  357. -------------- --------
  358.  
  359.    COMMENT <message>
  360.      Carries a message to each of the players which is from the MODERATOR.
  361.  
  362.    CC <convention-card>
  363.      Conveys the convention card which is in use by the team of the person
  364.      sending the message.
  365.      
  366.    CLAIMREQ n
  367.      Transmits a request by the declarer to claim n additional tricks.
  368.      The defenders should each respond with a CLAIMRESP message.
  369.  
  370.    CLAIMRESP YES|NO
  371.      Transmits a defender's response to a claim request message.
  372.  
  373.    EMAIL <email-address>
  374.      Transmits a player's email address to the server.
  375.  
  376.    FULLNAME <full-name>
  377.      Transmits a players full name to the server.
  378.  
  379.    NAME <new-name>
  380.      Informs the other players that the local player has changed his
  381.      or her name.
  382.  
  383.    REGISTRY <identification>
  384.      Registers a unique identity for the player with the server.
  385.      This is independent of the name supplied with the NAME command,
  386.      which may change.
  387.    
  388.    RESET
  389.      Resets the program to its initial state.  Can only be used by server.
  390.  
  391.    SPEC
  392.      Sent by a player to indicate that s/he has entered spectator mode.
  393.  
  394.    TALK <recipients> <message>
  395.      Sends a message to the <recipients> from a player.
  396.  
  397.    WAKEUP [<player-name>|ALL]
  398.      Sends a wake-up signal.  If <player-name> is specified, then
  399.      only that player receives the signal.  Otherwise, everyone receives
  400.      the signal.
  401.  
  402.    WHO
  403.      Asks the server to generate a brief list of the people who are
  404.      currently connected.
  405.  
  406.    WHOIS <player-name>
  407.      Asks the player with name <player-name> to identify him/herself.
  408.      The identification should consist of the player's full name and
  409.      email address.
  410.  
  411.    WHORESP <recipient> <ident>
  412.      A response to the WHOIS message, <recipient> is the name of the
  413.      player who issued the WHOIS message and <ident> is the identifying
  414.      message returned by the target of the WHOIS message.
  415.  
  416.  
  417.  
  418. Game Messages
  419. ---- --------
  420.  
  421.    ALERT <formal-mode>
  422.      Alerts the most recent bid by the partner of the transmitting player.
  423.      <formal-mode> is a boolean flag indicating whether or not the
  424.      bid should be displayed to partner as well.
  425.  
  426.    BEGIN
  427.      Sent by the server to announce that bidding should begin.
  428.  
  429.    BID <bid-name> [ALERT]
  430.      Reports a bid to the other players.  The keyword ALERT appears
  431.      if the bidder has alerted his own bid.
  432.  
  433.    BOARD <board-name> <sequence-number>
  434.      Initiates the transmission of a board for play.  The board name
  435.      and number are recorded along with the board itself in the local
  436.      database of boards.  The board itself is then transmitted as
  437.      in-line data following the message.  This board is then made the
  438.      Local_board, so it will be used in subsequent play.
  439.      Any subsequent RECORD messages apply to this board.
  440.  
  441.    CLAIM n
  442.      Claims n of the remaining tricks.  Can only be used by the declarer
  443.      when it is his turn to play.  
  444.  
  445.    DEAL
  446.      Sent by the server to announce the beginning of a new hand.
  447.      This message will be followed by a BOARD message plus one or more
  448.      RECORD messages from the server.  Bidding will be allowed to
  449.      commence when the server sends a BEGIN command.
  450.  
  451.    END
  452.      Sent by the server at the end of each hand to cause each client
  453.      to re-enter the initial mode.
  454.  
  455.    MODE CLUB|PRACTICE|FORMAL
  456.      Sets the playing mode.  Club mode is the usual mode of play.
  457.      Practice mode is used by two or more people to practice bidding
  458.      and planning play.  In practice mode, the following behaviors occur:
  459.        1. During bidding, the players who are sitting may bid.  When it
  460.           is time for a bid to be made from an unoccupied seat, the program
  461.           automatically supplies a bid of "PASS".
  462.        2. During play, the cards are revealed to everyone, and anyone may
  463.           specify the next card to be played.
  464.        3. A hand may be ended with the /claim command.  Confirmation is not
  465.           requested for claims.
  466.      In formal mode, the following actions are taken:
  467.        1. Alerts are not shown to the partner of the person making the alert.
  468.        2. Talk messages are not transmitted to partner.
  469.        3. The dummy is not displayed to anyone until the opening lead has
  470.           been made.
  471.        4. The bidding cannot be reviewed after play has begun.
  472.  
  473.    PLAY <card-name>
  474.      Reports a play of a card to the other players.
  475.  
  476.    PLAYREQ <card-name> <sequence-number>
  477.      Requests from the server that the given card be played for the
  478.      given play number.  The PLAYREQ message is needed only during
  479.      practice mode, when multiple players may attempt to play 
  480.      simultaneously.
  481.  
  482.    RECORD <board-name> <sequence-number>
  483.      Initiates the transmission of a record of play.  The record itself
  484.      is transmitted as in-line data following the message.  This record
  485.      pertains to the board having the given name and number.  If this is
  486.      the name of the current board.
  487.  
  488.    SCORE <above-ns> <above-ew> <below-ns> <below-ew>
  489.      A message sent by the server to indicate the current scoring totals.
  490.      This may be independent of the scores which have been computed for
  491.      the hands that have been played.
  492.  
  493.    SKIP
  494.      Ends the current hand prematurely, causing all players to return
  495.      to STARTUP_MODE.  Does not record a score for the hand.
  496.  
  497.    SKIPACK
  498.      Sent by each player in response to a skip message, indicating that
  499.      the local player has reset his state to startup mode.
  500.  
  501.    USEREC <north-name> <east-name> <south-name> <west-name>
  502.      A message sent by the server to indicate which play record should
  503.      is being used in the current hand.
  504. */
  505.