/* * Client/Server documentation; IGS External Protocol * * Copyright (C) 1992, 1995 I.NET Technologies Inc. * All rights reserved. License is hereby given for the use of * this material to develop graphics user interface programs * ("client programs") for the graphic interpretation of data * stored on or transmitted by the Internet Go Server. Any * other use of this material without the prior written consent * of I.NET Technologies Inc. is expressly prohibited. */ #if 0 $Id: protocol,v 1.1 2003/01/12 04:01:52 gcasa Exp $ #endif /* LINT */ #ifndef SHARED_H #define SHARED_H #ifdef USE_STDERR /* Dec alpha apperently has a USE_STDERR defined */ #undef USE_STDERR #endif #ifndef BIT #define BIT(n) (1L << (n)) #endif /* BIT */ #define MAX_BRD_SZ 19 #define MAX_LANG 5 #define DEF_LANG 0 /* * These message types are put at the beginning of every line * of output from the server, with one exception (of course). * Some things to be aware of: * If you get an unknown message type, you should probably just * treat it is 'INFO'. I would guess the same would be true * if there is an error parsing date. (It would probably be * good to tell the user something is wrong as well.) * * To start looking for client messages look for the version message. * If should see: 39 .... If you see: IGS entry on mm - dd - yyyy, * you are not in client mode. But the version string is a way to * tell if you should be looking for IGS messages, as opposed to * terminal messages. * * The IGS client protocol is designed to be a line-by-line protocol, * just like telnet is a line-by-line protocol. * * Any IGS output, which is INFO is subject to change. */ typedef enum { UNKNOWN = 0, AUTOMAT = 35, /* Automatch anouncement*/ AUTOASK = 36, /* Automatch accept */ CHOICES = 38, /* game choices */ CLIVRFY = 41, /* Client verify message */ BEEP = 2, /* \7 telnet */ BOARD = 3, /* Board being drawn */ DOWN = 4, /* The server is going down */ ERROR = 5, /* An error reported */ FIL = 6, /* File being sent */ GAMES = 7, /* Games listing */ HELP = 8, /* Help file */ INFO = 9, /* Generic info */ LAST = 10, /* Last command */ KIBITZ = 11, /* Kibitz strings */ LOAD = 12, /* Loading a game */ LOOK_M = 13, /* Look */ MESSAGE = 14, /* Message lising */ MOVE = 15, /* Move #:(B) A1 */ OBSERVE = 16, /* Observe report */ PROMPT = 1, /* A Prompt (never) */ REFRESH = 17, /* Refresh of a board */ SAVED = 18, /* Stored command */ SAY = 19, /* Say string */ SCORE_M = 20, /* Score report */ SGF_M = 34, /* SGF variation */ SHOUT = 21, /* Shout string */ SHOW = 29, /* Shout string */ STATUS = 22, /* Current Game status */ STORED = 23, /* Stored games */ TEACH = 33, /* teaching game */ TELL = 24, /* Tell string */ DOT = 40, /* your . string */ THIST = 25, /* Thist report */ TIM = 26, /* times command */ TRANS = 30, /* Translation info */ TTT_BOARD= 37, /* tic tac toe */ WHO = 27, /* who command */ UNDO = 28, /* Undo report */ USER = 42, /* Long user report <-- last */ VERSION = 39, /* IGS VERSION: IGS entry on %02d - %02d - %04d\r\n comes out just as the last piece of info after verification of the password. mm - dd - yyyy <== last Message Type value */ YELL = 32, /* Channel yelling */ } MessageType; /* * The states are used, after the prompt line, to tell what state a player * is in on IGS. The '1 1' state (meaning PROMPT message while the prompt * in text mode would be 'Password:') the client should not echo characters, * or should change the font to display spaces for characters. The states * 2, 4 and 4 are no longer used, because of registration. State 5 is the * 'WAITing' for a game state, from there one can go into the playing, * teaching, or observing states. The states are not exclusive. * Here is an example: * 1 5 * ob 1 * 9 Adding game to observation list. * 15 Game 1 I: death (0 4937 -1) vs Bob (0 4883 -1) * 15 62(B): G4 * 1 8 * At this point, you can either ask for the moves from a game with the * moves command, or you can get the board state from the status command. * These are the various states: */ #define LOGGEDON WAITING typedef enum { LOGON = 0, /* initial state */ PASSWORD = 1, /* getting password */ PASSWD_NEW = 2, /* verifiying password: not used, registration */ PASSWD_CONFIRM = 3, /* ditto */ REGISTER = 4, /* not used */ WAITING = 5, /* After login the basic state */ PLAYING = 6, /* Playing a game */ SCORING = 7, /* Scoring a game */ OBSERVING = 8, /* Observing (and playing?) a game */ TEACHING = 9, /* In teaching mode, can move for W and B */ COMPLETE = 10 /* game complete */ } State; /* * GAMES: Displays all of the games being played, or the game specified. * The players listed in the games listing, may or may not be real * players because of the teach command. *[##] white name [ rk ] black name [ rk ] (Move size H Komi BY FR) (###) * * MOVES: comes out in the form: * 15 Game 1 I: death (4 4629 -1) vs Bob (2 4486 -1) * 15 0(B): Handicap 2 * 15 1(W): P3 * 15 2(B): D16 * . * . * . * * Or generally: * 15 #(c): * Where the following move list are dead stones as a result of * the move. * * STATUS: used to get what is a game current status is. * status 1 * 22 white rank captured time T|F komi handicap * 22 black rank captured time T|F komi handicap * 22 0: 2222222222222222222 * 22 1: 2221222222122221102 * 22 2: 2201212102222122022 * 22 3: 2000120101222220222 * 22 4: 2111211001222122222 * 22 5: 2122210001222200222 * 22 6: 2211110211222110222 * 22 7: 2200100122222221022 * 22 8: 2201001102122121022 * 22 9: 2206011006220100022 * 22 10: 2222210022102002222 * 22 11: 2222202202210212222 * 22 12: 2222000002210210022 * 22 13: 2200121222120111222 * 22 14: 2201112222220102122 * 22 15: 2220222221211020122 * 22 16: 2202212222100021222 * 22 17: 2221222221021201222 * 22 18: 2222222222200222222 * 1 5 * NOTE: The board for a status is flipped along the diagonal * with respect to the rest of IGS/SGF output. * If the line for the player is 'T', then the player is in * byo-yomi. Otherwise, the byo-yomi stones can be ignored. * Should there be a mention of the rule set for the game? * * INFO: String to be passed to the user, with the '9 ' stripped out. * * ERROR: String to be passed to the user, with the '5 ' stripped out. * If you can handle errors in a rational way, then the difference * between INFO and ERROR are useful. * * DOT: Has the name of the player which is the players '.' * * FIL: Used to send a file. The format is differnt then any other command: * help match * 6 * text of help match * 6 * 1 5 * In the above example, type would be HELP. Although type can be * nearly any line type, it currently is only MESSAGE, HELP, and INFO. * */ /* * All possible tokens read in by the parser. */ typedef enum { Unkn_t = 0, AYT_t, Ping_t, Free_t, Auto_t, Game_t, Goto_t, Help_t, Hand_t, Addr_t, Chan_t, Char_t, Decr_t, Defs_t, Incr_t, Back_t, Best_t, Bet_t, Bloc_t, DOT_t, AcRe_t, Adjo_t, Addt_t, Appe_t, AKil_t, Alia_t, All_t, AMai_t, Bug_t, Chat_t, Choi_t, Comm_t, Conn_t, Cron_t, Curr_t, Dagg_t, Decl_t, Dele_t, Disa_t, Done_t, Draw_t, DpyR_t, Dump_t, Eras_t, Exit_t, FdIs_t, Fill_t, Find_t, Forw_t, Full_t, GMat_t, Gran_t, GTea_t, Host_t, Info_t, Kibi_t, Kill_t, KIdl_t, Komi_t, Lang_t, Last_t, Load_t, Loca_t, Lock_t, Logi_t, Look_t, Mail_t, Matc_t, Mess_t, Move_t, Name_t, Noti_t, Obse_t, Pass_t, Play_t, PlMv_t, PMat_t, Prob_t, PSMa_t, Quit_t, Rank_t, Rati_t, Rnks_t, Refr_t, Regi_t, Reha_t, Remo_t, Rese_t, Resi_t, Revi_t, Save_t, Say_t, Scor_t, Sgf_t, Shou_t, Show_t, Shut_t, Slee_t, Spy_t, Stus_t, Stat_t, Stor_t, Supe_t, Teac_t, Team_t, Tell_t, This_t, TIC_t, Time_t, Titl_t, TGMa_t, TMat_t, Togg_t, Touc_t, Tran_t, UnAl_t, Undo_t, UnOb_t, UnRe_t, Upti_t, Viol_t, Vari_t, Watc_t, Shel_t, Who_t, User_t, Xsho_t, GmRe_t, AskM_t, InBy_t, CnSn_t, Ambi_t, Exac_t, True_t, Fals_t, Yell_t, /* toggles */ T_AUTOMAIL, T_OPEN, T_VERBOSE, T_BELL, T_QUIET, T_CLIENT, T_CHATTER, T_AUTOSAVE, T_LOOK, T_KIBI, T_SHOUT, T_RANK, T_NEW, /* SGF stuff */ Comments_t, Label_t, Letters_t, Marks_t, Variations_t, Add_ch, Clean_ch, Debug_ch, Help_ch, Hide_ch, Moderator_ch, Open_ch, Remove_ch, Title_ch, NAgr_t, } CommandToken; /* * A string to token struct. * DiskIO is for stats and debugging on bsdserver. */ typedef struct { char *str; CommandToken tok; unsigned long count; char NeedArg; char SuperCommand; char DiskIO; unsigned char amb; char *enabled; char reg; unsigned long at; } SearchComm; /* * aliases have a limit */ #define NAME_LEN 20 typedef struct _alias { char alias[NAME_LEN]; char sub[NAME_LEN*2]; struct _alias *next; } Alias; #define NUM_RANKS num_ranks #define NUM_SPECIAL 2 /* * verticies */ #define TOP 0 #define MID 1 #define BOT 2 extern int verts[3][MAX_BRD_SZ+1]; extern int num_ranks; extern char *ranks[], *comranks[]; extern char *prompts[]; #ifdef __STDC__ extern SearchComm *GetCommandToken( char *orig, char **args, Alias *aliases[]); #else /* __STDC__ */ extern SearchComm *GetCommandToken(); #endif /* __STDC__ */ #if 0 extern SearchComm *ToggleCommand(char * str); extern SearchComm *SearchTbl(char *str, SearchComm *tbl, int tbllen); extern char *BreakList(char *str, char **rest); #endif #endif /* SHARED_H */