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.8 by root, Sun Sep 10 15:59:57 2006 UTC vs.
Revision 1.20 by root, Thu Dec 14 04:30:32 2006 UTC

1
2/*
3 * static char *rcsid_spell_effect_c =
4 * "$Id: spell_effect.C,v 1.8 2006/09/10 15:59:57 root Exp $";
5 */
6
7
8/* 1/*
9 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
10 3
11 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
12 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
23 16
24 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
26 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 20
28 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
29*/ 22*/
30 23
31#include <global.h> 24#include <global.h>
32#include <object.h> 25#include <object.h>
33#include <living.h> 26#include <living.h>
81 if (!(random_roll (0, 3, op, PREFER_HIGH))) 74 if (!(random_roll (0, 3, op, PREFER_HIGH)))
82 { 75 {
83 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand)); 76 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand));
84 play_sound_map (op->map, op->x, op->y, SOUND_OB_EXPLODE); 77 play_sound_map (op->map, op->x, op->y, SOUND_OB_EXPLODE);
85 esrv_del_item (op->contr, wand->count); 78 esrv_del_item (op->contr, wand->count);
86 remove_ob (wand); 79 wand->destroy ();
87 free_object (wand);
88 tmp = get_archetype ("fireball"); 80 tmp = get_archetype ("fireball");
89 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10; 81 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10;
90 if (!tmp->stats.dam) 82 if (!tmp->stats.dam)
91 tmp->stats.dam = 1; 83 tmp->stats.dam = 1;
92 tmp->stats.hp = tmp->stats.dam / 2; 84 tmp->stats.hp = tmp->stats.dam / 2;
135cast_create_missile (object *op, object *caster, object *spell, int dir, const char *stringarg) 127cast_create_missile (object *op, object *caster, object *spell, int dir, const char *stringarg)
136{ 128{
137 int missile_plus = 0, bonus_plus = 0; 129 int missile_plus = 0, bonus_plus = 0;
138 const char *missile_name; 130 const char *missile_name;
139 object *tmp, *missile; 131 object *tmp, *missile;
140 tag_t tag;
141 132
142 missile_name = "arrow"; 133 missile_name = "arrow";
143 134
144 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 135 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
145 if (tmp->type == BOW && QUERY_FLAG (tmp, FLAG_APPLIED)) 136 if (tmp->type == BOW && QUERY_FLAG (tmp, FLAG_APPLIED))
146 {
147 missile_name = tmp->race; 137 missile_name = tmp->race;
148 }
149 138
150 missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell); 139 missile_plus = spell->stats.dam + SP_level_dam_adjust (caster, spell);
151 140
152 if (find_archetype (missile_name) == NULL) 141 if (archetype::find (missile_name) == NULL)
153 { 142 {
154 LOG (llevDebug, "Cast create_missile: could not find archetype %s\n", missile_name); 143 LOG (llevDebug, "Cast create_missile: could not find archetype %s\n", missile_name);
155 return 0; 144 return 0;
156 } 145 }
146
157 missile = get_archetype (missile_name); 147 missile = get_archetype (missile_name);
158 148
159 if (stringarg) 149 if (stringarg)
160 { 150 {
161 /* If it starts with a letter, presume it is a description */ 151 /* If it starts with a letter, presume it is a description */
167 if (!strcasecmp (al->item->name, stringarg)) 157 if (!strcasecmp (al->item->name, stringarg))
168 break; 158 break;
169 159
170 if (!al) 160 if (!al)
171 { 161 {
172 free_object (missile); 162 missile->destroy ();
173 new_draw_info_format (NDI_UNIQUE, 0, op, "No such object %ss of %s", missile_name, stringarg); 163 new_draw_info_format (NDI_UNIQUE, 0, op, "No such object %ss of %s", missile_name, stringarg);
174 return 0; 164 return 0;
175 } 165 }
166
176 if (al->item->slaying) 167 if (al->item->slaying)
177 { 168 {
178 free_object (missile); 169 missile->destroy ();
179 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not allowed to create %ss of %s", missile_name, stringarg); 170 new_draw_info_format (NDI_UNIQUE, 0, op, "You are not allowed to create %ss of %s", missile_name, stringarg);
180 return 0; 171 return 0;
181 } 172 }
173
182 give_artifact_abilities (missile, al->item); 174 give_artifact_abilities (missile, al->item);
183 /* These special arrows cost something extra. Don't have them also be magical - 175 /* These special arrows cost something extra. Don't have them also be magical -
184 * otherwise, in most cases, not enough will be created. I don't want to get into 176 * otherwise, in most cases, not enough will be created. I don't want to get into
185 * the parsing of having to do both plus and type. 177 * the parsing of having to do both plus and type.
186 */ 178 */
188 missile_plus = 0; 180 missile_plus = 0;
189 } 181 }
190 else if (atoi (stringarg) < missile_plus) 182 else if (atoi (stringarg) < missile_plus)
191 missile_plus = atoi (stringarg); 183 missile_plus = atoi (stringarg);
192 } 184 }
185
193 if (missile_plus > 4) 186 if (missile_plus > 4)
194 missile_plus = 4; 187 missile_plus = 4;
195 else if (missile_plus < -4) 188 else if (missile_plus < -4)
196 missile_plus = -4; 189 missile_plus = -4;
197 190
198 missile->nrof = spell->duration + SP_level_duration_adjust (caster, spell); 191 missile->nrof = spell->duration + SP_level_duration_adjust (caster, spell);
199 missile->nrof -= 3 * (missile_plus + bonus_plus); 192 missile->nrof -= 3 * (missile_plus + bonus_plus);
193
200 if (missile->nrof < 1) 194 if (missile->nrof < 1)
201 missile->nrof = 1; 195 missile->nrof = 1;
202 196
203 missile->magic = missile_plus; 197 missile->magic = missile_plus;
204 /* Can't get any money for these objects */ 198 /* Can't get any money for these objects */
205 missile->value = 0; 199 missile->value = 0;
206 200
207 SET_FLAG (missile, FLAG_IDENTIFIED); 201 SET_FLAG (missile, FLAG_IDENTIFIED);
208 tag = missile->count;
209 202
210 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !was_destroyed (missile, tag)) 203 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ())
211 {
212 pick_up (op, missile); 204 pick_up (op, missile);
213 } 205
214 return 1; 206 return 1;
215} 207}
216 208
217 209
218/* allows the choice of what sort of food object to make. 210/* allows the choice of what sort of food object to make.
284int 276int
285probe (object *op, object *caster, object *spell_ob, int dir) 277probe (object *op, object *caster, object *spell_ob, int dir)
286{ 278{
287 int r, mflags, maxrange; 279 int r, mflags, maxrange;
288 object *tmp; 280 object *tmp;
289 mapstruct *m; 281 maptile *m;
290 282
291 283
292 if (!dir) 284 if (!dir)
293 { 285 {
294 examine_monster (op, op); 286 examine_monster (op, op);
429cast_earth_to_dust (object *op, object *caster, object *spell_ob) 421cast_earth_to_dust (object *op, object *caster, object *spell_ob)
430{ 422{
431 object *tmp, *next; 423 object *tmp, *next;
432 int range, i, j, mflags; 424 int range, i, j, mflags;
433 sint16 sx, sy; 425 sint16 sx, sy;
434 mapstruct *m; 426 maptile *m;
435 427
436 if (op->type != PLAYER) 428 if (op->type != PLAYER)
437 return 0; 429 return 0;
438 430
439 range = spell_ob->range + SP_level_range_adjust (caster, spell_ob); 431 range = spell_ob->range + SP_level_range_adjust (caster, spell_ob);
468 460
469 while (op != NULL && op->type != PLAYER) 461 while (op != NULL && op->type != PLAYER)
470 op = op->env; 462 op = op->env;
471 463
472 if (op != NULL && op->map) 464 if (op != NULL && op->map)
473 {
474 if ((get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) && (!QUERY_FLAG (op, FLAG_WIZCAST))) 465 if ((get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) && (!QUERY_FLAG (op, FLAG_WIZCAST)))
475 new_draw_info (NDI_UNIQUE, 0, op, "You feel something fizzle inside you."); 466 new_draw_info (NDI_UNIQUE, 0, op, "You feel something fizzle inside you.");
476 else 467 else
477 enter_exit (op, wor); 468 enter_exit (op, wor);
478 } 469
479 remove_ob (wor); 470 wor->destroy ();
480 free_object (wor);
481} 471}
482 472
483/* Word of recall causes the player to return 'home'. 473/* Word of recall causes the player to return 'home'.
484 * we put a force into the player object, so that there is a 474 * we put a force into the player object, so that there is a
485 * time delay effect. 475 * time delay effect.
571 561
572int 562int
573perceive_self (object *op) 563perceive_self (object *op)
574{ 564{
575 char *cp = describe_item (op, op), buf[MAX_BUF]; 565 char *cp = describe_item (op, op), buf[MAX_BUF];
576 archetype *at = find_archetype (ARCH_DEPLETION); 566 archetype *at = archetype::find (ARCH_DEPLETION);
577 object *tmp; 567 object *tmp;
578 int i; 568 int i;
579 569
580 tmp = find_god (determine_god (op)); 570 tmp = find_god (determine_god (op));
581 if (tmp) 571 if (tmp)
648{ 638{
649 object *dummy, *force, *old_force, *tmp; 639 object *dummy, *force, *old_force, *tmp;
650 archetype *perm_portal; 640 archetype *perm_portal;
651 char portal_name[1024], portal_message[1024]; 641 char portal_name[1024], portal_message[1024];
652 sint16 exitx, exity; 642 sint16 exitx, exity;
653 mapstruct *exitmap; 643 maptile *exitmap;
654 int op_level; 644 int op_level;
655 645
656 646
657 /* Check to see if the map the player is currently on is a per player unique 647 /* Check to see if the map the player is currently on is a per player unique
658 * map. This can be determined in that per player unique maps have the 648 * map. This can be determined in that per player unique maps have the
669 */ 659 */
670 dummy = arch_to_object (spell->other_arch); 660 dummy = arch_to_object (spell->other_arch);
671 if (dummy == NULL) 661 if (dummy == NULL)
672 { 662 {
673 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 663 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
674 LOG (llevError, "get_object failed (force in cast_create_town_portal for %s!\n", &op->name); 664 LOG (llevError, "object::create failed (force in cast_create_town_portal for %s!\n", &op->name);
675 return 0; 665 return 0;
676 } 666 }
667
677 force = check_inv_recursive (op, dummy); 668 force = check_inv_recursive (op, dummy);
678 669
679 if (force == NULL) 670 if (force == NULL)
680 { 671 {
681 /* Here we know there is no destination marked up. 672 /* Here we know there is no destination marked up.
688 EXIT_Y (dummy) = op->y; 679 EXIT_Y (dummy) = op->y;
689 insert_ob_in_ob (dummy, op); 680 insert_ob_in_ob (dummy, op);
690 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."); 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.");
691 return 1; 682 return 1;
692 } 683 }
693 free_object (dummy); 684
685 dummy->destroy ();
694 686
695 /* Here we know where the town portal should go to 687 /* Here we know where the town portal should go to
696 * We should kill any existing portal associated with the player. 688 * We should kill any existing portal associated with the player.
697 * Than we should create the 2 portals. 689 * Than we should create the 2 portals.
698 * For each of them, we need: 690 * For each of them, we need:
711 /* First step: killing existing town portals */ 703 /* First step: killing existing town portals */
712 dummy = get_archetype (spell->race); 704 dummy = get_archetype (spell->race);
713 if (dummy == NULL) 705 if (dummy == NULL)
714 { 706 {
715 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 707 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
716 LOG (llevError, "get_object failed (force) in cast_create_town_portal for %s!\n", &op->name); 708 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name);
717 return 0; 709 return 0;
718 } 710 }
711
719 perm_portal = find_archetype (spell->slaying); 712 perm_portal = archetype::find (spell->slaying);
720 713
721 /* To kill a town portal, we go trough the player's inventory, 714 /* To kill a town portal, we go trough the player's inventory,
722 * for each marked portal in player's inventory, 715 * for each marked portal in player's inventory,
723 * -We try load the associated map (if impossible, consider the portal destructed) 716 * -We try load the associated map (if impossible, consider the portal destructed)
724 * -We find any portal in the specified location. 717 * -We find any portal in the specified location.
741 tmp = present_arch (perm_portal, exitmap, exitx, exity); 734 tmp = present_arch (perm_portal, exitmap, exitx, exity);
742 while (tmp) 735 while (tmp)
743 { 736 {
744 if (tmp->name == old_force->name) 737 if (tmp->name == old_force->name)
745 { 738 {
746 remove_ob (tmp); 739 tmp->destroy ();
747 free_object (tmp);
748 break; 740 break;
749 } 741 }
750 else 742
751 {
752 tmp = tmp->above; 743 tmp = tmp->above;
753 }
754 } 744 }
755 } 745 }
756 remove_ob (old_force); 746
757 free_object (old_force); 747 old_force->destroy ();
758 LOG (llevDebug, "\n"); 748 LOG (llevDebug, "\n");
759 } 749 }
760 free_object (dummy); 750
751 dummy->destroy ();
761 752
762 /* Creating the portals. 753 /* Creating the portals.
763 * The very first thing to do is to ensure 754 * The very first thing to do is to ensure
764 * access to the destination map. 755 * access to the destination map.
765 * If we can't, don't fizzle. Simply warn player. 756 * If we can't, don't fizzle. Simply warn player.
777 768
778 /* If we were unable to load (ex. random map deleted), warn player */ 769 /* If we were unable to load (ex. random map deleted), warn player */
779 if (exitmap == NULL) 770 if (exitmap == NULL)
780 { 771 {
781 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?"); 772 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?");
782 remove_ob (force); 773 force->destroy ();
783 free_object (force);
784 return 1; 774 return 1;
785 } 775 }
786 776
787 op_level = caster_level (caster, spell); 777 op_level = caster_level (caster, spell);
788 if (op_level < 15) 778 if (op_level < 15)
806 snprintf (portal_name, 1024, "%s's portal to %s", &op->name, &force->name); 796 snprintf (portal_name, 1024, "%s's portal to %s", &op->name, &force->name);
807 dummy = get_archetype (spell->slaying); /*The portal */ 797 dummy = get_archetype (spell->slaying); /*The portal */
808 if (dummy == NULL) 798 if (dummy == NULL)
809 { 799 {
810 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 800 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
811 LOG (llevError, "get_object failed (perm_magic_portal) in cast_create_town_portal for %s!\n", &op->name); 801 LOG (llevError, "object::create failed (perm_magic_portal) in cast_create_town_portal for %s!\n", &op->name);
812 return 0; 802 return 0;
813 } 803 }
804
814 EXIT_PATH (dummy) = force->name; 805 EXIT_PATH (dummy) = force->name;
815 EXIT_X (dummy) = EXIT_X (force); 806 EXIT_X (dummy) = EXIT_X (force);
816 EXIT_Y (dummy) = EXIT_Y (force); 807 EXIT_Y (dummy) = EXIT_Y (force);
817 dummy->name = dummy->name_pl = portal_name; 808 dummy->name = dummy->name_pl = portal_name;
818 dummy->msg = portal_message; 809 dummy->msg = portal_message;
825 */ 816 */
826 tmp = get_archetype (spell->race); 817 tmp = get_archetype (spell->race);
827 if (tmp == NULL) 818 if (tmp == NULL)
828 { 819 {
829 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 820 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
830 LOG (llevError, "get_object failed (force) in cast_create_town_portal for %s!\n", &op->name); 821 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name);
831 return 0; 822 return 0;
832 } 823 }
824
833 tmp->race = op->map->path; 825 tmp->race = op->map->path;
834 tmp->name = portal_name; 826 tmp->name = portal_name;
835 EXIT_X (tmp) = dummy->x; 827 EXIT_X (tmp) = dummy->x;
836 EXIT_Y (tmp) = dummy->y; 828 EXIT_Y (tmp) = dummy->y;
837 insert_ob_in_ob (tmp, op); 829 insert_ob_in_ob (tmp, op);
845 snprintf (portal_name, 1024, "%s's portal to %s", &op->name, op->map->path); 837 snprintf (portal_name, 1024, "%s's portal to %s", &op->name, op->map->path);
846 dummy = get_archetype (spell->slaying); /*The portal */ 838 dummy = get_archetype (spell->slaying); /*The portal */
847 if (dummy == NULL) 839 if (dummy == NULL)
848 { 840 {
849 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 841 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
850 LOG (llevError, "get_object failed (perm_magic_portal) in cast_create_town_portal for %s!\n", &op->name); 842 LOG (llevError, "object::create failed (perm_magic_portal) in cast_create_town_portal for %s!\n", &op->name);
851 return 0; 843 return 0;
852 } 844 }
845
853 EXIT_PATH (dummy) = op->map->path; 846 EXIT_PATH (dummy) = op->map->path;
854 EXIT_X (dummy) = op->x; 847 EXIT_X (dummy) = op->x;
855 EXIT_Y (dummy) = op->y; 848 EXIT_Y (dummy) = op->y;
856 dummy->name = dummy->name_pl = portal_name; 849 dummy->name = dummy->name_pl = portal_name;
857 dummy->msg = portal_message; 850 dummy->msg = portal_message;
865 */ 858 */
866 tmp = get_archetype (spell->race); 859 tmp = get_archetype (spell->race);
867 if (tmp == NULL) 860 if (tmp == NULL)
868 { 861 {
869 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 862 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
870 LOG (llevError, "get_object failed (force) in cast_create_town_portal for %s!\n", &op->name); 863 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name);
871 return 0; 864 return 0;
872 } 865 }
866
873 tmp->race = force->name; 867 tmp->race = force->name;
874 tmp->name = portal_name; 868 tmp->name = portal_name;
875 EXIT_X (tmp) = dummy->x; 869 EXIT_X (tmp) = dummy->x;
876 EXIT_Y (tmp) = dummy->y; 870 EXIT_Y (tmp) = dummy->y;
877 insert_ob_in_ob (tmp, op); 871 insert_ob_in_ob (tmp, op);
878 872
879 /* Describe the player what happened 873 /* Describe the player what happened
880 */ 874 */
881 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You see air moving and showing you the way home."); 875 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You see air moving and showing you the way home.");
882 remove_ob (force); /* Delete the force inside the player */ 876 force->destroy ();
883 free_object (force); 877
884 return 1; 878 return 1;
885} 879}
886 880
887 881
888/* This creates magic walls. Really, it can create most any object, 882/* This creates magic walls. Really, it can create most any object,
893magic_wall (object *op, object *caster, int dir, object *spell_ob) 887magic_wall (object *op, object *caster, int dir, object *spell_ob)
894{ 888{
895 object *tmp, *tmp2; 889 object *tmp, *tmp2;
896 int i, posblocked, negblocked, maxrange; 890 int i, posblocked, negblocked, maxrange;
897 sint16 x, y; 891 sint16 x, y;
898 mapstruct *m; 892 maptile *m;
899 const char *name; 893 const char *name;
900 archetype *at; 894 archetype *at;
901 895
902 if (!dir) 896 if (!dir)
903 { 897 {
926 else if (spell_ob->race) 920 else if (spell_ob->race)
927 { 921 {
928 char buf1[MAX_BUF]; 922 char buf1[MAX_BUF];
929 923
930 sprintf (buf1, spell_ob->race, dir); 924 sprintf (buf1, spell_ob->race, dir);
931 at = find_archetype (buf1); 925 at = archetype::find (buf1);
932 if (!at) 926 if (!at)
933 { 927 {
934 LOG (llevError, "summon_wall: Unable to find archetype %s\n", buf1); 928 LOG (llevError, "summon_wall: Unable to find archetype %s\n", buf1);
935 new_draw_info (NDI_UNIQUE, 0, op, "This spell is broken."); 929 new_draw_info (NDI_UNIQUE, 0, op, "This spell is broken.");
936 return 0; 930 return 0;
952 } 946 }
953 else if (QUERY_FLAG (tmp, FLAG_ALIVE)) 947 else if (QUERY_FLAG (tmp, FLAG_ALIVE))
954 { 948 {
955 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 949 tmp->stats.hp = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
956 tmp->stats.maxhp = tmp->stats.hp; 950 tmp->stats.maxhp = tmp->stats.hp;
957 set_owner (tmp, op); 951 tmp->set_owner (op);
958 set_spell_skill (op, caster, spell_ob, tmp); 952 set_spell_skill (op, caster, spell_ob, tmp);
959 } 953 }
960 if (QUERY_FLAG (spell_ob, FLAG_IS_USED_UP) || QUERY_FLAG (tmp, FLAG_IS_USED_UP)) 954 if (QUERY_FLAG (spell_ob, FLAG_IS_USED_UP) || QUERY_FLAG (tmp, FLAG_IS_USED_UP))
961 { 955 {
962 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 956 tmp->stats.food = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
971 } 965 }
972 966
973 /* This can't really hurt - if the object doesn't kill anything, 967 /* This can't really hurt - if the object doesn't kill anything,
974 * these fields just won't be used. 968 * these fields just won't be used.
975 */ 969 */
976 set_owner (tmp, op); 970 tmp->set_owner (op);
977 set_spell_skill (op, caster, spell_ob, tmp); 971 set_spell_skill (op, caster, spell_ob, tmp);
978 tmp->x = x; 972 tmp->x = x;
979 tmp->y = y; 973 tmp->y = y;
980 tmp->level = caster_level (caster, spell_ob) / 2; 974 tmp->level = caster_level (caster, spell_ob) / 2;
981 975
1010 m = tmp->map; 1004 m = tmp->map;
1011 1005
1012 if (!(get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE)) && 1006 if (!(get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE)) &&
1013 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !posblocked) 1007 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !posblocked)
1014 { 1008 {
1015 tmp2 = get_object (); 1009 tmp2 = tmp->clone ();
1016 copy_object (tmp, tmp2);
1017 tmp2->x = x; 1010 tmp2->x = x;
1018 tmp2->y = y; 1011 tmp2->y = y;
1019 insert_ob_in_map (tmp2, m, op, 0); 1012 insert_ob_in_map (tmp2, m, op, 0);
1020 /* If this is a spellcasting wall, need to insert the spell object */ 1013 /* If this is a spellcasting wall, need to insert the spell object */
1021 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL) 1014 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL)
1030 m = tmp->map; 1023 m = tmp->map;
1031 1024
1032 if (!(get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE)) && 1025 if (!(get_map_flags (m, &m, x, y, &x, &y) & (P_OUT_OF_MAP | P_IS_ALIVE)) &&
1033 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !negblocked) 1026 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !negblocked)
1034 { 1027 {
1035 tmp2 = get_object (); 1028 tmp2 = tmp->clone ();
1036 copy_object (tmp, tmp2);
1037 tmp2->x = x; 1029 tmp2->x = x;
1038 tmp2->y = y; 1030 tmp2->y = y;
1039 insert_ob_in_map (tmp2, m, op, 0); 1031 insert_ob_in_map (tmp2, m, op, 0);
1040 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL) 1032 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL)
1041 insert_ob_in_ob (arch_to_object (tmp2->other_arch), tmp2); 1033 insert_ob_in_ob (arch_to_object (tmp2->other_arch), tmp2);
1053int 1045int
1054dimension_door (object *op, object *caster, object *spob, int dir) 1046dimension_door (object *op, object *caster, object *spob, int dir)
1055{ 1047{
1056 uint32 dist, maxdist; 1048 uint32 dist, maxdist;
1057 int mflags; 1049 int mflags;
1058 mapstruct *m; 1050 maptile *m;
1059 sint16 sx, sy; 1051 sint16 sx, sy;
1060 1052
1061 if (op->type != PLAYER) 1053 if (op->type != PLAYER)
1062 return 0; 1054 return 0;
1063 1055
1153 return 0; 1145 return 0;
1154 } 1146 }
1155 } 1147 }
1156 1148
1157 /* Actually move the player now */ 1149 /* Actually move the player now */
1158 remove_ob (op); 1150 op->remove ();
1159 op->x += freearr_x[dir] * dist; 1151 op->x += freearr_x[dir] * dist;
1160 op->y += freearr_y[dir] * dist; 1152 op->y += freearr_y[dir] * dist;
1161 if ((op = insert_ob_in_map (op, op->map, op, 0)) == NULL) 1153 if ((op = insert_ob_in_map (op, op->map, op, 0)) == NULL)
1162 return 1; 1154 return 1;
1163 1155
1234 if (cure_disease (tmp, op)) 1226 if (cure_disease (tmp, op))
1235 success = 1; 1227 success = 1;
1236 1228
1237 if (spell->attacktype & AT_POISON) 1229 if (spell->attacktype & AT_POISON)
1238 { 1230 {
1239 at = find_archetype ("poisoning"); 1231 at = archetype::find ("poisoning");
1240 poison = present_arch_in_ob (at, tmp); 1232 poison = present_arch_in_ob (at, tmp);
1241 if (poison) 1233 if (poison)
1242 { 1234 {
1243 success = 1; 1235 success = 1;
1244 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed"); 1236 new_draw_info (NDI_UNIQUE, 0, tmp, "Your body feels cleansed");
1255 poison->duration = 1; 1247 poison->duration = 1;
1256 } 1248 }
1257 } 1249 }
1258 if (spell->attacktype & AT_BLIND) 1250 if (spell->attacktype & AT_BLIND)
1259 { 1251 {
1260 at = find_archetype ("blindness"); 1252 at = archetype::find ("blindness");
1261 poison = present_arch_in_ob (at, tmp); 1253 poison = present_arch_in_ob (at, tmp);
1262 if (poison) 1254 if (poison)
1263 { 1255 {
1264 success = 1; 1256 success = 1;
1265 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return."); 1257 new_draw_info (NDI_UNIQUE, 0, tmp, "Your vision begins to return.");
1629 *small_nuggets -= large->value / small->value; 1621 *small_nuggets -= large->value / small->value;
1630 if (*small_nuggets && large->value % small->value) 1622 if (*small_nuggets && large->value % small->value)
1631 (*small_nuggets)--; 1623 (*small_nuggets)--;
1632 } 1624 }
1633 weight += obj->weight; 1625 weight += obj->weight;
1634 remove_ob (obj); 1626 obj->destroy ();
1635 free_object (obj);
1636} 1627}
1637 1628
1638static void 1629static void
1639update_map (object *op, mapstruct *m, int small_nuggets, int large_nuggets, int x, int y) 1630update_map (object *op, maptile *m, int small_nuggets, int large_nuggets, int x, int y)
1640{ 1631{
1641 object *tmp; 1632 object *tmp;
1642 int flag = 0; 1633 int flag = 0;
1643 1634
1644 /* Put any nuggets below the player, but we can only pass this 1635 /* Put any nuggets below the player, but we can only pass this
1647 if (x == op->x && y == op->y && op->map == m) 1638 if (x == op->x && y == op->y && op->map == m)
1648 flag = INS_BELOW_ORIGINATOR; 1639 flag = INS_BELOW_ORIGINATOR;
1649 1640
1650 if (small_nuggets) 1641 if (small_nuggets)
1651 { 1642 {
1652 tmp = get_object (); 1643 tmp = small->clone ();
1653 copy_object (small, tmp);
1654 tmp->nrof = small_nuggets; 1644 tmp->nrof = small_nuggets;
1655 tmp->x = x; 1645 tmp->x = x;
1656 tmp->y = y; 1646 tmp->y = y;
1657 insert_ob_in_map (tmp, m, op, flag); 1647 insert_ob_in_map (tmp, m, op, flag);
1658 } 1648 }
1649
1659 if (large_nuggets) 1650 if (large_nuggets)
1660 { 1651 {
1661 tmp = get_object (); 1652 tmp = large->clone ();
1662 copy_object (large, tmp);
1663 tmp->nrof = large_nuggets; 1653 tmp->nrof = large_nuggets;
1664 tmp->x = x; 1654 tmp->x = x;
1665 tmp->y = y; 1655 tmp->y = y;
1666 insert_ob_in_map (tmp, m, op, flag); 1656 insert_ob_in_map (tmp, m, op, flag);
1667 } 1657 }
1671alchemy (object *op, object *caster, object *spell_ob) 1661alchemy (object *op, object *caster, object *spell_ob)
1672{ 1662{
1673 int x, y, weight = 0, weight_max, large_nuggets, small_nuggets, mflags; 1663 int x, y, weight = 0, weight_max, large_nuggets, small_nuggets, mflags;
1674 sint16 nx, ny; 1664 sint16 nx, ny;
1675 object *next, *tmp; 1665 object *next, *tmp;
1676 mapstruct *mp; 1666 maptile *mp;
1677 1667
1678 if (op->type != PLAYER) 1668 if (op->type != PLAYER)
1679 return 0; 1669 return 0;
1680 1670
1681 /* Put a maximum weight of items that can be alchemied. Limits the power 1671 /* Put a maximum weight of items that can be alchemied. Limits the power
1732 alchemy_object (tmp, &small_nuggets, &large_nuggets, &weight); 1722 alchemy_object (tmp, &small_nuggets, &large_nuggets, &weight);
1733 1723
1734 if (weight > weight_max) 1724 if (weight > weight_max)
1735 { 1725 {
1736 update_map (op, mp, small_nuggets, large_nuggets, nx, ny); 1726 update_map (op, mp, small_nuggets, large_nuggets, nx, ny);
1737 free_object (large); 1727 large->destroy ();
1738 free_object (small); 1728 small->destroy ();
1739 return 1; 1729 return 1;
1740 } 1730 }
1741 } /* is alchemable object */ 1731 } /* is alchemable object */
1742 } /* process all objects on this space */ 1732 } /* process all objects on this space */
1743 1733
1746 * with this spell. 1736 * with this spell.
1747 */ 1737 */
1748 update_map (op, mp, small_nuggets, large_nuggets, nx, ny); 1738 update_map (op, mp, small_nuggets, large_nuggets, nx, ny);
1749 } 1739 }
1750 } 1740 }
1751 free_object (large); 1741
1752 free_object (small); 1742 large->destroy ();
1743 small->destroy ();
1753 /* reset this so that if player standing on a big pile of stuff, 1744 /* reset this so that if player standing on a big pile of stuff,
1754 * it is redrawn properly. 1745 * it is redrawn properly.
1755 */ 1746 */
1756 op->contr->socket.look_position = 0; 1747 op->contr->socket->look_position = 0;
1757 return 1; 1748 return 1;
1758} 1749}
1759 1750
1760 1751
1761/* This function removes the cursed/damned status on equipped 1752/* This function removes the cursed/damned status on equipped
1880cast_detection (object *op, object *caster, object *spell, object *skill) 1871cast_detection (object *op, object *caster, object *spell, object *skill)
1881{ 1872{
1882 object *tmp, *last, *god, *detect; 1873 object *tmp, *last, *god, *detect;
1883 int done_one, range, mflags, floor, level; 1874 int done_one, range, mflags, floor, level;
1884 sint16 x, y, nx, ny; 1875 sint16 x, y, nx, ny;
1885 mapstruct *m; 1876 maptile *m;
1886 1877
1887 /* We precompute some values here so that we don't have to keep 1878 /* We precompute some values here so that we don't have to keep
1888 * doing it over and over again. 1879 * doing it over and over again.
1889 */ 1880 */
1890 god = find_god (determine_god (op)); 1881 god = find_god (determine_god (op));
2108int 2099int
2109cast_transfer (object *op, object *caster, object *spell, int dir) 2100cast_transfer (object *op, object *caster, object *spell, int dir)
2110{ 2101{
2111 object *plyr = NULL; 2102 object *plyr = NULL;
2112 sint16 x, y; 2103 sint16 x, y;
2113 mapstruct *m; 2104 maptile *m;
2114 int mflags; 2105 int mflags;
2115 2106
2116 m = op->map; 2107 m = op->map;
2117 x = op->x + freearr_x[dir]; 2108 x = op->x + freearr_x[dir];
2118 y = op->y + freearr_y[dir]; 2109 y = op->y + freearr_y[dir];
2184void 2175void
2185counterspell (object *op, int dir) 2176counterspell (object *op, int dir)
2186{ 2177{
2187 object *tmp, *head, *next; 2178 object *tmp, *head, *next;
2188 int mflags; 2179 int mflags;
2189 mapstruct *m; 2180 maptile *m;
2190 sint16 sx, sy; 2181 sint16 sx, sy;
2191 2182
2192 sx = op->x + freearr_x[dir]; 2183 sx = op->x + freearr_x[dir];
2193 sy = op->y + freearr_y[dir]; 2184 sy = op->y + freearr_y[dir];
2194 m = op->map; 2185 m = op->map;
2218 * monsters either. 2209 * monsters either.
2219 */ 2210 */
2220 2211
2221 if (head->attacktype & AT_MAGIC && 2212 if (head->attacktype & AT_MAGIC &&
2222 !(head->attacktype & AT_COUNTERSPELL) && !QUERY_FLAG (head, FLAG_MONSTER) && (op->level > head->level)) 2213 !(head->attacktype & AT_COUNTERSPELL) && !QUERY_FLAG (head, FLAG_MONSTER) && (op->level > head->level))
2223 { 2214 head->destroy ();
2224 remove_ob (head);
2225 free_object (head);
2226 }
2227 else 2215 else
2228 switch (head->type) 2216 switch (head->type)
2229 { 2217 {
2230 case SPELL_EFFECT: 2218 case SPELL_EFFECT:
2231 if (op->level > head->level) 2219 if (op->level > head->level)
2232 { 2220 head->destroy ();
2233 remove_ob (head); 2221
2234 free_object (head);
2235 }
2236 break; 2222 break;
2237 2223
2238 /* I really don't get this rune code that much - that 2224 /* I really don't get this rune code that much - that
2239 * random chance seems really low. 2225 * random chance seems really low.
2240 */ 2226 */
2241 case RUNE: 2227 case RUNE:
2242 if (rndm (0, 149) == 0) 2228 if (rndm (0, 149) == 0)
2243 { 2229 {
2244 head->stats.hp--; /* weaken the rune */ 2230 head->stats.hp--; /* weaken the rune */
2245 if (!head->stats.hp) 2231 if (!head->stats.hp)
2246 { 2232 head->destroy ();
2247 remove_ob (head);
2248 free_object (head);
2249 }
2250 } 2233 }
2251 break; 2234 break;
2252 } 2235 }
2253 } 2236 }
2254} 2237}
2315{ 2298{
2316 object *weapon, *tmp; 2299 object *weapon, *tmp;
2317 char buf[MAX_BUF]; 2300 char buf[MAX_BUF];
2318 int a, i; 2301 int a, i;
2319 sint16 x, y; 2302 sint16 x, y;
2320 mapstruct *m; 2303 maptile *m;
2321 materialtype_t *mt; 2304 materialtype_t *mt;
2322 2305
2323 if (!spell->other_arch) 2306 if (!spell->other_arch)
2324 { 2307 {
2325 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 2308 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
2329 /* exit if it's not a player using this spell. */ 2312 /* exit if it's not a player using this spell. */
2330 if (op->type != PLAYER) 2313 if (op->type != PLAYER)
2331 return 0; 2314 return 0;
2332 2315
2333 /* if player already has a golem, abort */ 2316 /* if player already has a golem, abort */
2334 if (op->contr->ranges[range_golem] != NULL && op->contr->golem_count == op->contr->ranges[range_golem]->count) 2317 if (op->contr->ranges[range_golem])
2335 { 2318 {
2336 control_golem (op->contr->ranges[range_golem], dir); 2319 control_golem (op->contr->ranges[range_golem], dir);
2337 return 0; 2320 return 0;
2338 } 2321 }
2339 2322
2391 CLEAR_FLAG (tmp, FLAG_MONSTER); 2374 CLEAR_FLAG (tmp, FLAG_MONSTER);
2392 SET_FLAG (tmp, FLAG_FRIENDLY); 2375 SET_FLAG (tmp, FLAG_FRIENDLY);
2393 tmp->stats.exp = 0; 2376 tmp->stats.exp = 0;
2394 add_friendly_object (tmp); 2377 add_friendly_object (tmp);
2395 tmp->type = GOLEM; 2378 tmp->type = GOLEM;
2396 set_owner (tmp, op); 2379 tmp->set_owner (op);
2397 set_spell_skill (op, caster, spell, tmp); 2380 set_spell_skill (op, caster, spell, tmp);
2398 op->contr->ranges[range_golem] = tmp; 2381 op->contr->ranges[range_golem] = tmp;
2399 op->contr->shoottype = range_golem; 2382 op->contr->shoottype = range_golem;
2400 op->contr->golem_count = tmp->count;
2401 2383
2402 /* Give the weapon to the golem now. A bit of a hack to check the 2384 /* Give the weapon to the golem now. A bit of a hack to check the
2403 * removed flag - it should only be set if get_split_object was 2385 * removed flag - it should only be set if get_split_object was
2404 * used above. 2386 * used above.
2405 */ 2387 */
2406 if (!QUERY_FLAG (weapon, FLAG_REMOVED)) 2388 if (!QUERY_FLAG (weapon, FLAG_REMOVED))
2407 remove_ob (weapon); 2389 weapon->remove ();
2408 insert_ob_in_ob (weapon, tmp); 2390 insert_ob_in_ob (weapon, tmp);
2409 esrv_send_item (op, weapon); 2391 esrv_send_item (op, weapon);
2410 /* To do everything necessary to let a golem use the weapon is a pain, 2392 /* To do everything necessary to let a golem use the weapon is a pain,
2411 * so instead, just set it as equipped (otherwise, we need to update 2393 * so instead, just set it as equipped (otherwise, we need to update
2412 * body_info, skills, etc) 2394 * body_info, skills, etc)
2559 2541
2560 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell); 2542 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell);
2561 2543
2562 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell); 2544 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
2563 2545
2564 set_owner (new_aura, op); 2546 new_aura->set_owner (op);
2565 set_spell_skill (op, caster, spell, new_aura); 2547 set_spell_skill (op, caster, spell, new_aura);
2566 new_aura->attacktype = spell->attacktype; 2548 new_aura->attacktype = spell->attacktype;
2567 2549
2568 new_aura->level = caster_level (caster, spell); 2550 new_aura->level = caster_level (caster, spell);
2569 if (refresh) 2551 if (refresh)
2587void 2569void
2588move_aura (object *aura) 2570move_aura (object *aura)
2589{ 2571{
2590 int i, mflags; 2572 int i, mflags;
2591 object *env; 2573 object *env;
2592 mapstruct *m; 2574 maptile *m;
2593 2575
2594 /* auras belong in inventories */ 2576 /* auras belong in inventories */
2595 env = aura->env; 2577 env = aura->env;
2596 2578
2597 /* no matter what we've gotta remove the aura... 2579 /* no matter what we've gotta remove the aura...
2598 * we'll put it back if its time isn't up. 2580 * we'll put it back if its time isn't up.
2599 */ 2581 */
2600 remove_ob (aura); 2582 aura->remove ();
2601 2583
2602 /* exit if we're out of gas */ 2584 /* exit if we're out of gas */
2603 if (aura->duration-- < 0) 2585 if (aura->duration-- < 0)
2604 { 2586 {
2605 free_object (aura); 2587 aura->destroy ();
2606 return; 2588 return;
2607 } 2589 }
2608 2590
2609 /* auras only exist in inventories */ 2591 /* auras only exist in inventories */
2610 if (env == NULL || env->map == NULL) 2592 if (env == NULL || env->map == NULL)
2611 { 2593 {
2612 free_object (aura); 2594 aura->destroy ();
2613 return; 2595 return;
2614 } 2596 }
2597
2615 aura->x = env->x; 2598 aura->x = env->x;
2616 aura->y = env->y; 2599 aura->y = env->y;
2617 2600
2618 /* we need to jump out of the inventory for a bit 2601 /* we need to jump out of the inventory for a bit
2619 * in order to hit the map conveniently. 2602 * in order to hit the map conveniently.
2646 insert_ob_in_map (new_ob, m, aura, 0); 2629 insert_ob_in_map (new_ob, m, aura, 0);
2647 } 2630 }
2648 } 2631 }
2649 } 2632 }
2650 /* put the aura back in the player's inventory */ 2633 /* put the aura back in the player's inventory */
2651 remove_ob (aura); 2634 aura->remove ();
2652 insert_ob_in_ob (aura, env); 2635 insert_ob_in_ob (aura, env);
2653} 2636}
2654 2637
2655/* moves the peacemaker spell. 2638/* moves the peacemaker spell.
2656 * op is the piece object. 2639 * op is the piece object.
2680 2663
2681 if (rndm (0, atk_lev - 1) > def_lev) 2664 if (rndm (0, atk_lev - 1) > def_lev)
2682 { 2665 {
2683 /* make this sucker peaceful. */ 2666 /* make this sucker peaceful. */
2684 2667
2685 change_exp (get_owner (op), victim->stats.exp, op->skill, 0); 2668 change_exp (op->owner, victim->stats.exp, op->skill, 0);
2686 victim->stats.exp = 0; 2669 victim->stats.exp = 0;
2687#if 0 2670#if 0
2688 /* No idea why these were all set to zero - if something 2671 /* No idea why these were all set to zero - if something
2689 * makes this creature agressive, he should still do damage. 2672 * makes this creature agressive, he should still do damage.
2690 */ 2673 */
2730 return 0; 2713 return 0;
2731 } 2714 }
2732 if (!spell->other_arch) 2715 if (!spell->other_arch)
2733 return 0; 2716 return 0;
2734 tmp = arch_to_object (spell->other_arch); 2717 tmp = arch_to_object (spell->other_arch);
2735 strncpy (rune, msg, HUGE_BUF - 2); 2718
2736 rune[HUGE_BUF - 2] = 0; 2719 snprintf (rune, sizeof (rune), "%s\n", msg);
2737 strcat (rune, "\n"); 2720
2738 tmp->race = op->name; /*Save the owner of the rune */ 2721 tmp->race = op->name; /*Save the owner of the rune */
2739 tmp->msg = rune; 2722 tmp->msg = rune;
2740 tmp->x = op->x; 2723 tmp->x = op->x;
2741 tmp->y = op->y; 2724 tmp->y = op->y;
2742 insert_ob_in_map (tmp, op->map, op, INS_BELOW_ORIGINATOR); 2725 insert_ob_in_map (tmp, op->map, op, INS_BELOW_ORIGINATOR);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines