|
|
1.1 ! root 1: /* ! 2: * inventory.c ! 3: * ! 4: * This source herein may be modified and/or distributed by anybody who ! 5: * so desires, with the following restrictions: ! 6: * 1.) No portion of this notice shall be removed. ! 7: * 2.) Credit shall not be taken for the creation of this source. ! 8: * 3.) This code is not to be traded, sold, or used for personal ! 9: * gain or profit. ! 10: * ! 11: */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)inventory.c 5.2 (Berkeley) 1/2/88"; ! 15: #endif /* not lint */ ! 16: ! 17: #include "rogue.h" ! 18: ! 19: boolean is_wood[WANDS]; ! 20: char *press_space = " --press space to continue--"; ! 21: ! 22: char *wand_materials[WAND_MATERIALS] = { ! 23: "steel ", ! 24: "bronze ", ! 25: "gold ", ! 26: "silver ", ! 27: "copper ", ! 28: "nickel ", ! 29: "cobalt ", ! 30: "tin ", ! 31: "iron ", ! 32: "magnesium ", ! 33: "chrome ", ! 34: "carbon ", ! 35: "platinum ", ! 36: "silicon ", ! 37: "titanium ", ! 38: ! 39: "teak ", ! 40: "oak ", ! 41: "cherry ", ! 42: "birch ", ! 43: "pine ", ! 44: "cedar ", ! 45: "redwood ", ! 46: "balsa ", ! 47: "ivory ", ! 48: "walnut ", ! 49: "maple ", ! 50: "mahogany ", ! 51: "elm ", ! 52: "palm ", ! 53: "wooden " ! 54: }; ! 55: ! 56: char *gems[GEMS] = { ! 57: "diamond ", ! 58: "stibotantalite ", ! 59: "lapi-lazuli ", ! 60: "ruby ", ! 61: "emerald ", ! 62: "sapphire ", ! 63: "amethyst ", ! 64: "quartz ", ! 65: "tiger-eye ", ! 66: "opal ", ! 67: "agate ", ! 68: "turquoise ", ! 69: "pearl ", ! 70: "garnet " ! 71: }; ! 72: ! 73: char *syllables[MAXSYLLABLES] = { ! 74: "blech ", ! 75: "foo ", ! 76: "barf ", ! 77: "rech ", ! 78: "bar ", ! 79: "blech ", ! 80: "quo ", ! 81: "bloto ", ! 82: "oh ", ! 83: "caca ", ! 84: "blorp ", ! 85: "erp ", ! 86: "festr ", ! 87: "rot ", ! 88: "slie ", ! 89: "snorf ", ! 90: "iky ", ! 91: "yuky ", ! 92: "ooze ", ! 93: "ah ", ! 94: "bahl ", ! 95: "zep ", ! 96: "druhl ", ! 97: "flem ", ! 98: "behil ", ! 99: "arek ", ! 100: "mep ", ! 101: "zihr ", ! 102: "grit ", ! 103: "kona ", ! 104: "kini ", ! 105: "ichi ", ! 106: "tims ", ! 107: "ogr ", ! 108: "oo ", ! 109: "ighr ", ! 110: "coph ", ! 111: "swerr ", ! 112: "mihln ", ! 113: "poxi " ! 114: }; ! 115: ! 116: #define COMS 48 ! 117: ! 118: struct id_com_s { ! 119: short com_char; ! 120: char *com_desc; ! 121: }; ! 122: ! 123: struct id_com_s com_id_tab[COMS] = { ! 124: '?', "? prints help", ! 125: 'r', "r read scroll", ! 126: '/', "/ identify object", ! 127: 'e', "e eat food", ! 128: 'h', "h left ", ! 129: 'w', "w wield a weapon", ! 130: 'j', "j down", ! 131: 'W', "W wear armor", ! 132: 'k', "k up", ! 133: 'T', "T take armor off", ! 134: 'l', "l right", ! 135: 'P', "P put on ring", ! 136: 'y', "y up & left", ! 137: 'R', "R remove ring", ! 138: 'u', "u up & right", ! 139: 'd', "d drop object", ! 140: 'b', "b down & left", ! 141: 'c', "c call object", ! 142: 'n', "n down & right", ! 143: NULL, "<SHIFT><dir>: run that way", ! 144: ')', ") print current weapon", ! 145: NULL, "<CTRL><dir>: run till adjacent", ! 146: ']', "] print current armor", ! 147: 'f', "f<dir> fight till death or near death", ! 148: '=', "= print current rings", ! 149: 't', "t<dir> throw something", ! 150: '\001', "^A print Hp-raise average", ! 151: 'm', "m<dir> move onto without picking up", ! 152: 'z', "z<dir> zap a wand in a direction", ! 153: 'o', "o examine/set options", ! 154: '^', "^<dir> identify trap type", ! 155: '\022', "^R redraw screen", ! 156: '&', "& save screen into 'rogue.screen'", ! 157: 's', "s search for trap/secret door", ! 158: '\020', "^P repeat last message", ! 159: '>', "> go down a staircase", ! 160: '\033', "^[ cancel command", ! 161: '<', "< go up a staircase", ! 162: 'S', "S save game", ! 163: '.', ". rest for a turn", ! 164: 'Q', "Q quit", ! 165: ',', ", pick something up", ! 166: '!', "! shell escape", ! 167: 'i', "i inventory", ! 168: 'F', "F<dir> fight till either of you dies", ! 169: 'I', "I inventory single item", ! 170: 'v', "v print version number", ! 171: 'q', "q quaff potion" ! 172: }; ! 173: ! 174: extern boolean wizard; ! 175: extern char *m_names[], *more; ! 176: ! 177: inventory(pack, mask) ! 178: object *pack; ! 179: unsigned short mask; ! 180: { ! 181: object *obj; ! 182: short i = 0, j, maxlen = 0, n; ! 183: char descs[MAX_PACK_COUNT+1][DCOLS]; ! 184: short row, col; ! 185: ! 186: obj = pack->next_object; ! 187: ! 188: if (!obj) { ! 189: message("your pack is empty", 0); ! 190: return; ! 191: } ! 192: while (obj) { ! 193: if (obj->what_is & mask) { ! 194: descs[i][0] = ' '; ! 195: descs[i][1] = obj->ichar; ! 196: descs[i][2] = ((obj->what_is & ARMOR) && obj->is_protected) ! 197: ? '}' : ')'; ! 198: descs[i][3] = ' '; ! 199: get_desc(obj, descs[i]+4); ! 200: if ((n = strlen(descs[i])) > maxlen) { ! 201: maxlen = n; ! 202: } ! 203: i++; ! 204: } ! 205: obj = obj->next_object; ! 206: } ! 207: (void) strcpy(descs[i++], press_space); ! 208: if (maxlen < 27) maxlen = 27; ! 209: col = DCOLS - (maxlen + 2); ! 210: ! 211: for (row = 0; ((row < i) && (row < DROWS)); row++) { ! 212: if (row > 0) { ! 213: for (j = col; j < DCOLS; j++) { ! 214: descs[row-1][j-col] = mvinch(row, j); ! 215: } ! 216: descs[row-1][j-col] = 0; ! 217: } ! 218: mvaddstr(row, col, descs[row]); ! 219: clrtoeol(); ! 220: } ! 221: refresh(); ! 222: wait_for_ack(); ! 223: ! 224: move(0, 0); ! 225: clrtoeol(); ! 226: ! 227: for (j = 1; ((j < i) && (j < DROWS)); j++) { ! 228: mvaddstr(j, col, descs[j-1]); ! 229: } ! 230: } ! 231: ! 232: id_com() ! 233: { ! 234: int ch = 0; ! 235: short i, j, k; ! 236: ! 237: while (ch != CANCEL) { ! 238: check_message(); ! 239: message("Character you want help for (* for all):", 0); ! 240: ! 241: refresh(); ! 242: ch = getchar(); ! 243: ! 244: switch(ch) { ! 245: case LIST: ! 246: { ! 247: char save[(((COMS / 2) + (COMS % 2)) + 1)][DCOLS]; ! 248: short rows = (((COMS / 2) + (COMS % 2)) + 1); ! 249: boolean need_two_screens; ! 250: ! 251: if (rows > LINES) { ! 252: need_two_screens = 1; ! 253: rows = LINES; ! 254: } ! 255: k = 0; ! 256: ! 257: for (i = 0; i < rows; i++) { ! 258: for (j = 0; j < DCOLS; j++) { ! 259: save[i][j] = mvinch(i, j); ! 260: } ! 261: } ! 262: MORE: ! 263: for (i = 0; i < rows; i++) { ! 264: move(i, 0); ! 265: clrtoeol(); ! 266: } ! 267: for (i = 0; i < (rows-1); i++) { ! 268: if (i < (LINES-1)) { ! 269: if (((i + i) < COMS) && ((i+i+k) < COMS)) { ! 270: mvaddstr(i, 0, com_id_tab[i+i+k].com_desc); ! 271: } ! 272: if (((i + i + 1) < COMS) && ((i+i+k+1) < COMS)) { ! 273: mvaddstr(i, (DCOLS/2), ! 274: com_id_tab[i+i+k+1].com_desc); ! 275: } ! 276: } ! 277: } ! 278: mvaddstr(rows - 1, 0, need_two_screens ? more : press_space); ! 279: refresh(); ! 280: wait_for_ack(); ! 281: ! 282: if (need_two_screens) { ! 283: k += ((rows-1) * 2); ! 284: need_two_screens = 0; ! 285: goto MORE; ! 286: } ! 287: for (i = 0; i < rows; i++) { ! 288: move(i, 0); ! 289: for (j = 0; j < DCOLS; j++) { ! 290: addch(save[i][j]); ! 291: } ! 292: } ! 293: } ! 294: break; ! 295: default: ! 296: if (!pr_com_id(ch)) { ! 297: if (!pr_motion_char(ch)) { ! 298: check_message(); ! 299: message("unknown character", 0); ! 300: } ! 301: } ! 302: ch = CANCEL; ! 303: break; ! 304: } ! 305: } ! 306: } ! 307: ! 308: pr_com_id(ch) ! 309: int ch; ! 310: { ! 311: int i; ! 312: ! 313: if (!get_com_id(&i, ch)) { ! 314: return(0); ! 315: } ! 316: check_message(); ! 317: message(com_id_tab[i].com_desc, 0); ! 318: return(1); ! 319: } ! 320: ! 321: get_com_id(index, ch) ! 322: int *index; ! 323: short ch; ! 324: { ! 325: short i; ! 326: ! 327: for (i = 0; i < COMS; i++) { ! 328: if (com_id_tab[i].com_char == ch) { ! 329: *index = i; ! 330: return(1); ! 331: } ! 332: } ! 333: return(0); ! 334: } ! 335: ! 336: pr_motion_char(ch) ! 337: int ch; ! 338: { ! 339: if ( (ch == 'J') || ! 340: (ch == 'K') || ! 341: (ch == 'L') || ! 342: (ch == 'H') || ! 343: (ch == 'Y') || ! 344: (ch == 'U') || ! 345: (ch == 'N') || ! 346: (ch == 'B') || ! 347: (ch == '\012') || ! 348: (ch == '\013') || ! 349: (ch == '\010') || ! 350: (ch == '\014') || ! 351: (ch == '\025') || ! 352: (ch == '\031') || ! 353: (ch == '\016') || ! 354: (ch == '\002')) { ! 355: char until[18], buf[DCOLS]; ! 356: int n; ! 357: ! 358: if (ch <= '\031') { ! 359: ch += 96; ! 360: (void) strcpy(until, "until adjascent"); ! 361: } else { ! 362: ch += 32; ! 363: until[0] = '\0'; ! 364: } ! 365: (void) get_com_id(&n, ch); ! 366: sprintf(buf, "run %s %s", com_id_tab[n].com_desc + 8, until); ! 367: check_message(); ! 368: message(buf, 0); ! 369: return(1); ! 370: } else { ! 371: return(0); ! 372: } ! 373: } ! 374: ! 375: mix_colors() ! 376: { ! 377: short i, j, k; ! 378: char *t; ! 379: ! 380: for (i = 0; i <= 32; i++) { ! 381: j = get_rand(0, (POTIONS - 1)); ! 382: k = get_rand(0, (POTIONS - 1)); ! 383: t = id_potions[j].title; ! 384: id_potions[j].title = id_potions[k].title; ! 385: id_potions[k].title = t; ! 386: } ! 387: } ! 388: ! 389: make_scroll_titles() ! 390: { ! 391: short i, j, n; ! 392: short sylls, s; ! 393: ! 394: for (i = 0; i < SCROLS; i++) { ! 395: sylls = get_rand(2, 5); ! 396: (void) strcpy(id_scrolls[i].title, "'"); ! 397: ! 398: for (j = 0; j < sylls; j++) { ! 399: s = get_rand(1, (MAXSYLLABLES-1)); ! 400: (void) strcat(id_scrolls[i].title, syllables[s]); ! 401: } ! 402: n = strlen(id_scrolls[i].title); ! 403: (void) strcpy(id_scrolls[i].title+(n-1), "' "); ! 404: } ! 405: } ! 406: ! 407: get_desc(obj, desc) ! 408: object *obj; ! 409: char *desc; ! 410: { ! 411: char *item_name; ! 412: struct id *id_table; ! 413: char more_info[32]; ! 414: short i; ! 415: ! 416: if (obj->what_is == AMULET) { ! 417: (void) strcpy(desc, "the amulet of Yendor "); ! 418: return; ! 419: } ! 420: item_name = name_of(obj); ! 421: ! 422: if (obj->what_is == GOLD) { ! 423: sprintf(desc, "%d pieces of gold", obj->quantity); ! 424: return; ! 425: } ! 426: ! 427: if (obj->what_is != ARMOR) { ! 428: if (obj->quantity == 1) { ! 429: (void) strcpy(desc, "a "); ! 430: } else { ! 431: sprintf(desc, "%d ", obj->quantity); ! 432: } ! 433: } ! 434: if (obj->what_is == FOOD) { ! 435: if (obj->which_kind == RATION) { ! 436: if (obj->quantity > 1) { ! 437: sprintf(desc, "%d rations of ", obj->quantity); ! 438: } else { ! 439: (void) strcpy(desc, "some "); ! 440: } ! 441: } else { ! 442: (void) strcpy(desc, "a "); ! 443: } ! 444: (void) strcat(desc, item_name); ! 445: goto ANA; ! 446: } ! 447: id_table = get_id_table(obj); ! 448: ! 449: if (wizard) { ! 450: goto ID; ! 451: } ! 452: if (obj->what_is & (WEAPON | ARMOR | WAND | RING)) { ! 453: goto CHECK; ! 454: } ! 455: ! 456: switch(id_table[obj->which_kind].id_status) { ! 457: case UNIDENTIFIED: ! 458: CHECK: ! 459: switch(obj->what_is) { ! 460: case SCROL: ! 461: (void) strcat(desc, item_name); ! 462: (void) strcat(desc, "entitled: "); ! 463: (void) strcat(desc, id_table[obj->which_kind].title); ! 464: break; ! 465: case POTION: ! 466: (void) strcat(desc, id_table[obj->which_kind].title); ! 467: (void) strcat(desc, item_name); ! 468: break; ! 469: case WAND: ! 470: case RING: ! 471: if (obj->identified || ! 472: (id_table[obj->which_kind].id_status == IDENTIFIED)) { ! 473: goto ID; ! 474: } ! 475: if (id_table[obj->which_kind].id_status == CALLED) { ! 476: goto CALL; ! 477: } ! 478: (void) strcat(desc, id_table[obj->which_kind].title); ! 479: (void) strcat(desc, item_name); ! 480: break; ! 481: case ARMOR: ! 482: if (obj->identified) { ! 483: goto ID; ! 484: } ! 485: (void) strcpy(desc, id_table[obj->which_kind].title); ! 486: break; ! 487: case WEAPON: ! 488: if (obj->identified) { ! 489: goto ID; ! 490: } ! 491: (void) strcat(desc, name_of(obj)); ! 492: break; ! 493: } ! 494: break; ! 495: case CALLED: ! 496: CALL: switch(obj->what_is) { ! 497: case SCROL: ! 498: case POTION: ! 499: case WAND: ! 500: case RING: ! 501: (void) strcat(desc, item_name); ! 502: (void) strcat(desc, "called "); ! 503: (void) strcat(desc, id_table[obj->which_kind].title); ! 504: break; ! 505: } ! 506: break; ! 507: case IDENTIFIED: ! 508: ID: switch(obj->what_is) { ! 509: case SCROL: ! 510: case POTION: ! 511: (void) strcat(desc, item_name); ! 512: (void) strcat(desc, id_table[obj->which_kind].real); ! 513: break; ! 514: case RING: ! 515: if (wizard || obj->identified) { ! 516: if ((obj->which_kind == DEXTERITY) || ! 517: (obj->which_kind == ADD_STRENGTH)) { ! 518: sprintf(more_info, "%s%d ", ((obj->class > 0) ? "+" : ""), ! 519: obj->class); ! 520: (void) strcat(desc, more_info); ! 521: } ! 522: } ! 523: (void) strcat(desc, item_name); ! 524: (void) strcat(desc, id_table[obj->which_kind].real); ! 525: break; ! 526: case WAND: ! 527: (void) strcat(desc, item_name); ! 528: (void) strcat(desc, id_table[obj->which_kind].real); ! 529: if (wizard || obj->identified) { ! 530: sprintf(more_info, "[%d]", obj->class); ! 531: (void) strcat(desc, more_info); ! 532: } ! 533: break; ! 534: case ARMOR: ! 535: sprintf(desc, "%s%d ", ((obj->d_enchant >= 0) ? "+" : ""), ! 536: obj->d_enchant); ! 537: (void) strcat(desc, id_table[obj->which_kind].title); ! 538: sprintf(more_info, "[%d] ", get_armor_class(obj)); ! 539: (void) strcat(desc, more_info); ! 540: break; ! 541: case WEAPON: ! 542: sprintf(desc+strlen(desc), "%s%d,%s%d ", ! 543: ((obj->hit_enchant >= 0) ? "+" : ""), obj->hit_enchant, ! 544: ((obj->d_enchant >= 0) ? "+" : ""), obj->d_enchant); ! 545: (void) strcat(desc, name_of(obj)); ! 546: break; ! 547: } ! 548: break; ! 549: } ! 550: ANA: ! 551: if (!strncmp(desc, "a ", 2)) { ! 552: if (is_vowel(desc[2])) { ! 553: for (i = strlen(desc) + 1; i > 1; i--) { ! 554: desc[i] = desc[i-1]; ! 555: } ! 556: desc[1] = 'n'; ! 557: } ! 558: } ! 559: if (obj->in_use_flags & BEING_WIELDED) { ! 560: (void) strcat(desc, "in hand"); ! 561: } else if (obj->in_use_flags & BEING_WORN) { ! 562: (void) strcat(desc, "being worn"); ! 563: } else if (obj->in_use_flags & ON_LEFT_HAND) { ! 564: (void) strcat(desc, "on left hand"); ! 565: } else if (obj->in_use_flags & ON_RIGHT_HAND) { ! 566: (void) strcat(desc, "on right hand"); ! 567: } ! 568: } ! 569: ! 570: get_wand_and_ring_materials() ! 571: { ! 572: short i, j; ! 573: boolean used[WAND_MATERIALS]; ! 574: ! 575: for (i = 0; i < WAND_MATERIALS; i++) { ! 576: used[i] = 0; ! 577: } ! 578: for (i = 0; i < WANDS; i++) { ! 579: do { ! 580: j = get_rand(0, WAND_MATERIALS-1); ! 581: } while (used[j]); ! 582: used[j] = 1; ! 583: (void) strcpy(id_wands[i].title, wand_materials[j]); ! 584: is_wood[i] = (j > MAX_METAL); ! 585: } ! 586: for (i = 0; i < GEMS; i++) { ! 587: used[i] = 0; ! 588: } ! 589: for (i = 0; i < RINGS; i++) { ! 590: do { ! 591: j = get_rand(0, GEMS-1); ! 592: } while (used[j]); ! 593: used[j] = 1; ! 594: (void) strcpy(id_rings[i].title, gems[j]); ! 595: } ! 596: } ! 597: ! 598: single_inv(ichar) ! 599: short ichar; ! 600: { ! 601: short ch; ! 602: char desc[DCOLS]; ! 603: object *obj; ! 604: ! 605: ch = ichar ? ichar : pack_letter("inventory what?", ALL_OBJECTS); ! 606: ! 607: if (ch == CANCEL) { ! 608: return; ! 609: } ! 610: if (!(obj = get_letter_object(ch))) { ! 611: message("no such item.", 0); ! 612: return; ! 613: } ! 614: desc[0] = ch; ! 615: desc[1] = ((obj->what_is & ARMOR) && obj->is_protected) ? '}' : ')'; ! 616: desc[2] = ' '; ! 617: desc[3] = 0; ! 618: get_desc(obj, desc+3); ! 619: message(desc, 0); ! 620: } ! 621: ! 622: struct id * ! 623: get_id_table(obj) ! 624: object *obj; ! 625: { ! 626: switch(obj->what_is) { ! 627: case SCROL: ! 628: return(id_scrolls); ! 629: case POTION: ! 630: return(id_potions); ! 631: case WAND: ! 632: return(id_wands); ! 633: case RING: ! 634: return(id_rings); ! 635: case WEAPON: ! 636: return(id_weapons); ! 637: case ARMOR: ! 638: return(id_armors); ! 639: } ! 640: return((struct id *) 0); ! 641: } ! 642: ! 643: inv_armor_weapon(is_weapon) ! 644: boolean is_weapon; ! 645: { ! 646: if (is_weapon) { ! 647: if (rogue.weapon) { ! 648: single_inv(rogue.weapon->ichar); ! 649: } else { ! 650: message("not wielding anything", 0); ! 651: } ! 652: } else { ! 653: if (rogue.armor) { ! 654: single_inv(rogue.armor->ichar); ! 655: } else { ! 656: message("not wearing anything", 0); ! 657: } ! 658: } ! 659: } ! 660: ! 661: id_type() ! 662: { ! 663: char *id; ! 664: int ch; ! 665: char buf[DCOLS]; ! 666: ! 667: message("what do you want identified?", 0); ! 668: ! 669: ch = rgetchar(); ! 670: ! 671: if ((ch >= 'A') && (ch <= 'Z')) { ! 672: id = m_names[ch-'A']; ! 673: } else if (ch < 32) { ! 674: check_message(); ! 675: return; ! 676: } else { ! 677: switch(ch) { ! 678: case '@': ! 679: id = "you"; ! 680: break; ! 681: case '%': ! 682: id = "staircase"; ! 683: break; ! 684: case '^': ! 685: id = "trap"; ! 686: break; ! 687: case '+': ! 688: id = "door"; ! 689: break; ! 690: case '-': ! 691: case '|': ! 692: id = "wall of a room"; ! 693: break; ! 694: case '.': ! 695: id = "floor"; ! 696: break; ! 697: case '#': ! 698: id = "passage"; ! 699: break; ! 700: case ' ': ! 701: id = "solid rock"; ! 702: break; ! 703: case '=': ! 704: id = "ring"; ! 705: break; ! 706: case '?': ! 707: id = "scroll"; ! 708: break; ! 709: case '!': ! 710: id = "potion"; ! 711: break; ! 712: case '/': ! 713: id = "wand or staff"; ! 714: break; ! 715: case ')': ! 716: id = "weapon"; ! 717: break; ! 718: case ']': ! 719: id = "armor"; ! 720: break; ! 721: case '*': ! 722: id = "gold"; ! 723: break; ! 724: case ':': ! 725: id = "food"; ! 726: break; ! 727: case ',': ! 728: id = "the Amulet of Yendor"; ! 729: break; ! 730: default: ! 731: id = "unknown character"; ! 732: break; ! 733: } ! 734: } ! 735: check_message(); ! 736: sprintf(buf, "'%c': %s", ch, id); ! 737: message(buf, 0); ! 738: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.