Well rather than put 100s of lines of code in ChangeLog to justify,
the phaser message change, I'll just post my results here:


All checked on 5/19/06 vs. latest versions at ftp.netrek.org
Latest COW/NetrekXP/NetrekXP Mod

  doPhaser = showPhaser && (strncmp(text, "Phaser burst", 12) == 0);

  warncount = strlen(text);

#ifdef PHASER_STATS
  if (doPhaser && phaserShowStats)
    {
      sprintf(newtext, "%s [%2d%%]", text,
	      phaserStatTry ? (phaserStatHit * 100) / phaserStatTry : 0);
      warncount += 6;
      W_WriteText(warnw, 5, 5, textColor, newtext, warncount,
W_RegularFont);
    }
  else
#endif

    W_WriteText(warnw, 5, 5, textColor, text, warncount, W_RegularFont);



COW 2.02
Tested with client, works ok (didn't look at 10 year old source though,
just latest COW)



Ted Turner 1.3.1
    if(!W_IsMapped(warnw)) return;
    if (*count > 0) {
	/* XFIX */
	W_ClearWindow(warnw);
        /*W_ClearArea(warnw, W_XOFF, W_YOFF, W_Textwidth * *count,
W_Textheight);*/
	if(hudwarning)
          W_DirectMaskText(w, center - (*count / 2) * W_Textwidth, y,
	                   backColor, save_buffer, *count, font);
    }
    *count = strlen(text);
    W_WriteText(warnw, W_XOFF, W_YOFF, textColor, text, *count,
                font);
    if(hudwarning) {
      strcpy(save_buffer, text);
      W_DirectMaskText(w, center - (*count / 2) * W_Textwidth, y,
                       color, save_buffer, *count, font); #ifdef BUFFERING
      /* flush the buffer if there is one and we're not playing.
Flushing is
         too slow to do when playing - wait for the next update [BDyess]
*/
      if(me)
      if((me->p_status == PFREE ||
          me->p_status == POUTFIT) &&
	 W_IsBuffered(w))
        W_DisplayBuffer(w); #endif /*BUFFERING [BDyess]*/
    }
    if (strncmp(text, "Phaser", 6) == 0) {
	if (strncmp(text + 7, "missed", 6) == 0) {
	    phasFired++;
	    if (!logPhaserMissed)
		return;
	    thisHit = 0;
	} else if (strncmp(text + 7, "burst", 5) != 0 &&
		   strncmp(text + 7, "shot", 4) != 0)
	    return;
	else { /* a hit! */
	    phasFired++;
	    phasHits++;
	    thisHit = 1;
	}
	if (phaserStats) {
	    if (thisHit) {
		d = &text[strlen(text)];
		while (!isdigit(*d) && d > text) /* find the last number
							   in the string,
should
							   be damage */
		    d--;
		while (d > text && isdigit(*d))
		    d--;
		if (d > text) {
		    dmg = atoi(d);
		    totalDmg += dmg;
		    avgDmg = (float) totalDmg / (float) phasHits;
		    phasRatio = (100 * phasHits) / (float) phasFired;
		    sprintf(newtext, "Av:%5.2f, Hit:%5.2f%%: ", avgDmg,
phasRatio);
		}
	    } else { /* a miss */
		sprintf(newtext, "Hit: %d, Miss: %d, Dmg: %d: ", phasHits,
phasFired - phasHits, totalDmg);
	    }
	} else { /* not keeping phaser stats right now */
	    phasFired--;
	    if (thisHit)
		phasHits--;
	    newtext[0] = '\0';
	}
	strncat(newtext, text, 80);
	len = strlen(newtext);
	newtext[len++] = ' ';
	strcpy(newtext + len, timeString(time(NULL)));
	dmessage(newtext, 0, 254, 0);



Gltrek:
Couldn't find source



BRMH 2.4.0
   warncount = strlen(text);
   if(!recv_short && strncmp(text, "Phaser burst", 12)==0){
      if(phaserWindow){
	 W_WriteText(phaserwin, 0, 0, textColor, text, strlen(text),
W_MesgFont);
	 W_FlushScrollingWindow(phaserwin);
	 return;
      }
      if (phas_msgi){
	 W_WriteText(messwi, 0, 0, textColor, text, strlen(text),
W_MesgFont);
	 return;
      }