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.54 by root, Mon May 28 21:28:36 2007 UTC vs.
Revision 1.65 by root, Wed Aug 1 00:26:04 2007 UTC

3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software; you can redistribute it and/or modify it 8 * Crossfire TRT is free software: you can redistribute it and/or modify
9 * under the terms of the GNU General Public License as published by the Free 9 * it under the terms of the GNU General Public License as published by
10 * Software Foundation; either version 2 of the License, or (at your option) 10 * the Free Software Foundation, either version 3 of the License, or
11 * any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, but 13 * This program is distributed in the hope that it will be useful,
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License along 18 * You should have received a copy of the GNU General Public License
19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 20 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 22 */
24 23
25#include <global.h> 24#include <global.h>
70 return 0; 69 return 0;
71 } 70 }
72 if (!(random_roll (0, 3, op, PREFER_HIGH))) 71 if (!(random_roll (0, 3, op, PREFER_HIGH)))
73 { 72 {
74 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand)); 73 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s vibrates violently, then explodes!", query_name (wand));
75 play_sound_map (op->map, op->x, op->y, SOUND_OB_EXPLODE); 74 op->play_sound (sound_find ("ob_explode"));
76 esrv_del_item (op->contr, wand->count); 75 esrv_del_item (op->contr, wand->count);
77 wand->destroy (); 76 wand->destroy ();
78 tmp = get_archetype ("fireball"); 77 tmp = get_archetype ("fireball");
79 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10; 78 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10;
80 79
104 ncharges = 1; 103 ncharges = 1;
105 104
106 wand->stats.food += ncharges; 105 wand->stats.food += ncharges;
107 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand)); 106 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s glows with power.", query_name (wand));
108 107
109 if (wand->arch && QUERY_FLAG (&wand->arch->clone, FLAG_ANIMATE)) 108 if (wand->arch && QUERY_FLAG (wand->arch, FLAG_ANIMATE))
110 { 109 {
111 SET_FLAG (wand, FLAG_ANIMATE); 110 SET_FLAG (wand, FLAG_ANIMATE);
112 wand->set_speed (wand->arch->clone.speed); 111 wand->set_speed (wand->arch->speed);
113 } 112 }
114 113
115 return 1; 114 return 1;
116} 115}
117 116
123 * great a plus, the default is used. 122 * great a plus, the default is used.
124 * The # of arrows created also goes up with level, so if a 30th level mage 123 * The # of arrows created also goes up with level, so if a 30th level mage
125 * wants LOTS of arrows, and doesn't care what the plus is he could 124 * wants LOTS of arrows, and doesn't care what the plus is he could
126 * create nonnmagic arrows, or even -1, etc... 125 * create nonnmagic arrows, or even -1, etc...
127 */ 126 */
128
129int 127int
130cast_create_missile (object *op, object *caster, object *spell, int dir, const char *stringarg) 128cast_create_missile (object *op, object *caster, object *spell, int dir, const char *stringarg)
131{ 129{
132 int missile_plus = 0, bonus_plus = 0; 130 int missile_plus = 0, bonus_plus = 0;
133 const char *missile_name; 131 const char *missile_name;
224 if (stringarg) 222 if (stringarg)
225 { 223 {
226 at = find_archetype_by_object_type_name (FOOD, stringarg); 224 at = find_archetype_by_object_type_name (FOOD, stringarg);
227 if (at == NULL) 225 if (at == NULL)
228 at = find_archetype_by_object_type_name (DRINK, stringarg); 226 at = find_archetype_by_object_type_name (DRINK, stringarg);
229 if (at == NULL || at->clone.stats.food > food_value) 227 if (at == NULL || at->stats.food > food_value)
230 stringarg = NULL; 228 stringarg = NULL;
231 } 229 }
232 230
233 if (!stringarg) 231 if (!stringarg)
234 { 232 {
240 * We don't use flesh types because the weight values of those need 238 * We don't use flesh types because the weight values of those need
241 * to be altered from the donor. 239 * to be altered from the donor.
242 */ 240 */
243 241
244 /* We assume the food items don't have multiple parts */ 242 /* We assume the food items don't have multiple parts */
245 for (at_tmp = first_archetype; at_tmp != NULL; at_tmp = at_tmp->next) 243 for_all_archetypes (at_tmp)
246 { 244 {
247 if (at_tmp->clone.type == FOOD || at_tmp->clone.type == DRINK) 245 if (at_tmp->type == FOOD || at_tmp->type == DRINK)
248 { 246 {
249 /* Basically, if the food value is something that is creatable 247 /* Basically, if the food value is something that is creatable
250 * under the limits of the spell and it is higher than 248 * under the limits of the spell and it is higher than
251 * the item we have now, take it instead. 249 * the item we have now, take it instead.
252 */ 250 */
253 if (at_tmp->clone.stats.food <= food_value && (!at || at_tmp->clone.stats.food > at->clone.stats.food)) 251 if (at_tmp->stats.food <= food_value
252 && (!at
253 || at_tmp->stats.food > at->stats.food
254 || (at_tmp->stats.food == at->stats.food
255 && at_tmp->weight < at->weight)))
254 at = at_tmp; 256 at = at_tmp;
255 } 257 }
256 } 258 }
257 } 259 }
260
258 /* Pretty unlikely (there are some very low food items), but you never 261 /* Pretty unlikely (there are some very low food items), but you never
259 * know 262 * know
260 */ 263 */
261 if (!at) 264 if (!at)
262 { 265 {
263 new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough experience to create any food."); 266 new_draw_info (NDI_UNIQUE, 0, op, "You don't have enough experience to create any food.");
264 return 0; 267 return 0;
265 } 268 }
266 269
267 food_value /= at->clone.stats.food; 270 food_value /= at->stats.food;
268 new_op = arch_to_object (at); 271 new_op = arch_to_object (at);
269 new_op->nrof = food_value; 272 new_op->nrof = food_value;
270 273
271 new_op->value = 0; 274 new_op->value = 0;
272 if (new_op->nrof < 1) 275 if (new_op->nrof < 1)
287 if (!dir) 290 if (!dir)
288 { 291 {
289 examine_monster (op, op); 292 examine_monster (op, op);
290 return 1; 293 return 1;
291 } 294 }
295
292 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob); 296 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob);
293 for (r = 1; r < maxrange; r++) 297 for (r = 1; r < maxrange; r++)
294 { 298 {
295 sint16 x = op->x + r * freearr_x[dir], y = op->y + r * freearr_y[dir]; 299 sint16 x = op->x + r * freearr_x[dir], y = op->y + r * freearr_y[dir];
296 300
316 examine_monster (op, tmp); 320 examine_monster (op, tmp);
317 return 1; 321 return 1;
318 } 322 }
319 } 323 }
320 } 324 }
325
321 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing."); 326 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing.");
322 return 1; 327 return 1;
323} 328}
324
325 329
326/* This checks to see if 'pl' is invisible to 'mon'. 330/* This checks to see if 'pl' is invisible to 'mon'.
327 * does race check, undead check, etc 331 * does race check, undead check, etc
328 * Returns TRUE if mon can't see pl, false 332 * Returns TRUE if mon can't see pl, false
329 * otherwise. This doesn't check range, walls, etc. It 333 * otherwise. This doesn't check range, walls, etc. It
565} 569}
566 570
567int 571int
568perceive_self (object *op) 572perceive_self (object *op)
569{ 573{
570 char buf[MAX_BUF];
571 const char *cp = describe_item (op, op); 574 const char *cp = describe_item (op, op);
572 archetype *at = archetype::find (ARCH_DEPLETION); 575 archetype *at = archetype::find (ARCH_DEPLETION);
573 object *tmp;
574 int i;
575 576
577 dynbuf_text buf;
578
579 if (player *pl = op->contr)
580 if (object *race = archetype::find (op->race))
581 buf << "You are a " << (pl->gender ? "female" : "male") << " " << &race->name << ".\n";
582
576 tmp = find_god (determine_god (op)); 583 if (object *god = find_god (determine_god (op)))
577 if (tmp) 584 buf << "You worship " << &god->name << ".\n";
578 new_draw_info_format (NDI_UNIQUE, 0, op, "You worship %s", &tmp->name);
579 else 585 else
580 new_draw_info (NDI_UNIQUE, 0, op, "You worship no god"); 586 buf << "You worship no god.\n";
581 587
582 tmp = present_arch_in_ob (at, op); 588 object *tmp = present_arch_in_ob (at, op);
583 589
584 if (*cp == '\0' && tmp == NULL) 590 if (*cp == '\0' && tmp == NULL)
585 new_draw_info (NDI_UNIQUE, 0, op, "You feel very mundane"); 591 buf << "You feel very mundane. ";
586 else 592 else
587 { 593 {
588 new_draw_info (NDI_UNIQUE, 0, op, "You have:"); 594 buf << "You have: " << cp << ".\n";
589 new_draw_info (NDI_UNIQUE, 0, op, cp);
590 595
591 if (tmp) 596 if (tmp)
592 for (i = 0; i < NUM_STATS; i++) 597 for (int i = 0; i < NUM_STATS; i++)
593 if (tmp->stats.stat (i) < 0) 598 if (tmp->stats.stat (i) < 0)
594 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is depleted by %d", statname[i], -tmp->stats.stat (i)); 599 buf.printf ("Your %s is depleted by %d.\n", statname[i], -tmp->stats.stat (i));
595 } 600 }
596 601
597 if (is_dragon_pl (op)) 602 if (is_dragon_pl (op))
598 {
599 /* now grab the 'dragon_ability'-force from the player's inventory */ 603 /* now grab the 'dragon_ability'-force from the player's inventory */
600 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 604 for (tmp = op->inv; tmp; tmp = tmp->below)
601 { 605 {
602 if (tmp->type == FORCE && !strcmp (tmp->arch->name, "dragon_ability_force")) 606 if (tmp->type == FORCE && !strcmp (tmp->arch->archname, "dragon_ability_force"))
603 { 607 {
604 if (tmp->stats.exp == 0) 608 if (tmp->stats.exp == 0)
605 sprintf (buf, "Your metabolism isn't focused on anything."); 609 buf << "Your metabolism isn't focused on anything.\n";
606 else 610 else
607 sprintf (buf, "Your metabolism is focused on %s.", change_resist_msg[tmp->stats.exp]); 611 buf << "Your metabolism is focused on " << change_resist_msg[tmp->stats.exp] << ".\n";
608 612
609 new_draw_info (NDI_UNIQUE, 0, op, buf);
610 break; 613 break;
611 } 614 }
612 } 615 }
613 } 616
617 buf << '\0'; // zero-terminate
618
619 new_draw_info (NDI_UNIQUE, 0, op, buf.linearise ());
614 620
615 return 1; 621 return 1;
616} 622}
617 623
618/* This creates magic walls. Really, it can create most any object, 624/* This creates magic walls. Really, it can create most any object,
716 new_draw_info_format (NDI_UNIQUE, 0, op, "Something destroys your %s", name); 722 new_draw_info_format (NDI_UNIQUE, 0, op, "Something destroys your %s", name);
717 return 0; 723 return 0;
718 } 724 }
719 725
720 /* If this is a spellcasting wall, need to insert the spell object */ 726 /* If this is a spellcasting wall, need to insert the spell object */
721 if (tmp->other_arch && tmp->other_arch->clone.type == SPELL) 727 if (tmp->other_arch && tmp->other_arch->type == SPELL)
722 insert_ob_in_ob (arch_to_object (tmp->other_arch), tmp); 728 insert_ob_in_ob (arch_to_object (tmp->other_arch), tmp);
723 729
724 /* This code causes the wall to extend some distance in 730 /* This code causes the wall to extend some distance in
725 * each direction, or until an obstruction is encountered. 731 * each direction, or until an obstruction is encountered.
726 * posblocked and negblocked help determine how far the 732 * posblocked and negblocked help determine how far the
746 { 752 {
747 object *tmp2 = tmp->clone (); 753 object *tmp2 = tmp->clone ();
748 m->insert (tmp2, x, y, op); 754 m->insert (tmp2, x, y, op);
749 755
750 /* If this is a spellcasting wall, need to insert the spell object */ 756 /* If this is a spellcasting wall, need to insert the spell object */
751 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL) 757 if (tmp2->other_arch && tmp2->other_arch->type == SPELL)
752 tmp2->insert (arch_to_object (tmp2->other_arch)); 758 tmp2->insert (arch_to_object (tmp2->other_arch));
753 759
754 } 760 }
755 else 761 else
756 posblocked = 1; 762 posblocked = 1;
763 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !negblocked) 769 ((spell_ob->move_block & GET_MAP_MOVE_BLOCK (m, x, y)) != spell_ob->move_block) && !negblocked)
764 { 770 {
765 object *tmp2 = tmp->clone (); 771 object *tmp2 = tmp->clone ();
766 m->insert (tmp2, x, y, op); 772 m->insert (tmp2, x, y, op);
767 773
768 if (tmp2->other_arch && tmp2->other_arch->clone.type == SPELL) 774 if (tmp2->other_arch && tmp2->other_arch->type == SPELL)
769 tmp2->insert (arch_to_object (tmp2->other_arch)); 775 tmp2->insert (arch_to_object (tmp2->other_arch));
770 } 776 }
771 else 777 else
772 negblocked = 1; 778 negblocked = 1;
773 } 779 }
1014 } 1020 }
1015 1021
1016 return success; 1022 return success;
1017} 1023}
1018 1024
1019
1020/* This is used for the spells that gain stats. There are no spells 1025/* This is used for the spells that gain stats. There are no spells
1021 * right now that icnrease wis/int/pow on a temp basis, so no 1026 * right now that icnrease wis/int/pow on a temp basis, so no
1022 * good comments for those. 1027 * good comments for those.
1023 */ 1028 */
1024static const char *const no_gain_msgs[NUM_STATS] = { 1029static const char *const no_gain_msgs[NUM_STATS] = {
1025 "You grow no stronger.", 1030 "You grow no stronger.",
1026 "You grow no more agile.", 1031 "You grow no more agile.",
1027 "You don't feel any healthier.", 1032 "You don't feel any healthier.",
1028 "no wis", 1033 "You didn't grow any more intelligent.",
1034 "You do not feel any wiser.",
1035 "You don't feel any more powerful."
1029 "You are no easier to look at.", 1036 "You are no easier to look at.",
1030 "no int",
1031 "no pow"
1032}; 1037};
1033 1038
1034int 1039int
1035cast_change_ability (object *op, object *caster, object *spell_ob, int dir, int silent) 1040cast_change_ability (object *op, object *caster, object *spell_ob, int dir, int silent)
1036{ 1041{
1087 } 1092 }
1088 else 1093 else
1089 { 1094 {
1090 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect."); 1095 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect.");
1091 } 1096 }
1097
1092 return 1; 1098 return 1;
1093 } 1099 }
1100
1094 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50; 1101 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
1095 force->speed = 1.0; 1102 force->speed = 1.0;
1096 force->speed_left = -1.0; 1103 force->speed_left = -1.0;
1097 SET_FLAG (force, FLAG_APPLIED); 1104 SET_FLAG (force, FLAG_APPLIED);
1098 1105
1104 force->resist[i] = spell_ob->resist[i] + SP_level_dam_adjust (caster, spell_ob); 1111 force->resist[i] = spell_ob->resist[i] + SP_level_dam_adjust (caster, spell_ob);
1105 if (force->resist[i] > 100) 1112 if (force->resist[i] > 100)
1106 force->resist[i] = 100; 1113 force->resist[i] = 100;
1107 } 1114 }
1108 } 1115 }
1116
1109 if (spell_ob->stats.hp) 1117 if (spell_ob->stats.hp)
1110 force->stats.hp = spell_ob->stats.hp + SP_level_dam_adjust (caster, spell_ob); 1118 force->stats.hp = spell_ob->stats.hp + SP_level_dam_adjust (caster, spell_ob);
1111 1119
1112 if (tmp->type == PLAYER) 1120 if (tmp->type == PLAYER)
1113 { 1121 {
1153 force->attacktype = spell_ob->attacktype; 1161 force->attacktype = spell_ob->attacktype;
1154 1162
1155 insert_ob_in_ob (force, tmp); 1163 insert_ob_in_ob (force, tmp);
1156 change_abil (tmp, force); /* Mostly to display any messages */ 1164 change_abil (tmp, force); /* Mostly to display any messages */
1157 tmp->update_stats (); 1165 tmp->update_stats ();
1166
1158 return 1; 1167 return 1;
1159} 1168}
1160 1169
1161/* This used to be part of cast_change_ability, but it really didn't make 1170/* This used to be part of cast_change_ability, but it really didn't make
1162 * a lot of sense, since most of the values it derives are from the god 1171 * a lot of sense, since most of the values it derives are from the god
1163 * of the caster. 1172 * of the caster.
1164 */ 1173 */
1165
1166int 1174int
1167cast_bless (object *op, object *caster, object *spell_ob, int dir) 1175cast_bless (object *op, object *caster, object *spell_ob, int dir)
1168{ 1176{
1169 int i; 1177 int i;
1170 object *god = find_god (determine_god (op)), *tmp2, *force = NULL, *tmp; 1178 object *god = find_god (determine_god (op)), *tmp2, *force = NULL, *tmp;
1991 object *weapon, *tmp; 1999 object *weapon, *tmp;
1992 char buf[MAX_BUF]; 2000 char buf[MAX_BUF];
1993 int a, i; 2001 int a, i;
1994 sint16 x, y; 2002 sint16 x, y;
1995 maptile *m; 2003 maptile *m;
1996 materialtype_t *mt;
1997 2004
1998 if (!spell->other_arch) 2005 if (!spell->other_arch)
1999 { 2006 {
2000 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 2007 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
2001 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name); 2008 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name);
2020 x = op->x + freearr_x[dir]; 2027 x = op->x + freearr_x[dir];
2021 y = op->y + freearr_y[dir]; 2028 y = op->y + freearr_y[dir];
2022 2029
2023 /* if there's no place to put the golem, abort */ 2030 /* if there's no place to put the golem, abort */
2024 if ((dir == -1) || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP) || 2031 if ((dir == -1) || (get_map_flags (m, &m, x, y, &x, &y) & P_OUT_OF_MAP) ||
2025 ((spell->other_arch->clone.move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->clone.move_type)) 2032 ((spell->other_arch->move_type & GET_MAP_MOVE_BLOCK (m, x, y)) == spell->other_arch->move_type))
2026 { 2033 {
2027 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way."); 2034 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way.");
2028 return 0; 2035 return 0;
2029 } 2036 }
2030 2037
2034 if (!weapon) 2041 if (!weapon)
2035 { 2042 {
2036 new_draw_info (NDI_BLACK, 0, op, "You must mark a weapon to use with this spell!"); 2043 new_draw_info (NDI_BLACK, 0, op, "You must mark a weapon to use with this spell!");
2037 return 0; 2044 return 0;
2038 } 2045 }
2039 if (spell->race && strcmp (weapon->arch->name, spell->race)) 2046 if (spell->race && strcmp (weapon->arch->archname, spell->race))
2040 { 2047 {
2041 new_draw_info (NDI_UNIQUE, 0, op, "The spell fails to transform your weapon."); 2048 new_draw_info (NDI_UNIQUE, 0, op, "The spell fails to transform your weapon.");
2042 return 0; 2049 return 0;
2043 } 2050 }
2044 if (weapon->type != WEAPON) 2051 if (weapon->type != WEAPON)
2113 2120
2114 /* attacktype */ 2121 /* attacktype */
2115 if (!tmp->attacktype) 2122 if (!tmp->attacktype)
2116 tmp->attacktype = AT_PHYSICAL; 2123 tmp->attacktype = AT_PHYSICAL;
2117 2124
2118 mt = NULL;
2119 if (op->materialname != NULL)
2120 mt = name_to_material (op->materialname); 2125 if (materialtype_t *mt = name_to_material (op->materialname))
2121 if (mt != NULL)
2122 { 2126 {
2123 for (i = 0; i < NROFATTACKS; i++) 2127 for (i = 0; i < NROFATTACKS; i++)
2124 tmp->resist[i] = 50 - (mt->save[i] * 5); 2128 tmp->resist[i] = 50 - (mt->save[i] * 5);
2125 a = mt->save[0]; 2129 a = mt->save[0];
2126 } 2130 }
2128 { 2132 {
2129 for (i = 0; i < NROFATTACKS; i++) 2133 for (i = 0; i < NROFATTACKS; i++)
2130 tmp->resist[i] = 5; 2134 tmp->resist[i] = 5;
2131 a = 10; 2135 a = 10;
2132 } 2136 }
2137
2133 /* Set weapon's immunity */ 2138 /* Set weapon's immunity */
2134 tmp->resist[ATNR_CONFUSION] = 100; 2139 tmp->resist[ATNR_CONFUSION] = 100;
2135 tmp->resist[ATNR_POISON] = 100; 2140 tmp->resist[ATNR_POISON] = 100;
2136 tmp->resist[ATNR_SLOW] = 100; 2141 tmp->resist[ATNR_SLOW] = 100;
2137 tmp->resist[ATNR_PARALYZE] = 100; 2142 tmp->resist[ATNR_PARALYZE] = 100;
2143 2148
2144 /* Improve weapon's armour value according to best save vs. physical of its material */ 2149 /* Improve weapon's armour value according to best save vs. physical of its material */
2145 2150
2146 if (a > 14) 2151 if (a > 14)
2147 a = 14; 2152 a = 14;
2153
2148 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a)); 2154 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a));
2149 2155
2150 /* Determine golem's speed */ 2156 /* Determine golem's speed */
2151 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell))); 2157 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell)));
2152 2158

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines