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.105 by root, Tue Nov 10 04:38:46 2009 UTC vs.
Revision 1.114 by root, Sat Apr 10 04:54:10 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->failmsgf ("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;
1014 msg = " (repelled)"; 1014 msg = " (repelled)";
1015 } 1015 }
1016 1016
1017 if (spell_ob->level > caster_level) 1017 if (spell_ob->level > caster_level)
1018 { 1018 {
1019 op->failmsg (format ("You lack enough skill to cast that spell! " 1019 op->failmsgf ("You lack enough skill to cast that spell! "
1020 "H<Your effective cast level is %d%s, but level %d is required.>", 1020 "H<Your effective cast level is %d%s, but level %d is required.>",
1021 caster_level, msg, spell_ob->level)); 1021 caster_level, msg, spell_ob->level);
1022 if (!op->is_wiz ()) 1022 if (!op->is_wiz ())
1023 return 0; 1023 return 0;
1024 } 1024 }
1025 } 1025 }
1026 1026
1043 10 * SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) / op->stats.maxgrace > 0) 1043 10 * SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) / op->stats.maxgrace > 0)
1044 op->statusmsg (format ("%s grants your prayer, though you are unworthy.", godname)); 1044 op->statusmsg (format ("%s grants your prayer, though you are unworthy.", godname));
1045 else 1045 else
1046 { 1046 {
1047 prayer_failure (op, op->stats.grace, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) - op->stats.grace); 1047 prayer_failure (op, op->stats.grace, SP_level_spellpoint_cost (caster, spell_ob, SPELL_GRACE) - op->stats.grace);
1048 op->failmsg (format ("%s ignores your prayer.", godname)); 1048 op->failmsgf ("%s ignores your prayer.", godname);
1049 return 0; 1049 return 0;
1050 } 1050 }
1051 } 1051 }
1052 1052
1053 /* player/monster is trying to cast the spell. might fumble it */ 1053 /* player/monster is trying to cast the spell. might fumble it */
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)
1100 { 1101 {
1101 if (op->type != PLAYER) 1102 if (op->type != PLAYER)
1102 return 0; 1103 return 0;
1103 1104
1104 if ((mflags & P_NO_CLERIC) && spell_ob->stats.grace) 1105 if ((mflags & P_NO_CLERIC) && spell_ob->stats.grace)
1105 op->failmsg (format ("This ground is unholy! %s ignores you.", godname)); 1106 op->failmsgf ("This ground is unholy! %s ignores you.", godname);
1106 else if (object *item = op->contr->ranged_ob) 1107 else if (object *item = op->contr->ranged_ob)
1107 { 1108 {
1108 if (item->type == SPELL) 1109 if (item->type == SPELL)
1109 op->failmsg ("Something blocks your spellcasting."); 1110 op->failmsg ("Something blocks your spellcasting.");
1110 else if (item->type == SCROLL) 1111 else if (item->type == SCROLL)
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->failmsgf ("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 }
1320 break; 1321 break;
1321 1322
1322 case SP_MOVING_BALL: 1323 case SP_MOVING_BALL:
1323 if (spell_ob->path_repelled && (spell_ob->path_repelled & caster->path_attuned) != spell_ob->path_repelled) 1324 if (spell_ob->path_repelled && (spell_ob->path_repelled & caster->path_attuned) != spell_ob->path_repelled)
1324 { 1325 {
1325 op->failmsg (format ("You lack the proper attunement to cast %s!", &spell_ob->name)); 1326 op->failmsgf ("You lack the proper attunement to cast %s!", &spell_ob->name);
1326 success = 0; 1327 success = 0;
1327 } 1328 }
1328 else 1329 else
1329 success = fire_arch_from_position (op, caster, op->x, op->y, dir, spell_ob); 1330 success = fire_arch_from_position (op, caster, op->x, op->y, dir, spell_ob);
1330 break; 1331 break;
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 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