Annotation of early-roguelike/urogue/scrolls.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: scrolls.c - Functions for dealing with scrolls
! 3:
! 4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
! 5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
! 6: All rights reserved.
! 7:
! 8: Based on "Advanced Rogue"
! 9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
! 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: #include <stdlib.h>
! 20: #include <string.h>
! 21: #include <ctype.h>
! 22: #include "rogue.h"
! 23:
! 24: /*
! 25: read_scroll - read a scroll (or effect a scroll-like spell)
! 26: reader: who does it
! 27: which: which S_SCROLL (-1 means ask from pack)
! 28: flags: ISBLESSED, ISCURSED
! 29: */
! 30:
! 31: void
! 32: read_scroll(struct thing *reader, int which, int flags)
! 33: {
! 34: struct object *obj;
! 35: struct linked_list *item, *nitem;
! 36: int i, j, charm_power;
! 37: char ch, nch;
! 38: int blessed = flags & ISBLESSED;
! 39: int cursed = flags & ISCURSED;
! 40: int is_scroll = (which < 0 ? TRUE : FALSE);
! 41: char buf[2 * LINELEN];
! 42:
! 43: if (reader != &player)
! 44: {
! 45: monread(reader, which, flags);
! 46: return;
! 47: }
! 48:
! 49: if (is_scroll) /* A regular scroll */
! 50: {
! 51: if ((item = get_item("read", SCROLL)) == NULL)
! 52: return;
! 53:
! 54: obj = OBJPTR(item);
! 55:
! 56: if (obj->o_type != SCROLL)
! 57: {
! 58: msg("It says 'Made in Yugoslavia'!");
! 59: return;
! 60: }
! 61:
! 62: if (on(player, ISBLIND))
! 63: {
! 64: msg("You can't see to read anything.");
! 65: return;
! 66: }
! 67:
! 68: /* Calculate its effect */
! 69:
! 70: cursed = obj->o_flags & ISCURSED;
! 71: blessed = obj->o_flags & ISBLESSED;
! 72: flags = obj->o_flags;
! 73: which = obj->o_which;
! 74:
! 75: /* remove it from the pack */
! 76:
! 77: rem_pack(obj);
! 78: discard(item);
! 79: updpack();
! 80: }
! 81:
! 82: switch (which)
! 83: {
! 84: case S_CONFUSE: /* Touch causes monster confusion. */
! 85: if (cursed)
! 86: quaff(reader, P_CLEAR, ISCURSED);
! 87: else
! 88: {
! 89: msg("Your hands begin to glow red.");
! 90: turn_on(player, CANHUH);
! 91: /* if blessed... */
! 92: }
! 93: break;
! 94:
! 95: case S_CURING: /* A cure disease spell */
! 96: if (on(player, HASINFEST) || on(player, HASDISEASE))
! 97: {
! 98: if (!cursed && on(player, HASDISEASE))
! 99: {
! 100: extinguish_fuse(FUSE_CURE_DISEASE);
! 101: cure_disease(NULL);
! 102: }
! 103:
! 104: if (on(player, HASINFEST))
! 105: {
! 106: msg("You begin to feel yourself improving again.");
! 107: turn_off(player, HASINFEST);
! 108: infest_dam = 0;
! 109: }
! 110:
! 111: if (is_scroll)
! 112: know_items[TYP_SCROLL][S_CURING] = TRUE;
! 113: }
! 114: else
! 115: nothing_message(flags);
! 116: break;
! 117:
! 118: case S_LIGHT:
! 119: if (blue_light(flags) && is_scroll)
! 120: know_items[TYP_SCROLL][S_LIGHT] = TRUE;
! 121: break;
! 122:
! 123: case S_HOLD:
! 124: if (cursed)
! 125: {
! 126: /*
! 127: * This scroll aggravates all the monsters on the
! 128: * current level and sets them running towards the
! 129: * hero
! 130: */
! 131: aggravate();
! 132: hearmsg("You hear a high pitched humming noise.");
! 133: }
! 134: else if (blessed) /* Hold all monsters on level */
! 135: {
! 136: if (mlist == NULL)
! 137: nothing_message(flags);
! 138: else
! 139: {
! 140: struct linked_list *mon;
! 141: struct thing *th;
! 142:
! 143: for (mon = mlist; mon != NULL; mon = next(mon))
! 144: {
! 145: th = THINGPTR(mon);
! 146: turn_off(*th, ISRUN);
! 147: turn_on(*th, ISHELD);
! 148: }
! 149: msg("A sudden peace comes over the dungeon.");
! 150: }
! 151: }
! 152: else
! 153: {
! 154: /*
! 155: * Hold monster scroll. Stop all monsters within two
! 156: * spaces from chasing after the hero.
! 157: */
! 158: int x, y;
! 159: struct linked_list *mon;
! 160: int gotone = FALSE;
! 161:
! 162: for (x = hero.x - 2; x <= hero.x + 2; x++)
! 163: {
! 164: for (y = hero.y - 2; y <= hero.y + 2; y++)
! 165: {
! 166: if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
! 167: {
! 168: if ((mon = find_mons(y, x)) != NULL)
! 169: {
! 170: struct thing *th;
! 171:
! 172: gotone = TRUE;
! 173: th = THINGPTR(mon);
! 174: turn_off(*th, ISRUN);
! 175: turn_on(*th, ISHELD);
! 176: }
! 177: }
! 178: }
! 179: }
! 180:
! 181: if (gotone)
! 182: msg("A sudden peace surrounds you.");
! 183: else
! 184: nothing_message(flags);
! 185: }
! 186: break;
! 187:
! 188: case S_SLEEP:
! 189:
! 190: /* if cursed, you fall asleep */
! 191:
! 192: if (cursed)
! 193: {
! 194: if (is_wearing(R_ALERT))
! 195: msg("You feel drowsy for a moment.");
! 196: else
! 197: {
! 198: msg("You fall asleep.");
! 199: no_command += 4 + rnd(SLEEPTIME);
! 200: }
! 201: }
! 202: else
! 203: {
! 204: /*
! 205: * sleep monster scroll. puts all monsters within 2
! 206: * spaces asleep
! 207: */
! 208: int x, y;
! 209: struct linked_list *mon;
! 210: int gotone = FALSE;
! 211:
! 212: for (x = hero.x - 2; x <= hero.x + 2; x++)
! 213: {
! 214: for (y = hero.y - 2; y <= hero.y + 2; y++)
! 215: {
! 216: if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
! 217: {
! 218: if ((mon = find_mons(y, x)) != NULL)
! 219: {
! 220: struct thing *th;
! 221: th = THINGPTR(mon);
! 222:
! 223: if (on(*th, ISUNDEAD))
! 224: continue;
! 225:
! 226: gotone = TRUE;
! 227: th->t_no_move += SLEEPTIME;
! 228: }
! 229: }
! 230: }
! 231: }
! 232:
! 233: if (gotone)
! 234: msg("The monster(s) around you seem to have fallen asleep.");
! 235: else
! 236: nothing_message(flags);
! 237: }
! 238: break;
! 239:
! 240: case S_CREATE:
! 241: {
! 242: /*
! 243: * Create a monster. First look in a circle around
! 244: * him, next try his room otherwise give up
! 245: */
! 246:
! 247: struct thing *tp;
! 248: struct linked_list *ip;
! 249:
! 250: if (blessed)
! 251: summon_monster((short) 0, NOFAMILIAR, MESSAGE);
! 252: else if (cursed)
! 253: {
! 254: i = rnd(4) + 3;
! 255: for (j = 0; j < i; j++)
! 256: {
! 257: if ((ip = creat_mons(&player, (short) 0, MESSAGE)) != NULL)
! 258: {
! 259: tp = THINGPTR(ip);
! 260: turn_off(*tp, ISFRIENDLY);
! 261: }
! 262: }
! 263: }
! 264: else if ((ip = creat_mons(&player, (short) 0, MESSAGE)) != NULL)
! 265: {
! 266: tp = THINGPTR(ip);
! 267: turn_off(*tp, ISFRIENDLY);
! 268: }
! 269: }
! 270: break;
! 271:
! 272: case S_IDENTIFY:
! 273: if (cursed)
! 274: msg("You identify this scroll as an identify scroll");
! 275: else if (blessed) /* identify everything in the pack */
! 276: {
! 277: msg("You feel more Knowledgeable!");
! 278: idenpack();
! 279: }
! 280: else
! 281: {
! 282: /* Identify, let the rogue figure something out */
! 283:
! 284: if (is_scroll && know_items[TYP_SCROLL][S_IDENTIFY] != TRUE)
! 285: {
! 286: msg("This scroll is an identify scroll.");
! 287: know_items[TYP_SCROLL][S_IDENTIFY] = TRUE;
! 288: }
! 289: whatis(NULL);
! 290: }
! 291: break;
! 292:
! 293: case S_MAP:
! 294:
! 295: /* Scroll of magic mapping. */
! 296:
! 297: if (cursed)
! 298: {
! 299: msg("Your mind goes blank for a moment.");
! 300: wclear(cw);
! 301: light(&hero);
! 302: status(TRUE);
! 303: break;
! 304: }
! 305:
! 306: if (is_scroll && know_items[TYP_SCROLL][S_MAP] != TRUE)
! 307: {
! 308: msg("Oh! This scroll has a map on it!!");
! 309: know_items[TYP_SCROLL][S_MAP] = TRUE;
! 310: }
! 311:
! 312: if (blessed)
! 313: turn_on(player, BLESSMAP);
! 314:
! 315: overwrite(stdscr, hw);
! 316:
! 317: /* Take all the things we want to keep hidden out of the window */
! 318:
! 319: for (i = 0; i < LINES; i++)
! 320: for (j = 0; j < COLS; j++)
! 321: {
! 322: switch (nch = ch = CCHAR(mvwinch(hw, i, j)))
! 323: {
! 324: case SECRETDOOR:
! 325: nch = DOOR;
! 326: mvaddch(i, j, nch);
! 327: break;
! 328:
! 329: case '-':
! 330: case '|':
! 331: case DOOR:
! 332: case PASSAGE:
! 333: case ' ':
! 334: case STAIRS:
! 335: if (mvwinch(mw, i, j) != ' ')
! 336: {
! 337: struct thing *it;
! 338: struct linked_list *lit;
! 339:
! 340: lit = find_mons(i, j);
! 341:
! 342: if (lit) {
! 343: it = THINGPTR(lit);
! 344:
! 345: if (it && it->t_oldch == ' ')
! 346: it->t_oldch = nch;
! 347: }
! 348: }
! 349: break;
! 350:
! 351: default:
! 352: if (!blessed || !isatrap(ch))
! 353: nch = ' ';
! 354: else
! 355: {
! 356: struct trap *tp;
! 357: struct room *rp;
! 358:
! 359: tp = trap_at(i, j);
! 360: rp = roomin(hero);
! 361:
! 362: if (tp->tr_type == FIRETRAP && rp != NULL)
! 363: {
! 364: rp->r_flags &= ~ISDARK;
! 365: light(&hero);
! 366: }
! 367:
! 368: tp->tr_flags |= ISFOUND;
! 369: }
! 370: }
! 371: if (nch != ch)
! 372: waddch(hw, nch);
! 373: }
! 374:
! 375: /* Copy in what he has discovered */
! 376: overlay(cw, hw);
! 377:
! 378: /* And set up for display */
! 379: overwrite(hw, cw);
! 380:
! 381: break;
! 382:
! 383: case S_GFIND:
! 384: /* Scroll of gold detection */
! 385:
! 386: if (cursed)
! 387: {
! 388: int n = roll(3, 6);
! 389: int k;
! 390: struct room *rp;
! 391: coord pos;
! 392:
! 393: msg("You begin to feel greedy and you sense gold.");
! 394: wclear(hw);
! 395:
! 396: for (k = 1; k < n; k++)
! 397: {
! 398: rp = &rooms[rnd_room()];
! 399: rnd_pos(rp, &pos);
! 400: mvwaddch(hw, pos.y, pos.x, GOLD);
! 401: }
! 402: overlay(hw, cw);
! 403:
! 404: break;
! 405: }
! 406:
! 407: if (blessed)
! 408: turn_on(player, BLESSGOLD);
! 409:
! 410: if (gsense() && is_scroll)
! 411: know_items[TYP_SCROLL][S_GFIND] = TRUE;
! 412:
! 413: break;
! 414:
! 415: case S_SELFTELEP:
! 416:
! 417: /* Scroll of teleportation: Make him disappear and reappear */
! 418:
! 419: if (cursed)
! 420: {
! 421: level += 5 + rnd(5);
! 422: new_level(NORMLEV,0);
! 423: mpos = 0;
! 424: msg("You are banished to the lower regions.");
! 425: }
! 426: else if (blessed)
! 427: {
! 428: level -= rnd(3) + 1;
! 429:
! 430: if (level < 1)
! 431: level = 1;
! 432:
! 433: mpos = 0;
! 434: new_level(NORMLEV,0); /* change levels */
! 435: status(TRUE);
! 436: msg("You are whisked away to another region.");
! 437: }
! 438: else
! 439: {
! 440: teleport();
! 441:
! 442: if (is_scroll)
! 443: know_items[TYP_SCROLL][S_SELFTELEP] = TRUE;
! 444: }
! 445:
! 446: if (off(player, ISCLEAR))
! 447: {
! 448: if (on(player, ISHUH))
! 449: lengthen_fuse(FUSE_UNCONFUSE, rnd(4) + 4);
! 450: else
! 451: {
! 452: light_fuse(FUSE_UNCONFUSE, 0, rnd(4) + 4, AFTER);
! 453: turn_on(player, ISHUH);
! 454: }
! 455: }
! 456: else
! 457: msg("You feel dizzy for a moment, but it quickly passes.");
! 458:
! 459: break;
! 460:
! 461: case S_SCARE:
! 462:
! 463: /*
! 464: * A blessed scroll of scare monster automatically transports
! 465: * itself to the hero's feet
! 466: *
! 467: */
! 468:
! 469: if (blessed)
! 470: {
! 471: ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
! 472:
! 473: if (ch != FLOOR && ch != PASSAGE)
! 474: {
! 475: msg("Your feet tickle for a moment");
! 476: return;
! 477: }
! 478:
! 479: item = spec_item(SCROLL, S_SCARE, 0, 0);
! 480:
! 481: obj = OBJPTR(item);
! 482: obj->o_flags = ISCURSED;
! 483: obj->o_pos = hero;
! 484: add_obj(item, hero.y, hero.x);
! 485: msg("A wave of terror sweeps throughout the room");
! 486: }
! 487: else
! 488: {
! 489: /*
! 490: * A monster will refuse to step on a scare monster
! 491: * scroll if it is dropped. Thus reading it is a
! 492: * mistake and produces laughter at the poor rogue's
! 493: * boo boo.
! 494: */
! 495:
! 496: msg("You hear maniacal laughter in the distance.");
! 497:
! 498: if (cursed) /* If cursed, monsters get mad */
! 499: aggravate();
! 500: }
! 501: break;
! 502:
! 503: case S_REMOVECURSE:
! 504: if (cursed) /* curse a player's possession */
! 505: {
! 506: for (nitem = pack; nitem != NULL; nitem = next(nitem))
! 507: {
! 508: obj = OBJPTR(nitem);
! 509:
! 510: if (rnd(5) == 0)
! 511: if (obj->o_flags & ISBLESSED)
! 512: obj->o_flags &= ~ISBLESSED;
! 513: else
! 514: obj->o_flags |= ISCURSED;
! 515: }
! 516: msg("The smell of fire and brimstone comes from your pack.");
! 517: }
! 518: else if (blessed)
! 519: {
! 520: for (nitem = pack; nitem != NULL; nitem = next(nitem))
! 521: (OBJPTR(nitem))->o_flags &= ~ISCURSED;
! 522:
! 523: msg("Your pack glistens brightly.");
! 524: }
! 525: else
! 526: {
! 527: if ((nitem = get_item("remove the curse on", 0)) != NULL)
! 528: {
! 529: obj = OBJPTR(nitem);
! 530: msg("Removed the curse from %s.", inv_name(obj, LOWERCASE));
! 531: obj->o_flags &= ~ISCURSED;
! 532:
! 533: if (is_scroll)
! 534: know_items[TYP_SCROLL][S_REMOVECURSE] = TRUE;
! 535: }
! 536: }
! 537: break;
! 538:
! 539: case S_PETRIFY:
! 540: switch(CCHAR(mvinch(hero.y, hero.x)))
! 541: {
! 542: case TRAPDOOR:
! 543: case DARTTRAP:
! 544: case TELTRAP:
! 545: case ARROWTRAP:
! 546: case SLEEPTRAP:
! 547: case BEARTRAP:
! 548: case FIRETRAP:
! 549: {
! 550: int n;
! 551:
! 552: /* Find the right trap */
! 553: for (n = 0; n < ntraps && !ce(traps[n].tr_pos, hero); n++)
! 554: ;
! 555:
! 556: ntraps--;
! 557:
! 558: if (!ce(traps[n].tr_pos, hero))
! 559: msg("What a strange trap!");
! 560: else
! 561: {
! 562: while (n < ntraps)
! 563: {
! 564: traps[n] = traps[n + 1];
! 565: n++;
! 566: }
! 567: }
! 568:
! 569: msg("The dungeon begins to rumble and shake!");
! 570: addch(WALL);
! 571:
! 572: if (on(player, CANINWALL))
! 573: {
! 574: extinguish_fuse(FUSE_UNPHASE);
! 575: turn_off(player, CANINWALL);
! 576: msg("Your dizzy feeling leaves you.");
! 577: }
! 578:
! 579: turn_on(player, ISINWALL);
! 580: }
! 581: break;
! 582:
! 583: case DOOR:
! 584: case SECRETDOOR:
! 585: {
! 586: struct room *rp = roomin(hero);
! 587: short n;
! 588:
! 589: /* Find the right door */
! 590:
! 591: for (n=0; n<rp->r_nexits && !ce(rp->r_exit[n], hero); n++)
! 592: /* do nothing */ ;
! 593:
! 594: rp->r_nexits--;
! 595:
! 596: if (!ce(rp->r_exit[n], hero))
! 597: msg("What a strange door!");
! 598: else
! 599: {
! 600: while (n < rp->r_nexits)
! 601: {
! 602: rp->r_exit[n] = rp->r_exit[n + 1];
! 603: n++;
! 604: }
! 605: }
! 606: /* No break - fall through */
! 607: }
! 608: case FLOOR:
! 609: case PASSAGE:
! 610: msg("The dungeon begins to rumble and shake!");
! 611: addch(WALL);
! 612:
! 613: if (on(player, CANINWALL))
! 614: {
! 615: extinguish_fuse(FUSE_UNPHASE);
! 616: turn_off(player, CANINWALL);
! 617: msg("Your dizzy feeling leaves you.");
! 618: }
! 619:
! 620: turn_on(player, ISINWALL);
! 621: break;
! 622:
! 623: default:
! 624: nothing_message(flags);
! 625: break;
! 626: }
! 627: break;
! 628:
! 629: case S_GENOCIDE:
! 630: msg("You have been granted the boon of genocide!--More--");
! 631:
! 632: wait_for(' ');
! 633: msg("");
! 634:
! 635: genocide(flags);
! 636:
! 637: if (is_scroll)
! 638: know_items[TYP_SCROLL][S_GENOCIDE] = TRUE;
! 639:
! 640: break;
! 641:
! 642: case S_PROTECT:
! 643: if (is_scroll && know_items[TYP_SCROLL][S_PROTECT] == FALSE)
! 644: {
! 645: msg("You can protect something from rusting or theft.");
! 646: know_items[TYP_SCROLL][S_PROTECT] = TRUE;
! 647: }
! 648:
! 649: if ((item = get_item("protect", 0)) != NULL)
! 650: {
! 651: struct object *lb = OBJPTR(item);
! 652:
! 653: if (cursed)
! 654: {
! 655: lb->o_flags &= ~ISPROT;
! 656: mpos = 0;
! 657: msg("Unprotected %s.", inv_name(lb, LOWERCASE));
! 658: }
! 659: else
! 660: {
! 661: lb->o_flags |= ISPROT;
! 662: mpos = 0;
! 663: msg("Protected %s.", inv_name(lb, LOWERCASE));
! 664: }
! 665: }
! 666: break;
! 667:
! 668: case S_MAKEITEMEM:
! 669: if (!is_scroll || rnd(luck))
! 670: feel_message();
! 671: else
! 672: {
! 673: char itemtype;
! 674:
! 675: if (is_scroll)
! 676: know_items[TYP_SCROLL][S_MAKEITEMEM] = TRUE;
! 677:
! 678: msg("You have been endowed with the power of creation.");
! 679:
! 680: if (blessed)
! 681: itemtype = '\0';
! 682: else
! 683: switch (rnd(6))
! 684: {
! 685: case 0: itemtype = RING; break;
! 686: case 1: itemtype = POTION; break;
! 687: case 2: itemtype = SCROLL; break;
! 688: case 3: itemtype = ARMOR; break;
! 689: case 4: itemtype = WEAPON; break;
! 690: case 5: itemtype = STICK; break;
! 691: }
! 692:
! 693: flags |= SCR_MAGIC;
! 694: buy_it(itemtype, flags);
! 695: }
! 696: break;
! 697:
! 698: case S_ENCHANT:
! 699: {
! 700: struct linked_list *ll;
! 701: struct object *lb;
! 702: int howmuch, flg=0;
! 703:
! 704: if (is_scroll && know_items[TYP_SCROLL][S_ENCHANT] == FALSE)
! 705: {
! 706: msg("You are granted the power of enchantment.");
! 707: msg("You may enchant anything(weapon,ring,armor,scroll,potion)");
! 708: know_items[TYP_SCROLL][S_ENCHANT] = TRUE;
! 709: }
! 710:
! 711: if ((ll = get_item("enchant", 0)) != NULL)
! 712: {
! 713: lb = OBJPTR(ll);
! 714: lb->o_flags &= ~ISCURSED;
! 715:
! 716: if (blessed)
! 717: howmuch = 2;
! 718: else if (cursed)
! 719: howmuch = -1;
! 720: else
! 721: {
! 722: howmuch = 1;
! 723: flg |= ISBLESSED;
! 724: }
! 725:
! 726: switch (lb->o_type)
! 727: {
! 728: case RING:
! 729: lb->o_ac += howmuch;
! 730:
! 731: if (lb->o_ac > 5 && rnd(5) == 0)
! 732: {
! 733: msg("Your ring explodes in a cloud of smoke.");
! 734: lb->o_flags &= ~ISCURSED;
! 735: dropcheck(lb);
! 736:
! 737: switch (lb->o_which)
! 738: {
! 739: case R_ADDSTR:
! 740: chg_str(-2, TRUE, FALSE);
! 741: break;
! 742: case R_ADDHIT:
! 743: chg_dext(-2, TRUE, FALSE);
! 744: break;
! 745: case R_ADDINTEL:
! 746: pstats.s_intel -= 2;
! 747: max_stats.s_intel -= 2;
! 748: break;
! 749: case R_ADDWISDOM:
! 750: pstats.s_wisdom -= 2;
! 751: max_stats.s_wisdom -= 2;
! 752: break;
! 753: }
! 754:
! 755: del_pack(ll);
! 756: lb = NULL;
! 757: }
! 758: else if (is_r_on(lb))
! 759: switch (lb->o_which)
! 760: {
! 761: case R_ADDSTR:
! 762: pstats.s_str += howmuch;
! 763: break;
! 764: case R_ADDHIT:
! 765: pstats.s_dext += howmuch;
! 766: break;
! 767: case R_ADDINTEL:
! 768: pstats.s_intel += howmuch;
! 769: break;
! 770: case R_ADDWISDOM:
! 771: pstats.s_wisdom += howmuch;
! 772: break;
! 773: case R_CARRYING:
! 774: updpack();
! 775: break;
! 776: }
! 777:
! 778: break;
! 779:
! 780: case ARMOR:
! 781: lb->o_ac -= howmuch;
! 782:
! 783: if (armors[lb->o_which].a_class - lb->o_ac > 5 && rnd(5) == 0)
! 784: {
! 785: msg("Your %s explodes in a cloud of dust.",
! 786: inv_name(lb, LOWERCASE));
! 787:
! 788: lb->o_flags &= ~ISCURSED;
! 789:
! 790: if (lb == cur_armor)
! 791: pstats.s_hpt /= 2;
! 792:
! 793: dropcheck(lb);
! 794: del_pack(ll);
! 795: lb = NULL;
! 796: }
! 797: break;
! 798:
! 799: case STICK:
! 800: if (wizard || howmuch != 1 && rnd(5) == 0)
! 801: lb->o_flags |= flg;
! 802:
! 803: lb->o_charges += howmuch + 10;
! 804:
! 805: if (lb->o_charges < 0)
! 806: lb->o_charges = 0;
! 807:
! 808: if (lb->o_charges > 50 && rnd(5) == 0)
! 809: {
! 810: msg("Your %s explodes into splinters.",
! 811: inv_name(lb, LOWERCASE));
! 812:
! 813: lb->o_flags &= ~ISCURSED;
! 814: dropcheck(lb);
! 815: del_pack(ll);
! 816: lb = NULL;
! 817: }
! 818: break;
! 819:
! 820: case WEAPON:
! 821: if (rnd(100) < 50)
! 822: lb->o_hplus += howmuch;
! 823: else
! 824: lb->o_dplus += howmuch;
! 825:
! 826: if (lb->o_hplus + lb->o_dplus > 10 && rnd(5) == 0)
! 827: {
! 828: msg("Your %s explodes in a cloud of shrapnel",
! 829: inv_name(lb, LOWERCASE));
! 830:
! 831: lb->o_flags &= ~ISCURSED;
! 832:
! 833: if (lb == cur_weapon)
! 834: chg_dext(-2, FALSE, TRUE);
! 835:
! 836: dropcheck(lb);
! 837: del_pack(ll);
! 838: lb = NULL;
! 839:
! 840: }
! 841: break;
! 842:
! 843: case POTION:
! 844: case SCROLL:
! 845: default:
! 846: lb->o_flags |= flg;
! 847: break;
! 848: }
! 849:
! 850: mpos = 0;
! 851:
! 852: if (lb != NULL)
! 853: msg("Enchanted %s.", inv_name(lb, LOWERCASE));
! 854: }
! 855: }
! 856: break;
! 857:
! 858: case S_NOTHING:
! 859: nothing_message(flags);
! 860: break;
! 861:
! 862: case S_SILVER:
! 863: {
! 864: struct object *lb;
! 865:
! 866: if (is_scroll && know_items[TYP_SCROLL][S_SILVER] == FALSE)
! 867: {
! 868: msg("You are granted the power of magic hitting.");
! 869: know_items[TYP_SCROLL][S_SILVER] = TRUE;
! 870: }
! 871:
! 872: if ((item = get_item("annoint", WEAPON)) != NULL)
! 873: {
! 874: lb = OBJPTR(item);
! 875:
! 876: if (blessed && !(lb->o_flags & ISSILVER))
! 877: {
! 878: lb->o_hplus += rnd(3) + 1;
! 879: lb->o_flags |= ISSILVER;
! 880: lb->o_flags |= ISMETAL;
! 881: msg("Your weapon has turned to silver!");
! 882: }
! 883: else if (cursed && (lb->o_flags & ISSILVER))
! 884: {
! 885: lb->o_hplus -= (rnd(3) + 1);
! 886: lb->o_flags &= ~ISSILVER;
! 887: msg("Your silver weapon has turned to steel.");
! 888: }
! 889: else if (lb->o_flags & ISSILVER)
! 890: {
! 891: msg("Your silver weapon glitters briefly.");
! 892: lb->o_hplus += rnd(2);
! 893: }
! 894: else
! 895: {
! 896: lb->o_hplus += rnd(3);
! 897: lb->o_flags |= ISSILVER;
! 898: lb->o_flags |= ISMETAL;
! 899: msg("Your weapon has turned to silver.");
! 900: }
! 901: }
! 902: }
! 903: break;
! 904: case S_OWNERSHIP:
! 905: {
! 906: struct linked_list *ll;
! 907: struct object *lb;
! 908:
! 909: if (is_scroll && know_items[TYP_SCROLL][S_OWNERSHIP] == FALSE)
! 910: {
! 911: msg("You are granted the power of ownership.");
! 912: know_items[TYP_SCROLL][S_OWNERSHIP] = TRUE;
! 913: }
! 914:
! 915: if ((ll = get_item("claim", 0)) != NULL)
! 916: {
! 917: lb = OBJPTR(ll);
! 918:
! 919: if (cursed && lb->o_flags & (ISOWNED | CANRETURN))
! 920: {
! 921: lb->o_flags &= ~(ISOWNED | CANRETURN);
! 922: msg("The gods seem to have forgotten you.");
! 923: }
! 924: else if (cursed && !(lb->o_flags & ISLOST))
! 925: {
! 926: lb->o_flags |= ISLOST;
! 927: msg("The gods look the other way.");
! 928: }
! 929: else if (blessed && lb->o_flags & ISLOST)
! 930: {
! 931: lb->o_flags |= CANRETURN;
! 932: msg("The gods seem to have remembered you.");
! 933: }
! 934: else if (blessed && !(lb->o_flags & ISOWNED))
! 935: {
! 936: lb->o_flags |= (ISOWNED | CANRETURN);
! 937: msg("The gods smile upon you.");
! 938: }
! 939: else if (blessed | cursed)
! 940: {
! 941: nothing_message(flags);
! 942: }
! 943: else
! 944: {
! 945: lb->o_flags |= CANRETURN;
! 946: msg("The gods look upon you.");
! 947: }
! 948: }
! 949: }
! 950: break;
! 951:
! 952: case S_FOODDET:
! 953:
! 954: /* Scroll of food detection */
! 955:
! 956: if (cursed)
! 957: {
! 958: int n = roll(3, 6);
! 959: int k;
! 960: struct room *rp;
! 961: coord pos;
! 962:
! 963: msg("You begin to feel hungry and you smell food.");
! 964: wclear(hw);
! 965:
! 966: for (k = 1; k < n; k++)
! 967: {
! 968: rp = &rooms[rnd_room()];
! 969: rnd_pos(rp, &pos);
! 970: mvwaddch(hw, pos.y, pos.x, FOOD);
! 971: }
! 972:
! 973: overlay(hw, cw);
! 974:
! 975: if (is_scroll)
! 976: know_items[TYP_SCROLL][S_FOODDET] = TRUE;
! 977:
! 978: break;
! 979: }
! 980:
! 981: if (blessed)
! 982: turn_on(player, BLESSFOOD);
! 983:
! 984: if (off(player, ISUNSMELL) && lvl_obj != NULL)
! 985: {
! 986: struct linked_list *itm;
! 987: struct object *cur;
! 988: struct thing *th;
! 989: int fcount = 0;
! 990: int same_room = FALSE;
! 991: struct room *rp = roomin(hero);
! 992:
! 993: wclear(hw);
! 994:
! 995: for (itm = lvl_obj; itm != NULL; itm = next(itm))
! 996: {
! 997: cur = OBJPTR(itm);
! 998:
! 999: if (cur->o_type == FOOD)
! 1000: {
! 1001: fcount += cur->o_count;
! 1002: mvwaddch(hw, cur->o_pos.y, cur->o_pos.x, FOOD);
! 1003:
! 1004: if (roomin(cur->o_pos) == rp)
! 1005: same_room = TRUE;
! 1006: }
! 1007: }
! 1008:
! 1009: for (itm = mlist; itm != NULL; itm = next(itm))
! 1010: {
! 1011: struct linked_list *pitem;
! 1012:
! 1013: th = THINGPTR(itm);
! 1014:
! 1015: for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem))
! 1016: {
! 1017: cur = OBJPTR(pitem);
! 1018:
! 1019: if (cur->o_type == FOOD)
! 1020: {
! 1021: fcount += cur->o_count;
! 1022: mvwaddch(hw, th->t_pos.y, th->t_pos.x, FOOD);
! 1023:
! 1024: if (roomin(th->t_pos) == rp)
! 1025: same_room = TRUE;
! 1026: }
! 1027: }
! 1028: }
! 1029:
! 1030: if (fcount)
! 1031: {
! 1032: if (is_scroll)
! 1033: know_items[TYP_SCROLL][S_FOODDET] = TRUE;
! 1034:
! 1035: if (same_room)
! 1036: msg("FOOOOD!!");
! 1037: else
! 1038: msg("You begin to feel hungry and you smell food.");
! 1039:
! 1040: overlay(hw, cw);
! 1041: break;
! 1042: }
! 1043: }
! 1044:
! 1045: if (off(player, ISUNSMELL))
! 1046: msg("You can't smell anything.");
! 1047: else
! 1048: nothing_message(flags);
! 1049:
! 1050: break;
! 1051:
! 1052: case S_ELECTRIFY:
! 1053: if (on(player, ISELECTRIC))
! 1054: {
! 1055: msg("Your violet glow brightens for an instant.");
! 1056: lengthen_fuse(FUSE_UNELECTRIFY, 4 + rnd(8));
! 1057: }
! 1058: else
! 1059: {
! 1060: msg("Your body begins to glow violet and shoot sparks.");
! 1061: turn_on(player, ISELECTRIC);
! 1062: light_fuse(FUSE_UNELECTRIFY,0,(blessed?3:1)*WANDERTIME, AFTER);
! 1063: light(&hero);
! 1064: }
! 1065:
! 1066: if (is_scroll)
! 1067: know_items[TYP_SCROLL][S_ELECTRIFY] = TRUE;
! 1068:
! 1069: break;
! 1070:
! 1071: case S_CHARM:
! 1072:
! 1073: /*
! 1074: * Beauty, brains and experience make a person charming.
! 1075: * Unique monsters can never be charmed.
! 1076: */
! 1077:
! 1078: charm_power = pstats.s_charisma / 2 + pstats.s_lvl / 3 + max(0, pstats.s_intel - 15);
! 1079:
! 1080: if (cursed)
! 1081: {
! 1082: msg("You hear harsh, dissonant twanging throughout the dungeon.");
! 1083: aggravate();
! 1084: }
! 1085: else if (blessed) /* Charm entire level */
! 1086: {
! 1087: struct linked_list *mon;
! 1088:
! 1089: msg("You hear ringingly meliflous music all around you.");
! 1090:
! 1091: for (mon = mlist; mon != NULL; mon = next(mon))
! 1092: {
! 1093: struct thing *th = THINGPTR(mon);
! 1094:
! 1095: if (th->t_stats.s_intel < charm_power && off(*th, ISUNIQUE))
! 1096: {
! 1097: turn_on(*th, ISCHARMED);
! 1098: chase_it(&th->t_pos, &player);
! 1099: }
! 1100: }
! 1101: }
! 1102: else /* Charm all monsters within two spaces of the hero */
! 1103: {
! 1104: int x, y;
! 1105: struct linked_list *mon;
! 1106:
! 1107: msg("You hear soft, lyrical music all around you.");
! 1108:
! 1109: for (x = hero.x - 2; x <= hero.x + 2; x++)
! 1110: for (y = hero.y - 2; y <= hero.y + 2; y++)
! 1111: if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
! 1112: {
! 1113: if ((mon = find_mons(y, x)) != NULL)
! 1114: {
! 1115: struct thing *th;
! 1116:
! 1117: th = THINGPTR(mon);
! 1118:
! 1119: if (th->t_stats.s_intel < charm_power && off(*th, ISUNIQUE))
! 1120: {
! 1121: turn_on(*th, ISCHARMED);
! 1122: chase_it(&th->t_pos, &player);
! 1123: }
! 1124: }
! 1125: }
! 1126: }
! 1127: break;
! 1128:
! 1129: case S_SUMMON:
! 1130: {
! 1131: struct linked_list *llp;
! 1132: struct thing *tp;
! 1133: int mon_type;
! 1134:
! 1135: if (on(player, HASSUMMONED))
! 1136: {
! 1137: nothing_message(flags);
! 1138: break;
! 1139: }
! 1140:
! 1141: if (cursed)
! 1142: {
! 1143: creat_mons(&player, (short) 0, MESSAGE);
! 1144: break;
! 1145: }
! 1146:
! 1147: if (blessed) /* Summon a possibly very high monster */
! 1148: {
! 1149: int nsides = max(2, max(pstats.s_lvl, 12) - luck);
! 1150:
! 1151: mon_type = roll(nsides, rnd(pstats.s_charisma + 15) + 8);
! 1152: mon_type = min(mon_type, nummonst);
! 1153: }
! 1154: else
! 1155: mon_type = 0;
! 1156:
! 1157: llp = summon_monster((short) mon_type, NOFAMILIAR, NOMESSAGE);
! 1158:
! 1159: if (llp)
! 1160: {
! 1161: tp = THINGPTR(llp);
! 1162: turn_on(*tp, WASSUMMONED);
! 1163: turn_on(player, HASSUMMONED);
! 1164: msg("You have summoned a %s.", monsters[tp->t_index].m_name);
! 1165: light_fuse(FUSE_UNSUMMON, llp, WANDERTIME + rnd(pstats.s_lvl), AFTER);
! 1166: }
! 1167: }
! 1168: break;
! 1169:
! 1170: case S_REFLECT:
! 1171: if (on(player, CANREFLECT))
! 1172: {
! 1173: msg("The sparkling around you brightens momentarily.");
! 1174: lengthen_fuse(FUSE_UNGAZE, 5 + rnd(10));
! 1175: }
! 1176: else
! 1177: {
! 1178: msg("Shiny particles sparkle all around you.");
! 1179: turn_on(player, CANREFLECT);
! 1180: light_fuse(FUSE_UNGAZE, 0, (blessed ? 3 : 1) * WANDERTIME, AFTER);
! 1181: }
! 1182: break;
! 1183:
! 1184: case S_SUMFAMILIAR:
! 1185: {
! 1186: int type = 0;
! 1187:
! 1188: if (on(player, HASFAMILIAR))
! 1189: {
! 1190: msg("But you already have a familiar - somewhere...");
! 1191: return;
! 1192: }
! 1193:
! 1194: if (wizard)
! 1195: type = get_monster_number("be your familiar");
! 1196: else if (blessed) /* Summon a possibly very high monster */
! 1197: {
! 1198: int nsides = max(2, max(pstats.s_lvl, 12) - luck);
! 1199:
! 1200: type = roll(nsides, rnd(pstats.s_charisma + 15) + 8);
! 1201: type = min(type, nummonst);
! 1202: }
! 1203: else if (cursed) /* Summon a bat, maggot, eye, etc */
! 1204: {
! 1205: type = rnd(20) + 1;
! 1206:
! 1207: if (summon_monster(type, FAMILIAR, MESSAGE))
! 1208: turn_on(player, HASFAMILIAR);
! 1209: }
! 1210: }
! 1211: break;
! 1212:
! 1213: case S_FEAR:
! 1214:
! 1215: /* if cursed, you get frightened */
! 1216:
! 1217: if (cursed)
! 1218: {
! 1219: if (off(player, SUPERHERO) && (player.t_ctype != C_PALADIN) && !save(VS_DEATH))
! 1220: msg("A momentary wave of panic sweeps over you.");
! 1221: else
! 1222: {
! 1223: msg("Panicstricken, you fall into a coma.");
! 1224: no_command += roll(2, SLEEPTIME);
! 1225: }
! 1226: }
! 1227: else
! 1228: {
! 1229: /*
! 1230: * terrify monster scroll. frightens all monsters
! 1231: * within 2 spaces
! 1232: */
! 1233: int x, y;
! 1234: struct linked_list *mon;
! 1235: int gotone = FALSE;
! 1236:
! 1237: for (x = hero.x - 2; x <= hero.x + 2; x++)
! 1238: {
! 1239: for (y = hero.y - 2; y <= hero.y + 2; y++)
! 1240: {
! 1241: if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x)))
! 1242: {
! 1243: if ((mon = find_mons(y, x)) != NULL)
! 1244: {
! 1245: struct thing *th;
! 1246:
! 1247: th = THINGPTR(mon);
! 1248:
! 1249: if (on(*th, ISUNDEAD) || on(*th, ISUNIQUE))
! 1250: continue;
! 1251:
! 1252: gotone = TRUE;
! 1253: turn_on(*th, ISFLEE);
! 1254: th->t_chasee = &player;
! 1255: th->t_ischasing = FALSE;
! 1256: th->t_horde = NULL;
! 1257: }
! 1258: }
! 1259: }
! 1260: }
! 1261:
! 1262: if (gotone)
! 1263: seemsg("The monster(s) around you recoil in horror.");
! 1264: else
! 1265: nothing_message(flags);
! 1266: }
! 1267: break;
! 1268:
! 1269: case S_MSHIELD: /* deal with blessed/cursed later */
! 1270: if (on(player, HASMSHIELD))
! 1271: {
! 1272: seemsg("The fog around you thickens.");
! 1273: lengthen_fuse(FUSE_UNMSHIELD, (blessed ? 3 : 1) * HEROTIME);
! 1274: }
! 1275: else
! 1276: {
! 1277: seemsg("A fog forms around you.");
! 1278: turn_on(player, HASMSHIELD);
! 1279: light_fuse(FUSE_UNMSHIELD, 0, (blessed ? 3 : 1) * HEROTIME, AFTER);
! 1280: }
! 1281:
! 1282: if (is_scroll)
! 1283: know_items[TYP_SCROLL][S_MSHIELD] = TRUE;
! 1284:
! 1285: break;
! 1286:
! 1287: default:
! 1288: msg("What a puzzling scroll!");
! 1289: return;
! 1290: }
! 1291:
! 1292: look(TRUE); /* put the result of the scroll on the screen */
! 1293: status(FALSE);
! 1294:
! 1295: if (is_scroll)
! 1296: {
! 1297: if (know_items[TYP_SCROLL][which] && guess_items[TYP_SCROLL][which])
! 1298: {
! 1299: ur_free(guess_items[TYP_SCROLL][which]);
! 1300: guess_items[TYP_SCROLL][which] = NULL;
! 1301: }
! 1302: else if (askme && !know_items[TYP_SCROLL][which] && guess_items[TYP_SCROLL][which] == NULL)
! 1303: {
! 1304: msg("What do you want to call it? ");
! 1305:
! 1306: if (get_string(buf, cw) == NORM)
! 1307: {
! 1308: guess_items[TYP_SCROLL][which] = new_alloc(strlen(buf) + 1);
! 1309: strcpy(guess_items[TYP_SCROLL][which], buf);
! 1310: }
! 1311: }
! 1312: }
! 1313: }
! 1314:
! 1315: /*
! 1316: creat_mons()
! 1317: creates the specified monster -- any if 0
! 1318: */
! 1319:
! 1320: struct linked_list *
! 1321: creat_mons(struct thing *person, int monster, int message)
! 1322: {
! 1323: coord mp;
! 1324:
! 1325: /* Search for an open place */
! 1326:
! 1327: debug("Creator @(%d, %d) ", person->t_pos.y, person->t_pos.x);
! 1328:
! 1329: if ((place_mons(person->t_pos.y, person->t_pos.x, &mp)) != FALSE)
! 1330: {
! 1331: struct linked_list *nitem;
! 1332:
! 1333: nitem = new_item(sizeof(struct thing));
! 1334: new_monster(nitem, monster == 0 ? randmonster(NOWANDER, NOGRAB)
! 1335: : monster, &mp, MAXSTATS);
! 1336: chase_it(&mp, &player);
! 1337:
! 1338: /* If the monster is on a trap, trap it */
! 1339:
! 1340: if (isatrap(mvinch(mp.y, mp.x)))
! 1341: {
! 1342: debug("Monster trapped during creat_mons.");
! 1343: be_trapped(THINGPTR(nitem), mp);
! 1344: }
! 1345:
! 1346: light(&hero);
! 1347: return(nitem);
! 1348: }
! 1349:
! 1350: if (message)
! 1351: hearmsg("You hear a faint cry of anguish in the distance.");
! 1352:
! 1353: return(NULL);
! 1354: }
! 1355:
! 1356: /*
! 1357: place_mons()
! 1358: finds a place to put the monster
! 1359: */
! 1360:
! 1361: int
! 1362: place_mons(int y, int x, coord *pos)
! 1363: {
! 1364: int distance, xx, yy, appears;
! 1365:
! 1366: for (distance = 1; distance <= 10; distance++)
! 1367: {
! 1368: appears = 0;
! 1369:
! 1370: for (yy = y - distance; yy <= y + distance; yy++)
! 1371: for (xx = x - distance; xx <= x + distance; xx++)
! 1372: {
! 1373: /* Don't put a monster in top of the creator or player */
! 1374:
! 1375: if (xx < 0 || yy < 0)
! 1376: continue;
! 1377:
! 1378: if (yy == y && xx == x)
! 1379: continue;
! 1380:
! 1381: if (yy == hero.y && xx == hero.x)
! 1382: continue;
! 1383:
! 1384: /* Or anything else nasty */
! 1385:
! 1386: if (step_ok(yy, xx, NOMONST, FALSE))
! 1387: {
! 1388: if (rnd(max(1, (10 * distance - ++appears))) == 0)
! 1389: {
! 1390: pos->y = yy;
! 1391: pos->x = xx;
! 1392: debug("Make monster dist %d appear %d @(%d, %d) ",
! 1393: distance, appears, pos->y, pos->x);
! 1394: return(TRUE);
! 1395: }
! 1396: }
! 1397: }
! 1398: }
! 1399: return(FALSE);
! 1400: }
! 1401:
! 1402: /*
! 1403: is_t_on()
! 1404: This subroutine determines if an object that is a ring is being
! 1405: worn by the hero by Bruce Dautrich 4/3/84
! 1406: */
! 1407:
! 1408: int
! 1409: is_r_on(struct object *obj)
! 1410: {
! 1411: if (obj == cur_ring[LEFT_1] || obj == cur_ring[LEFT_2] ||
! 1412: obj == cur_ring[LEFT_3] || obj == cur_ring[LEFT_4] ||
! 1413: obj == cur_ring[LEFT_5] ||
! 1414: obj == cur_ring[RIGHT_1] || obj == cur_ring[RIGHT_2] ||
! 1415: obj == cur_ring[RIGHT_3] || obj == cur_ring[RIGHT_4] ||
! 1416: obj == cur_ring[RIGHT_5])
! 1417: {
! 1418: return(TRUE);
! 1419: }
! 1420:
! 1421: return(FALSE);
! 1422: }
! 1423:
! 1424: /*
! 1425: monread()
! 1426: monster gets the effect
! 1427: */
! 1428:
! 1429: void
! 1430: monread(struct thing *reader, int which, int flags)
! 1431: {
! 1432: struct stats *curp = &(reader->t_stats);
! 1433: struct stats *maxp = &(reader->maxstats);
! 1434: int blessed = flags & ISBLESSED;
! 1435: int cursed = flags & ISCURSED;
! 1436:
! 1437: switch (which)
! 1438: {
! 1439: case S_SELFTELEP:
! 1440: /* If monster was suffocating, stop it */
! 1441: if (on(*reader, DIDSUFFOCATE))
! 1442: {
! 1443: turn_off(*reader, DIDSUFFOCATE);
! 1444: extinguish_fuse(FUSE_SUFFOCATE);
! 1445: }
! 1446:
! 1447: /* If monster held us, stop it */
! 1448:
! 1449: if (on(*reader, DIDHOLD) && (hold_count == 0))
! 1450: turn_off(player, ISHELD);
! 1451:
! 1452: turn_off(*reader, DIDHOLD);
! 1453:
! 1454: if (cursed)
! 1455: reader->t_no_move++;
! 1456: else
! 1457: {
! 1458: int rm;
! 1459:
! 1460: if (blessed) /* Give him his hit points */
! 1461: curp->s_hpt = maxp->s_hpt;
! 1462:
! 1463: /* Erase the monster from the old position */
! 1464:
! 1465: if (isalpha(mvwinch(cw, reader->t_pos.y, reader->t_pos.x)))
! 1466: mvwaddch(cw, reader->t_pos.y, reader->t_pos.x, reader->t_oldch);
! 1467:
! 1468: mvwaddch(mw, reader->t_pos.y, reader->t_pos.x, ' ');
! 1469:
! 1470: /* Get a new position */
! 1471:
! 1472: do
! 1473: {
! 1474: rm = rnd_room();
! 1475: rnd_pos(&rooms[rm], &reader->t_pos);
! 1476: }
! 1477: while (winat(reader->t_pos.y, reader->t_pos.x) != FLOOR);
! 1478:
! 1479: /* Put it there */
! 1480:
! 1481: mvwaddch(mw, reader->t_pos.y, reader->t_pos.x, reader->t_type);
! 1482: reader->t_oldch = CCHAR( mvwinch(cw, reader->t_pos.y, reader->t_pos.x) );
! 1483: }
! 1484: break;
! 1485:
! 1486: default:
! 1487: debug("'%s' is a strange scroll for a monster to read!",
! 1488: r_magic[which].mi_name);
! 1489: break;
! 1490: }
! 1491: }
CVSweb