ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.54
Committed: Sun Jul 1 05:00:20 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.53: +10 -11 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

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