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.25 by root, Tue Dec 26 20:04:09 2006 UTC vs.
Revision 1.41 by root, Sat Jun 9 21:16:12 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
4 Copyright (C) 2002-2003 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002-2003,2007 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * Crossfire TRT is free software; you can redistribute it and/or modify it
8 it under the terms of the GNU General Public License as published by 9 * under the terms of the GNU General Public License as published by the Free
9 the Free Software Foundation; either version 2 of the License, or 10 * Software Foundation; either version 2 of the License, or (at your option)
10 (at your option) any later version. 11 * 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, but
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 GNU General Public License for more details. 16 * 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 along
18 along with this program; if not, write to the Free Software 19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 to <crossfire@schmorp.de>
22*/ 23 */
23 24
24/* This file contains all the spell attack code. Grouping this code 25/* This file contains all the spell attack code. Grouping this code
25 * together should hopefully make it easier to find the relevent bits 26 * together should hopefully make it easier to find the relevent bits
26 * of code 27 * of code
27 */ 28 */
144 145
145 /* reduce chances of subsequent forking */ 146 /* reduce chances of subsequent forking */
146 new_bolt->stats.Dex -= 10; 147 new_bolt->stats.Dex -= 10;
147 tmp->stats.Dex -= 10; /* less forks from main bolt too */ 148 tmp->stats.Dex -= 10; /* less forks from main bolt too */
148 new_bolt->stats.Con += 25 * new_dir; /* adjust the left bias */ 149 new_bolt->stats.Con += 25 * new_dir; /* adjust the left bias */
149 new_bolt->speed_left = -0.1; 150 new_bolt->speed_left = -0.1f;
150 new_bolt->direction = t_dir; 151 new_bolt->direction = t_dir;
151 new_bolt->duration++; 152 new_bolt->duration++;
152 new_bolt->stats.dam /= 2; /* reduce daughter bolt damage */ 153 new_bolt->stats.dam /= 2; /* reduce daughter bolt damage */
153 new_bolt->stats.dam++; 154 new_bolt->stats.dam++;
154 tmp->stats.dam /= 2; /* reduce father bolt damage */ 155 tmp->stats.dam /= 2; /* reduce father bolt damage */
162 */ 163 */
163 164
164void 165void
165move_bolt (object *op) 166move_bolt (object *op)
166{ 167{
167 object *tmp;
168 int mflags; 168 int mflags;
169 sint16 x, y; 169 sint16 x, y;
170 maptile *m; 170 maptile *m;
171 171
172 if (--op->duration < 0) 172 if (--op->duration < 0)
245 else 245 else
246 { /* Create a copy of this object and put it ahead */ 246 { /* Create a copy of this object and put it ahead */
247 object *tmp = op->clone (); 247 object *tmp = op->clone ();
248 248
249 m->insert (tmp, x, y, op); 249 m->insert (tmp, x, y, op);
250 tmp->speed_left = -0.1; 250 tmp->speed_left = -0.1f;
251 /* To make up for the decrease at the top of the function */ 251 /* To make up for the decrease at the top of the function */
252 tmp->duration++; 252 tmp->duration++;
253 253
254 /* New forking code. Possibly create forks of this object 254 /* New forking code. Possibly create forks of this object
255 * going off in other directions. 255 * going off in other directions.
337 move_bolt (tmp); 337 move_bolt (tmp);
338 338
339 return 1; 339 return 1;
340} 340}
341 341
342
343
344/*************************************************************************** 342/***************************************************************************
345 * 343 *
346 * BULLET/BALL CODE 344 * BULLET/BALL CODE
347 * 345 *
348 ***************************************************************************/ 346 ***************************************************************************/
380 if (ok_to_put_more (op->map, dx, dy, op, op->attacktype)) 378 if (ok_to_put_more (op->map, dx, dy, op, op->attacktype))
381 { 379 {
382 object *tmp = op->clone (); 380 object *tmp = op->clone ();
383 381
384 tmp->state = 0; 382 tmp->state = 0;
385 tmp->speed_left = -0.21; 383 tmp->speed_left = -0.21f;
386 tmp->range--; 384 tmp->range--;
387 tmp->value = 0; 385 tmp->value = 0;
388 386
389 m->insert (tmp, dx, dy, op); 387 m->insert (tmp, dx, dy, op);
390 } 388 }
391 } 389 }
392 } 390 }
393} 391}
394
395 392
396/* Causes an object to explode, eg, a firebullet, 393/* Causes an object to explode, eg, a firebullet,
397 * poison cloud ball, etc. op is the object to 394 * poison cloud ball, etc. op is the object to
398 * explode. 395 * explode.
399 */ 396 */
518 515
519 /* If nothing alive on this space, no reason to do anything further */ 516 /* If nothing alive on this space, no reason to do anything further */
520 if (!(mflags & P_IS_ALIVE)) 517 if (!(mflags & P_IS_ALIVE))
521 return; 518 return;
522 519
523 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 520 for (tmp = op->ms ().bot; tmp; tmp = tmp->above)
524 { 521 {
525 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 522 if (QUERY_FLAG (tmp, FLAG_ALIVE))
526 { 523 {
527 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1); 524 dam = hit_player (tmp, op->stats.dam, op, op->attacktype, 1);
528 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0) 525 if (op->destroyed () || !tmp->destroyed () || (op->stats.dam -= dam) < 0)
604 } 601 }
605 else 602 else
606 check_bullet (op); 603 check_bullet (op);
607} 604}
608 605
609
610
611
612/* fire_bullet 606/* fire_bullet
613 * object op (cast from caster) files a bolt in dir. 607 * object op (cast from caster) files a bolt in dir.
614 * spob is the spell object for the bolt. 608 * spob is the spell object for the bolt.
615 * we remove the magic flag - that can be derived from 609 * we remove the magic flag - that can be derived from
616 * spob->attacktype. 610 * spob->attacktype.
617 * This function sets up the appropriate owner and skill 611 * This function sets up the appropriate owner and skill
618 * pointers. 612 * pointers.
619 */ 613 */
620
621int 614int
622fire_bullet (object *op, object *caster, int dir, object *spob) 615fire_bullet (object *op, object *caster, int dir, object *spob)
623{ 616{
624 object *tmp = NULL; 617 object *tmp = NULL;
625 int mflags; 618 int mflags;
683 check_bullet (tmp); 676 check_bullet (tmp);
684 677
685 return 1; 678 return 1;
686} 679}
687 680
688
689
690
691/***************************************************************************** 681/*****************************************************************************
692 * 682 *
693 * CONE RELATED FUNCTIONS 683 * CONE RELATED FUNCTIONS
694 * 684 *
695 *****************************************************************************/ 685 *****************************************************************************/
696
697 686
698/* drops an object based on what is in the cone's "other_arch" */ 687/* drops an object based on what is in the cone's "other_arch" */
699void 688void
700cone_drop (object *op) 689cone_drop (object *op)
701{ 690{
827 816
828 /* Need to know what the movetype of the object we are about 817 /* Need to know what the movetype of the object we are about
829 * to create is, so we can know if the space we are about to 818 * to create is, so we can know if the space we are about to
830 * insert it into is blocked. 819 * insert it into is blocked.
831 */ 820 */
832 movetype = spell->other_arch->clone.move_type; 821 movetype = spell->other_arch->move_type;
833 822
834 for (i = range_min; i <= range_max; i++) 823 for (i = range_min; i <= range_max; i++)
835 { 824 {
836 sint16 x, y, d; 825 sint16 x, y, d;
837 826
916 else 905 else
917 tmp->duration += caster->level / 3; 906 tmp->duration += caster->level / 3;
918 } 907 }
919 908
920 if (!(tmp->move_type & MOVE_FLY_LOW)) 909 if (!(tmp->move_type & MOVE_FLY_LOW))
921 LOG (llevDebug, "cast_cone(): arch %s doesn't have flying 1\n", &spell->other_arch->name); 910 LOG (llevDebug, "cast_cone(): arch %s doesn't have flying 1\n", &spell->other_arch->archname);
922 911
923 if (!tmp->move_on && tmp->stats.dam) 912 if (!tmp->move_on && tmp->stats.dam)
924 LOG (llevDebug, "cast_cone(): arch %s doesn't have move_on set\n", &spell->other_arch->name); 913 LOG (llevDebug, "cast_cone(): arch %s doesn't have move_on set\n", &spell->other_arch->archname);
925 914
926 m->insert (tmp, sx, sy, op); 915 m->insert (tmp, sx, sy, op);
927 916
928 /* This is used for tracking spells so that one effect doesn't hit 917 /* This is used for tracking spells so that one effect doesn't hit
929 * a single space too many times. 918 * a single space too many times.
940/**************************************************************************** 929/****************************************************************************
941 * 930 *
942 * BOMB related code 931 * BOMB related code
943 * 932 *
944 ****************************************************************************/ 933 ****************************************************************************/
945
946 934
947/* This handles an exploding bomb. 935/* This handles an exploding bomb.
948 * op is the original bomb object. 936 * op is the original bomb object.
949 */ 937 */
950void 938void
1054 * dir is the direction to look in. 1042 * dir is the direction to look in.
1055 * range is how far out to look. 1043 * range is how far out to look.
1056 * type is the type of spell - either SPELL_MANA or SPELL_GRACE. 1044 * type is the type of spell - either SPELL_MANA or SPELL_GRACE.
1057 * this info is used for blocked magic/unholy spaces. 1045 * this info is used for blocked magic/unholy spaces.
1058 */ 1046 */
1059
1060object * 1047object *
1061get_pointed_target (object *op, int dir, int range, int type) 1048get_pointed_target (object *op, int dir, int range, int type)
1062{ 1049{
1063 object *target; 1050 object *target;
1064 sint16 x, y; 1051 sint16 x, y;
1083 return NULL; 1070 return NULL;
1084 if (GET_MAP_MOVE_BLOCK (mp, x, y) & MOVE_FLY_LOW) 1071 if (GET_MAP_MOVE_BLOCK (mp, x, y) & MOVE_FLY_LOW)
1085 return NULL; 1072 return NULL;
1086 1073
1087 if (mflags & P_IS_ALIVE) 1074 if (mflags & P_IS_ALIVE)
1088 {
1089 for (target = GET_MAP_OB (mp, x, y); target; target = target->above) 1075 for (target = GET_MAP_OB (mp, x, y); target; target = target->above)
1090 { 1076 if (QUERY_FLAG (target, FLAG_MONSTER))
1091 if (QUERY_FLAG (target->head ? target->head : target, FLAG_MONSTER))
1092 {
1093 return target; 1077 return target;
1094 }
1095 }
1096 }
1097 } 1078 }
1079
1098 return NULL; 1080 return NULL;
1099} 1081}
1100
1101 1082
1102/* cast_smite_arch() - the priest points to a creature and causes 1083/* cast_smite_arch() - the priest points to a creature and causes
1103 * a 'godly curse' to decend. 1084 * a 'godly curse' to decend.
1104 * usual params - 1085 * usual params -
1105 * op = player 1086 * op = player
1307 return 0; 1288 return 0;
1308 } 1289 }
1309 return 1; 1290 return 1;
1310} 1291}
1311 1292
1312
1313
1314
1315int 1293int
1316cast_destruction (object *op, object *caster, object *spell_ob) 1294cast_destruction (object *op, object *caster, object *spell_ob)
1317{ 1295{
1318 int i, j, range, mflags, friendly = 0, dam, dur; 1296 int i, j, range, mflags, friendly = 0, dam, dur;
1319 sint16 sx, sy; 1297 sint16 sx, sy;
1339 else if (caster->skill) 1317 else if (caster->skill)
1340 op->skill = caster->skill; 1318 op->skill = caster->skill;
1341 else 1319 else
1342 op->skill = NULL; 1320 op->skill = NULL;
1343 1321
1344 change_skill (op, find_skill_by_name (op, op->skill), 1); 1322 op->change_skill (find_skill_by_name (op, op->skill));
1345 1323
1346 for (i = -range; i < range; i++) 1324 for (i = -range; i < range; i++)
1347 { 1325 {
1348 for (j = -range; j < range; j++) 1326 for (j = -range; j < range; j++)
1349 { 1327 {
1453 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect."); 1431 new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect.");
1454 } 1432 }
1455 return 1; 1433 return 1;
1456 } 1434 }
1457 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50; 1435 force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
1458 force->speed = 1.0; 1436 force->speed = 1.f;
1459 force->speed_left = -1.0; 1437 force->speed_left = -1.f;
1460 SET_FLAG (force, FLAG_APPLIED); 1438 SET_FLAG (force, FLAG_APPLIED);
1461 1439
1462 if (god) 1440 if (god)
1463 { 1441 {
1464 if (spell_ob->last_grace) 1442 if (spell_ob->last_grace)
1481 insert_ob_in_ob (force, tmp); 1459 insert_ob_in_ob (force, tmp);
1482 tmp->update_stats (); 1460 tmp->update_stats ();
1483 return 1; 1461 return 1;
1484 1462
1485} 1463}
1486
1487 1464
1488/********************************************************************** 1465/**********************************************************************
1489 * mood change 1466 * mood change
1490 * Arguably, this may or may not be an attack spell. But since it 1467 * Arguably, this may or may not be an attack spell. But since it
1491 * effects monsters, it seems best to put it into this file 1468 * effects monsters, it seems best to put it into this file
1521 else if (god && !strcmp (spell->race, "GOD_FRIEND")) 1498 else if (god && !strcmp (spell->race, "GOD_FRIEND"))
1522 race = god->race; 1499 race = god->race;
1523 else 1500 else
1524 race = spell->race; 1501 race = spell->race;
1525 1502
1526
1527 for (x = op->x - range; x <= op->x + range; x++) 1503 for (x = op->x - range; x <= op->x + range; x++)
1528 for (y = op->y - range; y <= op->y + range; y++) 1504 for (y = op->y - range; y <= op->y + range; y++)
1529 { 1505 {
1530
1531 done_one = 0; 1506 done_one = 0;
1532 m = op->map; 1507 m = op->map;
1533 nx = x; 1508 nx = x;
1534 ny = y; 1509 ny = y;
1535 mflags = get_map_flags (m, &m, x, y, &nx, &ny); 1510 mflags = get_map_flags (m, &m, x, y, &nx, &ny);
1538 1513
1539 /* If there is nothing living on this space, no need to go further */ 1514 /* If there is nothing living on this space, no need to go further */
1540 if (!(mflags & P_IS_ALIVE)) 1515 if (!(mflags & P_IS_ALIVE))
1541 continue; 1516 continue;
1542 1517
1518 // players can only affect spaces that they can actually see
1519 if (caster && caster->contr
1520 && caster->contr->visibility_at (m, nx, ny) < 70)
1521 continue;
1522
1543 for (tmp = GET_MAP_OB (m, nx, ny); tmp; tmp = tmp->above) 1523 for (tmp = GET_MAP_TOP (m, nx, ny); tmp; tmp = tmp->below)
1544 if (QUERY_FLAG (tmp, FLAG_MONSTER)) 1524 if (QUERY_FLAG (tmp, FLAG_MONSTER))
1545 break; 1525 break;
1546 1526
1547 /* There can be living objects that are not monsters */ 1527 /* There can be living objects that are not monsters */
1548 if (!tmp || tmp->type == PLAYER) 1528 if (!tmp || tmp->type == PLAYER)
1555 head = tmp; 1535 head = tmp;
1556 1536
1557 /* Make sure the race is OK. Likewise, only effect undead if spell specifically allows it */ 1537 /* Make sure the race is OK. Likewise, only effect undead if spell specifically allows it */
1558 if (race && head->race && !strstr (race, head->race)) 1538 if (race && head->race && !strstr (race, head->race))
1559 continue; 1539 continue;
1540
1560 if (QUERY_FLAG (head, FLAG_UNDEAD) && !QUERY_FLAG (spell, FLAG_UNDEAD)) 1541 if (QUERY_FLAG (head, FLAG_UNDEAD) && !QUERY_FLAG (spell, FLAG_UNDEAD))
1561 continue; 1542 continue;
1562 1543
1563 /* Now do a bunch of stuff related to saving throws */ 1544 /* Now do a bunch of stuff related to saving throws */
1564 best_at = -1; 1545 best_at = -1;
1581 at -= level / 5; 1562 at -= level / 5;
1582 if (did_make_save (head, head->level, at)) 1563 if (did_make_save (head, head->level, at))
1583 continue; 1564 continue;
1584 } 1565 }
1585 else /* spell->attacktype */ 1566 else /* spell->attacktype */
1586 /*
1587 Spell has no attacktype (charm & such), so we'll have a specific saving:
1588 * if spell level < monster level, no go
1589 * else, chance of effect = 20 + min( 50, 2 * ( spell level - monster level ) )
1590
1591 The chance will then be in the range [20-70] percent, not too bad.
1592
1593 This is required to fix the 'charm monster' abuse, where a player level 1 can
1594 charm a level 125 monster...
1595
1596 Ryo, august 14th
1597 */
1598 { 1567 {
1568 /*
1569 Spell has no attacktype (charm & such), so we'll have a specific saving:
1570 * if spell level < monster level, no go
1571 * else, chance of effect = 20 + min( 50, 2 * ( spell level - monster level ) )
1572
1573 The chance will then be in the range [20-70] percent, not too bad.
1574
1575 This is required to fix the 'charm monster' abuse, where a player level 1 can
1576 charm a level 125 monster...
1577
1578 Ryo, august 14th
1579 */
1599 if (head->level > level) 1580 if (head->level > level)
1600 continue; 1581 continue;
1582
1601 if (random_roll (0, 100, caster, PREFER_LOW) >= (20 + MIN (50, 2 * (level - head->level)))) 1583 if (random_roll (0, 100, caster, PREFER_LOW) >= (20 + MIN (50, 2 * (level - head->level))))
1602 /* Failed, no effect */ 1584 /* Failed, no effect */
1603 continue; 1585 continue;
1604 } 1586 }
1605 1587
1606 /* Done with saving throw. Now start effecting the monster */ 1588 /* Done with saving throw. Now start affecting the monster */
1607 1589
1608 /* aggravation */ 1590 /* aggravation */
1609 if (QUERY_FLAG (spell, FLAG_MONSTER)) 1591 if (QUERY_FLAG (spell, FLAG_MONSTER))
1610 { 1592 {
1611 CLEAR_FLAG (head, FLAG_SLEEP); 1593 CLEAR_FLAG (head, FLAG_SLEEP);
1612 if (QUERY_FLAG (head, FLAG_FRIENDLY))
1613 remove_friendly_object (head); 1594 remove_friendly_object (head);
1614
1615 done_one = 1; 1595 done_one = 1;
1616 head->enemy = op; 1596 head->enemy = op;
1617 } 1597 }
1618 1598
1619 /* calm monsters */ 1599 /* calm monsters */
1628 if (QUERY_FLAG (spell, FLAG_BERSERK) && !QUERY_FLAG (head, FLAG_BERSERK)) 1608 if (QUERY_FLAG (spell, FLAG_BERSERK) && !QUERY_FLAG (head, FLAG_BERSERK))
1629 { 1609 {
1630 SET_FLAG (head, FLAG_BERSERK); 1610 SET_FLAG (head, FLAG_BERSERK);
1631 done_one = 1; 1611 done_one = 1;
1632 } 1612 }
1613
1633 /* charm */ 1614 /* charm */
1634 if (QUERY_FLAG (spell, FLAG_NO_ATTACK) && !QUERY_FLAG (head, FLAG_FRIENDLY)) 1615 if (QUERY_FLAG (spell, FLAG_NO_ATTACK) && !QUERY_FLAG (head, FLAG_FRIENDLY))
1635 { 1616 {
1636 SET_FLAG (head, FLAG_FRIENDLY);
1637 /* Prevent uncontolled outbreaks of self replicating monsters. 1617 /* Prevent uncontolled outbreaks of self replicating monsters.
1638 Typical use case is charm, go somwhere, use aggravation to make hostile. 1618 Typical use case is charm, go somwhere, use aggravation to make hostile.
1639 This could lead to fun stuff like mice outbreak in bigworld and server crawl. */ 1619 This could lead to fun stuff like mice outbreak in bigworld and server crawl. */
1640 CLEAR_FLAG (head, FLAG_GENERATOR); 1620 CLEAR_FLAG (head, FLAG_GENERATOR);
1641 head->set_owner (op); 1621 head->set_owner (op);
1719 * if this has an other_arch field, we insert that in 1699 * if this has an other_arch field, we insert that in
1720 * the surround spaces. 1700 * the surround spaces.
1721 */ 1701 */
1722 for (j = 0; j < 9; j++) 1702 for (j = 0; j < 9; j++)
1723 { 1703 {
1724 object *new_ob;
1725
1726 hx = nx + freearr_x[j]; 1704 hx = nx + freearr_x[j];
1727 hy = ny + freearr_y[j]; 1705 hy = ny + freearr_y[j];
1728 1706
1729 m = op->map; 1707 m = op->map;
1730 mflags = get_map_flags (m, &m, hx, hy, &hx, &hy); 1708 mflags = get_map_flags (m, &m, hx, hy, &hx, &hy);
1806#if 0 1784#if 0
1807 // this is bogus: it causes wrong places to be checked below 1785 // this is bogus: it causes wrong places to be checked below
1808 // (a wall 2 cells away will block the effect...) and 1786 // (a wall 2 cells away will block the effect...) and
1809 // doesn't work for SP_BULLET anyhow, so again tests the wrong 1787 // doesn't work for SP_BULLET anyhow, so again tests the wrong
1810 // space. 1788 // space.
1811 // should be fixed later, but correctness before featurs... 1789 // should be fixed later, but correctness before features...
1812 // (schmorp) 1790 // (schmorp)
1813 1791
1814 /* new offset calculation to make swarm element distribution 1792 /* new offset calculation to make swarm element distribution
1815 * more uniform 1793 * more uniform
1816 */ 1794 */
2106 if (disease->stats.sp) 2084 if (disease->stats.sp)
2107 disease->stats.sp -= dam_mod; 2085 disease->stats.sp -= dam_mod;
2108 2086
2109 if (infect_object (walk, disease, 1)) 2087 if (infect_object (walk, disease, 1))
2110 { 2088 {
2111 object *flash; /* visual effect for inflicting disease */
2112
2113 new_draw_info_format (NDI_UNIQUE, 0, op, "You inflict %s on %s!", &disease->name, &walk->name); 2089 new_draw_info_format (NDI_UNIQUE, 0, op, "You inflict %s on %s!", &disease->name, &walk->name);
2114 2090
2115 disease->destroy (); /* don't need this one anymore */ 2091 disease->destroy (); /* don't need this one anymore */
2116 walk->map->insert (get_archetype (ARCH_DETECT_MAGIC), x, y, op); 2092 walk->map->insert (get_archetype ("detect_magic"), x, y, op);
2117 return 1; 2093 return 1;
2118 } 2094 }
2119 2095
2120 disease->destroy (); 2096 disease->destroy ();
2121 } 2097 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines