ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.45
Committed: Thu May 17 00:33:29 2007 UTC (17 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.44: +12 -12 lines
Log Message:
- do not require an item for the use magic item skill.
  thats because it is often used for "misc" objects such as scrolls,
  which do not get applied as ranged weapons. not requiring an item
  is not likely to be a big deal anyways.

File Contents

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