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

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

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

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

File Contents

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