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

Comparing deliantra/server/common/treasure.C (file contents):
Revision 1.17 by root, Tue Sep 12 18:15:34 2006 UTC vs.
Revision 1.31 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1
2/*
3 * static char *rcs_treasure_c =
4 * "$Id: treasure.C,v 1.17 2006/09/12 18:15:34 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 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
14 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
22 17
23 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
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30#define ALLOWED_COMBINATION 25#define ALLOWED_COMBINATION
31 26
32/* TREASURE_DEBUG does some checking on the treasurelists after loading. 27/* TREASURE_DEBUG does some checking on the treasurelists after loading.
58{ 53{
59 int prev_warn = warn_archetypes; 54 int prev_warn = warn_archetypes;
60 55
61 warn_archetypes = 1; 56 warn_archetypes = 1;
62 if (ring_arch == NULL) 57 if (ring_arch == NULL)
63 ring_arch = find_archetype ("ring"); 58 ring_arch = archetype::find ("ring");
64 if (amulet_arch == NULL) 59 if (amulet_arch == NULL)
65 amulet_arch = find_archetype ("amulet"); 60 amulet_arch = archetype::find ("amulet");
66 if (staff_arch == NULL) 61 if (staff_arch == NULL)
67 staff_arch = find_archetype ("staff"); 62 staff_arch = archetype::find ("staff");
68 if (crown_arch == NULL) 63 if (crown_arch == NULL)
69 crown_arch = find_archetype ("crown"); 64 crown_arch = archetype::find ("crown");
70 warn_archetypes = prev_warn; 65 warn_archetypes = prev_warn;
71} 66}
72 67
73/* 68/*
74 * Allocate and return the pointer to an empty treasurelist structure. 69 * Allocate and return the pointer to an empty treasurelist structure.
119 while (isspace (*cp)) /* Skip blanks */ 114 while (isspace (*cp)) /* Skip blanks */
120 cp++; 115 cp++;
121 116
122 if (sscanf (cp, "arch %s", variable)) 117 if (sscanf (cp, "arch %s", variable))
123 { 118 {
124 if ((t->item = find_archetype (variable)) == NULL) 119 if ((t->item = archetype::find (variable)) == NULL)
125 LOG (llevError, "Treasure lacks archetype: %s\n", variable); 120 LOG (llevError, "Treasure lacks archetype: %s\n", variable);
126 } 121 }
127 else if (sscanf (cp, "list %s", variable)) 122 else if (sscanf (cp, "list %s", variable))
128 t->name = variable; 123 t->name = variable;
129 else if (sscanf (cp, "change_name %s", variable)) 124 else if (sscanf (cp, "change_name %s", variable))
162 * so that the treasure name can be printed out 157 * so that the treasure name can be printed out
163 */ 158 */
164static void 159static void
165check_treasurelist (const treasure *t, const treasurelist * tl) 160check_treasurelist (const treasure *t, const treasurelist * tl)
166{ 161{
167 if (t->item == NULL && t->name == NULL)
168 LOG (llevError, "Treasurelist %s has element with no name or archetype\n", &tl->name);
169 if (t->chance >= 100 && t->next_yes && (t->next || t->next_no)) 162 if (t->chance >= 100 && t->next_yes && (t->next || t->next_no))
170 LOG (llevError, "Treasurelist %s has element that has 100%% generation, next_yes field as well as next or next_no\n", &tl->name); 163 LOG (llevError, "Treasurelist %s has element that has 100%% generation, next_yes field as well as next or next_no\n", &tl->name);
171 /* find_treasurelist will print out its own error message */ 164 /* find_treasurelist will print out its own error message */
172 if (t->name && *t->name) 165 if (t->name && *t->name)
173 (void) find_treasurelist (t->name); 166 find_treasurelist (t->name);
174 if (t->next) 167 if (t->next)
175 check_treasurelist (t->next, tl); 168 check_treasurelist (t->next, tl);
176 if (t->next_yes) 169 if (t->next_yes)
177 check_treasurelist (t->next_yes, tl); 170 check_treasurelist (t->next_yes, tl);
178 if (t->next_no) 171 if (t->next_no)
264 shstr_cmp name_ (name); 257 shstr_cmp name_ (name);
265 258
266 if (!name_) 259 if (!name_)
267 return 0; 260 return 0;
268 261
269 for (treasurelist * tl = first_treasurelist; tl != 0; tl = tl->next) 262 for (treasurelist *tl = first_treasurelist; tl != 0; tl = tl->next)
270 if (name_ == tl->name) 263 if (name_ == tl->name)
271 return tl; 264 return tl;
272 265
273 if (first_treasurelist) 266 if (first_treasurelist)
274 LOG (llevError, "Couldn't find treasurelist %s\n", name); 267 LOG (llevError, "Couldn't find treasurelist %s\n", name);
286 * being generated. 279 * being generated.
287 * If flag is GT_INVISIBLE, only invisible objects are generated (ie, only 280 * If flag is GT_INVISIBLE, only invisible objects are generated (ie, only
288 * abilities. This is used by summon spells, thus no summoned monsters 281 * abilities. This is used by summon spells, thus no summoned monsters
289 * start with equipment, but only their abilities). 282 * start with equipment, but only their abilities).
290 */ 283 */
291
292
293static void 284static void
294put_treasure (object *op, object *creator, int flags) 285put_treasure (object *op, object *creator, int flags)
295{ 286{
296 object *tmp; 287 object *tmp;
297 288
300 * this is the original object, or if this is an object that should be created 291 * this is the original object, or if this is an object that should be created
301 * by another object. 292 * by another object.
302 */ 293 */
303 if (flags & GT_ENVIRONMENT && op->type != SPELL) 294 if (flags & GT_ENVIRONMENT && op->type != SPELL)
304 { 295 {
305 op->x = creator->x;
306 op->y = creator->y;
307 SET_FLAG (op, FLAG_OBJ_ORIGINAL); 296 SET_FLAG (op, FLAG_OBJ_ORIGINAL);
308 insert_ob_in_map (op, creator->map, op, INS_NO_MERGE | INS_NO_WALK_ON); 297 op->insert_at (creator, creator, INS_NO_MERGE | INS_NO_WALK_ON);
309 } 298 }
310 else 299 else
311 { 300 {
312 op = insert_ob_in_ob (op, creator); 301 op = creator->insert (op);
302
313 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER)) 303 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER))
314 monster_check_apply (creator, op); 304 monster_check_apply (creator, op);
305
315 if ((flags & GT_UPDATE_INV) && (tmp = is_player_inv (creator)) != NULL) 306 if ((flags & GT_UPDATE_INV) && (tmp = creator->in_player ()))
316 esrv_send_item (tmp, op); 307 esrv_send_item (tmp, op);
317 } 308 }
318} 309}
319 310
320/* if there are change_xxx commands in the treasure, we include the changes 311/* if there are change_xxx commands in the treasure, we include the changes
344 335
345 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance) 336 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance)
346 { 337 {
347 if (t->name) 338 if (t->name)
348 { 339 {
349 if (strcmp (t->name, "NONE") && difficulty >= t->magic) 340 if (difficulty >= t->magic)
341 {
342 treasurelist *tl = find_treasurelist (t->name);
343 if (tl)
350 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 344 create_treasure (tl, op, flag, difficulty, tries);
345 }
351 } 346 }
352 else 347 else
353 { 348 {
354 if (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)) 349 if (t->item && (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)))
355 { 350 {
356 tmp = arch_to_object (t->item); 351 tmp = arch_to_object (t->item);
357 if (t->nrof && tmp->nrof <= 1) 352 if (t->nrof && tmp->nrof <= 1)
358 tmp->nrof = RANDOM () % ((int) t->nrof) + 1; 353 tmp->nrof = RANDOM () % ((int) t->nrof) + 1;
359 fix_generated_item (tmp, op, difficulty, t->magic, flag); 354 fix_generated_item (tmp, op, difficulty, t->magic, flag);
399 return; 394 return;
400 } 395 }
401 396
402 if (t->name) 397 if (t->name)
403 { 398 {
404 if (!strcmp (t->name, "NONE"))
405 return;
406
407 if (difficulty >= t->magic) 399 if (difficulty >= t->magic)
400 {
401 treasurelist *tl = find_treasurelist (t->name);
402 if (tl)
408 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 403 create_treasure (tl, op, flag, difficulty, tries);
404 }
409 else if (t->nrof) 405 else if (t->nrof)
410 create_one_treasure (tl, op, flag, difficulty, tries); 406 create_one_treasure (tl, op, flag, difficulty, tries);
411 407
412 return; 408 return;
413 } 409 }
414 410
415 if ((t->item && t->item->clone.invisible != 0) || flag != GT_INVISIBLE) 411 if (t->item && (t->item->clone.invisible != 0 || flag != GT_INVISIBLE))
416 { 412 {
417 object *tmp = arch_to_object (t->item); 413 object *tmp = arch_to_object (t->item);
418 414
419 if (!tmp) 415 if (!tmp)
420 return; 416 return;
434 * list transitions, or so that excessively good treasure will not be 430 * list transitions, or so that excessively good treasure will not be
435 * created on weak maps, because it will exceed the number of allowed tries 431 * created on weak maps, because it will exceed the number of allowed tries
436 * to do that. 432 * to do that.
437 */ 433 */
438void 434void
439create_treasure (treasurelist * t, object *op, int flag, int difficulty, int tries) 435create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries)
440{ 436{
441 437
442 if (tries++ > 100) 438 if (tries++ > 100)
443 { 439 {
444 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); 440 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n");
445 return; 441 return;
446 } 442 }
447 if (t->total_chance) 443 if (tl->total_chance)
448 create_one_treasure (t, op, flag, difficulty, tries); 444 create_one_treasure (tl, op, flag, difficulty, tries);
449 else 445 else
450 create_all_treasures (t->items, op, flag, difficulty, tries); 446 create_all_treasures (tl->items, op, flag, difficulty, tries);
451} 447}
452 448
453/* This is similar to the old generate treasure function. However, 449/* This is similar to the old generate treasure function. However,
454 * it instead takes a treasurelist. It is really just a wrapper around 450 * it instead takes a treasurelist. It is really just a wrapper around
455 * create_treasure. We create a dummy object that the treasure gets 451 * create_treasure. We create a dummy object that the treasure gets
456 * inserted into, and then return that treausre 452 * inserted into, and then return that treausre
457 */ 453 */
458object * 454object *
459generate_treasure (treasurelist * t, int difficulty) 455generate_treasure (treasurelist *tl, int difficulty)
460{ 456{
457 difficulty = clamp (difficulty, 1, settings.max_level);
458
461 object *ob = get_object (), *tmp; 459 object *ob = object::create (), *tmp;
462 460
463 create_treasure (t, ob, 0, difficulty, 0); 461 create_treasure (tl, ob, 0, difficulty, 0);
464 462
465 /* Don't want to free the object we are about to return */ 463 /* Don't want to free the object we are about to return */
466 tmp = ob->inv; 464 tmp = ob->inv;
467 if (tmp != NULL) 465 if (tmp != NULL)
468 remove_ob (tmp); 466 tmp->remove ();
467
469 if (ob->inv) 468 if (ob->inv)
470 {
471 LOG (llevError, "In generate treasure, created multiple objects.\n"); 469 LOG (llevError, "In generate treasure, created multiple objects.\n");
472 } 470
473 free_object (ob); 471 ob->destroy ();
474 return tmp; 472 return tmp;
475} 473}
476 474
477/* 475/*
478 * This is a new way of calculating the chance for an item to have 476 * This is a new way of calculating the chance for an item to have
855 } 853 }
856 854
857 if (difficulty < 1) 855 if (difficulty < 1)
858 difficulty = 1; 856 difficulty = 1;
859 857
858 if (INVOKE_OBJECT (ADD_BONUS, op,
859 ARG_OBJECT (creator != op ? creator : 0),
860 ARG_INT (difficulty), ARG_INT (max_magic),
861 ARG_INT (flags)))
862 return;
863
860 if (!(flags & GT_MINIMAL)) 864 if (!(flags & GT_MINIMAL))
861 { 865 {
862 if (op->arch == crown_arch) 866 if (op->arch == crown_arch)
863 { 867 {
864 set_magic (difficulty, op, max_magic, flags); 868 set_magic (difficulty, op, max_magic, flags);
999 op->value *= 5; /* Since it's not just decoration */ 1003 op->value *= 5; /* Since it's not just decoration */
1000 1004
1001 case RING: 1005 case RING:
1002 if (op->arch == NULL) 1006 if (op->arch == NULL)
1003 { 1007 {
1004 remove_ob (op); 1008 op->destroy ();
1005 free_object (op);
1006 op = NULL; 1009 op = 0;
1007 break; 1010 break;
1008 } 1011 }
1009 1012
1010 if (op->arch != ring_arch && op->arch != amulet_arch) /* It's a special artifact! */ 1013 if (op->arch != ring_arch && op->arch != amulet_arch) /* It's a special artifact! */
1011 break; 1014 break;
1169 */ 1172 */
1170 1173
1171static artifactlist * 1174static artifactlist *
1172get_empty_artifactlist (void) 1175get_empty_artifactlist (void)
1173{ 1176{
1174 artifactlist *tl = (artifactlist *) malloc (sizeof (artifactlist)); 1177 artifactlist *al = (artifactlist *) malloc (sizeof (artifactlist));
1175 1178
1176 if (tl == NULL) 1179 if (al == NULL)
1177 fatal (OUT_OF_MEMORY); 1180 fatal (OUT_OF_MEMORY);
1178 tl->next = NULL; 1181 al->next = NULL;
1179 tl->items = NULL; 1182 al->items = NULL;
1180 tl->total_chance = 0; 1183 al->total_chance = 0;
1181 return tl; 1184 return al;
1182} 1185}
1183 1186
1184/* 1187/*
1185 * Allocate and return the pointer to an empty artifact structure. 1188 * Allocate and return the pointer to an empty artifact structure.
1186 */ 1189 */
1187 1190
1188static artifact * 1191static artifact *
1189get_empty_artifact (void) 1192get_empty_artifact (void)
1190{ 1193{
1191 artifact *t = (artifact *) malloc (sizeof (artifact)); 1194 artifact *a = (artifact *) malloc (sizeof (artifact));
1192 1195
1193 if (t == NULL) 1196 if (a == NULL)
1194 fatal (OUT_OF_MEMORY); 1197 fatal (OUT_OF_MEMORY);
1195 t->item = NULL; 1198 a->item = NULL;
1196 t->next = NULL; 1199 a->next = NULL;
1197 t->chance = 0; 1200 a->chance = 0;
1198 t->difficulty = 0; 1201 a->difficulty = 0;
1199 t->allowed = NULL; 1202 a->allowed = NULL;
1200 return t; 1203 return a;
1201} 1204}
1202 1205
1203/* 1206/*
1204 * Searches the artifact lists and returns one that has the same type 1207 * Searches the artifact lists and returns one that has the same type
1205 * of objects on it. 1208 * of objects on it.
1255 treasurelist *tl; 1258 treasurelist *tl;
1256 int i; 1259 int i;
1257 1260
1258 if (depth > 100) 1261 if (depth > 100)
1259 return; 1262 return;
1260 while (t != NULL) 1263 while (t)
1261 { 1264 {
1262 if (t->name != NULL) 1265 if (t->name)
1263 { 1266 {
1264 for (i = 0; i < depth; i++) 1267 for (i = 0; i < depth; i++)
1265 fprintf (logfile, " "); 1268 fprintf (logfile, " ");
1266 fprintf (logfile, "{ (list: %s)\n", &t->name); 1269 fprintf (logfile, "{ (list: %s)\n", &t->name);
1267 tl = find_treasurelist (t->name); 1270 tl = find_treasurelist (t->name);
1271 if (tl)
1268 dump_monster_treasure_rec (name, tl->items, depth + 2); 1272 dump_monster_treasure_rec (name, tl->items, depth + 2);
1269 for (i = 0; i < depth; i++) 1273 for (i = 0; i < depth; i++)
1270 fprintf (logfile, " "); 1274 fprintf (logfile, " ");
1271 fprintf (logfile, "} (end of list: %s)\n", &t->name); 1275 fprintf (logfile, "} (end of list: %s)\n", &t->name);
1272 } 1276 }
1273 else 1277 else
1274 { 1278 {
1275 for (i = 0; i < depth; i++) 1279 for (i = 0; i < depth; i++)
1276 fprintf (logfile, " "); 1280 fprintf (logfile, " ");
1277 if (t->item->clone.type == FLESH) 1281 if (t->item && t->item->clone.type == FLESH)
1278 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name); 1282 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name);
1279 else 1283 else
1280 fprintf (logfile, "%s\n", &t->item->clone.name); 1284 fprintf (logfile, "%s\n", &t->item->clone.name);
1281 } 1285 }
1286
1282 if (t->next_yes != NULL) 1287 if (t->next_yes)
1283 { 1288 {
1284 for (i = 0; i < depth; i++) 1289 for (i = 0; i < depth; i++)
1285 fprintf (logfile, " "); 1290 fprintf (logfile, " ");
1286 fprintf (logfile, " (if yes)\n"); 1291 fprintf (logfile, " (if yes)\n");
1287 dump_monster_treasure_rec (name, t->next_yes, depth + 1); 1292 dump_monster_treasure_rec (name, t->next_yes, depth + 1);
1288 } 1293 }
1294
1289 if (t->next_no != NULL) 1295 if (t->next_no)
1290 { 1296 {
1291 for (i = 0; i < depth; i++) 1297 for (i = 0; i < depth; i++)
1292 fprintf (logfile, " "); 1298 fprintf (logfile, " ");
1293 fprintf (logfile, " (if no)\n"); 1299 fprintf (logfile, " (if no)\n");
1294 dump_monster_treasure_rec (name, t->next_no, depth + 1); 1300 dump_monster_treasure_rec (name, t->next_no, depth + 1);
1295 } 1301 }
1302
1296 t = t->next; 1303 t = t->next;
1297 } 1304 }
1298} 1305}
1299 1306
1300/* 1307/*
1390 art->chance = (uint16) value; 1397 art->chance = (uint16) value;
1391 else if (sscanf (cp, "difficulty %d", &value)) 1398 else if (sscanf (cp, "difficulty %d", &value))
1392 art->difficulty = (uint8) value; 1399 art->difficulty = (uint8) value;
1393 else if (!strncmp (cp, "Object", 6)) 1400 else if (!strncmp (cp, "Object", 6))
1394 { 1401 {
1395 art->item = get_object (); 1402 art->item = object::create ();
1396 1403
1397 if (!load_object (thawer, art->item, 0)) 1404 if (!load_object (thawer, art->item, 0))
1398 LOG (llevError, "Init_Artifacts: Could not load object.\n"); 1405 LOG (llevError, "Init_Artifacts: Could not load object.\n");
1399 1406
1400 art->item->name = strchr (cp, ' ') + 1; 1407 art->item->name = strchr (cp, ' ') + 1;
1489 CLEAR_FLAG (op, FLAG_ANIMATE); 1496 CLEAR_FLAG (op, FLAG_ANIMATE);
1490 /* so artifacts will join */ 1497 /* so artifacts will join */
1491 if (!QUERY_FLAG (op, FLAG_ALIVE)) 1498 if (!QUERY_FLAG (op, FLAG_ALIVE))
1492 op->speed = 0.0; 1499 op->speed = 0.0;
1493 1500
1494 update_ob_speed (op); 1501 op->set_speed (op->speed);
1495 } 1502 }
1496 1503
1497 if (change->nrof) 1504 if (change->nrof)
1498 op->nrof = RANDOM () % ((int) change->nrof) + 1; 1505 op->nrof = RANDOM () % ((int) change->nrof) + 1;
1499 1506
1511 { 1518 {
1512 object *tmp_obj; 1519 object *tmp_obj;
1513 1520
1514 /* Remove any spells this object currently has in it */ 1521 /* Remove any spells this object currently has in it */
1515 while (op->inv) 1522 while (op->inv)
1516 { 1523 op->inv->destroy ();
1517 tmp_obj = op->inv;
1518 remove_ob (tmp_obj);
1519 free_object (tmp_obj);
1520 }
1521 1524
1522 tmp_obj = arch_to_object (change->other_arch); 1525 tmp_obj = arch_to_object (change->other_arch);
1523 insert_ob_in_ob (tmp_obj, op); 1526 insert_ob_in_ob (tmp_obj, op);
1524 } 1527 }
1525 /* No harm setting this for potions/horns */ 1528 /* No harm setting this for potions/horns */
1562 op->gen_sp_armour = (op->gen_sp_armour * (change->gen_sp_armour)) / 100; 1565 op->gen_sp_armour = (op->gen_sp_armour * (change->gen_sp_armour)) / 100;
1563 1566
1564 op->item_power = change->item_power; 1567 op->item_power = change->item_power;
1565 1568
1566 for (i = 0; i < NROFATTACKS; i++) 1569 for (i = 0; i < NROFATTACKS; i++)
1567 {
1568 if (change->resist[i]) 1570 if (change->resist[i])
1569 {
1570 op->resist[i] += change->resist[i]; 1571 op->resist[i] += change->resist[i];
1571 }
1572 }
1573 1572
1574 if (change->stats.dam) 1573 if (change->stats.dam)
1575 { 1574 {
1576 if (change->stats.dam < 0) 1575 if (change->stats.dam < 0)
1577 op->stats.dam = (-change->stats.dam); 1576 op->stats.dam = (-change->stats.dam);
1808/* special_potion() - so that old potion code is still done right. */ 1807/* special_potion() - so that old potion code is still done right. */
1809 1808
1810int 1809int
1811special_potion (object *op) 1810special_potion (object *op)
1812{ 1811{
1813
1814 int i;
1815
1816 if (op->attacktype) 1812 if (op->attacktype)
1817 return 1; 1813 return 1;
1818 1814
1819 if (op->stats.Str || op->stats.Dex || op->stats.Con || op->stats.Pow || op->stats.Wis || op->stats.Int || op->stats.Cha) 1815 if (op->stats.Str || op->stats.Dex || op->stats.Con || op->stats.Pow || op->stats.Wis || op->stats.Int || op->stats.Cha)
1820 return 1; 1816 return 1;
1821 1817
1822 for (i = 0; i < NROFATTACKS; i++) 1818 for (int i = 0; i < NROFATTACKS; i++)
1823 if (op->resist[i]) 1819 if (op->resist[i])
1824 return 1; 1820 return 1;
1825 1821
1826 return 0; 1822 return 0;
1827} 1823}
1855 free_artifact (at->next); 1851 free_artifact (at->next);
1856 1852
1857 if (at->allowed) 1853 if (at->allowed)
1858 free_charlinks (at->allowed); 1854 free_charlinks (at->allowed);
1859 1855
1860 at->item->free (1); 1856 at->item->destroy (1);
1861 1857
1862 delete at; 1858 delete at;
1863} 1859}
1864 1860
1865void 1861void
1866free_artifactlist (artifactlist * al) 1862free_artifactlist (artifactlist * al)
1867{ 1863{
1868 artifactlist *nextal; 1864 artifactlist *nextal;
1869 1865
1870 for (al = first_artifactlist; al != NULL; al = nextal) 1866 for (al = first_artifactlist; al; al = nextal)
1871 { 1867 {
1872 nextal = al->next; 1868 nextal = al->next;
1873 1869
1874 if (al->items) 1870 if (al->items)
1875 free_artifact (al->items); 1871 free_artifact (al->items);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines