home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume28 / ldb / part02 / ldb.h next >
Encoding:
C/C++ Source or Header  |  1992-03-15  |  11.2 KB  |  295 lines

  1. /*    ldb.h        8/3/91
  2.  *
  3.  * Copyright 1991  Perry R. Ross
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation without fee is hereby granted, subject to the restrictions
  7.  * detailed in the README file, which is included here by reference.
  8.  * Any other use requires written permission from the author.  This software
  9.  * is distributed "as is" without any warranty, including any implied
  10.  * warranties of merchantability or fitness for a particular purpose.
  11.  * The author shall not be liable for any damages resulting from the
  12.  * use of this software.  By using this software, the user agrees
  13.  * to these terms.
  14.  */
  15.  
  16. #include "patchlevel.h"
  17.  
  18. #define LDB_VER        ((VERSION*100)+PATCHLEVEL)    /* used in sendpkt */
  19.  
  20. #include <stdio.h>
  21. #include <ctype.h>
  22. #include <curses.h>
  23. #include <signal.h>
  24.  
  25. #ifdef vaxc
  26. #define OLD_CURSES 1
  27. #define unlink(X) delete(X)
  28. #endif
  29.  
  30. #ifdef sequent
  31. #define OLD_CURSES 1
  32. #endif
  33.  
  34. #ifdef OLD_CURSES
  35. #define cbreak() crmode()    /* from ancient curses */
  36. #define nocbreak() nocrmode()
  37. #endif
  38.  
  39.     /* swiped from X toolkit */
  40. #define Offset(T,F) ((int)(((char *)(&(((T)NULL)->F)))-((char *)NULL)))
  41.  
  42. #define PRIVATE static        /* for private functions */
  43.  
  44. #define INTGFILE "interrupt.ldbdata"    /* file to save games to on ^C */
  45. #define BLANKS(X) (&blk76[76-(X)])    /* blank string of specified length */
  46.  
  47.         /* locations in board typedef */
  48. #define UPBAR        0        /* BAR point for up-bound player */
  49. #define DOWNBAR        25        /* BAR point for down-bound player */
  50. #define UPOFF        26        /* off point for up-bound player */
  51. #define DOWNOFF        27        /* off point for down-bound player */
  52. #define BOARDSIZE    28        /* number of points in board */
  53.  
  54.     /* BARPT takes a direction (-1 or 1) and returns the    */
  55.     /* point in the board typedef that represents that    */
  56.     /* players bar.  OFFPT does the same thing for the    */
  57.     /* point that pieces go to when they are thrown off.    */
  58.     /* REV(direction) returns the opposite direction.    */
  59. #define BARPT(D)    (((D)>0)?UPBAR:DOWNBAR)
  60. #define OFFPT(D)    (((D)>0)?UPOFF:DOWNOFF)
  61. #define REV(D)        (-(D))
  62.  
  63.         /* states we can be in */
  64. #define ST_OPSTART    0        /* we have sent a START (or rcvd one)*/
  65. #define ST_OPTURN    1        /* Its the opponent's turn */
  66. #define ST_OPACCEPT    2        /* I have offered to double */
  67.  
  68. #define OPSTATES    3        /* < OPSTATES needs remote input */
  69.  
  70. #define ST_MYTURN    3        /* My turn, I haven't rolled yet */
  71. #define ST_MYMOVE    4        /* I've rolled, but I haven't moved */
  72. #define ST_MYACCEPT    5        /* Opponent has offered to double */
  73. #define ST_GAMEOVER    6        /* game is dead, see T_* for reason */
  74. #define NSTATE        7        /* number of possible states */
  75.  
  76.         /* operations to send or receive */
  77. #define START        0        /* start a game */
  78. #define USTART        1        /* if rcvd, we won the initial roll */
  79. #define TIE        2        /* tie on initial roll, restart */
  80. #define MOVE        3        /* send a move */
  81. #define OFRDBL        4        /* offer to double */
  82. #define ACPTDBL        5        /* double accepted */
  83. #define DECDBL        6        /* double declined, game over */
  84. #define CONCEDE        7        /* we give up */
  85. #define RSTART        8        /* remote start packet */
  86. #define RESTART        9        /* repeat initial roll */
  87. #define NOP        10        /* number of possible operations */
  88.  
  89.         /* termination codes for state ST_GAMEOVER */
  90. #define T_ICONCEDE    1        /* I gave up */
  91. #define T_OPCONCEDE    2        /* opponent gave up */
  92. #define T_IDECLINE    3        /* I declined double */
  93. #define T_OPDECLINE    4        /* opponent declined double */
  94. #define T_ILOSE        5        /* opponent moved all pieces off */
  95. #define T_IWIN        6        /* I moved all pieces off */
  96.  
  97.         /* flags passed to apply */
  98. #define A_REDRAW    1    /* redraw the pieces moved */
  99. #define A_CHKONLY    2    /* check move but don't move pieces */
  100.  
  101.         /* codes returned by apply */
  102. #define MVOK        0    /* move was accepted by apply() */
  103. #define RJ_NOROLL    -1    /* move does not contain valid roll */
  104. #define RJ_NOOFF    -2    /* all pcs not in inner tbl, can't throw off */
  105. #define RJ_NOPIECE    -3    /* no piece at specified point */
  106. #define RJ_OCC        -4    /* destination occupied */
  107. #define RJ_ONBAR    -5    /* can't move, pieces are on bar */
  108. #define RJ_NOTYOURS    -6    /* wrong color, dummy */
  109. #define RJ_EXACT    -7    /* must use exact roll except for outer pc */
  110.  
  111.         /* bits for flags field of game struct */
  112. #define F_IDOUBLED    1    /* I doubled last */
  113. #define F_SENTNAME    2    /* I sent my name */
  114. #define F_INVERT    4    /* I want my board upside down */
  115. #define F_DELETE    8    /* this game is deleted */
  116.  
  117.         /* field types for reading name/value files */
  118. #define FT_CHAR        1    /* store a single character */
  119. #define FT_INT        2    /* store a single integer */
  120. #define FT_STRING    3    /* store a char * (use save()) */
  121. #define FT_MOVE        4    /* a struct mv */
  122. #define FT_BOARD    5    /* a board image */
  123. #define FT_STRLKUP    6    /* lookup string in table & store index */
  124. #define FT_TIME        7    /* a timestamp */
  125. #define FT_END        99    /* end of structure */
  126.  
  127.         /* which board is currently displayed (g->curbd) */
  128. #define BD_BEFOP    0    /* before op's move (after my previous) */
  129. #define BD_AFTOP    1    /* after op's move (before my next) */
  130. #define BD_CUR        2    /* current (with any moves I've made so far) */
  131.  
  132.         /* these are the command line options */
  133. #define OPT_START    1    /* start a game */
  134. #define OPT_READ    2    /* read incoming mail */
  135. #define OPT_PLAY    3    /* play any games that are waiting for me */
  136. #define OPT_COLOR    4    /* set the color for created games */
  137. #define OPT_DIRECTION    5    /* set the direction for created games */
  138. #define OPT_RSTART    6    /* remote start a game */
  139. #define OPT_HELP    7    /* print long help */
  140. #define OPT_CONTROL    8    /* go into control mode */
  141. #define OPT_MYADDR    9    /* set my e-mail address (override .ldbrc) */
  142. #define OPT_BCAST    10    /* send a mail message to all opponents */
  143.  
  144. struct opt {            /* used to make list of command line options */
  145.     char    *name;        /* name of option (as used on command line) */
  146.     int    index;        /* OPT_* */
  147.     char    *args;        /* arguments the option takes, if any */
  148.     char    *help;        /* 1-line help string for option */
  149.     };
  150.  
  151. struct ldbrc {        /* struct where all fields from .ldbrc are stored */
  152.     char    *myaddr;    /* my e-mail address */
  153.     char    *myname;    /* my name */
  154.     char    *gfile;        /* games file */
  155.     char    *gbackup;    /* where to save old game file */
  156.     char    *mfile;        /* mail file */
  157.     char    *sendcmd;    /* mail send command */
  158.     char    *tempfile;    /* temp file for sendpkt */
  159.     char    *defclrs;    /* default colors (2 from [rwb]) */
  160.     char    *defdir;    /* default direction (up/down) */
  161.     char    *initboard;    /* init. brd display (before/after/current) */
  162.     char    *autoroll;    /* enable autoroll? (yes/no) */
  163.     char    *automove;    /* enable automove? (yes/no) */
  164.     int    autodouble;    /* autodouble count, 0 to disable */
  165.     char    *supercmd;    /* command to run to fool supervisor */
  166.     char    superkey;    /* key to activate supercmd */
  167.     char    *chkpt;        /* keep games up to date? */
  168.     };
  169.  
  170.         /* the following structure is used to save/load */
  171.         /* the games file, the .ldbrc, and to send    */
  172.         /* packets between the players.  It stores a    */
  173.         /* name, the type (see FT_* above), and the    */
  174.         /* offset into a structure.  A pointer to the    */
  175.         /* structure is provided at runtime.        */
  176. struct namevalue {
  177.        char *name;        /* name of the field */
  178.        char type;        /* type of the field (T_*) */
  179.        int offset;        /* where to store value */
  180.        };
  181.  
  182. union nvtypes {            /* convert char* to/from FT_* */
  183.     char    *nvchar;    /* FT_CHAR */
  184.     int    *nvint;        /* FT_INT */
  185.     long    *nvtime;    /* FT_TIME */
  186.     char    **nvstring;    /* FT_STRING */
  187.     struct mv *nvmove;    /* FT_MOVE */
  188.     struct point *nvboard;    /* FT_BOARD */
  189.     };
  190.  
  191. struct mv {
  192.     char    roll;            /* # on 1 die, 0 = DOUBLE, -1=empty */
  193.     char    pt;            /* point move is from, -1=UNUSED */
  194.     };
  195.  
  196. struct point {
  197.     char    qty;            /* number of pieces on this point */
  198.     char    color;            /* color of pieces on this point */
  199.     };
  200.  
  201. typedef struct point board[BOARDSIZE];    /* board is array of points */
  202.  
  203. struct game {                /* all info about a game in progress */
  204.     char    *gameid;        /* unique game id */
  205.     char    *opaddr;        /* email path to opponent */
  206.     char    *opname;        /* full name of opponent */
  207.     char    mycolor;        /* char to represent my pieces */
  208.     char    opcolor;        /* opponent's pieces */
  209.     char    mydir;            /* 1/-1 direction I am moving */
  210.     char    opdir;            /* 1/-1 direction opponent is moving */
  211.     int    gameval;        /* current value of game */
  212.     int    adcnt;            /* current number of autodoubles */
  213.     int    admax;            /* max autodoubles allowed */
  214.     int    flags;            /* various flags (F_*) */
  215.     char    state;            /* my current state (ST_*) */
  216.     char    term;            /* if game over, why (T_*) */
  217.     int    seq;            /* sequence number of next pkt */
  218.     int    lastop;            /* last opcode sent (for resends) */
  219.     char    *mycmt;            /* comment I sent with last move */
  220.     char    *mycmt2;        /* second line of mycmt */
  221.     char    *opcmt;            /* comment I received with last move */
  222.     char    *opcmt2;        /* second line of opcmt */
  223.     char    *dispmsg;        /* msg to display when game drawn */
  224.     struct mv opmvs[4];        /* opponent's last move */
  225.     char    blot[4];        /* my blots that were hit */
  226.     struct mv mvs[4];        /* my move, holds roll until I move */
  227.     int    maxused;        /* # of rolls in mvs that can be used*/
  228.     int    hiused;            /* highest roll that can be used */
  229.     board    opbd;            /* board image before opmvs applied */
  230.     board    mybd;            /* board before mvs (for Reset) */
  231.     board    board;            /* current board image */
  232.     char    curbd;            /* which brd is currently displayed */
  233.     struct game *prev;        /* back link in game list */
  234.     struct game *next;        /* forward link in game list */
  235.     };
  236.  
  237. struct packet {
  238.     int    version;        /* ldb version */
  239.     long    timestamp;        /* time packet was sent */
  240.     char    *gameid;        /* the gameid string */
  241.     int    opcode;            /* operation being performed */
  242.     char    *name;            /* name */
  243.     char    *addr;            /* mail address */
  244.     char    *comment;        /* comment received */
  245.     char    *comment2;        /* second line of comment */
  246.     int    seq;            /* sequence number */
  247.     char    *colors;        /* colors of new game */
  248.     char    *dir;            /* direction of game starter */
  249.     char    *autodbl;        /* autodouble count (sprintf'ed) */
  250.     struct mv mvs[4];        /* moves (if opcode == MOVE) */
  251.     struct game *gameptr;        /* not a pkt field, set by getpkt() */
  252.     };
  253.  
  254. struct legal {                /* list of legal moves */
  255.     int nmove;            /* number of moves in this entry */
  256.     int himove;            /* highest roll used in this entry */
  257.     struct mv mvs[4];        /* the rolls and moves */
  258.     struct legal *prev;        /* pointer to the previous entry */
  259.     struct legal *next;        /* pointer to the previous entry */
  260.     };
  261.  
  262. extern int Pflag;            /* should I process local input? */
  263. extern int Rflag;            /* should I look for mail? */
  264. extern struct game *ghead;        /* head of linked list of games */
  265. extern struct game *gtail;        /* tail of linked list of games */
  266. extern struct legal *lhead;        /* head of list of legal moves */
  267. extern struct legal *ltail;        /* tail of list of legal moves */
  268. extern int (*func[OPSTATES][NOP])();    /* receive state machine */
  269. struct ldbrc rc;            /* stuff from .ldbrc */
  270. extern struct opt options[];        /* command line options */
  271. extern char *rejmsg[];            /* explanation of reject codes */
  272. extern char *opcodes[];
  273. extern char *bdlabels[];
  274. extern char blk76[];            /* 76 blanks */
  275. extern struct packet P;            /* last packet read */
  276. extern char cr_mycolor;            /* my color when game is created */
  277. extern char cr_opcolor;            /* opponent's color for new games */
  278. extern char cr_mydir;            /* my direction for new games */
  279. extern char *states[];            /* description of the states */
  280.  
  281. extern char FeIsActive;            /* front-end been initialized? */
  282.  
  283. extern struct namevalue nv_rcfile[], nv_gfile[], nv_packet[];
  284.  
  285. char *tgetstr();
  286. char *save(), *makeid(), *calloc();
  287. char *nvscan(), *strchr(), *boardstr(), *colorname();
  288. struct game *startgame(), *addgame(), *findgame();
  289.  
  290. int start(), istart(), tie(), restart();
  291. int opmove(), opofr(), opconc(), opacpt(), opdec();
  292. int smerr();
  293.  
  294. char FeMenu();
  295.