Wikia

Wikihack

Source:Pline.c

2,032pages on
this wiki
Talk0

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

Top of file Edit

1.    /*	SCCS Id: @(#)pline.c	3.4	1999/11/28	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #define NEED_VARARGS /* Uses ... */	/* comment line for pre-compiled headers */
6.    #include "hack.h"
7.    #include "epri.h"
8.    #ifdef WIZARD
9.    #include "edog.h"
10.   #endif
11.   
12.   #ifdef OVLB
13.   
14.   static boolean no_repeat = FALSE;
15.   
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.   

pline Edit

pline is the catch-all function that outputs text to the message area. Depending on the GUI used and how many messages there already are in the message area, NetHack may wait for player to press a key at a --more-- prompt before showing the message.

pline accepts a string constant and any number of additional values that replace placeholders marked with '%' in the string constant, just like printf does.

Example:

int count;
for (count = 1; count < 10; count++) {
  pline("%i", count);
}
pline("Hello, player!");
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.   	    Vsprintf(pbuf,line,VA_ARGS);
56.   	    line = pbuf;
57.   	}
58.   	if (!iflags.window_inited) {
59.   	    raw_print(line);
60.   	    return;
61.   	}
62.   #ifndef MAC
63.   	if (no_repeat && !strcmp(line, 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, line);
69.   }
70.   

Norep Edit

Norep() is similar to pline(), but if the same message is repeated after another, it's not shown again.

Example:

int x;
for (x = 0; x < 100; x++) {
  Norep("Whee!");
}


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.   

You_buf Edit

83.   /* work buffer for You(), &c and verbalize() */
84.   static char *you_buf = 0;
85.   static int you_buf_siz = 0;
86.   
87.   static char *
88.   You_buf(siz)
89.   int siz;
90.   {
91.   	if (siz > you_buf_siz) {
92.   		if (you_buf) free((genericptr_t) you_buf);
93.   		you_buf_siz = siz + 10;
94.   		you_buf = (char *) alloc((unsigned) you_buf_siz);
95.   	}
96.   	return you_buf;
97.   }
98.   

free_youbuf Edit

99.   void
100.  free_youbuf()
101.  {
102.  	if (you_buf) free((genericptr_t) you_buf),  you_buf = (char *)0;
103.  	you_buf_siz = 0;
104.  }
105.  
106.  /* `prefix' must be a string literal, not a pointer */
107.  #define YouPrefix(pointer,prefix,text) \
108.   Strcpy((pointer = You_buf((int)(strlen(text) + sizeof prefix))), prefix)
109.  
110.  #define YouMessage(pointer,prefix,text) \
111.   strcat((YouPrefix(pointer, prefix, text), pointer), text)
112.  

You Edit

You() is similar to pline(), but the string is prefixed with "You "

Example:

You("succeed in opening the tin.");
113.  /*VARARGS1*/
114.  void
115.  You VA_DECL(const char *, line)
116.  	char *tmp;
117.  	VA_START(line);
118.  	VA_INIT(line, const char *);
119.  	vpline(YouMessage(tmp, "You ", line), VA_ARGS);
120.  	VA_END();
121.  }
122.  

Your Edit

Your() is similar to pline(), but the string is prefixed with "Your "

Example:

Your("wallet is empty.");
123.  /*VARARGS1*/
124.  void
125.  Your VA_DECL(const char *,line)
126.  	char *tmp;
127.  	VA_START(line);
128.  	VA_INIT(line, const char *);
129.  	vpline(YouMessage(tmp, "Your ", line), VA_ARGS);
130.  	VA_END();
131.  }
132.  

You_feel Edit

You_feel() is similar to pline(), but the string is prefixed with "You feel "

Example:

You_feel("much better!");
133.  /*VARARGS1*/
134.  void
135.  You_feel VA_DECL(const char *,line)
136.  	char *tmp;
137.  	VA_START(line);
138.  	VA_INIT(line, const char *);
139.  	vpline(YouMessage(tmp, "You feel ", line), VA_ARGS);
140.  	VA_END();
141.  }
142.  
143.  

You_cant Edit

You_cant() is similar to pline(), but the string is prefixed with "You can't "

Example:

You_cant("wear that!");
144.  /*VARARGS1*/
145.  void
146.  You_cant VA_DECL(const char *,line)
147.  	char *tmp;
148.  	VA_START(line);
149.  	VA_INIT(line, const char *);
150.  	vpline(YouMessage(tmp, "You can't ", line), VA_ARGS);
151.  	VA_END();
152.  }
153.  

pline_The Edit

pline_The() is similar to pline(), but the string is prefixed with "The "

Example:

pline_The("door resists!");
154.  /*VARARGS1*/
155.  void
156.  pline_The VA_DECL(const char *,line)
157.  	char *tmp;
158.  	VA_START(line);
159.  	VA_INIT(line, const char *);
160.  	vpline(YouMessage(tmp, "The ", line), VA_ARGS);
161.  	VA_END();
162.  }
163.  

There Edit

There() is similar to pline(), but the string is prefixed with "There "

Example:

There("are no seats in here!");
164.  /*VARARGS1*/
165.  void
166.  There VA_DECL(const char *,line)
167.  	char *tmp;
168.  	VA_START(line);
169.  	VA_INIT(line, const char *);
170.  	vpline(YouMessage(tmp, "There ", line), VA_ARGS);
171.  	VA_END();
172.  }
173.  

You_hear Edit

You_hear() is similar to pline(), but the string is prefixed with different things depeneding whether the hero is under water, asleep or awake.

Example:

You_hear("crashing rock.");
174.  /*VARARGS1*/
175.  void
176.  You_hear VA_DECL(const char *,line)
177.  	char *tmp;
178.  	VA_START(line);
179.  	VA_INIT(line, const char *);
180.  	if (Underwater)
181.  		YouPrefix(tmp, "You barely hear ", line);
182.  	else if (u.usleep)
183.  		YouPrefix(tmp, "You dream that you hear ", line);
184.  	else
185.  		YouPrefix(tmp, "You hear ", line);
186.  	vpline(strcat(tmp, line), VA_ARGS);
187.  	VA_END();
188.  }
189.  

verbalize Edit

verbalize() is similar to pline(), but the string is prefixed and suffixed with double quotes, making it seem as if something said it. If hero cannot hear, this outputs nothing.

Example:

verbalize("You freed me!");
190.  /*VARARGS1*/
191.  void
192.  verbalize VA_DECL(const char *,line)
193.  	char *tmp;
194.  	if (!flags.soundok) return;
195.  	VA_START(line);
196.  	VA_INIT(line, const char *);
197.  	tmp = You_buf((int)strlen(line) + sizeof "\"\"");
198.  	Strcpy(tmp, "\"");
199.  	Strcat(tmp, line);
200.  	Strcat(tmp, "\"");
201.  	vpline(tmp, VA_ARGS);
202.  	VA_END();
203.  }
204.  


raw_printf Edit

raw_printf() is only used if the GUI isn't yet initialized, but we still need to tell the player something important. For example, config file errors are output with this. Accepts the same kind of variable parameters as pline().

205.  /*VARARGS1*/
206.  /* Note that these declarations rely on knowledge of the internals
207.   * of the variable argument handling stuff in "tradstdc.h"
208.   */
209.  
210.  #if defined(USE_STDARG) || defined(USE_VARARGS)
211.  static void FDECL(vraw_printf,(const char *,va_list));
212.  
213.  void
214.  raw_printf VA_DECL(const char *, line)
215.  	VA_START(line);
216.  	VA_INIT(line, char *);
217.  	vraw_printf(line, VA_ARGS);
218.  	VA_END();
219.  }
220.  
221.  # ifdef USE_STDARG
222.  static void
223.  vraw_printf(const char *line, va_list the_args) {
224.  # else
225.  static void
226.  vraw_printf(line, the_args) const char *line; va_list the_args; {
227.  # endif
228.  
229.  #else  /* USE_STDARG | USE_VARARG */
230.  
231.  void
232.  raw_printf VA_DECL(const char *, line)
233.  #endif
234.  /* Do NOT use VA_START and VA_END in here... see above */
235.  
236.  	if(!index(line, '%'))
237.  	    raw_print(line);
238.  	else {
239.  	    char pbuf[BUFSZ];
240.  	    Vsprintf(pbuf,line,VA_ARGS);
241.  	    raw_print(pbuf);
242.  	}
243.  }
244.  
245.  

impossible Edit

impossible() is used to tell the player that NetHack thinks something is wrong. This might or might not be bad enough that NetHack will crash. It accepts the same parameters as pline().

246.  /*VARARGS1*/
247.  void
248.  impossible VA_DECL(const char *, s)
249.  	VA_START(s);
250.  	VA_INIT(s, const char *);
251.  	if (program_state.in_impossible)
252.  		panic("impossible called impossible");
253.  	program_state.in_impossible = 1;
254.  	{
255.  	    char pbuf[BUFSZ];
256.  	    Vsprintf(pbuf,s,VA_ARGS);
257.  	    paniclog("impossible", pbuf);
258.  	}
259.  	vpline(s,VA_ARGS);
260.  	pline("Program in disorder - perhaps you'd better #quit.");
261.  	program_state.in_impossible = 0;
262.  	VA_END();
263.  }
264.  

align_str Edit

align_str() takes one parameter, an alignment, and returns a string describing it.

265.  const char *
266.  align_str(alignment)
267.      aligntyp alignment;
268.  {
269.      switch ((int)alignment) {
270.  	case A_CHAOTIC: return "chaotic";
271.  	case A_NEUTRAL: return "neutral";
272.  	case A_LAWFUL:	return "lawful";
273.  	case A_NONE:	return "unaligned";
274.      }
275.      return "unknown";
276.  }
277.  

mstatusline Edit

mstatusline() takes one parameter, a monster, and shows the player a short status of that monster. This is used when probing a monster.

278.  void
279.  mstatusline(mtmp)
280.  register struct monst *mtmp;
281.  {
282.  	aligntyp alignment;
283.  	char info[BUFSZ], monnambuf[BUFSZ];
284.  
285.  	if (mtmp->ispriest || mtmp->data == &mons[PM_ALIGNED_PRIEST]
286.  				|| mtmp->data == &mons[PM_ANGEL])
287.  		alignment = EPRI(mtmp)->shralign;
288.  	else
289.  		alignment = mtmp->data->maligntyp;
290.  	alignment = (alignment > 0) ? A_LAWFUL :
291.  		(alignment < 0) ? A_CHAOTIC :
292.  		A_NEUTRAL;
293.  
294.  	info[0] = 0;
295.  	if (mtmp->mtame) {	  Strcat(info, ", tame");
296.  #ifdef WIZARD
297.  	    if (wizard) {
298.  		Sprintf(eos(info), " (%d", mtmp->mtame);
299.  		if (!mtmp->isminion)
300.  		    Sprintf(eos(info), "; hungry %ld; apport %d",
301.  			EDOG(mtmp)->hungrytime, EDOG(mtmp)->apport);
302.  		Strcat(info, ")");
303.  	    }
304.  #endif
305.  	}
306.  	else if (mtmp->mpeaceful) Strcat(info, ", peaceful");
307.  	if (mtmp->meating)	  Strcat(info, ", eating");
308.  	if (mtmp->mcan)		  Strcat(info, ", cancelled");
309.  	if (mtmp->mconf)	  Strcat(info, ", confused");
310.  	if (mtmp->mblinded || !mtmp->mcansee)
311.  				  Strcat(info, ", blind");
312.  	if (mtmp->mstun)	  Strcat(info, ", stunned");
313.  	if (mtmp->msleeping)	  Strcat(info, ", asleep");
314.  #if 0	/* unfortunately mfrozen covers temporary sleep and being busy
315.  	   (donning armor, for instance) as well as paralysis */
316.  	else if (mtmp->mfrozen)	  Strcat(info, ", paralyzed");
317.  #else
318.  	else if (mtmp->mfrozen || !mtmp->mcanmove)
319.  				  Strcat(info, ", can't move");
320.  #endif
321.  				  /* [arbitrary reason why it isn't moving] */
322.  	else if (mtmp->mstrategy & STRAT_WAITMASK)
323.  				  Strcat(info, ", meditating");
324.  	else if (mtmp->mflee)	  Strcat(info, ", scared");
325.  	if (mtmp->mtrapped)	  Strcat(info, ", trapped");
326.  	if (mtmp->mspeed)	  Strcat(info,
327.  					mtmp->mspeed == MFAST ? ", fast" :
328.  					mtmp->mspeed == MSLOW ? ", slow" :
329.  					", ???? speed");
330.  	if (mtmp->mundetected)	  Strcat(info, ", concealed");
331.  	if (mtmp->minvis)	  Strcat(info, ", invisible");
332.  	if (mtmp == u.ustuck)	  Strcat(info,
333.  			(sticks(youmonst.data)) ? ", held by you" :
334.  				u.uswallow ? (is_animal(u.ustuck->data) ?
335.  				", swallowed you" :
336.  				", engulfed you") :
337.  				", holding you");
338.  #ifdef STEED
339.  	if (mtmp == u.usteed)	  Strcat(info, ", carrying you");
340.  #endif
341.  
342.  	/* avoid "Status of the invisible newt ..., invisible" */
343.  	/* and unlike a normal mon_nam, use "saddled" even if it has a name */
344.  	Strcpy(monnambuf, x_monnam(mtmp, ARTICLE_THE, (char *)0,
345.  	    (SUPPRESS_IT|SUPPRESS_INVISIBLE), FALSE));
346.  
347.  	pline("Status of %s (%s):  Level %d  HP %d(%d)  AC %d%s.",
348.  		monnambuf,
349.  		align_str(alignment),
350.  		mtmp->m_lev,
351.  		mtmp->mhp,
352.  		mtmp->mhpmax,
353.  		find_mac(mtmp),
354.  		info);
355.  }
356.  

ustatusline Edit

ustatusline() shows the player the hero's status as if he was probed.

357.  void
358.  ustatusline()
359.  {
360.  	char info[BUFSZ];
361.  
362.  	info[0] = '\0';
363.  	if (Sick) {
364.  		Strcat(info, ", dying from");
365.  		if (u.usick_type & SICK_VOMITABLE)
366.  			Strcat(info, " food poisoning");
367.  		if (u.usick_type & SICK_NONVOMITABLE) {
368.  			if (u.usick_type & SICK_VOMITABLE)
369.  				Strcat(info, " and");
370.  			Strcat(info, " illness");
371.  		}
372.  	}
373.  	if (Stoned)		Strcat(info, ", solidifying");
374.  	if (Slimed)		Strcat(info, ", becoming slimy");
375.  	if (Strangled)		Strcat(info, ", being strangled");
376.  	if (Vomiting)		Strcat(info, ", nauseated"); /* !"nauseous" */
377.  	if (Confusion)		Strcat(info, ", confused");
378.  	if (Blind) {
379.  	    Strcat(info, ", blind");
380.  	    if (u.ucreamed) {
381.  		if ((long)u.ucreamed < Blinded || Blindfolded
382.  						|| !haseyes(youmonst.data))
383.  		    Strcat(info, ", cover");
384.  		Strcat(info, "ed by sticky goop");
385.  	    }	/* note: "goop" == "glop"; variation is intentional */
386.  	}
387.  	if (Stunned)		Strcat(info, ", stunned");
388.  #ifdef STEED
389.  	if (!u.usteed)
390.  #endif
391.  	if (Wounded_legs) {
392.  	    const char *what = body_part(LEG);
393.  	    if ((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
394.  		what = makeplural(what);
395.  				Sprintf(eos(info), ", injured %s", what);
396.  	}
397.  	if (Glib)		Sprintf(eos(info), ", slippery %s",
398.  					makeplural(body_part(HAND)));
399.  	if (u.utrap)		Strcat(info, ", trapped");
400.  	if (Fast)		Strcat(info, Very_fast ?
401.  						", very fast" : ", fast");
402.  	if (u.uundetected)	Strcat(info, ", concealed");
403.  	if (Invis)		Strcat(info, ", invisible");
404.  	if (u.ustuck) {
405.  	    if (sticks(youmonst.data))
406.  		Strcat(info, ", holding ");
407.  	    else
408.  		Strcat(info, ", held by ");
409.  	    Strcat(info, mon_nam(u.ustuck));
410.  	}
411.  
412.  	pline("Status of %s (%s%s):  Level %d  HP %d(%d)  AC %d%s.",
413.  		plname,
414.  		    (u.ualign.record >= 20) ? "piously " :
415.  		    (u.ualign.record > 13) ? "devoutly " :
416.  		    (u.ualign.record > 8) ? "fervently " :
417.  		    (u.ualign.record > 3) ? "stridently " :
418.  		    (u.ualign.record == 3) ? "" :
419.  		    (u.ualign.record >= 1) ? "haltingly " :
420.  		    (u.ualign.record == 0) ? "nominally " :
421.  					    "insufficiently ",
422.  		align_str(u.ualign.type),
423.  		Upolyd ? mons[u.umonnum].mlevel : u.ulevel,
424.  		Upolyd ? u.mh : u.uhp,
425.  		Upolyd ? u.mhmax : u.uhpmax,
426.  		u.uac,
427.  		info);
428.  }
429.  

self_invis_message Edit

self_invis_message() shows the player a message about the hero's invisibility; this should only be called if the hero just turned invisible.

430.  void
431.  self_invis_message()
432.  {
433.  	pline("%s %s.",
434.  	    Hallucination ? "Far out, man!  You" : "Gee!  All of a sudden, you",
435.  	    See_invisible ? "can see right through yourself" :
436.  		"can't see yourself");
437.  }
438.  
439.  #endif /* OVLB */
440.  /*pline.c*/

Around Wikia's network

Random Wiki