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.
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
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
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
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
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
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
)
168 int sval
= o_ptr
->sval
;
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
)
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
;
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 */
203 if (tval
== TV_MAGIC_BOOK
)
205 int plev
= p_ptr
->lev
;
207 /* Analyze the spell */
210 case SPELL_MAGIC_MISSILE
:
211 strnfmt(p
, len
, " dam %dd4", 3 + ((plev
- 1) / 5));
213 case SPELL_PHASE_DOOR
:
214 strnfmt(p
, len
, " range 10");
216 case SPELL_LIGHT_AREA
:
217 strnfmt(p
, len
, " dam 2d%d", (plev
/ 2));
219 case SPELL_CURE_LIGHT_WOUNDS
:
220 strnfmt(p
, len
, " heal 2d8");
222 case SPELL_STINKING_CLOUD
:
223 strnfmt(p
, len
, " dam %d", 10 + (plev
/ 2));
225 case SPELL_LIGHTNING_BOLT
:
226 strnfmt(p
, len
, " dam %dd6", (3 + ((plev
- 5) / 6)));
228 case SPELL_FROST_BOLT
:
229 strnfmt(p
, len
, " dam %dd8", (5 + ((plev
- 5) / 4)));
231 case SPELL_ACID_BOLT
:
232 strnfmt(p
, len
, " dam %dd8", (8 + ((plev
- 5) / 4)));
234 case SPELL_FIRE_BOLT
:
235 strnfmt(p
, len
, " dam %dd8", (6 + ((plev
- 5) / 4)));
237 case SPELL_SPEAR_OF_LIGHT
:
238 strnfmt(p
, len
, " dam 6d8");
241 strnfmt(p
, len
, " dur 25+d25");
243 case SPELL_BERSERKER
:
244 strnfmt(p
, len
, " dur 25+d25");
246 case SPELL_HASTE_SELF
:
247 strnfmt(p
, len
, " dur %d+d20", plev
);
249 case SPELL_TELEPORT_SELF
:
250 strnfmt(p
, len
, " range %d", plev
* 5);
252 case SPELL_SHOCK_WAVE
:
253 strnfmt(p
, len
, " dam %d", 10 + plev
);
255 case SPELL_EXPLOSION
:
256 strnfmt(p
, len
, " dam %d", 20 + plev
* 2);
258 case SPELL_CLOUD_KILL
:
259 strnfmt(p
, len
, " dam %d", 40 + (plev
/ 2));
261 case SPELL_REND_SOUL
:
262 strnfmt(p
, len
, " dam 11d%d", plev
);
264 case SPELL_CHAOS_STRIKE
:
265 strnfmt(p
, len
, " dam 13d%d", plev
);
267 case SPELL_RESIST_COLD
:
268 strnfmt(p
, len
, " dur 20+d20");
270 case SPELL_RESIST_FIRE
:
271 strnfmt(p
, len
, " dur 20+d20");
273 case SPELL_RESIST_POISON
:
274 strnfmt(p
, len
, " dur 20+d20");
276 case SPELL_RESISTANCE
:
277 strnfmt(p
, len
, " dur 20+d20");
280 strnfmt(p
, len
, " dur 30+d20");
282 case SPELL_FROST_BALL
:
283 strnfmt(p
, len
, " dam %d", 30 + plev
);
285 case SPELL_ACID_BALL
:
286 strnfmt(p
, len
, " dam %d", 40 + plev
);
288 case SPELL_FIRE_BALL
:
289 strnfmt(p
, len
, " dam %d", 55 + plev
);
291 case SPELL_ICE_STORM
:
292 strnfmt(p
, len
, " dam %d", 50 + (plev
* 2));
294 case SPELL_METEOR_SWARM
:
295 strnfmt(p
, len
, " dam %dx%d", 30 + plev
/ 2, 2 + plev
/ 20);
298 strnfmt(p
, len
, " dam 40+%dd7", plev
);
300 case SPELL_MANA_STORM
:
301 strnfmt(p
, len
, " dam %d", 300 + plev
* 2);
307 if (tval
== TV_PRAYER_BOOK
)
309 int plev
= p_ptr
->lev
;
311 /* Analyze the spell */
314 case PRAYER_CURE_LIGHT_WOUNDS
:
315 my_strcpy(p
, " heal 2d10", len
);
318 my_strcpy(p
, " dur 12+d12", len
);
320 case PRAYER_CALL_LIGHT
:
321 strnfmt(p
, len
, " dam 2d%d", (plev
/ 2));
324 strnfmt(p
, len
, " range %d", 3 * plev
);
326 case PRAYER_CURE_SERIOUS_WOUNDS
:
327 my_strcpy(p
, " heal 4d10", len
);
330 my_strcpy(p
, " dur 24+d24", len
);
332 case PRAYER_RESIST_HEAT_COLD
:
333 my_strcpy(p
, " dur 10+d10", len
);
335 case PRAYER_ORB_OF_DRAINING
:
336 strnfmt(p
, len
, " %d+3d6", plev
+
337 (plev
/ ((cp_ptr
->flags
& CF_BLESS_WEAPON
) ? 2 : 4)));
339 case PRAYER_CURE_CRITICAL_WOUNDS
:
340 my_strcpy(p
, " heal 6d10", len
);
342 case PRAYER_SENSE_INVISIBLE
:
343 my_strcpy(p
, " dur 24+d24", len
);
345 case PRAYER_PROTECTION_FROM_EVIL
:
346 strnfmt(p
, len
, " dur %d+d25", 3 * plev
);
348 case PRAYER_CURE_MORTAL_WOUNDS
:
349 my_strcpy(p
, " heal 8d10", len
);
352 my_strcpy(p
, " dur 48+d48", len
);
354 case PRAYER_DISPEL_UNDEAD
:
355 strnfmt(p
, len
, " dam d%d", 3 * plev
);
358 my_strcpy(p
, " heal 300", len
);
360 case PRAYER_DISPEL_EVIL
:
361 strnfmt(p
, len
, " dam d%d", 3 * plev
);
363 case PRAYER_HOLY_WORD
:
364 my_strcpy(p
, " heal 1000", len
);
366 case PRAYER_CURE_SERIOUS_WOUNDS2
:
367 my_strcpy(p
, " heal 4d10", len
);
369 case PRAYER_CURE_MORTAL_WOUNDS2
:
370 my_strcpy(p
, " heal 8d10", len
);
373 my_strcpy(p
, " heal 2000", len
);
375 case PRAYER_DISPEL_UNDEAD2
:
376 strnfmt(p
, len
, " dam d%d", 4 * plev
);
378 case PRAYER_DISPEL_EVIL2
:
379 strnfmt(p
, len
, " dam d%d", 4 * plev
);
381 case PRAYER_ANNIHILATION
:
382 my_strcpy(p
, " dam 200", len
);
385 my_strcpy(p
, " range 10", len
);
387 case PRAYER_TELEPORT_SELF
:
388 strnfmt(p
, len
, " range %d", 8 * plev
);
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. */
415 int plev
= p_ptr
->lev
;
416 int die
= randint(100) + plev
/ 5;
417 int beam
= beam_chance();
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
);
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
);
432 fire_beam(GF_ELEC
, dir
, damroll(3+((plev
-5)/6), 6));
434 fire_bolt_or_beam(beam
-10, GF_COLD
, dir
,
435 damroll(5+((plev
-5)/4), 8));
437 fire_bolt_or_beam(beam
, GF_ACID
, dir
,
438 damroll(6+((plev
-5)/4), 8));
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);
454 dispel_monsters(150);
463 static bool cast_mage_spell(int spell
)
470 int plev
= p_ptr
->lev
;
472 /* Hack -- chance of "beam" instead of "bolt" */
473 int beam
= beam_chance();
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));
486 case SPELL_DETECT_MONSTERS
:
488 (void)detect_monsters_normal();
492 case SPELL_PHASE_DOOR
:
498 case SPELL_LIGHT_AREA
:
500 (void)lite_area(damroll(2, (plev
/ 2)), (plev
/ 10) + 1);
504 case SPELL_TREASURE_DETECTION
:
506 (void)detect_treasure();
507 (void)detect_objects_gold();
511 case SPELL_CURE_LIGHT_WOUNDS
:
514 (void)hp_player(damroll(2, 8));
515 (void)dec_timed(TMD_CUT
, 15);
519 case SPELL_OBJECT_DETECTION
:
521 (void)detect_objects_normal();
525 case SPELL_FIND_TRAPS_DOORS
:
527 (void)detect_traps();
528 (void)detect_doors();
529 (void)detect_stairs();
533 case SPELL_STINKING_CLOUD
:
535 if (!get_aim_dir(&dir
)) return (FALSE
);
536 fire_ball(GF_POIS
, dir
, 10 + (plev
/ 2), 2);
540 case SPELL_CONFUSE_MONSTER
:
542 if (!get_aim_dir(&dir
)) return (FALSE
);
543 (void)confuse_monster(dir
, plev
);
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));
555 case SPELL_TRAP_DOOR_DESTRUCTION
:
557 (void)destroy_doors_touch();
561 case SPELL_SLEEP_MONSTER
:
563 if (!get_aim_dir(&dir
)) return (FALSE
);
564 (void)sleep_monster(dir
);
568 case SPELL_CURE_POISON
:
570 (void)clear_timed(TMD_POISONED
);
574 case SPELL_TELEPORT_SELF
:
576 teleport_player(plev
* 5);
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.");
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));
596 case SPELL_TURN_STONE_TO_MUD
:
598 if (!get_aim_dir(&dir
)) return (FALSE
);
599 (void)wall_to_mud(dir
);
603 case SPELL_SATISFY_HUNGER
:
605 (void)set_food(PY_FOOD_MAX
- 1);
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
);
621 case SPELL_POLYMORPH_OTHER
:
623 if (!get_aim_dir(&dir
)) return (FALSE
);
624 (void)poly_monster(dir
);
630 return ident_spell();
633 case SPELL_MASS_SLEEP
:
635 (void)sleep_monsters();
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));
647 case SPELL_SLOW_MONSTER
:
649 if (!get_aim_dir(&dir
)) return (FALSE
);
650 (void)slow_monster(dir
);
654 case SPELL_FROST_BALL
:
656 if (!get_aim_dir(&dir
)) return (FALSE
);
657 fire_ball(GF_COLD
, dir
, 30 + (plev
), 2);
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
);
675 if (!get_aim_dir(&dir
)) return (FALSE
);
676 fire_ball(GF_OLD_CONF
, dir
, plev
, 4);
680 case SPELL_FIRE_BALL
:
682 if (!get_aim_dir(&dir
)) return (FALSE
);
683 fire_ball(GF_FIRE
, dir
, 55 + (plev
), 2);
687 case SPELL_WORD_OF_DESTRUCTION
:
689 destroy_area(py
, px
, 15, TRUE
);
693 case SPELL_BANISHMENT
:
699 case SPELL_DOOR_CREATION
:
701 (void)door_creation();
705 case SPELL_STAIR_CREATION
:
707 (void)stair_creation();
711 case SPELL_TELEPORT_LEVEL
:
713 (void)teleport_player_level();
717 case SPELL_EARTHQUAKE
:
719 earthquake(py
, px
, 10);
723 case SPELL_WORD_OF_RECALL
:
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));
736 case SPELL_CLOUD_KILL
:
738 if (!get_aim_dir(&dir
)) return (FALSE
);
739 fire_ball(GF_POIS
, dir
, 40 + (plev
/ 2), 3);
743 case SPELL_ACID_BALL
:
745 if (!get_aim_dir(&dir
)) return (FALSE
);
746 fire_ball(GF_ACID
, dir
, 40 + (plev
), 2);
750 case SPELL_ICE_STORM
:
752 if (!get_aim_dir(&dir
)) return (FALSE
);
753 fire_ball(GF_ICE
, dir
, 50 + (plev
* 2), 3);
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);
764 case SPELL_MANA_STORM
:
766 if (!get_aim_dir(&dir
)) return (FALSE
);
767 fire_ball(GF_MANA
, dir
, 300 + (plev
* 2), 3);
770 case SPELL_DETECT_INVISIBLE
:
772 (void)detect_monsters_invis();
776 case SPELL_DETECT_ENCHANTMENT
:
778 (void)detect_objects_magic();
782 case SPELL_SHOCK_WAVE
:
784 if (!get_aim_dir(&dir
)) return (FALSE
);
785 fire_ball(GF_SOUND
, dir
, 10 + plev
, 2);
789 case SPELL_EXPLOSION
:
791 if (!get_aim_dir(&dir
)) return (FALSE
);
792 fire_ball(GF_SHARD
, dir
, 20 + (plev
* 2), 2);
796 case SPELL_MASS_BANISHMENT
:
798 (void)mass_banishment();
802 case SPELL_RESIST_FIRE
:
804 (void)inc_timed(TMD_OPP_FIRE
, randint(20) + 20);
808 case SPELL_RESIST_COLD
:
810 (void)inc_timed(TMD_OPP_COLD
, randint(20) + 20);
814 case SPELL_ELEMENTAL_BRAND
: /* elemental brand */
819 case SPELL_RESIST_POISON
:
821 (void)inc_timed(TMD_OPP_POIS
, randint(20) + 20);
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
);
839 (void)inc_timed(TMD_HERO
, randint(25) + 25);
840 (void)clear_timed(TMD_AFRAID
);
846 (void)inc_timed(TMD_SHIELD
, randint(20) + 30);
850 case SPELL_BERSERKER
:
853 (void)inc_timed(TMD_SHERO
, randint(25) + 25);
854 (void)clear_timed(TMD_AFRAID
);
858 case SPELL_HASTE_SELF
:
860 if (!p_ptr
->timed
[TMD_FAST
])
862 (void)set_timed(TMD_FAST
, randint(20) + plev
);
866 (void)inc_timed(TMD_FAST
, randint(5));
873 if (!get_aim_dir(&dir
)) return (FALSE
);
874 fire_beam(GF_GRAVITY
, dir
, 40 + damroll(plev
, 7));
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
));
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
));
892 case SPELL_RUNE_OF_PROTECTION
: /* rune of protection */
894 (void)warding_glyph();
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);
915 static bool cast_priest_spell(int spell
)
922 int plev
= p_ptr
->lev
;
926 case PRAYER_DETECT_EVIL
:
928 (void)detect_monsters_evil();
932 case PRAYER_CURE_LIGHT_WOUNDS
:
934 (void)hp_player(damroll(2, 10));
935 (void)dec_timed(TMD_CUT
, 10);
941 (void)inc_timed(TMD_BLESSED
, randint(12) + 12);
945 case PRAYER_REMOVE_FEAR
:
947 (void)clear_timed(TMD_AFRAID
);
951 case PRAYER_CALL_LIGHT
:
953 (void)lite_area(damroll(2, (plev
/ 2)), (plev
/ 10) + 1);
957 case PRAYER_FIND_TRAPS
:
959 (void)detect_traps();
963 case PRAYER_DETECT_DOORS_STAIRS
:
965 (void)detect_doors();
966 (void)detect_stairs();
970 case PRAYER_SLOW_POISON
:
972 (void)set_timed(TMD_POISONED
, p_ptr
->timed
[TMD_POISONED
] / 2);
976 case PRAYER_SCARE_MONSTER
:
978 if (!get_aim_dir(&dir
)) return (FALSE
);
979 (void)fear_monster(dir
, plev
);
985 teleport_player(plev
* 3);
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);
998 (void)inc_timed(TMD_BLESSED
, randint(24) + 24);
1002 case PRAYER_SANCTUARY
:
1004 (void)sleep_monsters_touch();
1008 case PRAYER_SATISFY_HUNGER
:
1010 (void)set_food(PY_FOOD_MAX
- 1);
1014 case PRAYER_REMOVE_CURSE
:
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);
1027 case PRAYER_NEUTRALIZE_POISON
:
1029 (void)clear_timed(TMD_POISONED
);
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));
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
);
1051 case PRAYER_SENSE_INVISIBLE
:
1053 (void)inc_timed(TMD_SINVIS
, randint(24) + 24);
1057 case PRAYER_PROTECTION_FROM_EVIL
:
1059 (void)inc_timed(TMD_PROTEVIL
, randint(25) + 3 * p_ptr
->lev
);
1063 case PRAYER_EARTHQUAKE
:
1065 earthquake(py
, px
, 10);
1069 case PRAYER_SENSE_SURROUNDINGS
:
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
);
1083 case PRAYER_TURN_UNDEAD
:
1085 (void)turn_undead();
1091 (void)inc_timed(TMD_BLESSED
, randint(48) + 48);
1095 case PRAYER_DISPEL_UNDEAD
:
1097 (void)dispel_undead(randint(plev
* 3));
1103 (void)hp_player(300);
1104 (void)clear_timed(TMD_STUN
);
1105 (void)clear_timed(TMD_CUT
);
1109 case PRAYER_DISPEL_EVIL
:
1111 (void)dispel_evil(randint(plev
* 3));
1115 case PRAYER_GLYPH_OF_WARDING
:
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
);
1132 case PRAYER_DETECT_MONSTERS
:
1134 (void)detect_monsters_normal();
1138 case PRAYER_DETECTION
:
1144 case PRAYER_PERCEPTION
:
1146 return ident_spell();
1149 case PRAYER_PROBING
:
1155 case PRAYER_CLAIRVOYANCE
:
1161 case PRAYER_CURE_SERIOUS_WOUNDS2
:
1163 (void)hp_player(damroll(4, 10));
1164 (void)clear_timed(TMD_CUT
);
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
);
1176 case PRAYER_HEALING
:
1178 (void)hp_player(2000);
1179 (void)clear_timed(TMD_STUN
);
1180 (void)clear_timed(TMD_CUT
);
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
);
1195 case PRAYER_REMEMBRANCE
:
1197 (void)restore_level();
1201 case PRAYER_DISPEL_UNDEAD2
:
1203 (void)dispel_undead(randint(plev
* 4));
1207 case PRAYER_DISPEL_EVIL2
:
1209 (void)dispel_evil(randint(plev
* 4));
1213 case PRAYER_BANISH_EVIL
:
1215 if (banish_evil(100))
1217 msg_print("The power of your god banishes evil!");
1222 case PRAYER_WORD_OF_DESTRUCTION
:
1224 destroy_area(py
, px
, 15, TRUE
);
1228 case PRAYER_ANNIHILATION
:
1230 if (!get_aim_dir(&dir
)) return (FALSE
);
1231 drain_life(dir
, 200);
1235 case PRAYER_UNBARRING_WAYS
:
1237 (void)destroy_doors_touch();
1241 case PRAYER_RECHARGING
:
1243 return recharge(15);
1246 case PRAYER_DISPEL_CURSE
:
1248 (void)remove_all_curse();
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
:
1270 teleport_player(10);
1274 case PRAYER_TELEPORT_SELF
:
1276 teleport_player(plev
* 8);
1280 case PRAYER_TELEPORT_OTHER
:
1282 if (!get_aim_dir(&dir
)) return (FALSE
);
1283 (void)teleport_monster(dir
);
1287 case PRAYER_TELEPORT_LEVEL
:
1289 (void)teleport_player_level();
1293 case PRAYER_WORD_OF_RECALL
:
1299 case PRAYER_ALTER_REALITY
:
1301 msg_print("The world changes!");
1304 p_ptr
->leaving
= TRUE
;
1315 bool cast_spell(int tval
, int index
)
1317 if (tval
== TV_MAGIC_BOOK
)
1319 return cast_mage_spell(index
);
1323 return cast_priest_spell(index
);