ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.10
Committed: Sun Sep 3 00:18:42 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.9: +12 -13 lines
Log Message:
THIS CODE WILL NOT COMPILE
use the STABLE tag instead.

- major changes in object lifetime and memory management
- replaced manual refcounting by shstr class
- removed quest system
- many optimisations
- major changes

File Contents

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