1: /* 2: * ring.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[] = "@(#)ring.c 5.1 (Berkeley) 11/25/87"; 15: #endif /* not lint */ 16: 17: #include "rogue.h" 18: 19: char *left_or_right = "left or right hand?"; 20: char *no_ring = "there's no ring on that hand"; 21: short stealthy; 22: short r_rings; 23: short add_strength; 24: short e_rings; 25: short regeneration; 26: short ring_exp; 27: short auto_search; 28: boolean r_teleport; 29: boolean r_see_invisible; 30: boolean sustain_strength; 31: boolean maintain_armor; 32: 33: extern char *curse_message; 34: extern boolean wizard; 35: 36: put_on_ring() 37: { 38: short ch; 39: char desc[DCOLS]; 40: object *ring; 41: 42: if (r_rings == 2) { 43: message("wearing two rings already", 0); 44: return; 45: } 46: if ((ch = pack_letter("put on what?", RING)) == CANCEL) { 47: return; 48: } 49: if (!(ring = get_letter_object(ch))) { 50: message("no such item.", 0); 51: return; 52: } 53: if (!(ring->what_is & RING)) { 54: message("that's not a ring", 0); 55: return; 56: } 57: if (ring->in_use_flags & (ON_LEFT_HAND | ON_RIGHT_HAND)) { 58: message("that ring is already being worn", 0); 59: return; 60: } 61: if (r_rings == 1) { 62: ch = (rogue.left_ring ? 'r' : 'l'); 63: } else { 64: message(left_or_right, 0); 65: do { 66: ch = rgetchar(); 67: } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') && (ch != '\n') && 68: (ch != '\r')); 69: } 70: if ((ch != 'l') && (ch != 'r')) { 71: check_message(); 72: return; 73: } 74: if (((ch == 'l') && rogue.left_ring)||((ch == 'r') && rogue.right_ring)) { 75: check_message(); 76: message("there's already a ring on that hand", 0); 77: return; 78: } 79: if (ch == 'l') { 80: do_put_on(ring, 1); 81: } else { 82: do_put_on(ring, 0); 83: } 84: ring_stats(1); 85: check_message(); 86: get_desc(ring, desc); 87: message(desc, 0); 88: (void) reg_move(); 89: } 90: 91: /* 92: * Do not call ring_stats() from within do_put_on(). It will cause 93: * serious problems when do_put_on() is called from read_pack() in restore(). 94: */ 95: 96: do_put_on(ring, on_left) 97: object *ring; 98: boolean on_left; 99: { 100: if (on_left) { 101: ring->in_use_flags |= ON_LEFT_HAND; 102: rogue.left_ring = ring; 103: } else { 104: ring->in_use_flags |= ON_RIGHT_HAND; 105: rogue.right_ring = ring; 106: } 107: } 108: 109: remove_ring() 110: { 111: boolean left = 0, right = 0; 112: short ch; 113: char buf[DCOLS]; 114: object *ring; 115: 116: if (r_rings == 0) { 117: inv_rings(); 118: } else if (rogue.left_ring && !rogue.right_ring) { 119: left = 1; 120: } else if (!rogue.left_ring && rogue.right_ring) { 121: right = 1; 122: } else { 123: message(left_or_right, 0); 124: do { 125: ch = rgetchar(); 126: } while ((ch != CANCEL) && (ch != 'l') && (ch != 'r') && 127: (ch != '\n') && (ch != '\r')); 128: left = (ch == 'l'); 129: right = (ch == 'r'); 130: check_message(); 131: } 132: if (left || right) { 133: if (left) { 134: if (rogue.left_ring) { 135: ring = rogue.left_ring; 136: } else { 137: message(no_ring, 0); 138: } 139: } else { 140: if (rogue.right_ring) { 141: ring = rogue.right_ring; 142: } else { 143: message(no_ring, 0); 144: } 145: } 146: if (ring->is_cursed) { 147: message(curse_message, 0); 148: } else { 149: un_put_on(ring); 150: (void) strcpy(buf, "removed "); 151: get_desc(ring, buf + 8); 152: message(buf, 0); 153: (void) reg_move(); 154: } 155: } 156: } 157: 158: un_put_on(ring) 159: object *ring; 160: { 161: if (ring && (ring->in_use_flags & ON_LEFT_HAND)) { 162: ring->in_use_flags &= (~ON_LEFT_HAND); 163: rogue.left_ring = 0; 164: } else if (ring && (ring->in_use_flags & ON_RIGHT_HAND)) { 165: ring->in_use_flags &= (~ON_RIGHT_HAND); 166: rogue.right_ring = 0; 167: } 168: ring_stats(1); 169: } 170: 171: gr_ring(ring, assign_wk) 172: object *ring; 173: boolean assign_wk; 174: { 175: ring->what_is = RING; 176: if (assign_wk) { 177: ring->which_kind = get_rand(0, (RINGS - 1)); 178: } 179: ring->class = 0; 180: 181: switch(ring->which_kind) { 182: /* 183: case STEALTH: 184: break; 185: case SLOW_DIGEST: 186: break; 187: case REGENERATION: 188: break; 189: case R_SEE_INVISIBLE: 190: break; 191: case SUSTAIN_STRENGTH: 192: break; 193: case R_MAINTAIN_ARMOR: 194: break; 195: case SEARCHING: 196: break; 197: */ 198: case R_TELEPORT: 199: ring->is_cursed = 1; 200: break; 201: case ADD_STRENGTH: 202: case DEXTERITY: 203: while ((ring->class = (get_rand(0, 4) - 2)) == 0) ; 204: ring->is_cursed = (ring->class < 0); 205: break; 206: case ADORNMENT: 207: ring->is_cursed = coin_toss(); 208: break; 209: } 210: } 211: 212: inv_rings() 213: { 214: char buf[DCOLS]; 215: 216: if (r_rings == 0) { 217: message("not wearing any rings", 0); 218: } else { 219: if (rogue.left_ring) { 220: get_desc(rogue.left_ring, buf); 221: message(buf, 0); 222: } 223: if (rogue.right_ring) { 224: get_desc(rogue.right_ring, buf); 225: message(buf, 0); 226: } 227: } 228: if (wizard) { 229: 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", 230: stealthy, r_rings, e_rings, r_teleport, sustain_strength, 231: add_strength, regeneration, ring_exp, r_see_invisible, 232: maintain_armor, auto_search); 233: message(buf, 0); 234: } 235: } 236: 237: ring_stats(pr) 238: boolean pr; 239: { 240: short i; 241: object *ring; 242: 243: stealthy = 0; 244: r_rings = 0; 245: e_rings = 0; 246: r_teleport = 0; 247: sustain_strength = 0; 248: add_strength = 0; 249: regeneration = 0; 250: ring_exp = 0; 251: r_see_invisible = 0; 252: maintain_armor = 0; 253: auto_search = 0; 254: 255: for (i = 0; i < 2; i++) { 256: if (!(ring = ((i == 0) ? rogue.left_ring : rogue.right_ring))) { 257: continue; 258: } 259: r_rings++; 260: e_rings++; 261: switch(ring->which_kind) { 262: case STEALTH: 263: stealthy++; 264: break; 265: case R_TELEPORT: 266: r_teleport = 1; 267: break; 268: case REGENERATION: 269: regeneration++; 270: break; 271: case SLOW_DIGEST: 272: e_rings -= 2; 273: break; 274: case ADD_STRENGTH: 275: add_strength += ring->class; 276: break; 277: case SUSTAIN_STRENGTH: 278: sustain_strength = 1; 279: break; 280: case DEXTERITY: 281: ring_exp += ring->class; 282: break; 283: case ADORNMENT: 284: break; 285: case R_SEE_INVISIBLE: 286: r_see_invisible = 1; 287: break; 288: case MAINTAIN_ARMOR: 289: maintain_armor = 1; 290: break; 291: case SEARCHING: 292: auto_search += 2; 293: break; 294: } 295: } 296: if (pr) { 297: print_stats(STAT_STRENGTH); 298: relight(); 299: } 300: }