home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / xtrek / part03 / smessage.c < prev    next >
C/C++ Source or Header  |  1990-10-23  |  6KB  |  239 lines

  1. static char sccsid[] = "@(#)smessage.c    3.1";
  2.  
  3. /*
  4.  
  5.     Copyright (c) 1986     Chris Guthrie
  6.  
  7. Permission to use, copy, modify, and distribute this
  8. software and its documentation for any purpose and without
  9. fee is hereby granted, provided that the above copyright
  10. notice appear in all copies and that both that copyright
  11. notice and this permission notice appear in supporting
  12. documentation.  No representations are made about the
  13. suitability of this software for any purpose.  It is
  14. provided "as is" without express or implied warranty.
  15.  
  16. */
  17.  
  18.  
  19. #include <X11/Xlib.h>
  20. #include <stdio.h>
  21. #include <math.h>
  22. #include <signal.h>
  23. #include <ctype.h>
  24. #include "defs.h"
  25. #include "data.h"
  26.  
  27.  
  28. smessage(p, ichar)
  29. register struct player    *p;
  30. char ichar;
  31. {
  32.     register int i;
  33.  
  34.     if (p->p_umsg.m_pending == 0) {
  35.     p->p_umsg.m_pending = 1;
  36.     if (p->p_mdisplayed) {
  37.         XFillRectangle(p->display, p->messagew, p->cleargc, 5 + fontWidth(p->dfont), 5,
  38.             p->p_lastcount, fontHeight(p->dfont));
  39.         p->p_mdisplayed = 0;
  40.     }
  41.     /* Put the proper recipient in the window */
  42.     if (getaddr(p, ichar) < 0) {
  43.         /* print error message */
  44.         p->p_umsg.m_pending = 0;
  45.         return;
  46.     }
  47.     XDrawImageString(p->display, p->messagew, p->dfgc, 5 + fontWidth(p->dfont), 5 + p->dfont->ascent,
  48.         p->p_umsg.m_addrmsg, UMSGADDRLEN);
  49.     p->p_umsg.m_lcount = UMSGADDRLEN;
  50.     return;
  51.     }
  52.     switch (ichar) {
  53.     case '\b':
  54.     case '\177':
  55.         if (--p->p_umsg.m_lcount < UMSGADDRLEN) {
  56.         p->p_umsg.m_lcount = UMSGADDRLEN;
  57.         break;
  58.         }
  59.         XFillRectangle(p->display, p->messagew, p->cleargc, 5 + fontWidth(p->dfont) * p->p_umsg.m_lcount, 5,
  60.             fontWidth(p->dfont), fontHeight(p->dfont));
  61.         break;
  62.     case '\027':    /* CTRL-w */
  63.         i = 0;
  64.         /* back up over blanks */
  65.         while (--p->p_umsg.m_lcount >= UMSGADDRLEN && isspace(p->p_umsg.m_buf[p->p_umsg.m_lcount - UMSGADDRLEN]))
  66.         i++;
  67.         p->p_umsg.m_lcount++;
  68.         /* back up over non-blanks */
  69.         while (--p->p_umsg.m_lcount >= UMSGADDRLEN && !isspace(p->p_umsg.m_buf[p->p_umsg.m_lcount - UMSGADDRLEN]))
  70.         i++;
  71.         p->p_umsg.m_lcount++;
  72.  
  73.         if (i > 0) {
  74.         XFillRectangle(p->display, p->messagew, p->cleargc, 5 + fontWidth(p->dfont) * p->p_umsg.m_lcount, 5,
  75.             fontWidth(p->dfont) * i, fontHeight(p->dfont));
  76.         }
  77.         break;
  78.     case '\025':    /* CTRL-u */
  79.     case '\030':    /* CTRL-x */
  80.             while (--p->p_umsg.m_lcount >= UMSGADDRLEN)
  81.             XFillRectangle(p->display, p->messagew, p->cleargc, 5 + fontWidth(p->dfont) * UMSGADDRLEN, 5,
  82.                 fontWidth(p->dfont) * (p->p_umsg.m_lcount - UMSGADDRLEN), fontHeight(p->dfont));
  83.            p->p_umsg.m_pending = 0;
  84.         break;
  85.     case '\033':    /* ESC */
  86.         XFillRectangle(p->display, p->messagew, p->cleargc, 5, 5,
  87.             fontWidth(p->dfont) * p->p_umsg.m_lcount,
  88.             fontHeight(p->dfont));
  89.         p->p_mdisplayed = 0;
  90.         p->p_umsg.m_pending = 0;
  91.         break;
  92.     case '\r':
  93.         p->p_umsg.m_buf[p->p_umsg.m_lcount - UMSGADDRLEN] = 0;
  94.         p->p_umsg.m_pending = 0;
  95.         switch (p->p_umsg.m_addr) {
  96.         case 'A':
  97.             pmessage(p->p_umsg.m_buf, 0, MALL, p->p_umsg.m_addrmsg);
  98.             break;
  99.         case 'F':
  100.         case 'f':
  101.             pmessage(p->p_umsg.m_buf, FED, MTEAM, p->p_umsg.m_addrmsg);
  102.             break;
  103.         case 'R':
  104.         case 'r':
  105.             pmessage(p->p_umsg.m_buf, ROM, MTEAM, p->p_umsg.m_addrmsg);
  106.             break;
  107.         case 'K':
  108.         case 'k':
  109.             pmessage(p->p_umsg.m_buf, KLI, MTEAM, p->p_umsg.m_addrmsg);
  110.             break;
  111.         case 'O':
  112.         case 'o':
  113.             pmessage(p->p_umsg.m_buf, ORI, MTEAM, p->p_umsg.m_addrmsg);
  114.             break;
  115.         case '0':
  116.         case '1':
  117.         case '2':
  118.         case '3':
  119.         case '4':
  120.         case '5':
  121.         case '6':
  122.         case '7':
  123.         case '8':
  124.         case '9':
  125.             pmessage(p->p_umsg.m_buf, p->p_umsg.m_addr - '0', MINDIV, p->p_umsg.m_addrmsg);
  126.             break;
  127.         case 'a':
  128.         case 'b':
  129.         case 'c':
  130.         case 'd':
  131.         case 'e':
  132.             pmessage(p->p_umsg.m_buf, p->p_umsg.m_addr - 'a' - 10, MINDIV, p->p_umsg.m_addrmsg);
  133.             break;
  134.         default:
  135.             warning(p, "Not legal recipient");
  136.         }
  137.         XFillRectangle(p->display, p->messagew, p->cleargc, 5, 5,
  138.             fontWidth(p->dfont) * p->p_umsg.m_lcount, fontHeight(p->dfont));
  139.         p->p_mdisplayed = 0;
  140.         p->p_umsg.m_lcount = 0;
  141.         break;
  142.     default:
  143.         if (p->p_umsg.m_lcount == UMSGLEN) {
  144.         XBell(p->display, p->screen);
  145.         break;
  146.         }
  147.         if (iscntrl(ichar))
  148.         break;
  149.         XDrawImageString(p->display, p->messagew, p->dfgc, 5 + fontWidth(p->dfont) * p->p_umsg.m_lcount, 5 + p->dfont->ascent,
  150.             &ichar, 1);
  151.         p->p_umsg.m_buf[(p->p_umsg.m_lcount++) - UMSGADDRLEN] = ichar;
  152.         break;
  153.     }
  154. }
  155.  
  156. pmessage(str, recip, group, address)
  157. char *str;
  158. int recip;
  159. int group;
  160. char *address;
  161. {
  162.     struct message *cur;
  163.     if (++(mctl->mc_current) >= MAXMESSAGE)
  164.     mctl->mc_current = 0;
  165.     cur = &messages[mctl->mc_current];
  166.     cur->m_no = mctl->mc_current;
  167.     cur->m_flags = group;
  168.     cur->m_time = 0;
  169.     cur->m_recpt = recip;
  170.     (void) sprintf(cur->m_data, "%-9s %s", address, str);
  171.     cur->m_flags |= MVALID;
  172. }
  173.  
  174. getaddr(p, who)
  175. register struct player    *p;
  176. char who;
  177. {
  178.     p->p_umsg.m_addr = who;
  179.     (void) sprintf(p->p_umsg.m_addrmsg, " %c%x->", teamlet[p->p_ship->s_team], p->p_ship->s_no);
  180.     switch (who) {
  181.     case 'A':
  182.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "ALL");
  183.         break;
  184.     case 'F':
  185.     case 'f':
  186.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "FED");
  187.         break;
  188.     case 'R':
  189.     case 'r':
  190.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "ROM");
  191.         break;
  192.     case 'K':
  193.     case 'k':
  194.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "KLI");
  195.         break;
  196.     case 'O':
  197.     case 'o':
  198.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "ORI");
  199.         break;
  200.     case '0':
  201.     case '1':
  202.     case '2':
  203.     case '3':
  204.     case '4':
  205.     case '5':
  206.     case '6':
  207.     case '7':
  208.     case '8':
  209.     case '9':
  210.         if (isAlive(&players[who - '0'])) {
  211.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "%c%x ",
  212.             teamlet[players[who - '0'].p_ship->s_team], who - '0');
  213.         }
  214.         else {
  215.         warning(p, "Player is not in game");
  216.         return(-1);
  217.         }
  218.         break;
  219.     case 'a':
  220.     case 'b':
  221.     case 'c':
  222.     case 'd':
  223.     case 'e':
  224.         if (isAlive(&players[who - 'a' + 10])) {
  225.         (void) sprintf(&p->p_umsg.m_addrmsg[5], "%c%x ",
  226.             teamlet[players[who - 'a' + 10].p_ship->s_team], who - 'a' + 10);
  227.         }
  228.         else {
  229.         warning(p, "Player is not in game");
  230.         return(-1);
  231.         }
  232.         break;
  233.     default:
  234.         warning(p, "Not legal recipient");
  235.         return(-1);
  236.     }
  237.     return(0);
  238. }
  239.