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.116 by root, Sat Sep 16 22:17:42 2017 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines