Annotation of early-roguelike/arogue7/wizard.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * wizard.c - Special wizard commands
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: /*
! 16: * Special wizard commands (some of which are also non-wizard commands
! 17: * under strange circumstances)
! 18: */
! 19:
! 20: #include "curses.h"
! 21: #include <stdlib.h>
! 22: #include <string.h>
! 23: #include <ctype.h>
! 24: #include "rogue.h"
! 25: #ifdef PC7300
! 26: #include "menu.h"
! 27: #endif
! 28:
! 29: int getbless(void);
! 30:
! 31: /*
! 32: * create_obj:
! 33: * Create any object for wizard, scroll, magician, or cleric
! 34: */
! 35: void
! 36: create_obj(bool prompt, int which_item, int which_type)
! 37: {
! 38: reg struct linked_list *item;
! 39: reg struct object *obj;
! 40: reg int wh;
! 41: reg char ch, newitem, newtype, whc, msz, *pt;
! 42: WINDOW *thiswin;
! 43:
! 44: thiswin = cw;
! 45: if (prompt) {
! 46: bool nogood = TRUE;
! 47:
! 48: thiswin = hw;
! 49: wclear(hw);
! 50: wprintw(hw,"Item\t\t\tKey\n\n");
! 51: wprintw(hw,"%s\t\t\t%c\n%s\t\t\t%c\n",things[TYP_RING].mi_name,RING,
! 52: things[TYP_STICK].mi_name,STICK);
! 53: wprintw(hw,"%s\t\t\t%c\n%s\t\t\t%c\n",things[TYP_POTION].mi_name,POTION,
! 54: things[TYP_SCROLL].mi_name,SCROLL);
! 55: wprintw(hw,"%s\t\t\t%c\n%s\t\t\t%c\n",things[TYP_ARMOR].mi_name,ARMOR,
! 56: things[TYP_WEAPON].mi_name,WEAPON);
! 57: wprintw(hw,"%s\t%c\n",things[TYP_MM].mi_name,MM);
! 58: wprintw(hw,"%s\t\t\t%c\n",things[TYP_FOOD].mi_name,FOOD);
! 59: if (wizard) {
! 60: wprintw(hw,"%s\t\t%c\n",things[TYP_RELIC].mi_name,RELIC);
! 61: waddstr(hw,"monster\t\t\tm");
! 62: }
! 63: wprintw(hw,"\n\nWhat do you want to create? ");
! 64: draw(hw);
! 65: do {
! 66: ch = wgetch(hw);
! 67: if (ch == ESCAPE) {
! 68: restscr(cw);
! 69: return;
! 70: }
! 71: switch (ch) {
! 72: case RING:
! 73: case STICK:
! 74: case POTION:
! 75: case SCROLL:
! 76: case ARMOR:
! 77: case WEAPON:
! 78: case FOOD:
! 79: case MM:
! 80: nogood = FALSE;
! 81: break;
! 82: case RELIC:
! 83: case 'm':
! 84: if (wizard)
! 85: nogood = FALSE;
! 86: break;
! 87: default:
! 88: nogood = TRUE;
! 89: }
! 90: } while (nogood);
! 91: newitem = ch;
! 92: }
! 93: else
! 94: newitem = which_item;
! 95:
! 96: pt = "those";
! 97: msz = 0;
! 98: if(newitem == 'm') {
! 99: /* make monster and be done with it */
! 100: wh = makemonster(TRUE, "Creation", "create");
! 101: if (wh > 0) {
! 102: creat_mons (&player, wh, TRUE);
! 103: light(&hero);
! 104: }
! 105: return;
! 106: }
! 107: if(newitem == GOLD)
! 108: pt = "gold";
! 109: /* else if(isatrap(newitem))
! 110: pt = "traps";
! 111: */
! 112: switch(newitem) {
! 113: case POTION: whc = TYP_POTION; msz = MAXPOTIONS;
! 114: when SCROLL: whc = TYP_SCROLL; msz = MAXSCROLLS;
! 115: when WEAPON: whc = TYP_WEAPON; msz = MAXWEAPONS;
! 116: when ARMOR: whc = TYP_ARMOR; msz = MAXARMORS;
! 117: when RING: whc = TYP_RING; msz = MAXRINGS;
! 118: when STICK: whc = TYP_STICK; msz = MAXSTICKS;
! 119: when MM: whc = TYP_MM; msz = MAXMM;
! 120: when RELIC: whc = TYP_RELIC; msz = MAXRELIC;
! 121: when FOOD: whc = TYP_FOOD; msz = MAXFOODS;
! 122: otherwise:
! 123: if (thiswin == hw)
! 124: restscr(cw);
! 125: mpos = 0;
! 126: msg("Even wizards can't create %s !!",pt);
! 127: return;
! 128: }
! 129: if(msz == 1) { /* if only one type of item */
! 130: ch = 'a';
! 131: }
! 132: else if (prompt) {
! 133: register struct magic_item *wmi;
! 134: char wmn;
! 135: register int ii;
! 136: int old_prob;
! 137:
! 138: mpos = 0;
! 139: wmi = NULL;
! 140: wmn = 0;
! 141: switch(newitem) {
! 142: case POTION: wmi = &p_magic[0];
! 143: when SCROLL: wmi = &s_magic[0];
! 144: when RING: wmi = &r_magic[0];
! 145: when STICK: wmi = &ws_magic[0];
! 146: when MM: wmi = &m_magic[0];
! 147: when RELIC: wmi = &rel_magic[0];
! 148: when FOOD: wmi = &foods[0];
! 149: when WEAPON: wmn = 1;
! 150: when ARMOR: wmn = 2;
! 151: }
! 152: wclear(hw);
! 153: thiswin = hw;
! 154: if (wmi != NULL) {
! 155: ii = old_prob = 0;
! 156: while (ii < msz) {
! 157: if(wmi->mi_prob == old_prob && wizard == FALSE) {
! 158: msz--; /* can't make a unique item */
! 159: }
! 160: else {
! 161: mvwaddch(hw,ii % 13,ii > 12 ? cols/2 : 0, ii + 'a');
! 162: waddstr(hw,") ");
! 163: waddstr(hw,wmi->mi_name);
! 164: ii++;
! 165: }
! 166: old_prob = wmi->mi_prob;
! 167: wmi++;
! 168: }
! 169: }
! 170: else if (wmn != 0) {
! 171: for(ii = 0 ; ii < msz ; ii++) {
! 172: mvwaddch(hw,ii % 13,ii > 12 ? cols/2 : 0, ii + 'a');
! 173: waddstr(hw,") ");
! 174: if(wmn == 1)
! 175: waddstr(hw,weaps[ii].w_name);
! 176: else
! 177: waddstr(hw,armors[ii].a_name);
! 178: }
! 179: }
! 180: sprintf(prbuf,"Which %s? ",things[whc].mi_name);
! 181: mvwaddstr(hw,lines - 1, 0, prbuf);
! 182: draw(hw);
! 183: do {
! 184: ch = wgetch(hw);
! 185: if (ch == ESCAPE) {
! 186: restscr(cw);
! 187: msg("");
! 188: return;
! 189: }
! 190: } until (isalpha(ch));
! 191: if (thiswin == hw) /* restore screen if need be */
! 192: restscr(cw);
! 193: newtype = tolower(ch) - 'a';
! 194: if(newtype < 0 || newtype >= msz) { /* if an illegal value */
! 195: mpos = 0;
! 196: msg("There is no such %s",things[whc].mi_name);
! 197: return;
! 198: }
! 199: }
! 200: else
! 201: newtype = which_type;
! 202: item = new_item(sizeof *obj); /* get some memory */
! 203: obj = OBJPTR(item);
! 204: obj->o_type = newitem; /* store the new items */
! 205: obj->o_mark[0] = '\0';
! 206: obj->o_which = newtype;
! 207: obj->o_group = 0;
! 208: obj->contents = NULL;
! 209: obj->o_count = 1;
! 210: obj->o_flags = 0;
! 211: obj->o_dplus = obj->o_hplus = 0;
! 212: obj->o_weight = 0;
! 213: wh = obj->o_which;
! 214: mpos = 0;
! 215: if (!wizard) /* users get 0 to +3 */
! 216: whc = rnd(4);
! 217: else /* wizard gets to choose */
! 218: whc = getbless();
! 219: if (whc < 0)
! 220: obj->o_flags |= ISCURSED;
! 221: switch (obj->o_type) {
! 222: case WEAPON:
! 223: case ARMOR:
! 224: if (obj->o_type == WEAPON) {
! 225: init_weapon(obj, wh);
! 226: obj->o_hplus += whc;
! 227: obj->o_dplus += whc;
! 228: }
! 229: else { /* armor here */
! 230: obj->o_weight = armors[wh].a_wght;
! 231: obj->o_ac = armors[wh].a_class - whc;
! 232: }
! 233: when RING:
! 234: if (whc > 1 && r_magic[wh].mi_bless != 0)
! 235: obj->o_flags |= ISBLESSED;
! 236: r_know[wh] = TRUE;
! 237: switch(wh) {
! 238: case R_ADDSTR:
! 239: case R_ADDWISDOM:
! 240: case R_ADDINTEL:
! 241: case R_PROTECT:
! 242: case R_ADDHIT:
! 243: case R_ADDDAM:
! 244: case R_DIGEST:
! 245: obj->o_ac = whc + 1;
! 246: break;
! 247: default:
! 248: obj->o_ac = 0;
! 249: }
! 250: obj->o_weight = things[TYP_RING].mi_wght;
! 251: when MM:
! 252: if (whc > 1 && m_magic[wh].mi_bless != 0)
! 253: obj->o_flags |= ISBLESSED;
! 254: m_know[wh] = TRUE;
! 255: switch(wh) {
! 256: case MM_JUG:
! 257: switch(rnd(11)) {
! 258: case 0: obj->o_ac = P_PHASE;
! 259: when 1: obj->o_ac = P_CLEAR;
! 260: when 2: obj->o_ac = P_SEEINVIS;
! 261: when 3: obj->o_ac = P_HEALING;
! 262: when 4: obj->o_ac = P_MFIND;
! 263: when 5: obj->o_ac = P_TFIND;
! 264: when 6: obj->o_ac = P_HASTE;
! 265: when 7: obj->o_ac = P_RESTORE;
! 266: when 8: obj->o_ac = P_FLY;
! 267: when 9: obj->o_ac = P_SKILL;
! 268: when 10:obj->o_ac = P_FFIND;
! 269: }
! 270: when MM_OPEN:
! 271: case MM_HUNGER:
! 272: case MM_DRUMS:
! 273: case MM_DISAPPEAR:
! 274: case MM_CHOKE:
! 275: case MM_KEOGHTOM:
! 276: if (whc < 0)
! 277: whc = -whc; /* these cannot be negative */
! 278: obj->o_ac = (whc + 1) * 5;
! 279: break;
! 280: when MM_BRACERS:
! 281: obj->o_ac = whc * 2 + 1;
! 282: when MM_DISP:
! 283: obj->o_ac = 2;
! 284: when MM_PROTECT:
! 285: obj->o_ac = whc;
! 286: when MM_SKILLS:
! 287: if (wizard && whc != 0)
! 288: obj->o_ac = rnd(NUM_CHARTYPES-1);
! 289: else
! 290: obj->o_ac = player.t_ctype;
! 291: otherwise:
! 292: obj->o_ac = 0;
! 293: }
! 294: obj->o_weight = things[TYP_MM].mi_wght;
! 295: when STICK:
! 296: if (whc > 1 && ws_magic[wh].mi_bless != 0)
! 297: obj->o_flags |= ISBLESSED;
! 298: ws_know[wh] = TRUE;
! 299: fix_stick(obj);
! 300: when SCROLL:
! 301: if (whc > 1 && s_magic[wh].mi_bless != 0)
! 302: obj->o_flags |= ISBLESSED;
! 303: obj->o_weight = things[TYP_SCROLL].mi_wght;
! 304: s_know[wh] = TRUE;
! 305: when POTION:
! 306: if (whc > 1 && p_magic[wh].mi_bless != 0)
! 307: obj->o_flags |= ISBLESSED;
! 308: obj->o_weight = things[TYP_POTION].mi_wght;
! 309: if (wh == P_ABIL) obj->o_kind = rnd(NUMABILITIES);
! 310: p_know[wh] = TRUE;
! 311: when RELIC:
! 312: obj->o_weight = things[TYP_RELIC].mi_wght;
! 313: switch (obj->o_which) {
! 314: case QUILL_NAGROM: obj->o_charges = QUILLCHARGES;
! 315: when EMORI_CLOAK: obj->o_charges = 1;
! 316: otherwise: break;
! 317: }
! 318: when FOOD:
! 319: obj->o_weight = things[TYP_FOOD].mi_wght;
! 320: }
! 321: mpos = 0;
! 322: obj->o_flags |= ISKNOW;
! 323: if (add_pack(item, FALSE, NULL) == FALSE) {
! 324: obj->o_pos = hero;
! 325: fall(item, TRUE);
! 326: }
! 327: }
! 328:
! 329: /*
! 330: * getbless:
! 331: * Get a blessing for a wizards object
! 332: */
! 333: int
! 334: getbless(void)
! 335: {
! 336: reg char bless;
! 337:
! 338: msg("Blessing? (+,-,n)");
! 339: bless = wgetch(msgw);
! 340: if (bless == '+')
! 341: return (rnd(3) + 2);
! 342: else if (bless == '-')
! 343: return (-rnd(3) - 1);
! 344: else
! 345: return (0);
! 346: }
! 347:
! 348: /*
! 349: * get a non-monster death type
! 350: */
! 351: int
! 352: getdeath(void)
! 353: {
! 354: register int i;
! 355: int which_death;
! 356: char label[80];
! 357:
! 358: clear();
! 359: for (i=0; i<DEATHNUM; i++) {
! 360: sprintf(label, "[%d] %s", i+1, deaths[i].name);
! 361: mvaddstr(i+2, 0, label);
! 362: }
! 363: mvaddstr(0, 0, "Which death? ");
! 364: refresh();
! 365:
! 366: /* Get the death */
! 367: for (;;) {
! 368: get_str(label, stdscr);
! 369: which_death = atoi(label);
! 370: if ((which_death < 1 || which_death > DEATHNUM)) {
! 371: mvaddstr(0, 0, "Please enter a number in the displayed range -- ");
! 372: refresh();
! 373: }
! 374: else break;
! 375: }
! 376: return(deaths[which_death-1].reason);
! 377: }
! 378:
! 379: #ifdef PC7300
! 380: static menu_t Display; /* The menu structure */
! 381: static mitem_t Dispitems[NUMMONST+1]; /* Info for each line */
! 382: static char Displines[NUMMONST+1][LINELEN+1]; /* The lines themselves */
! 383: #endif
! 384:
! 385: /*
! 386: * make a monster for the wizard
! 387: * showall -> show uniques and genocided creatures
! 388: */
! 389: short
! 390: makemonster(bool showall, char *label, char *action)
! 391: {
! 392: #ifdef PC7300
! 393: register int nextmonst;
! 394: #endif
! 395: register int i;
! 396: register short which_monst;
! 397: register int num_monst = NUMMONST, pres_monst=1, num_lines=2*(lines-3);
! 398: int max_monster;
! 399: char monst_name[40];
! 400:
! 401: /* If we're not showing all, subtract out the UNIQUES and quartermaster */
! 402: if (!showall) num_monst -= NUMUNIQUE + 1;
! 403: max_monster = num_monst;
! 404:
! 405: #ifdef PC7300
! 406: nextmonst = 0;
! 407: for (i=1; i<=num_monst; i++) {
! 408: /* Only display existing monsters if we're not showing them all */
! 409: if (showall || monsters[i].m_normal) {
! 410: strcpy(Displines[nextmonst], monsters[i]);
! 411: Dispitems[nextmonst].mi_name = Displines[nextmonst];
! 412: Dispitems[nextmonst].mi_flags = 0;
! 413: Dispitems[nextmonst++].mi_val = i;
! 414: }
! 415: }
! 416:
! 417: /* Place an end marker for the items */
! 418: Dispitems[nextmonst].mi_name = 0;
! 419:
! 420: /* Set up the main menu structure */
! 421: Display.m_label = label;
! 422: Display.m_title = "Monster Listing";
! 423: Display.m_prompt = "Select a monster or press Cancl.";
! 424: Display.m_curptr = '\0';
! 425: Display.m_markptr = '\0';
! 426: Display.m_flags = 0;
! 427: Display.m_selcnt = 1;
! 428: Display.m_items = Dispitems;
! 429: Display.m_curi = 0;
! 430:
! 431: /*
! 432: * Try to display the menu. If we don't have a local terminal,
! 433: * the call will fail and we will just continue with the
! 434: * normal mode.
! 435: */
! 436: if (menu(&Display) >= 0) {
! 437: restscr(cw);
! 438: touchwin(cw);
! 439: return(Display.m_selcnt == 1 ? Display.m_curi->mi_val : -1);
! 440: }
! 441: #endif
! 442:
! 443: /* Print out the monsters */
! 444: while (num_monst > 0) {
! 445: int left_limit;
! 446:
! 447: if (num_monst < num_lines) left_limit = (num_monst+1)/2;
! 448: else left_limit = num_lines/2;
! 449:
! 450: wclear(hw);
! 451: touchwin(hw);
! 452:
! 453: /* Print left column */
! 454: wmove(hw, 2, 0);
! 455: for (i=0; i<left_limit; i++) {
! 456: sprintf(monst_name, "[%d] %c%s\n",
! 457: pres_monst,
! 458: (showall || monsters[pres_monst].m_normal)
! 459: ? ' '
! 460: : '*',
! 461: monsters[pres_monst].m_name);
! 462: waddstr(hw, monst_name);
! 463: pres_monst++;
! 464: }
! 465:
! 466: /* Print right column */
! 467: for (i=0; i<left_limit && pres_monst<=max_monster; i++) {
! 468: sprintf(monst_name, "[%d] %c%s",
! 469: pres_monst,
! 470: (showall || monsters[pres_monst].m_normal)
! 471: ? ' '
! 472: : '*',
! 473: monsters[pres_monst].m_name);
! 474: wmove(hw, i+2, cols/2);
! 475: waddstr(hw, monst_name);
! 476: pres_monst++;
! 477: }
! 478:
! 479: if ((num_monst -= num_lines) > 0) {
! 480: mvwaddstr(hw, lines-1, 0, morestr);
! 481: draw(hw);
! 482: wait_for(' ');
! 483: }
! 484:
! 485: else {
! 486: mvwaddstr(hw, 0, 0, "Which monster");
! 487: if (!terse) {
! 488: waddstr(hw, " do you wish to ");
! 489: waddstr(hw, action);
! 490: }
! 491: waddstr(hw, "? ");
! 492: draw(hw);
! 493: }
! 494: }
! 495:
! 496: get_monst:
! 497: get_str(monst_name, hw);
! 498: which_monst = atoi(monst_name);
! 499: if ((which_monst < 1 || which_monst > max_monster)) {
! 500: mvwaddstr(hw, 0, 0, "Please enter a number in the displayed range -- ");
! 501: draw(hw);
! 502: goto get_monst;
! 503: }
! 504: restscr(cw);
! 505: touchwin(cw);
! 506: return(which_monst);
! 507: }
! 508:
! 509: /*
! 510: * passwd:
! 511: * see if user knows password
! 512: */
! 513:
! 514: bool
! 515: passwd(void)
! 516: {
! 517: register char *sp, c;
! 518: char buf[LINELEN], *crypt();
! 519:
! 520: msg("Wizard's Password:");
! 521: mpos = 0;
! 522: sp = buf;
! 523: while ((c = readchar()) != '\n' && c != '\r' && c != '\033')
! 524: if (c == md_killchar())
! 525: sp = buf;
! 526: else if (c == md_erasechar() && sp > buf)
! 527: sp--;
! 528: else
! 529: *sp++ = c;
! 530: if (sp == buf)
! 531: return FALSE;
! 532: *sp = '\0';
! 533: return (strcmp(PASSWD, md_crypt(buf, "mT")) == 0);
! 534: }
! 535:
! 536:
! 537: /*
! 538: * teleport:
! 539: * Bamf the hero someplace else
! 540: */
! 541:
! 542: int
! 543: teleport(void)
! 544: {
! 545: register struct room *new_rp = NULL, *old_rp = roomin(&hero);
! 546: register int rm, which;
! 547: coord old;
! 548: bool got_position = FALSE;
! 549:
! 550: /* Disrupt whatever the hero was doing */
! 551: dsrpt_player();
! 552:
! 553: /*
! 554: * If the hero wasn't doing something disruptable, NULL out his
! 555: * action anyway and let him know about it. We don't want him
! 556: * swinging or moving into his old place.
! 557: */
! 558: if (player.t_action != A_NIL) {
! 559: player.t_action = A_NIL;
! 560: msg("You feel momentarily disoriented.");
! 561: }
! 562:
! 563: old = hero;
! 564: mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x));
! 565: if (ISWEARING(R_TELCONTROL) || wizard) {
! 566: got_position = move_hero(H_TELEPORT);
! 567: if (!got_position)
! 568: msg("Your attempt fails.");
! 569: else {
! 570: new_rp = roomin(&hero);
! 571: msg("You teleport successfully.");
! 572: }
! 573: }
! 574: if (!got_position) {
! 575: do {
! 576: rm = rnd_room();
! 577: rnd_pos(&rooms[rm], &hero);
! 578: } until(winat(hero.y, hero.x) == FLOOR);
! 579: new_rp = &rooms[rm];
! 580: }
! 581: player.t_oldpos = old; /* Save last position */
! 582:
! 583: /* If hero gets moved, darken old room */
! 584: if (old_rp && old_rp != new_rp) {
! 585: old_rp->r_flags |= FORCEDARK; /* Fake darkness */
! 586: light(&old);
! 587: old_rp->r_flags &= ~FORCEDARK; /* Restore light state */
! 588: }
! 589:
! 590: /* Darken where we just came from */
! 591: else if (levtype == MAZELEV) light(&old);
! 592:
! 593: light(&hero);
! 594: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 595: /* if entering a treasure room, wake everyone up......Surprise! */
! 596: if (new_rp->r_flags & ISTREAS)
! 597: wake_room(new_rp);
! 598:
! 599: /* Reset current room and position */
! 600: oldrp = new_rp; /* Used in look() */
! 601: player.t_oldpos = hero;
! 602: /*
! 603: * make sure we set/unset the ISINWALL on a teleport
! 604: */
! 605: which = winat(hero.y, hero.x);
! 606: if (isrock(which)) turn_on(player, ISINWALL);
! 607: else turn_off(player, ISINWALL);
! 608:
! 609: /*
! 610: * turn off ISHELD in case teleportation was done while fighting
! 611: * something that holds you
! 612: */
! 613: if (on(player, ISHELD)) {
! 614: register struct linked_list *ip, *nip;
! 615: register struct thing *mp;
! 616:
! 617: turn_off(player, ISHELD);
! 618: hold_count = 0;
! 619: for (ip = mlist; ip; ip = nip) {
! 620: mp = THINGPTR(ip);
! 621: nip = next(ip);
! 622: if (on(*mp, DIDHOLD)) {
! 623: turn_off(*mp, DIDHOLD);
! 624: turn_on(*mp, CANHOLD);
! 625: }
! 626: turn_off(*mp, DIDSUFFOCATE); /* Suffocation -- see below */
! 627: }
! 628: }
! 629:
! 630: /* Make sure player does not suffocate */
! 631: extinguish(suffocate);
! 632:
! 633: count = 0;
! 634: running = FALSE;
! 635: md_flushinp();
! 636: return rm;
! 637: }
! 638:
! 639: /*
! 640: * whatis:
! 641: * What a certin object is
! 642: */
! 643:
! 644: void
! 645: whatis(struct linked_list *what)
! 646: {
! 647: register struct object *obj;
! 648: register struct linked_list *item;
! 649:
! 650: if (what == NULL) { /* do we need to ask which one? */
! 651: if ((item = get_item(pack, "identify", IDENTABLE, FALSE, FALSE))==NULL)
! 652: return;
! 653: }
! 654: else
! 655: item = what;
! 656: obj = OBJPTR(item);
! 657: switch (obj->o_type) {
! 658: case SCROLL:
! 659: s_know[obj->o_which] = TRUE;
! 660: if (s_guess[obj->o_which]) {
! 661: free(s_guess[obj->o_which]);
! 662: s_guess[obj->o_which] = NULL;
! 663: }
! 664: when POTION:
! 665: p_know[obj->o_which] = TRUE;
! 666: if (p_guess[obj->o_which]) {
! 667: free(p_guess[obj->o_which]);
! 668: p_guess[obj->o_which] = NULL;
! 669: }
! 670: when STICK:
! 671: ws_know[obj->o_which] = TRUE;
! 672: if (ws_guess[obj->o_which]) {
! 673: free(ws_guess[obj->o_which]);
! 674: ws_guess[obj->o_which] = NULL;
! 675: }
! 676: when RING:
! 677: r_know[obj->o_which] = TRUE;
! 678: if (r_guess[obj->o_which]) {
! 679: free(r_guess[obj->o_which]);
! 680: r_guess[obj->o_which] = NULL;
! 681: }
! 682: when MM:
! 683: /* If it's an identified jug, identify its potion */
! 684: if (obj->o_which == MM_JUG && (obj->o_flags & ISKNOW)) {
! 685: if (obj->o_ac != JUG_EMPTY)
! 686: p_know[obj->o_ac] = TRUE;
! 687: break;
! 688: }
! 689:
! 690: m_know[obj->o_which] = TRUE;
! 691: if (m_guess[obj->o_which]) {
! 692: free(m_guess[obj->o_which]);
! 693: m_guess[obj->o_which] = NULL;
! 694: }
! 695: otherwise:
! 696: break;
! 697: }
! 698: obj->o_flags |= ISKNOW;
! 699: if (what == NULL)
! 700: msg(inv_name(obj, FALSE));
! 701: }
! 702:
CVSweb