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

Comparing deliantra/server/server/alchemy.C (file contents):
Revision 1.28 by root, Sun Apr 20 23:25:09 2008 UTC vs.
Revision 1.31 by root, Mon Sep 29 10:20:48 2008 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,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
9 * 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
558 } 558 }
559 while (rndm (0, 2)); 559 while (rndm (0, 2));
560 } 560 }
561 return; 561 return;
562 } 562 }
563
563 if (level == 40) 564 if (level == 40)
564 { /* MAKE RANDOM RECIPE */ 565 { /* MAKE RANDOM RECIPE */
565 recipelist *fl; 566 recipelist *fl;
566 int numb = numb_ob_inside (cauldron); 567 int numb = numb_ob_inside (cauldron);
567 568
569 if (fl && (rp = get_random_recipe (fl))) 570 if (fl && (rp = get_random_recipe (fl)))
570 /* even though random, don't grant user any EXP for it */ 571 /* even though random, don't grant user any EXP for it */
571 (void) attempt_recipe (op, cauldron, 1, rp, -1); 572 (void) attempt_recipe (op, cauldron, 1, rp, -1);
572 else 573 else
573 alchemy_failure_effect (op, cauldron, rp, level - 1); 574 alchemy_failure_effect (op, cauldron, rp, level - 1);
574 return;
575
576 } 575 }
577 else if (level < 45) 576 else if (level < 45)
578 { /* INFURIATE NPC's */ 577 { /* INFURIATE NPC's */
579 /* this is kind of kludgy I know... */ 578 /* this is kind of kludgy I know... */
580 cauldron->enemy = op; 579 cauldron->enemy = op;
581 npc_call_help (cauldron); 580 npc_call_help (cauldron);
582 cauldron->enemy = NULL; 581 cauldron->enemy = NULL;
583 582
584 alchemy_failure_effect (op, cauldron, rp, level - 5); 583 alchemy_failure_effect (op, cauldron, rp, level - 5);
585 return;
586 } 584 }
587 else if (level < 50) 585 else if (level < 50)
588 { /* MINOR EXPLOSION/FIREBALL */ 586 { /* MINOR EXPLOSION/FIREBALL */
589 object *tmp; 587 object *tmp;
590 588
604 tmp->stats.hp = random_roll (1, level, op, PREFER_LOW) / 10 + 2; 602 tmp->stats.hp = random_roll (1, level, op, PREFER_LOW) / 10 + 2;
605 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s erupts in flame!", &cauldron->name); 603 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s erupts in flame!", &cauldron->name);
606 break; 604 break;
607 } 605 }
608 606
609 op->insert_at (cauldron); 607 tmp->insert_at (cauldron);
610 return;
611
612 } 608 }
613 else if (level < 60) 609 else if (level < 60)
614 { /* CREATE MONSTER */ 610 { /* CREATE MONSTER */
615 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s.", &cauldron->name, cauldron_sound ()); 611 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s.", &cauldron->name, cauldron_sound ());
616 remove_contents (cauldron->inv, NULL); 612 remove_contents (cauldron->inv, NULL);
617 return;
618 } 613 }
619 else if (level < 80) 614 else if (level < 80)
620 { /* MAJOR FIRE */ 615 { /* MAJOR FIRE */
621 object *fb = get_archetype (SP_MED_FIREBALL); 616 object *fb = get_archetype (SP_MED_FIREBALL);
622 617
623 remove_contents (cauldron->inv, NULL); 618 remove_contents (cauldron->inv, NULL);
624 fire_arch_from_position (cauldron, cauldron, cauldron->x, cauldron->y, 0, fb); 619 fire_arch_from_position (cauldron, cauldron, cauldron->x, cauldron->y, 0, fb);
625 fb->destroy (); 620 fb->destroy (true);
626 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s erupts in flame!", &cauldron->name); 621 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s erupts in flame!", &cauldron->name);
627 return;
628
629 } 622 }
630 else if (level < 100) 623 else if (level < 100)
631 { /* WHAMMY the CAULDRON */ 624 { /* WHAMMY the CAULDRON */
632 if (!QUERY_FLAG (cauldron, FLAG_CURSED)) 625 if (!QUERY_FLAG (cauldron, FLAG_CURSED))
633 SET_FLAG (cauldron, FLAG_CURSED); 626 SET_FLAG (cauldron, FLAG_CURSED);
634 else 627 else
635 cauldron->magic--; 628 cauldron->magic--;
629
636 cauldron->magic -= random_roll (0, 4, op, PREFER_LOW); 630 cauldron->magic -= random_roll (0, 4, op, PREFER_LOW);
631
637 if (rndm (0, 1)) 632 if (rndm (0, 1))
638 { 633 {
639 remove_contents (cauldron->inv, NULL); 634 remove_contents (cauldron->inv, NULL);
640 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s turns darker then makes a gulping sound!", &cauldron->name); 635 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s turns darker then makes a gulping sound!", &cauldron->name);
641 } 636 }
642 else 637 else
643 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s becomes darker.", &cauldron->name); 638 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s becomes darker.", &cauldron->name);
644 return;
645
646 } 639 }
647 else if (level < 110) 640 else if (level < 110)
648 { /* SUMMON EVIL MONSTERS */ 641 { /* SUMMON EVIL MONSTERS */
649 object *tmp = get_random_mon (level / 5); 642 object *tmp = get_random_mon (level / 5);
650 643
651 remove_contents (cauldron->inv, NULL); 644 remove_contents (cauldron->inv, NULL);
645
652 if (!tmp) 646 if (!tmp)
653 alchemy_failure_effect (op, cauldron, rp, level); 647 alchemy_failure_effect (op, cauldron, rp, level);
654 else if (summon_hostile_monsters (cauldron, random_roll (1, 10, op, PREFER_LOW), tmp->arch->archname)) 648 else if (summon_hostile_monsters (cauldron, random_roll (1, 10, op, PREFER_LOW), tmp->arch->archname))
655 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s and then pours forth monsters!", &cauldron->name, cauldron_sound ()); 649 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s and then pours forth monsters!", &cauldron->name, cauldron_sound ());
656 return;
657
658 } 650 }
659 else if (level < 150) 651 else if (level < 150)
660 { /* COMBO EFFECT */ 652 { /* COMBO EFFECT */
661 int roll = rndm (1, 3); 653 int roll = rndm (1, 3);
662 654
663 while (roll) 655 while (roll)
664 { 656 {
665 alchemy_failure_effect (op, cauldron, rp, level - 39); 657 alchemy_failure_effect (op, cauldron, rp, level - 39);
666 roll--; 658 roll--;
667 } 659 }
668 return;
669 } 660 }
670 else if (level == 151) 661 else if (level == 151)
671 { /* CREATE RANDOM ARTIFACT */ 662 { /* CREATE RANDOM ARTIFACT */
672 object *tmp; 663 object *tmp;
673 664
684 { 675 {
685 remove_contents (cauldron->inv, tmp); 676 remove_contents (cauldron->inv, tmp);
686 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s.", &cauldron->name, cauldron_sound ()); 677 new_draw_info_format (NDI_UNIQUE, 0, op, "The %s %s.", &cauldron->name, cauldron_sound ());
687 } 678 }
688 } 679 }
689 return;
690 } 680 }
691 else 681 else
692 { /* MANA STORM - watch out!! */ 682 { /* MANA STORM - watch out!! */
693 object *tmp = get_archetype (LOOSE_MANA); 683 object *tmp = get_archetype (LOOSE_MANA);
694 684
695 new_draw_info (NDI_UNIQUE, 0, op, "You unwisely release potent forces!"); 685 new_draw_info (NDI_UNIQUE, 0, op, "You unwisely release potent forces!");
696 remove_contents (cauldron->inv, NULL); 686 remove_contents (cauldron->inv, NULL);
697 cast_magic_storm (op, tmp, level); 687 cast_magic_storm (op, tmp, level);
698 return;
699 } 688 }
700} 689}
701
702 690
703/* 691/*
704 * All but object "save_item" are elimentated from 692 * All but object "save_item" are elimentated from
705 * the container list. Note we have to becareful to remove the inventories 693 * the container list. Note we have to becareful to remove the inventories
706 * of objects in the cauldron inventory (ex icecube has stuff in it). 694 * of objects in the cauldron inventory (ex icecube has stuff in it).
707 */ 695 */
708
709void 696void
710remove_contents (object *first_ob, object *save_item) 697remove_contents (object *first_ob, object *save_item)
711{ 698{
699 // this cries for a cleaner rewrite, removing save_item first possibly
712 object *next, *tmp = first_ob; 700 object *next, *tmp = first_ob;
713 701
714 while (tmp) 702 while (tmp)
715 { 703 {
716 next = tmp->below; 704 next = tmp->below;
724 } 712 }
725 713
726 if (tmp->inv) 714 if (tmp->inv)
727 remove_contents (tmp->inv, NULL); 715 remove_contents (tmp->inv, NULL);
728 716
729 tmp->destroy (); 717 tmp->destroy (true);
730 tmp = next; 718 tmp = next;
731 } 719 }
732} 720}
733 721
734/** 722/**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines