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.54 by root, Wed Apr 30 10:31:04 2008 UTC vs.
Revision 1.55 by root, Sat May 17 00:17:02 2008 UTC

620 int mflags; 620 int mflags;
621 621
622 if (!spob->other_arch) 622 if (!spob->other_arch)
623 return 0; 623 return 0;
624 624
625 tmp = arch_to_object (spob->other_arch); 625 tmp = spob->other_arch->instance ();
626 if (tmp == NULL) 626 if (!tmp)
627 return 0; 627 return 0;
628 628
629 /* peterm: level dependency for bolts */ 629 /* peterm: level dependency for bolts */
630 tmp->stats.dam = spob->stats.dam + SP_level_dam_adjust (caster, spob); 630 tmp->stats.dam = spob->stats.dam + SP_level_dam_adjust (caster, spob);
631 tmp->attacktype = spob->attacktype; 631 tmp->attacktype = spob->attacktype;
632 if (spob->slaying) 632 if (spob->slaying)
633 tmp->slaying = spob->slaying; 633 tmp->slaying = spob->slaying;
634 634
644 SET_ANIMATION (tmp, dir); 644 SET_ANIMATION (tmp, dir);
645 645
646 tmp->set_owner (op); 646 tmp->set_owner (op);
647 set_spell_skill (op, caster, spob, tmp); 647 set_spell_skill (op, caster, spob, tmp);
648 648
649 tmp->x = op->x + freearr_x[dir]; 649 tmp->x = op->x + freearr_x[dir];
650 tmp->y = op->y + freearr_y[dir]; 650 tmp->y = op->y + freearr_y[dir];
651 tmp->map = op->map; 651 tmp->map = op->map;
652 652
653 maptile *newmap; 653 maptile *newmap;
654 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y); 654 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
655 if (mflags & P_OUT_OF_MAP) 655 if (mflags & P_OUT_OF_MAP)
1729 1729
1730 op->direction = i; 1730 op->direction = i;
1731 } 1731 }
1732} 1732}
1733 1733
1734
1735/* move_swarm_spell: peterm 1734/* move_swarm_spell: peterm
1736 * This is an implementation of the swarm spell. It was written for 1735 * This is an implementation of the swarm spell. It was written for
1737 * meteor swarm, but it could be used for any swarm. A swarm spell 1736 * meteor swarm, but it could be used for any swarm. A swarm spell
1738 * is a special type of object that casts swarms of other types 1737 * is a special type of object that casts swarms of other types
1739 * of spells. Which spell it casts is flexible. It fires the spells 1738 * of spells. Which spell it casts is flexible. It fires the spells
1740 * from a set of squares surrounding the caster, in a given direction. 1739 * from a set of squares surrounding the caster, in a given direction.
1741 */ 1740 */
1742
1743void 1741void
1744move_swarm_spell (object *op) 1742move_swarm_spell (object *op)
1745{ 1743{
1746#if 0 1744#if 0
1747 static int cardinal_adjust[9] = { -3, -2, -1, 0, 0, 0, 1, 2, 3 }; 1745 static int cardinal_adjust[9] = { -3, -2, -1, 0, 0, 0, 1, 2, 3 };
1748 static int diagonal_adjust[10] = { -3, -2, -2, -1, 0, 0, 1, 2, 2, 3 }; 1746 static int diagonal_adjust[10] = { -3, -2, -2, -1, 0, 0, 1, 2, 2, 3 };
1749 sint16 target_x, target_y, origin_x, origin_y; 1747 sint16 target_x, target_y, origin_x, origin_y;
1750 int adjustdir; 1748 int adjustdir;
1751 maptile *m; 1749 maptile *m;
1752#endif 1750#endif
1753 int basedir;
1754 object *owner; 1751 object *owner = op->env;
1755 1752
1756 owner = op->owner; 1753 if (!op->duration || !owner->is_on_map ())
1757 if (op->duration == 0 || owner == NULL)
1758 { 1754 {
1759 op->destroy (); 1755 op->destroy ();
1760 return; 1756 return;
1761 } 1757 }
1762 1758
1763 op->duration--; 1759 op->duration--;
1764 1760
1765 basedir = op->direction; 1761 int basedir = op->direction;
1766 if (basedir == 0) 1762 if (!basedir)
1767 {
1768 /* spray in all directions! 8) */ 1763 /* spray in all directions! 8) */
1769 basedir = rndm (1, 8); 1764 basedir = rndm (1, 8);
1770 }
1771 1765
1772#if 0 1766#if 0
1773 // this is bogus: it causes wrong places to be checked below 1767 // this is bogus: it causes wrong places to be checked below
1774 // (a wall 2 cells away will block the effect...) and 1768 // (a wall 2 cells away will block the effect...) and
1775 // doesn't work for SP_BULLET anyhow, so again tests the wrong 1769 // doesn't work for SP_BULLET anyhow, so again tests the wrong
1838 fire_bullet (owner, op, basedir, op->spell); 1832 fire_bullet (owner, op, basedir, op->spell);
1839 else if (op->spell->subtype == SP_MAGIC_MISSILE) 1833 else if (op->spell->subtype == SP_MAGIC_MISSILE)
1840 fire_arch_from_position (owner, op, op->x, op->y, basedir, op->spell); 1834 fire_arch_from_position (owner, op, op->x, op->y, basedir, op->spell);
1841 } 1835 }
1842} 1836}
1843
1844
1845
1846 1837
1847/* fire_swarm: 1838/* fire_swarm:
1848 * The following routine creates a swarm of objects. It actually 1839 * The following routine creates a swarm of objects. It actually
1849 * sets up a specific swarm object, which then fires off all 1840 * sets up a specific swarm object, which then fires off all
1850 * the parts of the swarm. 1841 * the parts of the swarm.
1853 * caster: the caster (owner, wand, rod, scroll) 1844 * caster: the caster (owner, wand, rod, scroll)
1854 * dir: the direction everything will be fired in 1845 * dir: the direction everything will be fired in
1855 * spell - the spell that is this spell. 1846 * spell - the spell that is this spell.
1856 * n: the number to be fired. 1847 * n: the number to be fired.
1857 */ 1848 */
1858
1859int 1849int
1860fire_swarm (object *op, object *caster, object *spell, int dir) 1850fire_swarm (object *op, object *caster, object *spell, int dir)
1861{ 1851{
1862 object *tmp;
1863 int i;
1864
1865 if (!spell->other_arch) 1852 if (!spell->other_arch)
1866 return 0; 1853 return 0;
1867 1854
1868 tmp = get_archetype (SWARM_SPELL); 1855 object *tmp = archetype::get (SWARM_SPELL);
1869 tmp->set_owner (op); /* needed so that if swarm elements kill, caster gets xp. */
1870 set_spell_skill (op, caster, spell, tmp); 1856 set_spell_skill (op, caster, spell, tmp);
1871
1872 tmp->level = caster_level (caster, spell); /*needed later, to get level dep. right. */ 1857 tmp->level = caster_level (caster, spell); /* needed later, to get level dep. right. */
1873 tmp->spell = arch_to_object (spell->other_arch); 1858 tmp->spell = spell->other_arch->instance ();
1874
1875 tmp->attacktype = tmp->spell->attacktype; 1859 tmp->attacktype = tmp->spell->attacktype;
1876 1860
1877 if (tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER) 1861 if (tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER)
1878 if (!tailor_god_spell (tmp, op)) 1862 if (!tailor_god_spell (tmp, op))
1879 return 1; 1863 return 1;
1880 1864
1881 tmp->duration = SP_level_duration_adjust (caster, spell); 1865 tmp->duration = SP_level_duration_adjust (caster, spell);
1882 for (i = 0; i < spell->duration; i++) 1866 for (int i = 0; i < spell->duration; i++)
1883 tmp->duration += die_roll (1, 3, op, PREFER_HIGH); 1867 tmp->duration += die_roll (1, 3, op, PREFER_HIGH);
1884 1868
1885 tmp->direction = dir; 1869 tmp->direction = dir;
1886 tmp->invisible = 1; 1870 tmp->invisible = 1;
1887 1871
1888 tmp->insert_at (op, op); 1872 op->insert (tmp);
1873
1889 return 1; 1874 return 1;
1890} 1875}
1891
1892 1876
1893/* See the spells documentation file for why this is its own 1877/* See the spells documentation file for why this is its own
1894 * function. 1878 * function.
1895 */ 1879 */
1896int 1880int

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines