ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_util.C
Revision: 1.54
Committed: Sun Jul 1 05:00:20 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.53: +10 -11 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

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