comparison arogue7/rings.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children b786053d2f37
comparison
equal deleted inserted replaced
124:d10fc4a065ac 125:adfa37e67084
1 /*
2 * rings.c - routines dealing specifically with rings
3 * Advanced Rogue
4 * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
5 * All rights reserved.
6 *
7 * Based on "Rogue: Exploring the Dungeons of Doom"
8 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
9 * All rights reserved.
10 *
11 * See the file LICENSE.TXT for full copyright and licensing information.
12 */
13
14 #include "curses.h"
15 #include "rogue.h"
16
17 /*
18 * routines dealing specifically with rings
19 */
20
21
22 /*
23 * how much food does this ring use up?
24 */
25 ring_eat(hand)
26 register int hand;
27 {
28 if (cur_ring[hand] == NULL)
29 return 0;
30 switch (cur_ring[hand]->o_which) {
31 case R_VAMPREGEN:
32 return 3;
33 case R_REGEN:
34 return 2;
35 case R_HEALTH:
36 case R_SUSABILITY:
37 return 1;
38 case R_SEARCH:
39 case R_SEEINVIS:
40 return (rnd(100) < 33);
41 case R_DIGEST:
42 if (cur_ring[hand]->o_ac >= 0)
43 return (-(cur_ring[hand]->o_ac)-1);
44 else
45 return (-(cur_ring[hand]->o_ac));
46 }
47 return 0;
48 }
49
50 ring_on(item)
51 register struct linked_list *item;
52 {
53 register struct object *obj;
54 register int save_max;
55
56 obj = OBJPTR(item);
57
58 /*
59 * Calculate the effect it has on the poor guy.
60 */
61 switch (obj->o_which)
62 {
63 case R_ADDSTR:
64 save_max = max_stats.s_str;
65 chg_str(obj->o_ac);
66 max_stats.s_str = save_max;
67 when R_ADDHIT:
68 pstats.s_dext += obj->o_ac;
69 when R_ADDINTEL:
70 pstats.s_intel += obj->o_ac;
71 when R_ADDWISDOM:
72 pstats.s_wisdom += obj->o_ac;
73 when R_SEEINVIS:
74 turn_on(player, CANSEE);
75 msg("Your eyes begin to tingle");
76 light(&hero);
77 mvwaddch(cw, hero.y, hero.x, PLAYER);
78 when R_AGGR:
79 aggravate(TRUE, TRUE);
80 when R_WARMTH:
81 turn_on(player, NOCOLD);
82 when R_FIRE:
83 turn_on(player, NOFIRE);
84 when R_LIGHT: {
85 if(roomin(&hero) != NULL) {
86 light(&hero);
87 mvwaddch(cw, hero.y, hero.x, PLAYER);
88 }
89 }
90 when R_SEARCH:
91 daemon(ring_search, 0, AFTER);
92 when R_TELEPORT:
93 daemon(ring_teleport, 0, AFTER);
94 }
95 status(FALSE);
96 if (r_know[obj->o_which] && r_guess[obj->o_which])
97 {
98 free(r_guess[obj->o_which]);
99 r_guess[obj->o_which] = NULL;
100 }
101 else if (!r_know[obj->o_which] &&
102 askme &&
103 (obj->o_flags & ISKNOW) == 0 &&
104 r_guess[obj->o_which] == NULL) {
105 nameitem(item, FALSE);
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_CARRY:
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 }