|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Timothy C. Stoehr. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted ! 9: * provided that: (1) source distributions retain this entire copyright ! 10: * notice and comment, and (2) distributions including binaries display ! 11: * the following acknowledgement: ``This product includes software ! 12: * developed by the University of California, Berkeley and its contributors'' ! 13: * in the documentation or other materials provided with the distribution ! 14: * and in all advertising materials mentioning features or use of this ! 15: * software. Neither the name of the University nor the names of its ! 16: * contributors may be used to endorse or promote products derived ! 17: * from this software without specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)ring.c 5.3 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: /* ! 28: * ring.c ! 29: * ! 30: * This source herein may be modified and/or distributed by anybody who ! 31: * so desires, with the following restrictions: ! 32: * 1.) No portion of this notice shall be removed. ! 33: * 2.) Credit shall not be taken for the creation of this source. ! 34: * 3.) This code is not to be traded, sold, or used for personal ! 35: * gain or profit. ! 36: * ! 37: */ ! 38: ! 39: #include "rogue.h" ! 40: ! 41: char *left_or_right = "left or right hand?"; ! 42: char *no_ring = "there's no ring on that hand"; ! 43: short stealthy; ! 44: short r_rings; ! 45: short add_strength; ! 46: short e_rings; ! 47: short regeneration; ! 48: short ring_exp; ! 49: short auto_search; ! 50: boolean r_teleport; ! 51: boolean r_see_invisible; ! 52: boolean sustain_strength; ! 53: boolean maintain_armor; ! 54: ! 55: extern char *curse_message; ! 56: extern boolean wizard; ! 57: ! 58: put_on_ring() ! 59: { ! 60: short ch; ! 61: char desc[DCOLS]; ! 62: object *ring; ! 63: ! 64: if (r_rings == 2) { ! 65: message("wearing two rings already", 0); ! 66: return; ! 67: } ! 68: if ((ch = pack_letter("put on what?", RING)) == CANCEL) { ! 69: return; ! 70: } ! 71: if (!(ring = get_letter_object(ch))) { ! 72: message("no such item.", 0); ! 73: return; ! 74: } ! 75: if (!(ring->what_is & RING)) { ! 76: message("that's not a ring", 0); ! 77: return; ! 78: } ! 79: if (ring->in_use_flags & (ON_LEFT_HAND | ON_RIGHT_HAND)) { ! 80: message("that ring is already being worn", 0); ! 81: return; ! 82: } ! 83: if (r_rings == 1) { ! 84: ch = (rogue.left_ring ? 'r' : 'l'); ! 85: } else { ! 86: message(left_or_right, 0); ! 87: do { ! 88: ch = rgetchar(); ! 89: } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') && (ch != '\n') && ! 90: (ch != '\r')); ! 91: } ! 92: if ((ch != 'l') && (ch != 'r')) { ! 93: check_message(); ! 94: return; ! 95: } ! 96: if (((ch == 'l') && rogue.left_ring)||((ch == 'r') && rogue.right_ring)) { ! 97: check_message(); ! 98: message("there's already a ring on that hand", 0); ! 99: return; ! 100: } ! 101: if (ch == 'l') { ! 102: do_put_on(ring, 1); ! 103: } else { ! 104: do_put_on(ring, 0); ! 105: } ! 106: ring_stats(1); ! 107: check_message(); ! 108: get_desc(ring, desc); ! 109: message(desc, 0); ! 110: (void) reg_move(); ! 111: } ! 112: ! 113: /* ! 114: * Do not call ring_stats() from within do_put_on(). It will cause ! 115: * serious problems when do_put_on() is called from read_pack() in restore(). ! 116: */ ! 117: ! 118: do_put_on(ring, on_left) ! 119: object *ring; ! 120: boolean on_left; ! 121: { ! 122: if (on_left) { ! 123: ring->in_use_flags |= ON_LEFT_HAND; ! 124: rogue.left_ring = ring; ! 125: } else { ! 126: ring->in_use_flags |= ON_RIGHT_HAND; ! 127: rogue.right_ring = ring; ! 128: } ! 129: } ! 130: ! 131: remove_ring() ! 132: { ! 133: boolean left = 0, right = 0; ! 134: short ch; ! 135: char buf[DCOLS]; ! 136: object *ring; ! 137: ! 138: if (r_rings == 0) { ! 139: inv_rings(); ! 140: } else if (rogue.left_ring && !rogue.right_ring) { ! 141: left = 1; ! 142: } else if (!rogue.left_ring && rogue.right_ring) { ! 143: right = 1; ! 144: } else { ! 145: message(left_or_right, 0); ! 146: do { ! 147: ch = rgetchar(); ! 148: } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') && ! 149: (ch != '\n') && (ch != '\r')); ! 150: left = (ch == 'l'); ! 151: right = (ch == 'r'); ! 152: check_message(); ! 153: } ! 154: if (left || right) { ! 155: if (left) { ! 156: if (rogue.left_ring) { ! 157: ring = rogue.left_ring; ! 158: } else { ! 159: message(no_ring, 0); ! 160: } ! 161: } else { ! 162: if (rogue.right_ring) { ! 163: ring = rogue.right_ring; ! 164: } else { ! 165: message(no_ring, 0); ! 166: } ! 167: } ! 168: if (ring->is_cursed) { ! 169: message(curse_message, 0); ! 170: } else { ! 171: un_put_on(ring); ! 172: (void) strcpy(buf, "removed "); ! 173: get_desc(ring, buf + 8); ! 174: message(buf, 0); ! 175: (void) reg_move(); ! 176: } ! 177: } ! 178: } ! 179: ! 180: un_put_on(ring) ! 181: object *ring; ! 182: { ! 183: if (ring && (ring->in_use_flags & ON_LEFT_HAND)) { ! 184: ring->in_use_flags &= (~ON_LEFT_HAND); ! 185: rogue.left_ring = 0; ! 186: } else if (ring && (ring->in_use_flags & ON_RIGHT_HAND)) { ! 187: ring->in_use_flags &= (~ON_RIGHT_HAND); ! 188: rogue.right_ring = 0; ! 189: } ! 190: ring_stats(1); ! 191: } ! 192: ! 193: gr_ring(ring, assign_wk) ! 194: object *ring; ! 195: boolean assign_wk; ! 196: { ! 197: ring->what_is = RING; ! 198: if (assign_wk) { ! 199: ring->which_kind = get_rand(0, (RINGS - 1)); ! 200: } ! 201: ring->class = 0; ! 202: ! 203: switch(ring->which_kind) { ! 204: /* ! 205: case STEALTH: ! 206: break; ! 207: case SLOW_DIGEST: ! 208: break; ! 209: case REGENERATION: ! 210: break; ! 211: case R_SEE_INVISIBLE: ! 212: break; ! 213: case SUSTAIN_STRENGTH: ! 214: break; ! 215: case R_MAINTAIN_ARMOR: ! 216: break; ! 217: case SEARCHING: ! 218: break; ! 219: */ ! 220: case R_TELEPORT: ! 221: ring->is_cursed = 1; ! 222: break; ! 223: case ADD_STRENGTH: ! 224: case DEXTERITY: ! 225: while ((ring->class = (get_rand(0, 4) - 2)) == 0) ; ! 226: ring->is_cursed = (ring->class < 0); ! 227: break; ! 228: case ADORNMENT: ! 229: ring->is_cursed = coin_toss(); ! 230: break; ! 231: } ! 232: } ! 233: ! 234: inv_rings() ! 235: { ! 236: char buf[DCOLS]; ! 237: ! 238: if (r_rings == 0) { ! 239: message("not wearing any rings", 0); ! 240: } else { ! 241: if (rogue.left_ring) { ! 242: get_desc(rogue.left_ring, buf); ! 243: message(buf, 0); ! 244: } ! 245: if (rogue.right_ring) { ! 246: get_desc(rogue.right_ring, buf); ! 247: message(buf, 0); ! 248: } ! 249: } ! 250: if (wizard) { ! 251: sprintf(buf, "ste %d, r_r %d, e_r %d, r_t %d, s_s %d, a_s %d, reg %d, r_e %d, s_i %d, m_a %d, aus %d", ! 252: stealthy, r_rings, e_rings, r_teleport, sustain_strength, ! 253: add_strength, regeneration, ring_exp, r_see_invisible, ! 254: maintain_armor, auto_search); ! 255: message(buf, 0); ! 256: } ! 257: } ! 258: ! 259: ring_stats(pr) ! 260: boolean pr; ! 261: { ! 262: short i; ! 263: object *ring; ! 264: ! 265: stealthy = 0; ! 266: r_rings = 0; ! 267: e_rings = 0; ! 268: r_teleport = 0; ! 269: sustain_strength = 0; ! 270: add_strength = 0; ! 271: regeneration = 0; ! 272: ring_exp = 0; ! 273: r_see_invisible = 0; ! 274: maintain_armor = 0; ! 275: auto_search = 0; ! 276: ! 277: for (i = 0; i < 2; i++) { ! 278: if (!(ring = ((i == 0) ? rogue.left_ring : rogue.right_ring))) { ! 279: continue; ! 280: } ! 281: r_rings++; ! 282: e_rings++; ! 283: switch(ring->which_kind) { ! 284: case STEALTH: ! 285: stealthy++; ! 286: break; ! 287: case R_TELEPORT: ! 288: r_teleport = 1; ! 289: break; ! 290: case REGENERATION: ! 291: regeneration++; ! 292: break; ! 293: case SLOW_DIGEST: ! 294: e_rings -= 2; ! 295: break; ! 296: case ADD_STRENGTH: ! 297: add_strength += ring->class; ! 298: break; ! 299: case SUSTAIN_STRENGTH: ! 300: sustain_strength = 1; ! 301: break; ! 302: case DEXTERITY: ! 303: ring_exp += ring->class; ! 304: break; ! 305: case ADORNMENT: ! 306: break; ! 307: case R_SEE_INVISIBLE: ! 308: r_see_invisible = 1; ! 309: break; ! 310: case MAINTAIN_ARMOR: ! 311: maintain_armor = 1; ! 312: break; ! 313: case SEARCHING: ! 314: auto_search += 2; ! 315: break; ! 316: } ! 317: } ! 318: if (pr) { ! 319: print_stats(STAT_STRENGTH); ! 320: relight(); ! 321: } ! 322: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.