ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/spell_effect.C
(Generate patch)

Comparing deliantra/server/server/spell_effect.C (file contents):
Revision 1.28 by root, Sat Dec 30 10:16:11 2006 UTC vs.
Revision 1.36 by root, Fri Jan 19 23:32:53 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 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,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24#include <global.h> 25#include <global.h>
25#include <object.h> 26#include <object.h>
26#include <living.h> 27#include <living.h>
27#ifndef __CEXTRACT__
28# include <sproto.h> 28#include <sproto.h>
29#endif
30#include <spells.h> 29#include <spells.h>
31#include <sounds.h> 30#include <sounds.h>
32 31
33/* cast_magic_storm: This is really used mostly for spell 32/* cast_magic_storm: This is really used mostly for spell
34 * fumbles at the like. tmp is the object to propogate. 33 * fumbles at the like. tmp is the object to propogate.
411 update_object (op, UP_OBJ_FACE); 410 update_object (op, UP_OBJ_FACE);
412 411
413 /* Only search the active objects - only these should actually do 412 /* Only search the active objects - only these should actually do
414 * harm to the player. 413 * harm to the player.
415 */ 414 */
416 for (tmp = active_objects; tmp != NULL; tmp = tmp->active_next) 415 for_all_actives (tmp)
417 if (tmp->enemy == op) 416 if (tmp->enemy == op)
418 tmp->enemy = NULL; 417 tmp->enemy = 0;
418
419 return 1; 419 return 1;
420} 420}
421 421
422/* earth to dust spell. Basically destroys earthwalls in the area. 422/* earth to dust spell. Basically destroys earthwalls in the area.
423 */ 423 */
451 next = tmp->above; 451 next = tmp->above;
452 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN)) 452 if (QUERY_FLAG (tmp, FLAG_TEAR_DOWN))
453 hit_player (tmp, 9998, op, AT_PHYSICAL, 0); 453 hit_player (tmp, 9998, op, AT_PHYSICAL, 0);
454 } 454 }
455 } 455 }
456
456 return 1; 457 return 1;
457} 458}
458
459 459
460void 460void
461execute_word_of_recall (object *op) 461execute_word_of_recall (object *op)
462{ 462{
463 object *wor = op; 463 if (object *pl = op->in_player ())
464 464 {
465 while (op != NULL && op->type != PLAYER) 465 if (pl->ms ().flags () & P_NO_CLERIC && !QUERY_FLAG (pl, FLAG_WIZCAST))
466 op = op->env;
467
468 if (op != NULL && op->map)
469 if ((get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_CLERIC) && (!QUERY_FLAG (op, FLAG_WIZCAST)))
470 new_draw_info (NDI_UNIQUE, 0, op, "You feel something fizzle inside you."); 466 new_draw_info (NDI_UNIQUE, 0, pl, "You feel something fizzle inside you.");
471 else 467 else
468 {
469 // remove first so we do not call update_stats
470 op->remove ();
472 op->enter_exit (wor); 471 pl->enter_exit (op);
472 }
473 }
473 474
474 wor->destroy (); 475 op->destroy ();
475} 476}
476 477
477/* Word of recall causes the player to return 'home'. 478/* Word of recall causes the player to return 'home'.
478 * we put a force into the player object, so that there is a 479 * we put a force into the player object, so that there is a
479 * time delay effect. 480 * time delay effect.
498 { 499 {
499 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 500 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
500 LOG (llevError, "cast_word_of_recall: get_archetype(force) failed!\n"); 501 LOG (llevError, "cast_word_of_recall: get_archetype(force) failed!\n");
501 return 0; 502 return 0;
502 } 503 }
504
503 time = spell_ob->duration - SP_level_duration_adjust (caster, spell_ob); 505 time = spell_ob->duration - SP_level_duration_adjust (caster, spell_ob);
504 if (time < 1) 506 if (time < 1)
505 time = 1; 507 time = 1;
506 508
507 /* value of speed really doesn't make much difference, as long as it is 509 /* value of speed really doesn't make much difference, as long as it is
515 517
516 /* If we could take advantage of enter_player_savebed() here, it would be 518 /* If we could take advantage of enter_player_savebed() here, it would be
517 * nice, but until the map load fails, we can't. 519 * nice, but until the map load fails, we can't.
518 */ 520 */
519 EXIT_PATH (dummy) = op->contr->savebed_map; 521 EXIT_PATH (dummy) = op->contr->savebed_map;
520 EXIT_X (dummy) = op->contr->bed_x; 522 EXIT_X (dummy) = op->contr->bed_x;
521 EXIT_Y (dummy) = op->contr->bed_y; 523 EXIT_Y (dummy) = op->contr->bed_y;
522 524
523 (void) insert_ob_in_ob (dummy, op); 525 op->insert (dummy);
526
524 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you."); 527 new_draw_info (NDI_UNIQUE, 0, op, "You feel a force starting to build up inside you.");
528
525 return 1; 529 return 1;
526} 530}
527 531
528/* cast_wonder 532/* cast_wonder
529 * wonder is really just a spell that will likely cast another 533 * wonder is really just a spell that will likely cast another
601 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 605 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
602 { 606 {
603 if (tmp->type == FORCE && !strcmp (tmp->arch->name, "dragon_ability_force")) 607 if (tmp->type == FORCE && !strcmp (tmp->arch->name, "dragon_ability_force"))
604 { 608 {
605 if (tmp->stats.exp == 0) 609 if (tmp->stats.exp == 0)
606 {
607 sprintf (buf, "Your metabolism isn't focused on anything."); 610 sprintf (buf, "Your metabolism isn't focused on anything.");
608 }
609 else 611 else
610 {
611 sprintf (buf, "Your metabolism is focused on %s.", change_resist_msg[tmp->stats.exp]); 612 sprintf (buf, "Your metabolism is focused on %s.", change_resist_msg[tmp->stats.exp]);
612 } 613
613 new_draw_info (NDI_UNIQUE, 0, op, buf); 614 new_draw_info (NDI_UNIQUE, 0, op, buf);
614 break; 615 break;
615 } 616 }
616 } 617 }
617 } 618 }
619
618 return 1; 620 return 1;
619} 621}
620 622
621/* int cast_create_town_portal (object *op, object *caster, int dir) 623/* int cast_create_town_portal (object *op, object *caster, int dir)
622 * 624 *
636 * Code by Tchize (david.delbecq@usa.net) 638 * Code by Tchize (david.delbecq@usa.net)
637 */ 639 */
638int 640int
639cast_create_town_portal (object *op, object *caster, object *spell, int dir) 641cast_create_town_portal (object *op, object *caster, object *spell, int dir)
640{ 642{
641 object *dummy, *force, *old_force, *tmp; 643 object *dummy, *force, *old_force;
642 archetype *perm_portal; 644 archetype *perm_portal;
643 char portal_name[1024], portal_message[1024]; 645 char portal_name[1024], portal_message[1024];
644 maptile *exitmap; 646 maptile *exitmap;
645 int op_level; 647 int op_level;
646 648
718 * If it has the good name, we destruct it. 720 * If it has the good name, we destruct it.
719 * -We destruct the force indicating that portal. 721 * -We destruct the force indicating that portal.
720 */ 722 */
721 while ((old_force = check_inv_recursive (op, dummy))) 723 while ((old_force = check_inv_recursive (op, dummy)))
722 { 724 {
723 exitmap = maptile::find_map (old_force->race, op->map); 725 exitmap = maptile::find_sync (old_force->race, op->map);
724 726
725 if (exitmap) 727 if (exitmap)
726 { 728 {
729 exitmap->load_sync ();
730
727 int exitx = EXIT_X (old_force); 731 int exitx = EXIT_X (old_force);
728 int exity = EXIT_Y (old_force); 732 int exity = EXIT_Y (old_force);
729 733
730 tmp = present_arch (perm_portal, exitmap, exitx, exity); 734 for (object *tmp = present_arch (perm_portal, exitmap, exitx, exity); tmp; tmp = tmp->above)
731 while (tmp)
732 { 735 {
733 if (tmp->name == old_force->name) 736 if (tmp->name == old_force->name)
734 { 737 {
735 tmp->destroy (); 738 tmp->destroy ();
736 break; 739 break;
737 } 740 }
738
739 tmp = tmp->above;
740 } 741 }
741 } 742 }
742 743
743 old_force->destroy (); 744 old_force->destroy ();
744 } 745 }
754 * 'force' is the destination of the town portal, which we got 755 * 'force' is the destination of the town portal, which we got
755 * from the players inventory above. 756 * from the players inventory above.
756 */ 757 */
757 758
758 /* Ensure exit map is loaded */ 759 /* Ensure exit map is loaded */
759 exitmap = maptile::find_map (force->name, 0); 760 exitmap = maptile::find_sync (force->name);
760 761
761 /* If we were unable to load (ex. random map deleted), warn player */ 762 /* If we were unable to load (ex. random map deleted), warn player */
762 if (!exitmap) 763 if (!exitmap)
763 { 764 {
764 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?"); 765 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?");
765 force->destroy (); 766 force->destroy ();
766 return 1; 767 return 1;
767 } 768 }
769
770 exitmap->load_sync ();
768 771
769 op_level = caster_level (caster, spell); 772 op_level = caster_level (caster, spell);
770 if (op_level < 15) 773 if (op_level < 15)
771 snprintf (portal_message, 1024, 774 snprintf (portal_message, 1024,
772 "\nThe air moves around you and\na huge smell of ammonia\nsurounds you as you pass\nthrough %s's tiny portal\nPouah!\n", 775 "\nThe air moves around you and\na huge smell of ammonia\nsurounds you as you pass\nthrough %s's tiny portal\nPouah!\n",
803 806
804 /* Now we need to to create a town portal marker inside the player 807 /* Now we need to to create a town portal marker inside the player
805 * object, so on future castings, we can know that he has an active 808 * object, so on future castings, we can know that he has an active
806 * town portal. 809 * town portal.
807 */ 810 */
808 tmp = get_archetype (spell->race); 811 object *tmp = get_archetype (spell->race);
809 if (tmp == NULL) 812
813 if (!tmp)
810 { 814 {
811 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!"); 815 new_draw_info (NDI_UNIQUE, 0, op, "Oops, program error!");
812 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name); 816 LOG (llevError, "object::create failed (force) in cast_create_town_portal for %s!\n", &op->name);
813 return 0; 817 return 0;
814 } 818 }
2343 /* create the golem object */ 2347 /* create the golem object */
2344 tmp = arch_to_object (spell->other_arch); 2348 tmp = arch_to_object (spell->other_arch);
2345 2349
2346 /* if animated by a player, give the player control of the golem */ 2350 /* if animated by a player, give the player control of the golem */
2347 CLEAR_FLAG (tmp, FLAG_MONSTER); 2351 CLEAR_FLAG (tmp, FLAG_MONSTER);
2348 SET_FLAG (tmp, FLAG_FRIENDLY);
2349 tmp->stats.exp = 0; 2352 tmp->stats.exp = 0;
2350 add_friendly_object (tmp); 2353 add_friendly_object (tmp);
2351 tmp->type = GOLEM; 2354 tmp->type = GOLEM;
2352 tmp->set_owner (op); 2355 tmp->set_owner (op);
2353 set_spell_skill (op, caster, spell, tmp); 2356 set_spell_skill (op, caster, spell, tmp);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines