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.45 by root, Mon Apr 16 06:23:43 2007 UTC vs.
Revision 1.52 by root, Thu May 17 14:14:55 2007 UTC

1/* 1/*
2 * CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game
3 * 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
7 * 7 *
585 new_draw_info (NDI_UNIQUE, 0, op, "You feel very mundane"); 585 new_draw_info (NDI_UNIQUE, 0, op, "You feel very mundane");
586 else 586 else
587 { 587 {
588 new_draw_info (NDI_UNIQUE, 0, op, "You have:"); 588 new_draw_info (NDI_UNIQUE, 0, op, "You have:");
589 new_draw_info (NDI_UNIQUE, 0, op, cp); 589 new_draw_info (NDI_UNIQUE, 0, op, cp);
590
590 if (tmp != NULL) 591 if (tmp)
591 {
592 for (i = 0; i < NUM_STATS; i++) 592 for (i = 0; i < NUM_STATS; i++)
593 { 593 if (tmp->stats.stat (i) < 0)
594 if (get_attr_value (&tmp->stats, i) < 0)
595 {
596 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is depleted by %d", statname[i], -(get_attr_value (&tmp->stats, i))); 594 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s is depleted by %d", statname[i], -tmp->stats.stat (i));
597 }
598 }
599 }
600 } 595 }
601 596
602 if (is_dragon_pl (op)) 597 if (is_dragon_pl (op))
603 { 598 {
604 /* now grab the 'dragon_ability'-force from the player's inventory */ 599 /* now grab the 'dragon_ability'-force from the player's inventory */
644 archetype *perm_portal; 639 archetype *perm_portal;
645 char portal_name[1024], portal_message[1024]; 640 char portal_name[1024], portal_message[1024];
646 maptile *exitmap; 641 maptile *exitmap;
647 int op_level; 642 int op_level;
648 643
649 /* Check to see if the map the player is currently on is a per player unique
650 * map. This can be determined in that per player unique maps have the
651 * full pathname listed.
652 */
653 if (!strncmp (op->map->path, settings.localdir, strlen (settings.localdir)) && settings.create_home_portals != TRUE)
654 {
655 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You can't cast that here.\n");
656 return 0;
657 }
658
659 /* The first thing to do is to check if we have a marked destination 644 /* The first thing to do is to check if we have a marked destination
660 * dummy is used to make a check inventory for the force 645 * dummy is used to make a check inventory for the force
661 */ 646 */
662 dummy = arch_to_object (spell->other_arch); 647 dummy = arch_to_object (spell->other_arch);
663 if (dummy == NULL) 648 if (dummy == NULL)
678 */ 663 */
679 dummy->name = op->map->path; 664 dummy->name = op->map->path;
680 EXIT_X (dummy) = op->x; 665 EXIT_X (dummy) = op->x;
681 EXIT_Y (dummy) = op->y; 666 EXIT_Y (dummy) = op->y;
682 insert_ob_in_ob (dummy, op); 667 insert_ob_in_ob (dummy, op);
683 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You fix this place in your mind.\nYou feel you are able to come here from anywhere."); 668 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You fix this place in your mind. You feel you are able to come here from anywhere.");
684 return 1; 669 return 1;
685 } 670 }
686 671
687 dummy->destroy (); 672 dummy->destroy ();
688 673
760 exitmap = maptile::find_sync (force->name); 745 exitmap = maptile::find_sync (force->name);
761 746
762 /* If we were unable to load (ex. random map deleted), warn player */ 747 /* If we were unable to load (ex. random map deleted), warn player */
763 if (!exitmap) 748 if (!exitmap)
764 { 749 {
765 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens.\nYou can't remember where to go!?"); 750 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Something strange happens. You can't remember where to go!?");
766 force->destroy (); 751 force->destroy ();
767 return 1; 752 return 1;
768 } 753 }
769 754
770 exitmap->load_sync (); 755 exitmap->load_sync ();
771 756
772 op_level = caster_level (caster, spell); 757 op_level = caster_level (caster, spell);
773 if (op_level < 15) 758 if (op_level < 15)
774 snprintf (portal_message, 1024, 759 snprintf (portal_message, 1024,
775 "\nThe air moves around you and\na huge smell of ammonia\nsurounds you as you pass\nthrough %s's tiny portal\nPouah!\n", 760 "The air moves around you and a huge smell of ammonia surounds you as you pass through %s's tiny portal. Pouah!\n",
776 &op->name); 761 &op->name);
777 else if (op_level < 30) 762 else if (op_level < 30)
778 snprintf (portal_message, 1024, 763 snprintf (portal_message, 1024,
779 "\n%s's portal smells of ozone.\nYou do a lot of movements and finally pass\nthrough the small hole in the air\n", &op->name); 764 "%s's portal smells of ozone. You do a lot of movements and finally pass through the small hole in the air\n", &op->name);
780 else if (op_level < 60) 765 else if (op_level < 60)
781 snprintf (portal_message, 1024, "\nA shining door opens in the air in front of you,\nshowing you the path to another place.\n"); 766 snprintf (portal_message, 1024, "A shining door opens in the air in front of you, showing you the path to another place.\n");
782 else 767 else
783 snprintf (portal_message, 1024, "\nAs you walk through %s's portal, flowers come out\nfrom the ground around you.\nYou feel awed.\n", 768 snprintf (portal_message, 1024, "As you walk through %s's portal, flowers come out from the ground around you. You feel awed.\n",
784 &op->name); 769 &op->name);
785 770
786 /* Create a portal in front of player 771 /* Create a portal in front of player
787 * dummy contain the portal and 772 * dummy contain the portal and
788 * force contain the track to kill it later 773 * force contain the track to kill it later
1368 if (tmp->type == PLAYER) 1353 if (tmp->type == PLAYER)
1369 { 1354 {
1370 /* Stat adjustment spells */ 1355 /* Stat adjustment spells */
1371 for (i = 0; i < NUM_STATS; i++) 1356 for (i = 0; i < NUM_STATS; i++)
1372 { 1357 {
1373 sint8 stat = get_attr_value (&spell_ob->stats, i), k, sm; 1358 if (sint8 stat = spell_ob->stats.stat (i))
1374
1375 if (stat)
1376 { 1359 {
1377 sm = 0; 1360 sint8 sm = 0;
1378 for (k = 0; k < stat; k++) 1361 for (sint8 k = 0; k < stat; k++)
1379 sm += rndm (1, 3); 1362 sm += rndm (1, 3);
1380 1363
1381 if ((get_attr_value (&tmp->stats, i) + sm) > (15 + 5 * stat)) 1364 if (tmp->stats.stat (i) + sm > 15 + 5 * stat)
1382 { 1365 sm = max (0, (15 + 5 * stat) - tmp->stats.stat (i));
1383 sm = (15 + 5 * stat) - get_attr_value (&tmp->stats, i); 1366
1384 if (sm < 0) 1367 force->stats.stat (i) = sm;
1385 sm = 0; 1368
1386 }
1387 set_attr_value (&force->stats, i, sm);
1388 if (!sm) 1369 if (!sm)
1389 new_draw_info (NDI_UNIQUE, 0, op, no_gain_msgs[i]); 1370 new_draw_info (NDI_UNIQUE, 0, op, no_gain_msgs[i]);
1390 } 1371 }
1391 } 1372 }
1392 } 1373 }
1764 { 1745 {
1765 identify (tmp); 1746 identify (tmp);
1766 1747
1767 if (op->type == PLAYER) 1748 if (op->type == PLAYER)
1768 { 1749 {
1769 new_draw_info_format (NDI_UNIQUE, 0, op, "You have %s.", long_desc (tmp, op)); 1750 new_draw_info_format (NDI_UNIQUE, 0, op, "You identified: %s.", long_desc (tmp, op));
1770 1751
1771 if (tmp->msg) 1752 if (tmp->msg)
1772 { 1753 {
1773 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); 1754 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:");
1774 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); 1755 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg);
1786 * stuff on the floor. Only identify stuff on the floor if the spell 1767 * stuff on the floor. Only identify stuff on the floor if the spell
1787 * was not fully used. 1768 * was not fully used.
1788 */ 1769 */
1789 if (num_ident) 1770 if (num_ident)
1790 { 1771 {
1791 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 1772 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above)
1792 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp)) 1773 if (!QUERY_FLAG (tmp, FLAG_IDENTIFIED) && !tmp->invisible && need_identify (tmp))
1793 { 1774 {
1794 identify (tmp); 1775 identify (tmp);
1795 1776
1796 if (op->type == PLAYER) 1777 if (op->type == PLAYER)
1797 { 1778 {
1798 new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground is %s.", long_desc (tmp, op)); 1779 new_draw_info_format (NDI_UNIQUE, 0, op, "On the ground you identified: %s.", long_desc (tmp, op));
1799 1780
1800 if (tmp->msg) 1781 if (tmp->msg)
1801 { 1782 {
1802 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:"); 1783 new_draw_info (NDI_UNIQUE, 0, op, "The item has a story:");
1803 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg); 1784 new_draw_info (NDI_UNIQUE, 0, op, tmp->msg);
2243 * This code was very odd - code early on would only let players use the spell, 2224 * This code was very odd - code early on would only let players use the spell,
2244 * yet the code wass full of player checks. I've presumed that the code 2225 * yet the code wass full of player checks. I've presumed that the code
2245 * that only let players use it was correct, and removed all the other 2226 * that only let players use it was correct, and removed all the other
2246 * player checks. MSW 2003-01-06 2227 * player checks. MSW 2003-01-06
2247 */ 2228 */
2248
2249int 2229int
2250animate_weapon (object *op, object *caster, object *spell, int dir) 2230animate_weapon (object *op, object *caster, object *spell, int dir)
2251{ 2231{
2252 object *weapon, *tmp; 2232 object *weapon, *tmp;
2253 char buf[MAX_BUF]; 2233 char buf[MAX_BUF];
2265 /* exit if it's not a player using this spell. */ 2245 /* exit if it's not a player using this spell. */
2266 if (op->type != PLAYER) 2246 if (op->type != PLAYER)
2267 return 0; 2247 return 0;
2268 2248
2269 /* if player already has a golem, abort */ 2249 /* if player already has a golem, abort */
2270 if (op->contr->ranges[range_golem]) 2250 if (object *golem = op->contr->golem)
2271 { 2251 {
2272 control_golem (op->contr->ranges[range_golem], dir); 2252 control_golem (golem, dir);
2273 return 0; 2253 return 0;
2274 } 2254 }
2275 2255
2276 /* if no direction specified, pick one */ 2256 /* if no direction specified, pick one */
2277 if (!dir) 2257 if (!dir)
2327 CLEAR_FLAG (tmp, FLAG_MONSTER); 2307 CLEAR_FLAG (tmp, FLAG_MONSTER);
2328 tmp->stats.exp = 0; 2308 tmp->stats.exp = 0;
2329 add_friendly_object (tmp); 2309 add_friendly_object (tmp);
2330 tmp->type = GOLEM; 2310 tmp->type = GOLEM;
2331 tmp->set_owner (op); 2311 tmp->set_owner (op);
2312 op->contr->golem = tmp;
2332 set_spell_skill (op, caster, spell, tmp); 2313 set_spell_skill (op, caster, spell, tmp);
2333 op->contr->ranges[range_golem] = tmp;
2334 op->contr->shoottype = range_golem;
2335 2314
2336 /* Give the weapon to the golem now. A bit of a hack to check the 2315 /* Give the weapon to the golem now. A bit of a hack to check the
2337 * removed flag - it should only be set if get_split_object was 2316 * removed flag - it should only be set if get_split_object was
2338 * used above. 2317 * used above.
2339 */ 2318 */
2340 if (!QUERY_FLAG (weapon, FLAG_REMOVED)) 2319 if (!QUERY_FLAG (weapon, FLAG_REMOVED))
2341 weapon->remove (); 2320 weapon->remove ();
2321
2342 insert_ob_in_ob (weapon, tmp); 2322 insert_ob_in_ob (weapon, tmp);
2343 esrv_send_item (op, weapon); 2323 esrv_send_item (op, weapon);
2344 /* To do everything necessary to let a golem use the weapon is a pain, 2324 /* To do everything necessary to let a golem use the weapon is a pain,
2345 * so instead, just set it as equipped (otherwise, we need to update 2325 * so instead, just set it as equipped (otherwise, we need to update
2346 * body_info, skills, etc) 2326 * body_info, skills, etc)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines