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.113 by root, Thu Apr 8 17:52:59 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,2010 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)
989 { 989 {
990 skill = find_skill_by_name (op, spell_ob->skill); 990 skill = find_skill_by_name (op, spell_ob->skill);
991 991
992 if (!skill) 992 if (!skill)
993 { 993 {
994 op->failmsg (format ("You need the skill %s to cast %s! " 994 op->failmsg (format ("You need the %s skill to cast %s! "
995 "H<You either need to learn the skill via a skill scroll " 995 "H<You either need to learn the skill via a skill scroll "
996 "or you need to wear a talisman or holy symbol.>", 996 "or you need to wear a talisman, holy symbol or another skill tool.>",
997 &spell_ob->skill, &spell_ob->name)); 997 &spell_ob->skill, &spell_ob->name));
998 return 0; 998 return 0;
999 } 999 }
1000 1000
1001 const char *msg = ""; 1001 const char *msg = "";
1002 1002
1003 int caster_level = skill->level; 1003 int caster_level = skill->level;
1085 * doing. 1085 * doing.
1086 */ 1086 */
1087 1087
1088 if ((mflags & P_SAFE) && !QUERY_FLAG (op, FLAG_WIZCAST)) // There is _ABSOLUTELY_ no magic allowed here (except wizards :-)! 1088 if ((mflags & P_SAFE) && !QUERY_FLAG (op, FLAG_WIZCAST)) // There is _ABSOLUTELY_ no magic allowed here (except wizards :-)!
1089 { 1089 {
1090 op->speed_left -= 2 * op->speed; // freeze for two ticks, so we don't flood
1090 op->failmsg ("This ground is sacred! The gods prevent any magical effects done by you here!"); 1091 op->failmsg ("This ground is sacred! The gods prevent any magical effects done by you here!");
1091 return 0; 1092 return 0;
1092 } 1093 }
1093 1094
1094 if ((spell_ob->type == SPELL) 1095 if ((spell_ob->type == SPELL)
1126 * the player any time. 1127 * the player any time.
1127 * Ignore casting time for firewalls 1128 * Ignore casting time for firewalls
1128 */ 1129 */
1129 if (caster == op && caster->type != FIREWALL) 1130 if (caster == op && caster->type != FIREWALL)
1130 { 1131 {
1131 op->speed_left -= spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * fabs (op->speed); 1132 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 1133 /* 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 1134 * put a lower limit so that the player isn't stuck here too long
1134 */ 1135 */
1135 if ((spell_ob->casting_time > 0) && op->speed_left < -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * fabs (op->speed)) 1136 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); 1137 op->speed_left = -spell_ob->casting_time * PATH_TIME_MULT (op, spell_ob) * op->speed;
1137 } 1138 }
1138 else if (caster->type == WAND || caster->type == HORN || caster->type == ROD || caster->type == POTION || caster->type == SCROLL) 1139 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); 1140 op->speed_left -= 2 * op->speed;
1140 1141
1141 if (op->type == PLAYER && op == caster) 1142 if (op->type == PLAYER && op == caster)
1142 { 1143 {
1143 op->stats.grace -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE); 1144 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); 1145 op->stats.sp -= SP_level_spellpoint_cost (caster, spell_ob, SPELL_MANA);
1151 if (op != caster && !skill && caster->skill) 1152 if (op != caster && !skill && caster->skill)
1152 { 1153 {
1153 skill = find_skill_by_name (op, caster->skill); 1154 skill = find_skill_by_name (op, caster->skill);
1154 if (!skill) 1155 if (!skill)
1155 { 1156 {
1156 op->failmsg (format ("You lack the skill %s to use the %s!", &caster->skill, query_name (caster))); 1157 op->failmsg (format ("You lack the %s skill, which is required to use the %s!", &caster->skill, query_name (caster)));
1157 return 0; 1158 return 0;
1158 } 1159 }
1159 1160
1160 op->change_skill (skill); /* needed for proper exp credit */ 1161 op->change_skill (skill); /* needed for proper exp credit */
1161 } 1162 }
1468 break; 1469 break;
1469 1470
1470 case SP_MOVING_BALL: 1471 case SP_MOVING_BALL:
1471 if (QUERY_FLAG (victim, FLAG_ALIVE)) 1472 if (QUERY_FLAG (victim, FLAG_ALIVE))
1472 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1); 1473 hit_player (victim, spell->stats.dam, spell, spell->attacktype, 1);
1473 else if (victim->materialname) 1474 else if (victim->material != MATERIAL_NULL)
1474 save_throw_object (victim, spell->attacktype, spell); 1475 save_throw_object (victim, spell->attacktype, spell);
1475 1476
1476 break; 1477 break;
1477 } 1478 }
1478} 1479}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines