comparison xrogue/player.c @ 142:6b5fbd7c3ece

Merge arogue7 and xrogue trees.
author John "Elwin" Edwards
date Tue, 12 May 2015 21:39:39 -0400
parents ce0cf824c192
children f54901b9c39b
comparison
equal deleted inserted replaced
132:66b0263af424 142:6b5fbd7c3ece
1 /*
2 player.c - functions for dealing with special player abilities
3
4 XRogue: Expeditions into the Dungeons of Doom
5 Copyright (C) 1991 Robert Pietkivitch
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
10 All rights reserved.
11
12 See the file LICENSE.TXT for full copyright and licensing information.
13 */
14
15 #include <ctype.h>
16 #include <string.h>
17 #include <curses.h>
18 #include "rogue.h"
19
20 /*
21 * affect:
22 * cleric affecting undead
23 */
24
25 affect()
26 {
27 register struct linked_list *item;
28 register struct thing *tp;
29 register char *mname;
30 bool see;
31 coord new_pos;
32 int lvl;
33
34 if (!(player.t_ctype == C_CLERIC ||
35 (player.t_ctype == C_PALADIN && pstats.s_lvl > 4) ||
36 cur_relic[HEIL_ANKH] != 0)) {
37 msg("You cannot affect undead.");
38 return;
39 }
40
41 new_pos.y = hero.y + player.t_newpos.y;
42 new_pos.x = hero.x + player.t_newpos.x;
43
44 if (cansee(new_pos.y, new_pos.x)) see = TRUE;
45 else see = FALSE;
46
47 /* Anything there? */
48 if (new_pos.y < 0 || new_pos.y > lines-3 ||
49 new_pos.x < 0 || new_pos.x > cols-1 ||
50 mvwinch(mw, new_pos.y, new_pos.x) == ' ') {
51 msg("Nothing to affect.");
52 return;
53 }
54
55 if ((item = find_mons(new_pos.y, new_pos.x)) == 0) {
56 debug("Affect what @ %d,%d?", new_pos.y, new_pos.x);
57 return;
58 }
59 tp = THINGPTR(item);
60 mname = monster_name(tp);
61
62 if (on(player, ISINVIS) && off(*tp, CANSEE)) {
63 msg("%s%s cannot see you", see ? "The " : "It",
64 see ? mname : "");
65 return;
66 }
67
68 if (off(*tp, TURNABLE) || on(*tp, WASTURNED))
69 goto annoy;
70 turn_off(*tp, TURNABLE);
71
72 lvl = pstats.s_lvl;
73 if (player.t_ctype == C_PALADIN && cur_relic[HEIL_ANKH] == 0) {
74 lvl -= 4;
75 }
76 /* Can cleric kill it? */
77 if (lvl >= 3 * tp->t_stats.s_lvl) {
78 unsigned long test; /* For overflow check */
79
80 msg("You have destroyed %s%s.", see ? "the " : "it", see ? mname : "");
81 test = pstats.s_exp + tp->t_stats.s_exp;
82
83 /* Be sure there is no overflow before increasing experience */
84 if (test > pstats.s_exp) pstats.s_exp = test;
85 killed(item, FALSE, TRUE, TRUE);
86 check_level();
87 return;
88 }
89
90 /* Can cleric turn it? */
91 if (rnd(100) + 1 >
92 (100 * ((2 * tp->t_stats.s_lvl) - lvl)) / lvl) {
93 unsigned long test; /* Overflow test */
94
95 /* Make the monster flee */
96 turn_on(*tp, WASTURNED); /* No more fleeing after this */
97 turn_on(*tp, ISFLEE);
98 runto(tp, &hero);
99
100 /* Disrupt it */
101 dsrpt_monster(tp, TRUE, TRUE);
102
103 /* Let player know */
104 msg("You have turned %s%s.", see ? "the " : "it", see ? mname : "");
105
106 /* get points for turning monster -- but check overflow first */
107 test = pstats.s_exp + tp->t_stats.s_exp/2;
108 if (test > pstats.s_exp) pstats.s_exp = test;
109 check_level();
110
111 /* If monster was suffocating, stop it */
112 if (on(*tp, DIDSUFFOCATE)) {
113 turn_off(*tp, DIDSUFFOCATE);
114 extinguish(suffocate);
115 }
116
117 /* If monster held us, stop it */
118 if (on(*tp, DIDHOLD) && (--hold_count == 0))
119 turn_off(player, ISHELD);
120 turn_off(*tp, DIDHOLD);
121
122 /* It is okay to turn tail */
123 tp->t_oldpos = tp->t_pos;
124
125 return;
126 }
127
128 /* Otherwise -- no go */
129 annoy:
130 if (see && tp->t_stats.s_intel > 16)
131 msg("%s laughs at you...", prname(mname, TRUE));
132 else
133 msg("You do not affect %s%s.", see ? "the " : "it", see ? mname : "");
134
135 /* Annoy monster */
136 if (off(*tp, ISFLEE)) runto(tp, &hero);
137 }
138
139 /*
140 * the cleric asks his deity for a spell
141 */
142
143 pray()
144 {
145 register int num_prayers, prayer_ability, which_prayer;
146
147 which_prayer = num_prayers = prayer_ability = 0;
148
149 if (player.t_ctype != C_CLERIC && player.t_ctype != C_PALADIN &&
150 cur_relic[HEIL_ANKH] == 0) {
151 msg("You are not permitted to pray.");
152 return;
153 }
154 if (cur_misc[WEAR_CLOAK] != NULL &&
155 cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
156 msg("You can't seem to pray!");
157 return;
158 }
159
160 prayer_ability = pstats.s_lvl * pstats.s_wisdom - 5;
161 if (player.t_ctype != C_CLERIC)
162 prayer_ability /= 2;
163
164 if (cur_relic[HEIL_ANKH]) prayer_ability += 75;
165
166 if (player.t_action != C_PRAY) {
167 num_prayers = 0;
168
169 /* Get the number of avilable prayers */
170 if (pstats.s_wisdom > 16)
171 num_prayers += pstats.s_wisdom - 16;
172
173 num_prayers += pstats.s_lvl;
174 if (cur_relic[HEIL_ANKH])
175 num_prayers += pstats.s_wisdom - 18;
176
177 if (player.t_ctype != C_CLERIC)
178 num_prayers /= 2;
179
180 if (num_prayers > MAXPRAYERS)
181 num_prayers = MAXPRAYERS;
182 if (num_prayers < 1) {
183 msg("You are not permitted to pray yet.");
184 return;
185 }
186
187 /* Prompt for prayer */
188 if (pick_spell( cleric_spells,
189 prayer_ability,
190 num_prayers,
191 pray_time,
192 "offer",
193 "prayer"))
194 player.t_action = C_PRAY;
195
196 return;
197 }
198
199 /* We've waited our required praying time. */
200 which_prayer = player.t_selection;
201 player.t_selection = 0;
202 player.t_action = A_NIL;
203
204 if (cleric_spells[which_prayer].s_cost + pray_time > prayer_ability) {
205 msg("Your prayer fails.");
206 return;
207 }
208
209 msg("Your prayer has been granted. ");
210
211 if (cleric_spells[which_prayer].s_type == TYP_POTION)
212 quaff( cleric_spells[which_prayer].s_which,
213 NULL,
214 cleric_spells[which_prayer].s_flag,
215 FALSE);
216 else if (cleric_spells[which_prayer].s_type == TYP_SCROLL)
217 read_scroll( cleric_spells[which_prayer].s_which,
218 cleric_spells[which_prayer].s_flag,
219 FALSE);
220 else if (cleric_spells[which_prayer].s_type == TYP_STICK) {
221 if (!player_zap(cleric_spells[which_prayer].s_which,
222 cleric_spells[which_prayer].s_flag)) {
223 after = FALSE;
224 return;
225 }
226 }
227 pray_time += cleric_spells[which_prayer].s_cost;
228 }
229
230 /*
231 * the magician is going to try and cast a spell
232 */
233
234 cast()
235 {
236 register int spell_ability, which_spell, num_spells;
237
238 if (player.t_ctype != C_MAGICIAN && player.t_ctype != C_RANGER) {
239 msg("You are not permitted to cast spells.");
240 return;
241 }
242 if (cur_misc[WEAR_CLOAK] != NULL &&
243 cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
244 msg("You can't seem to cast spells!");
245 return;
246 }
247 spell_ability = pstats.s_lvl * pstats.s_intel - 5;
248 if (player.t_ctype != C_MAGICIAN)
249 spell_ability /= 2;
250
251 if (player.t_action != C_CAST) {
252 /*
253 * Get the number of avilable spells
254 */
255 num_spells = 0;
256 if (pstats.s_intel > 16)
257 num_spells += pstats.s_intel - 16;
258
259 num_spells += pstats.s_lvl;
260 if (player.t_ctype != C_MAGICIAN)
261 num_spells /= 2;
262 if (num_spells > MAXSPELLS)
263 num_spells = MAXSPELLS;
264 if (num_spells < 1) {
265 msg("You are not allowed to cast spells yet.");
266 return;
267 }
268
269 /* prompt for spell */
270 if (pick_spell( magic_spells,
271 spell_ability,
272 num_spells,
273 spell_power,
274 "cast",
275 "spell"))
276 player.t_action = C_CAST;
277 return;
278 }
279
280 /* We've waited our required casting time. */
281 which_spell = player.t_selection;
282 player.t_selection = 0;
283 player.t_action = A_NIL;
284
285 if ((spell_power + magic_spells[which_spell].s_cost) > spell_ability) {
286 msg("Your attempt fails.");
287 return;
288 }
289
290 msg("Your spell is successful. ");
291
292 if (magic_spells[which_spell].s_type == TYP_POTION)
293 quaff( magic_spells[which_spell].s_which,
294 NULL,
295 magic_spells[which_spell].s_flag,
296 FALSE);
297 else if (magic_spells[which_spell].s_type == TYP_SCROLL)
298 read_scroll( magic_spells[which_spell].s_which,
299 magic_spells[which_spell].s_flag,
300 FALSE);
301 else if (magic_spells[which_spell].s_type == TYP_STICK) {
302 if (!player_zap(magic_spells[which_spell].s_which,
303 magic_spells[which_spell].s_flag)) {
304 after = FALSE;
305 return;
306 }
307 }
308 spell_power += magic_spells[which_spell].s_cost;
309 }
310
311 /*
312 * the druid asks his deity for a spell
313 */
314
315 chant()
316 {
317 register int num_chants, chant_ability, which_chant;
318
319 which_chant = num_chants = chant_ability = 0;
320
321 if (player.t_ctype != C_DRUID && player.t_ctype != C_MONK) {
322 msg("You are not permitted to chant.");
323 return;
324 }
325 if (cur_misc[WEAR_CLOAK] != NULL &&
326 cur_misc[WEAR_CLOAK]->o_which == MM_R_POWERLESS) {
327 msg("You can't seem to chant!");
328 return;
329 }
330 chant_ability = pstats.s_lvl * pstats.s_wisdom - 5;
331 if (player.t_ctype != C_DRUID)
332 chant_ability /= 2;
333
334 if (player.t_action != C_CHANT) {
335 num_chants = 0;
336
337 /* Get the number of avilable chants */
338 if (pstats.s_wisdom > 16)
339 num_chants += pstats.s_wisdom - 16;
340
341 num_chants += pstats.s_lvl;
342
343 if (player.t_ctype != C_DRUID)
344 num_chants /= 2;
345
346 if (num_chants > MAXCHANTS)
347 num_chants = MAXCHANTS;
348
349 if (num_chants < 1) {
350 msg("You are not permitted to chant yet.");
351 return;
352 }
353
354 /* Prompt for chant */
355 if (pick_spell( druid_spells,
356 chant_ability,
357 num_chants,
358 chant_time,
359 "sing",
360 "chant"))
361 player.t_action = C_CHANT;
362
363 return;
364 }
365
366 /* We've waited our required chanting time. */
367 which_chant = player.t_selection;