|
|
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.