|
|
1.1 ! root 1: /* ! 2: * use.c ! 3: * ! 4: * This source herein may be modified and/or distributed by anybody who ! 5: * so desires, with the following restrictions: ! 6: * 1.) No portion of this notice shall be removed. ! 7: * 2.) Credit shall not be taken for the creation of this source. ! 8: * 3.) This code is not to be traded, sold, or used for personal ! 9: * gain or profit. ! 10: * ! 11: */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)use.c 5.1 (Berkeley) 11/25/87"; ! 15: #endif /* not lint */ ! 16: ! 17: #include "rogue.h" ! 18: ! 19: short halluc = 0; ! 20: short blind = 0; ! 21: short confused = 0; ! 22: short levitate = 0; ! 23: short haste_self = 0; ! 24: boolean see_invisible = 0; ! 25: short extra_hp = 0; ! 26: boolean detect_monster = 0; ! 27: boolean con_mon = 0; ! 28: char *strange_feeling = "you have a strange feeling for a moment, then it passes"; ! 29: ! 30: extern short bear_trap; ! 31: extern char hunger_str[]; ! 32: extern short cur_room; ! 33: extern long level_points[]; ! 34: extern boolean being_held; ! 35: extern char *fruit, *you_can_move_again; ! 36: extern boolean sustain_strength; ! 37: ! 38: quaff() ! 39: { ! 40: short ch; ! 41: char buf[80]; ! 42: object *obj; ! 43: ! 44: ch = pack_letter("quaff what?", POTION); ! 45: ! 46: if (ch == CANCEL) { ! 47: return; ! 48: } ! 49: if (!(obj = get_letter_object(ch))) { ! 50: message("no such item.", 0); ! 51: return; ! 52: } ! 53: if (obj->what_is != POTION) { ! 54: message("you can't drink that", 0); ! 55: return; ! 56: } ! 57: switch(obj->which_kind) { ! 58: case INCREASE_STRENGTH: ! 59: message("you feel stronger now, what bulging muscles!", ! 60: 0); ! 61: rogue.str_current++; ! 62: if (rogue.str_current > rogue.str_max) { ! 63: rogue.str_max = rogue.str_current; ! 64: } ! 65: break; ! 66: case RESTORE_STRENGTH: ! 67: rogue.str_current = rogue.str_max; ! 68: message("this tastes great, you feel warm all over", 0); ! 69: break; ! 70: case HEALING: ! 71: message("you begin to feel better", 0); ! 72: potion_heal(0); ! 73: break; ! 74: case EXTRA_HEALING: ! 75: message("you begin to feel much better", 0); ! 76: potion_heal(1); ! 77: break; ! 78: case POISON: ! 79: if (!sustain_strength) { ! 80: rogue.str_current -= get_rand(1, 3); ! 81: if (rogue.str_current < 1) { ! 82: rogue.str_current = 1; ! 83: } ! 84: } ! 85: message("you feel very sick now", 0); ! 86: if (halluc) { ! 87: unhallucinate(); ! 88: } ! 89: break; ! 90: case RAISE_LEVEL: ! 91: rogue.exp_points = level_points[rogue.exp - 1]; ! 92: message("you suddenly feel much more skillful", 0); ! 93: add_exp(1, 1); ! 94: break; ! 95: case BLINDNESS: ! 96: go_blind(); ! 97: break; ! 98: case HALLUCINATION: ! 99: message("oh wow, everything seems so cosmic", 0); ! 100: halluc += get_rand(500, 800); ! 101: break; ! 102: case DETECT_MONSTER: ! 103: show_monsters(); ! 104: if (!(level_monsters.next_monster)) { ! 105: message(strange_feeling, 0); ! 106: } ! 107: break; ! 108: case DETECT_OBJECTS: ! 109: if (level_objects.next_object) { ! 110: if (!blind) { ! 111: show_objects(); ! 112: } ! 113: } else { ! 114: message(strange_feeling, 0); ! 115: } ! 116: break; ! 117: case CONFUSION: ! 118: message((halluc ? "what a trippy feeling" : ! 119: "you feel confused"), 0); ! 120: cnfs(); ! 121: break; ! 122: case LEVITATION: ! 123: message("you start to float in the air", 0); ! 124: levitate += get_rand(15, 30); ! 125: being_held = bear_trap = 0; ! 126: break; ! 127: case HASTE_SELF: ! 128: message("you feel yourself moving much faster", 0); ! 129: haste_self += get_rand(11, 21); ! 130: if (!(haste_self % 2)) { ! 131: haste_self++; ! 132: } ! 133: break; ! 134: case SEE_INVISIBLE: ! 135: sprintf(buf, "hmm, this potion tastes like %sjuice", fruit); ! 136: message(buf, 0); ! 137: if (blind) { ! 138: unblind(); ! 139: } ! 140: see_invisible = 1; ! 141: relight(); ! 142: break; ! 143: } ! 144: print_stats((STAT_STRENGTH | STAT_HP)); ! 145: if (id_potions[obj->which_kind].id_status != CALLED) { ! 146: id_potions[obj->which_kind].id_status = IDENTIFIED; ! 147: } ! 148: vanish(obj, 1, &rogue.pack); ! 149: } ! 150: ! 151: read_scroll() ! 152: { ! 153: short ch; ! 154: object *obj; ! 155: char msg[DCOLS]; ! 156: ! 157: ch = pack_letter("read what?", SCROL); ! 158: ! 159: if (ch == CANCEL) { ! 160: return; ! 161: } ! 162: if (!(obj = get_letter_object(ch))) { ! 163: message("no such item.", 0); ! 164: return; ! 165: } ! 166: if (obj->what_is != SCROL) { ! 167: message("you can't read that", 0); ! 168: return; ! 169: } ! 170: switch(obj->which_kind) { ! 171: case SCARE_MONSTER: ! 172: message("you hear a maniacal laughter in the distance", ! 173: 0); ! 174: break; ! 175: case HOLD_MONSTER: ! 176: hold_monster(); ! 177: break; ! 178: case ENCH_WEAPON: ! 179: if (rogue.weapon) { ! 180: if (rogue.weapon->what_is == WEAPON) { ! 181: sprintf(msg, "your %sglow%s %sfor a moment", ! 182: name_of(rogue.weapon), ! 183: ((rogue.weapon->quantity <= 1) ? "s" : ""), ! 184: get_ench_color()); ! 185: message(msg, 0); ! 186: if (coin_toss()) { ! 187: rogue.weapon->hit_enchant++; ! 188: } else { ! 189: rogue.weapon->d_enchant++; ! 190: } ! 191: } ! 192: rogue.weapon->is_cursed = 0; ! 193: } else { ! 194: message("your hands tingle", 0); ! 195: } ! 196: break; ! 197: case ENCH_ARMOR: ! 198: if (rogue.armor) { ! 199: sprintf(msg, "your armor glows %sfor a moment", ! 200: get_ench_color()); ! 201: message(msg, 0); ! 202: rogue.armor->d_enchant++; ! 203: rogue.armor->is_cursed = 0; ! 204: print_stats(STAT_ARMOR); ! 205: } else { ! 206: message("your skin crawls", 0); ! 207: } ! 208: break; ! 209: case IDENTIFY: ! 210: message("this is a scroll of identify", 0); ! 211: obj->identified = 1; ! 212: id_scrolls[obj->which_kind].id_status = IDENTIFIED; ! 213: idntfy(); ! 214: break; ! 215: case TELEPORT: ! 216: tele(); ! 217: break; ! 218: case SLEEP: ! 219: message("you fall asleep", 0); ! 220: take_a_nap(); ! 221: break; ! 222: case PROTECT_ARMOR: ! 223: if (rogue.armor) { ! 224: message( "your armor is covered by a shimmering gold shield",0); ! 225: rogue.armor->is_protected = 1; ! 226: rogue.armor->is_cursed = 0; ! 227: } else { ! 228: message("your acne seems to have disappeared", 0); ! 229: } ! 230: break; ! 231: case REMOVE_CURSE: ! 232: message((!halluc) ? ! 233: "you feel as though someone is watching over you" : ! 234: "you feel in touch with the universal oneness", 0); ! 235: uncurse_all(); ! 236: break; ! 237: case CREATE_MONSTER: ! 238: create_monster(); ! 239: break; ! 240: case AGGRAVATE_MONSTER: ! 241: aggravate(); ! 242: break; ! 243: case MAGIC_MAPPING: ! 244: message("this scroll seems to have a map on it", 0); ! 245: draw_magic_map(); ! 246: break; ! 247: case CON_MON: ! 248: con_mon = 1; ! 249: sprintf(msg, "your hands glow %sfor a moment", get_ench_color()); ! 250: message(msg, 0); ! 251: break; ! 252: } ! 253: if (id_scrolls[obj->which_kind].id_status != CALLED) { ! 254: id_scrolls[obj->which_kind].id_status = IDENTIFIED; ! 255: } ! 256: vanish(obj, (obj->which_kind != SLEEP), &rogue.pack); ! 257: } ! 258: ! 259: /* vanish() does NOT handle a quiver of weapons with more than one ! 260: * arrow (or whatever) in the quiver. It will only decrement the count. ! 261: */ ! 262: ! 263: vanish(obj, rm, pack) ! 264: object *obj; ! 265: short rm; ! 266: object *pack; ! 267: { ! 268: if (obj->quantity > 1) { ! 269: obj->quantity--; ! 270: } else { ! 271: if (obj->in_use_flags & BEING_WIELDED) { ! 272: unwield(obj); ! 273: } else if (obj->in_use_flags & BEING_WORN) { ! 274: unwear(obj); ! 275: } else if (obj->in_use_flags & ON_EITHER_HAND) { ! 276: un_put_on(obj); ! 277: } ! 278: take_from_pack(obj, pack); ! 279: free_object(obj); ! 280: } ! 281: if (rm) { ! 282: (void) reg_move(); ! 283: } ! 284: } ! 285: ! 286: potion_heal(extra) ! 287: { ! 288: float ratio; ! 289: short add; ! 290: ! 291: rogue.hp_current += rogue.exp; ! 292: ! 293: ratio = ((float)rogue.hp_current) / rogue.hp_max; ! 294: ! 295: if (ratio >= 1.00) { ! 296: rogue.hp_max += (extra ? 2 : 1); ! 297: extra_hp += (extra ? 2 : 1); ! 298: rogue.hp_current = rogue.hp_max; ! 299: } else if (ratio >= 0.90) { ! 300: rogue.hp_max += (extra ? 1 : 0); ! 301: extra_hp += (extra ? 1 : 0); ! 302: rogue.hp_current = rogue.hp_max; ! 303: } else { ! 304: if (ratio < 0.33) { ! 305: ratio = 0.33; ! 306: } ! 307: if (extra) { ! 308: ratio += ratio; ! 309: } ! 310: add = (short)(ratio * ((float)rogue.hp_max - rogue.hp_current)); ! 311: rogue.hp_current += add; ! 312: if (rogue.hp_current > rogue.hp_max) { ! 313: rogue.hp_current = rogue.hp_max; ! 314: } ! 315: } ! 316: if (blind) { ! 317: unblind(); ! 318: } ! 319: if (confused && extra) { ! 320: unconfuse(); ! 321: } else if (confused) { ! 322: confused = (confused / 2) + 1; ! 323: } ! 324: if (halluc && extra) { ! 325: unhallucinate(); ! 326: } else if (halluc) { ! 327: halluc = (halluc / 2) + 1; ! 328: } ! 329: } ! 330: ! 331: idntfy() ! 332: { ! 333: short ch; ! 334: object *obj; ! 335: struct id *id_table; ! 336: char desc[DCOLS]; ! 337: AGAIN: ! 338: ch = pack_letter("what would you like to identify?", ALL_OBJECTS); ! 339: ! 340: if (ch == CANCEL) { ! 341: return; ! 342: } ! 343: if (!(obj = get_letter_object(ch))) { ! 344: message("no such item, try again", 0); ! 345: message("", 0); ! 346: check_message(); ! 347: goto AGAIN; ! 348: } ! 349: obj->identified = 1; ! 350: if (obj->what_is & (SCROL | POTION | WEAPON | ARMOR | WAND | RING)) { ! 351: id_table = get_id_table(obj); ! 352: id_table[obj->which_kind].id_status = IDENTIFIED; ! 353: } ! 354: get_desc(obj, desc); ! 355: message(desc, 0); ! 356: } ! 357: ! 358: eat() ! 359: { ! 360: short ch; ! 361: short moves; ! 362: object *obj; ! 363: char buf[70]; ! 364: ! 365: ch = pack_letter("eat what?", FOOD); ! 366: ! 367: if (ch == CANCEL) { ! 368: return; ! 369: } ! 370: if (!(obj = get_letter_object(ch))) { ! 371: message("no such item.", 0); ! 372: return; ! 373: } ! 374: if (obj->what_is != FOOD) { ! 375: message("you can't eat that", 0); ! 376: return; ! 377: } ! 378: if ((obj->which_kind == FRUIT) || rand_percent(60)) { ! 379: moves = get_rand(950, 1150); ! 380: if (obj->which_kind == RATION) { ! 381: message("yum, that tasted good", 0); ! 382: } else { ! 383: sprintf(buf, "my, that was a yummy %s", fruit); ! 384: message(buf, 0); ! 385: } ! 386: } else { ! 387: moves = get_rand(750, 950); ! 388: message("yuk, that food tasted awful", 0); ! 389: add_exp(2, 1); ! 390: } ! 391: rogue.moves_left /= 3; ! 392: rogue.moves_left += moves; ! 393: hunger_str[0] = 0; ! 394: print_stats(STAT_HUNGER); ! 395: ! 396: vanish(obj, 1, &rogue.pack); ! 397: } ! 398: ! 399: hold_monster() ! 400: { ! 401: short i, j; ! 402: short mcount = 0; ! 403: object *monster; ! 404: short row, col; ! 405: ! 406: for (i = -2; i <= 2; i++) { ! 407: for (j = -2; j <= 2; j++) { ! 408: row = rogue.row + i; ! 409: col = rogue.col + j; ! 410: if ((row < MIN_ROW) || (row > (DROWS-2)) || (col < 0) || ! 411: (col > (DCOLS-1))) { ! 412: continue; ! 413: } ! 414: if (dungeon[row][col] & MONSTER) { ! 415: monster = object_at(&level_monsters, row, col); ! 416: monster->m_flags |= ASLEEP; ! 417: monster->m_flags &= (~WAKENS); ! 418: mcount++; ! 419: } ! 420: } ! 421: } ! 422: if (mcount == 0) { ! 423: message("you feel a strange sense of loss", 0); ! 424: } else if (mcount == 1) { ! 425: message("the monster freezes", 0); ! 426: } else { ! 427: message("the monsters around you freeze", 0); ! 428: } ! 429: } ! 430: ! 431: tele() ! 432: { ! 433: mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col)); ! 434: ! 435: if (cur_room >= 0) { ! 436: darken_room(cur_room); ! 437: } ! 438: put_player(get_room_number(rogue.row, rogue.col)); ! 439: being_held = 0; ! 440: bear_trap = 0; ! 441: } ! 442: ! 443: hallucinate() ! 444: { ! 445: object *obj, *monster; ! 446: short ch; ! 447: ! 448: if (blind) return; ! 449: ! 450: obj = level_objects.next_object; ! 451: ! 452: while (obj) { ! 453: ch = mvinch(obj->row, obj->col); ! 454: if (((ch < 'A') || (ch > 'Z')) && ! 455: ((obj->row != rogue.row) || (obj->col != rogue.col))) ! 456: if ((ch != ' ') && (ch != '.') && (ch != '#') && (ch != '+')) { ! 457: addch(gr_obj_char()); ! 458: } ! 459: obj = obj->next_object; ! 460: } ! 461: monster = level_monsters.next_monster; ! 462: ! 463: while (monster) { ! 464: ch = mvinch(monster->row, monster->col); ! 465: if ((ch >= 'A') && (ch <= 'Z')) { ! 466: addch(get_rand('A', 'Z')); ! 467: } ! 468: monster = monster->next_monster; ! 469: } ! 470: } ! 471: ! 472: unhallucinate() ! 473: { ! 474: halluc = 0; ! 475: relight(); ! 476: message("everything looks SO boring now", 1); ! 477: } ! 478: ! 479: unblind() ! 480: { ! 481: blind = 0; ! 482: message("the veil of darkness lifts", 1); ! 483: relight(); ! 484: if (halluc) { ! 485: hallucinate(); ! 486: } ! 487: if (detect_monster) { ! 488: show_monsters(); ! 489: } ! 490: } ! 491: ! 492: relight() ! 493: { ! 494: if (cur_room == PASSAGE) { ! 495: light_passage(rogue.row, rogue.col); ! 496: } else { ! 497: light_up_room(cur_room); ! 498: } ! 499: mvaddch(rogue.row, rogue.col, rogue.fchar); ! 500: } ! 501: ! 502: take_a_nap() ! 503: { ! 504: short i; ! 505: ! 506: i = get_rand(2, 5); ! 507: md_sleep(1); ! 508: ! 509: while (i--) { ! 510: mv_mons(); ! 511: } ! 512: md_sleep(1); ! 513: message(you_can_move_again, 0); ! 514: } ! 515: ! 516: go_blind() ! 517: { ! 518: short i, j; ! 519: ! 520: if (!blind) { ! 521: message("a cloak of darkness falls around you", 0); ! 522: } ! 523: blind += get_rand(500, 800); ! 524: ! 525: if (detect_monster) { ! 526: object *monster; ! 527: ! 528: monster = level_monsters.next_monster; ! 529: ! 530: while (monster) { ! 531: mvaddch(monster->row, monster->col, monster->trail_char); ! 532: monster = monster->next_monster; ! 533: } ! 534: } ! 535: if (cur_room >= 0) { ! 536: for (i = rooms[cur_room].top_row + 1; ! 537: i < rooms[cur_room].bottom_row; i++) { ! 538: for (j = rooms[cur_room].left_col + 1; ! 539: j < rooms[cur_room].right_col; j++) { ! 540: mvaddch(i, j, ' '); ! 541: } ! 542: } ! 543: } ! 544: mvaddch(rogue.row, rogue.col, rogue.fchar); ! 545: } ! 546: ! 547: char * ! 548: get_ench_color() ! 549: { ! 550: if (halluc) { ! 551: return(id_potions[get_rand(0, POTIONS-1)].title); ! 552: } else if (con_mon) { ! 553: return("red "); ! 554: } ! 555: return("blue "); ! 556: } ! 557: ! 558: cnfs() ! 559: { ! 560: confused += get_rand(12, 22); ! 561: } ! 562: ! 563: unconfuse() ! 564: { ! 565: char msg[80]; ! 566: ! 567: confused = 0; ! 568: sprintf(msg, "you feel less %s now", (halluc ? "trippy" : "confused")); ! 569: message(msg, 1); ! 570: } ! 571: ! 572: uncurse_all() ! 573: { ! 574: object *obj; ! 575: ! 576: obj = rogue.pack.next_object; ! 577: ! 578: while (obj) { ! 579: obj->is_cursed = 0; ! 580: obj = obj->next_object; ! 581: } ! 582: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.