Annotation of early-roguelike/srogue/move.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Hero movement commands
! 3: *
! 4: * @(#)move.c 9.0 (rdk) 7/17/84
! 5: *
! 6: * Super-Rogue
! 7: * Copyright (C) 1984 Robert D. Kindelberger
! 8: * All rights reserved.
! 9: *
! 10: * Based on "Rogue: Exploring the Dungeons of Doom"
! 11: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 12: * All rights reserved.
! 13: *
! 14: * See the file LICENSE.TXT for full copyright and licensing information.
! 15: */
! 16:
! 17: #include <string.h>
! 18: #include <ctype.h>
! 19: #include "rogue.h"
! 20: #include "rogue.ext"
! 21:
! 22: /*
! 23: * Used to hold the new hero position
! 24: */
! 25:
! 26: struct coord nh;
! 27:
! 28: /*
! 29: * do_run:
! 30: * Start the hero running
! 31: */
! 32:
! 33: void
! 34: do_run(char ch)
! 35: {
! 36: running = TRUE;
! 37: after = FALSE;
! 38: runch = ch;
! 39: }
! 40:
! 41: /*
! 42: * do_move:
! 43: * Check to see that a move is legal. If it is handle the
! 44: * consequences (fighting, picking up, etc.)
! 45: */
! 46:
! 47: void
! 48: do_move(int dy, int dx)
! 49: {
! 50: reg int ch;
! 51: reg struct room *rp;
! 52:
! 53: firstmove = FALSE;
! 54: curprice = -1;
! 55: inpool = FALSE;
! 56:
! 57: if (player.t_nomove > 0) {
! 58: player.t_nomove -= 1;
! 59: msg("You are still stuck in the bear trap.");
! 60: return;
! 61: }
! 62: /*
! 63: * Do a confused move (maybe)
! 64: */
! 65: if ((rnd(100) < 80 && pl_on(ISHUH)) ||
! 66: (iswearing(R_DELUS) && rnd(100) < 25))
! 67: nh = *rndmove(&player);
! 68: else {
! 69: nh.y = hero.y + dy;
! 70: nh.x = hero.x + dx;
! 71: }
! 72: /*
! 73: * Check if he tried to move off the screen or make
! 74: * an illegal diagonal move, and stop him if he did.
! 75: */
! 76: if (!cordok(nh.y, nh.x) ||
! 77: (pl_off(ISETHER) && !diag_ok(&hero, &nh))) {
! 78: after = running = FALSE;
! 79: return;
! 80: }
! 81: if (running) {
! 82: ch = winat(nh.y, nh.x);
! 83: if (dead_end(ch)) {
! 84: reg int gox, goy, apsg, whichway;
! 85:
! 86: gox = goy = apsg = 0;
! 87: if (dy == 0) {
! 88: ch = show(hero.y+1,hero.x);
! 89: if (ch == PASSAGE) {
! 90: apsg += 1;
! 91: goy = 1;
! 92: }
! 93: ch = show(hero.y-1,hero.x);
! 94: if (ch == PASSAGE) {
! 95: apsg += 1;
! 96: goy = -1;
! 97: }
! 98: }
! 99: else if (dx == 0) {
! 100: ch = show(hero.y,hero.x+1);
! 101: if (ch == PASSAGE) {
! 102: gox = 1;
! 103: apsg += 1;
! 104: }
! 105: ch = show(hero.y,hero.x-1);
! 106: if (ch == PASSAGE) {
! 107: gox = -1;
! 108: apsg += 1;
! 109: }
! 110: }
! 111: if (apsg != 1) {
! 112: running = after = FALSE;
! 113: return;
! 114: }
! 115: else { /* can still run here */
! 116: nh.y = hero.y + goy;
! 117: nh.x = hero.x + gox;
! 118: whichway = (goy + 1) * 3 + gox + 1;
! 119: switch(whichway) {
! 120: case 0: runch = 'y';
! 121: when 1: runch = 'k';
! 122: when 2: runch = 'u';
! 123: when 3: runch = 'h';
! 124: when 4: runch = '.'; /* shouldn't do */
! 125: when 5: runch = 'l';
! 126: when 6: runch = 'b';
! 127: when 7: runch = 'j';
! 128: when 8: runch = 'n';
! 129: }
! 130: }
! 131: }
! 132: }
! 133: if (running && ce(hero, nh))
! 134: after = running = FALSE;
! 135: ch = winat(nh.y, nh.x);
! 136: if (pl_on(ISHELD) && ch != 'F' && ch != 'd') {
! 137: msg("You are being held.");
! 138: return;
! 139: }
! 140: if (pl_off(ISETHER)) {
! 141: if (isatrap(ch)) {
! 142: ch = be_trapped(&nh, &player);
! 143: if (nlmove) {
! 144: nlmove = FALSE;
! 145: return;
! 146: }
! 147: else if (ch == POOL)
! 148: inpool = TRUE;
! 149: }
! 150: else if (dead_end(ch)) {
! 151: after = running = FALSE;
! 152: return;
! 153: }
! 154: else {
! 155: switch(ch) {
! 156: case GOLD: case POTION: case SCROLL:
! 157: case FOOD: case WEAPON: case ARMOR:
! 158: case RING: case AMULET: case STICK:
! 159: running = FALSE;
! 160: take = ch;
! 161: default:
! 162: if (illeg_ch(ch)) {
! 163: running = FALSE;
! 164: mvaddch(nh.y, nh.x, FLOOR);
! 165: teleport(rndspot, &player);
! 166: light(&nh);
! 167: msg("The spatial warp disappears !");
! 168: return;
! 169: }
! 170: }
! 171: }
! 172: }
! 173: rp = roomin(&nh);
! 174: if (ch == DOOR) { /* just stepped on a door */
! 175: running = FALSE;
! 176: if (rp != NULL && rf_on(rp, ISTREAS)) {
! 177: struct linked_list *item;
! 178: struct thing *tp;
! 179:
! 180: for (item = mlist; item != NULL; item = next(item)) {
! 181: tp = THINGPTR(item);
! 182: if (tp->t_room == rp)
! 183: runto(&tp->t_pos, &hero);
! 184: }
! 185: }
! 186: }
! 187: else if (ch == STAIRS && pl_off(ISETHER))
! 188: running = FALSE;
! 189: else if (isalpha(ch) && pl_off(ISETHER)) {
! 190: running = FALSE;
! 191: fight(&nh, cur_weapon, FALSE);
! 192: return;
! 193: }
! 194: if (rp == NULL && player.t_room != NULL)
! 195: light(&hero); /* exiting a room */
! 196: else if (rp != NULL && player.t_room == NULL)
! 197: light(&nh); /* just entering a room */
! 198: if (pl_on(ISBLIND))
! 199: ch = ' ';
! 200: else
! 201: ch = player.t_oldch;
! 202: mvwaddch(cw, hero.y, hero.x, ch);
! 203: mvwaddch(cw, nh.y, nh.x, PLAYER);
! 204: hero = nh;
! 205: player.t_room = rp;
! 206: player.t_oldch = mvinch(hero.y, hero.x);
! 207: }
! 208:
! 209: /*
! 210: * Called to illuminate a room.
! 211: * If it is dark, remove anything that might move.
! 212: */
! 213: void
! 214: light(struct coord *cp)
! 215: {
! 216: reg struct room *rp;
! 217: reg int j, k, x, y;
! 218: reg char ch, rch;
! 219: reg struct linked_list *item;
! 220:
! 221: rp = roomin(cp);
! 222: if (rp == NULL)
! 223: return;
! 224: if (pl_on(ISBLIND)) {
! 225: for (j = 0; j < rp->r_max.y; j += 1) {
! 226: for (k = 0; k < rp->r_max.x; k += 1) {
! 227: y = rp->r_pos.y + j;
! 228: x = rp->r_pos.x + k;
! 229: mvwaddch(cw, y, x, ' ');
! 230: }
! 231: }
! 232: look(FALSE);
! 233: return;
! 234: }
! 235: if (iswearing(R_LIGHT))
! 236: rp->r_flags &= ~ISDARK;
! 237: for (j = 0; j < rp->r_max.y; j += 1) {
! 238: for (k = 0; k < rp->r_max.x; k += 1) {
! 239: y = rp->r_pos.y + j;
! 240: x = rp->r_pos.x + k;
! 241: if (levtype == MAZELEV && !cansee(y, x))
! 242: continue;
! 243: ch = show(y, x);
! 244: wmove(cw, y, x);
! 245: /*
! 246: * Figure out how to display a secret door
! 247: */
! 248: if (ch == SECRETDOOR) {
! 249: if (j == 0 || j == rp->r_max.y - 1)
! 250: ch = '-';
! 251: else
! 252: ch = '|';
! 253: }
! 254: if (isalpha(ch)) {
! 255: struct thing *mit;
! 256:
! 257: item = wake_monster(y, x);
! 258: if (item == NULL) {
! 259: ch = FLOOR;
! 260: mvaddch(y, x, ch);
! 261: }
! 262: else {
! 263: mit = THINGPTR(item);
! 264: if (mit->t_oldch == ' ')
! 265: if (!rf_on(rp,ISDARK))
! 266: mit->t_oldch = mvinch(y, x);
! 267: if (levtype == MAZELEV)
! 268: ch = mvinch(y, x);
! 269: }
! 270: }
! 271: if (rf_on(rp,ISDARK)) {
! 272: rch = mvwinch(cw, y, x);
! 273: if (isatrap(rch)) {
! 274: ch = rch; /* if its a trap */
! 275: }
! 276: else { /* try other things */
! 277: switch (rch) {
! 278: case DOOR: case STAIRS: case '|':
! 279: case '-':
! 280: ch = rch;
! 281: otherwise:
! 282: ch = ' ';
! 283: }
! 284: }
! 285: }
! 286: mvwaddch(cw, y, x, ch);
! 287: }
! 288: }
! 289: }
! 290:
! 291: /*
! 292: * show:
! 293: * returns what a certain thing will display as to the un-initiated
! 294: */
! 295: char
! 296: show(int y, int x)
! 297: {
! 298: reg char ch = winat(y, x);
! 299: reg struct linked_list *it;
! 300: reg struct thing *tp;
! 301: reg struct trap *ta;
! 302:
! 303: if (isatrap(ch)) {
! 304: if ((ta = trap_at(y, x)) == NULL)
! 305: return FLOOR;
! 306: if (iswearing(R_FTRAPS))
! 307: ta->tr_flags |= ISFOUND;
! 308: return ((ta->tr_flags & ISFOUND) ? ta->tr_type : FLOOR);
! 309: }
! 310: if (ch == SECRETDOOR && iswearing(R_FTRAPS)) {
! 311: mvaddch(y,x,DOOR);
! 312: return DOOR;
! 313: }
! 314: if ((it = find_mons(y, x)) != NULL) { /* maybe a monster */
! 315: tp = THINGPTR(it);
! 316: if (ch == 'M' || (tp->t_flags & ISINVIS)) {
! 317: if (ch == 'M')
! 318: ch = tp->t_disguise;
! 319: else if (pl_off(CANSEE)) {
! 320: if (ch == 's')
! 321: ch = ' '; /* shadows show as a blank */
! 322: else
! 323: ch = mvinch(y, x); /* hide invisibles */
! 324: }
! 325: }
! 326: }
! 327: return ch;
! 328: }
! 329:
! 330: /*
! 331: * be_trapped:
! 332: * Hero or monster stepped on a trap.
! 333: */
! 334: int
! 335: be_trapped(struct coord *tc, struct thing *th)
! 336: {
! 337: reg struct trap *trp;
! 338: reg int ch, ishero;
! 339: struct linked_list *mon;
! 340: char stuckee[35], seeit, sayso;
! 341:
! 342: if ((trp = trap_at(tc->y, tc->x)) == NULL)
! 343: return 0;
! 344: ishero = (th == &player);
! 345: if (ishero) {
! 346: strcpy(stuckee, "You");
! 347: count = running = FALSE;
! 348: }
! 349: else {
! 350: sprintf(stuckee, "The %s", monsters[th->t_indx].m_name);
! 351: }
! 352: seeit = cansee(tc->y, tc->x);
! 353: if (seeit)
! 354: mvwaddch(cw, tc->y, tc->x, trp->tr_type);
! 355: trp->tr_flags |= ISFOUND;
! 356: sayso = TRUE;
! 357: switch (ch = trp->tr_type) {
! 358: case POST:
! 359: if (ishero) {
! 360: nlmove = TRUE;
! 361: new_level(POSTLEV);
! 362: }
! 363: else
! 364: goto goner;
! 365: when MAZETRAP:
! 366: if (ishero) {
! 367: nlmove = TRUE;
! 368: level += 1;
! 369: new_level(MAZELEV);
! 370: msg("You are surrounded by twisty passages!");
! 371: }
! 372: else
! 373: goto goner;
! 374: when TELTRAP:
! 375: nlmove = TRUE;
! 376: teleport(trp->tr_goto, th);
! 377: when TRAPDOOR:
! 378: if (ishero) {
! 379: level += 1;
! 380: new_level(NORMLEV);
! 381: }
! 382: else { /* monsters get lost */
! 383: goner:
! 384: ch = GONER;
! 385: }
! 386: nlmove = TRUE;
! 387: if (seeit && sayso)
! 388: msg("%s fell into a trap!", stuckee);
! 389: when BEARTRAP:
! 390: th->t_nomove += BEARTIME;
! 391: if (seeit) {
! 392: strcat(stuckee, (ishero ? " are" : " is"));
! 393: msg("%s caught in a bear trap.", stuckee);
! 394: }
! 395: when SLEEPTRAP:
! 396: if (ishero && pl_on(ISINVINC))
! 397: msg("You feel momentarily dizzy.");
! 398: else {
! 399: if (ishero)
! 400: th->t_nocmd += SLEEPTIME;
! 401: else
! 402: th->t_nomove += SLEEPTIME;
! 403: if (seeit)
! 404: msg("%s fall%s asleep in a strange white mist.",
! 405: stuckee, (ishero ? "":"s"));
! 406: }
! 407: when ARROWTRAP: {
! 408: int resist, ac;
! 409: struct stats *it;
! 410:
! 411: stuckee[0] = tolower(stuckee[0]);
! 412: it = &th->t_stats;
! 413: if (ishero && cur_armor != NULL)
! 414: ac = cur_armor->o_ac;
! 415: else
! 416: ac = it->s_arm;
! 417: resist = ac + getpdex(it, FALSE);
! 418: if (ishero && pl_on(ISINVINC))
! 419: resist = -100; /* invincible is impossible to hit */
! 420: if (swing(3 + (level / 4), resist, 1)) {
! 421: if (seeit)
! 422: msg("%sAn arrow shot %s.", (ishero ? "Oh no! " : ""),
! 423: stuckee);
! 424: if (ishero)
! 425: chg_hpt(-roll(1,6),FALSE,K_ARROW);
! 426: else {
! 427: it->s_hpt -= roll(1,6);
! 428: if (it->s_hpt < 1) {
! 429: sayso = FALSE;
! 430: goto goner;
! 431: }
! 432: }
! 433: }
! 434: else {
! 435: struct linked_list *item;
! 436: struct object *arrow;
! 437:
! 438: if (seeit)
! 439: msg("An arrow shoots past %s.", stuckee);
! 440: item = new_thing(FALSE, WEAPON, ARROW);
! 441: arrow = OBJPTR(item);
! 442: arrow->o_hplus = 3;
! 443: arrow->o_dplus = rnd(2);
! 444: arrow->o_count = 1;
! 445: arrow->o_pos = th->t_pos;
! 446: fall(item, FALSE);
! 447: }
! 448: }
! 449: when DARTTRAP: {
! 450: int resist, ac;
! 451: struct stats *it;
! 452:
! 453: stuckee[0] = tolower(stuckee[0]);
! 454: it = &th->t_stats;
! 455: if (ishero && cur_armor != NULL)
! 456: ac = cur_armor->o_ac;
! 457: else
! 458: ac = it->s_arm;
! 459: resist = ac + getpdex(it, FALSE);
! 460: if (ishero && pl_on(ISINVINC))
! 461: resist = -100; /* invincible is impossible to hit */
! 462: if (swing(3 + (level / 4), resist, 0)) {
! 463: if (seeit)
! 464: msg("A small dart just hit %s.", stuckee);
! 465: if (ishero) {
! 466: if (!save(VS_POISON))
! 467: chg_abil(CON,-1,TRUE);
! 468: if (!iswearing(R_SUSTSTR))
! 469: chg_abil(STR,-1,TRUE);
! 470: chg_hpt(-roll(1, 4),FALSE,K_DART);
! 471: }
! 472: else {
! 473: if (!save_throw(VS_POISON, th))
! 474: it->s_ef.a_str -= 1;
! 475: it->s_hpt -= roll(1, 4);
! 476: if (it->s_hpt < 1) {
! 477: sayso = FALSE;
! 478: goto goner;
! 479: }
! 480: }
! 481: }
! 482: else if (seeit)
! 483: msg("A small dart whizzes by %s.", stuckee);
! 484: }
! 485: when POOL:
! 486: if (!ishero && rnd(100) < 10) {
! 487: if (seeit)
! 488: msg("The %s drowns !!", stuckee);
! 489: goto goner;
! 490: }
! 491: if ((trp->tr_flags & ISGONE) && rnd(100) < 10) {
! 492: nlmove = TRUE;
! 493: if (rnd(100) < 15)
! 494: teleport(rndspot, th); /* teleport away */
! 495: else if(rnd(100) < 15 && level > 2) {
! 496: level -= rnd(2) + 1;
! 497: new_level(NORMLEV);
! 498: msg("You here a faint groan from below.");
! 499: }
! 500: else if(rnd(100) < 40) {
! 501: level += rnd(4);
! 502: new_level(NORMLEV);
! 503: msg("You find yourself in strange surroundings.");
! 504: }
! 505: else if(rnd(100) < 6 && pl_off(ISINVINC)) {
! 506: msg("Oh no!!! You drown in the pool!!! --More--");
! 507: wait_for(cw, ' ');
! 508: death(K_POOL);
! 509: }
! 510: else
! 511: nlmove = FALSE;
! 512: }
! 513: }
! 514: flushinp(); /* flush typeahead */
! 515: return ch;
! 516: }
! 517:
! 518: /*
! 519: * dip_it:
! 520: * Dip an object into a magic pool
! 521: */
! 522: void
! 523: dip_it(void)
! 524: {
! 525: reg struct linked_list *what;
! 526: reg struct object *ob;
! 527: reg struct trap *tp;
! 528: reg int wh;
! 529:
! 530: tp = trap_at(hero.y,hero.x);
! 531: if (tp == NULL || inpool == FALSE || (tp->tr_flags & ISGONE))
! 532: return;
! 533:
! 534: if ((what = get_item("dip",0)) == NULL)
! 535: return;
! 536: ob = OBJPTR(what);
! 537: mpos = 0;
! 538: /*
! 539: * If hero is trying to dip an object OTHER than his
! 540: * current weapon, make sure that he could drop his
! 541: * current weapon
! 542: */
! 543: if (ob != cur_weapon) {
! 544: if (cur_weapon != NULL && o_on(cur_weapon, ISCURSED)) {
! 545: msg("You are unable to release your weapon.");
! 546: after = FALSE;
! 547: return;
! 548: }
! 549: }
! 550: if (ob == cur_armor) {
! 551: msg("You have to take off your armor before you can dip it.");
! 552: after = FALSE;
! 553: return;
! 554: }
! 555: else if (ob == cur_ring[LEFT] || ob == cur_ring[RIGHT]) {
! 556: msg("You have to take that ring off before you can dip it.");
! 557: after = FALSE;
! 558: return;
! 559: }
! 560: wh = ob->o_which;
! 561: tp->tr_flags |= ISGONE;
! 562: if (ob != NULL && o_off(ob,ISPROT)) {
! 563: setoflg(ob,ISKNOW);
! 564: switch(ob->o_type) {
! 565: case WEAPON:
! 566: if(rnd(100) < 20) { /* enchant weapon here */
! 567: if (o_off(ob,ISCURSED)) {
! 568: ob->o_hplus += 1;
! 569: ob->o_dplus += 1;
! 570: }
! 571: else { /* weapon was prev cursed here */
! 572: ob->o_hplus = rnd(2);
! 573: ob->o_dplus = rnd(2);
! 574: }
! 575: resoflg(ob,ISCURSED);
! 576: }
! 577: else if(rnd(100) < 10) { /* curse weapon here */
! 578: if (o_off(ob,ISCURSED)) {
! 579: ob->o_hplus = -(rnd(2)+1);
! 580: ob->o_dplus = -(rnd(2)+1);
! 581: }
! 582: else { /* if already cursed */
! 583: ob->o_hplus--;
! 584: ob->o_dplus--;
! 585: }
! 586: setoflg(ob,ISCURSED);
! 587: }
! 588: msg("The %s glows for a moment.",w_magic[wh].mi_name);
! 589: when ARMOR:
! 590: if (rnd(100) < 30) { /* enchant armor */
! 591: if(o_off(ob,ISCURSED))
! 592: ob->o_ac -= rnd(2) + 1;
! 593: else
! 594: ob->o_ac = -rnd(3)+ armors[wh].a_class;
! 595: resoflg(ob,ISCURSED);
! 596: }
! 597: else if(rnd(100) < 15){ /* curse armor */
! 598: if (o_off(ob,ISCURSED))
! 599: ob->o_ac = rnd(3)+ armors[wh].a_class;
! 600: else
! 601: ob->o_ac += rnd(2) + 1;
! 602: setoflg(ob,ISCURSED);
! 603: }
! 604: msg("The %s glows for a moment.",a_magic[wh].mi_name);
! 605: when STICK: {
! 606: int i;
! 607: struct rod *rd;
! 608:
! 609: i = rnd(8) + 1;
! 610: if(rnd(100) < 25) /* add charges */
! 611: ob->o_charges += i;
! 612: else if(rnd(100) < 10) { /* remove charges */
! 613: if ((ob->o_charges -= i) < 0)
! 614: ob->o_charges = 0;
! 615: }
! 616: ws_know[wh] = TRUE;
! 617: rd = &ws_stuff[wh];
! 618: msg("The %s %s glows for a moment.",rd->ws_made,rd->ws_type);
! 619: }
! 620: when SCROLL:
! 621: s_know[wh] = TRUE;
! 622: msg("The '%s' scroll unfurls.",s_names[wh]);
! 623: when POTION:
! 624: p_know[wh] = TRUE;
! 625: msg("The %s potion bubbles for a moment.",p_colors[wh]);
! 626: when RING:
! 627: r_know[wh] = TRUE;
! 628: if (magring(ob)) {
! 629: if(rnd(100) < 25) { /* enchant ring */
! 630: if (o_off(ob,ISCURSED))
! 631: ob->o_ac += rnd(2) + 1;
! 632: else
! 633: ob->o_ac = rnd(2) + 1;
! 634: resoflg(ob,ISCURSED);
! 635: }
! 636: else if(rnd(100) < 10) { /* curse ring */
! 637: if (o_off(ob,ISCURSED))
! 638: ob->o_ac = -(rnd(2) + 1);
! 639: else
! 640: ob->o_ac -= (rnd(2) + 1);
! 641: setoflg(ob,ISCURSED);
! 642: }
! 643: }
! 644: msg("The %s ring vibrates for a moment.",r_stones[wh]);
! 645: otherwise:
! 646: msg("The pool bubbles for a moment.");
! 647: }
! 648: }
! 649: cur_weapon = ob; /* hero has to weild item to dip it */
! 650: }
! 651:
! 652:
! 653: /*
! 654: * trap_at:
! 655: * Find the trap at (y,x) on screen.
! 656: */
! 657: struct trap *
! 658: trap_at(int y, int x)
! 659: {
! 660: reg struct trap *tp, *ep;
! 661:
! 662: ep = &traps[ntraps];
! 663: for (tp = traps; tp < ep; tp += 1)
! 664: if (tp->tr_pos.y == y && tp->tr_pos.x == x)
! 665: break;
! 666: if (tp >= ep)
! 667: tp = NULL;
! 668: return tp;
! 669: }
! 670:
! 671: /*
! 672: * rndmove:
! 673: * move in a random direction if the monster/person is confused
! 674: */
! 675: struct coord *
! 676: rndmove(struct thing *who)
! 677: {
! 678: reg int x, y, ex, ey, ch;
! 679: int nopen = 0;
! 680: struct linked_list *item;
! 681: static struct coord ret; /* what we will be returning */
! 682: static struct coord dest;
! 683:
! 684: ret = who->t_pos;
! 685: /*
! 686: * Now go through the spaces surrounding the player and
! 687: * set that place in the array to true if the space can be
! 688: * moved into
! 689: */
! 690: ey = ret.y + 1;
! 691: ex = ret.x + 1;
! 692: for (y = who->t_pos.y - 1; y <= ey; y += 1) {
! 693: for (x = who->t_pos.x - 1; x <= ex; x += 1) {
! 694: if (!cordok(y, x))
! 695: continue;
! 696: ch = winat(y, x);
! 697: if (step_ok(ch)) {
! 698: dest.y = y;
! 699: dest.x = x;
! 700: if (!diag_ok(&who->t_pos, &dest))
! 701: continue;
! 702: if (ch == SCROLL && who != &player) {
! 703: /*
! 704: * check for scare monster scrolls
! 705: */
! 706: item = find_obj(y, x);
! 707: if (item != NULL && (OBJPTR(item))->o_which == S_SCARE)
! 708: continue;
! 709: }
! 710: if (rnd(++nopen) == 0)
! 711: ret = dest;
! 712: }
! 713: }
! 714: }
! 715: return &ret;
! 716: }
! 717:
! 718: /*
! 719: * isatrap:
! 720: * Returns TRUE if this character is some kind of trap
! 721: */
! 722: bool
! 723: isatrap(char ch)
! 724: {
! 725: switch(ch) {
! 726: case POST:
! 727: case DARTTRAP:
! 728: case POOL:
! 729: case TELTRAP:
! 730: case TRAPDOOR:
! 731: case ARROWTRAP:
! 732: case SLEEPTRAP:
! 733: case BEARTRAP:
! 734: case MAZETRAP:
! 735: return TRUE;
! 736: default:
! 737: return FALSE;
! 738: }
! 739: }
CVSweb