diff -c -r xsg2.1/CHANGES xsg-2.1pl3/CHANGES
*** xsg2.1/CHANGES	Mon Aug  2 17:16:32 1993
--- xsg-2.1pl3/CHANGES	Fri Jan 27 17:49:43 1995
***************
*** 1,3 ****
--- 1,12 ----
+ v2.1pl3
+ - counterfeit message fix
+ 
+ v2.1pl2
+ - RCD support
+ 
+ v2.1pl1
+ - minor fixes
+ 
  v2.1
  - Added support for INL POBSERV (observers).  
   	Observers don't show up on the display since they would only obscure
diff -c -r xsg2.1/Imakefile xsg-2.1pl3/Imakefile
*** xsg2.1/Imakefile	Mon Aug  2 17:16:32 1993
--- xsg-2.1pl3/Imakefile	Fri Jan 27 17:49:43 1995
***************
*** 33,47 ****
  HEADERS = 		Wlib.h bitmaps.h copyright.h copyright2.h data.h \
  			defs.h oldbitmaps.h patchlevel.h struct.h version.h
  
! SRCS =			colors.c data.c defaults.c dmessage.c getship.c	\
! 			inform.c input.c main.c modify.c newwin.c option.c \
! 			planetlist.c planets.c playerlist.c redraw.c \
  			robotwin.c shmem.c sintab.c smessage.c stats.c \
  			sysdefaults.c util.c war.c warning.c x11window.c
  
! OBJS =			colors.o data.o defaults.o dmessage.o getship.o	\
! 			inform.o input.o main.o modify.o newwin.o option.o \
! 			planetlist.o planets.o playerlist.o redraw.o \
  			robotwin.o shmem.o sintab.o smessage.o stats.o \
  			sysdefaults.o util.o war.o warning.o x11window.o
  
--- 33,47 ----
  HEADERS = 		Wlib.h bitmaps.h copyright.h copyright2.h data.h \
  			defs.h oldbitmaps.h patchlevel.h struct.h version.h
  
! SRCS =			colors.c data.c defaults.c distress.c dmessage.c \
! 			getship.c inform.c input.c main.c modify.c newwin.c \
! 			option.c planetlist.c planets.c playerlist.c redraw.c \
  			robotwin.c shmem.c sintab.c smessage.c stats.c \
  			sysdefaults.c util.c war.c warning.c x11window.c
  
! OBJS =			colors.o data.o defaults.o distress.o dmessage.o \
! 			getship.o inform.o input.o main.o modify.o newwin.o \
! 			option.o planetlist.o planets.o playerlist.o redraw.o \
  			robotwin.o shmem.o sintab.o smessage.o stats.o \
  			sysdefaults.o util.o war.o warning.o x11window.o
  
diff -c -r xsg2.1/Makefile.INL xsg-2.1pl3/Makefile.INL
*** xsg2.1/Makefile.INL	Mon Aug  2 17:16:32 1993
--- xsg-2.1pl3/Makefile.INL	Fri Jan 27 17:49:43 1995
***************
*** 6,12 ****
  
  include ../config/$(CONFIG)
  
! LOCAL_DEFINES = -DSHRINKFRAME -DREALLYFAST
  
  TARGET = xsg
  
--- 6,12 ----
  
  include ../config/$(CONFIG)
  
! LOCAL_DEFINES = -DSHRINKFRAME -DREALLYFAST -DRCD
  
  TARGET = xsg
  
***************
*** 13,27 ****
  HEADERS = 		Wlib.h bitmaps.h copyright.h copyright2.h data.h \
  			defs.h oldbitmaps.h patchlevel.h struct.h version.h
  
! SRCS =			colors.c data.c defaults.c dmessage.c getship.c	\
! 			inform.c input.c main.c modify.c newwin.c option.c \
! 			planetlist.c planets.c playerlist.c redraw.c \
  			robotwin.c shmem.c sintab.c smessage.c stats.c \
  			sysdefaults.c util.c war.c warning.c x11window.c
  
! OBJS =			colors.o data.o defaults.o dmessage.o getship.o	\
! 			inform.o input.o main.o modify.o newwin.o option.o \
! 			planetlist.o planets.o playerlist.o redraw.o \
  			robotwin.o shmem.o sintab.o smessage.o stats.o \
  			sysdefaults.o util.o war.o warning.o x11window.o
  
--- 13,27 ----
  HEADERS = 		Wlib.h bitmaps.h copyright.h copyright2.h data.h \
  			defs.h oldbitmaps.h patchlevel.h struct.h version.h
  
! SRCS =			colors.c data.c defaults.c distress.c dmessage.c \
! 			getship.c inform.c input.c main.c modify.c newwin.c \
! 			option.c planetlist.c planets.c playerlist.c redraw.c \
  			robotwin.c shmem.c sintab.c smessage.c stats.c \
  			sysdefaults.c util.c war.c warning.c x11window.c
  
! OBJS =			colors.o data.o defaults.o distress.o dmessage.o \
! 			getship.o inform.o input.o main.o modify.o newwin.o \
! 			option.o planetlist.o planets.o playerlist.o redraw.o \
  			robotwin.o shmem.o sintab.o smessage.o stats.o \
  			sysdefaults.o util.o war.o warning.o x11window.o
  
diff -c -r xsg2.1/Manifest xsg-2.1pl3/Manifest
*** xsg2.1/Manifest	Mon Aug  2 17:16:33 1993
--- xsg-2.1pl3/Manifest	Fri Jan 27 17:49:44 1995
***************
*** 13,18 ****
--- 13,19 ----
  data.c
  data.h
  defaults.c
+ distress.c
  dmessage.c
  getship.c
  inform.c
diff -c -r xsg2.1/data.c xsg-2.1pl3/data.c
*** xsg2.1/data.c	Mon Aug  2 17:16:24 1993
--- xsg-2.1pl3/data.c	Fri Jan 27 17:49:36 1995
***************
*** 115,120 ****
--- 115,130 ----
  char pseudo[PSEUDOSIZE];
  char login[PSEUDOSIZE];
  
+ char           *shiptypes[NUM_TYPES + 1] = {"SC", "DD", "CA", "BB", "AS", "SB",
+ #if NUM_TYPES == 7
+ "AT"
+ #elif NUM_TYPES == 8
+ "GA", "AT"
+ #else
+ "GA", "AT", "??"
+ #endif
+ };
+ 
  struct rank ranks[NUMRANKS] = {
      { 0.0, 0.0, 0.0, "Ensign"},
      { 2.0, 1.0, 0.0, "Lieutenant"},
***************
*** 138,146 ****
  int hourratio=1;
  int hiddenenemy=1;
  float maxload=0.7;
! int cyborg=0;		/* ATM */
  int testtime;
! int mapfire=1;		/* TSH 2/10/93 */
! int runclock=1;		/* TSH 2/93 */
! char godsname[32];	/* TSH 2/93 */
! int frameskip=20;	/* TSH 4/93 */
--- 148,190 ----
  int hourratio=1;
  int hiddenenemy=1;
  float maxload=0.7;
! int cyborg=0;         /* ATM */
  int testtime;
! int mapfire=1;                /* TSH 2/10/93 */
! int runclock=1;               /* TSH 2/93 */
! char godsname[32];    /* TSH 2/93 */
! int frameskip=20;     /* TSH 4/93 */
! 
! /* the index into distmacro array should correspond
!    with the correct dist_type */
! 
! struct  dmacro_list distmacro[] = {
!         { 'X', "no zero", "this should never get looked at" },
!         { 'T', "taking", "%T%c@%b: (%S) Carrying %a to %l%?%n>-1%{ @ %n%}"},
!         { 'o', "ogg", "%T%c: Help Ogg %p at %l" },
!         { 'b', "bomb", "%T%c: %?%n>4%{bomb %l @ %n%!bomb%}"},
!         { 'c', "space_control", "%T%c: Help Control at %L" },
!         { '1', "save_planet", "%T%c: Help at %l! %?%a>0%{ (have %a arm%?%a=1%{y%!ies%}) %} %s%% shld, %d%% dam, %f%% fuel" },
!         { '2', "base_ogg", "%T%c: Sync with --]> %g <[-- OGG ogg OGG base!!" },
!         { '3', "help1", "%T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a armies. " },
!         { '4', "help2", "%T%c: Help me! %d%% dam, %s%% shd, %f%% fuel %a armies. " },
!         { 'e', "escorting", "%T%c: ESCORTING %g (%d%%D %s%%S %f%%F)" },
!         { 'O', "ogging", "%T%c: Ogging %h" },
!         { 'B', "bombing", "%T%c: Bombing %l @ %n" },
!         { 'C', "controlling", "%T%c: Controlling at %l" },
!         { '5', "asw", "%T%c: Anti-bombing %p near %b." } ,
!         { '6', "asbomb", "%T%c: DON'T BOMB %l. Let me bomb it (%S)" } ,
!         { '7', "doing1", "%T%c: (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal.  %d%% dam, %s%% shd, %f%% fuel" } ,
!         { '8', "doing2", "%T%c: (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal.  %d%% dam, %s%% shd, %f%% fuel" } ,
!         { 'f', "free_beer", "%T%c: %p is free beer" },
!         { 'n', "no_gas", "%T%c: %p @ %l has no gas" },
!         { 'h', "crippled", "%T%c: %p @ %l crippled" },
!         { '9', "pickup", "%T%c: %p++ @ %l" },
!         { '0', "pop", "%T%c: %l%?%n>-1%{ @ %n%}!"},
!         { 'F', "carrying", "%T%c@%b: %?%S=SB%{Your Starbase is c%!C%}arrying %?%a>0%{%a%!NO%} arm%?%a=1%{%y%!ies%}.\0" },
!         { '@', "other1", "%T%c: (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal. (%d%%D, %s%%S, %f%%F)" },
!         { '#', "other2", "%T%c: (%i)%?%a>0%{ has %a arm%?%a=1%{y%!ies%}%} at lal. (%d%%D, %s%%S, %f%%F)" },
!         { 'E', "help", "%T%c@%b: Help(%S)! %?%s<10%{SHLDS OUT! %!%?%s<90%{%s%% shd %}%}%?%d>10%{%?%d<90%{%d%% dmg %!%d%% DMG! %}%}%?%f<10%{NO GAS! %!%?%f<90%{%f%% fuel %}%}%?%S=SB%{%w%% wtmp %!%}%E%{ETEMP!! %}%W%{WTEMP!! %}%?%a>0%{%a armies! %}" },
!         { '\0', '\0', '\0'},
! };
! 
diff -c -r xsg2.1/data.h xsg-2.1pl3/data.h
*** xsg2.1/data.h	Mon Aug  2 17:16:31 1993
--- xsg-2.1pl3/data.h	Fri Jan 27 17:49:42 1995
***************
*** 148,153 ****
--- 148,155 ----
  extern char pseudo[PSEUDOSIZE];
  extern char login[PSEUDOSIZE];
  
+ extern char     *shiptypes[NUM_TYPES + 1];
+ 
  extern struct rank ranks[NUMRANKS];
  
  extern W_Window	messagew, w, mapw, statwin, baseWin, infow, iconWin, war,
***************
*** 181,183 ****
--- 183,186 ----
  # define WP_MAX 2
  #endif
  
+ extern struct dmacro_list distmacro[];
diff -c -r xsg2.1/distress.c xsg-2.1pl3/distress.c
*** xsg2.1/distress.c	Fri Jan 27 17:51:50 1995
--- xsg-2.1pl3/distress.c	Fri Jan 27 17:49:36 1995
***************
*** 0 ****
--- 1,726 ----
+ #ifdef RCD
+ /*
+  * distress.c
+  */
+ #include "copyright.h"
+ 
+ #include <stdio.h>
+ #include <signal.h>
+ #include <ctype.h>
+ #include "Wlib.h"
+ #include "defs.h"
+ #include "xsg_defs.h"
+ #include "struct.h"
+ #include "data.h"
+ 
+ #define TESTCAP(c,s)	(c ? strcap(s) : s)
+ 
+ #define ADDRLEN 10
+ #define MAXMACLEN 85
+ #define warning(x)		fprintf(stderr,x)
+ 
+ 
+ #ifdef USE_SYS_PROTOS
+ #if __STDC__ || defined(__cplusplus)
+ #define P_(s) s
+ #else
+ #define P_(s) ()
+ #endif
+ 
+ /* distress.c */
+ extern void                   bzero P_((void *, size_t));
+ extern char *                 strncpy P_((char *, const char *, size_t));
+ extern char *                 strncat P_((char *, const char *, size_t));
+ extern char *                 strcat P_((char *, const char *));
+ extern int                    fprintf P_((FILE *, const char *, ...));
+ extern int                    printf P_((const char *, ...));
+ extern int                    atoi P_((const char *));
+ extern void *                 malloc P_((size_t));
+ extern int                    toupper P_((int));
+ 
+ #undef P_
+ #endif
+ 
+ char *strcap();
+ 
+ /* This takes an MDISTR flagged message and makes it into a dist struct */
+ void
+ HandleGenDistr(message, from, to, dist)
+    char                           *message;
+    struct distress                *dist;
+    unsigned char                   from, to;
+ {
+ 
+    char                           *mtext;
+    unsigned char                   i;
+ 
+    mtext = &message[ADDRLEN];
+    bzero((char *) dist, sizeof(dist));
+ 
+    dist->sender = from;
+    dist->distype = mtext[0] & 0x1f;
+    dist->macroflag = ((mtext[0] & 0x20) > 0);
+    dist->fuelp = mtext[1] & 0x7f;
+    dist->dam = mtext[2] & 0x7f;
+    dist->shld = mtext[3] & 0x7f;
+    dist->etmp = mtext[4] & 0x7f;
+    dist->wtmp = mtext[5] & 0x7f;
+    dist->arms = mtext[6] & 0x1f;
+    dist->sts = mtext[7] & 0x7f;
+    dist->wtmpflag = ((dist->sts & PFWEP) > 0) ? 1 : 0;
+    dist->etempflag = ((dist->sts & PFENG) > 0) ? 1 : 0;
+    dist->cloakflag = ((dist->sts & PFCLOAK) > 0) ? 1 : 0;
+    dist->close_pl = mtext[8] & 0x7f;
+    dist->close_en = mtext[9] & 0x7f;
+    dist->tclose_pl = mtext[10] & 0x7f;
+    dist->tclose_en = mtext[11] & 0x7f;
+    dist->tclose_j = mtext[12] & 0x7f;
+    dist->close_j = mtext[13] & 0x7f;
+    dist->tclose_fr = mtext[14] & 0x7f;
+    dist->close_fr = mtext[15] & 0x7f;
+    i = 0;
+    while ((mtext[16 + i] & 0xc0) == 0xc0 && (i < 6)) {
+       dist->cclist[i] = mtext[16 + i] & 0x1f;
+       i++;
+    }
+    dist->cclist[i] = mtext[16 + i];
+    if (dist->cclist[i] == 0x80)
+       dist->pre_app = 1;
+    else
+       dist->pre_app = 0;
+    dist->preappend[0] = '\0';
+ 
+    if (mtext[16 + i + 1] != '\0') {
+       strncpy(dist->preappend, &mtext[16 + i + 1], MSG_LEN - 1);
+       dist->preappend[MSG_LEN - 1] = '\0';
+    }
+ }
+ /* this converts a dist struct to the appropriate text
+    (excludes F1->FED text bit).. sorry if this is not what we said
+    earlier jeff.. but I lost the paper towel I wrote it all down on */
+ 
+ void
+ Dist2Mesg(dist, buf)
+    struct distress                *dist;
+    char                           *buf;
+ {
+    int                             len, i;
+    sprintf(buf, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
+ 	   (dist->macroflag << 5) + (dist->distype),
+ 	   dist->fuelp | 0x80,
+ 	   dist->dam | 0x80,
+ 	   dist->shld | 0x80,
+ 	   dist->etmp | 0x80,
+ 	   dist->wtmp | 0x80,
+ 	   dist->arms | 0x80,
+ 	   dist->sts | 0x80,
+ 	   dist->close_pl | 0x80,
+ 	   dist->close_en | 0x80,
+ 	   dist->tclose_pl | 0x80,
+ 	   dist->tclose_en | 0x80,
+ 	   dist->tclose_j | 0x80,
+ 	   dist->close_j | 0x80,
+ 	   dist->tclose_fr | 0x80,
+ 	   dist->close_fr | 0x80);
+ 
+    /* cclist better be terminated properly otherwise we hose here */
+    i = 0;
+    while (((dist->cclist[i] & 0xc0) == 0xc0)) {
+       buf[16 + i] = dist->cclist[i];
+       i++;
+    }
+    /* get the pre/append cclist terminator in there */
+    buf[16 + i] = dist->cclist[i];
+    buf[16 + i + 1] = '\0';
+ 
+    len = 16 + i + 1;
+    if (dist->preappend[0] != '\0') {
+       strncat(buf, dist->preappend, MSG_LEN - len);	/* false sense of security? */
+       buf[MSG_LEN - 1] = '\0';
+    }
+ }
+ /* small permutation on the newmacro code... this takes a pointer to
+    ** a distress structure and a pointer to a macro syntax string,
+    ** and converts it into a line of text.
+    **  9/1/93 - jn
+  */
+ int
+ makedistress(dist, cry, pm)
+    struct distress                *dist;	/* the info */
+    char                           *cry;	/* the call for help! (output) - should be array */
+    char                           *pm;	/* macro to parse, used for distress and macro */
+ {
+    char                            buf1[10 * MAXMACLEN];
+    char                            buf2[10 * MAXMACLEN];
+    char                            buf3[10 * MAXMACLEN];
+    char                            tmp[10 * MAXMACLEN];
+    int                             index = 0;
+    int                             index2 = 0;
+    int                             index3 = 0;
+    int                             state = 0;
+    int                             cap = 0;
+    int                             team = 0;
+    struct player                  *sender;
+    struct player                  *j;
+    struct planet                  *l;
+    char                            c;
+ 
+ 
+    sender = &players[dist->sender];
+ 
+    buf1[0] = '\0';
+ 
+    /* first step is to substitute variables */
+    while (*pm) {
+       if (state) {
+ 	 switch (c = *(pm++)) {
+ 	 case 'a':		/* push army number into buf */
+ 	    sprintf(tmp, "%d\0", dist->arms);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'd':		/* push damage into buf */
+ 	    sprintf(tmp, "%d", dist->dam);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 's':		/* push shields into buf */
+ 	    sprintf(tmp, "%d", dist->shld);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'f':		/* push fuel into buf */
+ 	    sprintf(tmp, "%d", dist->fuelp);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'w':		/* push wtemp into buf */
+ 	    sprintf(tmp, "%d", dist->wtmp);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'e':		/* push etemp into buf */
+ 	    sprintf(tmp, "%d", dist->etmp);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case 'P':		/* push player id into buf */
+ 	 case 'G':		/* push friendly player id into buf */
+ 	 case 'H':		/* push enemy target player id into buf */
+ 
+ 	 case 'p':		/* push player id into buf */
+ 	 case 'g':		/* push friendly player id into buf */
+ 	 case 'h':		/* push enemy target player id into buf */
+ 
+ 	    switch (c) {
+ 	    case 'p':
+ 	       j = &players[dist->tclose_j];
+ 	       break;
+ 	    case 'g':
+ 	       j = &players[dist->tclose_fr];
+ 	       break;
+ 	    case 'h':
+ 	       j = &players[dist->tclose_en];
+ 	       break;
+ 	    case 'P':
+ 	       j = &players[dist->close_j];
+ 	       break;
+ 	    case 'G':
+ 	       j = &players[dist->close_fr];
+ 	       break;
+ 	    default:
+ 	       j = &players[dist->close_en];
+ 	       break;
+ 	    }
+ 	    tmp[0] = j->p_mapchars[1];
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case 'n':		/* push planet armies into buf */
+ 	    l = &planets[dist->tclose_pl];
+ 	    if (l->pl_info & sender->p_team)
+ 	       sprintf(tmp, "%d", l->pl_armies);
+ 	    else
+ 	       sprintf(tmp, "%d", -1);
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'B':
+ 	    cap = 1;
+ 	 case 'b':		/* push planet into buf */
+ 	    l = &planets[dist->close_pl];
+ 	    tmp[0] = l->pl_name[0] - 'A' + 'a';
+ 	    tmp[1] = l->pl_name[1];
+ 	    tmp[2] = l->pl_name[2];
+ 	    tmp[3] = '\0';
+ 	    strcat(buf1, TESTCAP(cap, tmp));
+ 	    cap = 0;
+ 	    state = 0;
+ 	    break;
+ 	 case 'L':
+ 	    cap = 1;
+ 	 case 'l':		/* push planet into buf */
+ 	    l = &planets[dist->tclose_pl];
+ 	    tmp[0] = l->pl_name[0] - 'A' + 'a';
+ 	    tmp[1] = l->pl_name[1];
+ 	    tmp[2] = l->pl_name[2];
+ 	    tmp[3] = '\0';
+ 	    strcat(buf1, TESTCAP(cap, tmp));
+ 	    cap = 0;
+ 	    state = 0;
+ 	    break;
+ 	 case 'Z':		/* push a 3 character team name into buf */
+ 	    cap = 1;
+ 	 case 'z':		/* push a 3 character team name into buf */
+ 	    l = &planets[dist->tclose_pl];
+ 	    team = l->pl_owner;
+ 	    strcat(buf1, TESTCAP(cap, teamshort[team]));
+ 	    state = 0;
+ 	    cap = 0;
+ 	    break;
+ 	 case 't':		/* push a team character into buf */
+ 	    l = &planets[dist->tclose_pl];
+ 	    tmp[0] = teamlet[l->pl_owner];
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'T':		/* push my team into buf */
+ 	    tmp[0] = teamlet[sender->p_team];
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'c':		/* push my id char into buf */
+ 	    tmp[0] = sender->p_mapchars[1];
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'W':		/* push WTEMP flag into buf */
+ 	    if (dist->wtmpflag)
+ 	       tmp[0] = '1';
+ 	    else
+ 	       tmp[0] = '0';
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'E':		/* push ETEMP flag into buf */
+ 	    if (dist->etempflag)
+ 	       tmp[0] = '1';
+ 	    else
+ 	       tmp[0] = '0';
+ 	    tmp[1] = '\0';
+ 	    strcat(buf1, tmp);
+ 	    state = 0;
+ 	    break;
+ 	 case 'U':		/* push player name into buf */
+ 	    cap = 1;
+ 	 case 'u':		/* push player name into buf */
+ 	    j = &players[dist->tclose_en];
+ 	    strncat(buf1, TESTCAP(cap, j->p_name), 16);
+ 	    state = 0;
+ 	    cap = 0;
+ 	    break;
+ 	 case 'I':		/* my player name into buf */
+ 	    cap = 1;
+ 	 case 'i':		/* my player name into buf */
+ 	    strncat(buf1, TESTCAP(cap, sender->p_name), 16);
+ 	    state = 0;
+ 	    cap = 0;
+ 	    break;
+ 	 case 'S':		/* push ship type into buf */
+ 	    strcat(buf1, shiptypes[sender->p_ship.s_type]);
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case 'v':		/* push average ping round trip time into buf */
+ 	 case 'V':		/* push ping stdev into buf */
+ 	 case 'y':		/* push packet loss into buf */
+ 	    strcat(buf1, "0\0");
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case '}':		/* push %} into buf */
+ 	    strcat(buf1, "%}\0");
+ 	    state = 0;
+ 	    break;
+ 	 case '{':		/* push %{ into buf */
+ 	    strcat(buf1, "%{\0");
+ 	    state = 0;
+ 	    break;
+ 	 case '!':		/* push %! into buf */
+ 	    strcat(buf1, "%!\0");
+ 	    state = 0;
+ 	    break;
+ 	 case '?':		/* push %? into buf */
+ 	    strcat(buf1, "%?\0");
+ 	    state = 0;
+ 	    break;
+ 	 case '%':		/* push %% into buf */
+ 	    strcat(buf1, "%%\0");
+ 	    state = 0;
+ 	    break;
+ 	 default:
+ 	    warning("Bad Macro character in distress!");
+ 	    fprintf(stderr, "Unrecognizable special character in distress pass 1: %c\n", *pm);
+ 	    return (0);
+ 	 }
+       }
+       if (*pm == '%') {
+ 	 state++;
+ 	 pm++;
+ 	 continue;
+       }
+       state = 0;
+ 
+       tmp[0] = *pm;
+       tmp[1] = '\0';
+       strcat(buf1, tmp);
+       pm++;
+    }
+ 
+    /* second step is to evaluate tests, buf1->buf2 */
+    testmacro(buf1, buf2, &index, &index2);
+    buf2[index2] = '\0';
+ 
+    index2 = 0;
+ 
+    /* third step is to include conditional text, buf2->buf3 */
+    condmacro(buf2, buf3, &index2, &index3, 1);
+    buf3[index3] = '\0';
+ 
+    cry[0] = '\0';
+    strncat(cry, buf3, MSG_LEN);
+ 
+    return (index3);
+ }
+ 
+ testmacro(bufa, bufb, inda, indb)
+    char                           *bufa;
+    char                           *bufb;
+    int                            *inda;
+    int                            *indb;
+ {
+    int                             state = 0;
+    if (*indb >= 10 * MAXMACLEN)
+       return;
+ 
+    while (bufa[*inda] && (*indb < 10 * MAXMACLEN)) {
+       if (state) {
+ 	 switch (bufa[(*inda)++]) {
+ 	 case '%':		/* push %% into buf */
+ 	    if (*indb < 10 * MAXMACLEN - 2) {
+ 	       bufb[*indb] = '%';
+ 	       (*indb)++;
+ 	       bufb[*indb] = '%';
+ 	       (*indb)++;
+ 	    } else
+ 	       return;	/* we are full, so we are done */
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case '{':		/* push %{ into buf */
+ 	    if (*indb < 10 * MAXMACLEN - 2) {
+ 	       bufb[*indb] = '%';
+ 	       (*indb)++;
+ 	       bufb[*indb] = '{';
+ 	       (*indb)++;
+ 	    } else
+ 	       return;	/* we are full, so we are done */
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case '}':		/* push %} into buf */
+ 	    if (*indb < 10 * MAXMACLEN - 2) {
+ 	       bufb[*indb] = '%';
+ 	       (*indb)++;
+ 	       bufb[*indb] = '}';
+ 	       (*indb)++;
+ 	    } else
+ 	       return;	/* we are full, so we are done */
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case '!':		/* push %! into buf */
+ 	    if (*indb < 10 * MAXMACLEN - 2) {
+ 	       bufb[*indb] = '%';
+ 	       (*indb)++;
+ 	       bufb[*indb] = '!';
+ 	       (*indb)++;
+ 	    } else
+ 	       return;	/* we are full, so we are done */
+ 	    state = 0;
+ 	    break;
+ 
+ 	 case '?':		/* the dreaded conditional, evaluate it */
+ 	    bufb[*indb] = '0' + solvetest(bufa, inda);
+ 	    (*indb)++;
+ 	    state = 0;
+ 	    break;
+ 
+ 	 default:
+ 	    warning("Bad character in Macro!");
+ 	    fprintf(stderr, 
+ 	       "Unrecognizable special character in macro pass2: %c  Trying to continue.\n",
+ 		   bufa[(*inda) - 1]);
+ 	 }
+       }
+       if (bufa[*inda] == '%') {
+ 	 state++;
+ 	 (*inda)++;
+ 	 continue;
+       }
+       state = 0;
+ 
+ 
+       if (*indb < 10 * MAXMACLEN) {
+ 	 bufb[*indb] = bufa[*inda];
+ 	 (*inda)++;
+ 	 (*indb)++;
+       } else
+ 	 return;
+    }
+ }
+ 
+ solvetest(bufa, inda)
+    char                           *bufa;
+    int                            *inda;
+ {
+    int                             state = 0;
+    char                            bufh[10 * MAXMACLEN];
+    char                            bufc[10 * MAXMACLEN];
+    int                             indh = 0, indc = 0,
+                                    i;
+    char                            operation;
+ 
+ 
+    while (bufa[*inda] &&
+ 	  bufa[*inda] != '<' &&
+ 	  bufa[*inda] != '>' &&
+ 	  bufa[*inda] != '=') {
+ 
+       bufh[indh++] = bufa[(*inda)++];
+    }
+    bufh[indh] = '\0';
+ 
+    operation = bufa[(*inda)++];
+ 
+    while (bufa[*inda] &&
+ 	  !(state &&
+ 	    ((bufa[*inda] == '?') ||
+ 	     (bufa[*inda] == '{')))) {
+ 
+       if (state && (bufa[*inda] == '%' ||
+ 		    bufa[*inda] == '!' ||
+ 		    bufa[*inda] == '}')) {
+ 	 bufc[indc++] = '%';
+       } else if (bufa[*inda] == '%') {
+ 	 state = 1;
+ 	 (*inda)++;
+ 	 continue;
+       }
+       state = 0;
+       bufc[indc++] = bufa[(*inda)++];
+    }
+    bufc[indc] = '\0';
+ 
+    if (bufa[*inda])
+       (*inda)--;
+ 
+    if (!operation)		/* incomplete is truth, just ask Godel */
+       return (1);
+ 
+    switch (operation) {
+    case '=':			/* character by character equality */
+       if (indc != indh)
+ 	 return (0);
+       for (i = 0; i < indc; i++) {
+ 	 if (bufc[i] != bufh[i])
+ 	    return (0);
+       }
+       return (1);
+       break;
+ 
+    case '<':
+       if (atoi(bufh) < atoi(bufc))
+ 	 return (1);
+       else
+ 	 return (0);
+       break;
+ 
+    case '>':
+       if (atoi(bufh) > atoi(bufc))
+ 	 return (1);
+       else
+ 	 return (0);
+       break;
+ 
+    default:
+       warning("Bad operation in Macro!");
+       printf("Unrecognizable operation in macro pass3: %c  Trying to continue.\n",
+ 	     operation);
+       return (1);		/* don't know what happened, pretend we do */
+       break;
+    }
+ }
+ 
+ condmacro(bufa, bufb, inda, indb, flag)
+    char                           *bufa;
+    char                           *bufb;
+    int                            *inda;
+    int                            *indb;
+    int                             flag;
+ {
+    int                             newflag, include;
+    int                             state = 0;
+ 
+ 
+    if (*indb >= MAXMACLEN)
+       return;
+ 
+    include = flag;
+ 
+    while (bufa[*inda] && (*indb < MAXMACLEN)) {
+       if (state) {
+ 	 switch (bufa[(*inda)++]) {
+ 	 case '}':		/* done with this conditional, return */
+ 	    return;
+ 	    break;
+ 
+ 	 case '{':		/* handle new conditional */
+ 	    if (*indb > 0) {
+ 	       (*indb)--;
+ 	       if (bufb[*indb] == '0')
+ 		  newflag = 0;
+ 	       else
+ 		  newflag = 1;
+ 	    } else		/* moron starting with cond, assume true */
+ 	       newflag = 1;
+ 
+ 	    if (include)
+ 	       condmacro(bufa, bufb, inda, indb, newflag);
+ 	    else {
+ 	       (*indb)++;
+ 	       *inda = skipmacro(bufa, *inda);
+ 	    }
+ 
+ 	    state = 0;
+ 	    continue;
+ 	    break;
+ 
+ 	 case '!':		/* handle not indicator */
+ 	    if (flag)
+ 	       include = 0;
+ 	    else
+ 	       include = 1;
+ 
+ 	    state = 0;
+ 	    continue;
+ 	    break;
+ 
+ 	 case '%':		/* push % into buf */
+ 	    if (include) {
+ 	       if (*indb < MAXMACLEN) {
+ 		  bufb[*indb] = '%';
+ 		  (*indb)++;
+ 	       } else
+ 		  return;
+ 	    }
+ 	    state = 0;
+ 	    continue;
+ 
+ 	 default:
+ 	    warning("Bad character in Macro!");
+ 	    printf("Unrecognizable special character in macro pass4: %c  Trying to continue.\n",
+ 		   bufa[(*inda) - 1]);
+ 	 }
+       }
+       if (bufa[*inda] == '%') {
+ 	 state++;
+ 	 (*inda)++;
+ 	 continue;
+       }
+       state = 0;
+ 
+ 
+       if (include) {
+ 	 if (*indb < MAXMACLEN) {
+ 	    bufb[*indb] = bufa[*inda];
+ 	    (*inda)++;
+ 	    (*indb)++;
+ 	 } else
+ 	    return;
+       } else
+ 	 (*inda)++;
+    }
+ }
+ 
+ skipmacro(buf, index)
+    char                            buf[];
+    int                             index;
+ {
+    int                             state = 0;
+    int                             end = 0;
+    if (index == 0)
+       index++;
+ 
+    while (buf[index] && !end) {
+       if (state) {
+ 	 switch (buf[index++]) {
+ 	 case '{':
+ 	    index = skipmacro(buf, index);
+ 	    continue;
+ 	    break;
+ 	 case '}':
+ 	    end = 1;
+ 	    continue;
+ 	    break;
+ 	 case '!':
+ 	 case '%':
+ 	    state = 0;
+ 	    continue;
+ 	    break;
+ 	 default:
+ 	    warning("Bad character in Macro!");
+ 	    printf("Unrecognizable special character in macro pass5: %c  Trying to continue.\n",
+ 		   buf[index]);
+ 	 }
+       }
+       if (buf[index] == '%') {
+ 	 state++;
+ 	 index++;
+ 	 continue;
+       }
+       state = 0;
+       index++;
+    }
+ 
+    return (index);
+ }
+ 
+ /* return a pointer to a capitalized copy of string s */
+ char                           *
+ strcap(s)
+    char                           *s;
+ {
+    char                           *news;
+    int                             lengths;
+    int                             i;
+    char                           *innews, *ins;
+    lengths = strlen(s);
+ 
+    news = (char *) malloc(lengths + 1);
+ 
+    for (i = 0, innews = news, ins = s; i < lengths; i++, innews++, ins++)
+       *innews = toupper(*ins);
+ 
+    news[lengths] = '\0';
+ 
+    return news;
+ }
+ #endif
diff -c -r xsg2.1/dmessage.c xsg-2.1pl3/dmessage.c
*** xsg2.1/dmessage.c	Mon Aug  2 17:16:24 1993
--- xsg-2.1pl3/dmessage.c	Fri Jan 27 17:49:36 1995
***************
*** 20,28 ****
  {
      register int len;
      W_Color color;
  
!     message[79] = '\0';		/* make sure the message isn't garbage */
!     len = strlen(message);
  
      if (from==255) {
  	/* From God */
--- 20,44 ----
  {
      register int len;
      W_Color color;
+ #ifdef RCD
+     struct distress dist;
+ #endif
+     char buf[256];
  
! #ifdef RCD
!     if(flags == (MDISTR | MTEAM | MVALID)){
!        HandleGenDistr(message, from, to, &dist);
!        makedistress(&dist, buf, distmacro[dist.distype].macro);
!     }
!     else{
!        strncpy(buf, message, MSG_LEN);
!        buf[MSG_LEN-1] = 0;
!     }
! #else
!     strncpy(buf, message, MSG_LEN);
!     buf[MSG_LEN-1] = 0;
! #endif
!     len = strlen(buf);
  
      if (from==255) {
  	/* From God */
***************
*** 32,54 ****
      }
      else{
        fprintf(stderr, "Bad 'from' field (%d) for message \"%s\"\n",
! 	 from, message);
        return;
      }
  
      /* Kludge stuff for report kills... 
       */
!     if ((strncmp(message, "GOD->ALL", 8)==0 && 
! 	  (instr(message, "was kill") ||
! 	  instr(message, "killed by"))) || 
! 	  (*message!=' ' && instr(message, "We are being attacked"))) {
  	if (!reportKills) return;
! 	W_WriteText(reviewWin, 0, 0, color, message, len, 0);
  	return;
      }
!     if (!strncmp(message+5, "GOD", 3) && msgBeep)	/* msg to GOD? */
  	W_Beep();
!     W_WriteText(reviewWin, 0, 0, color, message, len, 0);
  
      update_sys_defaults();		/* after "rules of game" message */
  
--- 48,70 ----
      }
      else{
        fprintf(stderr, "Bad 'from' field (%d) for message \"%s\"\n",
! 	 from, buf);
        return;
      }
  
      /* Kludge stuff for report kills... 
       */
!     if ((strncmp(buf, "GOD->ALL", 8)==0 && 
! 	  (instr(buf, "was kill") ||
! 	  instr(buf, "killed by"))) || 
! 	  (*buf!=' ' && instr(buf, "We are being attacked"))) {
  	if (!reportKills) return;
! 	W_WriteText(reviewWin, 0, 0, color, buf, len, 0);
  	return;
      }
!     if (!strncmp(buf+5, "GOD", 3) && msgBeep)	/* msg to GOD? */
  	W_Beep();
!     W_WriteText(reviewWin, 0, 0, color, buf, len, 0);
  
      update_sys_defaults();		/* after "rules of game" message */
  
***************
*** 73,80 ****
      if (oldmctl != mctl->mc_current) {
  	oldmctl++;
  	if (oldmctl>=MAXMESSAGE) oldmctl=0;
! 	dmessage(messages[oldmctl].m_data, 0, (unsigned char)
! 	   messages[oldmctl].m_from, 0);
      }
  }
  
--- 89,96 ----
      if (oldmctl != mctl->mc_current) {
  	oldmctl++;
  	if (oldmctl>=MAXMESSAGE) oldmctl=0;
! 	dmessage(messages[oldmctl].m_data, messages[oldmctl].m_flags, 
! 	   (unsigned char) messages[oldmctl].m_from, 0);
      }
  }
  
diff -c -r xsg2.1/main.c xsg-2.1pl3/main.c
*** xsg2.1/main.c	Mon Aug  2 17:16:25 1993
--- xsg-2.1pl3/main.c	Fri Jan 27 17:49:37 1995
***************
*** 19,24 ****
--- 19,25 ----
  #ifdef RO
  #include <setjmp.h>
  #endif
+ #include <errno.h>
  #include "Wlib.h"
  #include "defs.h"
  #include "xsg_defs.h"
***************
*** 198,209 ****
      for (i=1+mctl->mc_current; i<50; i++) {
         /* potentially exploring uncharted territory here */
  	if(messages[i].m_flags & MVALID)
! 	   dmessage(messages[i].m_data, 0, (unsigned char)messages[i].m_from, 
! 	      0);
      }
      oldmctl=mctl->mc_current;
      for (i=0; i<=oldmctl; i++) {
!         dmessage(messages[i].m_data, 0, (unsigned char)messages[i].m_from, 0);
      }
      msgBeep = mbs;
  }
--- 199,211 ----
      for (i=1+mctl->mc_current; i<50; i++) {
         /* potentially exploring uncharted territory here */
  	if(messages[i].m_flags & MVALID)
! 	   dmessage(messages[i].m_data, messages[i].m_flags, 
! 	      (unsigned char)messages[i].m_from, 0);
      }
      oldmctl=mctl->mc_current;
      for (i=0; i<=oldmctl; i++) {
!         dmessage(messages[i].m_data, messages[i].m_flags, 
! 	   (unsigned char)messages[i].m_from, 0);
      }
      msgBeep = mbs;
  }
***************
*** 686,691 ****
--- 688,694 ----
                        }
                        
                        if (err < 0){
+ 			  if (errno == EINTR) continue;
  			  perror("read");
                            fprintf(stderr, "xsg: Error reading record file\n");
                            exit(-1);
***************
*** 743,748 ****
--- 746,753 ----
                        
                        if (err < 0)
                          {
+                         if (errno == EINTR) continue;
+                         perror("read");
                            fprintf(stderr, "xsg: Error reading record file\n");
                            exit(-1);
                          }
***************
*** 1017,1027 ****
        bcopy(mptr, &size, sizeof(int));
        mptr += sizeof(int);
        if(offset > sizeof(struct memory)){
! 	 fprintf(stderr, "xsg: Corrupted or unknown format.\n");
  	 exit(1);
        }
        if(size > sizeof(struct memory)){
! 	 fprintf(stderr, "xsg: Corrupted or unknown format.\n");
  	 exit(1);
        }
        bcopy(mptr, &nf[offset], size);
--- 1022,1032 ----
        bcopy(mptr, &size, sizeof(int));
        mptr += sizeof(int);
        if(offset > sizeof(struct memory)){
! 	 fprintf(stderr, "xsg: Corrupted or unknown format (offset out of range).\n");
  	 exit(1);
        }
        if(size > sizeof(struct memory)){
! 	 fprintf(stderr, "xsg: Corrupted or unknown format (size out of range).\n");
  	 exit(1);
        }
        bcopy(mptr, &nf[offset], size);
diff -c -r xsg2.1/patchlevel.h xsg-2.1pl3/patchlevel.h
*** xsg2.1/patchlevel.h	Mon Aug  2 17:16:31 1993
--- xsg-2.1pl3/patchlevel.h	Fri Jan 27 17:49:42 1995
***************
*** 1 ****
! #define PATCHLEVEL 0
--- 1 ----
! #define PATCHLEVEL 3
diff -c -r xsg2.1/redraw.c xsg-2.1pl3/redraw.c
*** xsg2.1/redraw.c	Mon Aug  2 17:16:26 1993
--- xsg-2.1pl3/redraw.c	Fri Jan 27 17:49:38 1995
***************
*** 878,883 ****
--- 878,884 ----
     */
    if(playback){
       s = itoa(s, currentFrame, 6, 2);
+      timebuf[6] = (char)NULL;
       W_WriteText(w, W_Textwidth, WINSIDE-W_Textheight, W_Green, 
  	timebuf, s-timebuf, W_BoldFont);
    } 
diff -c -r xsg2.1/smessage.c xsg-2.1pl3/smessage.c
*** xsg2.1/smessage.c	Mon Aug  2 17:16:27 1993
--- xsg-2.1pl3/smessage.c	Fri Jan 27 17:49:38 1995
***************
*** 29,34 ****
--- 29,35 ----
  static char cursor = '_';
  static int counterfeit = 0;
  static int counterfeitFrom = -1;
+ static int counterfeitFlags;
  static int addr_len;
  
  char *getaddr(), *getaddr2();
***************
*** 67,74 ****
--- 68,77 ----
  	    W_RegularFont);
  	addr_len += 2;
  	lcount = addr_len;
+ /* ??
  	if (!messpend)
  	    lcount -= 5;
+ */
  	DRAWCURSOR(lcount);
  	return;
      }
***************
*** 244,250 ****
  	    BLANKCHAR(0, lcount + 1);
  	    warning("Not legal recipient");
  	    counterfeit = 0;
! 	    counterfeitFrom = 0;
  	    return 0;
  	}
  	else {
--- 247,253 ----
  	    BLANKCHAR(0, lcount + 1);
  	    warning("Not legal recipient");
  	    counterfeit = 0;
! 	    counterfeitFrom = -1;
  	    return 0;
  	}
  	else {
***************
*** 274,280 ****
  	else {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = 0;
  	    return(0);
  	}
  	break;
--- 277,283 ----
  	else {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = -1;
  	    return(0);
  	}
  	break;
***************
*** 288,294 ****
  	if (who-'a'+10 > MAXPLAYER) {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = 0;
  	    return(0);
  	}
  	if (isAlive(&players[who - 'a' + 10])
--- 291,297 ----
  	if (who-'a'+10 > MAXPLAYER) {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = -1;
  	    return(0);
  	}
  	if (isAlive(&players[who - 'a' + 10])
***************
*** 301,307 ****
  	else {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = 0;
  	    return(0);
  	}
  	break;
--- 304,310 ----
  	else {
  	    warning("Player is not in game");
  	    counterfeit = 0;
! 	    counterfeitFrom = -1;
  	    return(0);
  	}
  	break;
***************
*** 308,314 ****
      default:
  	warning("Not legal recipient");
  	counterfeit = 0;
! 	counterfeitFrom = 0;
  	return(0);
      }
  }
--- 311,317 ----
      default:
  	warning("Not legal recipient");
  	counterfeit = 0;
! 	counterfeitFrom = -1;
  	return(0);
      }
  }
***************
*** 319,331 ****
  {
      static char addrmesg[32];		/* increased, TSH 2/93 */
      int		i;
  
      if (!counterfeit)
  	sprintf(addrmesg, "%s->", godsname);	/* TSH 2/93 */
!     else if (counterfeitFrom < 0) {
! 	messpend = 0;
! 	counterfeitFrom = recip;
! 	switch(flags) {
  	case MALL:
  	    (void) sprintf(addrmesg, "ALL->");
  	    break;
--- 322,341 ----
  {
      static char addrmesg[32];		/* increased, TSH 2/93 */
      int		i;
+     int		nflags, nrecip;
  
      if (!counterfeit)
  	sprintf(addrmesg, "%s->", godsname);	/* TSH 2/93 */
!     else {
! 	if(counterfeitFrom >= 0){
! 	    nflags = counterfeitFlags;
! 	    nrecip = counterfeitFrom;
! 	}
! 	else {
! 	    nflags = flags;
! 	    nrecip = recip;
! 	}
! 	switch(nflags) {
  	case MALL:
  	    (void) sprintf(addrmesg, "ALL->");
  	    break;
***************
*** 333,347 ****
  	    (void) sprintf(addrmesg, "GOD->");
  	    break;
  	case MTEAM:
! 	    (void) sprintf(addrmesg, "%s->", teamshort[recip]);
  	    break;
  	case MINDIV:
  	    (void) sprintf(addrmesg, " %c%c->",
! 			   teamlet[players[recip].p_team], shipnos[recip]);
  	    break;
  	}
  	return addrmesg;
      }
      i = strlen(addrmesg);
      switch(flags) {
      case MALL:
--- 343,363 ----
  	    (void) sprintf(addrmesg, "GOD->");
  	    break;
  	case MTEAM:
! 	    (void) sprintf(addrmesg, "%s->", teamshort[nrecip]);
  	    break;
  	case MINDIV:
  	    (void) sprintf(addrmesg, " %c%c->",
! 			   teamlet[players[nrecip].p_team], shipnos[nrecip]);
  	    break;
  	}
+     }
+     if (counterfeit && counterfeitFrom < 0) {
+ 	messpend = 0;
+ 	counterfeitFrom = recip;
+ 	counterfeitFlags = flags;
  	return addrmesg;
      }
+ 
      i = strlen(addrmesg);
      switch(flags) {
      case MALL:
diff -c -r xsg2.1/sysdefaults.c xsg-2.1pl3/sysdefaults.c
*** xsg2.1/sysdefaults.c	Mon Aug  2 17:16:27 1993
--- xsg-2.1pl3/sysdefaults.c	Fri Jan 27 17:49:39 1995
***************
*** 21,31 ****
  
  static struct stat oldstat;
  
- char *shiptypes[NUM_TYPES] = {"SC", "DD", "CA", "BB", "AS", "SB",
- #ifdef GALAXY
- 	"GA",
- #endif
- 	"??"};
  char *weapontypes[WP_MAX] = {"PLASMA", "TRACTOR"
  #ifdef HAS_SCANNER
  , "SCANNER"
--- 21,26 ----
