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