|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.