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

Comparing deliantra/server/server/spell_util.C (file contents):
Revision 1.104 by root, Sun Nov 8 23:05:22 2009 UTC vs.
Revision 1.110 by root, Fri Mar 26 00:59:22 2010 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992 Frank Tore Johansen
7 * 7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 9 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your 10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 11 * option) any later version.
83 */ 83 */
84void 84void
85spell_effect (object *spob, int x, int y, maptile *map, object *originator) 85spell_effect (object *spob, int x, int y, maptile *map, object *originator)
86{ 86{
87 if (spob->other_arch) 87 if (spob->other_arch)
88 map->insert (arch_to_object (spob->other_arch), x, y, originator); 88 map->insert (spob->other_arch->instance (), x, y, originator);
89} 89}
90 90
91static int 91static int
92attuned_bonus (object *caster, object *spell, int level) 92attuned_bonus (object *caster, object *spell, int level)
93{ 93{
659 * insert multipart monsters properly 659 * insert multipart monsters properly
660 */ 660 */
661 //TODO: use expand_tail + ... 661 //TODO: use expand_tail + ...
662 while (at != NULL) 662 while (at != NULL)
663 { 663 {
664 tmp = arch_to_object (at); 664 tmp = at->instance ();
665 tmp->x = op->x + freearr_x[dir] + at->x; 665 tmp->x = op->x + freearr_x[dir] + at->x;
666 tmp->y = op->y + freearr_y[dir] + at->y; 666 tmp->y = op->y + freearr_y[dir] + at->y;
667 tmp->map = op->map; 667 tmp->map = op->map;
668 if (head) 668 if (head)
669 { 669 {
892 { 892 {
893 LOG (llevError, "cast_party_spell: empty other arch\n"); 893 LOG (llevError, "cast_party_spell: empty other arch\n");
894 return 0; 894 return 0;
895 } 895 }
896 896
897 object *spell = arch_to_object (spell_ob->other_arch); 897 object *spell = spell_ob->other_arch->instance ();
898 898
899 /* Always cast spell on caster */ 899 /* Always cast spell on caster */
900 int success = cast_spell (op, caster, dir, spell, spellparam); 900 int success = cast_spell (op, caster, dir, spell, spellparam);
901 901
902 if (!op->contr || !op->contr->party) 902 if (!op->contr || !op->contr->party)
1126 * the player any time. 1126 * the player any time.
1127 * Ignore casting time for firewalls 1127 * Ignore casting time for firewalls
1128 */ 1128 */
1129 if (caster == op && caster->type != FIREWALL) 1129 if (caster == op && caster->type != FIREWALL)
1130 { 1130 {
1131 op->speed_left -= spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * fabs (op->speed); 1131 op->speed_left -= spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * op->speed;
1132 /* Other portions of the code may also decrement the speed of the player, so 1132 /* Other portions of the code may also decrement the speed of the player, so
1133 * put a lower limit so that the player isn't stuck here too long 1133 * put a lower limit so that the player isn't stuck here too long
1134 */ 1134 */
1135 if ((spell_ob->casting_time > 0) && op->speed_left < -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * fabs (op->speed)) 1135 if ((spell_ob->casting_time > 0) && op->speed_left < -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * op->speed)
1136 op->speed_left = -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * fabs (op->speed); 1136 op->speed_left = -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * op->speed;
1137 } 1137 }
1138 else if (caster->type == WAND || caster->type == HORN || caster->type == ROD || caster->type == POTION || caster->type == SCROLL) 1138 else if (caster->type == WAND || caster->type == HORN || caster->type == ROD || caster->type == POTION || caster->type == SCROLL)
1139 op->speed_left -= 2 * fabs (op->speed); 1139 op->speed_left -= 2 * op->speed;
1140 1140
1141 if (op->type == PLAYER && op == caster) 1141 if (op->type == PLAYER && op == caster)
1142 { 1142 {
1143 op->stats.grace -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE); 1143 op->stats.grace -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE);
1144 op->stats.sp -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA); 1144 op->stats.sp -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA);
1468 break; 1468 break;
1469 1469
1470 case SP_MOVING_BALL: 1470 case SP_MOVING_BALL:
1471 if (QUERY_FLAG (victim, FLAG_ALIVE)) 1471 if (QUERY_FLAG (victim, FLAG_ALIVE))
1472 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1); 1472 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1473 else if (victim->materialname) 1473 else if (victim->material != MATERIAL_NULL)
1474 save_throw_object (victim, spell->attacktype, spell); 1474 save_throw_object (victim, spell->attacktype, spell);
1475 1475
1476 break; 1476 break;
1477 } 1477 }
1478} 1478}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines