… | |
… | |
3 | * |
3 | * |
4 | * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
4 | * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * Copyright (©) 2002-2003,2007 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2002-2003,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Deliantra is free software: you can redistribute it and/or modify |
8 | * Deliantra is free software: you can redistribute it and/or modify it under |
9 | * it under the terms of the GNU General Public License as published by |
9 | * the terms of the Affero GNU General Public License as published by the |
10 | * the Free Software Foundation, either version 3 of the License, or |
10 | * Free Software Foundation, either version 3 of the License, or (at your |
11 | * (at your option) any later version. |
11 | * option) any later version. |
12 | * |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License 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 |
18 | * You should have received a copy of the Affero GNU General Public License |
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | * and the GNU General Public License along with this program. If not, see |
|
|
20 | * <http://www.gnu.org/licenses/>. |
20 | * |
21 | * |
21 | * The authors can be reached via e-mail to <support@deliantra.net> |
22 | * The authors can be reached via e-mail to <support@deliantra.net> |
22 | */ |
23 | */ |
23 | |
24 | |
24 | /* This file contains all the spell attack code. Grouping this code |
25 | /* This file contains all the spell attack code. Grouping this code |
… | |
… | |
36 | /* this function checks to see if a spell pushes objects as well |
37 | /* this function checks to see if a spell pushes objects as well |
37 | * as flies over and damages them (only used for cones for now) |
38 | * as flies over and damages them (only used for cones for now) |
38 | * but moved here so it could be applied to bolts too |
39 | * but moved here so it could be applied to bolts too |
39 | * op is the spell object. |
40 | * op is the spell object. |
40 | */ |
41 | */ |
41 | void |
42 | static void |
42 | check_spell_knockback (object *op) |
43 | check_spell_knockback (object *op) |
43 | { |
44 | { |
44 | int weight_move; |
45 | int weight_move; |
45 | int frictionmod = 2; /*poor man's physics - multipy targets weight by this amount */ |
46 | int frictionmod = 2; /*poor man's physics - multipy targets weight by this amount */ |
46 | |
47 | |
… | |
… | |
107 | ***************************************************************************/ |
108 | ***************************************************************************/ |
108 | |
109 | |
109 | /* Causes op to fork. op is the original bolt, tmp |
110 | /* Causes op to fork. op is the original bolt, tmp |
110 | * is the first piece of the fork. |
111 | * is the first piece of the fork. |
111 | */ |
112 | */ |
112 | void |
113 | static void |
113 | forklightning (object *op, object *tmp) |
114 | forklightning (object *op, object *tmp) |
114 | { |
115 | { |
115 | int new_dir = 1; /* direction or -1 for left, +1 for right 0 if no new bolt */ |
116 | int new_dir = 1; /* direction or -1 for left, +1 for right 0 if no new bolt */ |
116 | int t_dir; /* stores temporary dir calculation */ |
117 | int t_dir; /* stores temporary dir calculation */ |
117 | maptile *m; |
118 | maptile *m; |
… | |
… | |
388 | |
389 | |
389 | /* Causes an object to explode, eg, a firebullet, |
390 | /* Causes an object to explode, eg, a firebullet, |
390 | * poison cloud ball, etc. op is the object to |
391 | * poison cloud ball, etc. op is the object to |
391 | * explode. |
392 | * explode. |
392 | */ |
393 | */ |
393 | void |
394 | static void |
394 | explode_bullet (object *op) |
395 | explode_bullet (object *op) |
395 | { |
396 | { |
396 | object *tmp, *owner; |
397 | object *tmp, *owner; |
397 | |
398 | |
398 | if (!op->other_arch) |
399 | if (!op->other_arch) |
… | |
… | |
545 | * fired arches (eg, bolts). |
546 | * fired arches (eg, bolts). |
546 | */ |
547 | */ |
547 | void |
548 | void |
548 | move_bullet (object *op) |
549 | move_bullet (object *op) |
549 | { |
550 | { |
550 | sint16 new_x, new_y; |
|
|
551 | int mflags; |
|
|
552 | maptile *m; |
|
|
553 | |
|
|
554 | #if 0 |
551 | #if 0 |
555 | /* We need a better general purpose way to do this */ |
552 | /* We need a better general purpose way to do this */ |
556 | |
553 | |
557 | /* peterm: added to make comet leave a trail of burnouts |
554 | /* peterm: added to make comet leave a trail of burnouts |
558 | it's an unadulterated hack, but the effect is cool. */ |
555 | it's an unadulterated hack, but the effect is cool. */ |
… | |
… | |
573 | op->destroy (); |
570 | op->destroy (); |
574 | |
571 | |
575 | return; |
572 | return; |
576 | } |
573 | } |
577 | |
574 | |
578 | new_x = op->x + DIRX (op); |
575 | mapxy pos (op); |
579 | new_y = op->y + DIRY (op); |
576 | pos.move (op->direction); |
580 | m = op->map; |
|
|
581 | mflags = get_map_flags (m, &m, new_x, new_y, &new_x, &new_y); |
|
|
582 | |
577 | |
583 | if (mflags & P_OUT_OF_MAP) |
578 | if (!pos.normalise ()) |
584 | { |
579 | { |
585 | op->destroy (); |
580 | op->destroy (); |
586 | return; |
581 | return; |
587 | } |
582 | } |
588 | |
583 | |
589 | if (!op->direction || OB_TYPE_MOVE_BLOCK (op, GET_MAP_MOVE_BLOCK (m, new_x, new_y))) |
584 | mapspace &ms = pos.ms (); |
|
|
585 | |
|
|
586 | ms.update (); |
|
|
587 | |
|
|
588 | if (!op->direction || OB_TYPE_MOVE_BLOCK (op, ms.move_block)) |
590 | { |
589 | { |
591 | if (op->other_arch) |
590 | if (op->other_arch) |
592 | explode_bullet (op); |
591 | explode_bullet (op); |
593 | else |
592 | else |
594 | op->destroy (); |
593 | op->destroy (); |
595 | |
594 | |
596 | return; |
595 | return; |
597 | } |
596 | } |
598 | |
597 | |
599 | if (!(op = m->insert (op, new_x, new_y, op))) |
598 | if (!(op = pos.insert (op, op))) |
600 | return; |
599 | return; |
601 | |
600 | |
602 | if (reflwall (op->map, op->x, op->y, op)) |
601 | if (reflwall (op->map, op->x, op->y, op)) |
603 | { |
602 | { |
604 | op->direction = absdir (op->direction + 4); |
603 | op->direction = absdir (op->direction + 4); |
… | |
… | |
688 | * CONE RELATED FUNCTIONS |
687 | * CONE RELATED FUNCTIONS |
689 | * |
688 | * |
690 | *****************************************************************************/ |
689 | *****************************************************************************/ |
691 | |
690 | |
692 | /* drops an object based on what is in the cone's "other_arch" */ |
691 | /* drops an object based on what is in the cone's "other_arch" */ |
693 | void |
692 | static void |
694 | cone_drop (object *op) |
693 | cone_drop (object *op) |
695 | { |
694 | { |
696 | object *new_ob = arch_to_object (op->other_arch); |
695 | object *new_ob = arch_to_object (op->other_arch); |
697 | |
696 | |
698 | new_ob->level = op->level; |
697 | new_ob->level = op->level; |
… | |
… | |
1048 | * dir is the direction to look in. |
1047 | * dir is the direction to look in. |
1049 | * range is how far out to look. |
1048 | * range is how far out to look. |
1050 | * type is the type of spell - either SPELL_MANA or SPELL_GRACE. |
1049 | * type is the type of spell - either SPELL_MANA or SPELL_GRACE. |
1051 | * this info is used for blocked magic/unholy spaces. |
1050 | * this info is used for blocked magic/unholy spaces. |
1052 | */ |
1051 | */ |
1053 | object * |
1052 | static object * |
1054 | get_pointed_target (object *op, int dir, int range, int type) |
1053 | get_pointed_target (object *op, int dir, int range, int type) |
1055 | { |
1054 | { |
1056 | object *target; |
1055 | object *target; |
1057 | sint16 x, y; |
1056 | sint16 x, y; |
1058 | int dist, mflags; |
1057 | int dist, mflags; |
… | |
… | |
1245 | * we do this by creating a force and inserting it in the |
1244 | * we do this by creating a force and inserting it in the |
1246 | * object. if time is 0, the object glows permanently. To truely |
1245 | * object. if time is 0, the object glows permanently. To truely |
1247 | * make this work for non-living objects, we would have to |
1246 | * make this work for non-living objects, we would have to |
1248 | * give them the capability to have an inventory. b.t. |
1247 | * give them the capability to have an inventory. b.t. |
1249 | */ |
1248 | */ |
1250 | int |
1249 | static int |
1251 | make_object_glow (object *op, int radius, int time) |
1250 | make_object_glow (object *op, int radius, int time) |
1252 | { |
1251 | { |
1253 | /* some things are unaffected... */ |
1252 | /* some things are unaffected... */ |
1254 | if (op->path_denied & PATH_LIGHT) |
1253 | if (op->path_denied & PATH_LIGHT) |
1255 | return 0; |
1254 | return 0; |
… | |
… | |
1914 | ); |
1913 | ); |
1915 | |
1914 | |
1916 | if (dir) |
1915 | if (dir) |
1917 | m->insert (tmp, x, y, op); |
1916 | m->insert (tmp, x, y, op); |
1918 | else |
1917 | else |
1919 | caster->outer_env ()->insert (tmp); |
1918 | caster->outer_env_or_self ()->insert (tmp); |
1920 | |
1919 | |
1921 | return 1; |
1920 | return 1; |
1922 | } |
1921 | } |
1923 | |
1922 | |
1924 | /* cast_cause_disease: this spell looks along <dir> from the |
1923 | /* cast_cause_disease: this spell looks along <dir> from the |