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.131 by root, Fri Apr 23 04:32:47 2010 UTC vs.
Revision 1.143 by root, Mon Nov 12 03:48:34 2012 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,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 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.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the Affero GNU General Public License 18 * You should have received a copy of the Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see 19 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 20 * <http://www.gnu.org/licenses/>.
21 * 21 *
22 * The authors can be reached via e-mail to <support@deliantra.net> 22 * The authors can be reached via e-mail to <support@deliantra.net>
23 */ 23 */
24 24
25#include <global.h> 25#include <global.h>
26#include <object.h> 26#include <object.h>
73 if (!(random_roll (0, 3, op, PREFER_HIGH))) 73 if (!(random_roll (0, 3, op, PREFER_HIGH)))
74 { 74 {
75 op->failmsgf ("The %s vibrates violently, then explodes!", query_name (wand)); 75 op->failmsgf ("The %s vibrates violently, then explodes!", query_name (wand));
76 op->play_sound (sound_find ("ob_explode")); 76 op->play_sound (sound_find ("ob_explode"));
77 wand->destroy (); 77 wand->destroy ();
78 object *tmp = get_archetype (shstr_fireball); 78 object *tmp = archetype::get (shstr_fireball);
79 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10; 79 tmp->stats.dam = (spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob)) / 10;
80 80
81 if (!tmp->stats.dam) 81 if (!tmp->stats.dam)
82 tmp->stats.dam = 1; 82 tmp->stats.dam = 1;
83 83
196 /* Can't get any money for these objects */ 196 /* Can't get any money for these objects */
197 missile->value = 0; 197 missile->value = 0;
198 198
199 missile->set_flag (FLAG_IDENTIFIED); 199 missile->set_flag (FLAG_IDENTIFIED);
200 200
201 if (!cast_create_obj (op, caster, missile, dir) && op->type == PLAYER && !missile->destroyed ()) 201 cast_create_obj (op, caster, missile, dir);
202
203 if (!dir
204 && op->type == PLAYER
205 && !missile->destroyed ())
202 pick_up (op, missile); 206 pick_up (op, missile);
203 207
204 return 1; 208 return 1;
205} 209}
206
207 210
208/* allows the choice of what sort of food object to make. 211/* allows the choice of what sort of food object to make.
209 * If spellparam is NULL, it will create food dependent on level --PeterM*/ 212 * If spellparam is NULL, it will create food dependent on level --PeterM*/
210int 213int
211cast_create_food (object *op, object *caster, object *spell_ob, int dir, const char *spellparam) 214cast_create_food (object *op, object *caster, object *spell_ob, int dir, const char *spellparam)
389 392
390 /* Remove the switch with 90% duplicate code - just handle the differences with 393 /* Remove the switch with 90% duplicate code - just handle the differences with
391 * and if statement or two. 394 * and if statement or two.
392 */ 395 */
393 op->invisible += spell_ob->duration + SP_level_duration_adjust (caster, spell_ob); 396 op->invisible += spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
397
394 /* max duration */ 398 /* limit duration */
395 if (op->invisible > 1000) 399 min_it (op->invisible, 1000);
396 op->invisible = 1000;
397 400
398 if (op->type == PLAYER) 401 if (op->type == PLAYER)
399 { 402 {
400 op->contr->invis_race = spell_ob->race; 403 op->contr->invis_race = spell_ob->race;
401 404
485 { 488 {
486 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you."); 489 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you.");
487 return 1; 490 return 1;
488 } 491 }
489 492
490 object *dummy = get_archetype (FORCE_NAME); 493 object *dummy = archetype::get (FORCE_NAME);
491 494
492 int time = max (1, spell_ob->duration - SP_level_duration_adjust (caster, spell_ob)); 495 int time = max (1, spell_ob->duration - SP_level_duration_adjust (caster, spell_ob));
493 496
494 /* value of speed really doesn't make much difference, as long as it is 497 /* value of speed really doesn't make much difference, as long as it is
495 * positive. Lower value may be useful so that the problem doesn't 498 * positive. Lower value may be useful so that the problem doesn't
1072 1075
1073 new_draw_info_format (NDI_UNIQUE, 0, op, 1076 new_draw_info_format (NDI_UNIQUE, 0, op,
1074 "You create an aura of magical force. H<The effect will last for about %.10g seconds.>", 1077 "You create an aura of magical force. H<The effect will last for about %.10g seconds.>",
1075 TICK2TIME (duration)); 1078 TICK2TIME (duration));
1076 1079
1077 force = get_archetype (FORCE_NAME); 1080 force = archetype::get (FORCE_NAME);
1078 force->subtype = FORCE_CHANGE_ABILITY; 1081 force->subtype = FORCE_CHANGE_ABILITY;
1079 force->duration = duration; 1082 force->duration = duration;
1080 1083
1081 if (spell_ob->race) 1084 if (spell_ob->race)
1082 force->name = spell_ob->race; 1085 force->name = spell_ob->race;
1089 force->speed_left = -1.0; 1092 force->speed_left = -1.0;
1090 force->set_flag (FLAG_APPLIED); 1093 force->set_flag (FLAG_APPLIED);
1091 1094
1092 /* Now start processing the effects. First, protections */ 1095 /* Now start processing the effects. First, protections */
1093 for (i = 0; i < NROFATTACKS; i++) 1096 for (i = 0; i < NROFATTACKS; i++)
1094 {
1095 if (spell_ob->resist[i]) 1097 if (spell_ob->resist[i])
1096 {
1097 force->resist[i] = spell_ob->resist[i] + SP_level_dam_adjust (caster, spell_ob); 1098 force->resist[i] = min (100, spell_ob->resist[i] + SP_level_dam_adjust (caster, spell_ob));
1098 if (force->resist[i] > 100)
1099 force->resist[i] = 100;
1100 }
1101 }
1102 1099
1103 if (spell_ob->stats.hp) 1100 if (spell_ob->stats.hp)
1104 force->stats.hp = spell_ob->stats.hp + SP_level_dam_adjust (caster, spell_ob); 1101 force->stats.hp = spell_ob->stats.hp + SP_level_dam_adjust (caster, spell_ob);
1105 1102
1106 if (tmp->type == PLAYER) 1103 if (tmp->type == PLAYER)
1192 } 1189 }
1193 } 1190 }
1194 1191
1195 if (force == NULL) 1192 if (force == NULL)
1196 { 1193 {
1197 force = get_archetype (FORCE_NAME); 1194 force = archetype::get (FORCE_NAME);
1198 force->subtype = FORCE_CHANGE_ABILITY; 1195 force->subtype = FORCE_CHANGE_ABILITY;
1199 if (spell_ob->race) 1196 if (spell_ob->race)
1200 force->name = spell_ob->race; 1197 force->name = spell_ob->race;
1201 else 1198 else
1202 force->name = spell_ob->name; 1199 force->name = spell_ob->name;
1217 { 1214 {
1218 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect."); 1215 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect.");
1219 } 1216 }
1220 return 0; 1217 return 0;
1221 } 1218 }
1219
1222 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50; 1220 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
1223 force->speed = 1.0; 1221 force->speed = 1.0;
1224 force->speed_left = -1.0; 1222 force->speed_left = -1.0;
1225 force->set_flag (FLAG_APPLIED); 1223 force->set_flag (FLAG_APPLIED);
1226 1224
1262 1260
1263/* Alchemy code by Mark Wedel 1261/* Alchemy code by Mark Wedel
1264 * 1262 *
1265 * This code adds a new spell, called alchemy. Alchemy will turn 1263 * This code adds a new spell, called alchemy. Alchemy will turn
1266 * objects to pyrite ("false gold"), henceforth called gold nuggets. 1264 * objects to pyrite ("false gold"), henceforth called gold nuggets.
1267 * 1265 *
1268 * The value of the gold nuggets being about 90% of that of the item 1266 * The value of the gold nuggets being about 90% of that of the item
1269 * itself. It uses the value of the object before charisma adjustments, 1267 * itself. It uses the value of the object before charisma adjustments,
1270 * because the nuggets themselves will be will be adjusted by charisma 1268 * because the nuggets themselves will be will be adjusted by charisma
1271 * when sold. 1269 * when sold.
1272 * 1270 *
1374 } 1372 }
1375 1373
1376 value -= rndm (value >> 4); 1374 value -= rndm (value >> 4);
1377 value = min (value, value_max); 1375 value = min (value, value_max);
1378 1376
1379 for (int i = 0; i < sizeof (nugget) / sizeof (nugget [0]); ++i) 1377 for (int i = 0; i < array_length (nugget); ++i)
1380 if (int nrof = value / nugget [i]->value) 1378 if (int nrof = value / nugget [i]->value)
1381 { 1379 {
1382 value -= nrof * nugget[i]->value; 1380 value -= nrof * nugget[i]->value;
1383 1381
1384 object *tmp = nugget[i]->instance (); 1382 object *tmp = nugget[i]->instance ();
1402int 1400int
1403remove_curse (object *op, object *caster, object *spell) 1401remove_curse (object *op, object *caster, object *spell)
1404{ 1402{
1405 int success = 0, was_one = 0; 1403 int success = 0, was_one = 0;
1406 1404
1405 int num_uncurse = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell));
1406
1407 op->splay_marked ();
1408
1409 int typeflag = spell->last_sp ? FLAG_DAMNED : FLAG_CURSED;
1410
1407 for (object *tmp = op->inv; tmp; tmp = tmp->below) 1411 for (object *tmp = op->inv; tmp && num_uncurse; tmp = tmp->below)
1408 if (tmp->flag [FLAG_APPLIED] && 1412 if (!tmp->invisible && tmp->flag [typeflag])
1409 ((tmp->flag [FLAG_CURSED] && spell->flag [FLAG_CURSED]) ||
1410 (tmp->flag [FLAG_DAMNED] && spell->flag [FLAG_DAMNED])))
1411 { 1413 {
1412 was_one++; 1414 ++was_one;
1413 1415
1414 if (tmp->level <= casting_level (caster, spell)) 1416 if (tmp->level <= casting_level (caster, spell))
1415 { 1417 {
1416 success++; 1418 ++success;
1417 if (spell->flag [FLAG_DAMNED]) 1419 --num_uncurse;
1418 tmp->clr_flag (FLAG_DAMNED);
1419 1420
1421 tmp->clr_flag (typeflag);
1420 tmp->clr_flag (FLAG_CURSED); 1422 tmp->clr_flag (FLAG_CURSED);
1421 tmp->clr_flag (FLAG_KNOWN_CURSED); 1423 tmp->clr_flag (FLAG_KNOWN_CURSED);
1422 tmp->value = 0; /* Still can't sell it */ 1424 tmp->value = 0; /* Still can't sell it */
1423 1425
1424 if (object *pl = tmp->visible_to ()) 1426 if (object *pl = tmp->visible_to ())
1427 } 1429 }
1428 1430
1429 if (op->type == PLAYER) 1431 if (op->type == PLAYER)
1430 { 1432 {
1431 if (success) 1433 if (success)
1432 new_draw_info (NDI_UNIQUE, 0, op, "You feel like some of your items are looser now."); 1434 new_draw_info (NDI_UNIQUE, 0, op, "You realise that some of your items look shinier now. H<You successfully removed some curses.>");
1433 else 1435 else
1434 { 1436 {
1435 if (was_one) 1437 if (was_one)
1436 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse."); 1438 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove any curse. H<The spell was not strong enough.>");
1437 else 1439 else
1438 new_draw_info (NDI_UNIQUE, 0, op, "You are not using any cursed items."); 1440 new_draw_info (NDI_UNIQUE, 0, op, "You are not having any cursed items. H<Epic fail.>");
1439 } 1441 }
1440 } 1442 }
1441 1443
1442 return success; 1444 return success;
1443} 1445}
1444 1446
1445/* Identifies objects in the players inventory/on the ground */ 1447/* Identifies objects in the players inventory/on the ground */
1446int 1448int
1447cast_identify (object *op, object *caster, object *spell) 1449cast_identify (object *op, object *caster, object *spell)
1448{ 1450{
1449 object *tmp;
1450 dynbuf_text &buf = msg_dynbuf; buf.clear (); 1451 dynbuf_text &buf = msg_dynbuf; buf.clear ();
1451 1452
1452 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell)); 1453 int num_ident = max (1, spell->stats.dam + SP_level_dam_adjust (caster, spell));
1453 1454
1455 op->splay_marked ();
1456
1454 for (tmp = op->inv; tmp; tmp = tmp->below) 1457 for (object *tmp = op->inv; tmp; tmp = tmp->below)
1455 { 1458 {
1456 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ()) 1459 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ())
1457 { 1460 {
1458 identify (tmp); 1461 identify (tmp);
1459 1462
1474 * stuff on the floor. Only identify stuff on the floor if the spell 1477 * stuff on the floor. Only identify stuff on the floor if the spell
1475 * was not fully used. 1478 * was not fully used.
1476 */ 1479 */
1477 if (num_ident) 1480 if (num_ident)
1478 { 1481 {
1479 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above) 1482 for (object *tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above)
1480 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ()) 1483 if (!tmp->flag [FLAG_IDENTIFIED] && !tmp->invisible && tmp->need_identify ())
1481 { 1484 {
1482 identify (tmp); 1485 identify (tmp);
1483 1486
1484 if (object *pl = tmp->visible_to ()) 1487 if (object *pl = tmp->visible_to ())
1511 1514
1512int 1515int
1513cast_detection (object *op, object *caster, object *spell, object *skill) 1516cast_detection (object *op, object *caster, object *spell, object *skill)
1514{ 1517{
1515 object *tmp, *last, *god, *detect; 1518 object *tmp, *last, *god, *detect;
1516 int done_one, range, mflags, floor, level; 1519 int done_one, range, floor, level;
1517 sint16 x, y, nx, ny; 1520 sint16 x, y, nx, ny;
1518 maptile *m; 1521 maptile *m;
1519 1522
1520 /* We precompute some values here so that we don't have to keep 1523 /* We precompute some values here so that we don't have to keep
1521 * doing it over and over again. 1524 * doing it over and over again.
2109 /* Improve weapon's armour value according to best save vs. physical of its material */ 2112 /* Improve weapon's armour value according to best save vs. physical of its material */
2110 2113
2111 if (a > 14) 2114 if (a > 14)
2112 a = 14; 2115 a = 14;
2113 2116
2114 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a)); 2117 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.f - (float) tmp->resist[ATNR_PHYSICAL]) / (30.f - 2.f * a));
2115 2118
2116 /* Determine golem's speed */ 2119 /* Determine golem's speed */
2117 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell))); 2120 tmp->set_speed (min (3.33f, 0.4f + 0.1f * SP_level_range_adjust (caster, spell)));
2118 2121
2119 if (!spell->race) 2122 if (!spell->race)
2120 { 2123 {
2121 sprintf (buf, "animated %s", &weapon->name); 2124 sprintf (buf, "animated %s", &weapon->name);
2122 tmp->name = buf; 2125 tmp->name = buf;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines