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.62 by root, Sun Jul 1 05:00:20 2007 UTC vs.
Revision 1.71 by root, Wed Aug 29 20:40:25 2007 UTC

69 return 0; 69 return 0;
70 } 70 }
71 if (!(random_roll (0, 3, op, PREFER_HIGH))) 71 if (!(random_roll (0, 3, op, PREFER_HIGH)))
72 { 72 {
73 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));
74 play_sound_map (op->map, op->x, op->y, SOUND_OB_EXPLODE); 74 op->play_sound (sound_find ("ob_explode"));
75 esrv_del_item (op->contr, wand->count); 75 esrv_del_item (op->contr, wand->count);
76 wand->destroy (); 76 wand->destroy ();
77 tmp = get_archetype ("fireball"); 77 tmp = get_archetype ("fireball");
78 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;
79 79
122 * great a plus, the default is used. 122 * great a plus, the default is used.
123 * 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
124 * 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
125 * create nonnmagic arrows, or even -1, etc... 125 * create nonnmagic arrows, or even -1, etc...
126 */ 126 */
127
128int 127int
129cast_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)
130{ 129{
131 int missile_plus = 0, bonus_plus = 0; 130 int missile_plus = 0, bonus_plus = 0;
132 const char *missile_name; 131 const char *missile_name;
256 && at_tmp->weight < at->weight))) 255 && at_tmp->weight < at->weight)))
257 at = at_tmp; 256 at = at_tmp;
258 } 257 }
259 } 258 }
260 } 259 }
260
261 /* 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
262 * know 262 * know
263 */ 263 */
264 if (!at) 264 if (!at)
265 { 265 {
290 if (!dir) 290 if (!dir)
291 { 291 {
292 examine_monster (op, op); 292 examine_monster (op, op);
293 return 1; 293 return 1;
294 } 294 }
295
295 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob); 296 maxrange = spell_ob->range + SP_level_range_adjust (caster, spell_ob);
296 for (r = 1; r < maxrange; r++) 297 for (r = 1; r < maxrange; r++)
297 { 298 {
298 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];
299 300
319 examine_monster (op, tmp); 320 examine_monster (op, tmp);
320 return 1; 321 return 1;
321 } 322 }
322 } 323 }
323 } 324 }
325
324 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing."); 326 new_draw_info (NDI_UNIQUE, 0, op, "You detect nothing.");
325 return 1; 327 return 1;
326} 328}
327
328 329
329/* This checks to see if 'pl' is invisible to 'mon'. 330/* This checks to see if 'pl' is invisible to 'mon'.
330 * does race check, undead check, etc 331 * does race check, undead check, etc
331 * Returns TRUE if mon can't see pl, false 332 * Returns TRUE if mon can't see pl, false
332 * otherwise. This doesn't check range, walls, etc. It 333 * otherwise. This doesn't check range, walls, etc. It
334 * pl is invisible. 335 * pl is invisible.
335 */ 336 */
336int 337int
337makes_invisible_to (object *pl, object *mon) 338makes_invisible_to (object *pl, object *mon)
338{ 339{
339
340 if (!pl->invisible) 340 if (!pl->invisible)
341 return 0; 341 return 0;
342
342 if (pl->type == PLAYER) 343 if (pl->type == PLAYER)
343 { 344 {
344 /* If race isn't set, then invisible unless it is undead */ 345 /* If race isn't set, then invisible unless it is undead */
345 if (!pl->contr->invis_race) 346 if (!pl->contr->invis_race)
346 { 347 {
347 if (QUERY_FLAG (mon, FLAG_UNDEAD)) 348 if (QUERY_FLAG (mon, FLAG_UNDEAD))
348 return 0; 349 return 0;
350
349 return 1; 351 return 1;
350 } 352 }
353
351 /* invis_race is set if we get here */ 354 /* invis_race is set if we get here */
352 if (!strcmp (pl->contr->invis_race, "undead") && is_true_undead (mon)) 355 if (!strcmp (pl->contr->invis_race, "undead") && is_true_undead (mon))
353 return 1; 356 return 1;
357
354 /* No race, can't be invisible to it */ 358 /* No race, can't be invisible to it */
355 if (!mon->race) 359 if (!mon->race)
356 return 0; 360 return 0;
361
357 if (strstr (mon->race, pl->contr->invis_race)) 362 if (strstr (mon->race, pl->contr->invis_race))
358 return 1; 363 return 1;
364
359 /* Nothing matched above, return 0 */ 365 /* Nothing matched above, return 0 */
360 return 0; 366 return 0;
361 } 367 }
362 else 368 else
363 { 369 {
600 606
601 if (is_dragon_pl (op)) 607 if (is_dragon_pl (op))
602 /* now grab the 'dragon_ability'-force from the player's inventory */ 608 /* now grab the 'dragon_ability'-force from the player's inventory */
603 for (tmp = op->inv; tmp; tmp = tmp->below) 609 for (tmp = op->inv; tmp; tmp = tmp->below)
604 { 610 {
605 if (tmp->type == FORCE && !strcmp (tmp->arch->archname, "dragon_ability_force")) 611 if (tmp->type == FORCE && tmp->arch->archname == shstr_dragon_ability_force)
606 { 612 {
607 if (tmp->stats.exp == 0) 613 if (tmp->stats.exp == 0)
608 buf << "Your metabolism isn't focused on anything.\n"; 614 buf << "Your metabolism isn't focused on anything.\n";
609 else 615 else
610 buf << "Your metabolism is focused on " << change_resist_msg[tmp->stats.exp] << ".\n"; 616 buf << "Your metabolism is focused on " << change_resist_msg[tmp->stats.exp] << ".\n";
894 900
895 op->speed_left = -FABS (op->speed) * 5; /* Freeze them for a short while */ 901 op->speed_left = -FABS (op->speed) * 5; /* Freeze them for a short while */
896 return 1; 902 return 1;
897} 903}
898 904
899
900/* cast_heal: Heals something. 905/* cast_heal: Heals something.
901 * op is the caster. 906 * op is the caster.
902 * dir is the direction he is casting it in. 907 * dir is the direction he is casting it in.
903 * spell is the spell object. 908 * spell is the spell object.
904 */ 909 */
930 { 935 {
931 /* See how many points we actually heal. Instead of messages 936 /* See how many points we actually heal. Instead of messages
932 * based on type of spell, we instead do messages based 937 * based on type of spell, we instead do messages based
933 * on amount of damage healed. 938 * on amount of damage healed.
934 */ 939 */
935 if (heal > (tmp->stats.maxhp - tmp->stats.hp)) 940 if (heal > tmp->stats.maxhp - tmp->stats.hp)
936 heal = tmp->stats.maxhp - tmp->stats.hp; 941 heal = tmp->stats.maxhp - tmp->stats.hp;
942
937 tmp->stats.hp += heal; 943 tmp->stats.hp += heal;
938 944
939 if (tmp->stats.hp >= tmp->stats.maxhp) 945 if (tmp->stats.hp >= tmp->stats.maxhp)
940 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel just fine!"); 946 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel just fine!");
941 else if (heal > 50) 947 else if (heal > 50)
950 success = 1; 956 success = 1;
951 } 957 }
952 } 958 }
953 959
954 if (spell->attacktype & AT_DISEASE) 960 if (spell->attacktype & AT_DISEASE)
955 if (cure_disease (tmp, op)) 961 if (cure_disease (tmp, op, spell))
956 success = 1; 962 success = 1;
957 963
958 if (spell->attacktype & AT_POISON) 964 if (spell->attacktype & AT_POISON)
959 { 965 {
960 at = archetype::find ("poisoning"); 966 at = archetype::find ("poisoning");
1009 } 1015 }
1010 1016
1011 if (spell->stats.food && tmp->stats.food < 999) 1017 if (spell->stats.food && tmp->stats.food < 999)
1012 { 1018 {
1013 tmp->stats.food += spell->stats.food; 1019 tmp->stats.food += spell->stats.food;
1020
1014 if (tmp->stats.food > 999) 1021 if (tmp->stats.food > 999)
1015 tmp->stats.food = 999; 1022 tmp->stats.food = 999;
1023
1016 success = 1; 1024 success = 1;
1017 /* We could do something a bit better like the messages for healing above */ 1025 /* We could do something a bit better like the messages for healing above */
1018 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food"); 1026 new_draw_info (NDI_UNIQUE, 0, tmp, "You feel your belly fill with food");
1019 } 1027 }
1020 1028
1275} 1283}
1276 1284
1277/* Alchemy code by Mark Wedel 1285/* Alchemy code by Mark Wedel
1278 * 1286 *
1279 * This code adds a new spell, called alchemy. Alchemy will turn 1287 * This code adds a new spell, called alchemy. Alchemy will turn
1280 * objects to gold nuggets, the value of the gold nuggets being 1288 * objects to pyrite ("false gold"), henceforth called gold nuggets.
1281 * about 90% of that of the item itself. It uses the value of the
1282 * object before charisma adjustments, because the nuggets themselves
1283 * will be will be adjusted by charisma when sold.
1284 * 1289 *
1285 * Large nuggets are worth 25 gp each (base). You will always get 1290 * The value of the gold nuggets being about 90% of that of the item
1286 * the maximum number of large nuggets you could get. 1291 * itself. It uses the value of the object before charisma adjustments,
1287 * Small nuggets are worth 1 gp each (base). You will get from 0 1292 * because the nuggets themselves will be will be adjusted by charisma
1288 * to the max amount of small nuggets as you could get. 1293 * when sold.
1289 *
1290 * For example, if an item is worth 110 gold, you will get
1291 * 4 large nuggets, and from 0-10 small nuggets.
1292 * 1294 *
1293 * There is also a chance (1:30) that you will get nothing at all 1295 * There is also a chance (1:30) that you will get nothing at all
1294 * for the object. There is also a maximum weight that will be 1296 * for the object. There is also a maximum weight that will be
1295 * alchemised. 1297 * alchemised.
1296 */ 1298 */
1319 total_weight += obj->total_weight (); 1321 total_weight += obj->total_weight ();
1320 1322
1321 obj->destroy (); 1323 obj->destroy ();
1322} 1324}
1323 1325
1324static void
1325update_map (object *op, maptile *m, int small_nuggets, object *small, int large_nuggets, object *large, int x, int y)
1326{
1327 int flag = 0;
1328
1329 /* Put any nuggets below the player, but we can only pass this
1330 * flag if we are on the same space as the player
1331 */
1332 if (x == op->x && y == op->y && op->map == m)
1333 flag = INS_BELOW_ORIGINATOR;
1334
1335 if (small_nuggets)
1336 {
1337 object *tmp = small->clone ();
1338 tmp->nrof = small_nuggets;
1339 m->insert (tmp, x, y, op, flag);
1340 }
1341
1342 if (large_nuggets)
1343 {
1344 object *tmp = large->clone ();
1345 tmp->nrof = large_nuggets;
1346 m->insert (tmp, x, y, op, flag);
1347 }
1348
1349 if (object *pl = m->at (x, y).player ())
1350 if (pl->contr->ns)
1351 pl->contr->ns->look_position = 0;
1352}
1353
1354int 1326int
1355alchemy (object *op, object *caster, object *spell_ob) 1327alchemy (object *op, object *caster, object *spell_ob)
1356{ 1328{
1357 if (op->type != PLAYER) 1329 if (op->type != PLAYER)
1358 return 0; 1330 return 0;
1359 1331
1360 object *large = get_archetype ("largenugget"); 1332 archetype *nugget[3];
1361 object *small = get_archetype ("smallnugget"); 1333
1334 nugget[0] = archetype::find ("pyrite3");
1335 nugget[1] = archetype::find ("pyrite2");
1336 nugget[2] = archetype::find ("pyrite");
1362 1337
1363 /* Put a maximum weight of items that can be alchemised. Limits the power 1338 /* Put a maximum weight of items that can be alchemised. Limits the power
1364 * some, and also prevents people from alchemising every table/chair/clock 1339 * some, and also prevents people from alchemising every table/chair/clock
1365 * in sight 1340 * in sight
1366 */ 1341 */
1418 if (weight > weight_max) 1393 if (weight > weight_max)
1419 break; 1394 break;
1420 } 1395 }
1421 } 1396 }
1422 1397
1398 value -= rndm (value >> 4);
1423 value = min (value, value_max); 1399 value = min (value, value_max);
1424 1400
1425 uint64 count = value / large->value; 1401 for (int i = 0; i < sizeof (nugget) / sizeof (nugget [0]); ++i)
1426 int large_nuggets = count; 1402 if (int nrof = value / nugget [i]->value)
1427 value -= count * large->value;
1428
1429 count = value / small->value;
1430 int small_nuggets = count;
1431
1432 /* Insert all the nuggets at one time. This probably saves time, but
1433 * it also prevents us from alcheming nuggets that were just created
1434 * with this spell.
1435 */ 1403 {
1436 update_map (op, mp, small_nuggets, small, large_nuggets, large, nx, ny); 1404 value -= nrof * nugget[i]->value;
1405
1406 object *tmp = arch_to_object (nugget[i]);
1407 tmp->nrof = nrof;
1408 tmp->flag [FLAG_IDENTIFIED] = true;
1409 op->map->insert (tmp, x, y, op, 0);
1410 }
1437 1411
1438 if (weight > weight_max) 1412 if (weight > weight_max)
1439 goto bailout; 1413 goto bailout;
1440 } 1414 }
1441 } 1415 }
1442 1416
1443bailout: 1417bailout:
1444 large->destroy ();
1445 small->destroy ();
1446 return 1; 1418 return 1;
1447} 1419}
1448 1420
1449 1421
1450/* This function removes the cursed/damned status on equipped 1422/* This function removes the cursed/damned status on equipped
1998 object *weapon, *tmp; 1970 object *weapon, *tmp;
1999 char buf[MAX_BUF]; 1971 char buf[MAX_BUF];
2000 int a, i; 1972 int a, i;
2001 sint16 x, y; 1973 sint16 x, y;
2002 maptile *m; 1974 maptile *m;
2003 materialtype_t *mt;
2004 1975
2005 if (!spell->other_arch) 1976 if (!spell->other_arch)
2006 { 1977 {
2007 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 1978 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
2008 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name); 1979 LOG (llevError, "animate_weapon failed: spell %s missing other_arch!\n", &spell->name);
2120 2091
2121 /* attacktype */ 2092 /* attacktype */
2122 if (!tmp->attacktype) 2093 if (!tmp->attacktype)
2123 tmp->attacktype = AT_PHYSICAL; 2094 tmp->attacktype = AT_PHYSICAL;
2124 2095
2125 mt = NULL;
2126 if (op->materialname != NULL)
2127 mt = name_to_material (op->materialname); 2096 if (materialtype_t *mt = name_to_material (op->materialname))
2128 if (mt != NULL)
2129 { 2097 {
2130 for (i = 0; i < NROFATTACKS; i++) 2098 for (i = 0; i < NROFATTACKS; i++)
2131 tmp->resist[i] = 50 - (mt->save[i] * 5); 2099 tmp->resist[i] = 50 - (mt->save[i] * 5);
2132 a = mt->save[0]; 2100 a = mt->save[0];
2133 } 2101 }
2135 { 2103 {
2136 for (i = 0; i < NROFATTACKS; i++) 2104 for (i = 0; i < NROFATTACKS; i++)
2137 tmp->resist[i] = 5; 2105 tmp->resist[i] = 5;
2138 a = 10; 2106 a = 10;
2139 } 2107 }
2108
2140 /* Set weapon's immunity */ 2109 /* Set weapon's immunity */
2141 tmp->resist[ATNR_CONFUSION] = 100; 2110 tmp->resist[ATNR_CONFUSION] = 100;
2142 tmp->resist[ATNR_POISON] = 100; 2111 tmp->resist[ATNR_POISON] = 100;
2143 tmp->resist[ATNR_SLOW] = 100; 2112 tmp->resist[ATNR_SLOW] = 100;
2144 tmp->resist[ATNR_PARALYZE] = 100; 2113 tmp->resist[ATNR_PARALYZE] = 100;
2150 2119
2151 /* Improve weapon's armour value according to best save vs. physical of its material */ 2120 /* Improve weapon's armour value according to best save vs. physical of its material */
2152 2121
2153 if (a > 14) 2122 if (a > 14)
2154 a = 14; 2123 a = 14;
2124
2155 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a)); 2125 tmp->resist[ATNR_PHYSICAL] = 100 - (int) ((100.0 - (float) tmp->resist[ATNR_PHYSICAL]) / (30.0 - 2.0 * a));
2156 2126
2157 /* Determine golem's speed */ 2127 /* Determine golem's speed */
2158 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell))); 2128 tmp->set_speed (min (3.33, 0.4 + 0.1 * SP_level_range_adjust (caster, spell)));
2159 2129
2204 new_draw_info (NDI_UNIQUE, 0, op, "It can be no darker here."); 2174 new_draw_info (NDI_UNIQUE, 0, op, "It can be no darker here.");
2205 } 2175 }
2206 return success; 2176 return success;
2207} 2177}
2208 2178
2209
2210
2211
2212
2213/* create an aura spell object and put it in the player's inventory. 2179/* create an aura spell object and put it in the player's inventory.
2214 * as usual, op is player, caster is the object casting the spell, 2180 * as usual, op is player, caster is the object casting the spell,
2215 * spell is the spell object itself. 2181 * spell is the spell object itself.
2216 */ 2182 */
2217int 2183int
2228 2194
2229 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell); 2195 new_aura->duration = spell->duration + 10 * SP_level_duration_adjust (caster, spell);
2230 2196
2231 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell); 2197 new_aura->stats.dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
2232 2198
2233 new_aura->set_owner (op);
2234 set_spell_skill (op, caster, spell, new_aura); 2199 set_spell_skill (op, caster, spell, new_aura);
2235 new_aura->attacktype = spell->attacktype; 2200 new_aura->attacktype = spell->attacktype;
2236 2201
2237 new_aura->level = caster_level (caster, spell); 2202 new_aura->level = caster_level (caster, spell);
2203
2238 if (refresh) 2204 if (refresh)
2239 new_draw_info (NDI_UNIQUE, 0, op, "You recast the spell while in effect."); 2205 new_draw_info (NDI_UNIQUE, 0, op, "You recast the spell while in effect.");
2240 else 2206 else
2241 new_draw_info (NDI_UNIQUE, 0, op, "You create an aura of magical force."); 2207 new_draw_info (NDI_UNIQUE, 0, op, "You create an aura of magical force.");
2208
2242 insert_ob_in_ob (new_aura, op); 2209 insert_ob_in_ob (new_aura, op);
2210 new_aura->set_owner (op);
2211
2243 return 1; 2212 return 1;
2244} 2213}
2245 2214
2246 2215
2247/* move aura function. An aura is a part of someone's inventory, 2216/* move aura function. An aura is a part of someone's inventory,
2314} 2283}
2315 2284
2316/* moves the peacemaker spell. 2285/* moves the peacemaker spell.
2317 * op is the piece object. 2286 * op is the piece object.
2318 */ 2287 */
2319
2320void 2288void
2321move_peacemaker (object *op) 2289move_peacemaker (object *op)
2322{ 2290{
2323 object *tmp; 2291 object *tmp;
2324 2292

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines