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.16 by root, Sun Sep 10 16:00:23 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.16 2006/09/10 16:00:23 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)
259 */ 252 */
260 253
261treasurelist * 254treasurelist *
262find_treasurelist (const char *name) 255find_treasurelist (const char *name)
263{ 256{
264 /* Special cases - randomitems of NULL is to override default. If 257 shstr_cmp name_ (name);
265 * first_treasurelist is null, it means we are on the first pass of 258
266 * of loading archetypes, so for now, just return - second pass will
267 * init these values.
268 */
269 if (!name) 259 if (!name_)
270 return 0; 260 return 0;
271 261
272 if (const char *tmp = shstr::find (name))
273 for (treasurelist * tl = first_treasurelist; tl != 0; tl = tl->next) 262 for (treasurelist *tl = first_treasurelist; tl != 0; tl = tl->next)
274 if (tmp == tl->name) 263 if (name_ == tl->name)
275 return tl; 264 return tl;
276 265
277 if (first_treasurelist) 266 if (first_treasurelist)
278 LOG (llevError, "Couldn't find treasurelist %s\n", name); 267 LOG (llevError, "Couldn't find treasurelist %s\n", name);
279 268
280 return 0; 269 return 0;
290 * being generated. 279 * being generated.
291 * 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
292 * abilities. This is used by summon spells, thus no summoned monsters 281 * abilities. This is used by summon spells, thus no summoned monsters
293 * start with equipment, but only their abilities). 282 * start with equipment, but only their abilities).
294 */ 283 */
295
296
297static void 284static void
298put_treasure (object *op, object *creator, int flags) 285put_treasure (object *op, object *creator, int flags)
299{ 286{
300 object *tmp; 287 object *tmp;
301 288
304 * 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
305 * by another object. 292 * by another object.
306 */ 293 */
307 if (flags & GT_ENVIRONMENT && op->type != SPELL) 294 if (flags & GT_ENVIRONMENT && op->type != SPELL)
308 { 295 {
309 op->x = creator->x;
310 op->y = creator->y;
311 SET_FLAG (op, FLAG_OBJ_ORIGINAL); 296 SET_FLAG (op, FLAG_OBJ_ORIGINAL);
312 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);
313 } 298 }
314 else 299 else
315 { 300 {
316 op = insert_ob_in_ob (op, creator); 301 op = creator->insert (op);
302
317 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER)) 303 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER))
318 monster_check_apply (creator, op); 304 monster_check_apply (creator, op);
305
319 if ((flags & GT_UPDATE_INV) && (tmp = is_player_inv (creator)) != NULL) 306 if ((flags & GT_UPDATE_INV) && (tmp = creator->in_player ()))
320 esrv_send_item (tmp, op); 307 esrv_send_item (tmp, op);
321 } 308 }
322} 309}
323 310
324/* 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
348 335
349 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance) 336 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance)
350 { 337 {
351 if (t->name) 338 if (t->name)
352 { 339 {
353 if (strcmp (t->name, "NONE") && difficulty >= t->magic) 340 if (difficulty >= t->magic)
341 {
342 treasurelist *tl = find_treasurelist (t->name);
343 if (tl)
354 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 344 create_treasure (tl, op, flag, difficulty, tries);
345 }
355 } 346 }
356 else 347 else
357 { 348 {
358 if (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)) 349 if (t->item && (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)))
359 { 350 {
360 tmp = arch_to_object (t->item); 351 tmp = arch_to_object (t->item);
361 if (t->nrof && tmp->nrof <= 1) 352 if (t->nrof && tmp->nrof <= 1)
362 tmp->nrof = RANDOM () % ((int) t->nrof) + 1; 353 tmp->nrof = RANDOM () % ((int) t->nrof) + 1;
363 fix_generated_item (tmp, op, difficulty, t->magic, flag); 354 fix_generated_item (tmp, op, difficulty, t->magic, flag);
403 return; 394 return;
404 } 395 }
405 396
406 if (t->name) 397 if (t->name)
407 { 398 {
408 if (!strcmp (t->name, "NONE"))
409 return;
410
411 if (difficulty >= t->magic) 399 if (difficulty >= t->magic)
400 {
401 treasurelist *tl = find_treasurelist (t->name);
402 if (tl)
412 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 403 create_treasure (tl, op, flag, difficulty, tries);
404 }
413 else if (t->nrof) 405 else if (t->nrof)
414 create_one_treasure (tl, op, flag, difficulty, tries); 406 create_one_treasure (tl, op, flag, difficulty, tries);
415 407
416 return; 408 return;
417 } 409 }
418 410
419 if ((t->item && t->item->clone.invisible != 0) || flag != GT_INVISIBLE) 411 if (t->item && (t->item->clone.invisible != 0 || flag != GT_INVISIBLE))
420 { 412 {
421 object *tmp = arch_to_object (t->item); 413 object *tmp = arch_to_object (t->item);
422 414
423 if (!tmp) 415 if (!tmp)
424 return; 416 return;
438 * list transitions, or so that excessively good treasure will not be 430 * list transitions, or so that excessively good treasure will not be
439 * 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
440 * to do that. 432 * to do that.
441 */ 433 */
442void 434void
443create_treasure (treasurelist * t, object *op, int flag, int difficulty, int tries) 435create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries)
444{ 436{
445 437
446 if (tries++ > 100) 438 if (tries++ > 100)
447 { 439 {
448 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); 440 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n");
449 return; 441 return;
450 } 442 }
451 if (t->total_chance) 443 if (tl->total_chance)
452 create_one_treasure (t, op, flag, difficulty, tries); 444 create_one_treasure (tl, op, flag, difficulty, tries);
453 else 445 else
454 create_all_treasures (t->items, op, flag, difficulty, tries); 446 create_all_treasures (tl->items, op, flag, difficulty, tries);
455} 447}
456 448
457/* This is similar to the old generate treasure function. However, 449/* This is similar to the old generate treasure function. However,
458 * 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
459 * create_treasure. We create a dummy object that the treasure gets 451 * create_treasure. We create a dummy object that the treasure gets
460 * inserted into, and then return that treausre 452 * inserted into, and then return that treausre
461 */ 453 */
462object * 454object *
463generate_treasure (treasurelist * t, int difficulty) 455generate_treasure (treasurelist *tl, int difficulty)
464{ 456{
457 difficulty = clamp (difficulty, 1, settings.max_level);
458
465 object *ob = get_object (), *tmp; 459 object *ob = object::create (), *tmp;
466 460
467 create_treasure (t, ob, 0, difficulty, 0); 461 create_treasure (tl, ob, 0, difficulty, 0);
468 462
469 /* 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 */
470 tmp = ob->inv; 464 tmp = ob->inv;
471 if (tmp != NULL) 465 if (tmp != NULL)
472 remove_ob (tmp); 466 tmp->remove ();
467
473 if (ob->inv) 468 if (ob->inv)
474 {
475 LOG (llevError, "In generate treasure, created multiple objects.\n"); 469 LOG (llevError, "In generate treasure, created multiple objects.\n");
476 } 470
477 free_object (ob); 471 ob->destroy ();
478 return tmp; 472 return tmp;
479} 473}
480 474
481/* 475/*
482 * 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
859 } 853 }
860 854
861 if (difficulty < 1) 855 if (difficulty < 1)
862 difficulty = 1; 856 difficulty = 1;
863 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
864 if (!(flags & GT_MINIMAL)) 864 if (!(flags & GT_MINIMAL))
865 { 865 {
866 if (op->arch == crown_arch) 866 if (op->arch == crown_arch)
867 { 867 {
868 set_magic (difficulty, op, max_magic, flags); 868 set_magic (difficulty, op, max_magic, flags);
1003 op->value *= 5; /* Since it's not just decoration */ 1003 op->value *= 5; /* Since it's not just decoration */
1004 1004
1005 case RING: 1005 case RING:
1006 if (op->arch == NULL) 1006 if (op->arch == NULL)
1007 { 1007 {
1008 remove_ob (op); 1008 op->destroy ();
1009 free_object (op);
1010 op = NULL; 1009 op = 0;
1011 break; 1010 break;
1012 } 1011 }
1013 1012
1014 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! */
1015 break; 1014 break;
1173 */ 1172 */
1174 1173
1175static artifactlist * 1174static artifactlist *
1176get_empty_artifactlist (void) 1175get_empty_artifactlist (void)
1177{ 1176{
1178 artifactlist *tl = (artifactlist *) malloc (sizeof (artifactlist)); 1177 artifactlist *al = (artifactlist *) malloc (sizeof (artifactlist));
1179 1178
1180 if (tl == NULL) 1179 if (al == NULL)
1181 fatal (OUT_OF_MEMORY); 1180 fatal (OUT_OF_MEMORY);
1182 tl->next = NULL; 1181 al->next = NULL;
1183 tl->items = NULL; 1182 al->items = NULL;
1184 tl->total_chance = 0; 1183 al->total_chance = 0;
1185 return tl; 1184 return al;
1186} 1185}
1187 1186
1188/* 1187/*
1189 * Allocate and return the pointer to an empty artifact structure. 1188 * Allocate and return the pointer to an empty artifact structure.
1190 */ 1189 */
1191 1190
1192static artifact * 1191static artifact *
1193get_empty_artifact (void) 1192get_empty_artifact (void)
1194{ 1193{
1195 artifact *t = (artifact *) malloc (sizeof (artifact)); 1194 artifact *a = (artifact *) malloc (sizeof (artifact));
1196 1195
1197 if (t == NULL) 1196 if (a == NULL)
1198 fatal (OUT_OF_MEMORY); 1197 fatal (OUT_OF_MEMORY);
1199 t->item = NULL; 1198 a->item = NULL;
1200 t->next = NULL; 1199 a->next = NULL;
1201 t->chance = 0; 1200 a->chance = 0;
1202 t->difficulty = 0; 1201 a->difficulty = 0;
1203 t->allowed = NULL; 1202 a->allowed = NULL;
1204 return t; 1203 return a;
1205} 1204}
1206 1205
1207/* 1206/*
1208 * 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
1209 * of objects on it. 1208 * of objects on it.
1259 treasurelist *tl; 1258 treasurelist *tl;
1260 int i; 1259 int i;
1261 1260
1262 if (depth > 100) 1261 if (depth > 100)
1263 return; 1262 return;
1264 while (t != NULL) 1263 while (t)
1265 { 1264 {
1266 if (t->name != NULL) 1265 if (t->name)
1267 { 1266 {
1268 for (i = 0; i < depth; i++) 1267 for (i = 0; i < depth; i++)
1269 fprintf (logfile, " "); 1268 fprintf (logfile, " ");
1270 fprintf (logfile, "{ (list: %s)\n", &t->name); 1269 fprintf (logfile, "{ (list: %s)\n", &t->name);
1271 tl = find_treasurelist (t->name); 1270 tl = find_treasurelist (t->name);
1271 if (tl)
1272 dump_monster_treasure_rec (name, tl->items, depth + 2); 1272 dump_monster_treasure_rec (name, tl->items, depth + 2);
1273 for (i = 0; i < depth; i++) 1273 for (i = 0; i < depth; i++)
1274 fprintf (logfile, " "); 1274 fprintf (logfile, " ");
1275 fprintf (logfile, "} (end of list: %s)\n", &t->name); 1275 fprintf (logfile, "} (end of list: %s)\n", &t->name);
1276 } 1276 }
1277 else 1277 else
1278 { 1278 {
1279 for (i = 0; i < depth; i++) 1279 for (i = 0; i < depth; i++)
1280 fprintf (logfile, " "); 1280 fprintf (logfile, " ");
1281 if (t->item->clone.type == FLESH) 1281 if (t->item && t->item->clone.type == FLESH)
1282 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name); 1282 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name);
1283 else 1283 else
1284 fprintf (logfile, "%s\n", &t->item->clone.name); 1284 fprintf (logfile, "%s\n", &t->item->clone.name);
1285 } 1285 }
1286
1286 if (t->next_yes != NULL) 1287 if (t->next_yes)
1287 { 1288 {
1288 for (i = 0; i < depth; i++) 1289 for (i = 0; i < depth; i++)
1289 fprintf (logfile, " "); 1290 fprintf (logfile, " ");
1290 fprintf (logfile, " (if yes)\n"); 1291 fprintf (logfile, " (if yes)\n");
1291 dump_monster_treasure_rec (name, t->next_yes, depth + 1); 1292 dump_monster_treasure_rec (name, t->next_yes, depth + 1);
1292 } 1293 }
1294
1293 if (t->next_no != NULL) 1295 if (t->next_no)
1294 { 1296 {
1295 for (i = 0; i < depth; i++) 1297 for (i = 0; i < depth; i++)
1296 fprintf (logfile, " "); 1298 fprintf (logfile, " ");
1297 fprintf (logfile, " (if no)\n"); 1299 fprintf (logfile, " (if no)\n");
1298 dump_monster_treasure_rec (name, t->next_no, depth + 1); 1300 dump_monster_treasure_rec (name, t->next_no, depth + 1);
1299 } 1301 }
1302
1300 t = t->next; 1303 t = t->next;
1301 } 1304 }
1302} 1305}
1303 1306
1304/* 1307/*
1394 art->chance = (uint16) value; 1397 art->chance = (uint16) value;
1395 else if (sscanf (cp, "difficulty %d", &value)) 1398 else if (sscanf (cp, "difficulty %d", &value))
1396 art->difficulty = (uint8) value; 1399 art->difficulty = (uint8) value;
1397 else if (!strncmp (cp, "Object", 6)) 1400 else if (!strncmp (cp, "Object", 6))
1398 { 1401 {
1399 art->item = get_object (); 1402 art->item = object::create ();
1400 1403
1401 if (!load_object (thawer, art->item, 0)) 1404 if (!load_object (thawer, art->item, 0))
1402 LOG (llevError, "Init_Artifacts: Could not load object.\n"); 1405 LOG (llevError, "Init_Artifacts: Could not load object.\n");
1403 1406
1404 art->item->name = strchr (cp, ' ') + 1; 1407 art->item->name = strchr (cp, ' ') + 1;
1493 CLEAR_FLAG (op, FLAG_ANIMATE); 1496 CLEAR_FLAG (op, FLAG_ANIMATE);
1494 /* so artifacts will join */ 1497 /* so artifacts will join */
1495 if (!QUERY_FLAG (op, FLAG_ALIVE)) 1498 if (!QUERY_FLAG (op, FLAG_ALIVE))
1496 op->speed = 0.0; 1499 op->speed = 0.0;
1497 1500
1498 update_ob_speed (op); 1501 op->set_speed (op->speed);
1499 } 1502 }
1500 1503
1501 if (change->nrof) 1504 if (change->nrof)
1502 op->nrof = RANDOM () % ((int) change->nrof) + 1; 1505 op->nrof = RANDOM () % ((int) change->nrof) + 1;
1503 1506
1515 { 1518 {
1516 object *tmp_obj; 1519 object *tmp_obj;
1517 1520
1518 /* Remove any spells this object currently has in it */ 1521 /* Remove any spells this object currently has in it */
1519 while (op->inv) 1522 while (op->inv)
1520 { 1523 op->inv->destroy ();
1521 tmp_obj = op->inv;
1522 remove_ob (tmp_obj);
1523 free_object (tmp_obj);
1524 }
1525 1524
1526 tmp_obj = arch_to_object (change->other_arch); 1525 tmp_obj = arch_to_object (change->other_arch);
1527 insert_ob_in_ob (tmp_obj, op); 1526 insert_ob_in_ob (tmp_obj, op);
1528 } 1527 }
1529 /* No harm setting this for potions/horns */ 1528 /* No harm setting this for potions/horns */
1566 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;
1567 1566
1568 op->item_power = change->item_power; 1567 op->item_power = change->item_power;
1569 1568
1570 for (i = 0; i < NROFATTACKS; i++) 1569 for (i = 0; i < NROFATTACKS; i++)
1571 {
1572 if (change->resist[i]) 1570 if (change->resist[i])
1573 {
1574 op->resist[i] += change->resist[i]; 1571 op->resist[i] += change->resist[i];
1575 }
1576 }
1577 1572
1578 if (change->stats.dam) 1573 if (change->stats.dam)
1579 { 1574 {
1580 if (change->stats.dam < 0) 1575 if (change->stats.dam < 0)
1581 op->stats.dam = (-change->stats.dam); 1576 op->stats.dam = (-change->stats.dam);
1812/* special_potion() - so that old potion code is still done right. */ 1807/* special_potion() - so that old potion code is still done right. */
1813 1808
1814int 1809int
1815special_potion (object *op) 1810special_potion (object *op)
1816{ 1811{
1817
1818 int i;
1819
1820 if (op->attacktype) 1812 if (op->attacktype)
1821 return 1; 1813 return 1;
1822 1814
1823 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)
1824 return 1; 1816 return 1;
1825 1817
1826 for (i = 0; i < NROFATTACKS; i++) 1818 for (int i = 0; i < NROFATTACKS; i++)
1827 if (op->resist[i]) 1819 if (op->resist[i])
1828 return 1; 1820 return 1;
1829 1821
1830 return 0; 1822 return 0;
1831} 1823}
1859 free_artifact (at->next); 1851 free_artifact (at->next);
1860 1852
1861 if (at->allowed) 1853 if (at->allowed)
1862 free_charlinks (at->allowed); 1854 free_charlinks (at->allowed);
1863 1855
1864 at->item->free (1); 1856 at->item->destroy (1);
1865 1857
1866 delete at; 1858 delete at;
1867} 1859}
1868 1860
1869void 1861void
1870free_artifactlist (artifactlist * al) 1862free_artifactlist (artifactlist * al)
1871{ 1863{
1872 artifactlist *nextal; 1864 artifactlist *nextal;
1873 1865
1874 for (al = first_artifactlist; al != NULL; al = nextal) 1866 for (al = first_artifactlist; al; al = nextal)
1875 { 1867 {
1876 nextal = al->next; 1868 nextal = al->next;
1877 1869
1878 if (al->items) 1870 if (al->items)
1879 free_artifact (al->items); 1871 free_artifact (al->items);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines