|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ ! 2: /* hack.objnam.c - version 1.0.2 */ ! 3: ! 4: #include "hack.h" ! 5: #define Sprintf (void) sprintf ! 6: #define Strcat (void) strcat ! 7: #define Strcpy (void) strcpy ! 8: #define PREFIX 15 ! 9: extern char *eos(); ! 10: extern int bases[]; ! 11: ! 12: char * ! 13: strprepend(s,pref) register char *s, *pref; { ! 14: register int i = strlen(pref); ! 15: if(i > PREFIX) { ! 16: pline("WARNING: prefix too short."); ! 17: return(s); ! 18: } ! 19: s -= i; ! 20: (void) strncpy(s, pref, i); /* do not copy trailing 0 */ ! 21: return(s); ! 22: } ! 23: ! 24: char * ! 25: sitoa(a) int a; { ! 26: static char buf[13]; ! 27: Sprintf(buf, (a < 0) ? "%d" : "+%d", a); ! 28: return(buf); ! 29: } ! 30: ! 31: char * ! 32: typename(otyp) ! 33: register int otyp; ! 34: { ! 35: static char buf[BUFSZ]; ! 36: register struct objclass *ocl = &objects[otyp]; ! 37: register char *an = ocl->oc_name; ! 38: register char *dn = ocl->oc_descr; ! 39: register char *un = ocl->oc_uname; ! 40: register int nn = ocl->oc_name_known; ! 41: switch(ocl->oc_olet) { ! 42: case POTION_SYM: ! 43: Strcpy(buf, "potion"); ! 44: break; ! 45: case SCROLL_SYM: ! 46: Strcpy(buf, "scroll"); ! 47: break; ! 48: case WAND_SYM: ! 49: Strcpy(buf, "wand"); ! 50: break; ! 51: case RING_SYM: ! 52: Strcpy(buf, "ring"); ! 53: break; ! 54: default: ! 55: if(nn) { ! 56: Strcpy(buf, an); ! 57: if(otyp >= TURQUOISE && otyp <= JADE) ! 58: Strcat(buf, " stone"); ! 59: if(un) ! 60: Sprintf(eos(buf), " called %s", un); ! 61: if(dn) ! 62: Sprintf(eos(buf), " (%s)", dn); ! 63: } else { ! 64: Strcpy(buf, dn ? dn : an); ! 65: if(ocl->oc_olet == GEM_SYM) ! 66: Strcat(buf, " gem"); ! 67: if(un) ! 68: Sprintf(eos(buf), " called %s", un); ! 69: } ! 70: return(buf); ! 71: } ! 72: /* here for ring/scroll/potion/wand */ ! 73: if(nn) ! 74: Sprintf(eos(buf), " of %s", an); ! 75: if(un) ! 76: Sprintf(eos(buf), " called %s", un); ! 77: if(dn) ! 78: Sprintf(eos(buf), " (%s)", dn); ! 79: return(buf); ! 80: } ! 81: ! 82: char * ! 83: xname(obj) ! 84: register struct obj *obj; ! 85: { ! 86: static char bufr[BUFSZ]; ! 87: register char *buf = &(bufr[PREFIX]); /* leave room for "17 -3 " */ ! 88: register int nn = objects[obj->otyp].oc_name_known; ! 89: register char *an = objects[obj->otyp].oc_name; ! 90: register char *dn = objects[obj->otyp].oc_descr; ! 91: register char *un = objects[obj->otyp].oc_uname; ! 92: register int pl = (obj->quan != 1); ! 93: if(!obj->dknown && !Blind) obj->dknown = 1; /* %% doesnt belong here */ ! 94: switch(obj->olet) { ! 95: case AMULET_SYM: ! 96: Strcpy(buf, (obj->spe < 0 && obj->known) ! 97: ? "cheap plastic imitation of the " : ""); ! 98: Strcat(buf,"Amulet of Yendor"); ! 99: break; ! 100: case TOOL_SYM: ! 101: if(!nn) { ! 102: Strcpy(buf, dn); ! 103: break; ! 104: } ! 105: Strcpy(buf,an); ! 106: break; ! 107: case FOOD_SYM: ! 108: if(obj->otyp == DEAD_HOMUNCULUS && pl) { ! 109: pl = 0; ! 110: Strcpy(buf, "dead homunculi"); ! 111: break; ! 112: } ! 113: /* fungis ? */ ! 114: /* fall into next case */ ! 115: case WEAPON_SYM: ! 116: if(obj->otyp == WORM_TOOTH && pl) { ! 117: pl = 0; ! 118: Strcpy(buf, "worm teeth"); ! 119: break; ! 120: } ! 121: if(obj->otyp == CRYSKNIFE && pl) { ! 122: pl = 0; ! 123: Strcpy(buf, "crysknives"); ! 124: break; ! 125: } ! 126: /* fall into next case */ ! 127: case ARMOR_SYM: ! 128: case CHAIN_SYM: ! 129: case ROCK_SYM: ! 130: Strcpy(buf,an); ! 131: break; ! 132: case BALL_SYM: ! 133: Sprintf(buf, "%sheavy iron ball", ! 134: (obj->owt > objects[obj->otyp].oc_weight) ? "very " : ""); ! 135: break; ! 136: case POTION_SYM: ! 137: if(nn || un || !obj->dknown) { ! 138: Strcpy(buf, "potion"); ! 139: if(pl) { ! 140: pl = 0; ! 141: Strcat(buf, "s"); ! 142: } ! 143: if(!obj->dknown) break; ! 144: if(un) { ! 145: Strcat(buf, " called "); ! 146: Strcat(buf, un); ! 147: } else { ! 148: Strcat(buf, " of "); ! 149: Strcat(buf, an); ! 150: } ! 151: } else { ! 152: Strcpy(buf, dn); ! 153: Strcat(buf, " potion"); ! 154: } ! 155: break; ! 156: case SCROLL_SYM: ! 157: Strcpy(buf, "scroll"); ! 158: if(pl) { ! 159: pl = 0; ! 160: Strcat(buf, "s"); ! 161: } ! 162: if(!obj->dknown) break; ! 163: if(nn) { ! 164: Strcat(buf, " of "); ! 165: Strcat(buf, an); ! 166: } else if(un) { ! 167: Strcat(buf, " called "); ! 168: Strcat(buf, un); ! 169: } else { ! 170: Strcat(buf, " labeled "); ! 171: Strcat(buf, dn); ! 172: } ! 173: break; ! 174: case WAND_SYM: ! 175: if(!obj->dknown) ! 176: Sprintf(buf, "wand"); ! 177: else if(nn) ! 178: Sprintf(buf, "wand of %s", an); ! 179: else if(un) ! 180: Sprintf(buf, "wand called %s", un); ! 181: else ! 182: Sprintf(buf, "%s wand", dn); ! 183: break; ! 184: case RING_SYM: ! 185: if(!obj->dknown) ! 186: Sprintf(buf, "ring"); ! 187: else if(nn) ! 188: Sprintf(buf, "ring of %s", an); ! 189: else if(un) ! 190: Sprintf(buf, "ring called %s", un); ! 191: else ! 192: Sprintf(buf, "%s ring", dn); ! 193: break; ! 194: case GEM_SYM: ! 195: if(!obj->dknown) { ! 196: Strcpy(buf, "gem"); ! 197: break; ! 198: } ! 199: if(!nn) { ! 200: Sprintf(buf, "%s gem", dn); ! 201: break; ! 202: } ! 203: Strcpy(buf, an); ! 204: if(obj->otyp >= TURQUOISE && obj->otyp <= JADE) ! 205: Strcat(buf, " stone"); ! 206: break; ! 207: default: ! 208: Sprintf(buf,"glorkum %c (0%o) %u %d", ! 209: obj->olet,obj->olet,obj->otyp,obj->spe); ! 210: } ! 211: if(pl) { ! 212: register char *p; ! 213: ! 214: for(p = buf; *p; p++) { ! 215: if(!strncmp(" of ", p, 4)) { ! 216: /* pieces of, cloves of, lumps of */ ! 217: register int c1, c2 = 's'; ! 218: ! 219: do { ! 220: c1 = c2; c2 = *p; *p++ = c1; ! 221: } while(c1); ! 222: goto nopl; ! 223: } ! 224: } ! 225: p = eos(buf)-1; ! 226: if(*p == 's' || *p == 'z' || *p == 'x' || ! 227: (*p == 'h' && p[-1] == 's')) ! 228: Strcat(buf, "es"); /* boxes */ ! 229: else if(*p == 'y' && !index(vowels, p[-1])) ! 230: Strcpy(p, "ies"); /* rubies, zruties */ ! 231: else ! 232: Strcat(buf, "s"); ! 233: } ! 234: nopl: ! 235: if(obj->onamelth) { ! 236: Strcat(buf, " named "); ! 237: Strcat(buf, ONAME(obj)); ! 238: } ! 239: return(buf); ! 240: } ! 241: ! 242: char * ! 243: doname(obj) ! 244: register struct obj *obj; ! 245: { ! 246: char prefix[PREFIX]; ! 247: register char *bp = xname(obj); ! 248: if(obj->quan != 1) ! 249: Sprintf(prefix, "%u ", obj->quan); ! 250: else ! 251: Strcpy(prefix, "a "); ! 252: switch(obj->olet) { ! 253: case AMULET_SYM: ! 254: if(strncmp(bp, "cheap ", 6)) ! 255: Strcpy(prefix, "the "); ! 256: break; ! 257: case ARMOR_SYM: ! 258: if(obj->owornmask & W_ARMOR) ! 259: Strcat(bp, " (being worn)"); ! 260: /* fall into next case */ ! 261: case WEAPON_SYM: ! 262: if(obj->known) { ! 263: Strcat(prefix, sitoa(obj->spe)); ! 264: Strcat(prefix, " "); ! 265: } ! 266: break; ! 267: case WAND_SYM: ! 268: if(obj->known) ! 269: Sprintf(eos(bp), " (%d)", obj->spe); ! 270: break; ! 271: case RING_SYM: ! 272: if(obj->owornmask & W_RINGR) Strcat(bp, " (on right hand)"); ! 273: if(obj->owornmask & W_RINGL) Strcat(bp, " (on left hand)"); ! 274: if(obj->known && (objects[obj->otyp].bits & SPEC)) { ! 275: Strcat(prefix, sitoa(obj->spe)); ! 276: Strcat(prefix, " "); ! 277: } ! 278: break; ! 279: } ! 280: if(obj->owornmask & W_WEP) ! 281: Strcat(bp, " (weapon in hand)"); ! 282: if(obj->unpaid) ! 283: Strcat(bp, " (unpaid)"); ! 284: if(!strcmp(prefix, "a ") && index(vowels, *bp)) ! 285: Strcpy(prefix, "an "); ! 286: bp = strprepend(bp, prefix); ! 287: return(bp); ! 288: } ! 289: ! 290: /* used only in hack.fight.c (thitu) */ ! 291: setan(str,buf) ! 292: register char *str,*buf; ! 293: { ! 294: if(index(vowels,*str)) ! 295: Sprintf(buf, "an %s", str); ! 296: else ! 297: Sprintf(buf, "a %s", str); ! 298: } ! 299: ! 300: char * ! 301: aobjnam(otmp,verb) register struct obj *otmp; register char *verb; { ! 302: register char *bp = xname(otmp); ! 303: char prefix[PREFIX]; ! 304: if(otmp->quan != 1) { ! 305: Sprintf(prefix, "%u ", otmp->quan); ! 306: bp = strprepend(bp, prefix); ! 307: } ! 308: ! 309: if(verb) { ! 310: /* verb is given in plural (i.e., without trailing s) */ ! 311: Strcat(bp, " "); ! 312: if(otmp->quan != 1) ! 313: Strcat(bp, verb); ! 314: else if(!strcmp(verb, "are")) ! 315: Strcat(bp, "is"); ! 316: else { ! 317: Strcat(bp, verb); ! 318: Strcat(bp, "s"); ! 319: } ! 320: } ! 321: return(bp); ! 322: } ! 323: ! 324: char * ! 325: Doname(obj) ! 326: register struct obj *obj; ! 327: { ! 328: register char *s = doname(obj); ! 329: ! 330: if('a' <= *s && *s <= 'z') *s -= ('a' - 'A'); ! 331: return(s); ! 332: } ! 333: ! 334: char *wrp[] = { "wand", "ring", "potion", "scroll", "gem" }; ! 335: char wrpsym[] = { WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM }; ! 336: ! 337: struct obj * ! 338: readobjnam(bp) register char *bp; { ! 339: register char *p; ! 340: register int i; ! 341: int cnt, spe, spesgn, typ, heavy; ! 342: char let; ! 343: char *un, *dn, *an; ! 344: /* int the = 0; char *oname = 0; */ ! 345: cnt = spe = spesgn = typ = heavy = 0; ! 346: let = 0; ! 347: an = dn = un = 0; ! 348: for(p = bp; *p; p++) ! 349: if('A' <= *p && *p <= 'Z') *p += 'a'-'A'; ! 350: if(!strncmp(bp, "the ", 4)){ ! 351: /* the = 1; */ ! 352: bp += 4; ! 353: } else if(!strncmp(bp, "an ", 3)){ ! 354: cnt = 1; ! 355: bp += 3; ! 356: } else if(!strncmp(bp, "a ", 2)){ ! 357: cnt = 1; ! 358: bp += 2; ! 359: } ! 360: if(!cnt && digit(*bp)){ ! 361: cnt = atoi(bp); ! 362: while(digit(*bp)) bp++; ! 363: while(*bp == ' ') bp++; ! 364: } ! 365: if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */ ! 366: ! 367: if(*bp == '+' || *bp == '-'){ ! 368: spesgn = (*bp++ == '+') ? 1 : -1; ! 369: spe = atoi(bp); ! 370: while(digit(*bp)) bp++; ! 371: while(*bp == ' ') bp++; ! 372: } else { ! 373: p = rindex(bp, '('); ! 374: if(p) { ! 375: if(p > bp && p[-1] == ' ') p[-1] = 0; ! 376: else *p = 0; ! 377: p++; ! 378: spe = atoi(p); ! 379: while(digit(*p)) p++; ! 380: if(strcmp(p, ")")) spe = 0; ! 381: else spesgn = 1; ! 382: } ! 383: } ! 384: /* now we have the actual name, as delivered by xname, say ! 385: green potions called whisky ! 386: scrolls labeled "QWERTY" ! 387: egg ! 388: dead zruties ! 389: fortune cookies ! 390: very heavy iron ball named hoei ! 391: wand of wishing ! 392: elven cloak ! 393: */ ! 394: for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) { ! 395: *p = 0; ! 396: /* oname = p+7; */ ! 397: } ! 398: for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) { ! 399: *p = 0; ! 400: un = p+8; ! 401: } ! 402: for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) { ! 403: *p = 0; ! 404: dn = p+9; ! 405: } ! 406: ! 407: /* first change to singular if necessary */ ! 408: if(cnt != 1) { ! 409: /* find "cloves of garlic", "worthless pieces of blue glass" */ ! 410: for(p = bp; *p; p++) if(!strncmp(p, "s of ", 5)){ ! 411: while(*p = p[1]) p++; ! 412: goto sing; ! 413: } ! 414: /* remove -s or -es (boxes) or -ies (rubies, zruties) */ ! 415: p = eos(bp); ! 416: if(p[-1] == 's') { ! 417: if(p[-2] == 'e') { ! 418: if(p[-3] == 'i') { ! 419: if(!strcmp(p-7, "cookies")) ! 420: goto mins; ! 421: Strcpy(p-3, "y"); ! 422: goto sing; ! 423: } ! 424: ! 425: /* note: cloves / knives from clove / knife */ ! 426: if(!strcmp(p-6, "knives")) { ! 427: Strcpy(p-3, "fe"); ! 428: goto sing; ! 429: } ! 430: ! 431: /* note: nurses, axes but boxes */ ! 432: if(!strcmp(p-5, "boxes")) { ! 433: p[-2] = 0; ! 434: goto sing; ! 435: } ! 436: } ! 437: mins: ! 438: p[-1] = 0; ! 439: } else { ! 440: if(!strcmp(p-9, "homunculi")) { ! 441: Strcpy(p-1, "us"); /* !! makes string longer */ ! 442: goto sing; ! 443: } ! 444: if(!strcmp(p-5, "teeth")) { ! 445: Strcpy(p-5, "tooth"); ! 446: goto sing; ! 447: } ! 448: /* here we cannot find the plural suffix */ ! 449: } ! 450: } ! 451: sing: ! 452: if(!strcmp(bp, "amulet of yendor")) { ! 453: typ = AMULET_OF_YENDOR; ! 454: goto typfnd; ! 455: } ! 456: p = eos(bp); ! 457: if(!strcmp(p-5, " mail")){ /* Note: ring mail is not a ring ! */ ! 458: let = ARMOR_SYM; ! 459: an = bp; ! 460: goto srch; ! 461: } ! 462: for(i = 0; i < sizeof(wrpsym); i++) { ! 463: register int j = strlen(wrp[i]); ! 464: if(!strncmp(bp, wrp[i], j)){ ! 465: let = wrpsym[i]; ! 466: bp += j; ! 467: if(!strncmp(bp, " of ", 4)) an = bp+4; ! 468: /* else if(*bp) ?? */ ! 469: goto srch; ! 470: } ! 471: if(!strcmp(p-j, wrp[i])){ ! 472: let = wrpsym[i]; ! 473: p -= j; ! 474: *p = 0; ! 475: if(p[-1] == ' ') p[-1] = 0; ! 476: dn = bp; ! 477: goto srch; ! 478: } ! 479: } ! 480: if(!strcmp(p-6, " stone")){ ! 481: p[-6] = 0; ! 482: let = GEM_SYM; ! 483: an = bp; ! 484: goto srch; ! 485: } ! 486: if(!strcmp(bp, "very heavy iron ball")){ ! 487: heavy = 1; ! 488: typ = HEAVY_IRON_BALL; ! 489: goto typfnd; ! 490: } ! 491: an = bp; ! 492: srch: ! 493: if(!an && !dn && !un) ! 494: goto any; ! 495: i = 1; ! 496: if(let) i = bases[letindex(let)]; ! 497: while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){ ! 498: register char *zn = objects[i].oc_name; ! 499: ! 500: if(!zn) goto nxti; ! 501: if(an && strcmp(an, zn)) ! 502: goto nxti; ! 503: if(dn && (!(zn = objects[i].oc_descr) || strcmp(dn, zn))) ! 504: goto nxti; ! 505: if(un && (!(zn = objects[i].oc_uname) || strcmp(un, zn))) ! 506: goto nxti; ! 507: typ = i; ! 508: goto typfnd; ! 509: nxti: ! 510: i++; ! 511: } ! 512: any: ! 513: if(!let) let = wrpsym[rn2(sizeof(wrpsym))]; ! 514: typ = probtype(let); ! 515: typfnd: ! 516: { register struct obj *otmp; ! 517: extern struct obj *mksobj(); ! 518: let = objects[typ].oc_olet; ! 519: otmp = mksobj(typ); ! 520: if(heavy) ! 521: otmp->owt += 15; ! 522: if(cnt > 0 && index("%?!*)", let) && ! 523: (cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt < 20))) ! 524: otmp->quan = cnt; ! 525: ! 526: if(spe > 3 && spe > otmp->spe) ! 527: spe = 0; ! 528: else if(let == WAND_SYM) ! 529: spe = otmp->spe; ! 530: if(spe == 3 && u.uluck < 0) ! 531: spesgn = -1; ! 532: if(let != WAND_SYM && spesgn == -1) ! 533: spe = -spe; ! 534: if(let == BALL_SYM) ! 535: spe = 0; ! 536: else if(let == AMULET_SYM) ! 537: spe = -1; ! 538: else if(typ == WAN_WISHING && rn2(10)) ! 539: spe = (rn2(10) ? -1 : 0); ! 540: otmp->spe = spe; ! 541: ! 542: if(spesgn == -1) ! 543: otmp->cursed = 1; ! 544: ! 545: return(otmp); ! 546: } ! 547: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.