hack.pri.c revision 1.1 1 1.1 cgd /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 1.1 cgd /* hack.pri.c - version 1.0.3 */
3 1.1 cgd
4 1.1 cgd #include "hack.h"
5 1.1 cgd #include <stdio.h>
6 1.1 cgd xchar scrlx, scrhx, scrly, scrhy; /* corners of new area on screen */
7 1.1 cgd
8 1.1 cgd extern char *hu_stat[]; /* in eat.c */
9 1.1 cgd extern char *CD;
10 1.1 cgd
11 1.1 cgd swallowed()
12 1.1 cgd {
13 1.1 cgd char *ulook = "|@|";
14 1.1 cgd ulook[1] = u.usym;
15 1.1 cgd
16 1.1 cgd cls();
17 1.1 cgd curs(u.ux-1, u.uy+1);
18 1.1 cgd fputs("/-\\", stdout);
19 1.1 cgd curx = u.ux+2;
20 1.1 cgd curs(u.ux-1, u.uy+2);
21 1.1 cgd fputs(ulook, stdout);
22 1.1 cgd curx = u.ux+2;
23 1.1 cgd curs(u.ux-1, u.uy+3);
24 1.1 cgd fputs("\\-/", stdout);
25 1.1 cgd curx = u.ux+2;
26 1.1 cgd u.udispl = 1;
27 1.1 cgd u.udisx = u.ux;
28 1.1 cgd u.udisy = u.uy;
29 1.1 cgd }
30 1.1 cgd
31 1.1 cgd
32 1.1 cgd /*VARARGS1*/
33 1.1 cgd boolean panicking;
34 1.1 cgd
35 1.1 cgd panic(str,a1,a2,a3,a4,a5,a6)
36 1.1 cgd char *str;
37 1.1 cgd {
38 1.1 cgd if(panicking++) exit(1); /* avoid loops - this should never happen*/
39 1.1 cgd home();
40 1.1 cgd puts(" Suddenly, the dungeon collapses.");
41 1.1 cgd fputs(" ERROR: ", stdout);
42 1.1 cgd printf(str,a1,a2,a3,a4,a5,a6);
43 1.1 cgd #ifdef DEBUG
44 1.1 cgd #ifdef UNIX
45 1.1 cgd if(!fork())
46 1.1 cgd abort(); /* generate core dump */
47 1.1 cgd #endif UNIX
48 1.1 cgd #endif DEBUG
49 1.1 cgd more(); /* contains a fflush() */
50 1.1 cgd done("panicked");
51 1.1 cgd }
52 1.1 cgd
53 1.1 cgd atl(x,y,ch)
54 1.1 cgd register x,y;
55 1.1 cgd {
56 1.1 cgd register struct rm *crm = &levl[x][y];
57 1.1 cgd
58 1.1 cgd if(x<0 || x>COLNO-1 || y<0 || y>ROWNO-1){
59 1.1 cgd impossible("atl(%d,%d,%c)",x,y,ch);
60 1.1 cgd return;
61 1.1 cgd }
62 1.1 cgd if(crm->seen && crm->scrsym == ch) return;
63 1.1 cgd crm->scrsym = ch;
64 1.1 cgd crm->new = 1;
65 1.1 cgd on_scr(x,y);
66 1.1 cgd }
67 1.1 cgd
68 1.1 cgd on_scr(x,y)
69 1.1 cgd register x,y;
70 1.1 cgd {
71 1.1 cgd if(x < scrlx) scrlx = x;
72 1.1 cgd if(x > scrhx) scrhx = x;
73 1.1 cgd if(y < scrly) scrly = y;
74 1.1 cgd if(y > scrhy) scrhy = y;
75 1.1 cgd }
76 1.1 cgd
77 1.1 cgd /* call: (x,y) - display
78 1.1 cgd (-1,0) - close (leave last symbol)
79 1.1 cgd (-1,-1)- close (undo last symbol)
80 1.1 cgd (-1,let)-open: initialize symbol
81 1.1 cgd (-2,let)-change let
82 1.1 cgd */
83 1.1 cgd
84 1.1 cgd tmp_at(x,y) schar x,y; {
85 1.1 cgd static schar prevx, prevy;
86 1.1 cgd static char let;
87 1.1 cgd if((int)x == -2){ /* change let call */
88 1.1 cgd let = y;
89 1.1 cgd return;
90 1.1 cgd }
91 1.1 cgd if((int)x == -1 && (int)y >= 0){ /* open or close call */
92 1.1 cgd let = y;
93 1.1 cgd prevx = -1;
94 1.1 cgd return;
95 1.1 cgd }
96 1.1 cgd if(prevx >= 0 && cansee(prevx,prevy)) {
97 1.1 cgd delay_output();
98 1.1 cgd prl(prevx, prevy); /* in case there was a monster */
99 1.1 cgd at(prevx, prevy, levl[prevx][prevy].scrsym);
100 1.1 cgd }
101 1.1 cgd if(x >= 0){ /* normal call */
102 1.1 cgd if(cansee(x,y)) at(x,y,let);
103 1.1 cgd prevx = x;
104 1.1 cgd prevy = y;
105 1.1 cgd } else { /* close call */
106 1.1 cgd let = 0;
107 1.1 cgd prevx = -1;
108 1.1 cgd }
109 1.1 cgd }
110 1.1 cgd
111 1.1 cgd /* like the previous, but the symbols are first erased on completion */
112 1.1 cgd Tmp_at(x,y) schar x,y; {
113 1.1 cgd static char let;
114 1.1 cgd static xchar cnt;
115 1.1 cgd static coord tc[COLNO]; /* but watch reflecting beams! */
116 1.1 cgd register xx,yy;
117 1.1 cgd if((int)x == -1) {
118 1.1 cgd if(y > 0) { /* open call */
119 1.1 cgd let = y;
120 1.1 cgd cnt = 0;
121 1.1 cgd return;
122 1.1 cgd }
123 1.1 cgd /* close call (do not distinguish y==0 and y==-1) */
124 1.1 cgd while(cnt--) {
125 1.1 cgd xx = tc[cnt].x;
126 1.1 cgd yy = tc[cnt].y;
127 1.1 cgd prl(xx, yy);
128 1.1 cgd at(xx, yy, levl[xx][yy].scrsym);
129 1.1 cgd }
130 1.1 cgd cnt = let = 0; /* superfluous */
131 1.1 cgd return;
132 1.1 cgd }
133 1.1 cgd if((int)x == -2) { /* change let call */
134 1.1 cgd let = y;
135 1.1 cgd return;
136 1.1 cgd }
137 1.1 cgd /* normal call */
138 1.1 cgd if(cansee(x,y)) {
139 1.1 cgd if(cnt) delay_output();
140 1.1 cgd at(x,y,let);
141 1.1 cgd tc[cnt].x = x;
142 1.1 cgd tc[cnt].y = y;
143 1.1 cgd if(++cnt >= COLNO) panic("Tmp_at overflow?");
144 1.1 cgd levl[x][y].new = 0; /* prevent pline-nscr erasing --- */
145 1.1 cgd }
146 1.1 cgd }
147 1.1 cgd
148 1.1 cgd setclipped(){
149 1.1 cgd error("Hack needs a screen of size at least %d by %d.\n",
150 1.1 cgd ROWNO+2, COLNO);
151 1.1 cgd }
152 1.1 cgd
153 1.1 cgd at(x,y,ch)
154 1.1 cgd register xchar x,y;
155 1.1 cgd char ch;
156 1.1 cgd {
157 1.1 cgd #ifndef lint
158 1.1 cgd /* if xchar is unsigned, lint will complain about if(x < 0) */
159 1.1 cgd if(x < 0 || x > COLNO-1 || y < 0 || y > ROWNO-1) {
160 1.1 cgd impossible("At gets 0%o at %d %d.", ch, x, y);
161 1.1 cgd return;
162 1.1 cgd }
163 1.1 cgd #endif lint
164 1.1 cgd if(!ch) {
165 1.1 cgd impossible("At gets null at %d %d.", x, y);
166 1.1 cgd return;
167 1.1 cgd }
168 1.1 cgd y += 2;
169 1.1 cgd curs(x,y);
170 1.1 cgd (void) putchar(ch);
171 1.1 cgd curx++;
172 1.1 cgd }
173 1.1 cgd
174 1.1 cgd prme(){
175 1.1 cgd if(!Invisible) at(u.ux,u.uy,u.usym);
176 1.1 cgd }
177 1.1 cgd
178 1.1 cgd doredraw()
179 1.1 cgd {
180 1.1 cgd docrt();
181 1.1 cgd return(0);
182 1.1 cgd }
183 1.1 cgd
184 1.1 cgd docrt()
185 1.1 cgd {
186 1.1 cgd register x,y;
187 1.1 cgd register struct rm *room;
188 1.1 cgd register struct monst *mtmp;
189 1.1 cgd
190 1.1 cgd if(u.uswallow) {
191 1.1 cgd swallowed();
192 1.1 cgd return;
193 1.1 cgd }
194 1.1 cgd cls();
195 1.1 cgd
196 1.1 cgd /* Some ridiculous code to get display of @ and monsters (almost) right */
197 1.1 cgd if(!Invisible) {
198 1.1 cgd levl[(u.udisx = u.ux)][(u.udisy = u.uy)].scrsym = u.usym;
199 1.1 cgd levl[u.udisx][u.udisy].seen = 1;
200 1.1 cgd u.udispl = 1;
201 1.1 cgd } else u.udispl = 0;
202 1.1 cgd
203 1.1 cgd seemons(); /* reset old positions */
204 1.1 cgd for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
205 1.1 cgd mtmp->mdispl = 0;
206 1.1 cgd seemons(); /* force new positions to be shown */
207 1.1 cgd /* This nonsense should disappear soon --------------------------------- */
208 1.1 cgd
209 1.1 cgd for(y = 0; y < ROWNO; y++)
210 1.1 cgd for(x = 0; x < COLNO; x++)
211 1.1 cgd if((room = &levl[x][y])->new) {
212 1.1 cgd room->new = 0;
213 1.1 cgd at(x,y,room->scrsym);
214 1.1 cgd } else if(room->seen)
215 1.1 cgd at(x,y,room->scrsym);
216 1.1 cgd scrlx = COLNO;
217 1.1 cgd scrly = ROWNO;
218 1.1 cgd scrhx = scrhy = 0;
219 1.1 cgd flags.botlx = 1;
220 1.1 cgd bot();
221 1.1 cgd }
222 1.1 cgd
223 1.1 cgd docorner(xmin,ymax) register xmin,ymax; {
224 1.1 cgd register x,y;
225 1.1 cgd register struct rm *room;
226 1.1 cgd register struct monst *mtmp;
227 1.1 cgd
228 1.1 cgd if(u.uswallow) { /* Can be done more efficiently */
229 1.1 cgd swallowed();
230 1.1 cgd return;
231 1.1 cgd }
232 1.1 cgd
233 1.1 cgd seemons(); /* reset old positions */
234 1.1 cgd for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
235 1.1 cgd if(mtmp->mx >= xmin && mtmp->my < ymax)
236 1.1 cgd mtmp->mdispl = 0;
237 1.1 cgd seemons(); /* force new positions to be shown */
238 1.1 cgd
239 1.1 cgd for(y = 0; y < ymax; y++) {
240 1.1 cgd if(y > ROWNO && CD) break;
241 1.1 cgd curs(xmin,y+2);
242 1.1 cgd cl_end();
243 1.1 cgd if(y < ROWNO) {
244 1.1 cgd for(x = xmin; x < COLNO; x++) {
245 1.1 cgd if((room = &levl[x][y])->new) {
246 1.1 cgd room->new = 0;
247 1.1 cgd at(x,y,room->scrsym);
248 1.1 cgd } else
249 1.1 cgd if(room->seen)
250 1.1 cgd at(x,y,room->scrsym);
251 1.1 cgd }
252 1.1 cgd }
253 1.1 cgd }
254 1.1 cgd if(ymax > ROWNO) {
255 1.1 cgd cornbot(xmin-1);
256 1.1 cgd if(ymax > ROWNO+1 && CD) {
257 1.1 cgd curs(1,ROWNO+3);
258 1.1 cgd cl_eos();
259 1.1 cgd }
260 1.1 cgd }
261 1.1 cgd }
262 1.1 cgd
263 1.1 cgd curs_on_u(){
264 1.1 cgd curs(u.ux, u.uy+2);
265 1.1 cgd }
266 1.1 cgd
267 1.1 cgd pru()
268 1.1 cgd {
269 1.1 cgd if(u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy))
270 1.1 cgd /* if(! levl[u.udisx][u.udisy].new) */
271 1.1 cgd if(!vism_at(u.udisx, u.udisy))
272 1.1 cgd newsym(u.udisx, u.udisy);
273 1.1 cgd if(Invisible) {
274 1.1 cgd u.udispl = 0;
275 1.1 cgd prl(u.ux,u.uy);
276 1.1 cgd } else
277 1.1 cgd if(!u.udispl || u.udisx != u.ux || u.udisy != u.uy) {
278 1.1 cgd atl(u.ux, u.uy, u.usym);
279 1.1 cgd u.udispl = 1;
280 1.1 cgd u.udisx = u.ux;
281 1.1 cgd u.udisy = u.uy;
282 1.1 cgd }
283 1.1 cgd levl[u.ux][u.uy].seen = 1;
284 1.1 cgd }
285 1.1 cgd
286 1.1 cgd #ifndef NOWORM
287 1.1 cgd #include "def.wseg.h"
288 1.1 cgd extern struct wseg *m_atseg;
289 1.1 cgd #endif NOWORM
290 1.1 cgd
291 1.1 cgd /* print a position that is visible for @ */
292 1.1 cgd prl(x,y)
293 1.1 cgd {
294 1.1 cgd register struct rm *room;
295 1.1 cgd register struct monst *mtmp;
296 1.1 cgd register struct obj *otmp;
297 1.1 cgd
298 1.1 cgd if(x == u.ux && y == u.uy && (!Invisible)) {
299 1.1 cgd pru();
300 1.1 cgd return;
301 1.1 cgd }
302 1.1 cgd if(!isok(x,y)) return;
303 1.1 cgd room = &levl[x][y];
304 1.1 cgd if((!room->typ) ||
305 1.1 cgd (IS_ROCK(room->typ) && levl[u.ux][u.uy].typ == CORR))
306 1.1 cgd return;
307 1.1 cgd if((mtmp = m_at(x,y)) && !mtmp->mhide &&
308 1.1 cgd (!mtmp->minvis || See_invisible)) {
309 1.1 cgd #ifndef NOWORM
310 1.1 cgd if(m_atseg)
311 1.1 cgd pwseg(m_atseg);
312 1.1 cgd else
313 1.1 cgd #endif NOWORM
314 1.1 cgd pmon(mtmp);
315 1.1 cgd }
316 1.1 cgd else if((otmp = o_at(x,y)) && room->typ != POOL)
317 1.1 cgd atl(x,y,otmp->olet);
318 1.1 cgd else if(mtmp && (!mtmp->minvis || See_invisible)) {
319 1.1 cgd /* must be a hiding monster, but not hiding right now */
320 1.1 cgd /* assume for the moment that long worms do not hide */
321 1.1 cgd pmon(mtmp);
322 1.1 cgd }
323 1.1 cgd else if(g_at(x,y) && room->typ != POOL)
324 1.1 cgd atl(x,y,'$');
325 1.1 cgd else if(!room->seen || room->scrsym == ' ') {
326 1.1 cgd room->new = room->seen = 1;
327 1.1 cgd newsym(x,y);
328 1.1 cgd on_scr(x,y);
329 1.1 cgd }
330 1.1 cgd room->seen = 1;
331 1.1 cgd }
332 1.1 cgd
333 1.1 cgd char
334 1.1 cgd news0(x,y)
335 1.1 cgd register xchar x,y;
336 1.1 cgd {
337 1.1 cgd register struct obj *otmp;
338 1.1 cgd register struct trap *ttmp;
339 1.1 cgd struct rm *room;
340 1.1 cgd register char tmp;
341 1.1 cgd
342 1.1 cgd room = &levl[x][y];
343 1.1 cgd if(!room->seen) tmp = ' ';
344 1.1 cgd else if(room->typ == POOL) tmp = POOL_SYM;
345 1.1 cgd else if(!Blind && (otmp = o_at(x,y))) tmp = otmp->olet;
346 1.1 cgd else if(!Blind && g_at(x,y)) tmp = '$';
347 1.1 cgd else if(x == xupstair && y == yupstair) tmp = '<';
348 1.1 cgd else if(x == xdnstair && y == ydnstair) tmp = '>';
349 1.1 cgd else if((ttmp = t_at(x,y)) && ttmp->tseen) tmp = '^';
350 1.1 cgd else switch(room->typ) {
351 1.1 cgd case SCORR:
352 1.1 cgd case SDOOR:
353 1.1 cgd tmp = room->scrsym; /* %% wrong after killing mimic ! */
354 1.1 cgd break;
355 1.1 cgd case HWALL:
356 1.1 cgd tmp = '-';
357 1.1 cgd break;
358 1.1 cgd case VWALL:
359 1.1 cgd tmp = '|';
360 1.1 cgd break;
361 1.1 cgd case LDOOR:
362 1.1 cgd case DOOR:
363 1.1 cgd tmp = '+';
364 1.1 cgd break;
365 1.1 cgd case CORR:
366 1.1 cgd tmp = CORR_SYM;
367 1.1 cgd break;
368 1.1 cgd case ROOM:
369 1.1 cgd if(room->lit || cansee(x,y) || Blind) tmp = '.';
370 1.1 cgd else tmp = ' ';
371 1.1 cgd break;
372 1.1 cgd /*
373 1.1 cgd case POOL:
374 1.1 cgd tmp = POOL_SYM;
375 1.1 cgd break;
376 1.1 cgd */
377 1.1 cgd default:
378 1.1 cgd tmp = ERRCHAR;
379 1.1 cgd }
380 1.1 cgd return(tmp);
381 1.1 cgd }
382 1.1 cgd
383 1.1 cgd newsym(x,y)
384 1.1 cgd register x,y;
385 1.1 cgd {
386 1.1 cgd atl(x,y,news0(x,y));
387 1.1 cgd }
388 1.1 cgd
389 1.1 cgd /* used with wand of digging (or pick-axe): fill scrsym and force display */
390 1.1 cgd /* also when a POOL evaporates */
391 1.1 cgd mnewsym(x,y)
392 1.1 cgd register x,y;
393 1.1 cgd {
394 1.1 cgd register struct rm *room;
395 1.1 cgd char newscrsym;
396 1.1 cgd
397 1.1 cgd if(!vism_at(x,y)) {
398 1.1 cgd room = &levl[x][y];
399 1.1 cgd newscrsym = news0(x,y);
400 1.1 cgd if(room->scrsym != newscrsym) {
401 1.1 cgd room->scrsym = newscrsym;
402 1.1 cgd room->seen = 0;
403 1.1 cgd }
404 1.1 cgd }
405 1.1 cgd }
406 1.1 cgd
407 1.1 cgd nosee(x,y)
408 1.1 cgd register x,y;
409 1.1 cgd {
410 1.1 cgd register struct rm *room;
411 1.1 cgd
412 1.1 cgd if(!isok(x,y)) return;
413 1.1 cgd room = &levl[x][y];
414 1.1 cgd if(room->scrsym == '.' && !room->lit && !Blind) {
415 1.1 cgd room->scrsym = ' ';
416 1.1 cgd room->new = 1;
417 1.1 cgd on_scr(x,y);
418 1.1 cgd }
419 1.1 cgd }
420 1.1 cgd
421 1.1 cgd #ifndef QUEST
422 1.1 cgd prl1(x,y)
423 1.1 cgd register x,y;
424 1.1 cgd {
425 1.1 cgd if(u.dx) {
426 1.1 cgd if(u.dy) {
427 1.1 cgd prl(x-(2*u.dx),y);
428 1.1 cgd prl(x-u.dx,y);
429 1.1 cgd prl(x,y);
430 1.1 cgd prl(x,y-u.dy);
431 1.1 cgd prl(x,y-(2*u.dy));
432 1.1 cgd } else {
433 1.1 cgd prl(x,y-1);
434 1.1 cgd prl(x,y);
435 1.1 cgd prl(x,y+1);
436 1.1 cgd }
437 1.1 cgd } else {
438 1.1 cgd prl(x-1,y);
439 1.1 cgd prl(x,y);
440 1.1 cgd prl(x+1,y);
441 1.1 cgd }
442 1.1 cgd }
443 1.1 cgd
444 1.1 cgd nose1(x,y)
445 1.1 cgd register x,y;
446 1.1 cgd {
447 1.1 cgd if(u.dx) {
448 1.1 cgd if(u.dy) {
449 1.1 cgd nosee(x,u.uy);
450 1.1 cgd nosee(x,u.uy-u.dy);
451 1.1 cgd nosee(x,y);
452 1.1 cgd nosee(u.ux-u.dx,y);
453 1.1 cgd nosee(u.ux,y);
454 1.1 cgd } else {
455 1.1 cgd nosee(x,y-1);
456 1.1 cgd nosee(x,y);
457 1.1 cgd nosee(x,y+1);
458 1.1 cgd }
459 1.1 cgd } else {
460 1.1 cgd nosee(x-1,y);
461 1.1 cgd nosee(x,y);
462 1.1 cgd nosee(x+1,y);
463 1.1 cgd }
464 1.1 cgd }
465 1.1 cgd #endif QUEST
466 1.1 cgd
467 1.1 cgd vism_at(x,y)
468 1.1 cgd register x,y;
469 1.1 cgd {
470 1.1 cgd register struct monst *mtmp;
471 1.1 cgd
472 1.1 cgd return((x == u.ux && y == u.uy && !Invisible)
473 1.1 cgd ? 1 :
474 1.1 cgd (mtmp = m_at(x,y))
475 1.1 cgd ? ((Blind && Telepat) || canseemon(mtmp)) :
476 1.1 cgd 0);
477 1.1 cgd }
478 1.1 cgd
479 1.1 cgd #ifdef NEWSCR
480 1.1 cgd pobj(obj) register struct obj *obj; {
481 1.1 cgd register int show = (!obj->oinvis || See_invisible) &&
482 1.1 cgd cansee(obj->ox,obj->oy);
483 1.1 cgd if(obj->odispl){
484 1.1 cgd if(obj->odx != obj->ox || obj->ody != obj->oy || !show)
485 1.1 cgd if(!vism_at(obj->odx,obj->ody)){
486 1.1 cgd newsym(obj->odx, obj->ody);
487 1.1 cgd obj->odispl = 0;
488 1.1 cgd }
489 1.1 cgd }
490 1.1 cgd if(show && !vism_at(obj->ox,obj->oy)){
491 1.1 cgd atl(obj->ox,obj->oy,obj->olet);
492 1.1 cgd obj->odispl = 1;
493 1.1 cgd obj->odx = obj->ox;
494 1.1 cgd obj->ody = obj->oy;
495 1.1 cgd }
496 1.1 cgd }
497 1.1 cgd #endif NEWSCR
498 1.1 cgd
499 1.1 cgd unpobj(obj) register struct obj *obj; {
500 1.1 cgd /* if(obj->odispl){
501 1.1 cgd if(!vism_at(obj->odx, obj->ody))
502 1.1 cgd newsym(obj->odx, obj->ody);
503 1.1 cgd obj->odispl = 0;
504 1.1 cgd }
505 1.1 cgd */
506 1.1 cgd if(!vism_at(obj->ox,obj->oy))
507 1.1 cgd newsym(obj->ox,obj->oy);
508 1.1 cgd }
509 1.1 cgd
510 1.1 cgd seeobjs(){
511 1.1 cgd register struct obj *obj, *obj2;
512 1.1 cgd for(obj = fobj; obj; obj = obj2) {
513 1.1 cgd obj2 = obj->nobj;
514 1.1 cgd if(obj->olet == FOOD_SYM && obj->otyp >= CORPSE
515 1.1 cgd && obj->age + 250 < moves)
516 1.1 cgd delobj(obj);
517 1.1 cgd }
518 1.1 cgd for(obj = invent; obj; obj = obj2) {
519 1.1 cgd obj2 = obj->nobj;
520 1.1 cgd if(obj->olet == FOOD_SYM && obj->otyp >= CORPSE
521 1.1 cgd && obj->age + 250 < moves)
522 1.1 cgd useup(obj);
523 1.1 cgd }
524 1.1 cgd }
525 1.1 cgd
526 1.1 cgd seemons(){
527 1.1 cgd register struct monst *mtmp;
528 1.1 cgd for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){
529 1.1 cgd if(mtmp->data->mlet == ';')
530 1.1 cgd mtmp->minvis = (u.ustuck != mtmp &&
531 1.1 cgd levl[mtmp->mx][mtmp->my].typ == POOL);
532 1.1 cgd pmon(mtmp);
533 1.1 cgd #ifndef NOWORM
534 1.1 cgd if(mtmp->wormno) wormsee(mtmp->wormno);
535 1.1 cgd #endif NOWORM
536 1.1 cgd }
537 1.1 cgd }
538 1.1 cgd
539 1.1 cgd pmon(mon) register struct monst *mon; {
540 1.1 cgd register int show = (Blind && Telepat) || canseemon(mon);
541 1.1 cgd if(mon->mdispl){
542 1.1 cgd if(mon->mdx != mon->mx || mon->mdy != mon->my || !show)
543 1.1 cgd unpmon(mon);
544 1.1 cgd }
545 1.1 cgd if(show && !mon->mdispl){
546 1.1 cgd atl(mon->mx,mon->my,
547 1.1 cgd (!mon->mappearance
548 1.1 cgd || u.uprops[PROP(RIN_PROTECTION_FROM_SHAPE_CHANGERS)].p_flgs
549 1.1 cgd ) ? mon->data->mlet : mon->mappearance);
550 1.1 cgd mon->mdispl = 1;
551 1.1 cgd mon->mdx = mon->mx;
552 1.1 cgd mon->mdy = mon->my;
553 1.1 cgd }
554 1.1 cgd }
555 1.1 cgd
556 1.1 cgd unpmon(mon) register struct monst *mon; {
557 1.1 cgd if(mon->mdispl){
558 1.1 cgd newsym(mon->mdx, mon->mdy);
559 1.1 cgd mon->mdispl = 0;
560 1.1 cgd }
561 1.1 cgd }
562 1.1 cgd
563 1.1 cgd nscr()
564 1.1 cgd {
565 1.1 cgd register x,y;
566 1.1 cgd register struct rm *room;
567 1.1 cgd
568 1.1 cgd if(u.uswallow || u.ux == FAR || flags.nscrinh) return;
569 1.1 cgd pru();
570 1.1 cgd for(y = scrly; y <= scrhy; y++)
571 1.1 cgd for(x = scrlx; x <= scrhx; x++)
572 1.1 cgd if((room = &levl[x][y])->new) {
573 1.1 cgd room->new = 0;
574 1.1 cgd at(x,y,room->scrsym);
575 1.1 cgd }
576 1.1 cgd scrhx = scrhy = 0;
577 1.1 cgd scrlx = COLNO;
578 1.1 cgd scrly = ROWNO;
579 1.1 cgd }
580 1.1 cgd
581 1.1 cgd /* 100 suffices for bot(); no relation with COLNO */
582 1.1 cgd char oldbot[100], newbot[100];
583 1.1 cgd cornbot(lth)
584 1.1 cgd register int lth;
585 1.1 cgd {
586 1.1 cgd if(lth < sizeof(oldbot)) {
587 1.1 cgd oldbot[lth] = 0;
588 1.1 cgd flags.botl = 1;
589 1.1 cgd }
590 1.1 cgd }
591 1.1 cgd
592 1.1 cgd bot()
593 1.1 cgd {
594 1.1 cgd register char *ob = oldbot, *nb = newbot;
595 1.1 cgd register int i;
596 1.1 cgd extern char *eos();
597 1.1 cgd if(flags.botlx) *ob = 0;
598 1.1 cgd flags.botl = flags.botlx = 0;
599 1.1 cgd #ifdef GOLD_ON_BOTL
600 1.1 cgd (void) sprintf(newbot,
601 1.1 cgd "Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Str ",
602 1.1 cgd dlevel, u.ugold, u.uhp, u.uhpmax, u.uac);
603 1.1 cgd #else
604 1.1 cgd (void) sprintf(newbot,
605 1.1 cgd "Level %-2d Hp %3d(%d) Ac %-2d Str ",
606 1.1 cgd dlevel, u.uhp, u.uhpmax, u.uac);
607 1.1 cgd #endif GOLD_ON_BOTL
608 1.1 cgd if(u.ustr>18) {
609 1.1 cgd if(u.ustr>117)
610 1.1 cgd (void) strcat(newbot,"18/**");
611 1.1 cgd else
612 1.1 cgd (void) sprintf(eos(newbot), "18/%02d",u.ustr-18);
613 1.1 cgd } else
614 1.1 cgd (void) sprintf(eos(newbot), "%-2d ",u.ustr);
615 1.1 cgd #ifdef EXP_ON_BOTL
616 1.1 cgd (void) sprintf(eos(newbot), " Exp %2d/%-5lu ", u.ulevel,u.uexp);
617 1.1 cgd #else
618 1.1 cgd (void) sprintf(eos(newbot), " Exp %2u ", u.ulevel);
619 1.1 cgd #endif EXP_ON_BOTL
620 1.1 cgd (void) strcat(newbot, hu_stat[u.uhs]);
621 1.1 cgd if(flags.time)
622 1.1 cgd (void) sprintf(eos(newbot), " %ld", moves);
623 1.1 cgd if(strlen(newbot) >= COLNO) {
624 1.1 cgd register char *bp0, *bp1;
625 1.1 cgd bp0 = bp1 = newbot;
626 1.1 cgd do {
627 1.1 cgd if(*bp0 != ' ' || bp0[1] != ' ' || bp0[2] != ' ')
628 1.1 cgd *bp1++ = *bp0;
629 1.1 cgd } while(*bp0++);
630 1.1 cgd }
631 1.1 cgd for(i = 1; i<COLNO; i++) {
632 1.1 cgd if(*ob != *nb){
633 1.1 cgd curs(i,ROWNO+2);
634 1.1 cgd (void) putchar(*nb ? *nb : ' ');
635 1.1 cgd curx++;
636 1.1 cgd }
637 1.1 cgd if(*ob) ob++;
638 1.1 cgd if(*nb) nb++;
639 1.1 cgd }
640 1.1 cgd (void) strcpy(oldbot, newbot);
641 1.1 cgd }
642 1.1 cgd
643 1.1 cgd #ifdef WAN_PROBING
644 1.1 cgd mstatusline(mtmp) register struct monst *mtmp; {
645 1.1 cgd pline("Status of %s: ", monnam(mtmp));
646 1.1 cgd pline("Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Dam %d",
647 1.1 cgd mtmp->data->mlevel, mtmp->mgold, mtmp->mhp, mtmp->mhpmax,
648 1.1 cgd mtmp->data->ac, (mtmp->data->damn + 1) * (mtmp->data->damd + 1));
649 1.1 cgd }
650 1.1 cgd #endif WAN_PROBING
651 1.1 cgd
652 1.1 cgd cls(){
653 1.1 cgd if(flags.toplin == 1)
654 1.1 cgd more();
655 1.1 cgd flags.toplin = 0;
656 1.1 cgd
657 1.1 cgd clear_screen();
658 1.1 cgd
659 1.1 cgd flags.botlx = 1;
660 1.1 cgd }
661