ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.42
Committed: Mon Apr 30 04:25:30 2007 UTC (17 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.41: +7 -31 lines
Log Message:
This is the first rough cut of the skill use system (use the STABLE tag).

Details will likely change, and combat skills do not work very well, but
it works quite well.

Players no longer have a shoottype or range slots, instead, each player
has these members:

   combat_skill/combat_ob  the currently selected skill (and weapon)
                           for direct attacks.
   ranged_skill/ranged_ob  the currently selected ranged skill (and
                           bow/spell/item)
   golem                   the currently-controlled golem, if any.

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     {
633     rod->stats.hp += 1 + rod->stats.maxhp / 10;
634 elmex 1.1
635 root 1.11 if (rod->stats.hp > rod->stats.maxhp)
636     rod->stats.hp = rod->stats.maxhp;
637 elmex 1.1 }
638     }
639    
640    
641 root 1.11 void
642     drain_rod_charge (object *rod)
643     {
644     rod->stats.hp -= SP_level_spellpoint_cost (rod, rod->inv, SPELL_HIGHEST);
645 elmex 1.1 }
646    
647     /* this function is commonly used to find a friendly target for
648     * spells such as heal or protection or armour
649     * op is what is looking for the target (which can be a player),
650     * dir is the direction we are looking in. Return object found, or
651     * NULL if no good object.
652     */
653 root 1.11 object *
654     find_target_for_friendly_spell (object *op, int dir)
655     {
656     object *tmp;
657    
658     /* I don't really get this block - if op isn't a player or rune,
659     * we then make the owner of this object the target.
660     * The owner could very well be no where near op.
661     */
662     if (op->type != PLAYER && op->type != RUNE)
663     {
664 root 1.21 tmp = op->owner;
665 root 1.11 /* If the owner does not exist, or is not a monster, than apply the spell
666     * to the caster.
667     */
668     if (!tmp || !QUERY_FLAG (tmp, FLAG_MONSTER))
669     tmp = op;
670 elmex 1.1 }
671 root 1.11 else
672     {
673 root 1.37 maptile *m = op->map;
674     sint16 x = op->x + freearr_x[dir];
675     sint16 y = op->y + freearr_y[dir];
676    
677     tmp = xy_normalise (m, x, y)
678     ? m->at (x, y).player ()
679     : 0;
680 root 1.11 }
681 root 1.26
682 root 1.11 /* didn't find a player there, look in current square for a player */
683 root 1.26 if (!tmp)
684     tmp = op->ms ().player ();
685 elmex 1.1
686 root 1.11 return tmp;
687 elmex 1.1 }
688    
689    
690    
691     /* raytrace:
692     * spell_find_dir(map, x, y, exclude) will search first the center square
693     * then some close squares in the given map at the given coordinates for
694     * live objects.
695     * It will not consider the object given as exclude (= caster) among possible
696     * live objects. If the caster is a player, the spell will go after
697     * monsters/generators only. If not, the spell will hunt players only.
698     * It returns the direction toward the first/closest live object if it finds
699     * any, otherwise -1.
700     * note that exclude can be NULL, in which case all bets are off.
701     */
702    
703 root 1.11 int
704 root 1.17 spell_find_dir (maptile *m, int x, int y, object *exclude)
705 root 1.11 {
706     int i, max = SIZEOFFREE;
707     sint16 nx, ny;
708     int owner_type = 0, mflags;
709     object *tmp;
710 root 1.17 maptile *mp;
711 root 1.11
712     if (exclude && exclude->head)
713     exclude = exclude->head;
714     if (exclude && exclude->type)
715     owner_type = exclude->type;
716    
717     for (i = rndm (1, 8); i < max; i++)
718     {
719     nx = x + freearr_x[i];
720     ny = y + freearr_y[i];
721     mp = m;
722     mflags = get_map_flags (m, &mp, nx, ny, &nx, &ny);
723     if (mflags & (P_OUT_OF_MAP | P_BLOCKSVIEW))
724     continue;
725    
726 root 1.24 tmp = GET_MAP_OB (mp, nx, ny);
727 root 1.11
728     while (tmp != NULL && (((owner_type == PLAYER &&
729     !QUERY_FLAG (tmp, FLAG_MONSTER) && !QUERY_FLAG (tmp, FLAG_GENERATOR)) ||
730     (owner_type != PLAYER && tmp->type != PLAYER)) || (tmp == exclude || (tmp->head && tmp->head == exclude))))
731     tmp = tmp->above;
732 elmex 1.1
733 root 1.11 if (tmp != NULL && can_see_monsterP (m, x, y, i))
734     return freedir[i];
735 elmex 1.1 }
736 root 1.11 return -1; /* flag for "keep going the way you were" */
737 elmex 1.1 }
738    
739     /* put_a_monster: puts a monster named monstername near by
740     * op. This creates the treasures for the monsters, and
741     * also deals with multipart monsters properly.
742     */
743 root 1.11 void
744     put_a_monster (object *op, const char *monstername)
745     {
746     object *tmp, *head = NULL, *prev = NULL;
747     archetype *at;
748     int dir;
749    
750     /* Handle cases where we are passed a bogus mosntername */
751    
752 root 1.14 if ((at = archetype::find (monstername)) == NULL)
753 root 1.11 return;
754    
755     /* find a free square nearby
756     * first we check the closest square for free squares
757     */
758    
759     dir = find_first_free_spot (&at->clone, op->map, op->x, op->y);
760     if (dir != -1)
761     {
762     /* This is basically grabbed for generate monster. Fixed 971225 to
763     * insert multipart monsters properly
764     */
765     while (at != NULL)
766     {
767     tmp = arch_to_object (at);
768     tmp->x = op->x + freearr_x[dir] + at->clone.x;
769     tmp->y = op->y + freearr_y[dir] + at->clone.y;
770     tmp->map = op->map;
771     if (head)
772     {
773     tmp->head = head;
774     prev->more = tmp;
775 root 1.8 }
776 root 1.11 if (!head)
777     head = tmp;
778     prev = tmp;
779     at = at->more;
780 root 1.8 }
781    
782 root 1.11 if (head->randomitems)
783     create_treasure (head->randomitems, head, GT_INVISIBLE, op->map->difficulty, 0);
784 root 1.8
785 root 1.11 insert_ob_in_map (head, op->map, op, 0);
786 root 1.8
787 root 1.11 /* thought it'd be cool to insert a burnout, too. */
788 root 1.29 op->map->insert (get_archetype ("burnout"), op->x + freearr_x[dir], op->y + freearr_y[dir], op);
789 elmex 1.1 }
790     }
791    
792     /* peterm: function which summons hostile monsters and
793     * places them in nearby squares.
794     * op is the summoner.
795     * n is the number of monsters.
796     * monstername is the name of the monster.
797     * returns the number of monsters, which is basically n.
798     * it should really see how many it successfully replaced and
799     * return that instead.
800     * Note that this is not used by any spells (summon evil monsters
801     * use to call this, but best I can tell, that spell/ability was
802     * never used. This is however used by various failures on the
803     * players part (alchemy, reincarnation, etc)
804     */
805    
806 root 1.11 int
807     summon_hostile_monsters (object *op, int n, const char *monstername)
808     {
809     int i;
810    
811     for (i = 0; i < n; i++)
812     put_a_monster (op, monstername);
813 elmex 1.1
814 root 1.11 return n;
815 elmex 1.1 }
816    
817    
818     /* Some local definitions for shuffle-attack */
819 root 1.11 struct attacktype_shuffle
820     {
821     int attacktype;
822     int face;
823     } ATTACKS[22] =
824     {
825 root 1.41 { AT_PHYSICAL, 0},
826     { AT_PHYSICAL, 0}, /*face = explosion */
827     { AT_PHYSICAL, 0},
828     { AT_MAGIC, 1},
829     { AT_MAGIC, 1}, /* face = last-burnout */
830     { AT_MAGIC, 1},
831     { AT_FIRE, 2},
832     { AT_FIRE, 2}, /* face = fire.... */
833     { AT_FIRE, 2},
834     { AT_ELECTRICITY, 3},
835     { AT_ELECTRICITY, 3}, /* ball_lightning */
836     { AT_ELECTRICITY, 3},
837     { AT_COLD, 4},
838     { AT_COLD, 4}, /* face=icestorm */
839     { AT_COLD, 4},
840     { AT_CONFUSION, 5},
841     { AT_POISON, 7},
842     { AT_POISON, 7}, /* face = acid sphere. generator */
843     { AT_POISON, 7}, /* poisoncloud face */
844     { AT_SLOW, 8},
845     { AT_PARALYZE, 9},
846     { AT_FEAR, 10},
847     };
848 elmex 1.1
849     /* shuffle_attack: peterm
850     * This routine shuffles the attack of op to one of the
851     * ones in the list. It does this at random. It also
852     * chooses a face appropriate to the attack that is
853     * being committed by that square at the moment.
854     * right now it's being used by color spray and create pool of
855     * chaos.
856     * This could really be a better implementation - the
857     * faces and attacktypes above are hardcoded, which is never
858     * good. The faces refer to faces in the animation sequence.
859     * Not sure how to do better - but not having it hardcoded
860     * would be nice.
861     * I also fixed a bug here in that attacktype was |= -
862     * to me, that would be that it would quickly get all
863     * attacktypes, which probably wasn't the intent. MSW 2003-06-03
864     */
865 root 1.11 void
866     shuffle_attack (object *op, int change_face)
867 elmex 1.1 {
868 root 1.11 int i;
869 elmex 1.1
870 root 1.11 i = rndm (0, 21);
871 elmex 1.1
872 root 1.11 op->attacktype = ATTACKS[i].attacktype | AT_MAGIC;
873    
874     if (change_face)
875     {
876     SET_ANIMATION (op, ATTACKS[i].face);
877 elmex 1.1 }
878     }
879    
880    
881     /* prayer_failure: This is called when a player fails
882     * at casting a prayer.
883     * op is the player.
884     * failure is basically how much grace they had.
885     * power is how much grace the spell would normally take to cast.
886     */
887    
888 root 1.11 void
889     prayer_failure (object *op, int failure, int power)
890     {
891     const char *godname;
892     object *tmp;
893 elmex 1.1
894 root 1.11 if (!strcmp ((godname = determine_god (op)), "none"))
895     godname = "Your spirit";
896 elmex 1.1
897 root 1.11 if (failure <= -20 && failure > -40) /* wonder */
898 elmex 1.1 {
899 root 1.11 new_draw_info_format (NDI_UNIQUE, 0, op, "%s gives a sign to renew your faith.", godname);
900     tmp = get_archetype (SPELL_WONDER);
901     cast_cone (op, op, 0, tmp);
902 root 1.20 tmp->destroy ();
903 elmex 1.1 }
904    
905 root 1.11 else if (failure <= -40 && failure > -60) /* confusion */
906 elmex 1.1 {
907 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your diety touches your mind!");
908     confuse_player (op, op, 99);
909 elmex 1.1 }
910 root 1.11 else if (failure <= -60 && failure > -150) /* paralysis */
911 elmex 1.1 {
912 root 1.11 new_draw_info_format (NDI_UNIQUE, 0, op, "%s requires you to pray NOW.", godname);
913     new_draw_info (NDI_UNIQUE, 0, op, "You comply, ignoring all else.");
914     paralyze_player (op, op, 99);
915 elmex 1.1 }
916 root 1.11 else if (failure <= -150) /* blast the immediate area */
917     {
918     tmp = get_archetype (GOD_POWER);
919     new_draw_info_format (NDI_UNIQUE, 0, op, "%s smites you!", godname);
920     cast_magic_storm (op, tmp, power);
921 elmex 1.1 }
922     }
923    
924     /*
925     * spell_failure() handles the various effects for differing degrees
926     * of failure badness.
927     * op is the player that failed.
928     * failure is a random value of how badly you failed.
929     * power is how many spellpoints you'd normally need for the spell.
930     * skill is the skill you'd need to cast the spell.
931     */
932    
933 root 1.11 void
934     spell_failure (object *op, int failure, int power, object *skill)
935     {
936     object *tmp;
937 elmex 1.1
938 root 1.11 if (settings.spell_failure_effects == FALSE)
939     return;
940 elmex 1.1
941 root 1.11 if (failure <= -20 && failure > -40) /* wonder */
942 elmex 1.1 {
943 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your spell causes an unexpected effect.");
944     tmp = get_archetype (SPELL_WONDER);
945     cast_cone (op, op, 0, tmp);
946 root 1.20 tmp->destroy ();
947 elmex 1.1 }
948    
949 root 1.11 else if (failure <= -40 && failure > -60) /* confusion */
950 elmex 1.1 {
951 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your magic recoils on you, making you confused!");
952     confuse_player (op, op, 99);
953 elmex 1.1 }
954 root 1.11 else if (failure <= -60 && failure > -80) /* paralysis */
955 elmex 1.1 {
956 root 1.11 new_draw_info (NDI_UNIQUE, 0, op, "Your magic stuns you!");
957     paralyze_player (op, op, 99);
958 elmex 1.1 }
959 root 1.11 else if (failure <= -80) /* blast the immediate area */
960     {
961     object *tmp;
962 root 1.8
963 root 1.11 /* Safety check to make sure we don't get any mana storms in scorn */
964     if (get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_MAGIC)
965     {
966     new_draw_info (NDI_UNIQUE, 0, op, "The magic warps and you are turned inside out!");
967     hit_player (op, 9998, op, AT_INTERNAL, 1);
968 root 1.8
969 root 1.11 }
970     else
971     {
972     new_draw_info (NDI_UNIQUE, 0, op, "You lose control of the mana! The uncontrolled magic blasts you!");
973     tmp = get_archetype (LOOSE_MANA);
974     tmp->level = skill->level;
975    
976     /* increase the area of destruction a little for more powerful spells */
977     tmp->range += isqrt (power);
978    
979     if (power > 25)
980     tmp->stats.dam = 25 + isqrt (power);
981     else
982     tmp->stats.dam = power; /* nasty recoils! */
983 root 1.8
984 root 1.11 tmp->stats.maxhp = tmp->count;
985 root 1.29
986     tmp->insert_at (op);
987 root 1.8 }
988 elmex 1.1 }
989     }
990    
991 root 1.11 int
992     cast_party_spell (object *op, object *caster, int dir, object *spell_ob, char *stringarg)
993     {
994     int success;
995     object *spell;
996    
997     if (!spell_ob->other_arch)
998 elmex 1.1 {
999 root 1.11 LOG (llevError, "cast_party_spell: empty other arch\n");
1000     return 0;
1001     }
1002     spell = arch_to_object (spell_ob->other_arch);
1003 elmex 1.1
1004 root 1.11 /* Always cast spell on caster */
1005     success = cast_spell (op, caster, dir, spell, stringarg);
1006 elmex 1.1
1007 root 1.11 if (caster->contr->party == NULL)
1008     {
1009 root 1.19 spell->remove ();
1010 root 1.11 return success;
1011 elmex 1.1 }
1012 root 1.27 for_all_players (pl)
1013 root 1.11 if ((pl->ob->contr->party == caster->contr->party) && (on_same_map (pl->ob, caster)))
1014     {
1015     cast_spell (pl->ob, caster, pl->ob->facing, spell, stringarg);
1016     }
1017 root 1.19 spell->remove ();
1018 root 1.11 return success;
1019     }
1020 elmex 1.1
1021     /* This is where the main dispatch when someone casts a spell.
1022     *
1023     * op is the creature that is owner of the object that is casting the spell -
1024     * eg, the player or monster.
1025     * caster is the actual object (wand, potion) casting the spell. can be
1026     * same as op.
1027     * dir is the direction to cast in. Note in some cases, if the spell
1028     * is self only, dir really doesn't make a difference.
1029     * spell_ob is the spell object that is being cast. From that,
1030     * we can determine what to do.
1031     * stringarg is any options that are being used. It can be NULL. Almost
1032     * certainly, only players will set it. It is basically used as optional
1033     * parameters to a spell (eg, item to create, information for marking runes,
1034     * etc.
1035     * returns 1 on successful cast, or 0 on error. These values should really
1036     * be swapped, so that 0 is successful, and non zero is failure, with a code
1037     * of what it failed.
1038     *
1039     * Note that this function is really a dispatch routine that calls other
1040     * functions - it just blindly returns what ever value those functions
1041     * return. So if your writing a new function that is called from this,
1042     * it shoudl also return 1 on success, 0 on failure.
1043     *
1044     * if it is a player casting the spell (op->type == PLAYER, op == caster),
1045     * this function will decrease the mana/grace appropriately. For other
1046     * objects, the caller should do what it considers appropriate.
1047     */
1048 root 1.11 int
1049     cast_spell (object *op, object *caster, int dir, object *spell_ob, char *stringarg)
1050     {
1051     const char *godname;
1052 root 1.42 int success = 0, mflags, cast_level = 0;
1053 root 1.11 object *skill = NULL;
1054 elmex 1.1
1055 root 1.11 if (!spell_ob)
1056     {
1057     LOG (llevError, "cast_spell: null spell object passed\n");
1058     return 0;
1059 elmex 1.1 }
1060 root 1.13
1061 root 1.11 if (!strcmp ((godname = determine_god (op)), "none"))
1062     godname = "A random spirit";
1063 elmex 1.1
1064 root 1.11 /* the caller should set caster to op if appropriate */
1065     if (!caster)
1066     {
1067     LOG (llevError, "cast_spell: null caster object passed\n");
1068     return 0;
1069 elmex 1.1 }
1070    
1071 root 1.11 /* if caster is a spell casting object, this normally shouldn't be
1072     * an issue, because they don't have any spellpaths set up.
1073     */
1074 root 1.18 if (caster->path_denied & spell_ob->path_attuned && !QUERY_FLAG (caster, FLAG_WIZCAST))
1075 root 1.11 {
1076     new_draw_info (NDI_UNIQUE, 0, op, "That spell path is denied to you.");
1077     return 0;
1078 elmex 1.1 }
1079    
1080 root 1.11 /* if it is a player casting the spell, and they are really casting it
1081     * (vs it coming from a wand, scroll, or whatever else), do some
1082     * checks. We let monsters do special things - eg, they
1083     * don't need the skill, bypass level checks, etc. The monster function
1084     * should take care of that.
1085     * Remove the wiz check here and move it further down - some spells
1086     * need to have the right skill pointer passed, so we need to
1087     * at least process that code.
1088     */
1089     if (op->type == PLAYER && op == caster)
1090     {
1091     cast_level = caster_level (caster, spell_ob);
1092     if (spell_ob->skill)
1093     {
1094     skill = find_skill_by_name (op, spell_ob->skill);
1095     if (!skill)
1096     {
1097     new_draw_info_format (NDI_UNIQUE, 0, op, "You need the skill %s to cast %s.", &spell_ob->skill, &spell_ob->name);
1098     return 0;
1099 root 1.8 }
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.11 /* If the caster is the wiz, they don't ever fail, and don't have
1107     * to have sufficient grace/mana.
1108     */
1109     if (!QUERY_FLAG (op, FLAG_WIZ))
1110     {
1111     if (SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA) &&
1112     SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA) > op->stats.sp)
1113     {
1114     new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough mana.");
1115     return 0;
1116 root 1.8 }
1117 root 1.30
1118 root 1.11 if (SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) &&
1119     SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) > op->stats.grace)
1120     {
1121     if (random_roll (0, op->stats.Wis - 1, op, PREFER_HIGH) + op->stats.grace -
1122     10 * SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) / op->stats.maxgrace > 0)
1123     {
1124     new_draw_info_format (NDI_UNIQUE, 0, op, "%s grants your prayer, though you are unworthy.", godname);
1125 root 1.8 }
1126 root 1.11 else
1127     {
1128     prayer_failure (op, op->stats.grace, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) - op->stats.grace);
1129     new_draw_info_format (NDI_UNIQUE, 0, op, "%s ignores your prayer.", godname);
1130     return 0;
1131 root 1.8 }
1132     }
1133    
1134 root 1.11 /* player/monster is trying to cast the spell. might fumble it */
1135     if (spell_ob->stats.grace && random_roll (0, 99, op, PREFER_HIGH) <
1136     (spell_ob->level / (float) MAX (1, op->level) * cleric_chance[op->stats.Wis]))
1137     {
1138     play_sound_player_only (op->contr, SOUND_FUMBLE_SPELL, 0, 0);
1139     new_draw_info (NDI_UNIQUE, 0, op, "You fumble the spell.");
1140 root 1.35
1141 root 1.11 if (settings.casting_time == TRUE)
1142 root 1.35 op->casting_time = -1;
1143    
1144 root 1.11 op->stats.grace -= random_roll (1, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE), op, PREFER_LOW);
1145     return 0;
1146     }
1147     else if (spell_ob->stats.sp)
1148     {
1149     int failure = random_roll (0, 199, op, PREFER_HIGH) - op->contr->encumbrance + op->level - spell_ob->level + 35;
1150    
1151     if (failure < 0)
1152     {
1153     new_draw_info (NDI_UNIQUE, 0, op, "You bungle the spell because you have too much heavy equipment in use.");
1154     if (settings.spell_failure_effects == TRUE)
1155     spell_failure (op, failure, SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA), skill);
1156 root 1.42
1157 root 1.11 op->stats.sp -= random_roll (0, SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA), op, PREFER_LOW);
1158     return 0;
1159 root 1.8 }
1160     }
1161     }
1162 elmex 1.1 }
1163    
1164 root 1.11 mflags = get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL);
1165    
1166     /* See if we can cast a spell here. If the caster and op are
1167     * not alive, then this would mean that the mapmaker put the
1168     * objects on the space - presume that they know what they are
1169     * doing.
1170     */
1171 elmex 1.9
1172 root 1.11 if ((mflags & P_SAFE) && !QUERY_FLAG (op, FLAG_WIZCAST)) // There is _ABSOLUTELY_ no magic allowed here (except wizards :-)!
1173     {
1174     new_draw_info (NDI_UNIQUE, 0, op, "This ground is sacred! The gods prevent any magical effects done by you here!.");
1175     return 0;
1176     }
1177    
1178     if ((spell_ob->type == SPELL)
1179     && (caster->type != POTION)
1180     && !QUERY_FLAG (op, FLAG_WIZCAST)
1181     && (QUERY_FLAG (caster, FLAG_ALIVE)
1182     || QUERY_FLAG (op, FLAG_ALIVE))
1183     && (((mflags & P_NO_MAGIC) && spell_ob->stats.sp) || ((mflags & P_NO_CLERIC) && spell_ob->stats.grace)))
1184     {
1185     if (op->type != PLAYER)
1186 elmex 1.9 return 0;
1187    
1188 root 1.11 if ((mflags & P_NO_CLERIC) && spell_ob->stats.grace)
1189 root 1.42 new_draw_info_format (NDI_UNIQUE, 0, op, "This ground is unholy! %s ignores you.", godname);
1190 root 1.11 else
1191 root 1.42 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks the spell!");
1192    
1193 root 1.11 return 0;
1194     }
1195 elmex 1.1
1196 root 1.11 if (caster == op && settings.casting_time == TRUE && spell_ob->type == SPELL)
1197     {
1198     if (op->casting_time == -1)
1199     { /* begin the casting */
1200     op->casting_time = (sint16) (spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob));
1201     op->spell = spell_ob;
1202     /* put the stringarg into the object struct so that when the
1203     * spell is actually cast, it knows about the stringarg.
1204     * necessary for the invoke command spells.
1205     */
1206     if (stringarg)
1207 elmex 1.2 {
1208 root 1.22 op->spellarg = strdup (stringarg);
1209 root 1.8 }
1210 root 1.11 else
1211     op->spellarg = NULL;
1212     return 0;
1213 root 1.8 }
1214 root 1.11 else if (op->casting_time != 0)
1215     {
1216     if (op->type == PLAYER)
1217     new_draw_info (NDI_UNIQUE, 0, op, "You are casting!");
1218     return 0;
1219 root 1.8 }
1220 root 1.11 else
1221     { /* casting_time == 0 */
1222     op->casting_time = -1;
1223     spell_ob = op->spell;
1224     stringarg = op->spellarg;
1225     }
1226     }
1227     else
1228     {
1229     /* Take into account how long it takes to cast the spell.
1230     * if the player is casting it, then we use the time in
1231     * the spell object. If it is a spell object, have it
1232     * take two ticks. Things that cast spells on the players
1233     * behalf (eg, altars, and whatever else) shouldn't cost
1234     * the player any time.
1235     * Ignore casting time for firewalls
1236     */
1237     if (caster == op && caster->type != FIREWALL)
1238     {
1239     op->speed_left -= spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed);
1240     /* Other portions of the code may also decrement the speed of the player, so
1241     * put a lower limit so that the player isn't stuck here too long
1242     */
1243     if ((spell_ob->casting_time > 0) && op->speed_left < -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed))
1244     op->speed_left = -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * FABS (op->speed);
1245     }
1246     else if (caster->type == WAND || caster->type == HORN || caster->type == ROD || caster->type == POTION || caster->type == SCROLL)
1247     {
1248     op->speed_left -= 2 * FABS (op->speed);
1249 root 1.8 }
1250 elmex 1.1 }
1251    
1252 root 1.11 if (op->type == PLAYER && op == caster)
1253     {
1254     op->stats.grace -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE);
1255     op->stats.sp -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA);
1256 elmex 1.1 }
1257    
1258 root 1.11 /* We want to try to find the skill to properly credit exp.
1259     * for spell casting objects, the exp goes to the skill the casting
1260     * object requires.
1261     */
1262     if (op != caster && !skill && caster->skill)
1263     {
1264     skill = find_skill_by_name (op, caster->skill);
1265     if (!skill)
1266     {
1267     new_draw_info_format (NDI_UNIQUE, 0, op, "You lack the skill %s to use the %s", &caster->skill, query_name (caster));
1268     return 0;
1269 root 1.8 }
1270 root 1.11 change_skill (op, skill, 0); /* needed for proper exp credit */
1271 elmex 1.1 }
1272    
1273 root 1.11 switch (spell_ob->subtype)
1274     {
1275 root 1.12 /* The order of case statements is same as the order they show up
1276     * in in spells.h.
1277     */
1278     case SP_RAISE_DEAD:
1279     success = cast_raise_dead_spell (op, caster, spell_ob, dir, stringarg);
1280     break;
1281    
1282     case SP_RUNE:
1283     success = write_rune (op, caster, spell_ob, dir, stringarg);
1284     break;
1285    
1286     case SP_MAKE_MARK:
1287     success = write_mark (op, spell_ob, stringarg);
1288     break;
1289    
1290     case SP_BOLT:
1291     success = fire_bolt (op, caster, dir, spell_ob, skill);
1292     break;
1293    
1294     case SP_BULLET:
1295     success = fire_bullet (op, caster, dir, spell_ob);
1296     break;
1297    
1298     case SP_CONE:
1299     success = cast_cone (op, caster, dir, spell_ob);
1300     break;
1301    
1302     case SP_BOMB:
1303     success = create_bomb (op, caster, dir, spell_ob);
1304     break;
1305    
1306     case SP_WONDER:
1307     success = cast_wonder (op, caster, dir, spell_ob);
1308     break;
1309    
1310     case SP_SMITE:
1311     success = cast_smite_spell (op, caster, dir, spell_ob);
1312     break;
1313    
1314     case SP_MAGIC_MISSILE:
1315     success = fire_arch_from_position (op, caster, op->x + freearr_x[dir], op->y + freearr_y[dir], dir, spell_ob);
1316     break;
1317    
1318     case SP_SUMMON_GOLEM:
1319     success = summon_golem (op, caster, dir, spell_ob);
1320     break;
1321    
1322     case SP_DIMENSION_DOOR:
1323     /* dimension door needs the actual caster, because that is what is
1324     * moved.
1325     */
1326     success = dimension_door (op, caster, spell_ob, dir);
1327     break;
1328 root 1.8
1329 root 1.12 case SP_MAGIC_MAPPING:
1330     if (op->type == PLAYER)
1331     {
1332     spell_effect (spell_ob, op->x, op->y, op->map, op);
1333     draw_magic_map (op);
1334     success = 1;
1335     }
1336     else
1337     success = 0;
1338     break;
1339 elmex 1.1
1340 root 1.12 case SP_MAGIC_WALL:
1341     success = magic_wall (op, caster, dir, spell_ob);
1342     break;
1343 root 1.8
1344 root 1.12 case SP_DESTRUCTION:
1345     success = cast_destruction (op, caster, spell_ob);
1346     break;
1347 root 1.8
1348 root 1.12 case SP_PERCEIVE_SELF:
1349     success = perceive_self (op);
1350     break;
1351 root 1.8
1352 root 1.12 case SP_WORD_OF_RECALL:
1353     success = cast_word_of_recall (op, caster, spell_ob);
1354     break;
1355 root 1.8
1356 root 1.12 case SP_INVISIBLE:
1357     success = cast_invisible (op, caster, spell_ob);
1358     break;
1359 root 1.8
1360 root 1.12 case SP_PROBE:
1361     success = probe (op, caster, spell_ob, dir);
1362     break;
1363 root 1.8
1364 root 1.12 case SP_HEALING:
1365     success = cast_heal (op, caster, spell_ob, dir);
1366     break;
1367 root 1.8
1368 root 1.12 case SP_CREATE_FOOD:
1369     success = cast_create_food (op, caster, spell_ob, dir, stringarg);
1370     break;
1371 root 1.8
1372 root 1.12 case SP_EARTH_TO_DUST:
1373     success = cast_earth_to_dust (op, caster, spell_ob);
1374     break;
1375 root 1.8
1376 root 1.12 case SP_CHANGE_ABILITY:
1377     success = cast_change_ability (op, caster, spell_ob, dir, 0);
1378     break;
1379 root 1.8
1380 root 1.12 case SP_BLESS:
1381     success = cast_bless (op, caster, spell_ob, dir);
1382     break;
1383 root 1.8
1384 root 1.12 case SP_CURSE:
1385     success = cast_curse (op, caster, spell_ob, dir);
1386     break;
1387 root 1.8
1388 root 1.12 case SP_SUMMON_MONSTER:
1389     success = summon_object (op, caster, spell_ob, dir, stringarg);
1390     break;
1391 root 1.8
1392 root 1.12 case SP_CHARGING:
1393     success = recharge (op, caster, spell_ob);
1394     break;
1395 root 1.8
1396 root 1.12 case SP_POLYMORPH:
1397 elmex 1.1 #ifdef NO_POLYMORPH
1398 root 1.12 /* Not great, but at least provide feedback so if players do have
1399     * polymorph (ie, find it as a preset item or left over from before
1400     * it was disabled), they get some feedback.
1401     */
1402     new_draw_info (NDI_UNIQUE, 0, op, "The spell fizzles");
1403     success = 0;
1404 elmex 1.1 #else
1405 root 1.12 success = cast_polymorph (op, caster, spell_ob, dir);
1406 elmex 1.1 #endif
1407 root 1.12 break;
1408 root 1.8
1409 root 1.12 case SP_ALCHEMY:
1410     success = alchemy (op, caster, spell_ob);
1411     break;
1412    
1413     case SP_REMOVE_CURSE:
1414     success = remove_curse (op, caster, spell_ob);
1415     break;
1416    
1417     case SP_IDENTIFY:
1418     success = cast_identify (op, caster, spell_ob);
1419     break;
1420    
1421     case SP_DETECTION:
1422     success = cast_detection (op, caster, spell_ob, skill);
1423     break;
1424    
1425     case SP_MOOD_CHANGE:
1426     success = mood_change (op, caster, spell_ob);
1427     break;
1428 elmex 1.1
1429 root 1.12 case SP_MOVING_BALL:
1430     if (spell_ob->path_repelled && (spell_ob->path_repelled & caster->path_attuned) != spell_ob->path_repelled)
1431     {
1432     new_draw_info_format (NDI_UNIQUE, 0, op, "You lack the proper attunement to cast %s", &spell_ob->name);
1433     success = 0;
1434     }
1435     else
1436     success = fire_arch_from_position (op, caster, op->x + freearr_x[dir], op->y + freearr_y[dir], dir, spell_ob);
1437     break;
1438 elmex 1.1
1439 root 1.12 case SP_SWARM:
1440     success = fire_swarm (op, caster, spell_ob, dir);
1441     break;
1442    
1443     case SP_CHANGE_MANA:
1444     success = cast_transfer (op, caster, spell_ob, dir);
1445     break;
1446    
1447     case SP_DISPEL_RUNE:
1448     /* in rune.c */
1449     success = dispel_rune (op, caster, spell_ob, skill, dir);
1450     break;
1451    
1452     case SP_CREATE_MISSILE:
1453     success = cast_create_missile (op, caster, spell_ob, dir, stringarg);
1454     break;
1455    
1456     case SP_CONSECRATE:
1457     success = cast_consecrate (op, caster, spell_ob);
1458     break;
1459    
1460     case SP_ANIMATE_WEAPON:
1461     success = animate_weapon (op, caster, spell_ob, dir);
1462     break;
1463    
1464     case SP_LIGHT:
1465     success = cast_light (op, caster, spell_ob, dir);
1466     break;
1467    
1468     case SP_CHANGE_MAP_LIGHT:
1469     success = cast_change_map_lightlevel (op, caster, spell_ob);
1470     break;
1471    
1472     case SP_FAERY_FIRE:
1473     success = cast_destruction (op, caster, spell_ob);
1474     break;
1475    
1476     case SP_CAUSE_DISEASE:
1477     success = cast_cause_disease (op, caster, spell_ob, dir);
1478     break;
1479    
1480     case SP_AURA:
1481     success = create_aura (op, caster, spell_ob);
1482     break;
1483    
1484     case SP_TOWN_PORTAL:
1485     success = cast_create_town_portal (op, caster, spell_ob, dir);
1486     break;
1487    
1488     case SP_PARTY_SPELL:
1489     success = cast_party_spell (op, caster, dir, spell_ob, stringarg);
1490     break;
1491    
1492     default:
1493     if (!INVOKE_OBJECT (CAST_SPELL, spell_ob, ARG_OBJECT (op), ARG_OBJECT (caster), ARG_INT (dir), ARG_STRING (stringarg)))
1494     LOG (llevError, "cast_spell: Unhandled spell subtype %d\n", spell_ob->subtype);
1495 elmex 1.1 }
1496    
1497 root 1.11 /* FIXME - we need some better sound suppport */
1498     // yes, for example, augment map info with the spell effect
1499     // so clients can calculate the sounds themselves
1500     //play_sound_map(op->map, op->x, op->y, SOUND_CAST_SPELL_0 + spell_ob->subtype);
1501 elmex 1.1
1502 root 1.11 /* free the spell arg */
1503     if (settings.casting_time == TRUE && stringarg)
1504     {
1505     free (stringarg);
1506 root 1.42 stringarg = 0;
1507 elmex 1.1 }
1508    
1509 root 1.11 return success;
1510 elmex 1.1 }
1511    
1512    
1513     /* This is called from time.c/process_object(). That function
1514     * calls this for any SPELL_EFFECT type objects. This function
1515     * then dispatches them to the appropriate specific routines.
1516     */
1517 root 1.11 void
1518     move_spell_effect (object *op)
1519     {
1520     switch (op->subtype)
1521     {
1522 root 1.12 case SP_BOLT:
1523     move_bolt (op);
1524     break;
1525    
1526     case SP_BULLET:
1527     move_bullet (op);
1528     break;
1529    
1530     case SP_EXPLOSION:
1531     explosion (op);
1532     break;
1533    
1534     case SP_CONE:
1535     move_cone (op);
1536     break;
1537    
1538     case SP_BOMB:
1539     animate_bomb (op);
1540     break;
1541    
1542     case SP_MAGIC_MISSILE:
1543     move_missile (op);
1544     break;
1545    
1546     case SP_WORD_OF_RECALL:
1547     execute_word_of_recall (op);
1548     break;
1549    
1550     case SP_MOVING_BALL:
1551     move_ball_spell (op);
1552     break;
1553    
1554     case SP_SWARM:
1555     move_swarm_spell (op);
1556     break;
1557    
1558     case SP_AURA:
1559     move_aura (op);
1560     break;
1561 elmex 1.1 }
1562     }
1563    
1564     /* this checks to see if something special should happen if
1565     * something runs into the object.
1566     */
1567 root 1.11 void
1568     check_spell_effect (object *op)
1569     {
1570     switch (op->subtype)
1571     {
1572 root 1.12 case SP_BOLT:
1573     move_bolt (op);
1574     return;
1575    
1576     case SP_BULLET:
1577     check_bullet (op);
1578     return;
1579 elmex 1.1 }
1580     }
1581    
1582     /* This is called by move_apply. Basically, if someone
1583     * moves onto a spell effect and the walk_on or fly_on flags
1584     * are set, this is called. This should only be called for
1585     * objects of the appropraite type.
1586     */
1587 root 1.11 void
1588     apply_spell_effect (object *spell, object *victim)
1589 elmex 1.1 {
1590 root 1.11 switch (spell->subtype)
1591     {
1592 root 1.12 case SP_CONE:
1593     if (QUERY_FLAG (victim, FLAG_ALIVE) && spell->speed && spell->attacktype)
1594     hit_player (victim, spell->stats.dam, spell, spell->attacktype, 0);
1595     break;
1596 root 1.8
1597 root 1.12 case SP_MAGIC_MISSILE:
1598     if (QUERY_FLAG (victim, FLAG_ALIVE))
1599     {
1600 root 1.16 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1601 root 1.11
1602 root 1.16 if (!spell->destroyed ())
1603 root 1.20 spell->destroy ();
1604 root 1.12 }
1605     break;
1606 root 1.8
1607 root 1.12 case SP_MOVING_BALL:
1608     if (QUERY_FLAG (victim, FLAG_ALIVE))
1609     hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1610 root 1.36 else if (victim->materialname)
1611 root 1.12 save_throw_object (victim, spell->attacktype, spell);
1612     break;
1613 elmex 1.1 }
1614     }