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.59 by root, Sat May 17 15:25:19 2008 UTC vs.
Revision 1.68 by elmex, Mon Oct 6 08:46:33 2008 UTC

148 new_bolt->duration++; 148 new_bolt->duration++;
149 new_bolt->stats.dam /= 2; /* reduce daughter bolt damage */ 149 new_bolt->stats.dam /= 2; /* reduce daughter bolt damage */
150 new_bolt->stats.dam++; 150 new_bolt->stats.dam++;
151 tmp->stats.dam /= 2; /* reduce father bolt damage */ 151 tmp->stats.dam /= 2; /* reduce father bolt damage */
152 tmp->stats.dam++; 152 tmp->stats.dam++;
153
153 if ((new_bolt = m->insert (new_bolt, sx, sy, op))) 154 if ((new_bolt = m->insert (new_bolt, sx, sy, op)))
154 update_turn_face (new_bolt); 155 update_turn_face (new_bolt);
155} 156}
156 157
157/* move_bolt: moves bolt 'op'. Basically, it just advances a space, 158/* move_bolt: moves bolt 'op'. Basically, it just advances a space,
164 sint16 x, y; 165 sint16 x, y;
165 maptile *m; 166 maptile *m;
166 167
167 if (--op->duration < 0) 168 if (--op->duration < 0)
168 { 169 {
169 op->destroy (); 170 op->drop_and_destroy ();
170 return; 171 return;
171 } 172 }
172 173
173 hit_map (op, 0, op->attacktype, 1); 174 hit_map (op, 0, op->attacktype, 1);
174 175
306 307
307 maptile *newmap; 308 maptile *newmap;
308 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y); 309 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
309 if (mflags & P_OUT_OF_MAP) 310 if (mflags & P_OUT_OF_MAP)
310 { 311 {
311 tmp->destroy (); 312 tmp->drop_and_destroy ();
312 return 0; 313 return 0;
313 } 314 }
314 315
315 tmp->map = newmap; 316 tmp->map = newmap;
316 317
317 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y))) 318 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y)))
318 { 319 {
319 if (!QUERY_FLAG (tmp, FLAG_REFLECTING)) 320 if (!QUERY_FLAG (tmp, FLAG_REFLECTING))
320 { 321 {
321 tmp->destroy (); 322 tmp->drop_and_destroy ();
322 return 0; 323 return 0;
323 } 324 }
324 325
325 tmp->x = op->x; 326 tmp->x = op->x;
326 tmp->y = op->y; 327 tmp->y = op->y;
392void 393void
393explode_bullet (object *op) 394explode_bullet (object *op)
394{ 395{
395 object *tmp, *owner; 396 object *tmp, *owner;
396 397
397 if (op->other_arch == NULL) 398 if (!op->other_arch)
398 { 399 {
399 LOG (llevError, "BUG: explode_bullet(): op without other_arch\n"); 400 LOG (llevError, "BUG: explode_bullet(): op without other_arch\n");
400 op->destroy (); 401 op->destroy ();
401 return; 402 return;
402 } 403 }
444 tmp->set_owner (op); 445 tmp->set_owner (op);
445 tmp->skill = op->skill; 446 tmp->skill = op->skill;
446 447
447 owner = op->owner; 448 owner = op->owner;
448 449
449 if ((tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER) && owner && !tailor_god_spell (tmp, owner)) 450 if ((tmp->attacktype & AT_HOLYWORD
451 || tmp->attacktype & AT_GODPOWER)
452 && owner
453 && !tailor_god_spell (tmp, owner))
450 { 454 {
451 op->destroy (); 455 op->destroy ();
452 return; 456 return;
453 } 457 }
454 458
520 { 524 {
521 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 525 if (QUERY_FLAG (tmp, FLAG_ALIVE))
522 { 526 {
523 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1); 527 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1);
524 528
529 // TODO: can't understand the following if's
525 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0) 530 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0)
526 { 531 {
527 if (!QUERY_FLAG (op, FLAG_REMOVED)) 532 if (!QUERY_FLAG (op, FLAG_REMOVED))
528 { 533 {
529 op->destroy (); 534 op->destroy ();
732 } 737 }
733#endif 738#endif
734 739
735 hit_map (op, 0, op->attacktype, 0); 740 hit_map (op, 0, op->attacktype, 0);
736 741
742 if (!op->is_on_map ())
743 return;
744
737 /* Check to see if we should push anything. 745 /* Check to see if we should push anything.
738 * Spell objects with weight push whatever they encounter to some 746 * Spell objects with weight push whatever they encounter to some
739 * degree. 747 * degree.
740 */ 748 */
741 if (op->weight) 749 if (op->weight)
750 {
742 check_spell_knockback (op); 751 check_spell_knockback (op);
743 752
744 if (op->destroyed ()) 753 if (!op->is_on_map ())
745 return; 754 return;
755 }
746 756
747 if ((op->duration--) < 0) 757 if (op->duration-- < 0)
748 { 758 {
749 op->destroy (); 759 op->destroy ();
750 return; 760 return;
751 } 761 }
752 /* Object has hit maximum range, so don't have it move 762 /* Object has hit maximum range, so don't have it move
859 869
860 success = 1; 870 success = 1;
861 tmp = arch_to_object (spell->other_arch); 871 tmp = arch_to_object (spell->other_arch);
862 tmp->set_owner (op); 872 tmp->set_owner (op);
863 set_spell_skill (op, caster, spell, tmp); 873 set_spell_skill (op, caster, spell, tmp);
864 tmp->level = caster_level (caster, spell); 874 tmp->level = casting_level (caster, spell);
865 tmp->attacktype = spell->attacktype; 875 tmp->attacktype = spell->attacktype;
866 876
867 /* holy word stuff */ 877 /* holy word stuff */
868 if ((tmp->attacktype & AT_HOLYWORD) || (tmp->attacktype & AT_GODPOWER)) 878 if ((tmp->attacktype & AT_HOLYWORD) || (tmp->attacktype & AT_GODPOWER))
869 if (!tailor_god_spell (tmp, op)) 879 if (!tailor_god_spell (tmp, op))
1111 effect = arch_to_object (spell->other_arch); 1121 effect = arch_to_object (spell->other_arch);
1112 else 1122 else
1113 return 0; 1123 return 0;
1114 1124
1115 /* tailor the effect by priest level and worshipped God */ 1125 /* tailor the effect by priest level and worshipped God */
1116 effect->level = caster_level (caster, spell); 1126 effect->level = casting_level (caster, spell);
1117 effect->attacktype = spell->attacktype; 1127 effect->attacktype = spell->attacktype;
1118 if (effect->attacktype & (AT_HOLYWORD | AT_GODPOWER)) 1128 if (effect->attacktype & (AT_HOLYWORD | AT_GODPOWER))
1119 { 1129 {
1120 if (tailor_god_spell (effect, op)) 1130 if (tailor_god_spell (effect, op))
1121 new_draw_info_format (NDI_UNIQUE, 0, op, "%s answers your call!", determine_god (op)); 1131 new_draw_info_format (NDI_UNIQUE, 0, op, "%s answers your call!", determine_god (op));
1178void 1188void
1179move_missile (object *op) 1189move_missile (object *op)
1180{ 1190{
1181 if (op->range-- <= 0) 1191 if (op->range-- <= 0)
1182 { 1192 {
1183 op->destroy (); 1193 op->drop_and_destroy ();
1184 return; 1194 return;
1185 } 1195 }
1186 1196
1187 mapxy pos (op); 1197 mapxy pos (op);
1188 pos.move (op->direction); 1198 pos.move (op->direction);
1450 1460
1451 /* We precompute some values here so that we don't have to keep 1461 /* We precompute some values here so that we don't have to keep
1452 * doing it over and over again. 1462 * doing it over and over again.
1453 */ 1463 */
1454 god = find_god (determine_god (op)); 1464 god = find_god (determine_god (op));
1455 level = caster_level (caster, spell); 1465 level = casting_level (caster, spell);
1456 range = spell->range + SP_level_range_adjust (caster, spell); 1466 range = spell->range + SP_level_range_adjust (caster, spell);
1457 1467
1458 /* On the bright side, no monster should ever have a race of GOD_... 1468 /* On the bright side, no monster should ever have a race of GOD_...
1459 * so even if the player doesn't worship a god, if race=GOD_.., it 1469 * so even if the player doesn't worship a god, if race=GOD_.., it
1460 * won't ever match anything. 1470 * won't ever match anything.
1610 * about. was called move_ball_lightning, but since more than the ball 1620 * about. was called move_ball_lightning, but since more than the ball
1611 * lightning spell used it, that seemed misnamed. 1621 * lightning spell used it, that seemed misnamed.
1612 * op is the spell effect. 1622 * op is the spell effect.
1613 * note that duration is handled by process_object() in time.c 1623 * note that duration is handled by process_object() in time.c
1614 */ 1624 */
1615
1616void 1625void
1617move_ball_spell (object *op) 1626move_ball_spell (object *op)
1618{ 1627{
1619 int i, j, dam_save, dir, mflags; 1628 int i, j, dam_save, dir, mflags;
1620 sint16 nx, ny, hx, hy; 1629 sint16 nx, ny, hx, hy;
1739 return; 1748 return;
1740 } 1749 }
1741 1750
1742 if (!op->duration || !owner->is_on_map ()) 1751 if (!op->duration || !owner->is_on_map ())
1743 { 1752 {
1744 op->destroy (); 1753 op->drop_and_destroy ();
1745 return; 1754 return;
1746 } 1755 }
1747 1756
1748 op->duration--; 1757 op->duration--;
1749 1758
1750 int basedir = op->direction; 1759 int basedir = op->direction;
1751 if (!basedir) 1760 if (!basedir)
1761 {
1752 /* spray in all directions! 8) */ 1762 /* spray in all directions! 8) */
1753 basedir = (op->facing += op->state) % 8 + 1; 1763 op->facing = (op->facing + op->state) & 7;
1764 basedir = op->facing + 1;
1765 }
1754 1766
1755#if 0 1767#if 0
1756 // this is bogus: it causes wrong places to be checked below 1768 // this is bogus: it causes wrong places to be checked below
1757 // (a wall 2 cells away will block the effect...) and 1769 // (a wall 2 cells away will block the effect...) and
1758 // doesn't work for SP_BULLET anyhow, so again tests the wrong 1770 // doesn't work for SP_BULLET anyhow, so again tests the wrong
1840{ 1852{
1841 if (!spell->other_arch) 1853 if (!spell->other_arch)
1842 return 0; 1854 return 0;
1843 1855
1844 object *tmp = archetype::get (SWARM_SPELL); 1856 object *tmp = archetype::get (SWARM_SPELL);
1857
1845 set_spell_skill (op, caster, spell, tmp); 1858 set_spell_skill (op, caster, spell, tmp);
1846 tmp->level = caster_level (caster, spell); /* needed later, to get level dep. right. */ 1859 tmp->level = casting_level (caster, spell); /* needed later, to get level dep. right. */
1847 tmp->spell = spell->other_arch->instance (); 1860 tmp->spell = spell->other_arch->instance ();
1848 tmp->attacktype = tmp->spell->attacktype; 1861 tmp->attacktype = tmp->spell->attacktype;
1849 1862
1850 if (tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER) 1863 if (tmp->attacktype & AT_HOLYWORD || tmp->attacktype & AT_GODPOWER)
1851 if (!tailor_god_spell (tmp, op)) 1864 if (!tailor_god_spell (tmp, op))
1994 object *disease = arch_to_object (spell->other_arch); 2007 object *disease = arch_to_object (spell->other_arch);
1995 2008
1996 disease->set_owner (op); 2009 disease->set_owner (op);
1997 set_spell_skill (op, caster, spell, disease); 2010 set_spell_skill (op, caster, spell, disease);
1998 disease->stats.exp = 0; 2011 disease->stats.exp = 0;
1999 disease->level = caster_level (caster, spell); 2012 disease->level = casting_level (caster, spell);
2000 2013
2001 /* do level adjustments */ 2014 /* do level adjustments */
2002 if (disease->stats.wc) 2015 if (disease->stats.wc)
2003 disease->stats.wc += dur_mod / 2; 2016 disease->stats.wc += dur_mod / 2;
2004 2017

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines