|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2: /* hack.c - version 1.0.3 */
3:
4: #include "hack.h"
5: #include <stdio.h>
6:
7: extern char news0();
8: extern char *nomovemsg;
9: extern char *exclam();
10: extern struct obj *addinv();
11: extern boolean hmon();
12:
13: /* called on movement:
14: 1. when throwing ball+chain far away
15: 2. when teleporting
16: 3. when walking out of a lit room
17: */
18: unsee() {
19: register x,y;
20: register struct rm *lev;
21:
22: /*
23: if(u.udispl){
24: u.udispl = 0;
25: newsym(u.udisx, u.udisy);
26: }
27: */
28: #ifndef QUEST
29: if(seehx){
30: seehx = 0;
31: } else
32: #endif QUEST
33: for(x = u.ux-1; x < u.ux+2; x++)
34: for(y = u.uy-1; y < u.uy+2; y++) {
35: if(!isok(x, y)) continue;
36: lev = &levl[x][y];
37: if(!lev->lit && lev->scrsym == '.') {
38: lev->scrsym =' ';
39: lev->new = 1;
40: on_scr(x,y);
41: }
42: }
43: }
44:
45: /* called:
46: in hack.eat.c: seeoff(0) - blind after eating rotten food
47: in hack.mon.c: seeoff(0) - blinded by a yellow light
48: in hack.mon.c: seeoff(1) - swallowed
49: in hack.do.c: seeoff(0) - blind after drinking potion
50: in hack.do.c: seeoff(1) - go up or down the stairs
51: in hack.trap.c:seeoff(1) - fall through trapdoor
52: */
53: seeoff(mode) /* 1 to redo @, 0 to leave them */
54: { /* 1 means misc movement, 0 means blindness */
55: register x,y;
56: register struct rm *lev;
57:
58: if(u.udispl && mode){
59: u.udispl = 0;
60: levl[u.udisx][u.udisy].scrsym = news0(u.udisx,u.udisy);
61: }
62: #ifndef QUEST
63: if(seehx) {
64: seehx = 0;
65: } else
66: #endif QUEST
67: if(!mode) {
68: for(x = u.ux-1; x < u.ux+2; x++)
69: for(y = u.uy-1; y < u.uy+2; y++) {
70: if(!isok(x, y)) continue;
71: lev = &levl[x][y];
72: if(!lev->lit && lev->scrsym == '.')
73: lev->seen = 0;
74: }
75: }
76: }
77:
78: domove()
79: {
80: xchar oldx,oldy;
81: register struct monst *mtmp;
82: register struct rm *tmpr,*ust;
83: struct trap *trap;
84: register struct obj *otmp;
85:
86: u_wipe_engr(rnd(5));
87:
88: if(inv_weight() > 0){
89: pline("You collapse under your load.");
90: nomul(0);
91: return;
92: }
93: if(u.uswallow) {
94: u.dx = u.dy = 0;
95: u.ux = u.ustuck->mx;
96: u.uy = u.ustuck->my;
97: } else {
98: if(Confusion) {
99: do {
100: confdir();
101: } while(!isok(u.ux+u.dx, u.uy+u.dy) ||
102: IS_ROCK(levl[u.ux+u.dx][u.uy+u.dy].typ));
103: }
104: if(!isok(u.ux+u.dx, u.uy+u.dy)){
105: nomul(0);
106: return;
107: }
108: }
109:
110: ust = &levl[u.ux][u.uy];
111: oldx = u.ux;
112: oldy = u.uy;
113: if(!u.uswallow && (trap = t_at(u.ux+u.dx, u.uy+u.dy)) && trap->tseen)
114: nomul(0);
115: if(u.ustuck && !u.uswallow && (u.ux+u.dx != u.ustuck->mx ||
116: u.uy+u.dy != u.ustuck->my)) {
117: if(dist(u.ustuck->mx, u.ustuck->my) > 2){
118: /* perhaps it fled (or was teleported or ... ) */
119: u.ustuck = 0;
120: } else {
121: if(Blind) pline("You cannot escape from it!");
122: else pline("You cannot escape from %s!",
123: monnam(u.ustuck));
124: nomul(0);
125: return;
126: }
127: }
128: if(u.uswallow || (mtmp = m_at(u.ux+u.dx,u.uy+u.dy))) {
129: /* attack monster */
130:
131: nomul(0);
132: gethungry();
133: if(multi < 0) return; /* we just fainted */
134:
135: /* try to attack; note that it might evade */
136: if(attack(u.uswallow ? u.ustuck : mtmp))
137: return;
138: }
139: /* not attacking an animal, so we try to move */
140: if(u.utrap) {
141: if(u.utraptype == TT_PIT) {
142: pline("You are still in a pit.");
143: u.utrap--;
144: } else {
145: pline("You are caught in a beartrap.");
146: if((u.dx && u.dy) || !rn2(5)) u.utrap--;
147: }
148: return;
149: }
150: tmpr = &levl[u.ux+u.dx][u.uy+u.dy];
151: if(IS_ROCK(tmpr->typ) ||
152: (u.dx && u.dy && (tmpr->typ == DOOR || ust->typ == DOOR))){
153: flags.move = 0;
154: nomul(0);
155: return;
156: }
157: while(otmp = sobj_at(ENORMOUS_ROCK, u.ux+u.dx, u.uy+u.dy)) {
158: register xchar rx = u.ux+2*u.dx, ry = u.uy+2*u.dy;
159: register struct trap *ttmp;
160: nomul(0);
161: if(isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) &&
162: (levl[rx][ry].typ != DOOR || !(u.dx && u.dy)) &&
163: !sobj_at(ENORMOUS_ROCK, rx, ry)) {
164: if(m_at(rx,ry)) {
165: pline("You hear a monster behind the rock.");
166: pline("Perhaps that's why you cannot move it.");
167: goto cannot_push;
168: }
169: if(ttmp = t_at(rx,ry))
170: switch(ttmp->ttyp) {
171: case PIT:
172: pline("You push the rock into a pit!");
173: deltrap(ttmp);
174: delobj(otmp);
175: pline("It completely fills the pit!");
176: continue;
177: case TELEP_TRAP:
178: pline("You push the rock and suddenly it disappears!");
179: delobj(otmp);
180: continue;
181: }
182: if(levl[rx][ry].typ == POOL) {
183: levl[rx][ry].typ = ROOM;
184: mnewsym(rx,ry);
185: prl(rx,ry);
186: pline("You push the rock into the water.");
187: pline("Now you can cross the water!");
188: delobj(otmp);
189: continue;
190: }
191: otmp->ox = rx;
192: otmp->oy = ry;
193: /* pobj(otmp); */
194: if(cansee(rx,ry)) atl(rx,ry,otmp->olet);
195: if(Invisible) newsym(u.ux+u.dx, u.uy+u.dy);
196:
197: { static long lastmovetime;
198: /* note: this var contains garbage initially and
199: after a restore */
200: if(moves > lastmovetime+2 || moves < lastmovetime)
201: pline("With great effort you move the enormous rock.");
202: lastmovetime = moves;
203: }
204: } else {
205: pline("You try to move the enormous rock, but in vain.");
206: cannot_push:
207: if((!invent || inv_weight()+90 <= 0) &&
208: (!u.dx || !u.dy || (IS_ROCK(levl[u.ux][u.uy+u.dy].typ)
209: && IS_ROCK(levl[u.ux+u.dx][u.uy].typ)))){
210: pline("However, you can squeeze yourself into a small opening.");
211: break;
212: } else
213: return;
214: }
215: }
216: if(u.dx && u.dy && IS_ROCK(levl[u.ux][u.uy+u.dy].typ) &&
217: IS_ROCK(levl[u.ux+u.dx][u.uy].typ) &&
218: invent && inv_weight()+40 > 0) {
219: pline("You are carrying too much to get through.");
220: nomul(0);
221: return;
222: }
223: if(Punished &&
224: DIST(u.ux+u.dx, u.uy+u.dy, uchain->ox, uchain->oy) > 2){
225: if(carried(uball)) {
226: movobj(uchain, u.ux, u.uy);
227: goto nodrag;
228: }
229:
230: if(DIST(u.ux+u.dx, u.uy+u.dy, uball->ox, uball->oy) < 3){
231: /* leave ball, move chain under/over ball */
232: movobj(uchain, uball->ox, uball->oy);
233: goto nodrag;
234: }
235:
236: if(inv_weight() + (int) uball->owt/2 > 0) {
237: pline("You cannot %sdrag the heavy iron ball.",
238: invent ? "carry all that and also " : "");
239: nomul(0);
240: return;
241: }
242:
243: movobj(uball, uchain->ox, uchain->oy);
244: unpobj(uball); /* BAH %% */
245: uchain->ox = u.ux;
246: uchain->oy = u.uy;
247: nomul(-2);
248: nomovemsg = "";
249: nodrag: ;
250: }
251: u.ux += u.dx;
252: u.uy += u.dy;
253: if(flags.run) {
254: if(tmpr->typ == DOOR ||
255: (xupstair == u.ux && yupstair == u.uy) ||
256: (xdnstair == u.ux && ydnstair == u.uy))
257: nomul(0);
258: }
259:
260: if(tmpr->typ == POOL && !Levitation)
261: drown(); /* not necessarily fatal */
262:
263: /*
264: if(u.udispl) {
265: u.udispl = 0;
266: newsym(oldx,oldy);
267: }
268: */
269: if(!Blind) {
270: #ifdef QUEST
271: setsee();
272: #else
273: if(ust->lit) {
274: if(tmpr->lit) {
275: if(tmpr->typ == DOOR)
276: prl1(u.ux+u.dx,u.uy+u.dy);
277: else if(ust->typ == DOOR)
278: nose1(oldx-u.dx,oldy-u.dy);
279: } else {
280: unsee();
281: prl1(u.ux+u.dx,u.uy+u.dy);
282: }
283: } else {
284: if(tmpr->lit) setsee();
285: else {
286: prl1(u.ux+u.dx,u.uy+u.dy);
287: if(tmpr->typ == DOOR) {
288: if(u.dy) {
289: prl(u.ux-1,u.uy);
290: prl(u.ux+1,u.uy);
291: } else {
292: prl(u.ux,u.uy-1);
293: prl(u.ux,u.uy+1);
294: }
295: }
296: }
297: nose1(oldx-u.dx,oldy-u.dy);
298: }
299: #endif QUEST
300: } else {
301: pru();
302: }
303: if(!flags.nopick) pickup(1);
304: if(trap) dotrap(trap); /* fall into pit, arrow trap, etc. */
305: (void) inshop();
306: if(!Blind) read_engr_at(u.ux,u.uy);
307: }
308:
309: movobj(obj, ox, oy)
310: register struct obj *obj;
311: register int ox, oy;
312: {
313: /* Some dirty programming to get display right */
314: freeobj(obj);
315: unpobj(obj);
316: obj->nobj = fobj;
317: fobj = obj;
318: obj->ox = ox;
319: obj->oy = oy;
320: }
321:
322: dopickup(){
323: if(!g_at(u.ux,u.uy) && !o_at(u.ux,u.uy)) {
324: pline("There is nothing here to pick up.");
325: return(0);
326: }
327: if(Levitation) {
328: pline("You cannot reach the floor.");
329: return(1);
330: }
331: pickup(0);
332: return(1);
333: }
334:
335: pickup(all)
336: {
337: register struct gold *gold;
338: register struct obj *obj, *obj2;
339: register int wt;
340:
341: if(Levitation) return;
342: while(gold = g_at(u.ux,u.uy)) {
343: pline("%ld gold piece%s.", gold->amount, plur(gold->amount));
344: u.ugold += gold->amount;
345: flags.botl = 1;
346: freegold(gold);
347: if(flags.run) nomul(0);
348: if(Invisible) newsym(u.ux,u.uy);
349: }
350:
351: /* check for more than one object */
352: if(!all) {
353: register int ct = 0;
354:
355: for(obj = fobj; obj; obj = obj->nobj)
356: if(obj->ox == u.ux && obj->oy == u.uy)
357: if(!Punished || obj != uchain)
358: ct++;
359: if(ct < 2)
360: all++;
361: else
362: pline("There are several objects here.");
363: }
364:
365: for(obj = fobj; obj; obj = obj2) {
366: obj2 = obj->nobj; /* perhaps obj will be picked up */
367: if(obj->ox == u.ux && obj->oy == u.uy) {
368: if(flags.run) nomul(0);
369:
370: /* do not pick up uchain */
371: if(Punished && obj == uchain)
372: continue;
373:
374: if(!all) {
375: char c;
376:
377: pline("Pick up %s ? [ynaq]", doname(obj));
378: while(!index("ynaq ", (c = readchar())))
379: bell();
380: if(c == 'q') return;
381: if(c == 'n') continue;
382: if(c == 'a') all = 1;
383: }
384:
385: if(obj->otyp == DEAD_COCKATRICE && !uarmg){
386: pline("Touching the dead cockatrice is a fatal mistake.");
387: pline("You turn to stone.");
388: killer = "cockatrice cadaver";
389: done("died");
390: }
391:
392: if(obj->otyp == SCR_SCARE_MONSTER){
393: if(!obj->spe) obj->spe = 1;
394: else {
395: /* Note: perhaps the 1st pickup failed: you cannot
396: carry anymore, and so we never dropped it -
397: let's assume that treading on it twice also
398: destroys the scroll */
399: pline("The scroll turns to dust as you pick it up.");
400: delobj(obj);
401: continue;
402: }
403: }
404:
405: wt = inv_weight() + obj->owt;
406: if(wt > 0) {
407: if(obj->quan > 1) {
408: /* see how many we can lift */
409: extern struct obj *splitobj();
410: int savequan = obj->quan;
411: int iw = inv_weight();
412: int qq;
413: for(qq = 1; qq < savequan; qq++){
414: obj->quan = qq;
415: if(iw + weight(obj) > 0)
416: break;
417: }
418: obj->quan = savequan;
419: qq--;
420: /* we can carry qq of them */
421: if(!qq) goto too_heavy;
422: pline("You can only carry %s of the %s lying here.",
423: (qq == 1) ? "one" : "some",
424: doname(obj));
425: (void) splitobj(obj, qq);
426: /* note: obj2 is set already, so we'll never
427: * encounter the other half; if it should be
428: * otherwise then write
429: * obj2 = splitobj(obj,qq);
430: */
431: goto lift_some;
432: }
433: too_heavy:
434: pline("There %s %s here, but %s.",
435: (obj->quan == 1) ? "is" : "are",
436: doname(obj),
437: !invent ? "it is too heavy for you to lift"
438: : "you cannot carry anymore");
439: break;
440: }
441: lift_some:
442: if(inv_cnt() >= 52) {
443: pline("Your knapsack cannot accomodate anymore items.");
444: break;
445: }
446: if(wt > -5) pline("You have a little trouble lifting");
447: freeobj(obj);
448: if(Invisible) newsym(u.ux,u.uy);
449: addtobill(obj); /* sets obj->unpaid if necessary */
450: { int pickquan = obj->quan;
451: int mergquan;
452: if(!Blind) obj->dknown = 1; /* this is done by prinv(),
453: but addinv() needs it already for merging */
454: obj = addinv(obj); /* might merge it with other objects */
455: mergquan = obj->quan;
456: obj->quan = pickquan; /* to fool prinv() */
457: prinv(obj);
458: obj->quan = mergquan;
459: }
460: }
461: }
462: }
463:
464: /* stop running if we see something interesting */
465: /* turn around a corner if that is the only way we can proceed */
466: /* do not turn left or right twice */
467: lookaround(){
468: register x,y,i,x0,y0,m0,i0 = 9;
469: register int corrct = 0, noturn = 0;
470: register struct monst *mtmp;
471: #ifdef lint
472: /* suppress "used before set" message */
473: x0 = y0 = 0;
474: #endif lint
475: if(Blind || flags.run == 0) return;
476: if(flags.run == 1 && levl[u.ux][u.uy].typ == ROOM) return;
477: #ifdef QUEST
478: if(u.ux0 == u.ux+u.dx && u.uy0 == u.uy+u.dy) goto stop;
479: #endif QUEST
480: for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++){
481: if(x == u.ux && y == u.uy) continue;
482: if(!levl[x][y].typ) continue;
483: if((mtmp = m_at(x,y)) && !mtmp->mimic &&
484: (!mtmp->minvis || See_invisible)){
485: if(!mtmp->mtame || (x == u.ux+u.dx && y == u.uy+u.dy))
486: goto stop;
487: } else mtmp = 0; /* invisible M cannot influence us */
488: if(x == u.ux-u.dx && y == u.uy-u.dy) continue;
489: switch(levl[x][y].scrsym){
490: case '|':
491: case '-':
492: case '.':
493: case ' ':
494: break;
495: case '+':
496: if(x != u.ux && y != u.uy) break;
497: if(flags.run != 1) goto stop;
498: /* fall into next case */
499: case CORR_SYM:
500: corr:
501: if(flags.run == 1 || flags.run == 3) {
502: i = DIST(x,y,u.ux+u.dx,u.uy+u.dy);
503: if(i > 2) break;
504: if(corrct == 1 && DIST(x,y,x0,y0) != 1)
505: noturn = 1;
506: if(i < i0) {
507: i0 = i;
508: x0 = x;
509: y0 = y;
510: m0 = mtmp ? 1 : 0;
511: }
512: }
513: corrct++;
514: break;
515: case '^':
516: if(flags.run == 1) goto corr; /* if you must */
517: if(x == u.ux+u.dx && y == u.uy+u.dy) goto stop;
518: break;
519: default: /* e.g. objects or trap or stairs */
520: if(flags.run == 1) goto corr;
521: if(mtmp) break; /* d */
522: stop:
523: nomul(0);
524: return;
525: }
526: }
527: #ifdef QUEST
528: if(corrct > 0 && (flags.run == 4 || flags.run == 5)) goto stop;
529: #endif QUEST
530: if(corrct > 1 && flags.run == 2) goto stop;
531: if((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 &&
532: (corrct == 1 || (corrct == 2 && i0 == 1))) {
533: /* make sure that we do not turn too far */
534: if(i0 == 2) {
535: if(u.dx == y0-u.uy && u.dy == u.ux-x0)
536: i = 2; /* straight turn right */
537: else
538: i = -2; /* straight turn left */
539: } else if(u.dx && u.dy) {
540: if((u.dx == u.dy && y0 == u.uy) ||
541: (u.dx != u.dy && y0 != u.uy))
542: i = -1; /* half turn left */
543: else
544: i = 1; /* half turn right */
545: } else {
546: if((x0-u.ux == y0-u.uy && !u.dy) ||
547: (x0-u.ux != y0-u.uy && u.dy))
548: i = 1; /* half turn right */
549: else
550: i = -1; /* half turn left */
551: }
552: i += u.last_str_turn;
553: if(i <= 2 && i >= -2) {
554: u.last_str_turn = i;
555: u.dx = x0-u.ux, u.dy = y0-u.uy;
556: }
557: }
558: }
559:
560: /* something like lookaround, but we are not running */
561: /* react only to monsters that might hit us */
562: monster_nearby() {
563: register int x,y;
564: register struct monst *mtmp;
565: if(!Blind)
566: for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++){
567: if(x == u.ux && y == u.uy) continue;
568: if((mtmp = m_at(x,y)) && !mtmp->mimic && !mtmp->mtame &&
569: !mtmp->mpeaceful && !index("Ea", mtmp->data->mlet) &&
570: !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */
571: (!mtmp->minvis || See_invisible))
572: return(1);
573: }
574: return(0);
575: }
576:
577: #ifdef QUEST
578: cansee(x,y) xchar x,y; {
579: register int dx,dy,adx,ady,sdx,sdy,dmax,d;
580: if(Blind) return(0);
581: if(!isok(x,y)) return(0);
582: d = dist(x,y);
583: if(d < 3) return(1);
584: if(d > u.uhorizon*u.uhorizon) return(0);
585: if(!levl[x][y].lit)
586: return(0);
587: dx = x - u.ux; adx = abs(dx); sdx = sgn(dx);
588: dy = y - u.uy; ady = abs(dy); sdy = sgn(dy);
589: if(dx == 0 || dy == 0 || adx == ady){
590: dmax = (dx == 0) ? ady : adx;
591: for(d = 1; d <= dmax; d++)
592: if(!rroom(sdx*d,sdy*d))
593: return(0);
594: return(1);
595: } else if(ady > adx){
596: for(d = 1; d <= ady; d++){
597: if(!rroom(sdx*( (d*adx)/ady ), sdy*d) ||
598: !rroom(sdx*( (d*adx-1)/ady+1 ), sdy*d))
599: return(0);
600: }
601: return(1);
602: } else {
603: for(d = 1; d <= adx; d++){
604: if(!rroom(sdx*d, sdy*( (d*ady)/adx )) ||
605: !rroom(sdx*d, sdy*( (d*ady-1)/adx+1 )))
606: return(0);
607: }
608: return(1);
609: }
610: }
611:
612: rroom(x,y) register int x,y; {
613: return(IS_ROOM(levl[u.ux+x][u.uy+y].typ));
614: }
615:
616: #else
617:
618: cansee(x,y) xchar x,y; {
619: if(Blind || u.uswallow) return(0);
620: if(dist(x,y) < 3) return(1);
621: if(levl[x][y].lit && seelx <= x && x <= seehx && seely <= y &&
622: y <= seehy) return(1);
623: return(0);
624: }
625: #endif QUEST
626:
627: sgn(a) register int a; {
628: return((a > 0) ? 1 : (a == 0) ? 0 : -1);
629: }
630:
631: #ifdef QUEST
632: setsee()
633: {
634: register x,y;
635:
636: if(Blind) {
637: pru();
638: return;
639: }
640: for(y = u.uy-u.uhorizon; y <= u.uy+u.uhorizon; y++)
641: for(x = u.ux-u.uhorizon; x <= u.ux+u.uhorizon; x++) {
642: if(cansee(x,y))
643: prl(x,y);
644: }
645: }
646:
647: #else
648:
649: setsee()
650: {
651: register x,y;
652:
653: if(Blind) {
654: pru();
655: return;
656: }
657: if(!levl[u.ux][u.uy].lit) {
658: seelx = u.ux-1;
659: seehx = u.ux+1;
660: seely = u.uy-1;
661: seehy = u.uy+1;
662: } else {
663: for(seelx = u.ux; levl[seelx-1][u.uy].lit; seelx--);
664: for(seehx = u.ux; levl[seehx+1][u.uy].lit; seehx++);
665: for(seely = u.uy; levl[u.ux][seely-1].lit; seely--);
666: for(seehy = u.uy; levl[u.ux][seehy+1].lit; seehy++);
667: }
668: for(y = seely; y <= seehy; y++)
669: for(x = seelx; x <= seehx; x++) {
670: prl(x,y);
671: }
672: if(!levl[u.ux][u.uy].lit) seehx = 0; /* seems necessary elsewhere */
673: else {
674: if(seely == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seely-1);
675: if(seehy == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seehy+1);
676: if(seelx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seelx-1,y);
677: if(seehx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seehx+1,y);
678: }
679: }
680: #endif QUEST
681:
682: nomul(nval)
683: register nval;
684: {
685: if(multi < 0) return;
686: multi = nval;
687: flags.mv = flags.run = 0;
688: }
689:
690: abon()
691: {
692: if(u.ustr == 3) return(-3);
693: else if(u.ustr < 6) return(-2);
694: else if(u.ustr < 8) return(-1);
695: else if(u.ustr < 17) return(0);
696: else if(u.ustr < 69) return(1); /* up to 18/50 */
697: else if(u.ustr < 118) return(2);
698: else return(3);
699: }
700:
701: dbon()
702: {
703: if(u.ustr < 6) return(-1);
704: else if(u.ustr < 16) return(0);
705: else if(u.ustr < 18) return(1);
706: else if(u.ustr == 18) return(2); /* up to 18 */
707: else if(u.ustr < 94) return(3); /* up to 18/75 */
708: else if(u.ustr < 109) return(4); /* up to 18/90 */
709: else if(u.ustr < 118) return(5); /* up to 18/99 */
710: else return(6);
711: }
712:
713: losestr(num) /* may kill you; cause may be poison or monster like 'A' */
714: register num;
715: {
716: u.ustr -= num;
717: while(u.ustr < 3) {
718: u.ustr++;
719: u.uhp -= 6;
720: u.uhpmax -= 6;
721: }
722: flags.botl = 1;
723: }
724:
725: losehp(n,knam)
726: register n;
727: register char *knam;
728: {
729: u.uhp -= n;
730: if(u.uhp > u.uhpmax)
731: u.uhpmax = u.uhp; /* perhaps n was negative */
732: flags.botl = 1;
733: if(u.uhp < 1) {
734: killer = knam; /* the thing that killed you */
735: done("died");
736: }
737: }
738:
739: losehp_m(n,mtmp)
740: register n;
741: register struct monst *mtmp;
742: {
743: u.uhp -= n;
744: flags.botl = 1;
745: if(u.uhp < 1)
746: done_in_by(mtmp);
747: }
748:
749: losexp() /* hit by V or W */
750: {
751: register num;
752: extern long newuexp();
753:
754: if(u.ulevel > 1)
755: pline("Goodbye level %u.", u.ulevel--);
756: else
757: u.uhp = -1;
758: num = rnd(10);
759: u.uhp -= num;
760: u.uhpmax -= num;
761: u.uexp = newuexp();
762: flags.botl = 1;
763: }
764:
765: inv_weight(){
766: register struct obj *otmp = invent;
767: register int wt = (u.ugold + 500)/1000;
768: register int carrcap;
769: if(Levitation) /* pugh@cornell */
770: carrcap = MAX_CARR_CAP;
771: else {
772: carrcap = 5*(((u.ustr > 18) ? 20 : u.ustr) + u.ulevel);
773: if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP;
774: if(Wounded_legs & LEFT_SIDE) carrcap -= 10;
775: if(Wounded_legs & RIGHT_SIDE) carrcap -= 10;
776: }
777: while(otmp){
778: wt += otmp->owt;
779: otmp = otmp->nobj;
780: }
781: return(wt - carrcap);
782: }
783:
784: inv_cnt(){
785: register struct obj *otmp = invent;
786: register int ct = 0;
787: while(otmp){
788: ct++;
789: otmp = otmp->nobj;
790: }
791: return(ct);
792: }
793:
794: long
795: newuexp()
796: {
797: return(10*(1L << (u.ulevel-1)));
798: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.