ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_effect.C
(Generate patch)

Comparing deliantra/server/server/spell_effect.C (file contents):
Revision 1.110 by root, Mon Oct 12 14:00:59 2009 UTC vs.
Revision 1.127 by root, Wed Apr 14 02:31:24 2010 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992 Frank Tore Johansen
7 * 7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 9 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your 10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 11 * option) any later version.
64 int ncharges; 64 int ncharges;
65 65
66 wand = find_marked_object (op); 66 wand = find_marked_object (op);
67 if (!wand || wand->type != WAND) 67 if (!wand || wand->type != WAND)
68 { 68 {
69 new_draw_info (NDI_UNIQUE, 0, op, "You need to mark the wand you want to recharge."); 69 op->failmsg ("You need to mark the wand you want to recharge.");
70 return 0; 70 return 0;
71 } 71 }
72
72 if (!(random_roll (0, 3, op, PREFER_HIGH))) 73 if (!(random_roll (0, 3, op, PREFER_HIGH)))
73 { 74 {
74 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand)); 75 op->failmsgf ("The %s vibrates violently, then explodes!", query_name (wand));
75 op->play_sound (sound_find ("ob_explode")); 76 op->play_sound (sound_find ("ob_explode"));
76 wand->destroy (); 77 wand->destroy ();
77 tmp = get_archetype ("fireball"); 78 tmp = get_archetype (shstr_fireball);
78 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10; 79 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10;
79 80
80 if (!tmp->stats.dam) 81 if (!tmp->stats.dam)
81 tmp->stats.dam = 1; 82 tmp->stats.dam = 1;
82 83
93 94
94 if (wand->inv && wand->inv->level) 95 if (wand->inv && wand->inv->level)
95 ncharges /= wand->inv->level; 96 ncharges /= wand->inv->level;
96 else 97 else
97 { 98 {
98 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is broken.", query_name (wand)); 99 op->failmsgf ("Your %s is broken.", query_name (wand));
99 return 0; 100 return 0;
100 } 101 }
101 102
102 if (!ncharges) 103 if (!ncharges)
103 ncharges = 1; 104 ncharges = 1;
104 105
105 wand->stats.food += ncharges; 106 wand->stats.food += ncharges;
106 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand)); 107 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand));
107 108
108 if (wand->arch && QUERY_FLAG (wand->arch, FLAG_ANIMATE)) 109 if (wand->arch && wand->arch->flag [FLAG_ANIMATE])
109 { 110 {
110 SET_FLAG (wand, FLAG_ANIMATE); 111 wand->set_flag (FLAG_ANIMATE);
111 wand->set_speed (wand->arch->speed); 112 wand->set_speed (wand->arch->speed);
112 } 113 }
113 114
114 return 1; 115 return 1;
115} 116}
129{ 130{
130 int bonus_plus = 0; 131 int bonus_plus = 0;
131 const char *missile_name = "arrow"; 132 const char *missile_name = "arrow";
132 133
133 for (object *tmp = op->inv; tmp; tmp = tmp->below) 134 for (object *tmp = op->inv; tmp; tmp = tmp->below)
134 if (tmp->type == BOW && QUERY_FLAG (tmp, FLAG_APPLIED)) 135 if (tmp->type == BOW && tmp->flag [FLAG_APPLIED])
135 missile_name = tmp->race; 136 missile_name = tmp->race;
136 137
137 int missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell); 138 int missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell);
138 139
139 archetype *missile_arch = archetype::find (missile_name); 140 archetype *missile_arch = archetype::find (missile_name);
158 break; 159 break;
159 160
160 if (!al) 161 if (!al)
161 { 162 {
162 missile->destroy (); 163 missile->destroy ();
163 new_draw_info_format (NDI_UNIQUE, 0, op, "No such object %ss of %s", missile_name, spellparam); 164 op->failmsgf ("No such object %ss of %s", missile_name, spellparam);
164 return 0; 165 return 0;
165 } 166 }
166 167
167 if (al->item->slaying) 168 if (al->item->slaying)
168 { 169 {
169 missile->destroy (); 170 missile->destroy ();
170 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not allowed to create %ss of %s", missile_name, spellparam); 171 op->failmsgf ("You are not allowed to create %ss of %s", missile_name, spellparam);
171 return 0; 172 return 0;
172 } 173 }
173 174
174 give_artifact_abilities (missile, al->item); 175 give_artifact_abilities (missile, al->item);
175 /* These special arrows cost something extra. Don't have them also be magical - 176 /* These special arrows cost something extra. Don't have them also be magical -
193 194
194 missile->magic = missile_plus; 195 missile->magic = missile_plus;
195 /* Can't get any money for these objects */ 196 /* Can't get any money for these objects */
196 missile->value = 0; 197 missile->value = 0;
197 198
198 SET_FLAG (missile, FLAG_IDENTIFIED); 199 missile->set_flag (FLAG_IDENTIFIED);
199 200
200 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ()) 201 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ())
201 pick_up (op, missile); 202 pick_up (op, missile);
202 203
203 return 1; 204 return 1;
257 /* Pretty unlikely (there are some very low food items), but you never 258 /* Pretty unlikely (there are some very low food items), but you never
258 * know 259 * know
259 */ 260 */
260 if (!at) 261 if (!at)
261 { 262 {
262 new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough experience to create any food."); 263 op->failmsgf ("You don't have enough experience to create any food.");
263 return 0; 264 return 0;
264 } 265 }
265 266
266 food_value /= at->stats.food; 267 food_value /= at->stats.food;
267 new_op = arch_to_object (at); 268 new_op = at->instance ();
268 new_op->nrof = food_value; 269 new_op->nrof = food_value;
269 270
270 new_op->value = 0; 271 new_op->value = 0;
271 if (new_op->nrof < 1) 272 if (new_op->nrof < 1)
272 new_op->nrof = 1; 273 new_op->nrof = 1;
297 mflags = get_map_flags (m, &m, x, y, &x, &y); 298 mflags = get_map_flags (m, &m, x, y, &x, &y);
298 299
299 if (mflags & P_OUT_OF_MAP) 300 if (mflags & P_OUT_OF_MAP)
300 break; 301 break;
301 302
302 if (!QUERY_FLAG (op, FLAG_WIZCAST) && (mflags & P_NO_MAGIC)) 303 if (!op->flag [FLAG_WIZCAST] && (mflags & P_NO_MAGIC))
303 { 304 {
304 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic."); 305 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks your magic.");
305 return 0; 306 return 0;
306 } 307 }
307 308
308 if (mflags & P_IS_ALIVE) 309 if (mflags & P_IS_ALIVE)
309 { 310 {
310 for (tmp = GET_MAP_OB (m, x, y); tmp; tmp = tmp->above) 311 for (tmp = GET_MAP_OB (m, x, y); tmp; tmp = tmp->above)
311 if (QUERY_FLAG (tmp, FLAG_ALIVE) && (tmp->type == PLAYER || QUERY_FLAG (tmp, FLAG_MONSTER))) 312 if (tmp->flag [FLAG_ALIVE] && (tmp->type == PLAYER || tmp->flag [FLAG_MONSTER]))
312 { 313 {
313 new_draw_info (NDI_UNIQUE, 0, op, "You detect something."); 314 new_draw_info (NDI_UNIQUE, 0, op, "You detect something.");
314 if (tmp->head != NULL) 315 if (tmp->head != NULL)
315 tmp = tmp->head; 316 tmp = tmp->head;
316 examine_monster (op, tmp); 317 examine_monster (op, tmp);
339 if (pl->type == PLAYER) 340 if (pl->type == PLAYER)
340 { 341 {
341 /* If race isn't set, then invisible unless it is undead */ 342 /* If race isn't set, then invisible unless it is undead */
342 if (!pl->contr->invis_race) 343 if (!pl->contr->invis_race)
343 { 344 {
344 if (QUERY_FLAG (mon, FLAG_UNDEAD)) 345 if (mon->flag [FLAG_UNDEAD])
345 return 0; 346 return 0;
346 347
347 return 1; 348 return 1;
348 } 349 }
349 350
380int 381int
381cast_invisible (object *op, object *caster, object *spell_ob) 382cast_invisible (object *op, object *caster, object *spell_ob)
382{ 383{
383 if (op->invisible > 1000) 384 if (op->invisible > 1000)
384 { 385 {
385 new_draw_info (NDI_UNIQUE, 0, op, "You can not extend the duration of your invisibility any further"); 386 op->failmsg ("You can not extend the duration of your invisibility any further");
386 return 0; 387 return 0;
387 } 388 }
388 389
389 /* Remove the switch with 90% duplicate code - just handle the differences with 390 /* Remove the switch with 90% duplicate code - just handle the differences with
390 * and if statement or two. 391 * and if statement or two.
396 397
397 if (op->type == PLAYER) 398 if (op->type == PLAYER)
398 { 399 {
399 op->contr->invis_race = spell_ob->race; 400 op->contr->invis_race = spell_ob->race;
400 401
401 if (QUERY_FLAG (spell_ob, FLAG_MAKE_INVIS)) 402 if (spell_ob->flag [FLAG_MAKE_INVIS])
402 op->contr->tmp_invis = 0; 403 op->contr->tmp_invis = 0;
403 else 404 else
404 op->contr->tmp_invis = 1; 405 op->contr->tmp_invis = 1;
405 406
406 op->contr->hidden = 0; 407 op->contr->hidden = 0;
448 // earth to dust tears down everything that can be torn down 449 // earth to dust tears down everything that can be torn down
449 for (object *next, *tmp = m->at (sx, sy).bot; tmp; tmp = next) 450 for (object *next, *tmp = m->at (sx, sy).bot; tmp; tmp = next)
450 { 451 {
451 next = tmp->above; 452 next = tmp->above;
452 453
453 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) 454 if (tmp->flag [FLAG_TEAR_DOWN])
454 hit_player (tmp, 9998, op, AT_PHYSICAL, 0); 455 hit_player (tmp, 9998, op, AT_PHYSICAL, 0);
455 } 456 }
456 } 457 }
457 458
458 return 1; 459 return 1;
461void 462void
462execute_word_of_recall (object *op) 463execute_word_of_recall (object *op)
463{ 464{
464 if (object *pl = op->in_player ()) 465 if (object *pl = op->in_player ())
465 { 466 {
466 if (pl->ms ().flags () & P_NO_CLERIC && !QUERY_FLAG (pl, FLAG_WIZCAST)) 467 if (pl->ms ().flags () & P_NO_CLERIC && !pl->flag [FLAG_WIZCAST])
467 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you."); 468 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you.");
468 else 469 else
469 pl->player_goto (op->slaying, op->stats.hp, op->stats.sp); 470 pl->player_goto (op->slaying, op->stats.hp, op->stats.sp);
470 } 471 }
471 472
565 566
566int 567int
567perceive_self (object *op) 568perceive_self (object *op)
568{ 569{
569 const char *cp = describe_item (op, op); 570 const char *cp = describe_item (op, op);
570 archetype *at = archetype::find (ARCH_DEPLETION); 571 archetype *at = archetype::find (shstr_depletion);
571 572
572 dynbuf_text &buf = msg_dynbuf; buf.clear (); 573 dynbuf_text &buf = msg_dynbuf; buf.clear ();
573 574
574 if (!op->is_player ()) 575 if (!op->is_player ())
575 return 0; 576 return 0;
594 for (int i = 0; i < NUM_STATS; i++) 595 for (int i = 0; i < NUM_STATS; i++)
595 if (tmp->stats.stat (i) < 0) 596 if (tmp->stats.stat (i) < 0)
596 buf.printf (" - Your %s is depleted by %d.\n", statname[i], -tmp->stats.stat (i)); 597 buf.printf (" - Your %s is depleted by %d.\n", statname[i], -tmp->stats.stat (i));
597 } 598 }
598 599
599 if (is_dragon_pl (op)) 600 if (op->is_dragon ())
600 /* now grab the 'dragon_ability'-force from the player's inventory */ 601 /* now grab the 'dragon_ability'-force from the player's inventory */
601 for (tmp = op->inv; tmp; tmp = tmp->below) 602 for (tmp = op->inv; tmp; tmp = tmp->below)
602 { 603 {
603 if (tmp->type == FORCE && tmp->arch->archname == shstr_dragon_ability_force) 604 if (tmp->type == FORCE && tmp->arch->archname == shstr_dragon_ability_force)
604 { 605 {
645 646
646 if ((spell_ob->move_block || x != op->x || y != op->y) && 647 if ((spell_ob->move_block || x != op->x || y != op->y) &&
647 (get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE) || 648 (get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE) ||
648 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) == spell_ob->move_block))) 649 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) == spell_ob->move_block)))
649 { 650 {
650 new_draw_info (NDI_UNIQUE, 0, op, "Something is in the way."); 651 op->failmsg ("Something is in the way.");
651 return 0; 652 return 0;
652 } 653 }
653 654
654 if (spell_ob->other_arch) 655 if (spell_ob->other_arch)
655 tmp = arch_to_object (spell_ob->other_arch); 656 tmp = spell_ob->other_arch->instance ();
656 else if (spell_ob->race) 657 else if (spell_ob->race)
657 { 658 {
658 char buf1[MAX_BUF]; 659 char buf1[MAX_BUF];
659 660
660 sprintf (buf1, spell_ob->race, dir); 661 sprintf (buf1, spell_ob->race, dir);
664 LOG (llevError, "summon_wall: Unable to find archetype %s\n", buf1); 665 LOG (llevError, "summon_wall: Unable to find archetype %s\n", buf1);
665 new_draw_info (NDI_UNIQUE, 0, op, "This spell is broken."); 666 new_draw_info (NDI_UNIQUE, 0, op, "This spell is broken.");
666 return 0; 667 return 0;
667 } 668 }
668 669
669 tmp = arch_to_object (at); 670 tmp = at->instance ();
670 } 671 }
671 else 672 else
672 { 673 {
673 LOG (llevError, "magic_wall: spell %s lacks other_arch\n", &spell_ob->name); 674 LOG (llevError, "magic_wall: spell %s lacks other_arch\n", &spell_ob->name);
674 return 0; 675 return 0;
679 tmp->attacktype = spell_ob->attacktype; 680 tmp->attacktype = spell_ob->attacktype;
680 tmp->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 681 tmp->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
681 tmp->stats.dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob); 682 tmp->stats.dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob);
682 tmp->range = 0; 683 tmp->range = 0;
683 } 684 }
684 else if (QUERY_FLAG (tmp, FLAG_ALIVE)) 685 else if (tmp->flag [FLAG_ALIVE])
685 { 686 {
686 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 687 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
687 tmp->stats.maxhp = tmp->stats.hp; 688 tmp->stats.maxhp = tmp->stats.hp;
688 } 689 }
689 690
690 if (QUERY_FLAG (spell_ob, FLAG_IS_USED_UP) || QUERY_FLAG (tmp, FLAG_IS_USED_UP)) 691 if (spell_ob->flag [FLAG_IS_USED_UP] || tmp->flag [FLAG_IS_USED_UP])
691 { 692 {
692 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 693 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
693 SET_FLAG (tmp, FLAG_IS_USED_UP); 694 tmp->set_flag (FLAG_IS_USED_UP);
694 } 695 }
695 696
696 if (QUERY_FLAG (spell_ob, FLAG_TEAR_DOWN)) 697 if (spell_ob->flag [FLAG_TEAR_DOWN])
697 { 698 {
698 tmp->stats.hp = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob); 699 tmp->stats.hp = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob);
699 tmp->stats.maxhp = tmp->stats.hp; 700 tmp->stats.maxhp = tmp->stats.hp;
700 SET_FLAG (tmp, FLAG_TEAR_DOWN); 701 tmp->set_flag (FLAG_TEAR_DOWN);
701 SET_FLAG (tmp, FLAG_ALIVE); 702 tmp->set_flag (FLAG_ALIVE);
702 } 703 }
703 704
704 /* This can't really hurt - if the object doesn't kill anything, 705 /* This can't really hurt - if the object doesn't kill anything,
705 * these fields just won't be used. Do not set the owner for 706 * these fields just won't be used. Do not set the owner for
706 * earthwalls, though, so they survive restarts. 707 * earthwalls, though, so they survive restarts.
718 return 0; 719 return 0;
719 } 720 }
720 721
721 /* If this is a spellcasting wall, need to insert the spell object */ 722 /* If this is a spellcasting wall, need to insert the spell object */
722 if (tmp->other_arch && tmp->other_arch->type == SPELL) 723 if (tmp->other_arch && tmp->other_arch->type == SPELL)
723 insert_ob_in_ob (arch_to_object (tmp->other_arch), tmp); 724 insert_ob_in_ob (tmp->other_arch->instance (), tmp);
724 725
725 /* This code causes the wall to extend some distance in 726 /* This code causes the wall to extend some distance in
726 * each direction, or until an obstruction is encountered. 727 * each direction, or until an obstruction is encountered.
727 * posblocked and negblocked help determine how far the 728 * posblocked and negblocked help determine how far the
728 * created wall can extend, it won't go extend through 729 * created wall can extend, it won't go extend through
748 object *tmp2 = tmp->clone (); 749 object *tmp2 = tmp->clone ();
749 m->insert (tmp2, x, y, op); 750 m->insert (tmp2, x, y, op);
750 751
751 /* If this is a spellcasting wall, need to insert the spell object */ 752 /* If this is a spellcasting wall, need to insert the spell object */
752 if (tmp2->other_arch && tmp2->other_arch->type == SPELL) 753 if (tmp2->other_arch && tmp2->other_arch->type == SPELL)
753 tmp2->insert (arch_to_object (tmp2->other_arch)); 754 tmp2->insert (tmp2->other_arch->instance ());
754 755
755 } 756 }
756 else 757 else
757 posblocked = 1; 758 posblocked = 1;
758 759
765 { 766 {
766 object *tmp2 = tmp->clone (); 767 object *tmp2 = tmp->clone ();
767 m->insert (tmp2, x, y, op); 768 m->insert (tmp2, x, y, op);
768 769
769 if (tmp2->other_arch && tmp2->other_arch->type == SPELL) 770 if (tmp2->other_arch && tmp2->other_arch->type == SPELL)
770 tmp2->insert (arch_to_object (tmp2->other_arch)); 771 tmp2->insert (tmp2->other_arch->instance ());
771 } 772 }
772 else 773 else
773 negblocked = 1; 774 negblocked = 1;
774 } 775 }
775 776
776 if (QUERY_FLAG (tmp, FLAG_BLOCKSVIEW)) 777 if (tmp->flag [FLAG_BLOCKSVIEW])
777 update_all_los (op->map, op->x, op->y); 778 update_all_los (op->map, op->x, op->y);
778 779
779 return 1; 780 return 1;
780} 781}
781 782
790 if (op->type != PLAYER) 791 if (op->type != PLAYER)
791 return 0; 792 return 0;
792 793
793 if (!dir) 794 if (!dir)
794 { 795 {
795 new_draw_info (NDI_UNIQUE, 0, op, "In what direction?"); 796 op->failmsg ("In what direction?");
796 return 0; 797 return 0;
797 } 798 }
798 799
799 /* Given the new outdoor maps, can't let players dimension door for 800 /* Given the new outdoor maps, can't let players dimension door for
800 * ever, so put limits in. 801 * ever, so put limits in.
805 { 806 {
806 int count = atoi (spellparam); 807 int count = atoi (spellparam);
807 808
808 if (count > maxdist) 809 if (count > maxdist)
809 { 810 {
810 new_draw_info (NDI_UNIQUE, 0, op, "You can't dimension door that far!"); 811 op->failmsg ("You can't dimension door that far!");
811 return 0; 812 return 0;
812 } 813 }
813 814
814 for (dist = 0; dist < count; dist++) 815 for (dist = 0; dist < count; dist++)
815 { 816 {
876 break; 877 break;
877 878
878 } 879 }
879 if (!dist) 880 if (!dist)
880 { 881 {
881 new_draw_info (NDI_UNIQUE, 0, op, "Your spell failed!\n"); 882 op->failmsg ("Your spell failed!\n");
882 return 0; 883 return 0;
883 } 884 }
884 } 885 }
885 886
886 /* Actually move the player now */ 887 /* Actually move the player now */
887 if (!(op = op->map->insert (op, op->x + freearr_x[dir] * dist, op->y + freearr_y[dir] * dist, op))) 888 if (!(op = op->map->insert (op, op->x + freearr_x[dir] * dist, op->y + freearr_y[dir] * dist, op)))
888 return 1; 889 return 1;
889 890
890 op->speed_left = -FABS (op->speed) * 5; /* Freeze them for a short while */ 891 op->speed_left = -5. * op->speed; /* Freeze them for a short while */
892
891 return 1; 893 return 1;
892} 894}
893 895
894/* cast_heal: Heals something. 896/* cast_heal: Heals something.
895 * op is the caster. 897 * op is the caster.
950 if (cure_disease (tmp, op, spell)) 952 if (cure_disease (tmp, op, spell))
951 success = 1; 953 success = 1;
952 954
953 if (spell->attacktype & AT_POISON) 955 if (spell->attacktype & AT_POISON)
954 { 956 {
955 at = archetype::find ("poisoning"); 957 at = archetype::find (shstr_poisoning);
956 poison = present_arch_in_ob (at, tmp); 958 poison = present_arch_in_ob (at, tmp);
957 if (poison) 959 if (poison)
958 { 960 {
959 success = 1; 961 success = 1;
960 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed"); 962 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed");
962 } 964 }
963 } 965 }
964 966
965 if (spell->attacktype & AT_CONFUSION) 967 if (spell->attacktype & AT_CONFUSION)
966 { 968 {
967 poison = present_in_ob_by_name (FORCE, "confusion", tmp); 969 poison = present_in_ob_by_name (FORCE, shstr_confusion, tmp);
968 if (poison) 970 if (poison)
969 { 971 {
970 success = 1; 972 success = 1;
971 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); 973 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer");
972 poison->duration = 1; 974 poison->duration = 1;
973 } 975 }
974 } 976 }
975 977
976 if (spell->attacktype & AT_BLIND) 978 if (spell->attacktype & AT_BLIND)
977 { 979 {
978 at = archetype::find ("blindness"); 980 at = archetype::find (shstr_blindness);
979 poison = present_arch_in_ob (at, tmp); 981 poison = present_arch_in_ob (at, tmp);
980 if (poison) 982 if (poison)
981 { 983 {
982 success = 1; 984 success = 1;
983 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return."); 985 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return.");
1001 tmp->stats.grace = tmp->stats.maxgrace; 1003 tmp->stats.grace = tmp->stats.maxgrace;
1002 success = 1; 1004 success = 1;
1003 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel redeemed with your god!"); 1005 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel redeemed with your god!");
1004 } 1006 }
1005 1007
1006 if (spell->stats.food && tmp->stats.food < 999) 1008 if (spell->stats.food && tmp->stats.food < MAX_FOOD)
1007 { 1009 {
1008 tmp->stats.food += spell->stats.food; 1010 tmp->stats.food += spell->stats.food;
1009 1011 min_it (tmp->stats.food, MAX_FOOD);
1010 if (tmp->stats.food > 999)
1011 tmp->stats.food = 999;
1012 1012
1013 success = 1; 1013 success = 1;
1014 /* We could do something a bit better like the messages for healing above */ 1014 /* We could do something a bit better like the messages for healing above */
1015 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food"); 1015 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food");
1016 } 1016 }
1063 break; 1063 break;
1064 } 1064 }
1065 else if (spell_ob->race && spell_ob->race == tmp2->name) 1065 else if (spell_ob->race && spell_ob->race == tmp2->name)
1066 { 1066 {
1067 if (!silent) 1067 if (!silent)
1068 new_draw_info_format (NDI_UNIQUE, 0, op,
1069 "You can not cast %s while %s is in effect", 1068 op->failmsgf ("You can not cast %s while %s is in effect",
1070 &spell_ob->name, &tmp2->name_pl); 1069 &spell_ob->name, &tmp2->name_pl);
1071 1070
1072 return 0; 1071 return 0;
1073 } 1072 }
1074 } 1073 }
1075 } 1074 }
1104 1103
1105 force->name_pl = spell_ob->name; 1104 force->name_pl = spell_ob->name;
1106 1105
1107 force->speed = 1.0; 1106 force->speed = 1.0;
1108 force->speed_left = -1.0; 1107 force->speed_left = -1.0;
1109 SET_FLAG (force, FLAG_APPLIED); 1108 force->set_flag (FLAG_APPLIED);
1110 1109
1111 /* Now start processing the effects. First, protections */ 1110 /* Now start processing the effects. First, protections */
1112 for (i = 0; i < NROFATTACKS; i++) 1111 for (i = 0; i < NROFATTACKS; i++)
1113 { 1112 {
1114 if (spell_ob->resist[i]) 1113 if (spell_ob->resist[i])
1144 } 1143 }
1145 } 1144 }
1146 1145
1147 force->move_type = spell_ob->move_type; 1146 force->move_type = spell_ob->move_type;
1148 1147
1149 if (QUERY_FLAG (spell_ob, FLAG_SEE_IN_DARK)) 1148 if (spell_ob->flag [FLAG_SEE_IN_DARK])
1150 SET_FLAG (force, FLAG_SEE_IN_DARK); 1149 force->set_flag (FLAG_SEE_IN_DARK);
1151 1150
1152 if (QUERY_FLAG (spell_ob, FLAG_XRAYS)) 1151 if (spell_ob->flag [FLAG_XRAYS])
1153 SET_FLAG (force, FLAG_XRAYS); 1152 force->set_flag (FLAG_XRAYS);
1154 1153
1155 /* Haste/bonus speed */ 1154 /* Haste/bonus speed */
1156 if (spell_ob->stats.exp) 1155 if (spell_ob->stats.exp)
1157 { 1156 {
1158 if (op->speed > 0.5f) 1157 if (op->speed > 0.5f)
1239 return 0; 1238 return 0;
1240 } 1239 }
1241 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50; 1240 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
1242 force->speed = 1.0; 1241 force->speed = 1.0;
1243 force->speed_left = -1.0; 1242 force->speed_left = -1.0;
1244 SET_FLAG (force, FLAG_APPLIED); 1243 force->set_flag (FLAG_APPLIED);
1245 1244
1246 if (!god) 1245 if (!god)
1247 { 1246 {
1248 new_draw_info (NDI_UNIQUE, 0, op, "Your blessing seems empty."); 1247 new_draw_info (NDI_UNIQUE, 0, op, "Your blessing seems empty.");
1249 } 1248 }
1250 else 1249 else
1251 { 1250 {
1252 /* Only give out good benefits, and put a max on it */ 1251 /* Only give out good benefits, and put a max on it */
1253 for (i = 0; i < NROFATTACKS; i++) 1252 for (i = 0; i < NROFATTACKS; i++)
1254 {
1255 if (god->resist[i] > 0) 1253 if (god->resist[i] > 0)
1256 {
1257 force->resist[i] = MIN (god->resist[i], spell_ob->resist[ATNR_GODPOWER]); 1254 force->resist[i] = min (god->resist[i], spell_ob->resist[ATNR_GODPOWER]);
1258 } 1255
1259 }
1260 force->path_attuned |= god->path_attuned; 1256 force->path_attuned |= god->path_attuned;
1261 1257
1262 if (spell_ob->attacktype) 1258 if (spell_ob->attacktype)
1263 force->slaying = god->slaying; 1259 force->slaying = god->slaying;
1264 1260
1306 * the nuggets, alchemy the gold from that, etc. 1302 * the nuggets, alchemy the gold from that, etc.
1307 * Otherwise, give 9 silver on the gold for other objects, 1303 * Otherwise, give 9 silver on the gold for other objects,
1308 * so that it would still be more affordable to haul 1304 * so that it would still be more affordable to haul
1309 * the stuff back to town. 1305 * the stuff back to town.
1310 */ 1306 */
1311 if (QUERY_FLAG (obj, FLAG_UNPAID)) 1307 if (obj->flag [FLAG_UNPAID])
1312 value = 0; 1308 value = 0;
1313 else if (obj->type == MONEY || obj->type == GEM) 1309 else if (obj->type == MONEY || obj->type == GEM)
1314 value /= 3; 1310 value /= 3;
1315 else 1311 else
1316 value = value * 9 / 10; 1312 value = value * 9 / 10;
1329 if (op->type != PLAYER) 1325 if (op->type != PLAYER)
1330 return 0; 1326 return 0;
1331 1327
1332 archetype *nugget[3]; 1328 archetype *nugget[3];
1333 1329
1334 nugget[0] = archetype::find ("pyrite3"); 1330 nugget[0] = archetype::find (shstr_pyrite3);
1335 nugget[1] = archetype::find ("pyrite2"); 1331 nugget[1] = archetype::find (shstr_pyrite2);
1336 nugget[2] = archetype::find ("pyrite"); 1332 nugget[2] = archetype::find (shstr_pyrite);
1337 1333
1338 /* Put a maximum weight of items that can be alchemised. Limits the power 1334 /* Put a maximum weight of items that can be alchemised. Limits the power
1339 * some, and also prevents people from alchemising every table/chair/clock 1335 * some, and also prevents people from alchemising every table/chair/clock
1340 * in sight 1336 * in sight
1341 */ 1337 */
1370 1366
1371 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next) 1367 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next)
1372 { 1368 {
1373 next = tmp->above; 1369 next = tmp->above;
1374 1370
1375 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && 1371 if (tmp->weight > 0 && !tmp->flag [FLAG_NO_PICK] &&
1376 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) 1372 !tmp->flag [FLAG_ALIVE] && !tmp->flag [FLAG_IS_CAULDRON])
1377 { 1373 {
1378 if (tmp->inv) 1374 if (tmp->inv)
1379 { 1375 {
1380 object *next1, *tmp1; 1376 object *next1, *tmp1;
1381 1377
1382 for (tmp1 = tmp->inv; tmp1; tmp1 = next1) 1378 for (tmp1 = tmp->inv; tmp1; tmp1 = next1)
1383 { 1379 {
1384 next1 = tmp1->below; 1380 next1 = tmp1->below;
1385 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) && 1381 if (tmp1->weight > 0 && !tmp1->flag [FLAG_NO_PICK] &&
1386 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON)) 1382 !tmp1->flag [FLAG_ALIVE] && !tmp1->flag [FLAG_IS_CAULDRON])
1387 alchemy_object (tmp1, value, weight); 1383 alchemy_object (tmp1, value, weight);
1388 } 1384 }
1389 } 1385 }
1390 1386
1391 alchemy_object (tmp, value, weight); 1387 alchemy_object (tmp, value, weight);
1401 for (int i = 0; i < sizeof (nugget) / sizeof (nugget [0]); ++i) 1397 for (int i = 0; i < sizeof (nugget) / sizeof (nugget [0]); ++i)
1402 if (int nrof = value / nugget [i]->value) 1398 if (int nrof = value / nugget [i]->value)
1403 { 1399 {
1404 value -= nrof * nugget[i]->value; 1400 value -= nrof * nugget[i]->value;
1405 1401
1406 object *tmp = arch_to_object (nugget[i]); 1402 object *tmp = nugget[i]->instance ();
1407 tmp->nrof = nrof; 1403 tmp->nrof = nrof;
1408 tmp->flag [FLAG_IDENTIFIED] = true; 1404 tmp->flag [FLAG_IDENTIFIED] = true;
1409 op->map->insert (tmp, x, y, op, 0); 1405 op->map->insert (tmp, x, y, op, 0);
1410 } 1406 }
1411 1407
1425remove_curse (object *op, object *caster, object *spell) 1421remove_curse (object *op, object *caster, object *spell)
1426{ 1422{
1427 int success = 0, was_one = 0; 1423 int success = 0, was_one = 0;
1428 1424
1429 for (object *tmp = op->inv; tmp; tmp = tmp->below) 1425 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1430 if (QUERY_FLAG (tmp, FLAG_APPLIED) && 1426 if (tmp->flag [FLAG_APPLIED] &&
1431 ((QUERY_FLAG (tmp, FLAG_CURSED) && QUERY_FLAG (spell, FLAG_CURSED)) || 1427 ((tmp->flag [FLAG_CURSED] && spell->flag [FLAG_CURSED]) ||
1432 (QUERY_FLAG (tmp, FLAG_DAMNED) && QUERY_FLAG (spell, FLAG_DAMNED)))) 1428 (tmp->flag [FLAG_DAMNED] && spell->flag [FLAG_DAMNED])))
1433 { 1429 {
1434 was_one++; 1430 was_one++;
1435 1431
1436 if (tmp->level <= casting_level (caster, spell)) 1432 if (tmp->level <= casting_level (caster, spell))
1437 { 1433 {
1438 success++; 1434 success++;
1439 if (QUERY_FLAG (spell, FLAG_DAMNED)) 1435 if (spell->flag [FLAG_DAMNED])
1440 CLEAR_FLAG (tmp, FLAG_DAMNED); 1436 tmp->clr_flag (FLAG_DAMNED);
1441 1437
1442 CLEAR_FLAG (tmp, FLAG_CURSED); 1438 tmp->clr_flag (FLAG_CURSED);
1443 CLEAR_FLAG (tmp, FLAG_KNOWN_CURSED); 1439 tmp->clr_flag (FLAG_KNOWN_CURSED);
1444 tmp->value = 0; /* Still can't sell it */ 1440 tmp->value = 0; /* Still can't sell it */
1445 1441
1446 if (object *pl = tmp->visible_to ()) 1442 if (object *pl = tmp->visible_to ())
1447 esrv_update_item (UPD_FLAGS, pl, tmp); 1443 esrv_update_item (UPD_FLAGS, pl, tmp);
1448 } 1444 }
1473 1469
1474 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell)); 1470 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell));
1475 1471
1476 for (tmp = op->inv; tmp; tmp = tmp->below) 1472 for (tmp = op->inv; tmp; tmp = tmp->below)
1477 { 1473 {
1478 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1474 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && need_identify (tmp))
1479 { 1475 {
1480 identify (tmp); 1476 identify (tmp);
1481 1477
1482 if (op->type == PLAYER) 1478 if (op->type == PLAYER)
1483 { 1479 {
1497 * was not fully used. 1493 * was not fully used.
1498 */ 1494 */
1499 if (num_ident) 1495 if (num_ident)
1500 { 1496 {
1501 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above) 1497 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above)
1502 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1498 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && need_identify (tmp))
1503 { 1499 {
1504 identify (tmp); 1500 identify (tmp);
1505 1501
1506 if (object *pl = tmp->visible_to ()) 1502 if (object *pl = tmp->visible_to ())
1507 { 1503 {
1547 range = spell->range + SP_level_range_adjust (caster, spell); 1543 range = spell->range + SP_level_range_adjust (caster, spell);
1548 1544
1549 if (!skill) 1545 if (!skill)
1550 skill = caster; 1546 skill = caster;
1551 1547
1548 dynbuf buf;
1552 unordered_mapwalk (op, -range, -range, range, range) 1549 unordered_mapwalk (buf, op, -range, -range, range, range)
1553 { 1550 {
1554 /* For most of the detections, we only detect objects above the 1551 /* For most of the detections, we only detect objects above the
1555 * floor. But this is not true for show invisible. 1552 * floor. But this is not true for show invisible.
1556 * Basically, we just go and find the top object and work 1553 * Basically, we just go and find the top object and work
1557 * down - that is easier than working up. 1554 * down - that is easier than working up.
1558 */ 1555 */
1559 1556
1560 for (last = NULL, tmp = m->at (nx, ny).bot; tmp; tmp = tmp->above) 1557 for (last = 0, tmp = m->at (nx, ny).bot; tmp; tmp = tmp->above)
1561 last = tmp; 1558 last = tmp;
1562 1559
1563 /* Shouldn't happen, but if there are no objects on a space, this 1560 /* Shouldn't happen, but if there are no objects on a space, this
1564 * would happen. 1561 * would happen.
1565 */ 1562 */
1566 if (!last) 1563 if (!last)
1567 continue; 1564 continue;
1568 1565
1569 done_one = 0; 1566 done_one = 0;
1570 floor = 0; 1567 floor = 0;
1571 detect = NULL; 1568 detect = 0;
1572 for (tmp = last; tmp; tmp = tmp->below) 1569 for (tmp = last; tmp; tmp = tmp->below)
1573 { 1570 {
1574 /* show invisible */ 1571 /* show invisible */
1575 if (QUERY_FLAG (spell, FLAG_MAKE_INVIS) && 1572 if (spell->flag [FLAG_MAKE_INVIS]
1576 /* Might there be other objects that we can make visible? */ 1573 /* Might there be other objects that we can make visible? */
1577 (tmp->invisible && (QUERY_FLAG (tmp, FLAG_MONSTER) 1574 && (tmp->invisible && (tmp->flag [FLAG_MONSTER]
1578 || (tmp->type == PLAYER && !QUERY_FLAG (tmp, FLAG_WIZ)) 1575 || (tmp->type == PLAYER && !tmp->flag [FLAG_WIZ])
1579 || tmp->type == CF_HANDLE 1576 || tmp->type == T_HANDLE
1580 || tmp->type == TRAPDOOR 1577 || tmp->type == TRAPDOOR
1581 || tmp->type == EXIT 1578 || tmp->type == EXIT
1582 || tmp->type == HOLE 1579 || tmp->type == HOLE
1583 || tmp->type == BUTTON 1580 || tmp->type == BUTTON
1584 || tmp->type == TELEPORTER 1581 || tmp->type == TELEPORTER
1585 || tmp->type == GATE 1582 || tmp->type == GATE
1586 || tmp->type == LOCKED_DOOR 1583 || tmp->type == LOCKED_DOOR
1587 || tmp->type == WEAPON 1584 || tmp->type == WEAPON
1588 || tmp->type == ALTAR 1585 || tmp->type == ALTAR
1589 || tmp->type == SIGN 1586 || (tmp->type == SIGN && tmp->face != magicmouth_face)
1590 || tmp->type == TRIGGER_PEDESTAL 1587 || tmp->type == TRIGGER_PEDESTAL
1591 || tmp->type == SPECIAL_KEY 1588 || tmp->type == SPECIAL_KEY
1592 || tmp->type == TREASURE 1589 || tmp->type == TREASURE
1593 || tmp->type == BOOK 1590 || tmp->type == BOOK
1594 || tmp->type == HOLY_ALTAR 1591 || tmp->type == HOLY_ALTAR
1595 || tmp->type == CONTAINER))) 1592 || tmp->type == CONTAINER)))
1596 { 1593 {
1594 printf ("show inv %s\n", tmp->debug_desc());//D
1597 if (random_roll (0, skill->level - 1, op, PREFER_HIGH) > level / 4) 1595 if (random_roll (0, skill->level - 1, op, PREFER_HIGH) > level / 4)
1598 { 1596 {
1599 tmp->invisible = 0; 1597 tmp->invisible = 0;
1600 done_one = 1; 1598 done_one = 1;
1601 } 1599 }
1602 } 1600 }
1603 1601
1604 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1602 if (tmp->flag [FLAG_IS_FLOOR])
1605 floor = 1; 1603 floor = 1;
1606 1604
1607 /* All detections below this point don't descend beneath the floor, 1605 /* All detections below this point don't descend beneath the floor,
1608 * so just continue on. We could be clever and look at the type of 1606 * so just continue on. We could be clever and look at the type of
1609 * detection to completely break out if we don't care about objects beneath 1607 * detection to completely break out if we don't care about objects beneath
1618 * difficult to see what object is magical/cursed, so the 1616 * difficult to see what object is magical/cursed, so the
1619 * effect wouldn't be as apparent. 1617 * effect wouldn't be as apparent.
1620 */ 1618 */
1621 1619
1622 /* detect magic */ 1620 /* detect magic */
1623 if (QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL) && 1621 if (spell->flag [FLAG_KNOWN_MAGICAL] &&
1624 !QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL) && !QUERY_FLAG (tmp, FLAG_IDENTIFIED) && is_magical (tmp)) 1622 !tmp->flag [FLAG_KNOWN_MAGICAL] && !tmp->flag [FLAG_IDENTIFIED] && is_magical (tmp))
1625 { 1623 {
1626 SET_FLAG (tmp, FLAG_KNOWN_MAGICAL); 1624 tmp->set_flag (FLAG_KNOWN_MAGICAL);
1627 /* make runes more visibile */ 1625 /* make runes more visible */
1628 if (tmp->type == RUNE && tmp->attacktype & AT_MAGIC) 1626 if (tmp->type == RUNE && tmp->attacktype & AT_MAGIC)
1629 tmp->stats.Cha /= 4; 1627 tmp->stats.Cha /= 4;
1630 1628
1631 done_one = 1; 1629 done_one = 1;
1632 } 1630 }
1633 1631
1634 /* detect monster */ 1632 /* detect monster */
1635 if (QUERY_FLAG (spell, FLAG_MONSTER) && (QUERY_FLAG (tmp, FLAG_MONSTER) || tmp->type == PLAYER)) 1633 if (spell->flag [FLAG_MONSTER] && (tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER))
1636 { 1634 {
1637 done_one = 2; 1635 done_one = 2;
1638 1636
1639 if (!detect) 1637 if (!detect)
1640 detect = tmp; 1638 detect = tmp;
1642 1640
1643 /* Basically, if race is set in the spell, then the creatures race must 1641 /* Basically, if race is set in the spell, then the creatures race must
1644 * match that. if the spell race is set to GOD, then the gods opposing 1642 * match that. if the spell race is set to GOD, then the gods opposing
1645 * race must match. 1643 * race must match.
1646 */ 1644 */
1647 if (spell->race && QUERY_FLAG (tmp, FLAG_MONSTER) && tmp->race && 1645 if (spell->race && tmp->flag [FLAG_MONSTER] && tmp->race &&
1648 ((spell->race == shstr_GOD && god && god->slaying.contains (tmp->race)) || 1646 ((spell->race == shstr_GOD && god && god->slaying.contains (tmp->race)) ||
1649 spell->race.contains (tmp->race))) 1647 spell->race.contains (tmp->race)))
1650 { 1648 {
1651 done_one = 2; 1649 done_one = 2;
1652 1650
1653 if (!detect) 1651 if (!detect)
1654 detect = tmp; 1652 detect = tmp;
1655 } 1653 }
1656 1654
1657 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED) && 1655 if (spell->flag [FLAG_KNOWN_CURSED] && !tmp->flag [FLAG_KNOWN_CURSED] &&
1658 (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) 1656 (tmp->flag [FLAG_CURSED] || tmp->flag [FLAG_DAMNED]))
1659 { 1657 {
1660 SET_FLAG (tmp, FLAG_KNOWN_CURSED); 1658 tmp->set_flag (FLAG_KNOWN_CURSED);
1661 done_one = 1; 1659 done_one = 1;
1660 }
1661
1662 // Do mining detection spell:
1663 if (spell->last_sp == 1) // 1 - detect any vein
1664 {
1665 if (tmp->type == VEIN)
1666 {
1667 if (tmp->other_arch)
1668 {
1669 if (!detect)
1670 detect = tmp->other_arch;
1671 done_one = 2;
1672 }
1673 else
1674 done_one = 1;
1675 }
1662 } 1676 }
1663 } /* for stack of objects on this space */ 1677 } /* for stack of objects on this space */
1664 1678
1665 /* Code here puts an effect of the spell on the space, so you can see 1679 /* Code here puts an effect of the spell on the space, so you can see
1666 * where the magic is. 1680 * where the magic is.
1667 */ 1681 */
1668 if (done_one) 1682 if (done_one)
1669 { 1683 {
1670 object *detect_ob = arch_to_object (spell->other_arch); 1684 object *detect_ob = spell->other_arch->instance ();
1671 1685
1672 /* if this is set, we want to copy the face */ 1686 /* if this is set, we want to copy the face */
1673 if (done_one == 2 && detect) 1687 if (done_one == 2 && detect)
1674 { 1688 {
1675 detect_ob->face = detect->face; 1689 detect_ob->face = detect->face;
1676 detect_ob->animation_id = detect->animation_id; 1690 detect_ob->animation_id = detect->animation_id;
1677 detect_ob->anim_speed = detect->anim_speed; 1691 detect_ob->anim_speed = detect->anim_speed;
1678 detect_ob->last_anim = 0; 1692 detect_ob->last_anim = 0;
1679 /* by default, the detect_ob is already animated */ 1693 /* by default, the detect_ob is already animated */
1680 if (!QUERY_FLAG (detect, FLAG_ANIMATE)) 1694 if (!detect->flag [FLAG_ANIMATE])
1681 CLEAR_FLAG (detect_ob, FLAG_ANIMATE); 1695 detect_ob->clr_flag (FLAG_ANIMATE);
1682 } 1696 }
1683 1697
1684 m->insert (detect_ob, nx, ny, op); 1698 m->insert (detect_ob, nx, ny, op, INS_ON_TOP);
1685 } 1699 }
1686 } /* for processing the surrounding spaces */ 1700 } /* for processing the surrounding spaces */
1687 1701
1688 1702
1689 /* Now process objects in the players inventory if detect curse or magic */ 1703 /* Now process objects in the players inventory if detect curse or magic */
1690 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) || QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL)) 1704 if (spell->flag [FLAG_KNOWN_CURSED] || spell->flag [FLAG_KNOWN_MAGICAL])
1691 { 1705 {
1692 done_one = 0; 1706 done_one = 0;
1693 1707
1694 for (tmp = op->inv; tmp; tmp = tmp->below) 1708 for (tmp = op->inv; tmp; tmp = tmp->below)
1695 { 1709 {
1696 if (!tmp->invisible && !QUERY_FLAG (tmp, FLAG_IDENTIFIED)) 1710 if (!tmp->invisible && !tmp->flag [FLAG_IDENTIFIED])
1697 { 1711 {
1698 if (QUERY_FLAG (spell, FLAG_KNOWN_MAGICAL) && is_magical (tmp) && !QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL)) 1712 if (spell->flag [FLAG_KNOWN_MAGICAL] && is_magical (tmp) && !tmp->flag [FLAG_KNOWN_MAGICAL])
1699 { 1713 {
1700 SET_FLAG (tmp, FLAG_KNOWN_MAGICAL); 1714 tmp->set_flag (FLAG_KNOWN_MAGICAL);
1701 1715
1702 if (object *pl = tmp->visible_to ()) 1716 if (object *pl = tmp->visible_to ())
1703 esrv_update_item (UPD_FLAGS, pl, tmp); 1717 esrv_update_item (UPD_FLAGS, pl, tmp);
1704 } 1718 }
1705 1719
1706 if (QUERY_FLAG (spell, FLAG_KNOWN_CURSED) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED) && 1720 if (spell->flag [FLAG_KNOWN_CURSED] && !tmp->flag [FLAG_KNOWN_CURSED] &&
1707 (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))) 1721 (tmp->flag [FLAG_CURSED] || tmp->flag [FLAG_DAMNED]))
1708 { 1722 {
1709 SET_FLAG (tmp, FLAG_KNOWN_CURSED); 1723 tmp->set_flag (FLAG_KNOWN_CURSED);
1710 1724
1711 if (object *pl = tmp->visible_to ()) 1725 if (object *pl = tmp->visible_to ())
1712 esrv_update_item (UPD_FLAGS, pl, tmp); 1726 esrv_update_item (UPD_FLAGS, pl, tmp);
1713 } 1727 }
1714 } /* if item is not identified */ 1728 } /* if item is not identified */
1774 mflags = get_map_flags (m, &m, x, y, &x, &y); 1788 mflags = get_map_flags (m, &m, x, y, &x, &y);
1775 1789
1776 if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE) 1790 if (!(mflags & P_OUT_OF_MAP) && mflags & P_IS_ALIVE)
1777 { 1791 {
1778 for (plyr = GET_MAP_OB (m, x, y); plyr != NULL; plyr = plyr->above) 1792 for (plyr = GET_MAP_OB (m, x, y); plyr != NULL; plyr = plyr->above)
1779 if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) 1793 if (plyr != op && plyr->flag [FLAG_ALIVE])
1780 break; 1794 break;
1781 } 1795 }
1782 1796
1783 1797
1784 /* If we did not find a player in the specified direction, transfer 1798 /* If we did not find a player in the specified direction, transfer
1785 * to anyone on top of us. This is used for the rune of transference mostly. 1799 * to anyone on top of us. This is used for the rune of transference mostly.
1786 */ 1800 */
1787 if (plyr == NULL) 1801 if (plyr == NULL)
1788 for (plyr = GET_MAP_OB (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above) 1802 for (plyr = GET_MAP_OB (op->map, op->x, op->y); plyr != NULL; plyr = plyr->above)
1789 if (plyr != op && QUERY_FLAG (plyr, FLAG_ALIVE)) 1803 if (plyr != op && plyr->flag [FLAG_ALIVE])
1790 break; 1804 break;
1791 1805
1792 if (!plyr) 1806 if (!plyr)
1793 { 1807 {
1794 new_draw_info (NDI_BLACK, 0, op, "There is no one there."); 1808 op->failmsg ("There is no one there.");
1795 return 0; 1809 return 0;
1796 } 1810 }
1797 /* give sp */ 1811 /* give sp */
1798 if (spell->stats.dam > 0) 1812 if (spell->stats.dam > 0)
1799 { 1813 {
1811 if (rate > 95) 1825 if (rate > 95)
1812 rate = 95; 1826 rate = 95;
1813 1827
1814 sucked = (plyr->stats.sp * rate) / 100; 1828 sucked = (plyr->stats.sp * rate) / 100;
1815 plyr->stats.sp -= sucked; 1829 plyr->stats.sp -= sucked;
1816 if (QUERY_FLAG (op, FLAG_ALIVE)) 1830 if (op->flag [FLAG_ALIVE])
1817 { 1831 {
1818 /* Player doesn't get full credit */ 1832 /* Player doesn't get full credit */
1819 sucked = (sucked * rate) / 100; 1833 sucked = (sucked * rate) / 100;
1820 op->stats.sp += sucked; 1834 op->stats.sp += sucked;
1821 if (sucked > 0) 1835 if (sucked > 0)
1872 * monsters either. 1886 * monsters either.
1873 */ 1887 */
1874 1888
1875 if (head->attacktype & AT_MAGIC 1889 if (head->attacktype & AT_MAGIC
1876 && !(head->attacktype & AT_COUNTERSPELL) 1890 && !(head->attacktype & AT_COUNTERSPELL)
1877 && !QUERY_FLAG (head, FLAG_MONSTER) 1891 && !head->flag [FLAG_MONSTER]
1878 && (op->level > head->level)) 1892 && (op->level > head->level))
1879 head->destroy (); 1893 head->destroy ();
1880 else 1894 else
1881 switch (head->type) 1895 switch (head->type)
1882 { 1896 {
1883 case SPELL_EFFECT: 1897 case SPELL_EFFECT:
1884 // XXX: Don't affect floor spelleffects. See also XXX comment 1898 // XXX: Don't affect floor spelleffects. See also XXX comment
1885 // about sanctuary in spell_util.C 1899 // about sanctuary in spell_util.C
1886 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1900 if (tmp->flag [FLAG_IS_FLOOR])
1887 continue; 1901 continue;
1888 1902
1889 if (op->level > head->level) 1903 if (op->level > head->level)
1890 head->destroy (); 1904 head->destroy ();
1891 1905
1914 1928
1915 object *tmp, *god = find_god (determine_god (op)); 1929 object *tmp, *god = find_god (determine_god (op));
1916 1930
1917 if (!god) 1931 if (!god)
1918 { 1932 {
1919 new_draw_info (NDI_UNIQUE, 0, op, "You can't consecrate anything if you don't worship a god!"); 1933 op->failmsg ("You can't consecrate anything if you don't worship a god!");
1920 return 0; 1934 return 0;
1921 } 1935 }
1922 1936
1923 for (tmp = op->below; tmp; tmp = tmp->below) 1937 for (tmp = op->below; tmp; tmp = tmp->below)
1924 { 1938 {
1925 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) 1939 if (tmp->flag [FLAG_IS_FLOOR])
1926 break; 1940 break;
1927 if (tmp->type == HOLY_ALTAR) 1941 if (tmp->type == HOLY_ALTAR)
1928 { 1942 {
1929 1943
1930 if (tmp->level > casting_level (caster, spell)) 1944 if (tmp->level > casting_level (caster, spell))
1931 { 1945 {
1932 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not powerful enough to reconsecrate the %s", &tmp->name); 1946 op->failmsgf ("You are not powerful enough to reconsecrate the %s", &tmp->name);
1933 return 0; 1947 return 0;
1934 } 1948 }
1935 else 1949 else
1936 { 1950 {
1937 /* If we got here, we are consecrating an altar */ 1951 /* If we got here, we are consecrating an altar */
1946 new_draw_info_format (NDI_UNIQUE, 0, op, "You consecrated the altar to %s!", &god->name); 1960 new_draw_info_format (NDI_UNIQUE, 0, op, "You consecrated the altar to %s!", &god->name);
1947 return 1; 1961 return 1;
1948 } 1962 }
1949 } 1963 }
1950 } 1964 }
1951 new_draw_info (NDI_UNIQUE, 0, op, "You are not standing over an altar!"); 1965
1966 op->failmsg ("You are not standing over an altar!");
1952 return 0; 1967 return 0;
1953} 1968}
1954 1969
1955/* animate_weapon - 1970/* animate_weapon -
1956 * Generalization of staff_to_snake. Makes a golem out of the caster's weapon. 1971 * Generalization of staff_to_snake. Makes a golem out of the caster's weapon.
1998 2013
1999 /* if there's no place to put the golem, abort */ 2014 /* if there's no place to put the golem, abort */
2000 if (dir < 0 || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP) 2015 if (dir < 0 || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP)
2001 || ((spell->other_arch->move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->move_type)) 2016 || ((spell->other_arch->move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->move_type))
2002 { 2017 {
2003 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way."); 2018 op->failmsg ("There is something in the way.");
2004 return 0; 2019 return 0;
2005 } 2020 }
2006 2021
2007 /* Use the weapon marked by the player. */ 2022 /* Use the weapon marked by the player. */
2008 weapon = find_marked_object (op); 2023 weapon = find_marked_object (op);
2009 2024
2010 if (!weapon) 2025 if (!weapon)
2011 { 2026 {
2012 new_draw_info (NDI_BLACK, 0, op, "You must mark a weapon to use with this spell!"); 2027 op->failmsg ("You must mark a weapon to use with this spell!");
2013 return 0; 2028 return 0;
2014 } 2029 }
2015 2030
2016 if (spell->race && weapon->arch->archname != spell->race) 2031 if (spell->race && weapon->arch->archname != spell->race)
2017 { 2032 {
2018 new_draw_info (NDI_UNIQUE, 0, op, "The spell fails to transform your weapon."); 2033 op->failmsg ("The spell fails to transform your weapon.");
2019 return 0; 2034 return 0;
2020 } 2035 }
2021 2036
2022 if (weapon->type != WEAPON) 2037 if (weapon->type != WEAPON)
2023 { 2038 {
2024 new_draw_info (NDI_UNIQUE, 0, op, "You need to wield a weapon to animate it."); 2039 op->failmsg ("You need to wield a weapon to animate it.");
2025 return 0; 2040 return 0;
2026 } 2041 }
2027 2042
2028 if (QUERY_FLAG (weapon, FLAG_APPLIED)) 2043 if (weapon->flag [FLAG_APPLIED])
2029 { 2044 {
2030 new_draw_info_format (NDI_BLACK, 0, op, "You need to unequip %s before using it in this spell", query_name (weapon)); 2045 op->failmsgf ("You need to unequip %s before using it in this spell", query_name (weapon));
2031 return 0; 2046 return 0;
2032 } 2047 }
2033 2048
2034 weapon = weapon->split (); 2049 weapon = weapon->split ();
2035 2050
2036 /* create the golem object */ 2051 /* create the golem object */
2037 tmp = arch_to_object (spell->other_arch); 2052 tmp = spell->other_arch->instance ();
2038 2053
2039 /* if animated by a player, give the player control of the golem */ 2054 /* if animated by a player, give the player control of the golem */
2040 CLEAR_FLAG (tmp, FLAG_MONSTER); 2055 tmp->clr_flag (FLAG_MONSTER);
2041 tmp->stats.exp = 0; 2056 tmp->stats.exp = 0;
2042 add_friendly_object (tmp); 2057 add_friendly_object (tmp);
2043 tmp->type = GOLEM; 2058 tmp->type = GOLEM;
2044 tmp->set_owner (op); 2059 tmp->set_owner (op);
2045 op->contr->golem = tmp; 2060 op->contr->golem = tmp;
2047 2062
2048 /* Give the weapon to the golem now. A bit of a hack to check the 2063 /* Give the weapon to the golem now. A bit of a hack to check the
2049 * removed flag - it should only be set if weapon->split was 2064 * removed flag - it should only be set if weapon->split was
2050 * used above. 2065 * used above.
2051 */ 2066 */
2052 if (!QUERY_FLAG (weapon, FLAG_REMOVED)) 2067 if (!weapon->flag [FLAG_REMOVED])
2053 weapon->remove (); 2068 weapon->remove ();
2054 2069
2055 tmp->insert (weapon); 2070 tmp->insert (weapon);
2056 2071
2057 /* To do everything necessary to let a golem use the weapon is a pain, 2072 /* To do everything necessary to let a golem use the weapon is a pain,
2058 * so instead, just set it as equipped (otherwise, we need to update 2073 * so instead, just set it as equipped (otherwise, we need to update
2059 * body_info, skills, etc) 2074 * body_info, skills, etc)
2060 */ 2075 */
2061 SET_FLAG (tmp, FLAG_USE_WEAPON); 2076 tmp->set_flag (FLAG_USE_WEAPON);
2062 SET_FLAG (weapon, FLAG_APPLIED); 2077 weapon->set_flag (FLAG_APPLIED);
2063 tmp->update_stats (); 2078 tmp->update_stats ();
2064 2079
2065 /* There used to be 'odd' code that basically seemed to take the absolute 2080 /* There used to be 'odd' code that basically seemed to take the absolute
2066 * value of the weapon->magic an use that. IMO, that doesn't make sense - 2081 * value of the weapon->magic an use that. IMO, that doesn't make sense -
2067 * if you're using a crappy weapon, it shouldn't be as good. 2082 * if you're using a crappy weapon, it shouldn't be as good.
2087 2102
2088 /* attacktype */ 2103 /* attacktype */
2089 if (!tmp->attacktype) 2104 if (!tmp->attacktype)
2090 tmp->attacktype = AT_PHYSICAL; 2105 tmp->attacktype = AT_PHYSICAL;
2091 2106
2092 if (materialtype_t *mt = name_to_material (op->materialname))
2093 {
2094 for (i = 0; i < NROFATTACKS; i++) 2107 for (i = 0; i < NROFATTACKS; i++)
2095 tmp->resist[i] = 50 - (mt->save[i] * 5); 2108 tmp->resist[i] = 50 - (op->material->save[i] * 5);
2096 a = mt->save[0]; 2109
2097 } 2110 a = op->material->save[0];
2098 else
2099 {
2100 for (i = 0; i < NROFATTACKS; i++)
2101 tmp->resist[i] = 5;
2102 a = 10;
2103 }
2104 2111
2105 /* Set weapon's immunity */ 2112 /* Set weapon's immunity */
2106 tmp->resist[ATNR_CONFUSION] = 100; 2113 tmp->resist[ATNR_CONFUSION] = 100;
2107 tmp->resist[ATNR_POISON] = 100; 2114 tmp->resist[ATNR_POISON] = 100;
2108 tmp->resist[ATNR_SLOW] = 100; 2115 tmp->resist[ATNR_SLOW] = 100;
2135 tmp->state = weapon->state; 2142 tmp->state = weapon->state;
2136 tmp->flag [FLAG_ANIMATE] = weapon->flag [FLAG_ANIMATE]; 2143 tmp->flag [FLAG_ANIMATE] = weapon->flag [FLAG_ANIMATE];
2137 } 2144 }
2138 2145
2139 /* make experience increase in proportion to the strength of the summoned creature. */ 2146 /* make experience increase in proportion to the strength of the summoned creature. */
2140 tmp->stats.exp *= 1 + (MAX (spell->stats.maxgrace, spell->stats.sp) / casting_level (caster, spell)); 2147 tmp->stats.exp *= 1 + (max (spell->stats.maxgrace, spell->stats.sp) / casting_level (caster, spell));
2141 2148
2142 tmp->speed_left = -1; 2149 tmp->speed_left = -1;
2143 tmp->direction = dir; 2150 tmp->direction = dir;
2144 2151
2145 m->insert (tmp, x, y, op); 2152 m->insert (tmp, x, y, op);
2162 success = op->map->change_map_light (spell->stats.dam); 2169 success = op->map->change_map_light (spell->stats.dam);
2163 2170
2164 if (!success) 2171 if (!success)
2165 { 2172 {
2166 if (spell->stats.dam < 0) 2173 if (spell->stats.dam < 0)
2167 new_draw_info (NDI_UNIQUE, 0, op, "It can be no brighter here."); 2174 op->failmsg ("It can be no brighter here.");
2168 else 2175 else
2169 new_draw_info (NDI_UNIQUE, 0, op, "It can be no darker here."); 2176 op->failmsg ("It can be no darker here.");
2170 } 2177 }
2171 2178
2172 return success; 2179 return success;
2173} 2180}
2174 2181
2184 2191
2185 new_aura = present_arch_in_ob (spell->other_arch, op); 2192 new_aura = present_arch_in_ob (spell->other_arch, op);
2186 if (new_aura) 2193 if (new_aura)
2187 refresh = 1; 2194 refresh = 1;
2188 else 2195 else
2189 new_aura = arch_to_object (spell->other_arch); 2196 new_aura = spell->other_arch->instance ();
2190 2197
2191 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell); 2198 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell);
2192 2199
2193 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell); 2200 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
2194 2201
2259 if (pos.normalise () && !(OB_TYPE_MOVE_BLOCK (env, pos->move_block))) 2266 if (pos.normalise () && !(OB_TYPE_MOVE_BLOCK (env, pos->move_block)))
2260 { 2267 {
2261 hit_map (aura, i, aura->attacktype, 0); 2268 hit_map (aura, i, aura->attacktype, 0);
2262 2269
2263 if (aura->other_arch) 2270 if (aura->other_arch)
2264 pos.insert (arch_to_object (aura->other_arch), aura); 2271 pos.insert (aura->other_arch->instance (), aura);
2265 } 2272 }
2266 } 2273 }
2267 2274
2268 /* put the aura back in the player's inventory */ 2275 /* put the aura back in the player's inventory */
2269 env->insert (aura); 2276 env->insert (aura);
2279 for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above) 2286 for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above)
2280 { 2287 {
2281 int atk_lev, def_lev; 2288 int atk_lev, def_lev;
2282 object *victim = tmp->head_ (); 2289 object *victim = tmp->head_ ();
2283 2290
2284 if (!QUERY_FLAG (victim, FLAG_MONSTER)) 2291 if (!victim->flag [FLAG_MONSTER])
2285 continue; 2292 continue;
2286 2293
2287 if (QUERY_FLAG (victim, FLAG_UNAGGRESSIVE)) 2294 if (victim->flag [FLAG_UNAGGRESSIVE])
2288 continue; 2295 continue;
2289 2296
2290 if (victim->stats.exp == 0) 2297 if (victim->stats.exp == 0)
2291 continue; 2298 continue;
2292 2299
2293 def_lev = MAX (1, victim->level); 2300 def_lev = max (1, victim->level);
2294 atk_lev = MAX (1, op->level); 2301 atk_lev = max (1, op->level);
2295 2302
2296 if (rndm (0, atk_lev - 1) > def_lev) 2303 if (rndm (0, atk_lev - 1) > def_lev)
2297 { 2304 {
2298 /* make this sucker peaceful. */ 2305 /* make this sucker peaceful. */
2299 2306
2308 victim->stats.sp = 0; 2315 victim->stats.sp = 0;
2309 victim->stats.grace = 0; 2316 victim->stats.grace = 0;
2310 victim->stats.Pow = 0; 2317 victim->stats.Pow = 0;
2311#endif 2318#endif
2312 victim->attack_movement = RANDO2; 2319 victim->attack_movement = RANDO2;
2313 SET_FLAG (victim, FLAG_UNAGGRESSIVE); 2320 victim->set_flag (FLAG_UNAGGRESSIVE);
2314 SET_FLAG (victim, FLAG_RUN_AWAY); 2321 victim->set_flag (FLAG_RUN_AWAY);
2315 SET_FLAG (victim, FLAG_RANDOM_MOVE); 2322 victim->set_flag (FLAG_RANDOM_MOVE);
2316 CLEAR_FLAG (victim, FLAG_MONSTER); 2323 victim->clr_flag (FLAG_MONSTER);
2317 2324
2318 if (victim->name) 2325 if (victim->name)
2319 new_draw_info_format (NDI_UNIQUE, 0, op->owner, "%s no longer feels like fighting.", &victim->name); 2326 new_draw_info_format (NDI_UNIQUE, 0, op->owner, "%s no longer feels like fighting.", &victim->name);
2320 } 2327 }
2321 } 2328 }
2327int 2334int
2328write_mark (object *op, object *spell, const char *msg) 2335write_mark (object *op, object *spell, const char *msg)
2329{ 2336{
2330 if (!msg || msg[0] == 0) 2337 if (!msg || msg[0] == 0)
2331 { 2338 {
2332 new_draw_info (NDI_UNIQUE, 0, op, "Write what?"); 2339 op->failmsg ("Write what?");
2333 return 0; 2340 return 0;
2334 } 2341 }
2335 2342
2336 if (!msg_is_safe (msg)) 2343 if (!msg_is_safe (msg))
2337 { 2344 {
2338 new_draw_info (NDI_UNIQUE, 0, op, "Trying to cheat are we?"); 2345 op->failmsg ("Trying to cheat are we? H<@-signs are not allowed in marking runes.>");
2339 LOG (llevInfo, "write_mark: player %s tried to write bogus rune %s\n", &op->name, msg); 2346 LOG (llevInfo, "write_mark: player %s tried to write bogus rune %s\n", &op->name, msg);
2340 return 0; 2347 return 0;
2341 } 2348 }
2342 2349
2343 if (!spell->other_arch) 2350 if (!spell->other_arch)
2344 return 0; 2351 return 0;
2345 2352
2346 object *tmp = arch_to_object (spell->other_arch); 2353 object *tmp = spell->other_arch->instance ();
2347 2354
2348 tmp->race = op->name; /*Save the owner of the rune */ 2355 tmp->race = op->name; /*Save the owner of the rune */
2349 tmp->msg = msg; 2356 tmp->msg = msg;
2350 2357
2351 tmp->insert_at (op, op, INS_BELOW_ORIGINATOR); 2358 tmp->insert_at (op, op, INS_BELOW_ORIGINATOR);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines