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

File Contents

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