|
|
1.1 ! root 1: #include <curses.h> ! 2: #include "rogue.h" ! 3: #include <ctype.h> ! 4: ! 5: /* ! 6: * all sorts of miscellaneous routines ! 7: * ! 8: * @(#)misc.c 3.13 (Berkeley) 6/15/81 ! 9: */ ! 10: ! 11: /* ! 12: * tr_name: ! 13: * print the name of a trap ! 14: */ ! 15: ! 16: char * ! 17: tr_name(ch) ! 18: char ch; ! 19: { ! 20: register char *s; ! 21: ! 22: switch (ch) ! 23: { ! 24: when TRAPDOOR: ! 25: s = terse ? "A trapdoor." : "You found a trapdoor."; ! 26: when BEARTRAP: ! 27: s = terse ? "A beartrap." : "You found a beartrap."; ! 28: when SLEEPTRAP: ! 29: s = terse ? "A sleeping gas trap.":"You found a sleeping gas trap."; ! 30: when ARROWTRAP: ! 31: s = terse ? "An arrow trap." : "You found an arrow trap."; ! 32: when TELTRAP: ! 33: s = terse ? "A teleport trap." : "You found a teleport trap."; ! 34: when DARTTRAP: ! 35: s = terse ? "A dart trap." : "You found a poison dart trap."; ! 36: } ! 37: return s; ! 38: } ! 39: ! 40: /* ! 41: * Look: ! 42: * A quick glance all around the player ! 43: */ ! 44: ! 45: look(wakeup) ! 46: bool wakeup; ! 47: { ! 48: register int x, y; ! 49: register char ch; ! 50: register int oldx, oldy; ! 51: register bool inpass; ! 52: register int passcount = 0; ! 53: register struct room *rp; ! 54: register int ey, ex; ! 55: ! 56: getyx(cw, oldy, oldx); ! 57: if (oldrp != NULL && (oldrp->r_flags & ISDARK) && off(player, ISBLIND)) ! 58: { ! 59: for (x = oldpos.x - 1; x <= oldpos.x + 1; x++) ! 60: for (y = oldpos.y - 1; y <= oldpos.y + 1; y++) ! 61: if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR) ! 62: mvwaddch(cw, y, x, ' '); ! 63: } ! 64: inpass = ((rp = roomin(&hero)) == NULL); ! 65: ey = hero.y + 1; ! 66: ex = hero.x + 1; ! 67: for (x = hero.x - 1; x <= ex; x++) ! 68: if (x >= 0 && x < COLS) for (y = hero.y - 1; y <= ey; y++) ! 69: { ! 70: if (y <= 0 || y >= LINES - 1) ! 71: continue; ! 72: if (isupper(mvwinch(mw, y, x))) ! 73: { ! 74: register struct linked_list *it; ! 75: register struct thing *tp; ! 76: ! 77: if (wakeup) ! 78: it = wake_monster(y, x); ! 79: else ! 80: it = find_mons(y, x); ! 81: tp = (struct thing *) ldata(it); ! 82: if ((tp->t_oldch = mvinch(y, x)) == TRAP) ! 83: tp->t_oldch = ! 84: (trap_at(y,x)->tr_flags&ISFOUND) ? TRAP : FLOOR; ! 85: if (tp->t_oldch == FLOOR && (rp->r_flags & ISDARK) ! 86: && off(player, ISBLIND)) ! 87: tp->t_oldch = ' '; ! 88: } ! 89: /* ! 90: * Secret doors show as walls ! 91: */ ! 92: if ((ch = show(y, x)) == SECRETDOOR) ! 93: ch = secretdoor(y, x); ! 94: /* ! 95: * Don't show room walls if he is in a passage ! 96: */ ! 97: if (off(player, ISBLIND)) ! 98: { ! 99: if (y == hero.y && x == hero.x ! 100: || (inpass && (ch == '-' || ch == '|'))) ! 101: continue; ! 102: } ! 103: else if (y != hero.y || x != hero.x) ! 104: continue; ! 105: wmove(cw, y, x); ! 106: waddch(cw, ch); ! 107: if (door_stop && !firstmove && running) ! 108: { ! 109: switch (runch) ! 110: { ! 111: when 'h': ! 112: if (x == ex) ! 113: continue; ! 114: when 'j': ! 115: if (y == hero.y - 1) ! 116: continue; ! 117: when 'k': ! 118: if (y == ey) ! 119: continue; ! 120: when 'l': ! 121: if (x == hero.x - 1) ! 122: continue; ! 123: when 'y': ! 124: if ((x + y) - (hero.x + hero.y) >= 1) ! 125: continue; ! 126: when 'u': ! 127: if ((y - x) - (hero.y - hero.x) >= 1) ! 128: continue; ! 129: when 'n': ! 130: if ((x + y) - (hero.x + hero.y) <= -1) ! 131: continue; ! 132: when 'b': ! 133: if ((y - x) - (hero.y - hero.x) <= -1) ! 134: continue; ! 135: } ! 136: switch (ch) ! 137: { ! 138: case DOOR: ! 139: if (x == hero.x || y == hero.y) ! 140: running = FALSE; ! 141: break; ! 142: case PASSAGE: ! 143: if (x == hero.x || y == hero.y) ! 144: passcount++; ! 145: break; ! 146: case FLOOR: ! 147: case '|': ! 148: case '-': ! 149: case ' ': ! 150: break; ! 151: default: ! 152: running = FALSE; ! 153: break; ! 154: } ! 155: } ! 156: } ! 157: if (door_stop && !firstmove && passcount > 1) ! 158: running = FALSE; ! 159: mvwaddch(cw, hero.y, hero.x, PLAYER); ! 160: wmove(cw, oldy, oldx); ! 161: oldpos = hero; ! 162: oldrp = rp; ! 163: } ! 164: ! 165: /* ! 166: * secret_door: ! 167: * Figure out what a secret door looks like. ! 168: */ ! 169: ! 170: secretdoor(y, x) ! 171: register int y, x; ! 172: { ! 173: register int i; ! 174: register struct room *rp; ! 175: register coord *cpp; ! 176: static coord cp; ! 177: ! 178: cp.y = y; ! 179: cp.x = x; ! 180: cpp = &cp; ! 181: for (rp = rooms, i = 0; i < MAXROOMS; rp++, i++) ! 182: if (inroom(rp, cpp)) ! 183: if (y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1) ! 184: return('-'); ! 185: else ! 186: return('|'); ! 187: ! 188: return('p'); ! 189: } ! 190: ! 191: /* ! 192: * find_obj: ! 193: * find the unclaimed object at y, x ! 194: */ ! 195: ! 196: struct linked_list * ! 197: find_obj(y, x) ! 198: register int y; ! 199: int x; ! 200: { ! 201: register struct linked_list *obj; ! 202: register struct object *op; ! 203: ! 204: for (obj = lvl_obj; obj != NULL; obj = next(obj)) ! 205: { ! 206: op = (struct object *) ldata(obj); ! 207: if (op->o_pos.y == y && op->o_pos.x == x) ! 208: return obj; ! 209: } ! 210: debug(sprintf(prbuf, "Non-object %d,%d", y, x)); ! 211: return NULL; ! 212: } ! 213: ! 214: /* ! 215: * eat: ! 216: * She wants to eat something, so let her try ! 217: */ ! 218: ! 219: eat() ! 220: { ! 221: register struct linked_list *item; ! 222: register struct object *obj; ! 223: ! 224: if ((item = get_item("eat", FOOD)) == NULL) ! 225: return; ! 226: obj = (struct object *) ldata(item); ! 227: if (obj->o_type != FOOD) ! 228: { ! 229: if (!terse) ! 230: msg("Ugh, you would get ill if you ate that."); ! 231: else ! 232: msg("That's Inedible!"); ! 233: return; ! 234: } ! 235: inpack--; ! 236: if (--obj->o_count < 1) ! 237: { ! 238: detach(pack, item); ! 239: discard(item); ! 240: } ! 241: if (obj->o_which == 1) ! 242: msg("My, that was a yummy %s", fruit); ! 243: else ! 244: if (rnd(100) > 70) ! 245: { ! 246: msg("Yuk, this food tastes awful"); ! 247: pstats.s_exp++; ! 248: check_level(); ! 249: } ! 250: else ! 251: msg("Yum, that tasted good"); ! 252: if ((food_left += HUNGERTIME + rnd(400) - 200) > STOMACHSIZE) ! 253: food_left = STOMACHSIZE; ! 254: hungry_state = 0; ! 255: if (obj == cur_weapon) ! 256: cur_weapon = NULL; ! 257: } ! 258: ! 259: /* ! 260: * Used to modify the playes strength ! 261: * it keeps track of the highest it has been, just in case ! 262: */ ! 263: ! 264: chg_str(amt) ! 265: register int amt; ! 266: { ! 267: if (amt == 0) ! 268: return; ! 269: if (amt > 0) ! 270: { ! 271: while (amt--) ! 272: { ! 273: if (pstats.s_str.st_str < 18) ! 274: pstats.s_str.st_str++; ! 275: else if (pstats.s_str.st_add == 0) ! 276: pstats.s_str.st_add = rnd(50) + 1; ! 277: else if (pstats.s_str.st_add <= 50) ! 278: pstats.s_str.st_add = 51 + rnd(24); ! 279: else if (pstats.s_str.st_add <= 75) ! 280: pstats.s_str.st_add = 76 + rnd(14); ! 281: else if (pstats.s_str.st_add <= 90) ! 282: pstats.s_str.st_add = 91; ! 283: else if (pstats.s_str.st_add < 100) ! 284: pstats.s_str.st_add++; ! 285: } ! 286: if (pstats.s_str.st_str > max_stats.s_str.st_str || ! 287: (pstats.s_str.st_str == 18 && ! 288: pstats.s_str.st_add > max_stats.s_str.st_add)) ! 289: max_stats.s_str = pstats.s_str; ! 290: } ! 291: else ! 292: { ! 293: while (amt++) ! 294: { ! 295: if (pstats.s_str.st_str < 18 || pstats.s_str.st_add == 0) ! 296: pstats.s_str.st_str--; ! 297: else if (pstats.s_str.st_add < 51) ! 298: pstats.s_str.st_add = 0; ! 299: else if (pstats.s_str.st_add < 76) ! 300: pstats.s_str.st_add = 1 + rnd(50); ! 301: else if (pstats.s_str.st_add < 91) ! 302: pstats.s_str.st_add = 51 + rnd(25); ! 303: else if (pstats.s_str.st_add < 100) ! 304: pstats.s_str.st_add = 76 + rnd(14); ! 305: else ! 306: pstats.s_str.st_add = 91 + rnd(8); ! 307: } ! 308: if (pstats.s_str.st_str < 3) ! 309: pstats.s_str.st_str = 3; ! 310: } ! 311: } ! 312: ! 313: /* ! 314: * add_haste: ! 315: * add a haste to the player ! 316: */ ! 317: ! 318: add_haste(potion) ! 319: bool potion; ! 320: { ! 321: if (on(player, ISHASTE)) ! 322: { ! 323: msg("You faint from exhaustion."); ! 324: no_command += rnd(8); ! 325: extinguish(nohaste); ! 326: } ! 327: else ! 328: { ! 329: player.t_flags |= ISHASTE; ! 330: if (potion) ! 331: fuse(nohaste, 0, rnd(4)+4, AFTER); ! 332: } ! 333: } ! 334: ! 335: /* ! 336: * aggravate: ! 337: * aggravate all the monsters on this level ! 338: */ ! 339: ! 340: aggravate() ! 341: { ! 342: register struct linked_list *mi; ! 343: ! 344: for (mi = mlist; mi != NULL; mi = next(mi)) ! 345: runto(&((struct thing *) ldata(mi))->t_pos, &hero); ! 346: } ! 347: ! 348: /* ! 349: * for printfs: if string starts with a vowel, return "n" for an "an" ! 350: */ ! 351: char * ! 352: vowelstr(str) ! 353: register char *str; ! 354: { ! 355: switch (*str) ! 356: { ! 357: case 'a': ! 358: case 'e': ! 359: case 'i': ! 360: case 'o': ! 361: case 'u': ! 362: return "n"; ! 363: default: ! 364: return ""; ! 365: } ! 366: } ! 367: ! 368: /* ! 369: * see if the object is one of the currently used items ! 370: */ ! 371: is_current(obj) ! 372: register struct object *obj; ! 373: { ! 374: if (obj == NULL) ! 375: return FALSE; ! 376: if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT] ! 377: || obj == cur_ring[RIGHT]) ! 378: { ! 379: msg(terse ? "In use." : "That's already in use."); ! 380: return TRUE; ! 381: } ! 382: return FALSE; ! 383: } ! 384: ! 385: /* ! 386: * set up the direction co_ordinate for use in varios "prefix" commands ! 387: */ ! 388: get_dir() ! 389: { ! 390: register char *prompt; ! 391: register bool gotit; ! 392: ! 393: if (!terse) ! 394: msg(prompt = "Which direction? "); ! 395: else ! 396: prompt = "Direction: "; ! 397: do ! 398: { ! 399: gotit = TRUE; ! 400: switch (readchar()) ! 401: { ! 402: when 'h': case'H': delta.y = 0; delta.x = -1; ! 403: when 'j': case'J': delta.y = 1; delta.x = 0; ! 404: when 'k': case'K': delta.y = -1; delta.x = 0; ! 405: when 'l': case'L': delta.y = 0; delta.x = 1; ! 406: when 'y': case'Y': delta.y = -1; delta.x = -1; ! 407: when 'u': case'U': delta.y = -1; delta.x = 1; ! 408: when 'b': case'B': delta.y = 1; delta.x = -1; ! 409: when 'n': case'N': delta.y = 1; delta.x = 1; ! 410: when ESCAPE: return FALSE; ! 411: otherwise: ! 412: mpos = 0; ! 413: msg(prompt); ! 414: gotit = FALSE; ! 415: } ! 416: } until (gotit); ! 417: if (on(player, ISHUH) && rnd(100) > 80) ! 418: do ! 419: { ! 420: delta.y = rnd(3) - 1; ! 421: delta.x = rnd(3) - 1; ! 422: } while (delta.y == 0 && delta.x == 0); ! 423: mpos = 0; ! 424: return TRUE; ! 425: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.