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.19 by root, Wed Dec 13 03:28:42 2006 UTC vs.
Revision 1.23 by root, Mon Dec 25 11:25:50 2006 UTC

57 { 57 {
58 weight_move = op->weight + (op->weight * op->level) / 3; 58 weight_move = op->weight + (op->weight * op->level) / 3;
59 /*LOG (llevDebug, "DEBUG: arch weighs %d and masses %d (%s,level %d)\n", op->weight,weight_move,op->name,op->level); */ 59 /*LOG (llevDebug, "DEBUG: arch weighs %d and masses %d (%s,level %d)\n", op->weight,weight_move,op->name,op->level); */
60 } 60 }
61 61
62 for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 62 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
63 { 63 {
64 int num_sections = 1; 64 int num_sections = 1;
65 65
66 /* don't move DM */ 66 /* don't move DM */
67 if (QUERY_FLAG (tmp, FLAG_WIZ)) 67 if (QUERY_FLAG (tmp, FLAG_WIZ))
280 * we remove the magic flag - that can be derived from 280 * we remove the magic flag - that can be derived from
281 * spob->attacktype. 281 * spob->attacktype.
282 * This function sets up the appropriate owner and skill 282 * This function sets up the appropriate owner and skill
283 * pointers. 283 * pointers.
284 */ 284 */
285
286int 285int
287fire_bolt (object *op, object *caster, int dir, object *spob, object *skill) 286fire_bolt (object *op, object *caster, int dir, object *spob, object *skill)
288{ 287{
289 object *tmp = NULL; 288 object *tmp = NULL;
290 int mflags; 289 int mflags;
315 314
316 tmp->x = op->x + DIRX (tmp); 315 tmp->x = op->x + DIRX (tmp);
317 tmp->y = op->y + DIRY (tmp); 316 tmp->y = op->y + DIRY (tmp);
318 tmp->map = op->map; 317 tmp->map = op->map;
319 318
319 maptile *newmap;
320 mflags = get_map_flags (tmp->map, &tmp->map, tmp->x, tmp->y, &tmp->x, &tmp->y); 320 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
321 if (mflags & P_OUT_OF_MAP) 321 if (mflags & P_OUT_OF_MAP)
322 { 322 {
323 tmp->destroy (); 323 tmp->destroy ();
324 return 0; 324 return 0;
325 } 325 }
326
327 tmp->map = newmap;
326 328
327 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y))) 329 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y)))
328 { 330 {
329 if (!QUERY_FLAG (tmp, FLAG_REFLECTING)) 331 if (!QUERY_FLAG (tmp, FLAG_REFLECTING))
330 { 332 {
536 538
537 /* If nothing alive on this space, no reason to do anything further */ 539 /* If nothing alive on this space, no reason to do anything further */
538 if (!(mflags & P_IS_ALIVE)) 540 if (!(mflags & P_IS_ALIVE))
539 return; 541 return;
540 542
541 for (tmp = get_map_ob (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 543 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
542 { 544 {
543 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 545 if (QUERY_FLAG (tmp, FLAG_ALIVE))
544 { 546 {
545 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1); 547 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1);
546 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0) 548 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0)
553 } 555 }
554 } 556 }
555 } 557 }
556} 558}
557 559
558
559/* Basically, we move 'op' one square, and if it hits something, 560/* Basically, we move 'op' one square, and if it hits something,
560 * call check_bullet. 561 * call check_bullet.
561 * This function is only applicable to bullets, but not to all 562 * This function is only applicable to bullets, but not to all
562 * fired arches (eg, bolts). 563 * fired arches (eg, bolts).
563 */ 564 */
564
565void 565void
566move_bullet (object *op) 566move_bullet (object *op)
567{ 567{
568 sint16 new_x, new_y; 568 sint16 new_x, new_y;
569 int mflags; 569 int mflags;
624 { 624 {
625 op->direction = absdir (op->direction + 4); 625 op->direction = absdir (op->direction + 4);
626 update_turn_face (op); 626 update_turn_face (op);
627 } 627 }
628 else 628 else
629 {
630 check_bullet (op); 629 check_bullet (op);
631 }
632} 630}
633 631
634 632
635 633
636 634
678 676
679 tmp->x = op->x + freearr_x[dir]; 677 tmp->x = op->x + freearr_x[dir];
680 tmp->y = op->y + freearr_y[dir]; 678 tmp->y = op->y + freearr_y[dir];
681 tmp->map = op->map; 679 tmp->map = op->map;
682 680
681 maptile *newmap;
683 mflags = get_map_flags (tmp->map, &tmp->map, tmp->x, tmp->y, &tmp->x, &tmp->y); 682 mflags = get_map_flags (tmp->map, &newmap, tmp->x, tmp->y, &tmp->x, &tmp->y);
684 if (mflags & P_OUT_OF_MAP) 683 if (mflags & P_OUT_OF_MAP)
685 { 684 {
686 tmp->destroy (); 685 tmp->destroy ();
687 return 0; 686 return 0;
688 } 687 }
688
689 tmp->map = newmap;
689 690
690 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y))) 691 if (OB_TYPE_MOVE_BLOCK (tmp, GET_MAP_MOVE_BLOCK (tmp->map, tmp->x, tmp->y)))
691 { 692 {
692 if (!QUERY_FLAG (tmp, FLAG_REFLECTING)) 693 if (!QUERY_FLAG (tmp, FLAG_REFLECTING))
693 { 694 {
699 tmp->y = op->y; 700 tmp->y = op->y;
700 tmp->direction = absdir (tmp->direction + 4); 701 tmp->direction = absdir (tmp->direction + 4);
701 tmp->map = op->map; 702 tmp->map = op->map;
702 } 703 }
703 704
704 if ((tmp = insert_ob_in_map (tmp, tmp->map, op, 0)) != NULL) 705 if ((tmp = insert_ob_in_map (tmp, tmp->map, op, 0)))
705 check_bullet (tmp); 706 check_bullet (tmp);
706 707
707 return 1; 708 return 1;
708} 709}
709 710
1123 if (GET_MAP_MOVE_BLOCK (mp, x, y) & MOVE_FLY_LOW) 1124 if (GET_MAP_MOVE_BLOCK (mp, x, y) & MOVE_FLY_LOW)
1124 return NULL; 1125 return NULL;
1125 1126
1126 if (mflags & P_IS_ALIVE) 1127 if (mflags & P_IS_ALIVE)
1127 { 1128 {
1128 for (target = get_map_ob (mp, x, y); target; target = target->above) 1129 for (target = GET_MAP_OB (mp, x, y); target; target = target->above)
1129 { 1130 {
1130 if (QUERY_FLAG (target->head ? target->head : target, FLAG_MONSTER)) 1131 if (QUERY_FLAG (target->head ? target->head : target, FLAG_MONSTER))
1131 { 1132 {
1132 return target; 1133 return target;
1133 } 1134 }
1200 if (effect->attacktype & AT_DEATH) 1201 if (effect->attacktype & AT_DEATH)
1201 { 1202 {
1202 effect->level = spell->stats.dam + SP_level_dam_adjust (caster, spell); 1203 effect->level = spell->stats.dam + SP_level_dam_adjust (caster, spell);
1203 1204
1204 /* casting death spells at undead isn't a good thing */ 1205 /* casting death spells at undead isn't a good thing */
1205 if QUERY_FLAG
1206 (target, FLAG_UNDEAD) 1206 if (QUERY_FLAG (target, FLAG_UNDEAD))
1207 { 1207 {
1208 if (random_roll (0, 2, op, PREFER_LOW)) 1208 if (random_roll (0, 2, op, PREFER_LOW))
1209 { 1209 {
1210 new_draw_info (NDI_UNIQUE, 0, op, "Idiot! Your spell boomerangs!"); 1210 new_draw_info (NDI_UNIQUE, 0, op, "Idiot! Your spell boomerangs!");
1211 effect->x = op->x; 1211 effect->x = op->x;
1398 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy); 1398 mflags = get_map_flags (m, &m, sx, sy, &sx, &sy);
1399 if (mflags & P_OUT_OF_MAP) 1399 if (mflags & P_OUT_OF_MAP)
1400 continue; 1400 continue;
1401 if (mflags & P_IS_ALIVE) 1401 if (mflags & P_IS_ALIVE)
1402 { 1402 {
1403 for (tmp = get_map_ob (m, sx, sy); tmp; tmp = tmp->above) 1403 for (tmp = GET_MAP_OB (m, sx, sy); tmp; tmp = tmp->above)
1404 { 1404 {
1405 if (QUERY_FLAG (tmp, FLAG_ALIVE) || tmp->type == PLAYER) 1405 if (QUERY_FLAG (tmp, FLAG_ALIVE) || tmp->type == PLAYER)
1406 break; 1406 break;
1407 } 1407 }
1408 if (tmp) 1408 if (tmp)
1531 force->stats.ac = spell_ob->stats.ac; 1531 force->stats.ac = spell_ob->stats.ac;
1532 force->stats.wc = spell_ob->stats.wc; 1532 force->stats.wc = spell_ob->stats.wc;
1533 1533
1534 change_abil (tmp, force); /* Mostly to display any messages */ 1534 change_abil (tmp, force); /* Mostly to display any messages */
1535 insert_ob_in_ob (force, tmp); 1535 insert_ob_in_ob (force, tmp);
1536 fix_player (tmp); 1536 tmp->update_stats ();
1537 return 1; 1537 return 1;
1538 1538
1539} 1539}
1540 1540
1541 1541
1592 1592
1593 /* If there is nothing living on this space, no need to go further */ 1593 /* If there is nothing living on this space, no need to go further */
1594 if (!(mflags & P_IS_ALIVE)) 1594 if (!(mflags & P_IS_ALIVE))
1595 continue; 1595 continue;
1596 1596
1597 for (tmp = get_map_ob (m, nx, ny); tmp; tmp = tmp->above) 1597 for (tmp = GET_MAP_OB (m, nx, ny); tmp; tmp = tmp->above)
1598 if (QUERY_FLAG (tmp, FLAG_MONSTER)) 1598 if (QUERY_FLAG (tmp, FLAG_MONSTER))
1599 break; 1599 break;
1600 1600
1601 /* There can be living objects that are not monsters */ 1601 /* There can be living objects that are not monsters */
1602 if (!tmp || tmp->type == PLAYER) 1602 if (!tmp || tmp->type == PLAYER)
2025 return 0; 2025 return 0;
2026 } 2026 }
2027 2027
2028 if (mflags & P_IS_ALIVE && spell->attacktype) 2028 if (mflags & P_IS_ALIVE && spell->attacktype)
2029 { 2029 {
2030 for (target = get_map_ob (m, x, y); target; target = target->above) 2030 for (target = GET_MAP_OB (m, x, y); target; target = target->above)
2031 if (QUERY_FLAG (target, FLAG_MONSTER)) 2031 if (QUERY_FLAG (target, FLAG_MONSTER))
2032 { 2032 {
2033 /* oky doky. got a target monster. Lets make a blinding attack */ 2033 /* oky doky. got a target monster. Lets make a blinding attack */
2034 if (target->head) 2034 if (target->head)
2035 target = target->head; 2035 target = target->head;
2117 2117
2118 /* Only bother looking on this space if there is something living here */ 2118 /* Only bother looking on this space if there is something living here */
2119 if (mflags & P_IS_ALIVE) 2119 if (mflags & P_IS_ALIVE)
2120 { 2120 {
2121 /* search this square for a victim */ 2121 /* search this square for a victim */
2122 for (walk = get_map_ob (m, x, y); walk; walk = walk->above) 2122 for (walk = GET_MAP_OB (m, x, y); walk; walk = walk->above)
2123 if (QUERY_FLAG (walk, FLAG_MONSTER) || (walk->type == PLAYER)) 2123 if (QUERY_FLAG (walk, FLAG_MONSTER) || (walk->type == PLAYER))
2124 { /* found a victim */ 2124 { /* found a victim */
2125 object *disease = arch_to_object (spell->other_arch); 2125 object *disease = arch_to_object (spell->other_arch);
2126 2126
2127 disease->set_owner (op); 2127 disease->set_owner (op);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines