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.28 by root, Sat Dec 30 10:16:11 2006 UTC vs.
Revision 1.52 by root, Thu May 17 14:14:55 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24#include <global.h> 25#include <global.h>
25#include <object.h> 26#include <object.h>
26#include <living.h> 27#include <living.h>
27#ifndef __CEXTRACT__
28# include <sproto.h> 28#include <sproto.h>
29#endif
30#include <spells.h> 29#include <spells.h>
31#include <sounds.h> 30#include <sounds.h>
32 31
33/* cast_magic_storm: This is really used mostly for spell 32/* cast_magic_storm: This is really used mostly for spell
34 * fumbles at the like. tmp is the object to propogate. 33 * fumbles at the like. tmp is the object to propogate.
155 /* If it starts with a letter, presume it is a description */ 154 /* If it starts with a letter, presume it is a description */
156 if (isalpha (*stringarg)) 155 if (isalpha (*stringarg))
157 { 156 {
158 artifact *al = find_artifactlist (missile->type)->items; 157 artifact *al = find_artifactlist (missile->type)->items;
159 158
160 for (; al != NULL; al = al->next) 159 for (; al; al = al->next)
161 if (!strcasecmp (al->item->name, stringarg)) 160 if (!strcasecmp (al->item->name, stringarg))
162 break; 161 break;
163 162
164 if (!al) 163 if (!al)
165 { 164 {
374 * normal applies. 373 * normal applies.
375 */ 374 */
376int 375int
377cast_invisible (object *op, object *caster, object *spell_ob) 376cast_invisible (object *op, object *caster, object *spell_ob)
378{ 377{
379 object *tmp;
380
381 if (op->invisible > 1000) 378 if (op->invisible > 1000)
382 { 379 {
383 new_draw_info (NDI_UNIQUE, 0, op, "You can not extend the duration of your invisibility any further"); 380 new_draw_info (NDI_UNIQUE, 0, op, "You can not extend the duration of your invisibility any further");
384 return 0; 381 return 0;
385 } 382 }
401 else 398 else
402 op->contr->tmp_invis = 1; 399 op->contr->tmp_invis = 1;
403 400
404 op->contr->hidden = 0; 401 op->contr->hidden = 0;
405 } 402 }
403
406 if (makes_invisible_to (op, op)) 404 if (makes_invisible_to (op, op))
407 new_draw_info (NDI_UNIQUE, 0, op, "You can't see your hands!"); 405 new_draw_info (NDI_UNIQUE, 0, op, "You can't see your hands!");
408 else 406 else
409 new_draw_info (NDI_UNIQUE, 0, op, "You feel more transparent!"); 407 new_draw_info (NDI_UNIQUE, 0, op, "You feel more transparent!");
410 408
411 update_object (op, UP_OBJ_FACE); 409 update_object (op, UP_OBJ_CHANGE);
412 410
413 /* Only search the active objects - only these should actually do 411 /* Only search the active objects - only these should actually do
414 * harm to the player. 412 * harm to the player.
415 */ 413 */
416 for (tmp = active_objects; tmp != NULL; tmp = tmp->active_next) 414 for_all_actives (tmp)
417 if (tmp->enemy == op) 415 if (tmp->enemy == op)
418 tmp->enemy = NULL; 416 tmp->enemy = 0;
417
419 return 1; 418 return 1;
420} 419}
421 420
422/* earth to dust spell. Basically destroys earthwalls in the area. 421/* earth to dust spell. Basically destroys earthwalls in the area.
423 */ 422 */
451 next = tmp->above; 450 next = tmp->above;
452 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) 451 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN))
453 hit_player (tmp, 9998, op, AT_PHYSICAL, 0); 452 hit_player (tmp, 9998, op, AT_PHYSICAL, 0);
454 } 453 }
455 } 454 }
455
456 return 1; 456 return 1;
457} 457}
458
459 458
460void 459void
461execute_word_of_recall (object *op) 460execute_word_of_recall (object *op)
462{ 461{
463 object *wor = op; 462 if (object *pl = op->in_player ())
464 463 {
465 while (op != NULL && op->type != PLAYER) 464 if (pl->ms ().flags () & P_NO_CLERIC && !QUERY_FLAG (pl, FLAG_WIZCAST))
466 op = op->env;
467
468 if (op != NULL && op->map)
469 if ((get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) && (!QUERY_FLAG (op, FLAG_WIZCAST)))
470 new_draw_info (NDI_UNIQUE, 0, op, "You feel something fizzle inside you."); 465 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you.");
471 else 466 else
467 {
468 // remove first so we do not call update_stats
469 op->remove ();
472 op->enter_exit (wor); 470 pl->enter_exit (op);
471 }
472 }
473 473
474 wor->destroy (); 474 op->destroy ();
475} 475}
476 476
477/* Word of recall causes the player to return 'home'. 477/* Word of recall causes the player to return 'home'.
478 * we put a force into the player object, so that there is a 478 * we put a force into the player object, so that there is a
479 * time delay effect. 479 * time delay effect.
498 { 498 {
499 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 499 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
500 LOG (llevError, "cast_word_of_recall: get_archetype(force) failed!\n"); 500 LOG (llevError, "cast_word_of_recall: get_archetype(force) failed!\n");
501 return 0; 501 return 0;
502 } 502 }
503
503 time = spell_ob->duration - SP_level_duration_adjust (caster, spell_ob); 504 time = spell_ob->duration - SP_level_duration_adjust (caster, spell_ob);
504 if (time < 1) 505 if (time < 1)
505 time = 1; 506 time = 1;
506 507
507 /* value of speed really doesn't make much difference, as long as it is 508 /* value of speed really doesn't make much difference, as long as it is
515 516
516 /* If we could take advantage of enter_player_savebed() here, it would be 517 /* If we could take advantage of enter_player_savebed() here, it would be
517 * nice, but until the map load fails, we can't. 518 * nice, but until the map load fails, we can't.
518 */ 519 */
519 EXIT_PATH (dummy) = op->contr->savebed_map; 520 EXIT_PATH (dummy) = op->contr->savebed_map;
520 EXIT_X (dummy) = op->contr->bed_x; 521 EXIT_X (dummy) = op->contr->bed_x;
521 EXIT_Y (dummy) = op->contr->bed_y; 522 EXIT_Y (dummy) = op->contr->bed_y;
522 523
523 (void) insert_ob_in_ob (dummy, op); 524 op->insert (dummy);
525
524 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you."); 526 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you.");
527
525 return 1; 528 return 1;
526} 529}
527 530
528/* cast_wonder 531/* cast_wonder
529 * wonder is really just a spell that will likely cast another 532 * wonder is really just a spell that will likely cast another
562} 565}
563 566
564int 567int
565perceive_self (object *op) 568perceive_self (object *op)
566{ 569{
570 char buf[MAX_BUF];
567 char *cp = describe_item (op, op), buf[MAX_BUF]; 571 const char *cp = describe_item (op, op);
568 archetype *at = archetype::find (ARCH_DEPLETION); 572 archetype *at = archetype::find (ARCH_DEPLETION);
569 object *tmp; 573 object *tmp;
570 int i; 574 int i;
571 575
572 tmp = find_god (determine_god (op)); 576 tmp = find_god (determine_god (op));
581 new_draw_info (NDI_UNIQUE, 0, op, "You feel very mundane"); 585 new_draw_info (NDI_UNIQUE, 0, op, "You feel very mundane");
582 else 586 else
583 { 587 {
584 new_draw_info (NDI_UNIQUE, 0, op, "You have:"); 588 new_draw_info (NDI_UNIQUE, 0, op, "You have:");
585 new_draw_info (NDI_UNIQUE, 0, op, cp); 589 new_draw_info (NDI_UNIQUE, 0, op, cp);
590
586 if (tmp != NULL) 591 if (tmp)
587 {
588 for (i = 0; i < NUM_STATS; i++) 592 for (i = 0; i < NUM_STATS; i++)
589 { 593 if (tmp->stats.stat (i) < 0)
590 if (get_attr_value (&tmp->stats, i) < 0)
591 {
592 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is depleted by %d", statname[i], -(get_attr_value (&tmp->stats, i))); 594 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is depleted by %d", statname[i], -tmp->stats.stat (i));
593 }
594 }
595 }
596 } 595 }
597 596
598 if (is_dragon_pl (op)) 597 if (is_dragon_pl (op))
599 { 598 {
600 /* now grab the 'dragon_ability'-force from the player's inventory */ 599 /* now grab the 'dragon_ability'-force from the player's inventory */
601 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 600 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
602 { 601 {
603 if (tmp->type == FORCE && !strcmp (tmp->arch->name, "dragon_ability_force")) 602 if (tmp->type == FORCE && !strcmp (tmp->arch->name, "dragon_ability_force"))
604 { 603 {
605 if (tmp->stats.exp == 0) 604 if (tmp->stats.exp == 0)
606 {
607 sprintf (buf, "Your metabolism isn't focused on anything."); 605 sprintf (buf, "Your metabolism isn't focused on anything.");
608 }
609 else 606 else
610 {
611 sprintf (buf, "Your metabolism is focused on %s.", change_resist_msg[tmp->stats.exp]); 607 sprintf (buf, "Your metabolism is focused on %s.", change_resist_msg[tmp->stats.exp]);
612 } 608
613 new_draw_info (NDI_UNIQUE, 0, op, buf); 609 new_draw_info (NDI_UNIQUE, 0, op, buf);
614 break; 610 break;
615 } 611 }
616 } 612 }
617 } 613 }
614
618 return 1; 615 return 1;
619} 616}
620 617
621/* int cast_create_town_portal (object *op, object *caster, int dir) 618/* int cast_create_town_portal (object *op, object *caster, int dir)
622 * 619 *
636 * Code by Tchize (david.delbecq@usa.net) 633 * Code by Tchize (david.delbecq@usa.net)
637 */ 634 */
638int 635int
639cast_create_town_portal (object *op, object *caster, object *spell, int dir) 636cast_create_town_portal (object *op, object *caster, object *spell, int dir)
640{ 637{
641 object *dummy, *force, *old_force, *tmp; 638 object *dummy, *force, *old_force;
642 archetype *perm_portal; 639 archetype *perm_portal;
643 char portal_name[1024], portal_message[1024]; 640 char portal_name[1024], portal_message[1024];
644 maptile *exitmap; 641 maptile *exitmap;
645 int op_level; 642 int op_level;
646
647 /* Check to see if the map the player is currently on is a per player unique
648 * map. This can be determined in that per player unique maps have the
649 * full pathname listed.
650 */
651 if (!strncmp (op->map->path, settings.localdir, strlen (settings.localdir)) && settings.create_home_portals != TRUE)
652 {
653 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You can't cast that here.\n");
654 return 0;
655 }
656 643
657 /* The first thing to do is to check if we have a marked destination 644 /* The first thing to do is to check if we have a marked destination
658 * dummy is used to make a check inventory for the force 645 * dummy is used to make a check inventory for the force
659 */ 646 */
660 dummy = arch_to_object (spell->other_arch); 647 dummy = arch_to_object (spell->other_arch);
676 */ 663 */
677 dummy->name = op->map->path; 664 dummy->name = op->map->path;
678 EXIT_X (dummy) = op->x; 665 EXIT_X (dummy) = op->x;
679 EXIT_Y (dummy) = op->y; 666 EXIT_Y (dummy) = op->y;
680 insert_ob_in_ob (dummy, op); 667 insert_ob_in_ob (dummy, op);
681 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You fix this place in your mind.\nYou feel you are able to come here from anywhere."); 668 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You fix this place in your mind. You feel you are able to come here from anywhere.");
682 return 1; 669 return 1;
683 } 670 }
684 671
685 dummy->destroy (); 672 dummy->destroy ();
686 673
718 * If it has the good name, we destruct it. 705 * If it has the good name, we destruct it.
719 * -We destruct the force indicating that portal. 706 * -We destruct the force indicating that portal.
720 */ 707 */
721 while ((old_force = check_inv_recursive (op, dummy))) 708 while ((old_force = check_inv_recursive (op, dummy)))
722 { 709 {
723 exitmap = maptile::find_map (old_force->race, op->map); 710 exitmap = maptile::find_sync (old_force->race, op->map);
724 711
725 if (exitmap) 712 if (exitmap)
726 { 713 {
714 exitmap->load_sync ();
715
727 int exitx = EXIT_X (old_force); 716 int exitx = EXIT_X (old_force);
728 int exity = EXIT_Y (old_force); 717 int exity = EXIT_Y (old_force);
729 718
730 tmp = present_arch (perm_portal, exitmap, exitx, exity); 719 for (object *tmp = present_arch (perm_portal, exitmap, exitx, exity); tmp; tmp = tmp->above)
731 while (tmp)
732 { 720 {
733 if (tmp->name == old_force->name) 721 if (tmp->name == old_force->name)
734 { 722 {
735 tmp->destroy (); 723 tmp->destroy ();
736 break; 724 break;
737 } 725 }
738
739 tmp = tmp->above;
740 } 726 }
741 } 727 }
742 728
743 old_force->destroy (); 729 old_force->destroy ();
744 } 730 }
754 * 'force' is the destination of the town portal, which we got 740 * 'force' is the destination of the town portal, which we got
755 * from the players inventory above. 741 * from the players inventory above.
756 */ 742 */
757 743
758 /* Ensure exit map is loaded */ 744 /* Ensure exit map is loaded */
759 exitmap = maptile::find_map (force->name, 0); 745 exitmap = maptile::find_sync (force->name);
760 746
761 /* If we were unable to load (ex. random map deleted), warn player */ 747 /* If we were unable to load (ex. random map deleted), warn player */
762 if (!exitmap) 748 if (!exitmap)
763 { 749 {
764 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?"); 750 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens. You can't remember where to go!?");
765 force->destroy (); 751 force->destroy ();
766 return 1; 752 return 1;
767 } 753 }
754
755 exitmap->load_sync ();
768 756
769 op_level = caster_level (caster, spell); 757 op_level = caster_level (caster, spell);
770 if (op_level < 15) 758 if (op_level < 15)
771 snprintf (portal_message, 1024, 759 snprintf (portal_message, 1024,
772 "\nThe air moves around you and\na huge smell of ammonia\nsurounds you as you pass\nthrough %s's tiny portal\nPouah!\n", 760 "The air moves around you and a huge smell of ammonia surounds you as you pass through %s's tiny portal. Pouah!\n",
773 &op->name); 761 &op->name);
774 else if (op_level < 30) 762 else if (op_level < 30)
775 snprintf (portal_message, 1024, 763 snprintf (portal_message, 1024,
776 "\n%s's portal smells of ozone.\nYou do a lot of movements and finally pass\nthrough the small hole in the air\n", &op->name); 764 "%s's portal smells of ozone. You do a lot of movements and finally pass through the small hole in the air\n", &op->name);
777 else if (op_level < 60) 765 else if (op_level < 60)
778 snprintf (portal_message, 1024, "\nA shining door opens in the air in front of you,\nshowing you the path to another place.\n"); 766 snprintf (portal_message, 1024, "A shining door opens in the air in front of you, showing you the path to another place.\n");
779 else 767 else
780 snprintf (portal_message, 1024, "\nAs you walk through %s's portal, flowers come out\nfrom the ground around you.\nYou feel awed.\n", 768 snprintf (portal_message, 1024, "As you walk through %s's portal, flowers come out from the ground around you. You feel awed.\n",
781 &op->name); 769 &op->name);
782 770
783 /* Create a portal in front of player 771 /* Create a portal in front of player
784 * dummy contain the portal and 772 * dummy contain the portal and
785 * force contain the track to kill it later 773 * force contain the track to kill it later
803 791
804 /* Now we need to to create a town portal marker inside the player 792 /* Now we need to to create a town portal marker inside the player
805 * object, so on future castings, we can know that he has an active 793 * object, so on future castings, we can know that he has an active
806 * town portal. 794 * town portal.
807 */ 795 */
808 tmp = get_archetype (spell->race); 796 object *tmp = get_archetype (spell->race);
809 if (tmp == NULL) 797
798 if (!tmp)
810 { 799 {
811 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 800 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
812 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name); 801 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name);
813 return 0; 802 return 0;
814 } 803 }
1157 object *poison; 1146 object *poison;
1158 int heal = 0, success = 0; 1147 int heal = 0, success = 0;
1159 1148
1160 tmp = find_target_for_friendly_spell (op, dir); 1149 tmp = find_target_for_friendly_spell (op, dir);
1161 1150
1162 if (tmp == NULL) 1151 if (!tmp)
1163 return 0; 1152 return 0;
1164 1153
1165 /* Figure out how many hp this spell might cure. 1154 /* Figure out how many hp this spell might cure.
1166 * could be zero if this spell heals effects, not damage. 1155 * could be zero if this spell heals effects, not damage.
1167 */ 1156 */
1170 heal += random_roll (spell->stats.hp, 6, op, PREFER_HIGH) + spell->stats.hp; 1159 heal += random_roll (spell->stats.hp, 6, op, PREFER_HIGH) + spell->stats.hp;
1171 1160
1172 if (heal) 1161 if (heal)
1173 { 1162 {
1174 if (tmp->stats.hp >= tmp->stats.maxhp) 1163 if (tmp->stats.hp >= tmp->stats.maxhp)
1175 {
1176 new_draw_info (NDI_UNIQUE, 0, tmp, "You are already fully healed."); 1164 new_draw_info (NDI_UNIQUE, 0, tmp, "You are already fully healed.");
1177 }
1178 else 1165 else
1179 { 1166 {
1180 /* See how many points we actually heal. Instead of messages 1167 /* See how many points we actually heal. Instead of messages
1181 * based on type of spell, we instead do messages based 1168 * based on type of spell, we instead do messages based
1182 * on amount of damage healed. 1169 * on amount of damage healed.
1184 if (heal > (tmp->stats.maxhp - tmp->stats.hp)) 1171 if (heal > (tmp->stats.maxhp - tmp->stats.hp))
1185 heal = tmp->stats.maxhp - tmp->stats.hp; 1172 heal = tmp->stats.maxhp - tmp->stats.hp;
1186 tmp->stats.hp += heal; 1173 tmp->stats.hp += heal;
1187 1174
1188 if (tmp->stats.hp >= tmp->stats.maxhp) 1175 if (tmp->stats.hp >= tmp->stats.maxhp)
1189 {
1190 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel just fine!"); 1176 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel just fine!");
1191 }
1192 else if (heal > 50) 1177 else if (heal > 50)
1193 {
1194 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds close!"); 1178 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds close!");
1195 }
1196 else if (heal > 25) 1179 else if (heal > 25)
1197 {
1198 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds mostly close."); 1180 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds mostly close.");
1199 }
1200 else if (heal > 10) 1181 else if (heal > 10)
1201 {
1202 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds start to fade."); 1182 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds start to fade.");
1203 }
1204 else 1183 else
1205 {
1206 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds start to close."); 1184 new_draw_info (NDI_UNIQUE, 0, tmp, "Your wounds start to close.");
1207 } 1185
1208 success = 1; 1186 success = 1;
1209 } 1187 }
1210 } 1188 }
1189
1211 if (spell->attacktype & AT_DISEASE) 1190 if (spell->attacktype & AT_DISEASE)
1212 if (cure_disease (tmp, op)) 1191 if (cure_disease (tmp, op))
1213 success = 1; 1192 success = 1;
1214 1193
1215 if (spell->attacktype & AT_POISON) 1194 if (spell->attacktype & AT_POISON)
1221 success = 1; 1200 success = 1;
1222 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed"); 1201 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed");
1223 poison->stats.food = 1; 1202 poison->stats.food = 1;
1224 } 1203 }
1225 } 1204 }
1205
1226 if (spell->attacktype & AT_CONFUSION) 1206 if (spell->attacktype & AT_CONFUSION)
1227 { 1207 {
1228 poison = present_in_ob_by_name (FORCE, "confusion", tmp); 1208 poison = present_in_ob_by_name (FORCE, "confusion", tmp);
1229 if (poison) 1209 if (poison)
1230 { 1210 {
1231 success = 1; 1211 success = 1;
1232 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); 1212 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer");
1233 poison->duration = 1; 1213 poison->duration = 1;
1234 } 1214 }
1235 } 1215 }
1216
1236 if (spell->attacktype & AT_BLIND) 1217 if (spell->attacktype & AT_BLIND)
1237 { 1218 {
1238 at = archetype::find ("blindness"); 1219 at = archetype::find ("blindness");
1239 poison = present_arch_in_ob (at, tmp); 1220 poison = present_arch_in_ob (at, tmp);
1240 if (poison) 1221 if (poison)
1242 success = 1; 1223 success = 1;
1243 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return."); 1224 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return.");
1244 poison->stats.food = 1; 1225 poison->stats.food = 1;
1245 } 1226 }
1246 } 1227 }
1228
1247 if (spell->last_sp && tmp->stats.sp < tmp->stats.maxsp) 1229 if (spell->last_sp && tmp->stats.sp < tmp->stats.maxsp)
1248 { 1230 {
1249 tmp->stats.sp += spell->last_sp; 1231 tmp->stats.sp += spell->last_sp;
1250 if (tmp->stats.sp > tmp->stats.maxsp) 1232 if (tmp->stats.sp > tmp->stats.maxsp)
1251 tmp->stats.sp = tmp->stats.maxsp; 1233 tmp->stats.sp = tmp->stats.maxsp;
1252 success = 1; 1234 success = 1;
1253 new_draw_info (NDI_UNIQUE, 0, tmp, "Magical energy surges through your body!"); 1235 new_draw_info (NDI_UNIQUE, 0, tmp, "Magical energy surges through your body!");
1254 } 1236 }
1237
1255 if (spell->last_grace && tmp->stats.grace < tmp->stats.maxgrace) 1238 if (spell->last_grace && tmp->stats.grace < tmp->stats.maxgrace)
1256 { 1239 {
1257 tmp->stats.grace += spell->last_grace; 1240 tmp->stats.grace += spell->last_grace;
1258 if (tmp->stats.grace > tmp->stats.maxgrace) 1241 if (tmp->stats.grace > tmp->stats.maxgrace)
1259 tmp->stats.grace = tmp->stats.maxgrace; 1242 tmp->stats.grace = tmp->stats.maxgrace;
1260 success = 1; 1243 success = 1;
1261 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel redeemed with your god!"); 1244 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel redeemed with your god!");
1262 } 1245 }
1246
1263 if (spell->stats.food && tmp->stats.food < 999) 1247 if (spell->stats.food && tmp->stats.food < 999)
1264 { 1248 {
1265 tmp->stats.food += spell->stats.food; 1249 tmp->stats.food += spell->stats.food;
1266 if (tmp->stats.food > 999) 1250 if (tmp->stats.food > 999)
1267 tmp->stats.food = 999; 1251 tmp->stats.food = 999;
1268 success = 1; 1252 success = 1;
1269 /* We could do something a bit better like the messages for healing above */ 1253 /* We could do something a bit better like the messages for healing above */
1270 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food"); 1254 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food");
1271 } 1255 }
1256
1272 return success; 1257 return success;
1273} 1258}
1274 1259
1275 1260
1276/* This is used for the spells that gain stats. There are no spells 1261/* This is used for the spells that gain stats. There are no spells
1368 if (tmp->type == PLAYER) 1353 if (tmp->type == PLAYER)
1369 { 1354 {
1370 /* Stat adjustment spells */ 1355 /* Stat adjustment spells */
1371 for (i = 0; i < NUM_STATS; i++) 1356 for (i = 0; i < NUM_STATS; i++)
1372 { 1357 {
1373 sint8 stat = get_attr_value (&spell_ob->stats, i), k, sm; 1358 if (sint8 stat = spell_ob->stats.stat (i))
1374
1375 if (stat)
1376 { 1359 {
1377 sm = 0; 1360 sint8 sm = 0;
1378 for (k = 0; k < stat; k++) 1361 for (sint8 k = 0; k < stat; k++)
1379 sm += rndm (1, 3); 1362 sm += rndm (1, 3);
1380 1363
1381 if ((get_attr_value (&tmp->stats, i) + sm) > (15 + 5 * stat)) 1364 if (tmp->stats.stat (i) + sm > 15 + 5 * stat)
1382 { 1365 sm = max (0, (15 + 5 * stat) - tmp->stats.stat (i));
1383 sm = (15 + 5 * stat) - get_attr_value (&tmp->stats, i); 1366
1384 if (sm < 0) 1367 force->stats.stat (i) = sm;
1385 sm = 0; 1368
1386 }
1387 set_attr_value (&force->stats, i, sm);
1388 if (!sm) 1369 if (!sm)
1389 new_draw_info (NDI_UNIQUE, 0, op, no_gain_msgs[i]); 1370 new_draw_info (NDI_UNIQUE, 0, op, no_gain_msgs[i]);
1390 } 1371 }
1391 } 1372 }
1392 } 1373 }
1524 change_abil (tmp, force); /* Mostly to display any messages */ 1505 change_abil (tmp, force); /* Mostly to display any messages */
1525 insert_ob_in_ob (force, tmp); 1506 insert_ob_in_ob (force, tmp);
1526 tmp->update_stats (); 1507 tmp->update_stats ();
1527 return 1; 1508 return 1;
1528} 1509}
1529
1530
1531 1510
1532/* Alchemy code by Mark Wedel 1511/* Alchemy code by Mark Wedel
1533 * 1512 *
1534 * This code adds a new spell, called alchemy. Alchemy will turn 1513 * This code adds a new spell, called alchemy. Alchemy will turn
1535 * objects to gold nuggets, the value of the gold nuggets being 1514 * objects to gold nuggets, the value of the gold nuggets being
1545 * For example, if an item is worth 110 gold, you will get 1524 * For example, if an item is worth 110 gold, you will get
1546 * 4 large nuggets, and from 0-10 small nuggets. 1525 * 4 large nuggets, and from 0-10 small nuggets.
1547 * 1526 *
1548 * There is also a chance (1:30) that you will get nothing at all 1527 * There is also a chance (1:30) that you will get nothing at all
1549 * for the object. There is also a maximum weight that will be 1528 * for the object. There is also a maximum weight that will be
1550 * alchemied. 1529 * alchemised.
1551 */ 1530 */
1552
1553/* I didn't feel like passing these as arguements to the
1554 * two functions that need them. Real values are put in them
1555 * when the spell is cast, and these are freed when the spell
1556 * is finished.
1557 */
1558static object *small, *large;
1559
1560static void 1531static void
1561alchemy_object (object *obj, int *small_nuggets, int *large_nuggets, int *weight) 1532alchemy_object (object *obj, uint64 &total_value, int &total_weight)
1562{ 1533{
1563 uint64 value = query_cost (obj, NULL, F_TRUE); 1534 uint64 value = query_cost (obj, NULL, F_TRUE);
1564 1535
1565 /* Give third price when we alchemy money (This should hopefully 1536 /* Give third price when we alchemy money (This should hopefully
1566 * make it so that it isn't worth it to alchemy money, sell 1537 * make it so that it isn't worth it to alchemy money, sell
1567 * the nuggets, alchemy the gold from that, etc. 1538 * the nuggets, alchemy the gold from that, etc.
1568 * Otherwise, give 9 silver on the gold for other objects, 1539 * Otherwise, give 9 silver on the gold for other objects,
1569 * so that it would still be more affordable to haul 1540 * so that it would still be more affordable to haul
1570 * the stuff back to town. 1541 * the stuff back to town.
1571 */ 1542 */
1572
1573 if (QUERY_FLAG (obj, FLAG_UNPAID)) 1543 if (QUERY_FLAG (obj, FLAG_UNPAID))
1574 value = 0; 1544 value = 0;
1575 else if (obj->type == MONEY || obj->type == GEM) 1545 else if (obj->type == MONEY || obj->type == GEM)
1576 value /= 3; 1546 value /= 3;
1577 else 1547 else
1578 value = (value * 9) / 10; 1548 value = value * 9 / 10;
1579 1549
1580 value /= 4; // fix by GHJ, don't understand, pcg
1581
1582 if ((obj->value > 0) && rndm (0, 29)) 1550 if (obj->value > 0 && rndm (0, 29))
1583 { 1551 total_value += value;
1584 int count;
1585 1552
1586 count = value / large->value;
1587 *large_nuggets += count;
1588 value -= (uint64) count *(uint64) large->value;
1589
1590 count = value / small->value;
1591 *small_nuggets += count;
1592 }
1593
1594 /* Turn 25 small nuggets into 1 large nugget. If the value
1595 * of large nuggets is not evenly divisable by the small nugget
1596 * value, take off an extra small_nugget (Assuming small_nuggets!=0)
1597 */
1598 if (*small_nuggets * small->value >= large->value)
1599 {
1600 (*large_nuggets)++;
1601 *small_nuggets -= large->value / small->value;
1602 if (*small_nuggets && large->value % small->value)
1603 (*small_nuggets)--;
1604 }
1605 weight += obj->weight; 1553 total_weight += obj->total_weight ();
1554
1606 obj->destroy (); 1555 obj->destroy ();
1607} 1556}
1608 1557
1609static void 1558static void
1610update_map (object *op, maptile *m, int small_nuggets, int large_nuggets, int x, int y) 1559update_map (object *op, maptile *m, int small_nuggets, object *small, int large_nuggets, object *large, int x, int y)
1611{ 1560{
1612 object *tmp;
1613 int flag = 0; 1561 int flag = 0;
1614 1562
1615 /* Put any nuggets below the player, but we can only pass this 1563 /* Put any nuggets below the player, but we can only pass this
1616 * flag if we are on the same space as the player 1564 * flag if we are on the same space as the player
1617 */ 1565 */
1618 if (x == op->x && y == op->y && op->map == m) 1566 if (x == op->x && y == op->y && op->map == m)
1619 flag = INS_BELOW_ORIGINATOR; 1567 flag = INS_BELOW_ORIGINATOR;
1620 1568
1621 if (small_nuggets) 1569 if (small_nuggets)
1622 { 1570 {
1623 tmp = small->clone (); 1571 object *tmp = small->clone ();
1624 tmp->nrof = small_nuggets; 1572 tmp->nrof = small_nuggets;
1625 m->insert (tmp, x, y, op, flag); 1573 m->insert (tmp, x, y, op, flag);
1626 } 1574 }
1627 1575
1628 if (large_nuggets) 1576 if (large_nuggets)
1629 { 1577 {
1630 tmp = large->clone (); 1578 object *tmp = large->clone ();
1631 tmp->nrof = large_nuggets; 1579 tmp->nrof = large_nuggets;
1632 m->insert (tmp, x, y, op, flag); 1580 m->insert (tmp, x, y, op, flag);
1633 } 1581 }
1582
1583 if (object *pl = m->at (x, y).player ())
1584 if (pl->contr->ns)
1585 pl->contr->ns->look_position = 0;
1634} 1586}
1635 1587
1636int 1588int
1637alchemy (object *op, object *caster, object *spell_ob) 1589alchemy (object *op, object *caster, object *spell_ob)
1638{ 1590{
1639 int x, y, weight = 0, weight_max, large_nuggets, small_nuggets, mflags;
1640 sint16 nx, ny;
1641 object *next, *tmp;
1642 maptile *mp;
1643
1644 if (op->type != PLAYER) 1591 if (op->type != PLAYER)
1645 return 0; 1592 return 0;
1646 1593
1594 object *large = get_archetype ("largenugget");
1595 object *small = get_archetype ("smallnugget");
1596
1647 /* Put a maximum weight of items that can be alchemied. Limits the power 1597 /* Put a maximum weight of items that can be alchemised. Limits the power
1648 * some, and also prevents people from alcheming every table/chair/clock 1598 * some, and also prevents people from alchemising every table/chair/clock
1649 * in sight 1599 * in sight
1650 */ 1600 */
1651 weight_max = spell_ob->duration + +SP_level_duration_adjust (caster, spell_ob); 1601 int duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
1652 weight_max *= 1000; 1602 int weight_max = duration * 1000;
1653 small = get_archetype ("smallnugget"), large = get_archetype ("largenugget"); 1603 uint64 value_max = duration * 1000;
1654 1604
1605 int weight = 0;
1606
1655 for (y = op->y - 1; y <= op->y + 1; y++) 1607 for (int y = op->y - 1; y <= op->y + 1; y++)
1656 { 1608 {
1657 for (x = op->x - 1; x <= op->x + 1; x++) 1609 for (int x = op->x - 1; x <= op->x + 1; x++)
1658 { 1610 {
1611 uint64 value = 0;
1612
1659 nx = x; 1613 sint16 nx = x;
1660 ny = y; 1614 sint16 ny = y;
1661 1615
1662 mp = op->map; 1616 maptile *mp = op->map;
1663 1617
1664 mflags = get_map_flags (mp, &mp, nx, ny, &nx, &ny); 1618 int mflags = get_map_flags (mp, &mp, nx, ny, &nx, &ny);
1665 1619
1666 if (mflags & (P_OUT_OF_MAP | P_NO_MAGIC)) 1620 if (mflags & (P_OUT_OF_MAP | P_NO_MAGIC))
1667 continue; 1621 continue;
1668 1622
1669 /* Treat alchemy a little differently - most spell effects 1623 /* Treat alchemy a little differently - most spell effects
1671 * ground level effect. 1625 * ground level effect.
1672 */ 1626 */
1673 if (GET_MAP_MOVE_BLOCK (mp, nx, ny) & MOVE_WALK) 1627 if (GET_MAP_MOVE_BLOCK (mp, nx, ny) & MOVE_WALK)
1674 continue; 1628 continue;
1675 1629
1676 small_nuggets = 0; 1630 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next)
1677 large_nuggets = 0;
1678
1679 for (tmp = GET_MAP_OB (mp, nx, ny); tmp != NULL; tmp = next)
1680 { 1631 {
1681 next = tmp->above; 1632 next = tmp->above;
1633
1682 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && 1634 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) &&
1683 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) 1635 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON))
1684 { 1636 {
1685
1686 if (tmp->inv) 1637 if (tmp->inv)
1687 { 1638 {
1688 object *next1, *tmp1; 1639 object *next1, *tmp1;
1689 1640
1690 for (tmp1 = tmp->inv; tmp1 != NULL; tmp1 = next1) 1641 for (tmp1 = tmp->inv; tmp1; tmp1 = next1)
1691 { 1642 {
1692 next1 = tmp1->below; 1643 next1 = tmp1->below;
1693 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) && 1644 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) &&
1694 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON)) 1645 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON))
1695 alchemy_object (tmp1, &small_nuggets, &large_nuggets, &weight); 1646 alchemy_object (tmp1, value, weight);
1696 } 1647 }
1697 } 1648 }
1649
1698 alchemy_object (tmp, &small_nuggets, &large_nuggets, &weight); 1650 alchemy_object (tmp, value, weight);
1699 1651
1700 if (weight > weight_max) 1652 if (weight > weight_max)
1701 { 1653 break;
1702 update_map (op, mp, small_nuggets, large_nuggets, nx, ny);
1703 large->destroy ();
1704 small->destroy ();
1705 return 1;
1706 } 1654 }
1707 } /* is alchemable object */ 1655 }
1708 } /* process all objects on this space */ 1656
1657 value = min (value, value_max);
1658
1659 uint64 count = value / large->value;
1660 int large_nuggets = count;
1661 value -= count * large->value;
1662
1663 count = value / small->value;
1664 int small_nuggets = count;
1709 1665
1710 /* Insert all the nuggets at one time. This probably saves time, but 1666 /* Insert all the nuggets at one time. This probably saves time, but
1711 * it also prevents us from alcheming nuggets that were just created 1667 * it also prevents us from alcheming nuggets that were just created
1712 * with this spell. 1668 * with this spell.
1713 */ 1669 */
1714 update_map (op, mp, small_nuggets, large_nuggets, nx, ny); 1670 update_map (op, mp, small_nuggets, small, large_nuggets, large, nx, ny);
1715 }
1716 }
1717 1671
1672 if (weight > weight_max)
1673 goto bailout;
1674 }
1675 }
1676
1677bailout:
1718 large->destroy (); 1678 large->destroy ();
1719 small->destroy (); 1679 small->destroy ();
1720 /* reset this so that if player standing on a big pile of stuff,
1721 * it is redrawn properly.
1722 */
1723 op->contr->ns->look_position = 0;
1724 return 1; 1680 return 1;
1725} 1681}
1726 1682
1727 1683
1728/* This function removes the cursed/damned status on equipped 1684/* This function removes the cursed/damned status on equipped
1755 } 1711 }
1756 1712
1757 if (op->type == PLAYER) 1713 if (op->type == PLAYER)
1758 { 1714 {
1759 if (success) 1715 if (success)
1760 {
1761 new_draw_info (NDI_UNIQUE, 0, op, "You feel like some of your items are looser now."); 1716 new_draw_info (NDI_UNIQUE, 0, op, "You feel like some of your items are looser now.");
1762 }
1763 else 1717 else
1764 { 1718 {
1765 if (was_one) 1719 if (was_one)
1766 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse."); 1720 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse.");
1767 else 1721 else
1791 { 1745 {
1792 identify (tmp); 1746 identify (tmp);
1793 1747
1794 if (op->type == PLAYER) 1748 if (op->type == PLAYER)
1795 { 1749 {
1796 new_draw_info_format (NDI_UNIQUE, 0, op, "You have %s.", long_desc (tmp, op)); 1750 new_draw_info_format (NDI_UNIQUE, 0, op, "You identified: %s.", long_desc (tmp, op));
1797 1751
1798 if (tmp->msg) 1752 if (tmp->msg)
1799 { 1753 {
1800 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); 1754 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:");
1801 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); 1755 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg);
1813 * stuff on the floor. Only identify stuff on the floor if the spell 1767 * stuff on the floor. Only identify stuff on the floor if the spell
1814 * was not fully used. 1768 * was not fully used.
1815 */ 1769 */
1816 if (num_ident) 1770 if (num_ident)
1817 { 1771 {
1818 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 1772 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above)
1819 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1773 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp))
1820 { 1774 {
1821 identify (tmp); 1775 identify (tmp);
1822 1776
1823 if (op->type == PLAYER) 1777 if (op->type == PLAYER)
1824 { 1778 {
1825 new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground is %s.", long_desc (tmp, op)); 1779 new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground you identified: %s.", long_desc (tmp, op));
1826 1780
1827 if (tmp->msg) 1781 if (tmp->msg)
1828 { 1782 {
1829 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); 1783 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:");
1830 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); 1784 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg);
2180 /* Basically, if the object is magical and not counterspell, 2134 /* Basically, if the object is magical and not counterspell,
2181 * we will more or less remove the object. Don't counterspell 2135 * we will more or less remove the object. Don't counterspell
2182 * monsters either. 2136 * monsters either.
2183 */ 2137 */
2184 2138
2185 if (head->attacktype & AT_MAGIC && 2139 if (head->attacktype & AT_MAGIC
2186 !(head->attacktype & AT_COUNTERSPELL) && !QUERY_FLAG (head, FLAG_MONSTER) && (op->level > head->level)) 2140 && !(head->attacktype & AT_COUNTERSPELL)
2141 && !QUERY_FLAG (head, FLAG_MONSTER)
2142 && (op->level > head->level))
2187 head->destroy (); 2143 head->destroy ();
2188 else 2144 else
2189 switch (head->type) 2145 switch (head->type)
2190 { 2146 {
2191 case SPELL_EFFECT: 2147 case SPELL_EFFECT:
2148 // XXX: Don't affect floor spelleffects. See also XXX comment
2149 // about sanctuary in spell_util.C
2150 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR))
2151 continue;
2152
2192 if (op->level > head->level) 2153 if (op->level > head->level)
2193 head->destroy (); 2154 head->destroy ();
2194 2155
2195 break; 2156 break;
2196 2157
2263 * This code was very odd - code early on would only let players use the spell, 2224 * This code was very odd - code early on would only let players use the spell,
2264 * yet the code wass full of player checks. I've presumed that the code 2225 * yet the code wass full of player checks. I've presumed that the code
2265 * that only let players use it was correct, and removed all the other 2226 * that only let players use it was correct, and removed all the other
2266 * player checks. MSW 2003-01-06 2227 * player checks. MSW 2003-01-06
2267 */ 2228 */
2268
2269int 2229int
2270animate_weapon (object *op, object *caster, object *spell, int dir) 2230animate_weapon (object *op, object *caster, object *spell, int dir)
2271{ 2231{
2272 object *weapon, *tmp; 2232 object *weapon, *tmp;
2273 char buf[MAX_BUF]; 2233 char buf[MAX_BUF];
2285 /* exit if it's not a player using this spell. */ 2245 /* exit if it's not a player using this spell. */
2286 if (op->type != PLAYER) 2246 if (op->type != PLAYER)
2287 return 0; 2247 return 0;
2288 2248
2289 /* if player already has a golem, abort */ 2249 /* if player already has a golem, abort */
2290 if (op->contr->ranges[range_golem]) 2250 if (object *golem = op->contr->golem)
2291 { 2251 {
2292 control_golem (op->contr->ranges[range_golem], dir); 2252 control_golem (golem, dir);
2293 return 0; 2253 return 0;
2294 } 2254 }
2295 2255
2296 /* if no direction specified, pick one */ 2256 /* if no direction specified, pick one */
2297 if (!dir) 2257 if (!dir)
2343 /* create the golem object */ 2303 /* create the golem object */
2344 tmp = arch_to_object (spell->other_arch); 2304 tmp = arch_to_object (spell->other_arch);
2345 2305
2346 /* if animated by a player, give the player control of the golem */ 2306 /* if animated by a player, give the player control of the golem */
2347 CLEAR_FLAG (tmp, FLAG_MONSTER); 2307 CLEAR_FLAG (tmp, FLAG_MONSTER);
2348 SET_FLAG (tmp, FLAG_FRIENDLY);
2349 tmp->stats.exp = 0; 2308 tmp->stats.exp = 0;
2350 add_friendly_object (tmp); 2309 add_friendly_object (tmp);
2351 tmp->type = GOLEM; 2310 tmp->type = GOLEM;
2352 tmp->set_owner (op); 2311 tmp->set_owner (op);
2312 op->contr->golem = tmp;
2353 set_spell_skill (op, caster, spell, tmp); 2313 set_spell_skill (op, caster, spell, tmp);
2354 op->contr->ranges[range_golem] = tmp;
2355 op->contr->shoottype = range_golem;
2356 2314
2357 /* Give the weapon to the golem now. A bit of a hack to check the 2315 /* Give the weapon to the golem now. A bit of a hack to check the
2358 * removed flag - it should only be set if get_split_object was 2316 * removed flag - it should only be set if get_split_object was
2359 * used above. 2317 * used above.
2360 */ 2318 */
2361 if (!QUERY_FLAG (weapon, FLAG_REMOVED)) 2319 if (!QUERY_FLAG (weapon, FLAG_REMOVED))
2362 weapon->remove (); 2320 weapon->remove ();
2321
2363 insert_ob_in_ob (weapon, tmp); 2322 insert_ob_in_ob (weapon, tmp);
2364 esrv_send_item (op, weapon); 2323 esrv_send_item (op, weapon);
2365 /* To do everything necessary to let a golem use the weapon is a pain, 2324 /* To do everything necessary to let a golem use the weapon is a pain,
2366 * so instead, just set it as equipped (otherwise, we need to update 2325 * so instead, just set it as equipped (otherwise, we need to update
2367 * body_info, skills, etc) 2326 * body_info, skills, etc)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines