|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2: /* hack.invent.c - version 1.0.3 */
3:
4: #include "hack.h"
5: #include <stdio.h>
6: extern struct obj *splitobj();
7: extern struct obj zeroobj;
8: extern char morc;
9: extern char quitchars[];
10: char *xprname();
11:
12: #ifndef NOWORM
13: #include "def.wseg.h"
14: extern struct wseg *wsegs[32];
15: #endif NOWORM
16:
17: #define NOINVSYM '#'
18:
19: static int lastinvnr = 51; /* 0 ... 51 */
20: static
21: assigninvlet(otmp)
22: register struct obj *otmp;
23: {
24: boolean inuse[52];
25: register int i;
26: register struct obj *obj;
27:
28: for(i = 0; i < 52; i++) inuse[i] = FALSE;
29: for(obj = invent; obj; obj = obj->nobj) if(obj != otmp) {
30: i = obj->invlet;
31: if('a' <= i && i <= 'z') inuse[i - 'a'] = TRUE; else
32: if('A' <= i && i <= 'Z') inuse[i - 'A' + 26] = TRUE;
33: if(i == otmp->invlet) otmp->invlet = 0;
34: }
35: if((i = otmp->invlet) &&
36: (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z')))
37: return;
38: for(i = lastinvnr+1; i != lastinvnr; i++) {
39: if(i == 52) { i = -1; continue; }
40: if(!inuse[i]) break;
41: }
42: otmp->invlet = (inuse[i] ? NOINVSYM :
43: (i < 26) ? ('a'+i) : ('A'+i-26));
44: lastinvnr = i;
45: }
46:
47: struct obj *
48: addinv(obj)
49: register struct obj *obj;
50: {
51: register struct obj *otmp;
52:
53: /* merge or attach to end of chain */
54: if(!invent) {
55: invent = obj;
56: otmp = 0;
57: } else
58: for(otmp = invent; /* otmp */; otmp = otmp->nobj) {
59: if(merged(otmp, obj, 0))
60: return(otmp);
61: if(!otmp->nobj) {
62: otmp->nobj = obj;
63: break;
64: }
65: }
66: obj->nobj = 0;
67:
68: if(flags.invlet_constant) {
69: assigninvlet(obj);
70: /*
71: * The ordering of the chain is nowhere significant
72: * so in case you prefer some other order than the
73: * historical one, change the code below.
74: */
75: if(otmp) { /* find proper place in chain */
76: otmp->nobj = 0;
77: if((invent->invlet ^ 040) > (obj->invlet ^ 040)) {
78: obj->nobj = invent;
79: invent = obj;
80: } else
81: for(otmp = invent; ; otmp = otmp->nobj) {
82: if(!otmp->nobj ||
83: (otmp->nobj->invlet ^ 040) > (obj->invlet ^ 040)){
84: obj->nobj = otmp->nobj;
85: otmp->nobj = obj;
86: break;
87: }
88: }
89: }
90: }
91:
92: return(obj);
93: }
94:
95: useup(obj)
96: register struct obj *obj;
97: {
98: if(obj->quan > 1){
99: obj->quan--;
100: obj->owt = weight(obj);
101: } else {
102: setnotworn(obj);
103: freeinv(obj);
104: obfree(obj, (struct obj *) 0);
105: }
106: }
107:
108: freeinv(obj)
109: register struct obj *obj;
110: {
111: register struct obj *otmp;
112:
113: if(obj == invent)
114: invent = invent->nobj;
115: else {
116: for(otmp = invent; otmp->nobj != obj; otmp = otmp->nobj)
117: if(!otmp->nobj) panic("freeinv");
118: otmp->nobj = obj->nobj;
119: }
120: }
121:
122: /* destroy object in fobj chain (if unpaid, it remains on the bill) */
123: delobj(obj) register struct obj *obj; {
124: freeobj(obj);
125: unpobj(obj);
126: obfree(obj, (struct obj *) 0);
127: }
128:
129: /* unlink obj from chain starting with fobj */
130: freeobj(obj) register struct obj *obj; {
131: register struct obj *otmp;
132:
133: if(obj == fobj) fobj = fobj->nobj;
134: else {
135: for(otmp = fobj; otmp->nobj != obj; otmp = otmp->nobj)
136: if(!otmp) panic("error in freeobj");
137: otmp->nobj = obj->nobj;
138: }
139: }
140:
141: /* Note: freegold throws away its argument! */
142: freegold(gold) register struct gold *gold; {
143: register struct gold *gtmp;
144:
145: if(gold == fgold) fgold = gold->ngold;
146: else {
147: for(gtmp = fgold; gtmp->ngold != gold; gtmp = gtmp->ngold)
148: if(!gtmp) panic("error in freegold");
149: gtmp->ngold = gold->ngold;
150: }
151: free((char *) gold);
152: }
153:
154: deltrap(trap)
155: register struct trap *trap;
156: {
157: register struct trap *ttmp;
158:
159: if(trap == ftrap)
160: ftrap = ftrap->ntrap;
161: else {
162: for(ttmp = ftrap; ttmp->ntrap != trap; ttmp = ttmp->ntrap) ;
163: ttmp->ntrap = trap->ntrap;
164: }
165: free((char *) trap);
166: }
167:
168: struct wseg *m_atseg;
169:
170: struct monst *
171: m_at(x,y)
172: register x,y;
173: {
174: register struct monst *mtmp;
175: #ifndef NOWORM
176: register struct wseg *wtmp;
177: #endif NOWORM
178:
179: m_atseg = 0;
180: for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){
181: if(mtmp->mx == x && mtmp->my == y)
182: return(mtmp);
183: #ifndef NOWORM
184: if(mtmp->wormno){
185: for(wtmp = wsegs[mtmp->wormno]; wtmp; wtmp = wtmp->nseg)
186: if(wtmp->wx == x && wtmp->wy == y){
187: m_atseg = wtmp;
188: return(mtmp);
189: }
190: }
191: #endif NOWORM
192: }
193: return(0);
194: }
195:
196: struct obj *
197: o_at(x,y)
198: register x,y;
199: {
200: register struct obj *otmp;
201:
202: for(otmp = fobj; otmp; otmp = otmp->nobj)
203: if(otmp->ox == x && otmp->oy == y) return(otmp);
204: return(0);
205: }
206:
207: struct obj *
208: sobj_at(n,x,y)
209: register n,x,y;
210: {
211: register struct obj *otmp;
212:
213: for(otmp = fobj; otmp; otmp = otmp->nobj)
214: if(otmp->ox == x && otmp->oy == y && otmp->otyp == n)
215: return(otmp);
216: return(0);
217: }
218:
219: carried(obj) register struct obj *obj; {
220: register struct obj *otmp;
221: for(otmp = invent; otmp; otmp = otmp->nobj)
222: if(otmp == obj) return(1);
223: return(0);
224: }
225:
226: carrying(type)
227: register int type;
228: {
229: register struct obj *otmp;
230:
231: for(otmp = invent; otmp; otmp = otmp->nobj)
232: if(otmp->otyp == type)
233: return(TRUE);
234: return(FALSE);
235: }
236:
237: struct obj *
238: o_on(id, objchn) unsigned int id; register struct obj *objchn; {
239: while(objchn) {
240: if(objchn->o_id == id) return(objchn);
241: objchn = objchn->nobj;
242: }
243: return((struct obj *) 0);
244: }
245:
246: struct trap *
247: t_at(x,y)
248: register x,y;
249: {
250: register struct trap *trap = ftrap;
251: while(trap) {
252: if(trap->tx == x && trap->ty == y) return(trap);
253: trap = trap->ntrap;
254: }
255: return(0);
256: }
257:
258: struct gold *
259: g_at(x,y)
260: register x,y;
261: {
262: register struct gold *gold = fgold;
263: while(gold) {
264: if(gold->gx == x && gold->gy == y) return(gold);
265: gold = gold->ngold;
266: }
267: return(0);
268: }
269:
270: /* make dummy object structure containing gold - for temporary use only */
271: struct obj *
272: mkgoldobj(q)
273: register long q;
274: {
275: register struct obj *otmp;
276:
277: otmp = newobj(0);
278: /* should set o_id etc. but otmp will be freed soon */
279: otmp->olet = '$';
280: u.ugold -= q;
281: OGOLD(otmp) = q;
282: flags.botl = 1;
283: return(otmp);
284: }
285:
286: /*
287: * getobj returns:
288: * struct obj *xxx: object to do something with.
289: * (struct obj *) 0 error return: no object.
290: * &zeroobj explicitly no object (as in w-).
291: */
292: struct obj *
293: getobj(let,word)
294: register char *let,*word;
295: {
296: register struct obj *otmp;
297: register char ilet,ilet1,ilet2;
298: char buf[BUFSZ];
299: char lets[BUFSZ];
300: register int foo = 0, foo2;
301: register char *bp = buf;
302: xchar allowcnt = 0; /* 0, 1 or 2 */
303: boolean allowgold = FALSE;
304: boolean allowall = FALSE;
305: boolean allownone = FALSE;
306: xchar foox = 0;
307: long cnt;
308:
309: if(*let == '0') let++, allowcnt = 1;
310: if(*let == '$') let++, allowgold = TRUE;
311: if(*let == '#') let++, allowall = TRUE;
312: if(*let == '-') let++, allownone = TRUE;
313: if(allownone) *bp++ = '-';
314: if(allowgold) *bp++ = '$';
315: if(bp > buf && bp[-1] == '-') *bp++ = ' ';
316:
317: ilet = 'a';
318: for(otmp = invent; otmp; otmp = otmp->nobj){
319: if(!*let || index(let, otmp->olet)) {
320: bp[foo++] = flags.invlet_constant ? otmp->invlet : ilet;
321:
322: /* ugly check: remove inappropriate things */
323: if((!strcmp(word, "take off") &&
324: !(otmp->owornmask & (W_ARMOR - W_ARM2)))
325: || (!strcmp(word, "wear") &&
326: (otmp->owornmask & (W_ARMOR | W_RING)))
327: || (!strcmp(word, "wield") &&
328: (otmp->owornmask & W_WEP))) {
329: foo--;
330: foox++;
331: }
332: }
333: if(ilet == 'z') ilet = 'A'; else ilet++;
334: }
335: bp[foo] = 0;
336: if(foo == 0 && bp > buf && bp[-1] == ' ') *--bp = 0;
337: (void) strcpy(lets, bp); /* necessary since we destroy buf */
338: if(foo > 5) { /* compactify string */
339: foo = foo2 = 1;
340: ilet2 = bp[0];
341: ilet1 = bp[1];
342: while(ilet = bp[++foo2] = bp[++foo]){
343: if(ilet == ilet1+1){
344: if(ilet1 == ilet2+1)
345: bp[foo2 - 1] = ilet1 = '-';
346: else if(ilet2 == '-') {
347: bp[--foo2] = ++ilet1;
348: continue;
349: }
350: }
351: ilet2 = ilet1;
352: ilet1 = ilet;
353: }
354: }
355: if(!foo && !allowall && !allowgold && !allownone) {
356: pline("You don't have anything %sto %s.",
357: foox ? "else " : "", word);
358: return(0);
359: }
360: for(;;) {
361: if(!buf[0])
362: pline("What do you want to %s [*]? ", word);
363: else
364: pline("What do you want to %s [%s or ?*]? ",
365: word, buf);
366:
367: cnt = 0;
368: ilet = readchar();
369: while(digit(ilet) && allowcnt) {
370: if (cnt < 100000000)
371: cnt = 10*cnt + (ilet - '0');
372: else
373: cnt = 999999999;
374: allowcnt = 2; /* signal presence of cnt */
375: ilet = readchar();
376: }
377: if(digit(ilet)) {
378: pline("No count allowed with this command.");
379: continue;
380: }
381: if(index(quitchars,ilet))
382: return((struct obj *)0);
383: if(ilet == '-') {
384: return(allownone ? &zeroobj : (struct obj *) 0);
385: }
386: if(ilet == '$') {
387: if(!allowgold){
388: pline("You cannot %s gold.", word);
389: continue;
390: }
391: if(!(allowcnt == 2 && cnt < u.ugold))
392: cnt = u.ugold;
393: return(mkgoldobj(cnt));
394: }
395: if(ilet == '?') {
396: doinv(lets);
397: if(!(ilet = morc)) continue;
398: /* he typed a letter (not a space) to more() */
399: } else if(ilet == '*') {
400: doinv((char *) 0);
401: if(!(ilet = morc)) continue;
402: /* ... */
403: }
404: if(flags.invlet_constant) {
405: for(otmp = invent; otmp; otmp = otmp->nobj)
406: if(otmp->invlet == ilet) break;
407: } else {
408: if(ilet >= 'A' && ilet <= 'Z') ilet += 'z'-'A'+1;
409: ilet -= 'a';
410: for(otmp = invent; otmp && ilet;
411: ilet--, otmp = otmp->nobj) ;
412: }
413: if(!otmp) {
414: pline("You don't have that object.");
415: continue;
416: }
417: if(cnt < 0 || otmp->quan < cnt) {
418: pline("You don't have that many! [You have %u]"
419: , otmp->quan);
420: continue;
421: }
422: break;
423: }
424: if(!allowall && let && !index(let,otmp->olet)) {
425: pline("That is a silly thing to %s.",word);
426: return(0);
427: }
428: if(allowcnt == 2) { /* cnt given */
429: if(cnt == 0) return(0);
430: if(cnt != otmp->quan) {
431: register struct obj *obj;
432: obj = splitobj(otmp, (int) cnt);
433: if(otmp == uwep) setuwep(obj);
434: }
435: }
436: return(otmp);
437: }
438:
439: ckunpaid(otmp) register struct obj *otmp; {
440: return( otmp->unpaid );
441: }
442:
443: /* interactive version of getobj - used for Drop and Identify */
444: /* return the number of times fn was called successfully */
445: ggetobj(word, fn, max)
446: char *word;
447: int (*fn)(), max;
448: {
449: char buf[BUFSZ];
450: register char *ip;
451: register char sym;
452: register int oletct = 0, iletct = 0;
453: register boolean allflag = FALSE;
454: char olets[20], ilets[20];
455: int (*ckfn)() = (int (*)()) 0;
456: xchar allowgold = (u.ugold && !strcmp(word, "drop")) ? 1 : 0; /* BAH */
457: if(!invent && !allowgold){
458: pline("You have nothing to %s.", word);
459: return(0);
460: } else {
461: register struct obj *otmp = invent;
462: register int uflg = 0;
463:
464: if(allowgold) ilets[iletct++] = '$';
465: ilets[iletct] = 0;
466: while(otmp) {
467: if(!index(ilets, otmp->olet)){
468: ilets[iletct++] = otmp->olet;
469: ilets[iletct] = 0;
470: }
471: if(otmp->unpaid) uflg = 1;
472: otmp = otmp->nobj;
473: }
474: ilets[iletct++] = ' ';
475: if(uflg) ilets[iletct++] = 'u';
476: if(invent) ilets[iletct++] = 'a';
477: ilets[iletct] = 0;
478: }
479: pline("What kinds of thing do you want to %s? [%s] ",
480: word, ilets);
481: getlin(buf);
482: if(buf[0] == '\033') {
483: clrlin();
484: return(0);
485: }
486: ip = buf;
487: olets[0] = 0;
488: while(sym = *ip++){
489: if(sym == ' ') continue;
490: if(sym == '$') {
491: if(allowgold == 1)
492: (*fn)(mkgoldobj(u.ugold));
493: else if(!u.ugold)
494: pline("You have no gold.");
495: allowgold = 2;
496: } else
497: if(sym == 'a' || sym == 'A') allflag = TRUE; else
498: if(sym == 'u' || sym == 'U') ckfn = ckunpaid; else
499: if(index("!%?[()=*/\"0", sym)){
500: if(!index(olets, sym)){
501: olets[oletct++] = sym;
502: olets[oletct] = 0;
503: }
504: }
505: else pline("You don't have any %c's.", sym);
506: }
507: if(allowgold == 2 && !oletct)
508: return(1); /* he dropped gold (or at least tried to) */
509: else
510: return(askchain(invent, olets, allflag, fn, ckfn, max));
511: }
512:
513: /*
514: * Walk through the chain starting at objchn and ask for all objects
515: * with olet in olets (if nonNULL) and satisfying ckfn (if nonNULL)
516: * whether the action in question (i.e., fn) has to be performed.
517: * If allflag then no questions are asked. Max gives the max nr of
518: * objects to be treated. Return the number of objects treated.
519: */
520: askchain(objchn, olets, allflag, fn, ckfn, max)
521: struct obj *objchn;
522: register char *olets;
523: int allflag;
524: int (*fn)(), (*ckfn)();
525: int max;
526: {
527: register struct obj *otmp, *otmp2;
528: register char sym, ilet;
529: register int cnt = 0;
530: ilet = 'a'-1;
531: for(otmp = objchn; otmp; otmp = otmp2){
532: if(ilet == 'z') ilet = 'A'; else ilet++;
533: otmp2 = otmp->nobj;
534: if(olets && *olets && !index(olets, otmp->olet)) continue;
535: if(ckfn && !(*ckfn)(otmp)) continue;
536: if(!allflag) {
537: pline(xprname(otmp, ilet));
538: addtopl(" [nyaq]? ");
539: sym = readchar();
540: }
541: else sym = 'y';
542:
543: switch(sym){
544: case 'a':
545: allflag = 1;
546: case 'y':
547: cnt += (*fn)(otmp);
548: if(--max == 0) goto ret;
549: case 'n':
550: default:
551: break;
552: case 'q':
553: goto ret;
554: }
555: }
556: pline(cnt ? "That was all." : "No applicable objects.");
557: ret:
558: return(cnt);
559: }
560:
561: obj_to_let(obj) /* should of course only be called for things in invent */
562: register struct obj *obj;
563: {
564: register struct obj *otmp;
565: register char ilet;
566:
567: if(flags.invlet_constant)
568: return(obj->invlet);
569: ilet = 'a';
570: for(otmp = invent; otmp && otmp != obj; otmp = otmp->nobj)
571: if(++ilet > 'z') ilet = 'A';
572: return(otmp ? ilet : NOINVSYM);
573: }
574:
575: prinv(obj)
576: register struct obj *obj;
577: {
578: pline(xprname(obj, obj_to_let(obj)));
579: }
580:
581: static char *
582: xprname(obj,let)
583: register struct obj *obj;
584: register char let;
585: {
586: static char li[BUFSZ];
587:
588: (void) sprintf(li, "%c - %s.",
589: flags.invlet_constant ? obj->invlet : let,
590: doname(obj));
591: return(li);
592: }
593:
594: ddoinv()
595: {
596: doinv((char *) 0);
597: return(0);
598: }
599:
600: /* called with 0 or "": all objects in inventory */
601: /* otherwise: all objects with (serial) letter in lets */
602: doinv(lets)
603: register char *lets;
604: {
605: register struct obj *otmp;
606: register char ilet;
607: int ct = 0;
608: char any[BUFSZ];
609:
610: morc = 0; /* just to be sure */
611:
612: if(!invent){
613: pline("Not carrying anything.");
614: return;
615: }
616:
617: cornline(0, (char *) 0);
618: ilet = 'a';
619: for(otmp = invent; otmp; otmp = otmp->nobj) {
620: if(flags.invlet_constant) ilet = otmp->invlet;
621: if(!lets || !*lets || index(lets, ilet)) {
622: cornline(1, xprname(otmp, ilet));
623: any[ct++] = ilet;
624: }
625: if(!flags.invlet_constant) if(++ilet > 'z') ilet = 'A';
626: }
627: any[ct] = 0;
628: cornline(2, any);
629: }
630:
631: dotypeinv () /* free after Robert Viduya */
632: /* Changed to one type only, so he doesnt have to type cr */
633: {
634: char c, ilet;
635: char stuff[BUFSZ];
636: register int stct;
637: register struct obj *otmp;
638: boolean billx = inshop() && doinvbill(0);
639: boolean unpd = FALSE;
640:
641: if (!invent && !u.ugold && !billx) {
642: pline ("You aren't carrying anything.");
643: return(0);
644: }
645:
646: stct = 0;
647: if(u.ugold) stuff[stct++] = '$';
648: stuff[stct] = 0;
649: for(otmp = invent; otmp; otmp = otmp->nobj) {
650: if (!index (stuff, otmp->olet)) {
651: stuff[stct++] = otmp->olet;
652: stuff[stct] = 0;
653: }
654: if(otmp->unpaid)
655: unpd = TRUE;
656: }
657: if(unpd) stuff[stct++] = 'u';
658: if(billx) stuff[stct++] = 'x';
659: stuff[stct] = 0;
660:
661: if(stct > 1) {
662: pline ("What type of object [%s] do you want an inventory of? ",
663: stuff);
664: c = readchar();
665: if(index(quitchars,c)) return(0);
666: } else
667: c = stuff[0];
668:
669: if(c == '$')
670: return(doprgold());
671:
672: if(c == 'x' || c == 'X') {
673: if(billx)
674: (void) doinvbill(1);
675: else
676: pline("No used-up objects on the shopping bill.");
677: return(0);
678: }
679:
680: if((c == 'u' || c == 'U') && !unpd) {
681: pline("You are not carrying any unpaid objects.");
682: return(0);
683: }
684:
685: stct = 0;
686: ilet = 'a';
687: for (otmp = invent; otmp; otmp = otmp -> nobj) {
688: if(flags.invlet_constant) ilet = otmp->invlet;
689: if (c == otmp -> olet || (c == 'u' && otmp -> unpaid))
690: stuff[stct++] = ilet;
691: if(!flags.invlet_constant) if(++ilet > 'z') ilet = 'A';
692: }
693: stuff[stct] = '\0';
694: if(stct == 0)
695: pline("You have no such objects.");
696: else
697: doinv (stuff);
698:
699: return(0);
700: }
701:
702: /* look at what is here */
703: dolook() {
704: register struct obj *otmp, *otmp0;
705: register struct gold *gold;
706: char *verb = Blind ? "feel" : "see";
707: int ct = 0;
708:
709: if(!u.uswallow) {
710: if(Blind) {
711: pline("You try to feel what is lying here on the floor.");
712: if(Levitation) { /* ab@unido */
713: pline("You cannot reach the floor!");
714: return(1);
715: }
716: }
717: otmp0 = o_at(u.ux, u.uy);
718: gold = g_at(u.ux, u.uy);
719: }
720:
721: if(u.uswallow || (!otmp0 && !gold)) {
722: pline("You %s no objects here.", verb);
723: return(!!Blind);
724: }
725:
726: cornline(0, "Things that are here:");
727: for(otmp = otmp0; otmp; otmp = otmp->nobj) {
728: if(otmp->ox == u.ux && otmp->oy == u.uy) {
729: ct++;
730: cornline(1, doname(otmp));
731: if(Blind && otmp->otyp == DEAD_COCKATRICE && !uarmg) {
732: pline("Touching the dead cockatrice is a fatal mistake ...");
733: pline("You die ...");
734: killer = "dead cockatrice";
735: done("died");
736: }
737: }
738: }
739:
740: if(gold) {
741: char gbuf[30];
742:
743: (void) sprintf(gbuf, "%ld gold piece%s",
744: gold->amount, plur(gold->amount));
745: if(!ct++)
746: pline("You %s here %s.", verb, gbuf);
747: else
748: cornline(1, gbuf);
749: }
750:
751: if(ct == 1 && !gold) {
752: pline("You %s here %s.", verb, doname(otmp0));
753: cornline(3, (char *) 0);
754: }
755: if(ct > 1)
756: cornline(2, (char *) 0);
757: return(!!Blind);
758: }
759:
760: stackobj(obj) register struct obj *obj; {
761: register struct obj *otmp = fobj;
762: for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp != obj)
763: if(otmp->ox == obj->ox && otmp->oy == obj->oy &&
764: merged(obj,otmp,1))
765: return;
766: }
767:
768: /* merge obj with otmp and delete obj if types agree */
769: merged(otmp,obj,lose) register struct obj *otmp, *obj; {
770: if(obj->otyp == otmp->otyp &&
771: obj->unpaid == otmp->unpaid &&
772: obj->spe == otmp->spe &&
773: obj->dknown == otmp->dknown &&
774: obj->cursed == otmp->cursed &&
775: (index("%*?!", obj->olet) ||
776: (obj->known == otmp->known &&
777: (obj->olet == WEAPON_SYM && obj->otyp < BOOMERANG)))) {
778: otmp->quan += obj->quan;
779: otmp->owt += obj->owt;
780: if(lose) freeobj(obj);
781: obfree(obj,otmp); /* free(obj), bill->otmp */
782: return(1);
783: } else return(0);
784: }
785:
786: /*
787: * Gold is no longer displayed; in fact, when you have a lot of money,
788: * it may take a while before you have counted it all.
789: * [Bug: d$ and pickup still tell you how much it was.]
790: */
791: extern int (*occupation)();
792: extern char *occtxt;
793: static long goldcounted;
794:
795: countgold(){
796: if((goldcounted += 100*(u.ulevel + 1)) >= u.ugold) {
797: long eps = 0;
798: if(!rn2(2)) eps = rnd((int) (u.ugold/100 + 1));
799: pline("You probably have about %ld gold pieces.",
800: u.ugold + eps);
801: return(0); /* done */
802: }
803: return(1); /* continue */
804: }
805:
806: doprgold(){
807: if(!u.ugold)
808: pline("You do not carry any gold.");
809: else if(u.ugold <= 500)
810: pline("You are carrying %ld gold pieces.", u.ugold);
811: else {
812: pline("You sit down in order to count your gold pieces.");
813: goldcounted = 500;
814: occupation = countgold;
815: occtxt = "counting your gold";
816: }
817: return(1);
818: }
819:
820: /* --- end of gold counting section --- */
821:
822: doprwep(){
823: if(!uwep) pline("You are empty handed.");
824: else prinv(uwep);
825: return(0);
826: }
827:
828: doprarm(){
829: if(!uarm && !uarmg && !uarms && !uarmh)
830: pline("You are not wearing any armor.");
831: else {
832: char lets[6];
833: register int ct = 0;
834:
835: if(uarm) lets[ct++] = obj_to_let(uarm);
836: if(uarm2) lets[ct++] = obj_to_let(uarm2);
837: if(uarmh) lets[ct++] = obj_to_let(uarmh);
838: if(uarms) lets[ct++] = obj_to_let(uarms);
839: if(uarmg) lets[ct++] = obj_to_let(uarmg);
840: lets[ct] = 0;
841: doinv(lets);
842: }
843: return(0);
844: }
845:
846: doprring(){
847: if(!uleft && !uright)
848: pline("You are not wearing any rings.");
849: else {
850: char lets[3];
851: register int ct = 0;
852:
853: if(uleft) lets[ct++] = obj_to_let(uleft);
854: if(uright) lets[ct++] = obj_to_let(uright);
855: lets[ct] = 0;
856: doinv(lets);
857: }
858: return(0);
859: }
860:
861: digit(c) char c; {
862: return(c >= '0' && c <= '9');
863: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.