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.115 by root, Sun Jan 29 02:47:06 2017 UTC vs.
Revision 1.117 by root, Sat Nov 17 23:40:04 2018 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 (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 5 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002-2003 Mark Wedel & Crossfire Development Team 6 * Copyright (©) 2002-2003 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 7 * Copyright (©) 1992 Frank Tore Johansen
7 * 8 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 9 * Deliantra is free software: you can redistribute it and/or modify it under
129 new_dir = -1; 130 new_dir = -1;
130 131
131 /* check the new dir for a wall and in the map */ 132 /* check the new dir for a wall and in the map */
132 t_dir = absdir (tmp->direction + new_dir); 133 t_dir = absdir (tmp->direction + new_dir);
133 134
134 if (get_map_flags (tmp->map, &m, tmp->x + freearr_x[t_dir], tmp->y + freearr_y[t_dir], &sx, &sy) & P_OUT_OF_MAP) 135 if (get_map_flags (tmp->map, &m, tmp->x + DIRX (t_dir), tmp->y + DIRY (t_dir), &sx, &sy) & P_OUT_OF_MAP)
135 return; 136 return;
136 137
137 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (m, sx, sy))) 138 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (m, sx, sy)))
138 return; 139 return;
139 140
179 180
180 if (--op->range < 0) 181 if (--op->range < 0)
181 op->range = 0; 182 op->range = 0;
182 else 183 else
183 { 184 {
184 x = op->x + DIRX (op); 185 x = op->x + DIRX (op->direction);
185 y = op->y + DIRY (op); 186 y = op->y + DIRY (op->direction);
186 m = op->map; 187 m = op->map;
187 mflags = get_map_flags (m, &m, x, y, &x, &y); 188 mflags = get_map_flags (m, &m, x, y, &x, &y);
188 189
189 if (mflags & P_OUT_OF_MAP) 190 if (mflags & P_OUT_OF_MAP)
190 return; 191 return;
217 /* Need to check for P_OUT_OF_MAP: if the bolt is tavelling 218 /* Need to check for P_OUT_OF_MAP: if the bolt is tavelling
218 * over a corner in a tiled map, it is possible that 219 * over a corner in a tiled map, it is possible that
219 * op->direction is within an adjacent map but either 220 * op->direction is within an adjacent map but either
220 * op->direction-1 or op->direction+1 does not exist. 221 * op->direction-1 or op->direction+1 does not exist.
221 */ 222 */
222 mflags = get_map_flags (op->map, &m, op->x + freearr_x[absdir (op->direction - 1)], 223 mflags = get_map_flags (op->map, &m, op->x + DIRX (absdir (op->direction - 1)),
223 op->y + freearr_y[absdir (op->direction - 1)], &x, &y); 224 op->y + DIRY (absdir (op->direction - 1)), &x, &y);
224 225
225 left = (mflags & P_OUT_OF_MAP) ? 0 : OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, x, y)); 226 left = (mflags & P_OUT_OF_MAP) ? 0 : OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, x, y));
226 227
227 mflags = get_map_flags (op->map, &m, op->x + freearr_x[absdir (op->direction + 1)], 228 mflags = get_map_flags (op->map, &m, op->x + DIRX (absdir (op->direction + 1)),
228 op->y + freearr_y[absdir (op->direction + 1)], &x, &y); 229 op->y + DIRY (absdir (op->direction + 1)), &x, &y);
229 right = (mflags & P_OUT_OF_MAP) ? 0 : OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, x, y)); 230 right = (mflags & P_OUT_OF_MAP) ? 0 : OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, x, y));
230 231
231 if (left == right) 232 if (left == right)
232 op->direction = absdir (op->direction + 4); 233 op->direction = absdir (op->direction + 4);
233 else if (left) 234 else if (left)
300 SET_ANIMATION (tmp, dir); 301 SET_ANIMATION (tmp, dir);
301 302
302 tmp->set_owner (op); 303 tmp->set_owner (op);
303 set_spell_skill (op, caster, spob, tmp); 304 set_spell_skill (op, caster, spob, tmp);
304 305
305 tmp->x = op->x + DIRX (tmp); 306 tmp->x = op->x + DIRX (tmp->direction);
306 tmp->y = op->y + DIRY (tmp); 307 tmp->y = op->y + DIRY (tmp->direction);
307 tmp->map = op->map; 308 tmp->map = op->map;
308 309
309 maptile *newmap; 310 maptile *newmap;
310 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y); 311 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
311 if (mflags & P_OUT_OF_MAP) 312 if (mflags & P_OUT_OF_MAP)
364 { 365 {
365 for (i = 1; i < 9; i++) 366 for (i = 1; i < 9; i++)
366 { 367 {
367 sint16 dx, dy; 368 sint16 dx, dy;
368 369
369 dx = op->x + freearr_x[i]; 370 dx = op->x + DIRX (i);
370 dy = op->y + freearr_y[i]; 371 dy = op->y + DIRY (i);
371 372
372 /* ok_to_put_more already does things like checks for walls, 373 /* ok_to_put_more already does things like checks for walls,
373 * out of map, etc. 374 * out of map, etc.
374 */ 375 */
375 if (ok_to_put_more (op->map, dx, dy, op, op->attacktype)) 376 if (ok_to_put_more (op->map, dx, dy, op, op->attacktype))
646 SET_ANIMATION (tmp, dir); 647 SET_ANIMATION (tmp, dir);
647 648
648 tmp->set_owner (op); 649 tmp->set_owner (op);
649 set_spell_skill (op, caster, spob, tmp); 650 set_spell_skill (op, caster, spob, tmp);
650 651
651 tmp->x = op->x + freearr_x[dir]; 652 tmp->x = op->x + DIRX (dir);
652 tmp->y = op->y + freearr_y[dir]; 653 tmp->y = op->y + DIRY (dir);
653 tmp->map = op->map; 654 tmp->map = op->map;
654 655
655 maptile *newmap; 656 maptile *newmap;
656 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y); 657 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
657 if (mflags & P_OUT_OF_MAP) 658 if (mflags & P_OUT_OF_MAP)
781 return; 782 return;
782 } 783 }
783 784
784 for (int i = -1; i <= 1; i++) 785 for (int i = -1; i <= 1; i++)
785 { 786 {
786 sint16 x = op->x + freearr_x[absdir (op->stats.sp + i)], y = op->y + freearr_y[absdir (op->stats.sp + i)]; 787 sint16 x = op->x + DIRX (absdir (op->stats.sp + i)), y = op->y + DIRY (absdir (op->stats.sp + i));
787 788
788 if (ok_to_put_more (op->map, x, y, op, op->attacktype)) 789 if (ok_to_put_more (op->map, x, y, op, op->attacktype))
789 { 790 {
790 object *tmp = op->clone (); 791 object *tmp = op->clone ();
791 792
864 d = 8; 865 d = 8;
865 else 866 else
866 continue; 867 continue;
867 } 868 }
868 869
869 x = op->x + freearr_x[d]; 870 x = op->x + DIRX (d);
870 y = op->y + freearr_y[d]; 871 y = op->y + DIRY (d);
871 872
872 if (get_map_flags (op->map, &m, x, y, &sx, &sy) & P_OUT_OF_MAP) 873 if (get_map_flags (op->map, &m, x, y, &sx, &sy) & P_OUT_OF_MAP)
873 continue; 874 continue;
874 875
875 if ((movetype & GET_MAP_MOVE_BLOCK (m, sx, sy)) == movetype) 876 if ((movetype & GET_MAP_MOVE_BLOCK (m, sx, sy)) == movetype)
983 */ 984 */
984 if (archetype *at = archetype::find (SPLINT)) 985 if (archetype *at = archetype::find (SPLINT))
985 { 986 {
986 for (int i = 1; i < 9; i++) 987 for (int i = 1; i < 9; i++)
987 { 988 {
988 if (out_of_map (op->map, op->x + freearr_x[i], op->y + freearr_x[i])) 989 if (out_of_map (op->map, op->x + DIRX (i), op->y + DIRX (i)))
989 continue; 990 continue;
990 991
991 object *tmp = at->instance (); 992 object *tmp = at->instance ();
992 tmp->direction = i; 993 tmp->direction = i;
993 tmp->range = op->range; 994 tmp->range = op->range;
999 tmp->skill = op->skill; 1000 tmp->skill = op->skill;
1000 1001
1001 if (tmp->flag [FLAG_IS_TURNABLE]) 1002 if (tmp->flag [FLAG_IS_TURNABLE])
1002 SET_ANIMATION (tmp, i); 1003 SET_ANIMATION (tmp, i);
1003 1004
1004 op->map->insert (tmp, op->x + freearr_x[i], op->y + freearr_x[i], op); 1005 op->map->insert (tmp, op->x + DIRX (i), op->y + DIRX (i), op);
1005 move_bullet (tmp); 1006 move_bullet (tmp);
1006 } 1007 }
1007 } 1008 }
1008 1009
1009 explode_bullet (op); 1010 explode_bullet (op);
1012int 1013int
1013create_bomb (object *op, object *caster, int dir, object *spell) 1014create_bomb (object *op, object *caster, int dir, object *spell)
1014{ 1015{
1015 object *tmp; 1016 object *tmp;
1016 int mflags; 1017 int mflags;
1017 sint16 dx = op->x + freearr_x[dir], dy = op->y + freearr_y[dir]; 1018 sint16 dx = op->x + DIRX (dir), dy = op->y + DIRY (dir);
1018 maptile *m; 1019 maptile *m;
1019 1020
1020 mflags = get_map_flags (op->map, &m, dx, dy, &dx, &dy); 1021 mflags = get_map_flags (op->map, &m, dx, dy, &dx, &dy);
1021 1022
1022 // when creating a bomb below ourself it should always work, even 1023 // when creating a bomb below ourself it should always work, even
1073 if (dir == 0) 1074 if (dir == 0)
1074 return NULL; 1075 return NULL;
1075 1076
1076 for (dist = 1; dist < range; dist++) 1077 for (dist = 1; dist < range; dist++)
1077 { 1078 {
1078 x = op->x + freearr_x[dir] * dist; 1079 x = op->x + DIRX (dir) * dist;
1079 y = op->y + freearr_y[dir] * dist; 1080 y = op->y + DIRY (dir) * dist;
1080 mp = op->map; 1081 mp = op->map;
1081 mflags = get_map_flags (op->map, &mp, x, y, &x, &y); 1082 mflags = get_map_flags (op->map, &mp, x, y, &x, &y);
1082 1083
1083 if (mflags & P_OUT_OF_MAP) 1084 if (mflags & P_OUT_OF_MAP)
1084 return NULL; 1085 return NULL;
1621 * other bits (i / 2): absolute value of offset 1622 * other bits (i / 2): absolute value of offset
1622 */ 1623 */
1623 int offset = ((i ^ j) & 1) ? (i / 2) : -(i / 2); 1624 int offset = ((i ^ j) & 1) ? (i / 2) : -(i / 2);
1624 int tmpdir = absdir (op->direction + offset); 1625 int tmpdir = absdir (op->direction + offset);
1625 1626
1626 nx = op->x + freearr_x[tmpdir]; 1627 nx = op->x + DIRX (tmpdir);
1627 ny = op->y + freearr_y[tmpdir]; 1628 ny = op->y + DIRY (tmpdir);
1628 if (!(get_map_flags (op->map, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP) && !(OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, nx, ny)))) 1629 if (!(get_map_flags (op->map, &m, nx, ny, &nx, &ny) & P_OUT_OF_MAP) && !(OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, nx, ny))))
1629 { 1630 {
1630 dir = tmpdir; 1631 dir = tmpdir;
1631 break; 1632 break;
1632 } 1633 }
1648 * if this has an other_arch field, we insert that in 1649 * if this has an other_arch field, we insert that in
1649 * the surround spaces. 1650 * the surround spaces.
1650 */ 1651 */
1651 for (j = 0; j < 9; j++) 1652 for (j = 0; j < 9; j++)
1652 { 1653 {
1653 hx = nx + freearr_x[j]; 1654 hx = nx + DIRX (j);
1654 hy = ny + freearr_y[j]; 1655 hy = ny + DIRY (j);
1655 1656
1656 m = op->map; 1657 m = op->map;
1657 mflags = get_map_flags (m, &m, hx, hy, &hx, &hy); 1658 mflags = get_map_flags (m, &m, hx, hy, &hx, &hy);
1658 1659
1659 if (mflags & P_OUT_OF_MAP) 1660 if (mflags & P_OUT_OF_MAP)
1682 i = spell_find_dir (op->map, op->x, op->y, op->owner); 1683 i = spell_find_dir (op->map, op->x, op->y, op->owner);
1683 1684
1684 if (i >= 0) 1685 if (i >= 0)
1685 { /* we have a preferred direction! */ 1686 { /* we have a preferred direction! */
1686 /* pick another direction if the preferred dir is blocked. */ 1687 /* pick another direction if the preferred dir is blocked. */
1687 if (get_map_flags (op->map, &m, nx + freearr_x[i], ny + freearr_y[i], &hx, &hy) & P_OUT_OF_MAP || 1688 if (get_map_flags (op->map, &m, nx + DIRX (i), ny + DIRY (i), &hx, &hy) & P_OUT_OF_MAP ||
1688 OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, hx, hy))) 1689 OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, hx, hy)))
1689 i = absdir (i + rndm (0, 2) - 1); /* -1, 0, +1 */ 1690 i = absdir (i + rndm (0, 2) - 1); /* -1, 0, +1 */
1690 1691
1691 op->direction = i; 1692 op->direction = i;
1692 } 1693 }
1759 else 1760 else
1760 { 1761 {
1761 adjustdir = 0; /* fire the last one from forward. */ 1762 adjustdir = 0; /* fire the last one from forward. */
1762 } 1763 }
1763 1764
1764 target_x = op->x + freearr_x[absdir (basedir + adjustdir)]; 1765 target_x = op->x + DIRX (absdir (basedir + adjustdir));
1765 target_y = op->y + freearr_y[absdir (basedir + adjustdir)]; 1766 target_y = op->y + DIRY (absdir (basedir + adjustdir));
1766 1767
1767 /* back up one space so we can hit point-blank targets, but this 1768 /* back up one space so we can hit point-blank targets, but this
1768 * necessitates extra out_of_map check below 1769 * necessitates extra out_of_map check below
1769 */ 1770 */
1770 origin_x = target_x - freearr_x[basedir]; 1771 origin_x = target_x - DIRX (basedir);
1771 origin_y = target_y - freearr_y[basedir]; 1772 origin_y = target_y - DIRY (basedir);
1772 1773
1773 1774
1774 /* spell pointer is set up for the spell this casts. Since this 1775 /* spell pointer is set up for the spell this casts. Since this
1775 * should just be a pointer to the spell in some inventory, 1776 * should just be a pointer to the spell in some inventory,
1776 * it is unlikely to disappear by the time we need it. However, 1777 * it is unlikely to disappear by the time we need it. However,
1862 1863
1863 dam = spell->stats.dam + SP_level_dam_adjust (caster, spell); 1864 dam = spell->stats.dam + SP_level_dam_adjust (caster, spell);
1864 1865
1865 if (dir) 1866 if (dir)
1866 { 1867 {
1867 x = op->x + freearr_x[dir]; 1868 x = op->x + DIRX (dir);
1868 y = op->y + freearr_y[dir]; 1869 y = op->y + DIRY (dir);
1869 m = op->map; 1870 m = op->map;
1870 1871
1871 mflags = get_map_flags (m, &m, x, y, &x, &y); 1872 mflags = get_map_flags (m, &m, x, y, &x, &y);
1872 1873
1873 if (mflags & P_OUT_OF_MAP) 1874 if (mflags & P_OUT_OF_MAP)
1953 dur_mod = SP_level_duration_adjust (caster, spell); 1954 dur_mod = SP_level_duration_adjust (caster, spell);
1954 1955
1955 /* search in a line for a victim */ 1956 /* search in a line for a victim */
1956 for (i = 1; i < range; i++) 1957 for (i = 1; i < range; i++)
1957 { 1958 {
1958 x = op->x + i * freearr_x[dir]; 1959 x = op->x + i * DIRX (dir);
1959 y = op->y + i * freearr_y[dir]; 1960 y = op->y + i * DIRY (dir);
1960 m = op->map; 1961 m = op->map;
1961 1962
1962 mflags = get_map_flags (m, &m, x, y, &x, &y); 1963 mflags = get_map_flags (m, &m, x, y, &x, &y);
1963 1964
1964 if (mflags & P_OUT_OF_MAP) 1965 if (mflags & P_OUT_OF_MAP)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines