ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_attack.C
(Generate patch)

Comparing deliantra/server/server/spell_attack.C (file contents):
Revision 1.11 by root, Mon Sep 11 20:26:41 2006 UTC vs.
Revision 1.15 by root, Sat Sep 16 22:24:13 2006 UTC

1
2/*
3 * static char *rcsid_spell_attack_c =
4 * "$Id: spell_attack.C,v 1.11 2006/09/11 20:26:41 root Exp $";
5 */
6
7
8/* 1/*
9 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
10 3
11 Copyright (C) 2002-2003 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002-2003 Mark Wedel & Crossfire Development Team
12 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
23 16
24 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
26 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 20
28 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
29*/ 22*/
30 23
31/* This file contains all the spell attack code. Grouping this code 24/* This file contains all the spell attack code. Grouping this code
32 * together should hopefully make it easier to find the relevent bits 25 * together should hopefully make it easier to find the relevent bits
33 * of code 26 * of code
124void 117void
125forklightning (object *op, object *tmp) 118forklightning (object *op, object *tmp)
126{ 119{
127 int new_dir = 1; /* direction or -1 for left, +1 for right 0 if no new bolt */ 120 int new_dir = 1; /* direction or -1 for left, +1 for right 0 if no new bolt */
128 int t_dir; /* stores temporary dir calculation */ 121 int t_dir; /* stores temporary dir calculation */
129 mapstruct *m; 122 maptile *m;
130 sint16 sx, sy; 123 sint16 sx, sy;
131 object *new_bolt; 124 object *new_bolt;
132 125
133 /* pick a fork direction. tmp->stats.Con is the left bias 126 /* pick a fork direction. tmp->stats.Con is the left bias
134 * i.e., the chance in 100 of forking LEFT 127 * i.e., the chance in 100 of forking LEFT
177move_bolt (object *op) 170move_bolt (object *op)
178{ 171{
179 object *tmp; 172 object *tmp;
180 int mflags; 173 int mflags;
181 sint16 x, y; 174 sint16 x, y;
182 mapstruct *m; 175 maptile *m;
183 176
184 if (--(op->duration) < 0) 177 if (--(op->duration) < 0)
185 { 178 {
186 remove_ob (op); 179 remove_ob (op);
187 free_object (op); 180 free_object (op);
363 */ 356 */
364void 357void
365explosion (object *op) 358explosion (object *op)
366{ 359{
367 object *tmp; 360 object *tmp;
368 mapstruct *m = op->map; 361 maptile *m = op->map;
369 int i; 362 int i;
370 363
371 if (--(op->duration) < 0) 364 if (--(op->duration) < 0)
372 { 365 {
373 remove_ob (op); 366 remove_ob (op);
409 * explode. 402 * explode.
410 */ 403 */
411void 404void
412explode_bullet (object *op) 405explode_bullet (object *op)
413{ 406{
414 tag_t op_tag = op->count;
415 object *tmp, *owner; 407 object *tmp, *owner;
416 408
417 if (op->other_arch == NULL) 409 if (op->other_arch == NULL)
418 { 410 {
419 LOG (llevError, "BUG: explode_bullet(): op without other_arch\n"); 411 LOG (llevError, "BUG: explode_bullet(): op without other_arch\n");
458 } 450 }
459 451
460 if (op->attacktype) 452 if (op->attacktype)
461 { 453 {
462 hit_map (op, 0, op->attacktype, 1); 454 hit_map (op, 0, op->attacktype, 1);
463 if (was_destroyed (op, op_tag)) 455 if (op->destroyed ())
464 return; 456 return;
465 } 457 }
466 458
467 /* other_arch contains what this explodes into */ 459 /* other_arch contains what this explodes into */
468 tmp = arch_to_object (op->other_arch); 460 tmp = arch_to_object (op->other_arch);
511 /* Prevent recursion */ 503 /* Prevent recursion */
512 op->move_on = 0; 504 op->move_on = 0;
513 505
514 insert_ob_in_map (tmp, op->map, op, 0); 506 insert_ob_in_map (tmp, op->map, op, 0);
515 /* remove the firebullet */ 507 /* remove the firebullet */
516 if (!was_destroyed (op, op_tag)) 508 if (!op->destroyed ())
517 { 509 {
518 remove_ob (op); 510 remove_ob (op);
519 free_object (op); 511 free_object (op);
520 } 512 }
521} 513}
527 */ 519 */
528 520
529void 521void
530check_bullet (object *op) 522check_bullet (object *op)
531{ 523{
532 tag_t op_tag = op->count, tmp_tag;
533 object *tmp; 524 object *tmp;
534 int dam, mflags; 525 int dam, mflags;
535 mapstruct *m; 526 maptile *m;
536 sint16 sx, sy; 527 sint16 sx, sy;
537 528
538 mflags = get_map_flags (op->map, &m, op->x, op->y, &sx, &sy); 529 mflags = get_map_flags (op->map, &m, op->x, op->y, &sx, &sy);
539 530
540 if (!(mflags & P_IS_ALIVE) && !OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, sx, sy))) 531 if (!(mflags & P_IS_ALIVE) && !OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, sx, sy)))
553 544
554 for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 545 for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
555 { 546 {
556 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 547 if (QUERY_FLAG (tmp, FLAG_ALIVE))
557 { 548 {
558 tmp_tag = tmp->count;
559 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1); 549 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1);
560 if (was_destroyed (op, op_tag) || !was_destroyed (tmp, tmp_tag) || (op->stats.dam -= dam) < 0) 550 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0)
561 { 551 {
562 if (!QUERY_FLAG (op, FLAG_REMOVED)) 552 if (!QUERY_FLAG (op, FLAG_REMOVED))
563 { 553 {
564 remove_ob (op); 554 remove_ob (op);
565 free_object (op); 555 free_object (op);
580void 570void
581move_bullet (object *op) 571move_bullet (object *op)
582{ 572{
583 sint16 new_x, new_y; 573 sint16 new_x, new_y;
584 int mflags; 574 int mflags;
585 mapstruct *m; 575 maptile *m;
586 576
587#if 0 577#if 0
588 /* We need a better general purpose way to do this */ 578 /* We need a better general purpose way to do this */
589 579
590 /* peterm: added to make comet leave a trail of burnouts 580 /* peterm: added to make comet leave a trail of burnouts
591 it's an unadulterated hack, but the effect is cool. */ 581 it's an unadulterated hack, but the effect is cool. */
592 if (op->stats.sp == SP_METEOR) 582 if (op->stats.sp == SP_METEOR)
593 { 583 {
594 replace_insert_ob_in_map ("fire_trail", op); 584 replace_insert_ob_in_map ("fire_trail", op);
595 if (was_destroyed (op, op_tag)) 585 if (op->destroyed ())
596 return; 586 return;
597 } /* end addition. */ 587 } /* end addition. */
598#endif 588#endif
599 589
600 /* Reached the end of its life - remove it */ 590 /* Reached the end of its life - remove it */
763 753
764void 754void
765move_cone (object *op) 755move_cone (object *op)
766{ 756{
767 int i; 757 int i;
768 tag_t tag;
769 758
770 /* if no map then hit_map will crash so just ignore object */ 759 /* if no map then hit_map will crash so just ignore object */
771 if (!op->map) 760 if (!op->map)
772 { 761 {
773 LOG (llevError, "Tried to move_cone object %s without a map.\n", op->name ? &op->name : "unknown"); 762 LOG (llevError, "Tried to move_cone object %s without a map.\n", op->name ? &op->name : "unknown");
794 free_object (op); 783 free_object (op);
795 return; 784 return;
796 } 785 }
797#endif 786#endif
798 787
799 tag = op->count;
800 hit_map (op, 0, op->attacktype, 0); 788 hit_map (op, 0, op->attacktype, 0);
801 789
802 /* Check to see if we should push anything. 790 /* Check to see if we should push anything.
803 * Spell objects with weight push whatever they encounter to some 791 * Spell objects with weight push whatever they encounter to some
804 * degree. 792 * degree.
805 */ 793 */
806 if (op->weight) 794 if (op->weight)
807 check_spell_knockback (op); 795 check_spell_knockback (op);
808 796
809 if (was_destroyed (op, tag)) 797 if (op->destroyed ())
810 return; 798 return;
811 799
812 if ((op->duration--) < 0) 800 if ((op->duration--) < 0)
813 { 801 {
814 remove_ob (op); 802 remove_ob (op);
859int 847int
860cast_cone (object *op, object *caster, int dir, object *spell) 848cast_cone (object *op, object *caster, int dir, object *spell)
861{ 849{
862 object *tmp; 850 object *tmp;
863 int i, success = 0, range_min = -1, range_max = 1; 851 int i, success = 0, range_min = -1, range_max = 1;
864 mapstruct *m; 852 maptile *m;
865 sint16 sx, sy; 853 sint16 sx, sy;
866 MoveType movetype; 854 MoveType movetype;
867 855
868 if (!spell->other_arch) 856 if (!spell->other_arch)
869 return 0; 857 return 0;
1045 1033
1046 /* This copies a lot of the code from the fire bullet, 1034 /* This copies a lot of the code from the fire bullet,
1047 * but using the cast_bullet isn't really feasible, 1035 * but using the cast_bullet isn't really feasible,
1048 * so just set up the appropriate values. 1036 * so just set up the appropriate values.
1049 */ 1037 */
1050 at = find_archetype (SPLINT); 1038 at = archetype::find (SPLINT);
1051 if (at) 1039 if (at)
1052 { 1040 {
1053 for (i = 1; i < 9; i++) 1041 for (i = 1; i < 9; i++)
1054 { 1042 {
1055 if (out_of_map (op->map, op->x + freearr_x[i], op->y + freearr_x[i])) 1043 if (out_of_map (op->map, op->x + freearr_x[i], op->y + freearr_x[i]))
1082{ 1070{
1083 1071
1084 object *tmp; 1072 object *tmp;
1085 int mflags; 1073 int mflags;
1086 sint16 dx = op->x + freearr_x[dir], dy = op->y + freearr_y[dir]; 1074 sint16 dx = op->x + freearr_x[dir], dy = op->y + freearr_y[dir];
1087 mapstruct *m; 1075 maptile *m;
1088 1076
1089 mflags = get_map_flags (op->map, &m, dx, dy, &dx, &dy); 1077 mflags = get_map_flags (op->map, &m, dx, dy, &dx, &dy);
1090 if ((mflags & P_OUT_OF_MAP) || (GET_MAP_MOVE_BLOCK (m, dx, dy) & MOVE_WALK)) 1078 if ((mflags & P_OUT_OF_MAP) || (GET_MAP_MOVE_BLOCK (m, dx, dy) & MOVE_WALK))
1091 { 1079 {
1092 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way."); 1080 new_draw_info (NDI_UNIQUE, 0, op, "There is something in the way.");
1128get_pointed_target (object *op, int dir, int range, int type) 1116get_pointed_target (object *op, int dir, int range, int type)
1129{ 1117{
1130 object *target; 1118 object *target;
1131 sint16 x, y; 1119 sint16 x, y;
1132 int dist, mflags; 1120 int dist, mflags;
1133 mapstruct *mp; 1121 maptile *mp;
1134 1122
1135 if (dir == 0) 1123 if (dir == 0)
1136 return NULL; 1124 return NULL;
1137 1125
1138 for (dist = 1; dist < range; dist++) 1126 for (dist = 1; dist < range; dist++)
1278move_missile (object *op) 1266move_missile (object *op)
1279{ 1267{
1280 int i, mflags; 1268 int i, mflags;
1281 object *owner; 1269 object *owner;
1282 sint16 new_x, new_y; 1270 sint16 new_x, new_y;
1283 mapstruct *m; 1271 maptile *m;
1284 1272
1285 if (op->range-- <= 0) 1273 if (op->range-- <= 0)
1286 { 1274 {
1287 remove_ob (op); 1275 remove_ob (op);
1288 free_object (op); 1276 free_object (op);
1307 1295
1308 mflags = get_map_flags (op->map, &m, new_x, new_y, &new_x, &new_y); 1296 mflags = get_map_flags (op->map, &m, new_x, new_y, &new_x, &new_y);
1309 1297
1310 if (!(mflags & P_OUT_OF_MAP) && ((mflags & P_IS_ALIVE) || OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, new_x, new_y)))) 1298 if (!(mflags & P_OUT_OF_MAP) && ((mflags & P_IS_ALIVE) || OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, new_x, new_y))))
1311 { 1299 {
1312 tag_t tag = op->count;
1313
1314 hit_map (op, op->direction, AT_MAGIC, 1); 1300 hit_map (op, op->direction, AT_MAGIC, 1);
1315 /* Basically, missile only hits one thing then goes away. 1301 /* Basically, missile only hits one thing then goes away.
1316 * we need to remove it if someone hasn't already done so. 1302 * we need to remove it if someone hasn't already done so.
1317 */ 1303 */
1318 if (!was_destroyed (op, tag)) 1304 if (!op->destroyed ())
1319 {
1320 remove_ob (op);
1321 free_object (op); 1305 free_object (op);
1322 } 1306
1323 return; 1307 return;
1324 } 1308 }
1325 1309
1326 remove_ob (op); 1310 remove_ob (op);
1311
1327 if (!op->direction || (mflags & P_OUT_OF_MAP)) 1312 if (!op->direction || (mflags & P_OUT_OF_MAP))
1328 { 1313 {
1329 free_object (op); 1314 free_object (op);
1330 return; 1315 return;
1331 } 1316 }
1317
1332 op->x = new_x; 1318 op->x = new_x;
1333 op->y = new_y; 1319 op->y = new_y;
1334 op->map = m; 1320 op->map = m;
1335 i = spell_find_dir (op->map, op->x, op->y, get_owner (op)); 1321 i = spell_find_dir (op->map, op->x, op->y, get_owner (op));
1336 if (i > 0 && i != op->direction) 1322 if (i > 0 && i != op->direction)
1337 { 1323 {
1338 op->direction = i; 1324 op->direction = i;
1339 SET_ANIMATION (op, op->direction); 1325 SET_ANIMATION (op, op->direction);
1340 } 1326 }
1327
1341 insert_ob_in_map (op, op->map, op, 0); 1328 insert_ob_in_map (op, op->map, op, 0);
1342} 1329}
1343 1330
1344/**************************************************************************** 1331/****************************************************************************
1345 * Destruction 1332 * Destruction
1391int 1378int
1392cast_destruction (object *op, object *caster, object *spell_ob) 1379cast_destruction (object *op, object *caster, object *spell_ob)
1393{ 1380{
1394 int i, j, range, mflags, friendly = 0, dam, dur; 1381 int i, j, range, mflags, friendly = 0, dam, dur;
1395 sint16 sx, sy; 1382 sint16 sx, sy;
1396 mapstruct *m; 1383 maptile *m;
1397 object *tmp; 1384 object *tmp;
1398 const char *skill; 1385 const char *skill;
1399 1386
1400 range = spell_ob->range + SP_level_range_adjust (caster, spell_ob); 1387 range = spell_ob->range + SP_level_range_adjust (caster, spell_ob);
1401 dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob); 1388 dam = spell_ob->stats.dam + SP_level_dam_adjust (caster, spell_ob);
1583mood_change (object *op, object *caster, object *spell) 1570mood_change (object *op, object *caster, object *spell)
1584{ 1571{
1585 object *tmp, *god, *head; 1572 object *tmp, *god, *head;
1586 int done_one, range, mflags, level, at, best_at; 1573 int done_one, range, mflags, level, at, best_at;
1587 sint16 x, y, nx, ny; 1574 sint16 x, y, nx, ny;
1588 mapstruct *m; 1575 maptile *m;
1589 const char *race; 1576 const char *race;
1590 1577
1591 /* We precompute some values here so that we don't have to keep 1578 /* We precompute some values here so that we don't have to keep
1592 * doing it over and over again. 1579 * doing it over and over again.
1593 */ 1580 */
1757move_ball_spell (object *op) 1744move_ball_spell (object *op)
1758{ 1745{
1759 int i, j, dam_save, dir, mflags; 1746 int i, j, dam_save, dir, mflags;
1760 sint16 nx, ny, hx, hy; 1747 sint16 nx, ny, hx, hy;
1761 object *owner; 1748 object *owner;
1762 mapstruct *m; 1749 maptile *m;
1763 1750
1764 owner = get_owner (op); 1751 owner = get_owner (op);
1765 1752
1766 /* the following logic makes sure that the ball doesn't move into a wall, 1753 /* the following logic makes sure that the ball doesn't move into a wall,
1767 * and makes sure that it will move along a wall to try and get at it's 1754 * and makes sure that it will move along a wall to try and get at it's
1879#if 0 1866#if 0
1880 static int cardinal_adjust[9] = { -3, -2, -1, 0, 0, 0, 1, 2, 3 }; 1867 static int cardinal_adjust[9] = { -3, -2, -1, 0, 0, 0, 1, 2, 3 };
1881 static int diagonal_adjust[10] = { -3, -2, -2, -1, 0, 0, 1, 2, 2, 3 }; 1868 static int diagonal_adjust[10] = { -3, -2, -2, -1, 0, 0, 1, 2, 2, 3 };
1882 sint16 target_x, target_y, origin_x, origin_y; 1869 sint16 target_x, target_y, origin_x, origin_y;
1883 int adjustdir; 1870 int adjustdir;
1884 mapstruct *m; 1871 maptile *m;
1885#endif 1872#endif
1886 int basedir; 1873 int basedir;
1887 object *owner; 1874 object *owner;
1888 1875
1889 owner = get_owner (op); 1876 owner = get_owner (op);
2032cast_light (object *op, object *caster, object *spell, int dir) 2019cast_light (object *op, object *caster, object *spell, int dir)
2033{ 2020{
2034 object *target = NULL, *tmp = NULL; 2021 object *target = NULL, *tmp = NULL;
2035 sint16 x, y; 2022 sint16 x, y;
2036 int dam, mflags; 2023 int dam, mflags;
2037 mapstruct *m; 2024 maptile *m;
2038 2025
2039 dam = spell->stats.dam + SP_level_dam_adjust (caster, spell); 2026 dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
2040 2027
2041 if (!dir) 2028 if (!dir)
2042 { 2029 {
2110cast_cause_disease (object *op, object *caster, object *spell, int dir) 2097cast_cause_disease (object *op, object *caster, object *spell, int dir)
2111{ 2098{
2112 sint16 x, y; 2099 sint16 x, y;
2113 int i, mflags, range, dam_mod, dur_mod; 2100 int i, mflags, range, dam_mod, dur_mod;
2114 object *walk; 2101 object *walk;
2115 mapstruct *m; 2102 maptile *m;
2116 2103
2117 x = op->x; 2104 x = op->x;
2118 y = op->y; 2105 y = op->y;
2119 2106
2120 /* If casting from a scroll, no direction will be available, so refer to the 2107 /* If casting from a scroll, no direction will be available, so refer to the

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines