//STEP 1: If you want the transluscent fade out effects to work, you will
//   need to CHANGE ALLLLLLLLLLLLLLL GAMETEXTS TO HAVE THE EXTRA DABITS
//   PARAMETER!!!!!!  Call GAMETEXT with dabits as 2+8+16 everywhere
//   except for the new transluscence fade-out stuff I did

int gametext(int x,int y,char *t,char s,short dabits)
	...
	rotatesprite(x<<16,y<<16,65536L,0,ac,s,0,dabits,0,0,xdim-1,ydim-1);


//STEP 2: Remove user_quote_time,user_quote,typebuflen,typebuf from
//   DUKE3D.H&GLOBAL.C and stick this in GAME.C:
#define MAXUSERQUOTES 4
long quotebot, quotebotgoal;
short user_quote_time[MAXUSERQUOTES];
char user_quote[MAXUSERQUOTES][128];
char typebuflen,typebuf[41];

adduserquote(char *daquote)
{
	long i;

	for(i=MAXUSERQUOTES-1;i>0;i--)
	{
		strcpy(user_quote[i],user_quote[i-1]);
		user_quote_time[i] = user_quote_time[i-1];
	}
	strcpy(user_quote[0],daquote);
	user_quote_time[0] = 180;
	pub = NUMPAGES;
}

//STEP 3: In GAME.C, make all references of user_quote call the
//   adduserquote function instead, for example, look at this case:

Getpackets:
				 case 4:
					 strcpy(recbuf,packbuf+1);
					 recbuf[packbufleng-1] = 0;

					 adduserquote(recbuf);
					 sound(EXITMENUSOUND);

					 pus = NUMPAGES;
					 pub = NUMPAGES;

					 break;

  //FULLY REPLACE THIS FUNCTION
void operatefta(void)
{
	 long i, j, k;

	 if(ud.screen_size > 0) j = 200-45; else j = 200-8;
	 quotebot = min(quotebot,j);
	 quotebotgoal = min(quotebotgoal,j);
	 if(ps[myconnectindex].gm&MODE_TYPE) j -= 8;
	 quotebotgoal = j; j = quotebot;
	 for(i=0;i<MAXUSERQUOTES;i++)
	 {
		 k = user_quote_time[i]; if (k <= 0) break;

			  if (k > 16) gametext(320>>1,j,user_quote[i],0,2+8+16);
		 else if (k > 8) gametext(320>>1,j,user_quote[i],0,2+8+16+1);
						else gametext(320>>1,j,user_quote[i],0,2+8+16+1+32);
		 j -= 8;
	 }

	 if (ps[screenpeek].fta <= 1) return;

	 if (ud.coop != 1 && ud.screen_size > 0 && ud.multimode > 1)
	 {
		 j = 0; k = 8;
		 for(i=connecthead;i>=0;i=connectpoint2[i])
			 if (i > j) j = i;

		 if (j >= 4 && j <= 8) k += 8;
		 else if (j > 8 && j <= 12) k += 16;
		 else if (j > 12) k += 24;
	 }
	 else k = 0;

	 if (ps[screenpeek].ftq == 115 || ps[screenpeek].ftq == 116)
	 {
		 k = quotebot;
		 for(i=0;i<MAXUSERQUOTES;i++)
		 {
			 if (user_quote_time[i] <= 0) break;
			 k -= 8;
		 }
		 k -= 4;
	 }

	 j = ps[screenpeek].fta;
		  if (j > 16) gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16);
	 else if (j > 8) gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16+1);
					else gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16+1+32);
}

	//FULLY REPLACE THIS FUNCTION
void typemode(void)
{
	 short ch, hitstate, i, j;

	 if( ps[myconnectindex].gm&MODE_SENDTOWHOM )
	 {
		  if(sendmessagecommand != -1 || ud.multimode < 3)
		  {
				tempbuf[0] = 4;
				tempbuf[1] = 0;
				recbuf[0]  = 0;

				if(ud.multimode < 3)
					 sendmessagecommand = 2;

				strcat(recbuf,ud.user_name[myconnectindex]);
				strcat(recbuf,": ");
				strcat(recbuf,typebuf);
				j = strlen(recbuf);
				recbuf[j] = 0;
				strcat(tempbuf+1,recbuf);

				if(sendmessagecommand >= ud.multimode)
				{
					 for(ch=connecthead;ch >= 0;ch=connectpoint2[ch])
						  if (ch != myconnectindex)
								sendpacket(ch,tempbuf,j+1);

					 adduserquote(recbuf);
					 quotebot += 8;
					 quotebotgoal = quotebot;
				}
				else if(sendmessagecommand >= 0)
					 sendpacket(sendmessagecommand,tempbuf,j+1);

				sendmessagecommand = -1;
				ps[myconnectindex].gm &= ~(MODE_TYPE|MODE_SENDTOWHOM);
		  }
		  else if(sendmessagecommand == -1)
		  {
				j = 50;
				gametext(320>>1,j,"SEND MESSAGE TO...",0,2+8+16); j += 8;
				for(i=0;i<ud.multimode;i++)
				{
					 if (i == myconnectindex)
					 {
						 minitextshade((320>>1)-40+1,j+1,"A/ENTER - ALL",26,0,2+8+16);
						 minitext((320>>1)-40,j,"A/ENTER - ALL",0,2+8+16); j += 7;
					 }
					 else
					 {
						 sprintf(buf,"      %ld - %s",i+1,ud.user_name[i]);
						 minitextshade((320>>1)-40-6+1,j+1,buf,26,0,2+8+16);
						 minitext((320>>1)-40-6,j,buf,0,2+8+16); j += 7;
					 }
				}
				minitextshade((320>>1)-40-4+1,j+1,"    ESC - Abort",26,0,2+8+16);
				minitext((320>>1)-40-4,j,"    ESC - Abort",0,2+8+16); j += 7;

				//sprintf(buf,"PRESS 1-%ld FOR INDIVIDUAL PLAYER.",ud.multimode);
				//gametext(320>>1,j,buf,0,2+8+16); j += 8;
				//gametext(320>>1,j,"'A' OR 'ENTER' FOR ALL PLAYERS",0,2+8+16); j += 8;
				//gametext(320>>1,j,"ESC ABORTS",0,2+8+16); j += 8;

				if (ud.screen_size > 0) j = 200-45; else j = 200-8;
				gametext(320>>1,j,typebuf,0,2+8+16);

				if( KB_KeyWaiting() )
				{
					 i = KB_GetCh();
					 if(i == 'A' || i == 'a' || i == 13)
						  sendmessagecommand = ud.multimode;
					 else if(i >= '1' || i <= (ud.multimode + '1') )
						  sendmessagecommand = i - '1';
					 else
					 {
						  ps[myconnectindex].gm &= ~(MODE_TYPE|MODE_SENDTOWHOM);
						  sendmessagecommand = -1;
						  typebuf[0] = 0;
					 }

					 KB_ClearKeyDown(sc_1);
					 KB_ClearKeyDown(sc_2);
					 KB_ClearKeyDown(sc_3);
					 KB_ClearKeyDown(sc_4);
					 KB_ClearKeyDown(sc_5);
					 KB_ClearKeyDown(sc_6);
					 KB_ClearKeyDown(sc_7);
					 KB_ClearKeyDown(sc_8);
					 KB_ClearKeyDown(sc_A);
					 KB_ClearKeyDown(sc_Escape);
					 KB_ClearKeyDown(sc_Enter);
				}
		  }
	 }
	 else
	 {
		  if(ud.screen_size > 0) j = 200-45; else j = 200-8;
		  hitstate = strget(320>>1,j,typebuf,30,1);

		  if(hitstate == 1)
		  {
				KB_ClearKeyDown(sc_Enter);
				ps[myconnectindex].gm |= MODE_SENDTOWHOM;
		  }
		  else if(hitstate == -1)
				ps[myconnectindex].gm &= ~(MODE_TYPE|MODE_SENDTOWHOM);
		  else pub = NUMPAGES;
	 }
}

//domovethings - in middle, where you used to decrement user_quote_time,
//replace with this:
	 for(i=0;i<MAXUSERQUOTES;i++)
		 if (user_quote_time[i])
		 {
			 user_quote_time[i]--;
			 if (!user_quote_time[i]) pub = NUMPAGES;
		 }
	 if ((klabs(quotebotgoal-quotebot) <= 16) && (ud.screen_size <= 8))
		 quotebot += ksgn(quotebotgoal-quotebot);
	 else
		 quotebot = quotebotgoal;
