ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.28
Committed: Tue Dec 26 08:55:00 2006 UTC (17 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.27: +1 -3 lines
Log Message:
replace update_ob_speed by ->set_speed

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 2001 Mark Wedel & Crossfire Development Team
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 root 1.15 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 elmex 1.1 */
23    
24    
25     #include <global.h>
26     #include <spells.h>
27     #include <object.h>
28     #include <errno.h>
29 root 1.28 #include <sproto.h>
30 elmex 1.1 #include <sounds.h>
31    
32     extern char *spell_mapping[];
33    
34     /* This returns a random spell from 'ob'. If skill is set, then
35     * the spell must be of this skill, it can be NULL in which case all
36     * matching spells are used.
37     */
38 root 1.11 object *
39     find_random_spell_in_ob (object *ob, const char *skill)
40 elmex 1.1 {
41 root 1.11 int k = 0, s;
42     object *tmp;
43 elmex 1.1
44 root 1.11 for (tmp = ob->inv; tmp; tmp = tmp->below)
45     if (tmp->type == SPELL && (!skill || tmp->skill == skill))
46     k++;
47 elmex 1.1
48 root 1.11 /* No spells, no need to progess further */
49     if (!k)
50     return NULL;
51 elmex 1.1
52 root 1.11 s = RANDOM () % k;
53 elmex 1.1
54 root 1.11 for (tmp = ob->inv; tmp; tmp = tmp->below)
55     if (tmp->type == SPELL && (!skill || tmp->skill == skill))
56     {
57     if (!s)
58     return tmp;
59     else
60     s--;
61     }
62     /* Should never get here, but just in case */
63     return NULL;
64 elmex 1.1 }
65    
66     /* Relatively simple function that gets used a lot.
67     * Basically, it sets up the skill pointer for the spell being
68     * cast. If op is really casting the spell, then the skill
69     * is whatever skill the spell requires.
70     * if instead caster (rod, horn, wand, etc) is casting the skill,
71     * then they get exp for the skill that you need to use for
72     * that object (use magic device).
73     */
74 root 1.11 void
75     set_spell_skill (object *op, object *caster, object *spob, object *dest)
76 elmex 1.1 {
77 root 1.10 if (caster == op && spob->skill)
78     dest->skill = spob->skill;
79     else
80     dest->skill = caster->skill;
81 elmex 1.1 }
82    
83     /* init_spells: This should really be called check_spells, as that
84     * is what it does. It goes through the spells looking for any
85     * obvious errors. This was most useful in debugging when re-doing
86     * all the spells to catch simple errors. To use it all the time
87     * will result in it spitting out messages that aren't really errors.
88     */
89 root 1.11 void
90     init_spells (void)
91     {
92 elmex 1.1 #ifdef SPELL_DEBUG
93 root 1.11 static int init_spells_done = 0;
94     int i;
95     archetype *at;
96    
97     if (init_spells_done)
98     return;
99     LOG (llevDebug, "Checking spells...\n");
100    
101     for (at = first_archetype; at; at = at->next)
102     {
103     if (at->clone.type == SPELL)
104     {
105     if (at->clone.skill)
106     {
107     for (i = 1; i < NUM_SKILLS; i++)
108     if (!strcmp (skill_names[i], at->clone.skill))
109     break;
110     if (i == NUM_SKILLS)
111     {
112     LOG (llevError, "Spell %s has improper associated skill %s\n", at->name, at->clone.skill);
113 root 1.8 }
114     }
115 root 1.11 /* other_arch is already checked for in the loader */
116 root 1.8 }
117 elmex 1.1 }
118    
119 root 1.11 i = 0;
120     while (spell_mapping[i])
121     {
122 root 1.14 if (!archetype::find (spell_mapping[i]))
123 root 1.11 {
124     LOG (llevError, "Unable to find spell mapping %s (%i)\n", spell_mapping[i], i);
125 root 1.8 }
126 root 1.11 i++;
127 elmex 1.1 }
128 root 1.11 LOG (llevDebug, "Checking spells completed.\n");
129 elmex 1.1 #endif
130     }
131    
132     /* Dumps all the spells - now also dumps skill associated with the spell.
133     * not sure what this would be used for, as the data seems pretty
134     * minimal, but easy enough to keep around.
135     */
136 root 1.11 void
137     dump_spells (void)
138 elmex 1.1 {
139 root 1.11 archetype *at;
140 elmex 1.1
141 root 1.11 for (at = first_archetype; at; at = at->next)
142     {
143     if (at->clone.type == SPELL)
144     {
145     fprintf (stderr, "%s:%s:%s:%s:%d\n", &at->clone.name,
146     &at->name, at->clone.other_arch ? &at->clone.other_arch->name : "<nil>", &at->clone.skill, at->clone.level);
147 root 1.8 }
148 elmex 1.1 }
149     }
150    
151     /* pretty basic function - basically just takes
152     * an object, sets the x,y, and calls insert_ob_in_map
153     */
154    
155 root 1.11 void
156 root 1.17 spell_effect (object *spob, int x, int y, maptile *map, object *originator)
157 elmex 1.1 {
158    
159 root 1.11 if (spob->other_arch != NULL)
160     {
161     object *effect = arch_to_object (spob->other_arch);
162 elmex 1.1
163 root 1.11 effect->x = x;
164     effect->y = y;
165 elmex 1.1
166 root 1.11 insert_ob_in_map (effect, map, originator, 0);
167 elmex 1.1 }
168     }
169    
170     /*
171     * This function takes a caster and spell and presents the
172     * effective level the caster needs to be to cast the spell.
173     * basically, it just adjusts the spell->level with attuned/repelled
174     * spellpaths. Was called path_level_mod
175     *
176     * caster is person casting hte spell.
177     * spell is the spell object.
178     * Returns modified level.
179     */
180 root 1.11 int
181     min_casting_level (object *caster, object *spell)
182 elmex 1.1 {
183 root 1.11 int new_level;
184 elmex 1.1
185 root 1.11 if (caster->path_denied & spell->path_attuned)
186 root 1.18 return 1;
187    
188 root 1.11 new_level = spell->level
189     + ((caster->path_repelled & spell->path_attuned) ? +2 : 0) + ((caster->path_attuned & spell->path_attuned) ? -2 : 0);
190 root 1.18
191 root 1.11 return (new_level < 1) ? 1 : new_level;
192 elmex 1.1 }
193    
194    
195     /* This function returns the effective level the spell
196     * is being cast at.
197     * Note that I changed the repelled/attuned bonus to 2 from 5.
198     * This is because the new code compares casting_level against
199     * min_caster_level, so the difference is effectively 4
200     */
201    
202 root 1.11 int
203     caster_level (object *caster, object *spell)
204 elmex 1.1 {
205 root 1.11 int level = caster->level;
206    
207     /* If this is a player, try to find the matching skill */
208     if (caster->type == PLAYER && spell->skill)
209 root 1.18 for (int i = 0; i < NUM_SKILLS; i++)
210     if (caster->contr->last_skill_ob[i] && caster->contr->last_skill_ob[i]->skill == spell->skill)
211     {
212     level = caster->contr->last_skill_ob[i]->level;
213     break;
214     }
215 root 1.11
216     /* if a rod is fired by a player, take the use_magic_item skill in consideration. */
217     if (caster->type == ROD && caster->env && caster->env->type == PLAYER)
218     {
219     object *skill = find_skill_by_number (caster->env, SK_USE_MAGIC_ITEM);
220     int sk_level = skill ? skill->level : 1;
221    
222     level = MIN (level, sk_level + level / 10 + 1);
223 elmex 1.1 }
224    
225 root 1.11 /* Got valid caster level. Now adjust for attunement */
226     level += ((caster->path_repelled & spell->path_attuned) ? -2 : 0) + ((caster->path_attuned & spell->path_attuned) ? 2 : 0);
227    
228     /* Always make this at least 1. If this is zero, we get divide by zero
229     * errors in various places.
230     */
231     if (level < 1)
232     level = 1;
233 root 1.18
234 root 1.11 return level;
235 elmex 1.1 }
236    
237     /* The following function scales the spellpoint cost of
238     * a spell by it's increased effectiveness. Some of the
239     * lower level spells become incredibly vicious at high
240     * levels. Very cheap mass destruction. This function is
241     * intended to keep the sp cost related to the effectiveness.
242     * op is the player/monster
243     * caster is what is casting the spell, can be op.
244     * spell is the spell object.
245     * Note that it is now possible for a spell to cost both grace and
246     * mana. In that case, we return which ever value is higher.
247     */
248    
249 root 1.11 sint16
250     SP_level_spellpoint_cost (object *caster, object *spell, int flags)
251 elmex 1.1 {
252 root 1.11 int sp, grace, level = caster_level (caster, spell);
253 elmex 1.1
254 root 1.11 if (settings.spellpoint_level_depend == TRUE)
255     {
256     if (spell->stats.sp && spell->stats.maxsp)
257     {
258     sp = (int) (spell->stats.sp * (1.0 + MAX (0, (float) (level - spell->level) / (float) spell->stats.maxsp)));
259 root 1.8 }
260 root 1.11 else
261     sp = spell->stats.sp;
262 root 1.8
263 root 1.11 sp *= (int) PATH_SP_MULT (caster, spell);
264     if (!sp && spell->stats.sp)
265     sp = 1;
266 root 1.8
267 root 1.11 if (spell->stats.grace && spell->stats.maxgrace)
268     {
269     grace = (int) (spell->stats.grace * (1.0 + MAX (0, (float) (level - spell->level) / (float) spell->stats.maxgrace)));
270 root 1.8 }
271 root 1.11 else
272     grace = spell->stats.grace;
273 elmex 1.1
274 root 1.11 grace *= (int) PATH_SP_MULT (caster, spell);
275     if (spell->stats.grace && !grace)
276     grace = 1;
277     }
278     else
279     {
280     sp = (int) (spell->stats.sp * PATH_SP_MULT (caster, spell));
281     if (spell->stats.sp && !sp)
282     sp = 1;
283     grace = (int) (spell->stats.grace * PATH_SP_MULT (caster, spell));
284     if (spell->stats.grace && !grace)
285     grace = 1;
286     }
287     if (flags == SPELL_HIGHEST)
288     return MAX (sp, grace);
289     else if (flags == SPELL_GRACE)
290     return grace;
291     else if (flags == SPELL_MANA)
292     return sp;
293     else
294     {
295     LOG (llevError, "SP_level_spellpoint_cost: Unknown flags passed: %d\n", flags);
296     return 0;
297 elmex 1.1 }
298     }
299    
300    
301     /* SP_level_dam_adjust: Returns adjusted damage based on the caster.
302     * spob is the spell we are adjusting.
303     */
304 root 1.11 int
305     SP_level_dam_adjust (object *caster, object *spob)
306 elmex 1.1 {
307 root 1.11 int level = caster_level (caster, spob);
308     int adj = level - min_casting_level (caster, spob);
309 elmex 1.1
310 root 1.11 if (adj < 0)
311     adj = 0;
312     if (spob->dam_modifier)
313     adj /= spob->dam_modifier;
314     else
315     adj = 0;
316     return adj;
317 elmex 1.1 }
318    
319     /* Adjust the strength of the spell based on level.
320     * This is basically the same as SP_level_dam_adjust above,
321     * but instead looks at the level_modifier value.
322     */
323 root 1.11 int
324     SP_level_duration_adjust (object *caster, object *spob)
325 elmex 1.1 {
326 root 1.11 int level = caster_level (caster, spob);
327     int adj = level - min_casting_level (caster, spob);
328 elmex 1.1
329 root 1.11 if (adj < 0)
330     adj = 0;
331     if (spob->duration_modifier)
332     adj /= spob->duration_modifier;
333     else
334     adj = 0;
335 elmex 1.1
336 root 1.11 return adj;
337 elmex 1.1 }
338    
339     /* Adjust the strength of the spell based on level.
340     * This is basically the same as SP_level_dam_adjust above,
341     * but instead looks at the level_modifier value.
342     */
343 root 1.11 int
344     SP_level_range_adjust (object *caster, object *spob)
345 elmex 1.1 {
346 root 1.11 int level = caster_level (caster, spob);
347     int adj = level - min_casting_level (caster, spob);
348 elmex 1.1
349 root 1.11 if (adj < 0)
350     adj = 0;
351     if (spob->range_modifier)
352     adj /= spob->range_modifier;
353     else
354     adj = 0;
355 elmex 1.1
356 root 1.11 return adj;
357 elmex 1.1 }
358    
359     /* Checks to see if player knows the spell. If the name is the same
360     * as an existing spell, we presume they know it.
361     * returns 1 if they know the spell, 0 if they don't.
362     */
363 root 1.11 object *
364     check_spell_known (object *op, const char *name)
365 elmex 1.1 {
366 root 1.11 object *spop;
367 elmex 1.1
368 root 1.11 for (spop = op->inv; spop; spop = spop->below)
369     if (spop->type == SPELL && !strcmp (spop->name, name))
370     return spop;
371 elmex 1.1
372 root 1.11 return NULL;
373 elmex 1.1 }
374    
375    
376     /*
377     * Look at object 'op' and see if they know the spell
378     * spname. This is pretty close to check_spell_known
379     * above, but it uses a looser matching mechanism.
380     * returns the matching spell object, or NULL.
381     * If we match multiple spells but don't get an
382     * exact match, we also return NULL.
383     */
384    
385 root 1.11 object *
386     lookup_spell_by_name (object *op, const char *spname)
387     {
388     object *spob1 = NULL, *spob2 = NULL, *spob;
389     int nummatch = 0;
390    
391     if (spname == NULL)
392     return NULL;
393    
394     /* Try to find the spell. We store the results in spob1
395     * and spob2 - spob1 is only taking the length of
396     * the past spname, spob2 uses the length of the spell name.
397     */
398     for (spob = op->inv; spob; spob = spob->below)
399     {
400     if (spob->type == SPELL)
401     {
402     if (!strncmp (spob->name, spname, strlen (spname)))
403     {
404     nummatch++;
405     spob1 = spob;
406     }
407     else if (!strncmp (spob->name, spname, strlen (spob->name)))
408     {
409     /* if spells have ambiguous names, it makes matching
410     * really difficult. (eg, fire and fireball would
411     * fall into this category). It shouldn't be hard to
412     * make sure spell names don't overlap in that fashion.
413     */
414     if (spob2)
415     LOG (llevError, "Found multiple spells with overlapping base names: %s, %s\n", &spob2->name, &spob->name);
416     spob2 = spob;
417 root 1.8 }
418     }
419 elmex 1.1 }
420 root 1.11 /* if we have best match, return it. Otherwise, if we have one match
421     * on the loser match, return that, otehrwise null
422     */
423     if (spob2)
424     return spob2;
425     if (spob1 && nummatch == 1)
426     return spob1;
427     return NULL;
428 elmex 1.1 }
429    
430     /* reflwall - decides weither the (spell-)object sp_op will
431     * be reflected from the given mapsquare. Returns 1 if true.
432     * (Note that for living creatures there is a small chance that
433     * reflect_spell fails.)
434     * Caller should be sure it passes us valid map coordinates
435     * eg, updated for tiled maps.
436     */
437 root 1.11 int
438 root 1.17 reflwall (maptile *m, int x, int y, object *sp_op)
439 root 1.11 {
440     object *op;
441 elmex 1.1
442 root 1.11 if (OUT_OF_REAL_MAP (m, x, y))
443     return 0;
444 root 1.24 for (op = GET_MAP_OB (m, x, y); op != NULL; op = op->above)
445 elmex 1.23 if (QUERY_FLAG (op, FLAG_REFL_SPELL)
446     && (!QUERY_FLAG (op, FLAG_ALIVE)
447     || (rndm (0, 99)) < 90 - (sp_op->level / 10)))
448 root 1.11 return 1;
449 elmex 1.1
450 root 1.11 return 0;
451 elmex 1.1 }
452    
453     /* cast_create_object: creates object new_op in direction dir
454     * or if that is blocked, beneath the player (op).
455     * we pass 'caster', but don't use it for anything.
456     * This is really just a simple wrapper function .
457     * returns the direction that the object was actually placed
458     * in.
459     */
460 root 1.11 int
461     cast_create_obj (object *op, object *caster, object *new_op, int dir)
462 elmex 1.1 {
463 root 1.17 maptile *m;
464 root 1.11 sint16 sx, sy;
465 elmex 1.1
466 root 1.11 if (dir &&
467     ((get_map_flags (op->map, &m, op->x + freearr_x[dir], op->y + freearr_y[dir], &sx, &sy) & P_OUT_OF_MAP) ||
468     OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, sx, sy))))
469     {
470     new_draw_info (NDI_UNIQUE, 0, op, "Something is in the way.");
471     new_draw_info (NDI_UNIQUE, 0, op, "You cast it at your feet.");
472     dir = 0;
473     }
474     new_op->x = op->x + freearr_x[dir];
475     new_op->y = op->y + freearr_y[dir];
476     if (dir == 0)
477     insert_ob_in_map (new_op, op->map, op, INS_BELOW_ORIGINATOR);
478     else
479     insert_ob_in_map (new_op, op->map, op, 0);
480     return dir;
481 elmex 1.1 }
482    
483     /* Returns true if it is ok to put spell *op on the space/may provided.
484     * immune_stop is basically the attacktype of the spell (why
485     * passed as a different value, not sure of). If immune_stop
486     * has the AT_MAGIC bit set, and there is a counterwall
487     * on the space, the object doesn't get placed. if immune stop
488     * does not have AT_MAGIC, then counterwalls do not effect the spell.
489     *
490     */
491    
492 root 1.11 int
493 root 1.17 ok_to_put_more (maptile *m, sint16 x, sint16 y, object *op, int immune_stop)
494 root 1.11 {
495     object *tmp;
496     int mflags;
497 root 1.17 maptile *mp;
498 root 1.11
499     mp = m;
500     mflags = get_map_flags (m, &mp, x, y, &x, &y);
501    
502     if (mflags & P_OUT_OF_MAP)
503     return 0;
504    
505     if (OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (mp, x, y)))
506     return 0;
507    
508 root 1.24 for (tmp = GET_MAP_OB (mp, x, y); tmp != NULL; tmp = tmp->above)
509 root 1.11 {
510     /* If there is a counterspell on the space, and this
511     * object is using magic, don't progress. I believe we could
512     * leave this out and let in progress, and other areas of the code
513     * will then remove it, but that would seem to to use more
514     * resources, and may not work as well if a player is standing
515     * on top of a counterwall spell (may hit the player before being
516     * removed.) On the other hand, it may be more dramatic for the
517     * spell to actually hit the counterwall and be sucked up.
518     */
519     if ((tmp->attacktype & AT_COUNTERSPELL) &&
520     (tmp->type != PLAYER) && !QUERY_FLAG (tmp, FLAG_MONSTER) &&
521     (tmp->type != WEAPON) && (tmp->type != BOW) && (tmp->type != ARROW) && (tmp->type != GOLEM) && (immune_stop & AT_MAGIC))
522     return 0;
523    
524     /* This is to prevent 'out of control' spells. Basically, this
525     * limits one spell effect per space per spell. This is definately
526     * needed for performance reasons, and just for playability I believe.
527     * there are no such things as multispaced spells right now, so
528     * we don't need to worry about the head.
529     */
530     if ((tmp->stats.maxhp == op->stats.maxhp) && (tmp->type == op->type) && (tmp->subtype == op->subtype))
531     return 0;
532    
533     /*
534     * Combine similar spell effects into one spell effect. Needed for
535     * performance reasons with meteor swarm and the like, but also for
536     * playability reasons.
537     */
538     if (tmp->arch == op->arch
539     && tmp->type == op->type
540     && tmp->subtype == op->subtype
541     && tmp->owner == op->owner && ((tmp->subtype == SP_EXPLOSION) || (tmp->subtype == SP_CONE && tmp->stats.sp == op->stats.sp)))
542     {
543     tmp->stats.dam = MAX (tmp->stats.dam, op->stats.dam);
544     tmp->range = MAX (tmp->range, op->range);
545     tmp->duration = MAX (tmp->duration, op->duration);
546     return 0;
547 elmex 1.1 }
548    
549 root 1.11 /* Perhaps we should also put checks in for no magic and unholy
550     * ground to prevent it from moving along?
551     */
552 elmex 1.1 }
553 root 1.11 /* If it passes the above tests, it must be OK */
554     return 1;
555 elmex 1.1 }
556    
557     /* fire_arch_from_position: fires an archetype.
558     * op: person firing the object.
559     * caster: object casting the spell.
560     * x, y: where to fire the spell (note, it then uses op->map for the map
561     * for these coordinates, which is probably a really bad idea.
562     * dir: direction to fire in.
563     * spell: spell that is being fired. It uses other_arch for the archetype
564     * to fire.
565     * returns 0 on failure, 1 on success.
566     */
567    
568 root 1.11 int
569     fire_arch_from_position (object *op, object *caster, sint16 x, sint16 y, int dir, object *spell)
570     {
571     object *tmp;
572     int mflags;
573 root 1.17 maptile *m;
574 root 1.11
575     if (spell->other_arch == NULL)
576     return 0;
577    
578     m = op->map;
579     mflags = get_map_flags (m, &m, x, y, &x, &y);
580     if (mflags & P_OUT_OF_MAP)
581     {
582     return 0;
583 elmex 1.1 }
584    
585 root 1.11 tmp = arch_to_object (spell->other_arch);
586 elmex 1.1
587 root 1.11 if (tmp == NULL)
588     return 0;
589 elmex 1.1
590 root 1.11 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (m, x, y)))
591     {
592     new_draw_info (NDI_UNIQUE, 0, op, "You can't cast the spell on top of a wall!\n");
593 root 1.20 tmp->destroy ();
594 root 1.11 return 0;
595 elmex 1.1 }
596    
597 root 1.11 tmp->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
598     tmp->duration = spell->duration + SP_level_duration_adjust (caster, spell);
599     /* code in time.c uses food for some things, duration for others */
600     tmp->stats.food = tmp->duration;
601     tmp->range = spell->range + SP_level_range_adjust (caster, spell);
602     tmp->attacktype = spell->attacktype;
603     tmp->x = x;
604     tmp->y = y;
605     tmp->direction = dir;
606 root 1.21 if (op->owner != NULL)
607     tmp->set_owner (op);
608 root 1.11 else
609 root 1.21 tmp->set_owner (op);
610 root 1.11 tmp->level = caster_level (caster, spell);
611     set_spell_skill (op, caster, spell, tmp);
612    
613     /* needed for AT_HOLYWORD,AT_GODPOWER stuff */
614     if (tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER)
615     {
616     if (!tailor_god_spell (tmp, op))
617     return 0;
618 elmex 1.1 }
619 root 1.11 if (QUERY_FLAG (tmp, FLAG_IS_TURNABLE))
620     SET_ANIMATION (tmp, dir);
621 elmex 1.1
622 root 1.11 if ((tmp = insert_ob_in_map (tmp, m, op, 0)) == NULL)
623     return 1;
624 elmex 1.1
625 root 1.11 move_spell_effect (tmp);
626 elmex 1.1
627 root 1.11 return 1;
628 elmex 1.1 }
629    
630    
631    
632     /*****************************************************************************
633     *
634     * Code related to rods - perhaps better located in another file?
635     *
636     ****************************************************************************/
637    
638 root 1.11 void
639     regenerate_rod (object *rod)
640     {
641     if (rod->stats.hp < rod->stats.maxhp)
642     {
643     rod->stats.hp += 1 + rod->stats.maxhp / 10;
644 elmex 1.1
645 root 1.11 if (rod->stats.hp > rod->stats.maxhp)
646     rod->stats.hp = rod->stats.maxhp;
647 elmex 1.1 }
648     }
649    
650    
651 root 1.11 void
652     drain_rod_charge (object *rod)
653     {
654     rod->stats.hp -= SP_level_spellpoint_cost (rod, rod->inv, SPELL_HIGHEST);
655 elmex 1.1 }
656    
657    
658    
659    
660     /* this function is commonly used to find a friendly target for
661     * spells such as heal or protection or armour
662     * op is what is looking for the target (which can be a player),
663     * dir is the direction we are looking in. Return object found, or
664     * NULL if no good object.
665     */
666    
667 root 1.11 object *
668     find_target_for_friendly_spell (object *op, int dir)
669     {
670     object *tmp;
671 root 1.17 maptile *m;
672 root 1.11 sint16 x, y;
673     int mflags;
674    
675     /* I don't really get this block - if op isn't a player or rune,
676     * we then make the owner of this object the target.
677     * The owner could very well be no where near op.
678     */
679     if (op->type != PLAYER && op->type != RUNE)
680     {
681 root 1.21 tmp = op->owner;
682 root 1.11 /* If the owner does not exist, or is not a monster, than apply the spell
683     * to the caster.
684     */
685     if (!tmp || !QUERY_FLAG (tmp, FLAG_MONSTER))
686     tmp = op;
687 elmex 1.1 }
688 root 1.11 else
689     {
690     m = op->map;
691     x = op->x + freearr_x[dir];
692     y = op->y + freearr_y[dir];
693    
694     mflags = get_map_flags (m, &m, x, y, &x, &y);
695    
696     if (mflags & P_OUT_OF_MAP)
697 root 1.26 tmp = 0;
698 root 1.11 else
699 root 1.26 tmp = m->at (x, y).player ();
700 root 1.11 }
701 root 1.26
702 root 1.11 /* didn't find a player there, look in current square for a player */
703 root 1.26 if (!tmp)
704     tmp = op->ms ().player ();
705 elmex 1.1
706 root 1.11 return tmp;
707 elmex 1.1 }
708    
709    
710    
711     /* raytrace:
712     * spell_find_dir(map, x, y, exclude) will search first the center square
713     * then some close squares in the given map at the given coordinates for
714     * live objects.
715     * It will not consider the object given as exclude (= caster) among possible
716     * live objects. If the caster is a player, the spell will go after
717     * monsters/generators only. If not, the spell will hunt players only.
718     * It returns the direction toward the first/closest live object if it finds
719     * any, otherwise -1.
720     * note that exclude can be NULL, in which case all bets are off.
721     */
722    
723 root 1.11 int
724 root 1.17 spell_find_dir (maptile *m, int x, int y, object *exclude)
725 root 1.11 {
726     int i, max = SIZEOFFREE;
727     sint16 nx, ny;
728     int owner_type = 0, mflags;
729     object *tmp;
730 root 1.17 maptile *mp;
731 root 1.11
732     if (exclude && exclude->head)
733     exclude = exclude->head;
734     if (exclude && exclude->type)
735     owner_type = exclude->type;
736    
737     for (i = rndm (1, 8); i < max; i++)
738     {
739     nx = x + freearr_x[i];
740     ny = y + freearr_y[i];
741     mp = m;
742     mflags = get_map_flags (m, &mp, nx, ny, &nx, &ny);
743     if (mflags & (P_OUT_OF_MAP | P_BLOCKSVIEW))
744     continue;
745    
746 root 1.24 tmp = GET_MAP_OB (mp, nx, ny);
747 root 1.11
748     while (tmp != NULL && (((owner_type == PLAYER &&
749     !QUERY_FLAG (tmp, FLAG_MONSTER) && !QUERY_FLAG (tmp, FLAG_GENERATOR)) ||
750     (owner_type != PLAYER && tmp->type != PLAYER)) || (tmp == exclude || (tmp->head && tmp->head == exclude))))
751     tmp = tmp->above;
752 elmex 1.1
753 root 1.11 if (tmp != NULL && can_see_monsterP (m, x, y, i))
754     return freedir[i];
755 elmex 1.1 }
756 root 1.11 return -1; /* flag for "keep going the way you were" */
757 elmex 1.1 }
758    
759    
760    
761     /* put_a_monster: puts a monster named monstername near by
762     * op. This creates the treasures for the monsters, and
763     * also deals with multipart monsters properly.
764     */
765    
766 root 1.11 void
767     put_a_monster (object *op, const char *monstername)
768     {
769     object *tmp, *head = NULL, *prev = NULL;
770     archetype *at;
771     int dir;
772    
773     /* Handle cases where we are passed a bogus mosntername */
774    
775 root 1.14 if ((at = archetype::find (monstername)) == NULL)
776 root 1.11 return;
777    
778     /* find a free square nearby
779     * first we check the closest square for free squares
780     */
781    
782     dir = find_first_free_spot (&at->clone, op->map, op->x, op->y);
783     if (dir != -1)
784     {
785     /* This is basically grabbed for generate monster. Fixed 971225 to
786     * insert multipart monsters properly
787     */
788     while (at != NULL)
789     {
790     tmp = arch_to_object (at);
791     tmp->x = op->x + freearr_x[dir] + at->clone.x;
792     tmp->y = op->y + freearr_y[dir] + at->clone.y;
793     tmp->map = op->map;
794     if (head)
795     {
796     tmp->head = head;
797     prev->more = tmp;
798 root 1.8 }
799 root 1.11 if (!head)
800     head = tmp;
801     prev = tmp;
802     at = at->more;
803 root 1.8 }
804    
805 root 1.11 if (head->randomitems)
806     create_treasure (head->randomitems, head, GT_INVISIBLE, op->map->difficulty, 0);
807 root 1.8
808 root 1.11 insert_ob_in_map (head, op->map, op, 0);
809 root 1.8
810 root 1.11 /* thought it'd be cool to insert a burnout, too. */
811     tmp = get_archetype ("burnout");
812     tmp->map = op->map;
813     tmp->x = op->x + freearr_x[dir];
814     tmp->y = op->y + freearr_y[dir];
815     insert_ob_in_map (tmp, op->map, op, 0);
816 elmex 1.1 }
817     }
818    
819     /* peterm: function which summons hostile monsters and
820     * places them in nearby squares.
821     * op is the summoner.
822     * n is the number of monsters.
823     * monstername is the name of the monster.
824     * returns the number of monsters, which is basically n.
825     * it should really see how many it successfully replaced and
826     * return that instead.
827     * Note that this is not used by any spells (summon evil monsters
828     * use to call this, but best I can tell, that spell/ability was
829     * never used. This is however used by various failures on the
830     * players part (alchemy, reincarnation, etc)
831     */
832    
833 root 1.11 int
834     summon_hostile_monsters (object *op, int n, const char *monstername)
835     {
836     int i;
837    
838     for (i = 0; i < n; i++)
839     put_a_monster (op, monstername);
840 elmex 1.1
841 root 1.11 return n;
842 elmex 1.1 }
843    
844    
845     /* Some local definitions for shuffle-attack */
846 root 1.11 struct attacktype_shuffle
847     {
848     int attacktype;
849     int face;
850     } ATTACKS[22] =
851     {
852     {
853     AT_PHYSICAL, 0},
854     {
855     AT_PHYSICAL, 0}, /*face = explosion */
856     {
857     AT_PHYSICAL, 0},
858     {
859     AT_MAGIC, 1},
860     {
861     AT_MAGIC, 1}, /* face = last-burnout */
862     {
863     AT_MAGIC, 1},
864     {
865     AT_FIRE, 2},
866     {
867     AT_FIRE, 2}, /* face = fire.... */
868     {
869     AT_FIRE, 2},
870     {
871     AT_ELECTRICITY, 3},
872     {
873     AT_ELECTRICITY, 3}, /* ball_lightning */
874     {
875     AT_ELECTRICITY, 3},
876     {
877     AT_COLD, 4},
878     {
879     AT_COLD, 4}, /* face=icestorm */
880     {
881     AT_COLD, 4},
882     {
883     AT_CONFUSION, 5},
884     {
885     AT_POISON, 7},
886     {
887     AT_POISON, 7}, /* face = acid sphere. generator */
888     {
889     AT_POISON, 7}, /* poisoncloud face */
890     {
891     AT_SLOW, 8},
892     {
893     AT_PARALYZE, 9},
894     {
895     AT_FEAR, 10}};
896 elmex 1.1
897    
898    
899     /* shuffle_attack: peterm
900     * This routine shuffles the attack of op to one of the
901     * ones in the list. It does this at random. It also
902     * chooses a face appropriate to the attack that is
903     * being committed by that square at the moment.
904     * right now it's being used by color spray and create pool of
905     * chaos.
906     * This could really be a better implementation - the
907     * faces and attacktypes above are hardcoded, which is never
908     * good. The faces refer to faces in the animation sequence.
909     * Not sure how to do better - but not having it hardcoded
910     * would be nice.
911     * I also fixed a bug here in that attacktype was |= -
912     * to me, that would be that it would quickly get all
913     * attacktypes, which probably wasn't the intent. MSW 2003-06-03
914     */
915 root 1.11 void
916     shuffle_attack (object *op, int change_face)
917 elmex 1.1 {
918 root 1.11 int i;
919 elmex 1.1
920 root 1.11 i = rndm (0, 21);
921 elmex 1.1
922 root 1.11 op->attacktype = ATTACKS[i].attacktype | AT_MAGIC;
923    
924     if (change_face)
925     {
926     SET_ANIMATION (op, ATTACKS[i].face);
927 elmex 1.1 }
928     }
929    
930    
931     /* prayer_failure: This is called when a player fails
932     * at casting a prayer.
933     * op is the player.
934     * failure is basically how much grace they had.
935     * power is how much grace the spell would normally take to cast.
936     */
937    
938 root 1.11 void
939     prayer_failure (object *op, int failure, int power)
940     {
941     const char *godname;
942     object *tmp;
943 elmex 1.1
944 root 1.11 if (!strcmp ((godname = determine_god (op)), "none"))
945     godname = "Your spirit";
946 elmex 1.1
947 root 1.11 if (failure <= -20 && failure > -40) /* wonder */
948 elmex 1.1 {
949 root 1.11 new_draw_info_format (NDI_UNIQUE, 0, op, "%s gives a sign to renew your faith.", godname);
950     tmp = get_archetype (SPELL_WONDER);
951     cast_cone (op, op, 0, tmp);
952 root 1.20 tmp->destroy ();
953 elmex 1.1 }
954    
955 root 1.11 else if (failure <= -40 && failure > -60) /* confusion */
956 elmex 1.1 {
957 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your diety touches your mind!");
958     confuse_player (op, op, 99);
959 elmex 1.1 }
960 root 1.11 else if (failure <= -60 && failure > -150) /* paralysis */
961 elmex 1.1 {
962 root 1.11 new_draw_info_format (NDI_UNIQUE, 0, op, "%s requires you to pray NOW.", godname);
963     new_draw_info (NDI_UNIQUE, 0, op, "You comply, ignoring all else.");
964     paralyze_player (op, op, 99);
965 elmex 1.1 }
966 root 1.11 else if (failure <= -150) /* blast the immediate area */
967     {
968     tmp = get_archetype (GOD_POWER);
969     new_draw_info_format (NDI_UNIQUE, 0, op, "%s smites you!", godname);
970     cast_magic_storm (op, tmp, power);
971 elmex 1.1 }
972     }
973    
974     /*
975     * spell_failure() handles the various effects for differing degrees
976     * of failure badness.
977     * op is the player that failed.
978     * failure is a random value of how badly you failed.
979     * power is how many spellpoints you'd normally need for the spell.
980     * skill is the skill you'd need to cast the spell.
981     */
982    
983 root 1.11 void
984     spell_failure (object *op, int failure, int power, object *skill)
985     {
986     object *tmp;
987 elmex 1.1
988 root 1.11 if (settings.spell_failure_effects == FALSE)
989     return;
990 elmex 1.1
991 root 1.11 if (failure <= -20 && failure > -40) /* wonder */
992 elmex 1.1 {
993 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your spell causes an unexpected effect.");
994     tmp = get_archetype (SPELL_WONDER);
995     cast_cone (op, op, 0, tmp);
996 root 1.20 tmp->destroy ();
997 elmex 1.1 }
998    
999 root 1.11 else if (failure <= -40 && failure > -60) /* confusion */
1000 elmex 1.1 {
1001 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your magic recoils on you, making you confused!");
1002     confuse_player (op, op, 99);
1003 elmex 1.1 }
1004 root 1.11 else if (failure <= -60 && failure > -80) /* paralysis */
1005 elmex 1.1 {
1006 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your magic stuns you!");
1007     paralyze_player (op, op, 99);
1008 elmex 1.1 }
1009 root 1.11 else if (failure <= -80) /* blast the immediate area */
1010     {
1011     object *tmp;
1012 root 1.8
1013 root 1.11 /* Safety check to make sure we don't get any mana storms in scorn */
1014     if (get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_MAGIC)
1015     {
1016     new_draw_info (NDI_UNIQUE, 0, op, "The magic warps and you are turned inside out!");
1017     hit_player (op, 9998, op, AT_INTERNAL, 1);
1018 root 1.8
1019 root 1.11 }
1020     else
1021     {
1022     new_draw_info (NDI_UNIQUE, 0, op, "You lose control of the mana! The uncontrolled magic blasts you!");
1023     tmp = get_archetype (LOOSE_MANA);
1024     tmp->level = skill->level;
1025     tmp->x = op->x;
1026     tmp->y = op->y;
1027    
1028     /* increase the area of destruction a little for more powerful spells */
1029     tmp->range += isqrt (power);
1030    
1031     if (power > 25)
1032     tmp->stats.dam = 25 + isqrt (power);
1033     else
1034     tmp->stats.dam = power; /* nasty recoils! */
1035 root 1.8
1036 root 1.11 tmp->stats.maxhp = tmp->count;
1037     insert_ob_in_map (tmp, op->map, NULL, 0);
1038 root 1.8 }
1039 elmex 1.1 }
1040     }
1041    
1042 root 1.11 int
1043     cast_party_spell (object *op, object *caster, int dir, object *spell_ob, char *stringarg)
1044     {
1045     int success;
1046     player *pl;
1047     object *spell;
1048    
1049     if (!spell_ob->other_arch)
1050 elmex 1.1 {
1051 root 1.11 LOG (llevError, "cast_party_spell: empty other arch\n");
1052     return 0;
1053     }
1054     spell = arch_to_object (spell_ob->other_arch);
1055 elmex 1.1
1056 root 1.11 /* Always cast spell on caster */
1057     success = cast_spell (op, caster, dir, spell, stringarg);
1058 elmex 1.1
1059 root 1.11 if (caster->contr->party == NULL)
1060     {
1061 root 1.19 spell->remove ();
1062 root 1.11 return success;
1063 elmex 1.1 }
1064 root 1.27 for_all_players (pl)
1065 root 1.11 if ((pl->ob->contr->party == caster->contr->party) && (on_same_map (pl->ob, caster)))
1066     {
1067     cast_spell (pl->ob, caster, pl->ob->facing, spell, stringarg);
1068     }
1069 root 1.19 spell->remove ();
1070 root 1.11 return success;
1071     }
1072 elmex 1.1
1073     /* This is where the main dispatch when someone casts a spell.
1074     *
1075     * op is the creature that is owner of the object that is casting the spell -
1076     * eg, the player or monster.
1077     * caster is the actual object (wand, potion) casting the spell. can be
1078     * same as op.
1079     * dir is the direction to cast in. Note in some cases, if the spell
1080     * is self only, dir really doesn't make a difference.
1081     * spell_ob is the spell object that is being cast. From that,
1082     * we can determine what to do.
1083     * stringarg is any options that are being used. It can be NULL. Almost
1084     * certainly, only players will set it. It is basically used as optional
1085     * parameters to a spell (eg, item to create, information for marking runes,
1086     * etc.
1087     * returns 1 on successful cast, or 0 on error. These values should really
1088     * be swapped, so that 0 is successful, and non zero is failure, with a code
1089     * of what it failed.
1090     *
1091     * Note that this function is really a dispatch routine that calls other
1092     * functions - it just blindly returns what ever value those functions
1093     * return. So if your writing a new function that is called from this,
1094     * it shoudl also return 1 on success, 0 on failure.
1095     *
1096     * if it is a player casting the spell (op->type == PLAYER, op == caster),
1097     * this function will decrease the mana/grace appropriately. For other
1098     * objects, the caller should do what it considers appropriate.
1099     */
1100    
1101 root 1.11 int
1102     cast_spell (object *op, object *caster, int dir, object *spell_ob, char *stringarg)
1103     {
1104     const char *godname;
1105     int success = 0, mflags, cast_level = 0, old_shoottype;
1106     object *skill = NULL;
1107 elmex 1.1
1108 root 1.11 old_shoottype = op->contr ? op->contr->shoottype : 0;
1109 elmex 1.1
1110 root 1.11 if (!spell_ob)
1111     {
1112     LOG (llevError, "cast_spell: null spell object passed\n");
1113     return 0;
1114 elmex 1.1 }
1115 root 1.13
1116 root 1.11 if (!strcmp ((godname = determine_god (op)), "none"))
1117     godname = "A random spirit";
1118 elmex 1.1
1119 root 1.11 /* the caller should set caster to op if appropriate */
1120     if (!caster)
1121     {
1122     LOG (llevError, "cast_spell: null caster object passed\n");
1123     return 0;
1124 elmex 1.1 }
1125    
1126 root 1.11 /* if caster is a spell casting object, this normally shouldn't be
1127     * an issue, because they don't have any spellpaths set up.
1128     */
1129 root 1.18 if (caster->path_denied & spell_ob->path_attuned && !QUERY_FLAG (caster, FLAG_WIZCAST))
1130 root 1.11 {
1131     new_draw_info (NDI_UNIQUE, 0, op, "That spell path is denied to you.");
1132     return 0;
1133 elmex 1.1 }
1134    
1135 root 1.11 /* if it is a player casting the spell, and they are really casting it
1136     * (vs it coming from a wand, scroll, or whatever else), do some
1137     * checks. We let monsters do special things - eg, they
1138     * don't need the skill, bypass level checks, etc. The monster function
1139     * should take care of that.
1140     * Remove the wiz check here and move it further down - some spells
1141     * need to have the right skill pointer passed, so we need to
1142     * at least process that code.
1143     */
1144     if (op->type == PLAYER && op == caster)
1145     {
1146     cast_level = caster_level (caster, spell_ob);
1147     if (spell_ob->skill)
1148     {
1149     skill = find_skill_by_name (op, spell_ob->skill);
1150     if (!skill)
1151     {
1152     new_draw_info_format (NDI_UNIQUE, 0, op, "You need the skill %s to cast %s.", &spell_ob->skill, &spell_ob->name);
1153     return 0;
1154 root 1.8 }
1155 root 1.11 if (min_casting_level (op, spell_ob) > cast_level && !QUERY_FLAG (op, FLAG_WIZ))
1156     {
1157     new_draw_info (NDI_UNIQUE, 0, op, "You lack enough skill to cast that spell.");
1158     return 0;
1159 root 1.8 }
1160     }
1161 root 1.11 /* If the caster is the wiz, they don't ever fail, and don't have
1162     * to have sufficient grace/mana.
1163     */
1164     if (!QUERY_FLAG (op, FLAG_WIZ))
1165     {
1166     if (SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA) &&
1167     SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA) > op->stats.sp)
1168     {
1169     new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough mana.");
1170     return 0;
1171 root 1.8 }
1172 root 1.11 if (SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) &&
1173     SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) > op->stats.grace)
1174     {
1175     if (random_roll (0, op->stats.Wis - 1, op, PREFER_HIGH) + op->stats.grace -
1176     10 * SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) / op->stats.maxgrace > 0)
1177     {
1178     new_draw_info_format (NDI_UNIQUE, 0, op, "%s grants your prayer, though you are unworthy.", godname);
1179 root 1.8 }
1180 root 1.11 else
1181     {
1182     prayer_failure (op, op->stats.grace, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) - op->stats.grace);
1183     new_draw_info_format (NDI_UNIQUE, 0, op, "%s ignores your prayer.", godname);
1184     return 0;
1185 root 1.8 }
1186     }
1187    
1188 root 1.11 /* player/monster is trying to cast the spell. might fumble it */
1189     if (spell_ob->stats.grace && random_roll (0, 99, op, PREFER_HIGH) <
1190     (spell_ob->level / (float) MAX (1, op->level) * cleric_chance[op->stats.Wis]))
1191     {
1192     play_sound_player_only (op->contr, SOUND_FUMBLE_SPELL, 0, 0);
1193     new_draw_info (NDI_UNIQUE, 0, op, "You fumble the spell.");
1194     if (settings.casting_time == TRUE)
1195     {
1196     op->casting_time = -1;
1197 root 1.8 }
1198 root 1.11 op->stats.grace -= random_roll (1, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE), op, PREFER_LOW);
1199     return 0;
1200     }
1201     else if (spell_ob->stats.sp)
1202     {
1203     int failure = random_roll (0, 199, op, PREFER_HIGH) - op->contr->encumbrance + op->level - spell_ob->level + 35;
1204    
1205     if (failure < 0)
1206     {
1207     new_draw_info (NDI_UNIQUE, 0, op, "You bungle the spell because you have too much heavy equipment in use.");
1208     if (settings.spell_failure_effects == TRUE)
1209     spell_failure (op, failure, SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA), skill);
1210     op->contr->shoottype = (rangetype) old_shoottype;
1211     op->stats.sp -= random_roll (0, SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA), op, PREFER_LOW);
1212     return 0;
1213 root 1.8 }
1214     }
1215     }
1216 elmex 1.1 }
1217    
1218 root 1.11 mflags = get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL);
1219    
1220     /* See if we can cast a spell here. If the caster and op are
1221     * not alive, then this would mean that the mapmaker put the
1222     * objects on the space - presume that they know what they are
1223     * doing.
1224     */
1225 elmex 1.9
1226 root 1.11 if ((mflags & P_SAFE) && !QUERY_FLAG (op, FLAG_WIZCAST)) // There is _ABSOLUTELY_ no magic allowed here (except wizards :-)!
1227     {
1228     new_draw_info (NDI_UNIQUE, 0, op, "This ground is sacred! The gods prevent any magical effects done by you here!.");
1229     return 0;
1230     }
1231    
1232     if ((spell_ob->type == SPELL)
1233     && (caster->type != POTION)
1234     && !QUERY_FLAG (op, FLAG_WIZCAST)
1235     && (QUERY_FLAG (caster, FLAG_ALIVE)
1236     || QUERY_FLAG (op, FLAG_ALIVE))
1237     && (((mflags & P_NO_MAGIC) && spell_ob->stats.sp) || ((mflags & P_NO_CLERIC) && spell_ob->stats.grace)))
1238     {
1239     if (op->type != PLAYER)
1240 elmex 1.9 return 0;
1241    
1242 root 1.11 if ((mflags & P_NO_CLERIC) && spell_ob->stats.grace)
1243     new_draw_info_format (NDI_UNIQUE, 0, op, "This ground is unholy! %s ignores you.", godname);
1244     else
1245     switch (op->contr->shoottype)
1246     {
1247 root 1.12 case range_magic:
1248     new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your spellcasting.");
1249     break;
1250     case range_misc:
1251     new_draw_info (NDI_UNIQUE, 0, op, "Something blocks the magic of your item.");
1252     break;
1253     case range_golem:
1254     new_draw_info (NDI_UNIQUE, 0, op, "Something blocks the magic of your scroll.");
1255     break;
1256     default:
1257     break;
1258 root 1.11 }
1259     return 0;
1260     }
1261 elmex 1.1
1262 root 1.11 if (caster == op && settings.casting_time == TRUE && spell_ob->type == SPELL)
1263     {
1264     if (op->casting_time == -1)
1265     { /* begin the casting */
1266     op->casting_time = (sint16) (spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob));
1267     op->spell = spell_ob;
1268     /* put the stringarg into the object struct so that when the
1269     * spell is actually cast, it knows about the stringarg.
1270     * necessary for the invoke command spells.
1271     */
1272     if (stringarg)
1273 elmex 1.2 {
1274 root 1.22 op->spellarg = strdup (stringarg);
1275 root 1.8 }
1276 root 1.11 else
1277     op->spellarg = NULL;
1278     return 0;
1279 root 1.8 }
1280 root 1.11 else if (op->casting_time != 0)
1281     {
1282     if (op->type == PLAYER)
1283     new_draw_info (NDI_UNIQUE, 0, op, "You are casting!");
1284     return 0;
1285 root 1.8 }
1286 root 1.11 else
1287     { /* casting_time == 0 */
1288     op->casting_time = -1;
1289     spell_ob = op->spell;
1290     stringarg = op->spellarg;
1291     }
1292     }
1293     else
1294     {
1295     /* Take into account how long it takes to cast the spell.
1296     * if the player is casting it, then we use the time in
1297     * the spell object. If it is a spell object, have it
1298     * take two ticks. Things that cast spells on the players
1299     * behalf (eg, altars, and whatever else) shouldn't cost
1300     * the player any time.
1301     * Ignore casting time for firewalls
1302     */
1303     if (caster == op && caster->type != FIREWALL)
1304     {
1305     op->speed_left -= spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed);
1306     /* Other portions of the code may also decrement the speed of the player, so
1307     * put a lower limit so that the player isn't stuck here too long
1308     */
1309     if ((spell_ob->casting_time > 0) && op->speed_left < -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed))
1310     op->speed_left = -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed);
1311     }
1312     else if (caster->type == WAND || caster->type == HORN || caster->type == ROD || caster->type == POTION || caster->type == SCROLL)
1313     {
1314     op->speed_left -= 2 * FABS (op->speed);
1315 root 1.8 }
1316 elmex 1.1 }
1317    
1318 root 1.11 if (op->type == PLAYER && op == caster)
1319     {
1320     op->stats.grace -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE);
1321     op->stats.sp -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA);
1322 elmex 1.1 }
1323    
1324 root 1.11 /* We want to try to find the skill to properly credit exp.
1325     * for spell casting objects, the exp goes to the skill the casting
1326     * object requires.
1327     */
1328     if (op != caster && !skill && caster->skill)
1329     {
1330     skill = find_skill_by_name (op, caster->skill);
1331     if (!skill)
1332     {
1333     new_draw_info_format (NDI_UNIQUE, 0, op, "You lack the skill %s to use the %s", &caster->skill, query_name (caster));
1334     return 0;
1335 root 1.8 }
1336 root 1.11 change_skill (op, skill, 0); /* needed for proper exp credit */
1337 elmex 1.1 }
1338    
1339 root 1.11 switch (spell_ob->subtype)
1340     {
1341 root 1.12 /* The order of case statements is same as the order they show up
1342     * in in spells.h.
1343     */
1344     case SP_RAISE_DEAD:
1345     success = cast_raise_dead_spell (op, caster, spell_ob, dir, stringarg);
1346     break;
1347    
1348     case SP_RUNE:
1349     success = write_rune (op, caster, spell_ob, dir, stringarg);
1350     break;
1351    
1352     case SP_MAKE_MARK:
1353     success = write_mark (op, spell_ob, stringarg);
1354     break;
1355    
1356     case SP_BOLT:
1357     success = fire_bolt (op, caster, dir, spell_ob, skill);
1358     break;
1359    
1360     case SP_BULLET:
1361     success = fire_bullet (op, caster, dir, spell_ob);
1362     break;
1363    
1364     case SP_CONE:
1365     success = cast_cone (op, caster, dir, spell_ob);
1366     break;
1367    
1368     case SP_BOMB:
1369     success = create_bomb (op, caster, dir, spell_ob);
1370     break;
1371    
1372     case SP_WONDER:
1373     success = cast_wonder (op, caster, dir, spell_ob);
1374     break;
1375    
1376     case SP_SMITE:
1377     success = cast_smite_spell (op, caster, dir, spell_ob);
1378     break;
1379    
1380     case SP_MAGIC_MISSILE:
1381     success = fire_arch_from_position (op, caster, op->x + freearr_x[dir], op->y + freearr_y[dir], dir, spell_ob);
1382     break;
1383    
1384     case SP_SUMMON_GOLEM:
1385     success = summon_golem (op, caster, dir, spell_ob);
1386     old_shoottype = range_golem;
1387     break;
1388    
1389     case SP_DIMENSION_DOOR:
1390     /* dimension door needs the actual caster, because that is what is
1391     * moved.
1392     */
1393     success = dimension_door (op, caster, spell_ob, dir);
1394     break;
1395 root 1.8
1396 root 1.12 case SP_MAGIC_MAPPING:
1397     if (op->type == PLAYER)
1398     {
1399     spell_effect (spell_ob, op->x, op->y, op->map, op);
1400     draw_magic_map (op);
1401     success = 1;
1402     }
1403     else
1404     success = 0;
1405     break;
1406 elmex 1.1
1407 root 1.12 case SP_MAGIC_WALL:
1408     success = magic_wall (op, caster, dir, spell_ob);
1409     break;
1410 root 1.8
1411 root 1.12 case SP_DESTRUCTION:
1412     success = cast_destruction (op, caster, spell_ob);
1413     break;
1414 root 1.8
1415 root 1.12 case SP_PERCEIVE_SELF:
1416     success = perceive_self (op);
1417     break;
1418 root 1.8
1419 root 1.12 case SP_WORD_OF_RECALL:
1420     success = cast_word_of_recall (op, caster, spell_ob);
1421     break;
1422 root 1.8
1423 root 1.12 case SP_INVISIBLE:
1424     success = cast_invisible (op, caster, spell_ob);
1425     break;
1426 root 1.8
1427 root 1.12 case SP_PROBE:
1428     success = probe (op, caster, spell_ob, dir);
1429     break;
1430 root 1.8
1431 root 1.12 case SP_HEALING:
1432     success = cast_heal (op, caster, spell_ob, dir);
1433     break;
1434 root 1.8
1435 root 1.12 case SP_CREATE_FOOD:
1436     success = cast_create_food (op, caster, spell_ob, dir, stringarg);
1437     break;
1438 root 1.8
1439 root 1.12 case SP_EARTH_TO_DUST:
1440     success = cast_earth_to_dust (op, caster, spell_ob);
1441     break;
1442 root 1.8
1443 root 1.12 case SP_CHANGE_ABILITY:
1444     success = cast_change_ability (op, caster, spell_ob, dir, 0);
1445     break;
1446 root 1.8
1447 root 1.12 case SP_BLESS:
1448     success = cast_bless (op, caster, spell_ob, dir);
1449     break;
1450 root 1.8
1451 root 1.12 case SP_CURSE:
1452     success = cast_curse (op, caster, spell_ob, dir);
1453     break;
1454 root 1.8
1455 root 1.12 case SP_SUMMON_MONSTER:
1456     success = summon_object (op, caster, spell_ob, dir, stringarg);
1457     break;
1458 root 1.8
1459 root 1.12 case SP_CHARGING:
1460     success = recharge (op, caster, spell_ob);
1461     break;
1462 root 1.8
1463 root 1.12 case SP_POLYMORPH:
1464 elmex 1.1 #ifdef NO_POLYMORPH
1465 root 1.12 /* Not great, but at least provide feedback so if players do have
1466     * polymorph (ie, find it as a preset item or left over from before
1467     * it was disabled), they get some feedback.
1468     */
1469     new_draw_info (NDI_UNIQUE, 0, op, "The spell fizzles");
1470     success = 0;
1471 elmex 1.1 #else
1472 root 1.12 success = cast_polymorph (op, caster, spell_ob, dir);
1473 elmex 1.1 #endif
1474 root 1.12 break;
1475 root 1.8
1476 root 1.12 case SP_ALCHEMY:
1477     success = alchemy (op, caster, spell_ob);
1478     break;
1479    
1480     case SP_REMOVE_CURSE:
1481     success = remove_curse (op, caster, spell_ob);
1482     break;
1483    
1484     case SP_IDENTIFY:
1485     success = cast_identify (op, caster, spell_ob);
1486     break;
1487    
1488     case SP_DETECTION:
1489     success = cast_detection (op, caster, spell_ob, skill);
1490     break;
1491    
1492     case SP_MOOD_CHANGE:
1493     success = mood_change (op, caster, spell_ob);
1494     break;
1495 elmex 1.1
1496 root 1.12 case SP_MOVING_BALL:
1497     if (spell_ob->path_repelled && (spell_ob->path_repelled & caster->path_attuned) != spell_ob->path_repelled)
1498     {
1499     new_draw_info_format (NDI_UNIQUE, 0, op, "You lack the proper attunement to cast %s", &spell_ob->name);
1500     success = 0;
1501     }
1502     else
1503     success = fire_arch_from_position (op, caster, op->x + freearr_x[dir], op->y + freearr_y[dir], dir, spell_ob);
1504     break;
1505 elmex 1.1
1506 root 1.12 case SP_SWARM:
1507     success = fire_swarm (op, caster, spell_ob, dir);
1508     break;
1509    
1510     case SP_CHANGE_MANA:
1511     success = cast_transfer (op, caster, spell_ob, dir);
1512     break;
1513    
1514     case SP_DISPEL_RUNE:
1515     /* in rune.c */
1516     success = dispel_rune (op, caster, spell_ob, skill, dir);
1517     break;
1518    
1519     case SP_CREATE_MISSILE:
1520     success = cast_create_missile (op, caster, spell_ob, dir, stringarg);
1521     break;
1522    
1523     case SP_CONSECRATE:
1524     success = cast_consecrate (op, caster, spell_ob);
1525     break;
1526    
1527     case SP_ANIMATE_WEAPON:
1528     success = animate_weapon (op, caster, spell_ob, dir);
1529     old_shoottype = range_golem;
1530     break;
1531    
1532     case SP_LIGHT:
1533     success = cast_light (op, caster, spell_ob, dir);
1534     break;
1535    
1536     case SP_CHANGE_MAP_LIGHT:
1537     success = cast_change_map_lightlevel (op, caster, spell_ob);
1538     break;
1539    
1540     case SP_FAERY_FIRE:
1541     success = cast_destruction (op, caster, spell_ob);
1542     break;
1543    
1544     case SP_CAUSE_DISEASE:
1545     success = cast_cause_disease (op, caster, spell_ob, dir);
1546     break;
1547    
1548     case SP_AURA:
1549     success = create_aura (op, caster, spell_ob);
1550     break;
1551    
1552     case SP_TOWN_PORTAL:
1553     success = cast_create_town_portal (op, caster, spell_ob, dir);
1554     break;
1555    
1556     case SP_PARTY_SPELL:
1557     success = cast_party_spell (op, caster, dir, spell_ob, stringarg);
1558     break;
1559    
1560     default:
1561     if (!INVOKE_OBJECT (CAST_SPELL, spell_ob, ARG_OBJECT (op), ARG_OBJECT (caster), ARG_INT (dir), ARG_STRING (stringarg)))
1562     LOG (llevError, "cast_spell: Unhandled spell subtype %d\n", spell_ob->subtype);
1563 elmex 1.1 }
1564    
1565 root 1.11 /* FIXME - we need some better sound suppport */
1566     // yes, for example, augment map info with the spell effect
1567     // so clients can calculate the sounds themselves
1568     //play_sound_map(op->map, op->x, op->y, SOUND_CAST_SPELL_0 + spell_ob->subtype);
1569 elmex 1.1
1570 root 1.11 /* free the spell arg */
1571     if (settings.casting_time == TRUE && stringarg)
1572     {
1573     free (stringarg);
1574     stringarg = NULL;
1575 elmex 1.1 }
1576 root 1.11 /* perhaps a bit of a hack, but if using a wand, it has to change the skill
1577     * to something like use_magic_item, but you really want to be able to fire
1578     * it again.
1579     */
1580     if (op->contr)
1581     op->contr->shoottype = (rangetype) old_shoottype;
1582 elmex 1.1
1583 root 1.11 return success;
1584 elmex 1.1 }
1585    
1586    
1587     /* This is called from time.c/process_object(). That function
1588     * calls this for any SPELL_EFFECT type objects. This function
1589     * then dispatches them to the appropriate specific routines.
1590     */
1591 root 1.11 void
1592     move_spell_effect (object *op)
1593     {
1594     switch (op->subtype)
1595     {
1596 root 1.12 case SP_BOLT:
1597     move_bolt (op);
1598     break;
1599    
1600     case SP_BULLET:
1601     move_bullet (op);
1602     break;
1603    
1604     case SP_EXPLOSION:
1605     explosion (op);
1606     break;
1607    
1608     case SP_CONE:
1609     move_cone (op);
1610     break;
1611    
1612     case SP_BOMB:
1613     animate_bomb (op);
1614     break;
1615    
1616     case SP_MAGIC_MISSILE:
1617     move_missile (op);
1618     break;
1619    
1620     case SP_WORD_OF_RECALL:
1621     execute_word_of_recall (op);
1622     break;
1623    
1624     case SP_MOVING_BALL:
1625     move_ball_spell (op);
1626     break;
1627    
1628     case SP_SWARM:
1629     move_swarm_spell (op);
1630     break;
1631    
1632     case SP_AURA:
1633     move_aura (op);
1634     break;
1635 elmex 1.1 }
1636     }
1637    
1638     /* this checks to see if something special should happen if
1639     * something runs into the object.
1640     */
1641 root 1.11 void
1642     check_spell_effect (object *op)
1643     {
1644     switch (op->subtype)
1645     {
1646 root 1.12 case SP_BOLT:
1647     move_bolt (op);
1648     return;
1649    
1650     case SP_BULLET:
1651     check_bullet (op);
1652     return;
1653 elmex 1.1 }
1654     }
1655    
1656     /* This is called by move_apply. Basically, if someone
1657     * moves onto a spell effect and the walk_on or fly_on flags
1658     * are set, this is called. This should only be called for
1659     * objects of the appropraite type.
1660     */
1661 root 1.11 void
1662     apply_spell_effect (object *spell, object *victim)
1663 elmex 1.1 {
1664 root 1.11 switch (spell->subtype)
1665     {
1666 root 1.12 case SP_CONE:
1667     if (QUERY_FLAG (victim, FLAG_ALIVE) && spell->speed && spell->attacktype)
1668     hit_player (victim, spell->stats.dam, spell, spell->attacktype, 0);
1669     break;
1670 root 1.8
1671 root 1.12 case SP_MAGIC_MISSILE:
1672     if (QUERY_FLAG (victim, FLAG_ALIVE))
1673     {
1674 root 1.16 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1675 root 1.11
1676 root 1.16 if (!spell->destroyed ())
1677 root 1.20 spell->destroy ();
1678 root 1.12 }
1679     break;
1680 root 1.8
1681 root 1.12 case SP_MOVING_BALL:
1682     if (QUERY_FLAG (victim, FLAG_ALIVE))
1683     hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1684     else if (victim->material || victim->materialname)
1685     save_throw_object (victim, spell->attacktype, spell);
1686     break;
1687 elmex 1.1 }
1688     }