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.60 by root, Sun Jun 24 01:09:28 2007 UTC vs.
Revision 1.67 by root, Mon Aug 13 12:50:30 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
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;
257 && at_tmp->weight < at->weight))) 255 && at_tmp->weight < at->weight)))
258 at = at_tmp; 256 at = at_tmp;
259 } 257 }
260 } 258 }
261 } 259 }
260
262 /* 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
263 * know 262 * know
264 */ 263 */
265 if (!at) 264 if (!at)
266 { 265 {
291 if (!dir) 290 if (!dir)
292 { 291 {
293 examine_monster (op, op); 292 examine_monster (op, op);
294 return 1; 293 return 1;
295 } 294 }
295
296 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob); 296 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob);
297 for (r = 1; r < maxrange; r++) 297 for (r = 1; r < maxrange; r++)
298 { 298 {
299 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];
300 300
320 examine_monster (op, tmp); 320 examine_monster (op, tmp);
321 return 1; 321 return 1;
322 } 322 }
323 } 323 }
324 } 324 }
325
325 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing."); 326 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing.");
326 return 1; 327 return 1;
327} 328}
328
329 329
330/* This checks to see if 'pl' is invisible to 'mon'. 330/* This checks to see if 'pl' is invisible to 'mon'.
331 * does race check, undead check, etc 331 * does race check, undead check, etc
332 * Returns TRUE if mon can't see pl, false 332 * Returns TRUE if mon can't see pl, false
333 * otherwise. This doesn't check range, walls, etc. It 333 * otherwise. This doesn't check range, walls, etc. It
611 buf << "Your metabolism is focused on " << change_resist_msg[tmp->stats.exp] << ".\n"; 611 buf << "Your metabolism is focused on " << change_resist_msg[tmp->stats.exp] << ".\n";
612 612
613 break; 613 break;
614 } 614 }
615 } 615 }
616
617 buf << '\0'; // zero-terminate
616 618
617 new_draw_info (NDI_UNIQUE, 0, op, buf.linearise ()); 619 new_draw_info (NDI_UNIQUE, 0, op, buf.linearise ());
618 620
619 return 1; 621 return 1;
620} 622}
1274} 1276}
1275 1277
1276/* Alchemy code by Mark Wedel 1278/* Alchemy code by Mark Wedel
1277 * 1279 *
1278 * This code adds a new spell, called alchemy. Alchemy will turn 1280 * This code adds a new spell, called alchemy. Alchemy will turn
1279 * objects to gold nuggets, the value of the gold nuggets being 1281 * objects to pyrite ("false gold"), henceforth called gold nuggets.
1280 * about 90% of that of the item itself. It uses the value of the
1281 * object before charisma adjustments, because the nuggets themselves
1282 * will be will be adjusted by charisma when sold.
1283 * 1282 *
1284 * Large nuggets are worth 25 gp each (base). You will always get 1283 * The value of the gold nuggets being about 90% of that of the item
1285 * the maximum number of large nuggets you could get. 1284 * itself. It uses the value of the object before charisma adjustments,
1286 * Small nuggets are worth 1 gp each (base). You will get from 0 1285 * because the nuggets themselves will be will be adjusted by charisma
1287 * to the max amount of small nuggets as you could get. 1286 * when sold.
1288 *
1289 * For example, if an item is worth 110 gold, you will get
1290 * 4 large nuggets, and from 0-10 small nuggets.
1291 * 1287 *
1292 * There is also a chance (1:30) that you will get nothing at all 1288 * There is also a chance (1:30) that you will get nothing at all
1293 * for the object. There is also a maximum weight that will be 1289 * for the object. There is also a maximum weight that will be
1294 * alchemised. 1290 * alchemised.
1295 */ 1291 */
1318 total_weight += obj->total_weight (); 1314 total_weight += obj->total_weight ();
1319 1315
1320 obj->destroy (); 1316 obj->destroy ();
1321} 1317}
1322 1318
1323static void
1324update_map (object *op, maptile *m, int small_nuggets, object *small, int large_nuggets, object *large, int x, int y)
1325{
1326 int flag = 0;
1327
1328 /* Put any nuggets below the player, but we can only pass this
1329 * flag if we are on the same space as the player
1330 */
1331 if (x == op->x && y == op->y && op->map == m)
1332 flag = INS_BELOW_ORIGINATOR;
1333
1334 if (small_nuggets)
1335 {
1336 object *tmp = small->clone ();
1337 tmp->nrof = small_nuggets;
1338 m->insert (tmp, x, y, op, flag);
1339 }
1340
1341 if (large_nuggets)
1342 {
1343 object *tmp = large->clone ();
1344 tmp->nrof = large_nuggets;
1345 m->insert (tmp, x, y, op, flag);
1346 }
1347
1348 if (object *pl = m->at (x, y).player ())
1349 if (pl->contr->ns)
1350 pl->contr->ns->look_position = 0;
1351}
1352
1353int 1319int
1354alchemy (object *op, object *caster, object *spell_ob) 1320alchemy (object *op, object *caster, object *spell_ob)
1355{ 1321{
1356 if (op->type != PLAYER) 1322 if (op->type != PLAYER)
1357 return 0; 1323 return 0;
1358 1324
1359 object *large = get_archetype ("largenugget"); 1325 archetype *nugget[3];
1360 object *small = get_archetype ("smallnugget"); 1326
1327 nugget[0] = archetype::find ("pyrite3");
1328 nugget[1] = archetype::find ("pyrite2");
1329 nugget[2] = archetype::find ("pyrite");
1361 1330
1362 /* Put a maximum weight of items that can be alchemised. Limits the power 1331 /* Put a maximum weight of items that can be alchemised. Limits the power
1363 * some, and also prevents people from alchemising every table/chair/clock 1332 * some, and also prevents people from alchemising every table/chair/clock
1364 * in sight 1333 * in sight
1365 */ 1334 */
1417 if (weight > weight_max) 1386 if (weight > weight_max)
1418 break; 1387 break;
1419 } 1388 }
1420 } 1389 }
1421 1390
1391 value -= rndm (value >> 4);
1422 value = min (value, value_max); 1392 value = min (value, value_max);
1423 1393
1424 uint64 count = value / large->value; 1394 for (int i = 0; i < sizeof (nugget) / sizeof (nugget [0]); ++i)
1425 int large_nuggets = count; 1395 if (int nrof = value / nugget [i]->value)
1426 value -= count * large->value;
1427
1428 count = value / small->value;
1429 int small_nuggets = count;
1430
1431 /* Insert all the nuggets at one time. This probably saves time, but
1432 * it also prevents us from alcheming nuggets that were just created
1433 * with this spell.
1434 */ 1396 {
1435 update_map (op, mp, small_nuggets, small, large_nuggets, large, nx, ny); 1397 value -= nrof * nugget[i]->value;
1398
1399 object *tmp = arch_to_object (nugget[i]);
1400 tmp->nrof = nrof;
1401 tmp->flag [FLAG_IDENTIFIED] = true;
1402 op->map->insert (tmp, x, y, op, 0);
1403 }
1436 1404
1437 if (weight > weight_max) 1405 if (weight > weight_max)
1438 goto bailout; 1406 goto bailout;
1439 } 1407 }
1440 } 1408 }
1441 1409
1442bailout: 1410bailout:
1443 large->destroy ();
1444 small->destroy ();
1445 return 1; 1411 return 1;
1446} 1412}
1447 1413
1448 1414
1449/* This function removes the cursed/damned status on equipped 1415/* This function removes the cursed/damned status on equipped
1997 object *weapon, *tmp; 1963 object *weapon, *tmp;
1998 char buf[MAX_BUF]; 1964 char buf[MAX_BUF];
1999 int a, i; 1965 int a, i;
2000 sint16 x, y; 1966 sint16 x, y;
2001 maptile *m; 1967 maptile *m;
2002 materialtype_t *mt;
2003 1968
2004 if (!spell->other_arch) 1969 if (!spell->other_arch)
2005 { 1970 {
2006 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 1971 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
2007 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name); 1972 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name);
2119 2084
2120 /* attacktype */ 2085 /* attacktype */
2121 if (!tmp->attacktype) 2086 if (!tmp->attacktype)
2122 tmp->attacktype = AT_PHYSICAL; 2087 tmp->attacktype = AT_PHYSICAL;
2123 2088
2124 mt = NULL;
2125 if (op->materialname != NULL)
2126 mt = name_to_material (op->materialname); 2089 if (materialtype_t *mt = name_to_material (op->materialname))
2127 if (mt != NULL)
2128 { 2090 {
2129 for (i = 0; i < NROFATTACKS; i++) 2091 for (i = 0; i < NROFATTACKS; i++)
2130 tmp->resist[i] = 50 - (mt->save[i] * 5); 2092 tmp->resist[i] = 50 - (mt->save[i] * 5);
2131 a = mt->save[0]; 2093 a = mt->save[0];
2132 } 2094 }
2134 { 2096 {
2135 for (i = 0; i < NROFATTACKS; i++) 2097 for (i = 0; i < NROFATTACKS; i++)
2136 tmp->resist[i] = 5; 2098 tmp->resist[i] = 5;
2137 a = 10; 2099 a = 10;
2138 } 2100 }
2101
2139 /* Set weapon's immunity */ 2102 /* Set weapon's immunity */
2140 tmp->resist[ATNR_CONFUSION] = 100; 2103 tmp->resist[ATNR_CONFUSION] = 100;
2141 tmp->resist[ATNR_POISON] = 100; 2104 tmp->resist[ATNR_POISON] = 100;
2142 tmp->resist[ATNR_SLOW] = 100; 2105 tmp->resist[ATNR_SLOW] = 100;
2143 tmp->resist[ATNR_PARALYZE] = 100; 2106 tmp->resist[ATNR_PARALYZE] = 100;
2149 2112
2150 /* Improve weapon's armour value according to best save vs. physical of its material */ 2113 /* Improve weapon's armour value according to best save vs. physical of its material */
2151 2114
2152 if (a > 14) 2115 if (a > 14)
2153 a = 14; 2116 a = 14;
2117
2154 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a)); 2118 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a));
2155 2119
2156 /* Determine golem's speed */ 2120 /* Determine golem's speed */
2157 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell))); 2121 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell)));
2158 2122

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines