Annotation of early-roguelike/arogue5/rings.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * routines dealing specifically with rings
3: *
4: * Advanced Rogue
5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
6: * All rights reserved.
7: *
8: * Based on "Rogue: Exploring the Dungeons of Doom"
9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10: * All rights reserved.
11: *
12: * See the file LICENSE.TXT for full copyright and licensing information.
13: */
14:
15: #include "curses.h"
16: #include "rogue.h"
17: #include <stdlib.h>
18: #include <string.h>
19:
20: /*
21: * how much food does this ring use up?
22: */
23: int
24: ring_eat(int hand)
25: {
26: if (cur_ring[hand] == NULL)
27: return 0;
28: switch (cur_ring[hand]->o_which) {
29: case R_VAMPREGEN:
30: return 3;
31: case R_REGEN:
32: return 2;
33: case R_HEALTH:
34: case R_SUSABILITY:
35: return 1;
36: case R_SEARCH:
37: case R_SEEINVIS:
38: return (rnd(100) < 33);
39: case R_DIGEST:
40: if (cur_ring[hand]->o_ac >= 0)
41: return (-(cur_ring[hand]->o_ac)-1);
42: else
43: return (-(cur_ring[hand]->o_ac));
44: }
45: return 0;
46: }
47:
48: void
49: ring_on(struct object *obj)
50: {
51: register int save_max;
52: char buf[LINELEN];
53:
54: /*
55: * Calculate the effect it has on the poor guy.
56: */
57: switch (obj->o_which)
58: {
59: case R_ADDSTR:
60: save_max = max_stats.s_str;
61: chg_str(obj->o_ac);
62: max_stats.s_str = save_max;
63: when R_ADDHIT:
64: pstats.s_dext += obj->o_ac;
65: when R_ADDINTEL:
66: pstats.s_intel += obj->o_ac;
67: when R_ADDWISDOM:
68: pstats.s_wisdom += obj->o_ac;
69: when R_SEEINVIS:
70: turn_on(player, CANSEE);
71: msg("Your eyes begin to tingle");
72: light(&hero);
73: mvwaddch(cw, hero.y, hero.x, PLAYER);
74: when R_AGGR:
75: aggravate();
76: when R_WARMTH:
77: turn_on(player, NOCOLD);
78: when R_FIRE:
79: turn_on(player, NOFIRE);
80: when R_LIGHT: {
81: if(roomin(&hero) != NULL) {
82: light(&hero);
83: mvwaddch(cw, hero.y, hero.x, PLAYER);
84: }
85: }
86: when R_SEARCH:
87: start_daemon(ring_search, 0, AFTER);
88: when R_TELEPORT:
89: start_daemon(ring_teleport, 0, AFTER);
90: }
91: status(FALSE);
92: if (r_know[obj->o_which] && r_guess[obj->o_which])
93: {
94: free(r_guess[obj->o_which]);
95: r_guess[obj->o_which] = NULL;
96: }
97: else if (!r_know[obj->o_which] &&
98: askme &&
99: (obj->o_flags & ISKNOW) == 0 &&
100: r_guess[obj->o_which] == NULL) {
101: msg(terse ? "Call it: " : "What do you want to call it? ");
102: if (get_str(buf, msgw) == NORM)
103: {
104: r_guess[obj->o_which] = new((unsigned int) strlen(buf) + 1);
105: strcpy(r_guess[obj->o_which], buf);
106: }
107: msg("");
108: }
109: }
110:
111: /*
112: * print ring bonuses
113: */
114: char *
115: ring_num(struct object *obj)
116: {
117: static char buf[5];
118:
119: if (!(obj->o_flags & ISKNOW))
120: return "";
121: switch (obj->o_which)
122: {
123: case R_PROTECT:
124: case R_ADDSTR:
125: case R_ADDDAM:
126: case R_ADDHIT:
127: case R_ADDINTEL:
128: case R_ADDWISDOM:
129: case R_DIGEST:
130: buf[0] = ' ';
131: strcpy(&buf[1], num(obj->o_ac, 0));
132: when R_AGGR:
133: case R_LIGHT:
134: case R_HEAVY:
135: case R_TELEPORT:
136: if (obj->o_flags & ISCURSED)
137: return " cursed";
138: else
139: return "";
140: otherwise:
141: return "";
142: }
143: return buf;
144: }
145:
146: /*
147: * Return the effect of the specified ring
148: */
149: int
150: ring_value(int type)
151: {
152: int result = 0;
153:
154: if (ISRING(LEFT_1, type)) result += cur_ring[LEFT_1]->o_ac;
155: if (ISRING(LEFT_2, type)) result += cur_ring[LEFT_2]->o_ac;
156: if (ISRING(LEFT_3, type)) result += cur_ring[LEFT_3]->o_ac;
157: if (ISRING(LEFT_4, type)) result += cur_ring[LEFT_4]->o_ac;
158: if (ISRING(RIGHT_1, type)) result += cur_ring[RIGHT_1]->o_ac;
159: if (ISRING(RIGHT_2, type)) result += cur_ring[RIGHT_2]->o_ac;
160: if (ISRING(RIGHT_3, type)) result += cur_ring[RIGHT_3]->o_ac;
161: if (ISRING(RIGHT_4, type)) result += cur_ring[RIGHT_4]->o_ac;
162: return(result);
163: }
CVSweb