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.39 by root, Wed Feb 7 23:43:01 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 }
1525 insert_ob_in_ob (force, tmp); 1529 insert_ob_in_ob (force, tmp);
1526 tmp->update_stats (); 1530 tmp->update_stats ();
1527 return 1; 1531 return 1;
1528} 1532}
1529 1533
1530
1531
1532/* Alchemy code by Mark Wedel 1534/* Alchemy code by Mark Wedel
1533 * 1535 *
1534 * This code adds a new spell, called alchemy. Alchemy will turn 1536 * This code adds a new spell, called alchemy. Alchemy will turn
1535 * objects to gold nuggets, the value of the gold nuggets being 1537 * objects to gold nuggets, the value of the gold nuggets being
1536 * about 90% of that of the item itself. It uses the value of the 1538 * about 90% of that of the item itself. It uses the value of the
1545 * For example, if an item is worth 110 gold, you will get 1547 * For example, if an item is worth 110 gold, you will get
1546 * 4 large nuggets, and from 0-10 small nuggets. 1548 * 4 large nuggets, and from 0-10 small nuggets.
1547 * 1549 *
1548 * There is also a chance (1:30) that you will get nothing at all 1550 * There is also a chance (1:30) that you will get nothing at all
1549 * for the object. There is also a maximum weight that will be 1551 * for the object. There is also a maximum weight that will be
1550 * alchemied. 1552 * alchemised.
1551 */ 1553 */
1552
1553/* I didn't feel like passing these as arguements to the
1554 * two functions that need them. Real values are put in them
1555 * when the spell is cast, and these are freed when the spell
1556 * is finished.
1557 */
1558static object *small, *large;
1559
1560static void 1554static void
1561alchemy_object (object *obj, int *small_nuggets, int *large_nuggets, int *weight) 1555alchemy_object (object *obj, uint64 &total_value, int &total_weight)
1562{ 1556{
1563 uint64 value = query_cost (obj, NULL, F_TRUE); 1557 uint64 value = query_cost (obj, NULL, F_TRUE);
1564 1558
1565 /* Give third price when we alchemy money (This should hopefully 1559 /* Give third price when we alchemy money (This should hopefully
1566 * make it so that it isn't worth it to alchemy money, sell 1560 * make it so that it isn't worth it to alchemy money, sell
1567 * the nuggets, alchemy the gold from that, etc. 1561 * the nuggets, alchemy the gold from that, etc.
1568 * Otherwise, give 9 silver on the gold for other objects, 1562 * Otherwise, give 9 silver on the gold for other objects,
1569 * so that it would still be more affordable to haul 1563 * so that it would still be more affordable to haul
1570 * the stuff back to town. 1564 * the stuff back to town.
1571 */ 1565 */
1572
1573 if (QUERY_FLAG (obj, FLAG_UNPAID)) 1566 if (QUERY_FLAG (obj, FLAG_UNPAID))
1574 value = 0; 1567 value = 0;
1575 else if (obj->type == MONEY || obj->type == GEM) 1568 else if (obj->type == MONEY || obj->type == GEM)
1576 value /= 3; 1569 value /= 3;
1577 else 1570 else
1578 value = (value * 9) / 10; 1571 value = value * 9 / 10;
1579 1572
1580 value /= 4; // fix by GHJ, don't understand, pcg
1581
1582 if ((obj->value > 0) && rndm (0, 29)) 1573 if (obj->value > 0 && rndm (0, 29))
1583 { 1574 total_value += value;
1584 int count;
1585 1575
1586 count = value / large->value;
1587 *large_nuggets += count;
1588 value -= (uint64) count *(uint64) large->value;
1589
1590 count = value / small->value;
1591 *small_nuggets += count;
1592 }
1593
1594 /* Turn 25 small nuggets into 1 large nugget. If the value
1595 * of large nuggets is not evenly divisable by the small nugget
1596 * value, take off an extra small_nugget (Assuming small_nuggets!=0)
1597 */
1598 if (*small_nuggets * small->value >= large->value)
1599 {
1600 (*large_nuggets)++;
1601 *small_nuggets -= large->value / small->value;
1602 if (*small_nuggets && large->value % small->value)
1603 (*small_nuggets)--;
1604 }
1605 weight += obj->weight; 1576 total_weight += obj->total_weight ();
1577
1606 obj->destroy (); 1578 obj->destroy ();
1607} 1579}
1608 1580
1609static void 1581static void
1610update_map (object *op, maptile *m, int small_nuggets, int large_nuggets, int x, int y) 1582update_map (object *op, maptile *m, int small_nuggets, object *small, int large_nuggets, object *large, int x, int y)
1611{ 1583{
1612 object *tmp;
1613 int flag = 0; 1584 int flag = 0;
1614 1585
1615 /* Put any nuggets below the player, but we can only pass this 1586 /* Put any nuggets below the player, but we can only pass this
1616 * flag if we are on the same space as the player 1587 * flag if we are on the same space as the player
1617 */ 1588 */
1618 if (x == op->x && y == op->y && op->map == m) 1589 if (x == op->x && y == op->y && op->map == m)
1619 flag = INS_BELOW_ORIGINATOR; 1590 flag = INS_BELOW_ORIGINATOR;
1620 1591
1621 if (small_nuggets) 1592 if (small_nuggets)
1622 { 1593 {
1623 tmp = small->clone (); 1594 object *tmp = small->clone ();
1624 tmp->nrof = small_nuggets; 1595 tmp->nrof = small_nuggets;
1625 m->insert (tmp, x, y, op, flag); 1596 m->insert (tmp, x, y, op, flag);
1626 } 1597 }
1627 1598
1628 if (large_nuggets) 1599 if (large_nuggets)
1629 { 1600 {
1630 tmp = large->clone (); 1601 object *tmp = large->clone ();
1631 tmp->nrof = large_nuggets; 1602 tmp->nrof = large_nuggets;
1632 m->insert (tmp, x, y, op, flag); 1603 m->insert (tmp, x, y, op, flag);
1633 } 1604 }
1605
1606 if (object *pl = m->at (x, y).player ())
1607 if (pl->contr->ns)
1608 pl->contr->ns->look_position = 0;
1634} 1609}
1635 1610
1636int 1611int
1637alchemy (object *op, object *caster, object *spell_ob) 1612alchemy (object *op, object *caster, object *spell_ob)
1638{ 1613{
1639 int x, y, weight = 0, weight_max, large_nuggets, small_nuggets, mflags;
1640 sint16 nx, ny;
1641 object *next, *tmp;
1642 maptile *mp;
1643
1644 if (op->type != PLAYER) 1614 if (op->type != PLAYER)
1645 return 0; 1615 return 0;
1646 1616
1617 object *large = get_archetype ("largenugget");
1618 object *small = get_archetype ("smallnugget");
1619
1647 /* Put a maximum weight of items that can be alchemied. Limits the power 1620 /* Put a maximum weight of items that can be alchemised. Limits the power
1648 * some, and also prevents people from alcheming every table/chair/clock 1621 * some, and also prevents people from alchemising every table/chair/clock
1649 * in sight 1622 * in sight
1650 */ 1623 */
1651 weight_max = spell_ob->duration + +SP_level_duration_adjust (caster, spell_ob); 1624 int duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob);
1652 weight_max *= 1000; 1625 int weight_max = duration * 1000;
1653 small = get_archetype ("smallnugget"), large = get_archetype ("largenugget"); 1626 uint64 value_max = duration * 1000;
1654 1627
1628 int weight = 0;
1629
1655 for (y = op->y - 1; y <= op->y + 1; y++) 1630 for (int y = op->y - 1; y <= op->y + 1; y++)
1656 { 1631 {
1657 for (x = op->x - 1; x <= op->x + 1; x++) 1632 for (int x = op->x - 1; x <= op->x + 1; x++)
1658 { 1633 {
1634 uint64 value = 0;
1635
1659 nx = x; 1636 sint16 nx = x;
1660 ny = y; 1637 sint16 ny = y;
1661 1638
1662 mp = op->map; 1639 maptile *mp = op->map;
1663 1640
1664 mflags = get_map_flags (mp, &mp, nx, ny, &nx, &ny); 1641 int mflags = get_map_flags (mp, &mp, nx, ny, &nx, &ny);
1665 1642
1666 if (mflags & (P_OUT_OF_MAP | P_NO_MAGIC)) 1643 if (mflags & (P_OUT_OF_MAP | P_NO_MAGIC))
1667 continue; 1644 continue;
1668 1645
1669 /* Treat alchemy a little differently - most spell effects 1646 /* Treat alchemy a little differently - most spell effects
1671 * ground level effect. 1648 * ground level effect.
1672 */ 1649 */
1673 if (GET_MAP_MOVE_BLOCK (mp, nx, ny) & MOVE_WALK) 1650 if (GET_MAP_MOVE_BLOCK (mp, nx, ny) & MOVE_WALK)
1674 continue; 1651 continue;
1675 1652
1676 small_nuggets = 0; 1653 for (object *next, *tmp = mp->at (nx, ny).bot; tmp; tmp = next)
1677 large_nuggets = 0;
1678
1679 for (tmp = GET_MAP_OB (mp, nx, ny); tmp != NULL; tmp = next)
1680 { 1654 {
1681 next = tmp->above; 1655 next = tmp->above;
1656
1682 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) && 1657 if (tmp->weight > 0 && !QUERY_FLAG (tmp, FLAG_NO_PICK) &&
1683 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON)) 1658 !QUERY_FLAG (tmp, FLAG_ALIVE) && !QUERY_FLAG (tmp, FLAG_IS_CAULDRON))
1684 { 1659 {
1685
1686 if (tmp->inv) 1660 if (tmp->inv)
1687 { 1661 {
1688 object *next1, *tmp1; 1662 object *next1, *tmp1;
1689 1663
1690 for (tmp1 = tmp->inv; tmp1 != NULL; tmp1 = next1) 1664 for (tmp1 = tmp->inv; tmp1; tmp1 = next1)
1691 { 1665 {
1692 next1 = tmp1->below; 1666 next1 = tmp1->below;
1693 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) && 1667 if (tmp1->weight > 0 && !QUERY_FLAG (tmp1, FLAG_NO_PICK) &&
1694 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON)) 1668 !QUERY_FLAG (tmp1, FLAG_ALIVE) && !QUERY_FLAG (tmp1, FLAG_IS_CAULDRON))
1695 alchemy_object (tmp1, &small_nuggets, &large_nuggets, &weight); 1669 alchemy_object (tmp1, value, weight);
1696 } 1670 }
1697 } 1671 }
1672
1698 alchemy_object (tmp, &small_nuggets, &large_nuggets, &weight); 1673 alchemy_object (tmp, value, weight);
1699 1674
1700 if (weight > weight_max) 1675 if (weight > weight_max)
1701 { 1676 break;
1702 update_map (op, mp, small_nuggets, large_nuggets, nx, ny);
1703 large->destroy ();
1704 small->destroy ();
1705 return 1;
1706 } 1677 }
1707 } /* is alchemable object */ 1678 }
1708 } /* process all objects on this space */ 1679
1680 value = min (value, value_max);
1681
1682 uint64 count = value / large->value;
1683 int large_nuggets = count;
1684 value -= count * large->value;
1685
1686 count = value / small->value;
1687 int small_nuggets = count;
1709 1688
1710 /* Insert all the nuggets at one time. This probably saves time, but 1689 /* Insert all the nuggets at one time. This probably saves time, but
1711 * it also prevents us from alcheming nuggets that were just created 1690 * it also prevents us from alcheming nuggets that were just created
1712 * with this spell. 1691 * with this spell.
1713 */ 1692 */
1714 update_map (op, mp, small_nuggets, large_nuggets, nx, ny); 1693 update_map (op, mp, small_nuggets, small, large_nuggets, large, nx, ny);
1715 }
1716 }
1717 1694
1695 if (weight > weight_max)
1696 goto bailout;
1697 }
1698 }
1699
1700bailout:
1718 large->destroy (); 1701 large->destroy ();
1719 small->destroy (); 1702 small->destroy ();
1720 /* reset this so that if player standing on a big pile of stuff,
1721 * it is redrawn properly.
1722 */
1723 op->contr->ns->look_position = 0;
1724 return 1; 1703 return 1;
1725} 1704}
1726 1705
1727 1706
1728/* This function removes the cursed/damned status on equipped 1707/* This function removes the cursed/damned status on equipped
1755 } 1734 }
1756 1735
1757 if (op->type == PLAYER) 1736 if (op->type == PLAYER)
1758 { 1737 {
1759 if (success) 1738 if (success)
1760 {
1761 new_draw_info (NDI_UNIQUE, 0, op, "You feel like some of your items are looser now."); 1739 new_draw_info (NDI_UNIQUE, 0, op, "You feel like some of your items are looser now.");
1762 }
1763 else 1740 else
1764 { 1741 {
1765 if (was_one) 1742 if (was_one)
1766 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse."); 1743 new_draw_info (NDI_UNIQUE, 0, op, "You failed to remove the curse.");
1767 else 1744 else
2343 /* create the golem object */ 2320 /* create the golem object */
2344 tmp = arch_to_object (spell->other_arch); 2321 tmp = arch_to_object (spell->other_arch);
2345 2322
2346 /* if animated by a player, give the player control of the golem */ 2323 /* if animated by a player, give the player control of the golem */
2347 CLEAR_FLAG (tmp, FLAG_MONSTER); 2324 CLEAR_FLAG (tmp, FLAG_MONSTER);
2348 SET_FLAG (tmp, FLAG_FRIENDLY);
2349 tmp->stats.exp = 0; 2325 tmp->stats.exp = 0;
2350 add_friendly_object (tmp); 2326 add_friendly_object (tmp);
2351 tmp->type = GOLEM; 2327 tmp->type = GOLEM;
2352 tmp->set_owner (op); 2328 tmp->set_owner (op);
2353 set_spell_skill (op, caster, spell, tmp); 2329 set_spell_skill (op, caster, spell, tmp);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines