Source:NetHack 3.1.0/pline.c

Below is the full text to pline.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/pline.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /*	SCCS Id: @(#)pline.c	3.1	92/11/20	*/ 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* NetHack may be freely redistributed. See license for details. */ 4.     5.    #define NEED_VARARGS /* Uses ... */	/* comment line for pre-compiled headers */ 6.   #include "hack.h"  7.    #include "epri.h"  8. 9.   #ifndef OVLB 10.  STATIC_DCL boolean no_repeat; 11.  #else /* OVLB */ 12.  STATIC_OVL boolean no_repeat = FALSE; 13.  #endif /* OVLB */ 14.   15.   #ifdef OVLB 16.  static char *FDECL(You_buf, (int)); 17.   18.   /*VARARGS1*/ 19.  /* Note that these declarations rely on knowledge of the internals 20.   * of the variable argument handling stuff in "tradstdc.h"  21. */ 22.    23.   #if defined(USE_STDARG) || defined(USE_VARARGS) 24.  static void FDECL(vpline, (const char *, va_list)); 25.   26.   void 27.  pline VA_DECL(const char *, line) 28.  	VA_START(line); 29.  	VA_INIT(line, char *); 30.  	vpline(line, VA_ARGS); 31.  	VA_END; 32.  }  33.    34.   # ifdef USE_STDARG 35.  static void 36.  vpline(const char *line, va_list the_args) { 37.  # else 38.  static void 39.  vpline(line, the_args) const char *line; va_list the_args; { 40.  # endif 41.   42.   #else	/* USE_STDARG | USE_VARARG */ 43.   44.   #define vpline pline 45.   46.   void 47.  pline VA_DECL(const char *, line) 48.  #endif	/* USE_STDARG | USE_VARARG */ 49.   50.   	char pbuf[BUFSZ]; 51.  /* Do NOT use VA_START and VA_END in here... see above */ 52.   53.   	if(!line || !*line) return; 54.  	if(!index(line, '%')) 55.  	    Strcpy(pbuf,line); 56.  	else 57.  	    Vsprintf(pbuf,line,VA_ARGS); 58.  	if(!flags.window_inited) { 59.  	    raw_print(pbuf); 60.  	    return; 61.  	}  62.   #ifndef MAC 63.  	if(no_repeat && !strcmp(pbuf, toplines)) 64.  	    return; 65.  #endif /* MAC */ 66.  	if (vision_full_recalc) vision_recalc(0); 67.  	if (u.ux) flush_screen(1);		/* %% */ 68.  	putstr(WIN_MESSAGE, 0, pbuf); 69.  }  70.    71.   /*VARARGS1*/ 72.  void 73.  Norep VA_DECL(const char *, line) 74.  	VA_START(line); 75.  	VA_INIT(line, const char *); 76.  	no_repeat = TRUE; 77.  	vpline(line, VA_ARGS); 78.  	no_repeat = FALSE; 79.  	VA_END; 80.  	return; 81.  }  82.    83.   /* work buffer for You, Your, and verbalize */ 84.  static char *you_buf = 0; 85.  static int you_buf_siz = 0; 86.   87.   static char * 88.  You_buf(siz) int siz; { 89.  	if (siz > you_buf_siz) { 90.  		if (you_buf_siz > 0) free((genericptr_t) you_buf); 91.  		you_buf_siz = siz + 10; 92.  		you_buf = (char *) alloc((unsigned) you_buf_siz); 93.  	}  94.   	return you_buf; 95.  }  96.    97.   /*VARARGS1*/ 98.  void 99.  You VA_DECL(const char *, line) 100. 	char *tmp; 101. 	VA_START(line); 102. 	VA_INIT(line, const char *); 103. 	tmp = You_buf((int)strlen(line) + 5); 104. 	Strcpy(tmp, "You "); 105. 	Strcat(tmp, line); 106. 	vpline(tmp, VA_ARGS); 107. 	VA_END; 108. }  109.   110.  /*VARARGS1*/ 111. void 112. Your VA_DECL(const char *,line) 113. 	char *tmp; 114. 	VA_START(line); 115. 	VA_INIT(line, const char *); 116. 	tmp = You_buf((int)strlen(line) + 6); 117. 	Strcpy(tmp, "Your "); 118. 	Strcat(tmp, line); 119. 	vpline(tmp, VA_ARGS); 120. 	VA_END; 121. }  122.   123.  /*VARARGS1*/ 124. void 125. verbalize VA_DECL(const char *,line) 126. 	char *tmp; 127. 	if (!flags.soundok) return; 128. 	VA_START(line); 129. 	VA_INIT(line, const char *); 130. 	tmp = You_buf((int)strlen(line) + 3); 131. 	Strcpy(tmp, "\"");  132.  	Strcat(tmp, line);  133.  	Strcat(tmp, "\""); 134. 	vpline(tmp, VA_ARGS); 135. 	VA_END; 136. }  137.   138.  /*VARARGS1*/ 139. /* Note that these declarations rely on knowledge of the internals 140.  * of the variable argument handling stuff in "tradstdc.h"  141. */ 142.   143.  #if defined(USE_STDARG) || defined(USE_VARARGS) 144. static void FDECL(vraw_printf,(const char *,va_list)); 145.  146.  void 147. raw_printf VA_DECL(const char *, line) 148. 	VA_START(line); 149. 	VA_INIT(line, char *); 150. 	vraw_printf(line, VA_ARGS); 151. 	VA_END; 152. }  153.   154.  # ifdef USE_STDARG 155. static void 156. vraw_printf(const char *line, va_list the_args) { 157. # else 158. static void 159. vraw_printf(line, the_args) const char *line; va_list the_args; { 160. # endif 161.  162.  #else  /* USE_STDARG | USE_VARARG */ 163.  164.  void 165. raw_printf VA_DECL(const char *, line) 166. #endif 167. /* Do NOT use VA_START and VA_END in here... see above */ 168.  169.  	if(!index(line, '%')) 170. 	    raw_print(line); 171. 	else { 172. 	    char pbuf[BUFSZ]; 173. 	    Vsprintf(pbuf,line,VA_ARGS); 174. 	    raw_print(pbuf); 175. 	}  176.  }  177.   178.   179.  /*VARARGS1*/ 180. void 181. impossible VA_DECL(const char *, s)  182. VA_START(s); 183. 	VA_INIT(s, const char *); 184. 	vpline(s,VA_ARGS); 185. 	pline("Program in disorder - perhaps you'd better Quit."); 186. 	VA_END; 187. }  188.   189.  const char * 190. align_str(alignment) 191.     aligntyp alignment; 192. {  193.      switch ((int)alignment) { 194. 	case A_CHAOTIC: return "chaotic"; 195. 	case A_NEUTRAL: return "neutral"; 196. 	case A_LAWFUL:	return "lawful"; 197. 	case A_NONE:	return "unaligned"; 198.     }  199.      return "unknown"; 200. }  201.   202.  void 203. mstatusline(mtmp) 204. register struct monst *mtmp; 205. {  206.  	aligntyp alignment; 207.  208.  	if (mtmp->ispriest || mtmp->data == &mons[PM_ALIGNED_PRIEST]  209.  				|| mtmp->data == &mons[PM_ANGEL]) 210. 		alignment = EPRI(mtmp)->shralign; 211. 	else 212. 		alignment = mtmp->data->maligntyp; 213.  214.  	alignment = (alignment > 0) ? A_LAWFUL : 215. 		(alignment < 0) ? A_CHAOTIC : 216. 		A_NEUTRAL; 217. 	pline("Status of %s (%s):  Level %d  Gold %lu  HP %d(%d) AC %d%s%s",  218.  		mon_nam(mtmp),  219.  		align_str(alignment),  220.  		mtmp->m_lev,  221.  		mtmp->mgold,  222.  		mtmp->mhp,  223.  		mtmp->mhpmax,  224.  		find_mac(mtmp),  225.  		mtmp->mcan ? ", cancelled" : "",  226.  		mtmp->mtame ? ", tame" : ""); 227. }  228.   229.  void 230. ustatusline 231. {  232.  	pline("Status of %s (%s%s):  Level %d  Gold %lu  HP %d(%d)  AC %d",  233.  		plname,  234.  		    (u.ualign.record >= 20) ? "piously " :  235.  		    (u.ualign.record > 13) ? "devoutly " :  236.  		    (u.ualign.record > 8) ? "fervently " :  237.  		    (u.ualign.record > 3) ? "stridently " :  238.  		    (u.ualign.record == 3) ? "" :  239.  		    (u.ualign.record >= 1) ? "haltingly " :  240.  		    (u.ualign.record == 0) ? "nominally " :  241.  					    "insufficiently ",  242.  		align_str(u.ualign.type),  243.  # ifdef POLYSELF  244.  		u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel,  245.  		u.ugold,  246.  		u.mtimedone ? u.mh : u.uhp,  247.  		u.mtimedone ? u.mhmax : u.uhpmax,  248.  # else  249.  		u.ulevel,  250.  		u.ugold,  251.  		u.uhp,  252.  		u.uhpmax,  253.  # endif  254.  		u.uac); 255. }  256.   257.  #endif /* OVLB */ 258.  259.  /*pline.c*/