|
|
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.