Angband 3.0.9b.
[angband.git] / src / x-spell.c
blob09e40328f365f4bde268cae418c52b2e58239571
1 /* File: x-spell.c */
3 /*
4 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
9 */
12 #include "angband.h"
13 #include "script.h"
17 * The defines below must match the spell numbers in spell.txt
18 * if they don't, "interesting" things will probably happen.
20 * It would be nice if we could get rid of this dependency.
22 #define SPELL_MAGIC_MISSILE 0
23 #define SPELL_DETECT_MONSTERS 1
24 #define SPELL_PHASE_DOOR 2
25 #define SPELL_LIGHT_AREA 3
26 #define SPELL_FIND_TRAPS_DOORS 4
27 #define SPELL_CURE_LIGHT_WOUNDS 5
28 #define SPELL_TREASURE_DETECTION 6
29 #define SPELL_OBJECT_DETECTION 7
30 #define SPELL_IDENTIFY 8
31 #define SPELL_DETECT_INVISIBLE 9
32 #define SPELL_DETECT_ENCHANTMENT 10
33 #define SPELL_STINKING_CLOUD 11
34 #define SPELL_LIGHTNING_BOLT 12
35 #define SPELL_CONFUSE_MONSTER 13
36 #define SPELL_SLEEP_MONSTER 14
37 #define SPELL_WONDER 15
38 #define SPELL_FROST_BOLT 16
39 #define SPELL_ACID_BOLT 17
40 #define SPELL_FIRE_BOLT 18
41 #define SPELL_TRAP_DOOR_DESTRUCTION 19
42 #define SPELL_SPEAR_OF_LIGHT 20
43 #define SPELL_TURN_STONE_TO_MUD 21
44 #define SPELL_DOOR_CREATION 22
45 #define SPELL_EARTHQUAKE 23
46 #define SPELL_STAIR_CREATION 24
47 #define SPELL_CURE_POISON 25
48 #define SPELL_SATISFY_HUNGER 26
49 #define SPELL_HEROISM 27
50 #define SPELL_BERSERKER 28
51 #define SPELL_HASTE_SELF 29
52 #define SPELL_TELEPORT_SELF 30
53 #define SPELL_SLOW_MONSTER 31
54 #define SPELL_TELEPORT_OTHER 32
55 #define SPELL_TELEPORT_LEVEL 33
56 #define SPELL_WORD_OF_RECALL 34
57 #define SPELL_POLYMORPH_OTHER 35
58 #define SPELL_SHOCK_WAVE 36
59 #define SPELL_EXPLOSION 37
60 #define SPELL_CLOUD_KILL 38
61 #define SPELL_MASS_SLEEP 39
62 #define SPELL_BEDLAM 40
63 #define SPELL_REND_SOUL 41
64 #define SPELL_WORD_OF_DESTRUCTION 42
65 #define SPELL_CHAOS_STRIKE 43
66 #define SPELL_RESIST_COLD 44
67 #define SPELL_RESIST_FIRE 45
68 #define SPELL_RESIST_POISON 46
69 #define SPELL_RESISTANCE 47
70 #define SPELL_SHIELD 48
71 #define SPELL_RUNE_OF_PROTECTION 49
72 #define SPELL_RECHARGE_ITEM_I 50
73 #define SPELL_ENCHANT_ARMOR 51
74 #define SPELL_ENCHANT_WEAPON 52
75 #define SPELL_RECHARGE_ITEM_II 53
76 #define SPELL_ELEMENTAL_BRAND 54
77 #define SPELL_FROST_BALL 55
78 #define SPELL_ACID_BALL 56
79 #define SPELL_FIRE_BALL 57
80 #define SPELL_ICE_STORM 58
81 #define SPELL_BANISHMENT 59
82 #define SPELL_METEOR_SWARM 60
83 #define SPELL_MASS_BANISHMENT 61
84 #define SPELL_RIFT 62
85 #define SPELL_MANA_STORM 63
87 /* Beginners Handbook */
88 #define PRAYER_DETECT_EVIL 0
89 #define PRAYER_CURE_LIGHT_WOUNDS 1
90 #define PRAYER_BLESS 2
91 #define PRAYER_REMOVE_FEAR 3
92 #define PRAYER_CALL_LIGHT 4
93 #define PRAYER_FIND_TRAPS 5
94 #define PRAYER_DETECT_DOORS_STAIRS 6
95 #define PRAYER_SLOW_POISON 7
97 /* Words of Wisdom */
98 #define PRAYER_SCARE_MONSTER 8
99 #define PRAYER_PORTAL 9
100 #define PRAYER_CURE_SERIOUS_WOUNDS 10
101 #define PRAYER_CHANT 11
102 #define PRAYER_SANCTUARY 12
103 #define PRAYER_SATISFY_HUNGER 13
104 #define PRAYER_REMOVE_CURSE 14
105 #define PRAYER_RESIST_HEAT_COLD 15
107 /* Chants and Blessings */
108 #define PRAYER_NEUTRALIZE_POISON 16
109 #define PRAYER_ORB_OF_DRAINING 17
110 #define PRAYER_CURE_CRITICAL_WOUNDS 18
111 #define PRAYER_SENSE_INVISIBLE 19
112 #define PRAYER_PROTECTION_FROM_EVIL 20
113 #define PRAYER_EARTHQUAKE 21
114 #define PRAYER_SENSE_SURROUNDINGS 22
115 #define PRAYER_CURE_MORTAL_WOUNDS 23
116 #define PRAYER_TURN_UNDEAD 24
118 /* Exorcism and Dispelling */
119 #define PRAYER_PRAYER 25
120 #define PRAYER_DISPEL_UNDEAD 26
121 #define PRAYER_HEAL 27
122 #define PRAYER_DISPEL_EVIL 28
123 #define PRAYER_GLYPH_OF_WARDING 29
124 #define PRAYER_HOLY_WORD 30
126 /* Godly Insights */
127 #define PRAYER_DETECT_MONSTERS 31
128 #define PRAYER_DETECTION 32
129 #define PRAYER_PERCEPTION 33
130 #define PRAYER_PROBING 34
131 #define PRAYER_CLAIRVOYANCE 35
133 /* Purifications and Healing */
134 #define PRAYER_CURE_SERIOUS_WOUNDS2 36
135 #define PRAYER_CURE_MORTAL_WOUNDS2 37
136 #define PRAYER_HEALING 38
137 #define PRAYER_RESTORATION 39
138 #define PRAYER_REMEMBRANCE 40
140 /* Wrath of God */
141 #define PRAYER_DISPEL_UNDEAD2 41
142 #define PRAYER_DISPEL_EVIL2 42
143 #define PRAYER_BANISH_EVIL 43
144 #define PRAYER_WORD_OF_DESTRUCTION 44
145 #define PRAYER_ANNIHILATION 45
147 /* Holy Infusions */
148 #define PRAYER_UNBARRING_WAYS 46
149 #define PRAYER_RECHARGING 47
150 #define PRAYER_DISPEL_CURSE 48
151 #define PRAYER_ENCHANT_WEAPON 49
152 #define PRAYER_ENCHANT_ARMOUR 50
153 #define PRAYER_ELEMENTAL_BRAND 51
155 /* Ethereal openings */
156 #define PRAYER_BLINK 52
157 #define PRAYER_TELEPORT_SELF 53
158 #define PRAYER_TELEPORT_OTHER 54
159 #define PRAYER_TELEPORT_LEVEL 55
160 #define PRAYER_WORD_OF_RECALL 56
161 #define PRAYER_ALTER_REALITY 57
165 int get_spell_index(const object_type *o_ptr, int index)
167 int realm, spell;
168 int sval = o_ptr->sval;
170 /* Check bounds */
171 if ((index < 0) || (index >= SPELLS_PER_BOOK)) return -1;
172 if ((sval < 0) || (sval >= BOOKS_PER_REALM)) return -1;
174 /* Mage or priest spells? */
175 if (cp_ptr->spell_book == TV_MAGIC_BOOK)
176 realm = 0;
177 else
178 realm = 1;
180 /* Get the spell */
181 spell = spell_list[realm][sval][index];
182 if (spell == -1) return -1;
184 return s_info[spell].spell_index;
188 cptr get_spell_name(int tval, int spell)
190 if (tval == TV_MAGIC_BOOK)
191 return s_name + s_info[spell].name;
192 else
193 return s_name + s_info[spell + PY_MAX_SPELLS].name;
197 void get_spell_info(int tval, int spell, char *p, size_t len)
199 /* Blank 'p' first */
200 p[0] = '\0';
202 /* Mage spells */
203 if (tval == TV_MAGIC_BOOK)
205 int plev = p_ptr->lev;
207 /* Analyze the spell */
208 switch (spell)
210 case SPELL_MAGIC_MISSILE:
211 strnfmt(p, len, " dam %dd4", 3 + ((plev - 1) / 5));
212 break;
213 case SPELL_PHASE_DOOR:
214 strnfmt(p, len, " range 10");
215 break;
216 case SPELL_LIGHT_AREA:
217 strnfmt(p, len, " dam 2d%d", (plev / 2));
218 break;
219 case SPELL_CURE_LIGHT_WOUNDS:
220 strnfmt(p, len, " heal 2d8");
221 break;
222 case SPELL_STINKING_CLOUD:
223 strnfmt(p, len, " dam %d", 10 + (plev / 2));
224 break;
225 case SPELL_LIGHTNING_BOLT:
226 strnfmt(p, len, " dam %dd6", (3 + ((plev - 5) / 6)));
227 break;
228 case SPELL_FROST_BOLT:
229 strnfmt(p, len, " dam %dd8", (5 + ((plev - 5) / 4)));
230 break;
231 case SPELL_ACID_BOLT:
232 strnfmt(p, len, " dam %dd8", (8 + ((plev - 5) / 4)));
233 break;
234 case SPELL_FIRE_BOLT:
235 strnfmt(p, len, " dam %dd8", (6 + ((plev - 5) / 4)));
236 break;
237 case SPELL_SPEAR_OF_LIGHT:
238 strnfmt(p, len, " dam 6d8");
239 break;
240 case SPELL_HEROISM:
241 strnfmt(p, len, " dur 25+d25");
242 break;
243 case SPELL_BERSERKER:
244 strnfmt(p, len, " dur 25+d25");
245 break;
246 case SPELL_HASTE_SELF:
247 strnfmt(p, len, " dur %d+d20", plev);
248 break;
249 case SPELL_TELEPORT_SELF:
250 strnfmt(p, len, " range %d", plev * 5);
251 break;
252 case SPELL_SHOCK_WAVE:
253 strnfmt(p, len, " dam %d", 10 + plev);
254 break;
255 case SPELL_EXPLOSION:
256 strnfmt(p, len, " dam %d", 20 + plev * 2);
257 break;
258 case SPELL_CLOUD_KILL:
259 strnfmt(p, len, " dam %d", 40 + (plev / 2));
260 break;
261 case SPELL_REND_SOUL:
262 strnfmt(p, len, " dam 11d%d", plev);
263 break;
264 case SPELL_CHAOS_STRIKE:
265 strnfmt(p, len, " dam 13d%d", plev);
266 break;
267 case SPELL_RESIST_COLD:
268 strnfmt(p, len, " dur 20+d20");
269 break;
270 case SPELL_RESIST_FIRE:
271 strnfmt(p, len, " dur 20+d20");
272 break;
273 case SPELL_RESIST_POISON:
274 strnfmt(p, len, " dur 20+d20");
275 break;
276 case SPELL_RESISTANCE:
277 strnfmt(p, len, " dur 20+d20");
278 break;
279 case SPELL_SHIELD:
280 strnfmt(p, len, " dur 30+d20");
281 break;
282 case SPELL_FROST_BALL:
283 strnfmt(p, len, " dam %d", 30 + plev);
284 break;
285 case SPELL_ACID_BALL:
286 strnfmt(p, len, " dam %d", 40 + plev);
287 break;
288 case SPELL_FIRE_BALL:
289 strnfmt(p, len, " dam %d", 55 + plev);
290 break;
291 case SPELL_ICE_STORM:
292 strnfmt(p, len, " dam %d", 50 + (plev * 2));
293 break;
294 case SPELL_METEOR_SWARM:
295 strnfmt(p, len, " dam %dx%d", 30 + plev / 2, 2 + plev / 20);
296 break;
297 case SPELL_RIFT:
298 strnfmt(p, len, " dam 40+%dd7", plev);
299 break;
300 case SPELL_MANA_STORM:
301 strnfmt(p, len, " dam %d", 300 + plev * 2);
302 break;
306 /* Priest spells */
307 if (tval == TV_PRAYER_BOOK)
309 int plev = p_ptr->lev;
311 /* Analyze the spell */
312 switch (spell)
314 case PRAYER_CURE_LIGHT_WOUNDS:
315 my_strcpy(p, " heal 2d10", len);
316 break;
317 case PRAYER_BLESS:
318 my_strcpy(p, " dur 12+d12", len);
319 break;
320 case PRAYER_CALL_LIGHT:
321 strnfmt(p, len, " dam 2d%d", (plev / 2));
322 break;
323 case PRAYER_PORTAL:
324 strnfmt(p, len, " range %d", 3 * plev);
325 break;
326 case PRAYER_CURE_SERIOUS_WOUNDS:
327 my_strcpy(p, " heal 4d10", len);
328 break;
329 case PRAYER_CHANT:
330 my_strcpy(p, " dur 24+d24", len);
331 break;
332 case PRAYER_RESIST_HEAT_COLD:
333 my_strcpy(p, " dur 10+d10", len);
334 break;
335 case PRAYER_ORB_OF_DRAINING:
336 strnfmt(p, len, " %d+3d6", plev +
337 (plev / ((cp_ptr->flags & CF_BLESS_WEAPON) ? 2 : 4)));
338 break;
339 case PRAYER_CURE_CRITICAL_WOUNDS:
340 my_strcpy(p, " heal 6d10", len);
341 break;
342 case PRAYER_SENSE_INVISIBLE:
343 my_strcpy(p, " dur 24+d24", len);
344 break;
345 case PRAYER_PROTECTION_FROM_EVIL:
346 strnfmt(p, len, " dur %d+d25", 3 * plev);
347 break;
348 case PRAYER_CURE_MORTAL_WOUNDS:
349 my_strcpy(p, " heal 8d10", len);
350 break;
351 case PRAYER_PRAYER:
352 my_strcpy(p, " dur 48+d48", len);
353 break;
354 case PRAYER_DISPEL_UNDEAD:
355 strnfmt(p, len, " dam d%d", 3 * plev);
356 break;
357 case PRAYER_HEAL:
358 my_strcpy(p, " heal 300", len);
359 break;
360 case PRAYER_DISPEL_EVIL:
361 strnfmt(p, len, " dam d%d", 3 * plev);
362 break;
363 case PRAYER_HOLY_WORD:
364 my_strcpy(p, " heal 1000", len);
365 break;
366 case PRAYER_CURE_SERIOUS_WOUNDS2:
367 my_strcpy(p, " heal 4d10", len);
368 break;
369 case PRAYER_CURE_MORTAL_WOUNDS2:
370 my_strcpy(p, " heal 8d10", len);
371 break;
372 case PRAYER_HEALING:
373 my_strcpy(p, " heal 2000", len);
374 break;
375 case PRAYER_DISPEL_UNDEAD2:
376 strnfmt(p, len, " dam d%d", 4 * plev);
377 break;
378 case PRAYER_DISPEL_EVIL2:
379 strnfmt(p, len, " dam d%d", 4 * plev);
380 break;
381 case PRAYER_ANNIHILATION:
382 my_strcpy(p, " dam 200", len);
383 break;
384 case PRAYER_BLINK:
385 my_strcpy(p, " range 10", len);
386 break;
387 case PRAYER_TELEPORT_SELF:
388 strnfmt(p, len, " range %d", 8 * plev);
389 break;
393 return;
397 static int beam_chance(void)
399 int plev = p_ptr->lev;
400 return ((cp_ptr->flags & CF_BEAM) ? plev : (plev / 2));
404 static void spell_wonder(int dir)
406 /* This spell should become more useful (more
407 controlled) as the player gains experience levels.
408 Thus, add 1/5 of the player's level to the die roll.
409 This eliminates the worst effects later on, while
410 keeping the results quite random. It also allows
411 some potent effects only at high level. */
413 int py = p_ptr->py;
414 int px = p_ptr->px;
415 int plev = p_ptr->lev;
416 int die = randint(100) + plev / 5;
417 int beam = beam_chance();
419 if (die > 100)
420 msg_print("You feel a surge of power!");
421 if (die < 8) clone_monster(dir);
422 else if (die < 14) speed_monster(dir);
423 else if (die < 26) heal_monster(dir);
424 else if (die < 31) poly_monster(dir);
425 else if (die < 36)
426 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir,
427 damroll(3 + ((plev - 1) / 5), 4));
428 else if (die < 41) confuse_monster(dir, plev);
429 else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
430 else if (die < 51) lite_line(dir);
431 else if (die < 56)
432 fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6));
433 else if (die < 61)
434 fire_bolt_or_beam(beam-10, GF_COLD, dir,
435 damroll(5+((plev-5)/4), 8));
436 else if (die < 66)
437 fire_bolt_or_beam(beam, GF_ACID, dir,
438 damroll(6+((plev-5)/4), 8));
439 else if (die < 71)
440 fire_bolt_or_beam(beam, GF_FIRE, dir,
441 damroll(8+((plev-5)/4), 8));
442 else if (die < 76) drain_life(dir, 75);
443 else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
444 else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2);
445 else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3);
446 else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3);
447 else if (die < 101) drain_life(dir, 100 + plev);
448 else if (die < 104) earthquake(py, px, 12);
449 else if (die < 106) destroy_area(py, px, 15, TRUE);
450 else if (die < 108) banishment();
451 else if (die < 110) dispel_monsters(120);
452 else /* RARE */
454 dispel_monsters(150);
455 slow_monsters();
456 sleep_monsters();
457 hp_player(300);
463 static bool cast_mage_spell(int spell)
465 int py = p_ptr->py;
466 int px = p_ptr->px;
468 int dir;
470 int plev = p_ptr->lev;
472 /* Hack -- chance of "beam" instead of "bolt" */
473 int beam = beam_chance();
475 /* Spells. */
476 switch (spell)
478 case SPELL_MAGIC_MISSILE:
480 if (!get_aim_dir(&dir)) return (FALSE);
481 fire_bolt_or_beam(beam-10, GF_MISSILE, dir,
482 damroll(3 + ((plev - 1) / 5), 4));
483 break;
486 case SPELL_DETECT_MONSTERS:
488 (void)detect_monsters_normal();
489 break;
492 case SPELL_PHASE_DOOR:
494 teleport_player(10);
495 break;
498 case SPELL_LIGHT_AREA:
500 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
501 break;
504 case SPELL_TREASURE_DETECTION:
506 (void)detect_treasure();
507 (void)detect_objects_gold();
508 break;
511 case SPELL_CURE_LIGHT_WOUNDS:
514 (void)hp_player(damroll(2, 8));
515 (void)dec_timed(TMD_CUT, 15);
516 break;
519 case SPELL_OBJECT_DETECTION:
521 (void)detect_objects_normal();
522 break;
525 case SPELL_FIND_TRAPS_DOORS:
527 (void)detect_traps();
528 (void)detect_doors();
529 (void)detect_stairs();
530 break;
533 case SPELL_STINKING_CLOUD:
535 if (!get_aim_dir(&dir)) return (FALSE);
536 fire_ball(GF_POIS, dir, 10 + (plev / 2), 2);
537 break;
540 case SPELL_CONFUSE_MONSTER:
542 if (!get_aim_dir(&dir)) return (FALSE);
543 (void)confuse_monster(dir, plev);
544 break;
547 case SPELL_LIGHTNING_BOLT:
549 if (!get_aim_dir(&dir)) return (FALSE);
550 fire_beam(GF_ELEC, dir,
551 damroll(3+((plev-5)/6), 6));
552 break;
555 case SPELL_TRAP_DOOR_DESTRUCTION:
557 (void)destroy_doors_touch();
558 break;
561 case SPELL_SLEEP_MONSTER:
563 if (!get_aim_dir(&dir)) return (FALSE);
564 (void)sleep_monster(dir);
565 break;
568 case SPELL_CURE_POISON:
570 (void)clear_timed(TMD_POISONED);
571 break;
574 case SPELL_TELEPORT_SELF:
576 teleport_player(plev * 5);
577 break;
580 case SPELL_SPEAR_OF_LIGHT: /* spear of light */
582 if (!get_aim_dir(&dir)) return (FALSE);
583 msg_print("A line of blue shimmering light appears.");
584 lite_line(dir);
585 break;
588 case SPELL_FROST_BOLT:
590 if (!get_aim_dir(&dir)) return (FALSE);
591 fire_bolt_or_beam(beam-10, GF_COLD, dir,
592 damroll(5+((plev-5)/4), 8));
593 break;
596 case SPELL_TURN_STONE_TO_MUD:
598 if (!get_aim_dir(&dir)) return (FALSE);
599 (void)wall_to_mud(dir);
600 break;
603 case SPELL_SATISFY_HUNGER:
605 (void)set_food(PY_FOOD_MAX - 1);
606 break;
609 case SPELL_RECHARGE_ITEM_I:
611 return recharge(2 + plev / 5);
614 case SPELL_WONDER: /* wonder */
616 if (!get_aim_dir(&dir)) return (FALSE);
617 (void)spell_wonder(dir);
618 break;
621 case SPELL_POLYMORPH_OTHER:
623 if (!get_aim_dir(&dir)) return (FALSE);
624 (void)poly_monster(dir);
625 break;
628 case SPELL_IDENTIFY:
630 return ident_spell();
633 case SPELL_MASS_SLEEP:
635 (void)sleep_monsters();
636 break;
639 case SPELL_FIRE_BOLT:
641 if (!get_aim_dir(&dir)) return (FALSE);
642 fire_bolt_or_beam(beam, GF_FIRE, dir,
643 damroll(6+((plev-5)/4), 8));
644 break;
647 case SPELL_SLOW_MONSTER:
649 if (!get_aim_dir(&dir)) return (FALSE);
650 (void)slow_monster(dir);
651 break;
654 case SPELL_FROST_BALL:
656 if (!get_aim_dir(&dir)) return (FALSE);
657 fire_ball(GF_COLD, dir, 30 + (plev), 2);
658 break;
661 case SPELL_RECHARGE_ITEM_II: /* greater recharging */
663 return recharge(50 + plev);
666 case SPELL_TELEPORT_OTHER:
668 if (!get_aim_dir(&dir)) return (FALSE);
669 (void)teleport_monster(dir);
670 break;
673 case SPELL_BEDLAM:
675 if (!get_aim_dir(&dir)) return (FALSE);
676 fire_ball(GF_OLD_CONF, dir, plev, 4);
677 break;
680 case SPELL_FIRE_BALL:
682 if (!get_aim_dir(&dir)) return (FALSE);
683 fire_ball(GF_FIRE, dir, 55 + (plev), 2);
684 break;
687 case SPELL_WORD_OF_DESTRUCTION:
689 destroy_area(py, px, 15, TRUE);
690 break;
693 case SPELL_BANISHMENT:
695 return banishment();
696 break;
699 case SPELL_DOOR_CREATION:
701 (void)door_creation();
702 break;
705 case SPELL_STAIR_CREATION:
707 (void)stair_creation();
708 break;
711 case SPELL_TELEPORT_LEVEL:
713 (void)teleport_player_level();
714 break;
717 case SPELL_EARTHQUAKE:
719 earthquake(py, px, 10);
720 break;
723 case SPELL_WORD_OF_RECALL:
725 set_recall();
726 break;
729 case SPELL_ACID_BOLT:
731 if (!get_aim_dir(&dir)) return (FALSE);
732 fire_bolt_or_beam(beam, GF_ACID, dir, damroll(8+((plev-5)/4), 8));
733 break;
736 case SPELL_CLOUD_KILL:
738 if (!get_aim_dir(&dir)) return (FALSE);
739 fire_ball(GF_POIS, dir, 40 + (plev / 2), 3);
740 break;
743 case SPELL_ACID_BALL:
745 if (!get_aim_dir(&dir)) return (FALSE);
746 fire_ball(GF_ACID, dir, 40 + (plev), 2);
747 break;
750 case SPELL_ICE_STORM:
752 if (!get_aim_dir(&dir)) return (FALSE);
753 fire_ball(GF_ICE, dir, 50 + (plev * 2), 3);
754 break;
757 case SPELL_METEOR_SWARM:
759 if (!get_aim_dir(&dir)) return (FALSE);
760 fire_swarm(2 + plev / 20, GF_METEOR, dir, 30 + plev / 2, 1);
761 break;
764 case SPELL_MANA_STORM:
766 if (!get_aim_dir(&dir)) return (FALSE);
767 fire_ball(GF_MANA, dir, 300 + (plev * 2), 3);
768 break;
770 case SPELL_DETECT_INVISIBLE:
772 (void)detect_monsters_invis();
773 break;
776 case SPELL_DETECT_ENCHANTMENT:
778 (void)detect_objects_magic();
779 break;
782 case SPELL_SHOCK_WAVE:
784 if (!get_aim_dir(&dir)) return (FALSE);
785 fire_ball(GF_SOUND, dir, 10 + plev, 2);
786 break;
789 case SPELL_EXPLOSION:
791 if (!get_aim_dir(&dir)) return (FALSE);
792 fire_ball(GF_SHARD, dir, 20 + (plev * 2), 2);
793 break;
796 case SPELL_MASS_BANISHMENT:
798 (void)mass_banishment();
799 break;
802 case SPELL_RESIST_FIRE:
804 (void)inc_timed(TMD_OPP_FIRE, randint(20) + 20);
805 break;
808 case SPELL_RESIST_COLD:
810 (void)inc_timed(TMD_OPP_COLD, randint(20) + 20);
811 break;
814 case SPELL_ELEMENTAL_BRAND: /* elemental brand */
816 return brand_ammo();
819 case SPELL_RESIST_POISON:
821 (void)inc_timed(TMD_OPP_POIS, randint(20) + 20);
822 break;
825 case SPELL_RESISTANCE:
827 int time = randint(20) + 20;
828 (void)inc_timed(TMD_OPP_ACID, time);
829 (void)inc_timed(TMD_OPP_ELEC, time);
830 (void)inc_timed(TMD_OPP_FIRE, time);
831 (void)inc_timed(TMD_OPP_COLD, time);
832 (void)inc_timed(TMD_OPP_POIS, time);
833 break;
836 case SPELL_HEROISM:
838 (void)hp_player(10);
839 (void)inc_timed(TMD_HERO, randint(25) + 25);
840 (void)clear_timed(TMD_AFRAID);
841 break;
844 case SPELL_SHIELD:
846 (void)inc_timed(TMD_SHIELD, randint(20) + 30);
847 break;
850 case SPELL_BERSERKER:
852 (void)hp_player(30);
853 (void)inc_timed(TMD_SHERO, randint(25) + 25);
854 (void)clear_timed(TMD_AFRAID);
855 break;
858 case SPELL_HASTE_SELF:
860 if (!p_ptr->timed[TMD_FAST])
862 (void)set_timed(TMD_FAST, randint(20) + plev);
864 else
866 (void)inc_timed(TMD_FAST, randint(5));
868 break;
871 case SPELL_RIFT:
873 if (!get_aim_dir(&dir)) return (FALSE);
874 fire_beam(GF_GRAVITY, dir, 40 + damroll(plev, 7));
875 break;
878 case SPELL_REND_SOUL: /* rend soul */
880 if (!get_aim_dir(&dir)) return (FALSE);
881 fire_bolt_or_beam(beam / 4, GF_NETHER, dir, damroll(11, plev));
882 break;
885 case SPELL_CHAOS_STRIKE: /* chaos strike */
887 if (!get_aim_dir(&dir)) return (FALSE);
888 fire_bolt_or_beam(beam, GF_CHAOS, dir, damroll(13, plev));
889 break;
892 case SPELL_RUNE_OF_PROTECTION: /* rune of protection */
894 (void)warding_glyph();
895 break;
898 case SPELL_ENCHANT_ARMOR: /* enchant armor */
900 return enchant_spell(0, 0, rand_int(3) + plev / 20);
903 case SPELL_ENCHANT_WEAPON: /* enchant weapon */
905 return enchant_spell(rand_int(4) + plev / 20,
906 rand_int(4) + plev / 20, 0);
910 /* Success */
911 return (TRUE);
915 static bool cast_priest_spell(int spell)
917 int py = p_ptr->py;
918 int px = p_ptr->px;
920 int dir;
922 int plev = p_ptr->lev;
924 switch (spell)
926 case PRAYER_DETECT_EVIL:
928 (void)detect_monsters_evil();
929 break;
932 case PRAYER_CURE_LIGHT_WOUNDS:
934 (void)hp_player(damroll(2, 10));
935 (void)dec_timed(TMD_CUT, 10);
936 break;
939 case PRAYER_BLESS:
941 (void)inc_timed(TMD_BLESSED, randint(12) + 12);
942 break;
945 case PRAYER_REMOVE_FEAR:
947 (void)clear_timed(TMD_AFRAID);
948 break;
951 case PRAYER_CALL_LIGHT:
953 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
954 break;
957 case PRAYER_FIND_TRAPS:
959 (void)detect_traps();
960 break;
963 case PRAYER_DETECT_DOORS_STAIRS:
965 (void)detect_doors();
966 (void)detect_stairs();
967 break;
970 case PRAYER_SLOW_POISON:
972 (void)set_timed(TMD_POISONED, p_ptr->timed[TMD_POISONED] / 2);
973 break;
976 case PRAYER_SCARE_MONSTER:
978 if (!get_aim_dir(&dir)) return (FALSE);
979 (void)fear_monster(dir, plev);
980 break;
983 case PRAYER_PORTAL:
985 teleport_player(plev * 3);
986 break;
989 case PRAYER_CURE_SERIOUS_WOUNDS:
991 (void)hp_player(damroll(4, 10));
992 (void)set_timed(TMD_CUT, (p_ptr->timed[TMD_CUT] / 2) - 20);
993 break;
996 case PRAYER_CHANT:
998 (void)inc_timed(TMD_BLESSED, randint(24) + 24);
999 break;
1002 case PRAYER_SANCTUARY:
1004 (void)sleep_monsters_touch();
1005 break;
1008 case PRAYER_SATISFY_HUNGER:
1010 (void)set_food(PY_FOOD_MAX - 1);
1011 break;
1014 case PRAYER_REMOVE_CURSE:
1016 remove_curse();
1017 break;
1020 case PRAYER_RESIST_HEAT_COLD:
1022 (void)inc_timed(TMD_OPP_FIRE, randint(10) + 10);
1023 (void)inc_timed(TMD_OPP_COLD, randint(10) + 10);
1024 break;
1027 case PRAYER_NEUTRALIZE_POISON:
1029 (void)clear_timed(TMD_POISONED);
1030 break;
1033 case PRAYER_ORB_OF_DRAINING:
1035 if (!get_aim_dir(&dir)) return (FALSE);
1036 fire_ball(GF_HOLY_ORB, dir,
1037 (damroll(3, 6) + plev +
1038 (plev / ((cp_ptr->flags & CF_BLESS_WEAPON) ? 2 : 4))),
1039 ((plev < 30) ? 2 : 3));
1040 break;
1043 case PRAYER_CURE_CRITICAL_WOUNDS:
1045 (void)hp_player(damroll(6, 10));
1046 (void)clear_timed(TMD_CUT);
1047 (void)clear_timed(TMD_AMNESIA);
1048 break;
1051 case PRAYER_SENSE_INVISIBLE:
1053 (void)inc_timed(TMD_SINVIS, randint(24) + 24);
1054 break;
1057 case PRAYER_PROTECTION_FROM_EVIL:
1059 (void)inc_timed(TMD_PROTEVIL, randint(25) + 3 * p_ptr->lev);
1060 break;
1063 case PRAYER_EARTHQUAKE:
1065 earthquake(py, px, 10);
1066 break;
1069 case PRAYER_SENSE_SURROUNDINGS:
1071 map_area();
1072 break;
1075 case PRAYER_CURE_MORTAL_WOUNDS:
1077 (void)hp_player(damroll(8, 10));
1078 (void)clear_timed(TMD_STUN);
1079 (void)clear_timed(TMD_CUT);
1080 break;
1083 case PRAYER_TURN_UNDEAD:
1085 (void)turn_undead();
1086 break;
1089 case PRAYER_PRAYER:
1091 (void)inc_timed(TMD_BLESSED, randint(48) + 48);
1092 break;
1095 case PRAYER_DISPEL_UNDEAD:
1097 (void)dispel_undead(randint(plev * 3));
1098 break;
1101 case PRAYER_HEAL:
1103 (void)hp_player(300);
1104 (void)clear_timed(TMD_STUN);
1105 (void)clear_timed(TMD_CUT);
1106 break;
1109 case PRAYER_DISPEL_EVIL:
1111 (void)dispel_evil(randint(plev * 3));
1112 break;
1115 case PRAYER_GLYPH_OF_WARDING:
1117 warding_glyph();
1118 break;
1121 case PRAYER_HOLY_WORD:
1123 (void)dispel_evil(randint(plev * 4));
1124 (void)hp_player(1000);
1125 (void)clear_timed(TMD_AFRAID);
1126 (void)clear_timed(TMD_POISONED);
1127 (void)clear_timed(TMD_STUN);
1128 (void)clear_timed(TMD_CUT);
1129 break;
1132 case PRAYER_DETECT_MONSTERS:
1134 (void)detect_monsters_normal();
1135 break;
1138 case PRAYER_DETECTION:
1140 (void)detect_all();
1141 break;
1144 case PRAYER_PERCEPTION:
1146 return ident_spell();
1149 case PRAYER_PROBING:
1151 (void)probing();
1152 break;
1155 case PRAYER_CLAIRVOYANCE:
1157 wiz_lite();
1158 break;
1161 case PRAYER_CURE_SERIOUS_WOUNDS2:
1163 (void)hp_player(damroll(4, 10));
1164 (void)clear_timed(TMD_CUT);
1165 break;
1168 case PRAYER_CURE_MORTAL_WOUNDS2:
1170 (void)hp_player(damroll(8, 10));
1171 (void)clear_timed(TMD_STUN);
1172 (void)clear_timed(TMD_CUT);
1173 break;
1176 case PRAYER_HEALING:
1178 (void)hp_player(2000);
1179 (void)clear_timed(TMD_STUN);
1180 (void)clear_timed(TMD_CUT);
1181 break;
1184 case PRAYER_RESTORATION:
1186 (void)do_res_stat(A_STR);
1187 (void)do_res_stat(A_INT);
1188 (void)do_res_stat(A_WIS);
1189 (void)do_res_stat(A_DEX);
1190 (void)do_res_stat(A_CON);
1191 (void)do_res_stat(A_CHR);
1192 break;
1195 case PRAYER_REMEMBRANCE:
1197 (void)restore_level();
1198 break;
1201 case PRAYER_DISPEL_UNDEAD2:
1203 (void)dispel_undead(randint(plev * 4));
1204 break;
1207 case PRAYER_DISPEL_EVIL2:
1209 (void)dispel_evil(randint(plev * 4));
1210 break;
1213 case PRAYER_BANISH_EVIL:
1215 if (banish_evil(100))
1217 msg_print("The power of your god banishes evil!");
1219 break;
1222 case PRAYER_WORD_OF_DESTRUCTION:
1224 destroy_area(py, px, 15, TRUE);
1225 break;
1228 case PRAYER_ANNIHILATION:
1230 if (!get_aim_dir(&dir)) return (FALSE);
1231 drain_life(dir, 200);
1232 break;
1235 case PRAYER_UNBARRING_WAYS:
1237 (void)destroy_doors_touch();
1238 break;
1241 case PRAYER_RECHARGING:
1243 return recharge(15);
1246 case PRAYER_DISPEL_CURSE:
1248 (void)remove_all_curse();
1249 break;
1252 case PRAYER_ENCHANT_WEAPON:
1254 return enchant_spell(rand_int(4) + 1, rand_int(4) + 1, 0);
1257 case PRAYER_ENCHANT_ARMOUR:
1259 return enchant_spell(0, 0, rand_int(3) + 2);
1262 case PRAYER_ELEMENTAL_BRAND:
1264 brand_weapon();
1265 break;
1268 case PRAYER_BLINK:
1270 teleport_player(10);
1271 break;
1274 case PRAYER_TELEPORT_SELF:
1276 teleport_player(plev * 8);
1277 break;
1280 case PRAYER_TELEPORT_OTHER:
1282 if (!get_aim_dir(&dir)) return (FALSE);
1283 (void)teleport_monster(dir);
1284 break;
1287 case PRAYER_TELEPORT_LEVEL:
1289 (void)teleport_player_level();
1290 break;
1293 case PRAYER_WORD_OF_RECALL:
1295 set_recall();
1296 break;
1299 case PRAYER_ALTER_REALITY:
1301 msg_print("The world changes!");
1303 /* Leaving */
1304 p_ptr->leaving = TRUE;
1306 break;
1310 /* Success */
1311 return (TRUE);
1315 bool cast_spell(int tval, int index)
1317 if (tval == TV_MAGIC_BOOK)
1319 return cast_mage_spell(index);
1321 else
1323 return cast_priest_spell(index);