comparison arogue5/rings.c @ 63:0ed67132cf10

Import Advanced Rogue 5.8 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 09 Aug 2012 22:58:48 +0000
parents
children c49f7927b0fa
comparison
equal deleted inserted replaced
62:0ef99244acb8 63:0ed67132cf10
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
18 /*
19 * how much food does this ring use up?
20 */
21 ring_eat(hand)
22 register int hand;
23 {
24 if (cur_ring[hand] == NULL)
25 return 0;
26 switch (cur_ring[hand]->o_which) {
27 case R_VAMPREGEN:
28 return 3;
29 case R_REGEN:
30 return 2;
31 case R_HEALTH:
32 case R_SUSABILITY:
33 return 1;
34 case R_SEARCH:
35 case R_SEEINVIS:
36 return (rnd(100) < 33);
37 case R_DIGEST:
38 if (cur_ring[hand]->o_ac >= 0)
39 return (-(cur_ring[hand]->o_ac)-1);
40 else
41 return (-(cur_ring[hand]->o_ac));
42 }
43 return 0;
44 }
45
46 ring_on(obj)
47 register struct object *obj;
48 {
49 register int save_max;
50 char buf[LINELEN];
51
52 /*
53 * Calculate the effect it has on the poor guy.
54 */
55 switch (obj->o_which)
56 {
57 case R_ADDSTR:
58 save_max = max_stats.s_str;
59 chg_str(obj->o_ac);
60 max_stats.s_str = save_max;
61 when R_ADDHIT:
62 pstats.s_dext += obj->o_ac;
63 when R_ADDINTEL:
64 pstats.s_intel += obj->o_ac;
65 when R_ADDWISDOM:
66 pstats.s_wisdom += obj->o_ac;
67 when R_SEEINVIS:
68 turn_on(player, CANSEE);
69 msg("Your eyes begin to tingle");
70 light(&hero);
71 mvwaddch(cw, hero.y, hero.x, PLAYER);
72 when R_AGGR:
73 aggravate();
74 when R_WARMTH:
75 turn_on(player, NOCOLD);
76 when R_FIRE:
77 turn_on(player, NOFIRE);
78 when R_LIGHT: {
79 if(roomin(&hero) != NULL) {
80 light(&hero);
81 mvwaddch(cw, hero.y, hero.x, PLAYER);
82 }
83 }
84 when R_SEARCH:
85 daemon(ring_search, 0, AFTER);
86 when R_TELEPORT:
87 daemon(ring_teleport, 0, AFTER);
88 }
89 status(FALSE);
90 if (r_know[obj->o_which] && r_guess[obj->o_which])
91 {
92 free(r_guess[obj->o_which]);
93 r_guess[obj->o_which] = NULL;
94 }
95 else if (!r_know[obj->o_which] &&
96 askme &&
97 (obj->o_flags & ISKNOW) == 0 &&
98 r_guess[obj->o_which] == NULL) {
99 msg(terse ? "Call it: " : "What do you want to call it? ");
100 if (get_str(buf, cw) == NORM)
101 {
102 r_guess[obj->o_which] = new((unsigned int) strlen(buf) + 1);
103 strcpy(r_guess[obj->o_which], buf);
104 }
105 msg("");
106 }
107 }
108
109 /*
110 * print ring bonuses
111 */
112 char *
113 ring_num(obj)
114 register struct object *obj;
115 {
116 static char buf[5];
117
118 if (!(obj->o_flags & ISKNOW))
119 return "";
120 switch (obj->o_which)
121 {
122 case R_PROTECT:
123 case R_ADDSTR:
124 case R_ADDDAM:
125 case R_ADDHIT:
126 case R_ADDINTEL:
127 case R_ADDWISDOM:
128 case R_DIGEST:
129 buf[0] = ' ';
130 strcpy(&buf[1], num(obj->o_ac, 0));
131 when R_AGGR:
132 case R_LIGHT:
133 case R_HEAVY:
134 case R_TELEPORT:
135 if (obj->o_flags & ISCURSED)
136 return " cursed";
137 else
138 return "";
139 otherwise:
140 return "";
141 }
142 return buf;
143 }
144
145 /*
146 * Return the effect of the specified ring
147 */
148 ring_value(type)
149 {
150 int result = 0;
151
152 if (ISRING(LEFT_1, type)) result += cur_ring[LEFT_1]->o_ac;
153 if (ISRING(LEFT_2, type)) result += cur_ring[LEFT_2]->o_ac;
154 if (ISRING(LEFT_3, type)) result += cur_ring[LEFT_3]->o_ac;
155 if (ISRING(LEFT_4, type)) result += cur_ring[LEFT_4]->o_ac;
156 if (ISRING(RIGHT_1, type)) result += cur_ring[RIGHT_1]->o_ac;
157 if (ISRING(RIGHT_2, type)) result += cur_ring[RIGHT_2]->o_ac;
158 if (ISRING(RIGHT_3, type)) result += cur_ring[RIGHT_3]->o_ac;
159 if (ISRING(RIGHT_4, type)) result += cur_ring[RIGHT_4]->o_ac;
160 return(result);
161 }