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.29 by root, Tue Dec 26 20:04:09 2006 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
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 22*/
29 23
30#define ALLOWED_COMBINATION 24#define ALLOWED_COMBINATION
31 25
32/* TREASURE_DEBUG does some checking on the treasurelists after loading. 26/* TREASURE_DEBUG does some checking on the treasurelists after loading.
58{ 52{
59 int prev_warn = warn_archetypes; 53 int prev_warn = warn_archetypes;
60 54
61 warn_archetypes = 1; 55 warn_archetypes = 1;
62 if (ring_arch == NULL) 56 if (ring_arch == NULL)
63 ring_arch = find_archetype ("ring"); 57 ring_arch = archetype::find ("ring");
64 if (amulet_arch == NULL) 58 if (amulet_arch == NULL)
65 amulet_arch = find_archetype ("amulet"); 59 amulet_arch = archetype::find ("amulet");
66 if (staff_arch == NULL) 60 if (staff_arch == NULL)
67 staff_arch = find_archetype ("staff"); 61 staff_arch = archetype::find ("staff");
68 if (crown_arch == NULL) 62 if (crown_arch == NULL)
69 crown_arch = find_archetype ("crown"); 63 crown_arch = archetype::find ("crown");
70 warn_archetypes = prev_warn; 64 warn_archetypes = prev_warn;
71} 65}
72 66
73/* 67/*
74 * Allocate and return the pointer to an empty treasurelist structure. 68 * Allocate and return the pointer to an empty treasurelist structure.
119 while (isspace (*cp)) /* Skip blanks */ 113 while (isspace (*cp)) /* Skip blanks */
120 cp++; 114 cp++;
121 115
122 if (sscanf (cp, "arch %s", variable)) 116 if (sscanf (cp, "arch %s", variable))
123 { 117 {
124 if ((t->item = find_archetype (variable)) == NULL) 118 if ((t->item = archetype::find (variable)) == NULL)
125 LOG (llevError, "Treasure lacks archetype: %s\n", variable); 119 LOG (llevError, "Treasure lacks archetype: %s\n", variable);
126 } 120 }
127 else if (sscanf (cp, "list %s", variable)) 121 else if (sscanf (cp, "list %s", variable))
128 t->name = variable; 122 t->name = variable;
129 else if (sscanf (cp, "change_name %s", variable)) 123 else if (sscanf (cp, "change_name %s", variable))
259 */ 253 */
260 254
261treasurelist * 255treasurelist *
262find_treasurelist (const char *name) 256find_treasurelist (const char *name)
263{ 257{
264 /* Special cases - randomitems of NULL is to override default. If 258 shstr_cmp name_ (name);
265 * first_treasurelist is null, it means we are on the first pass of 259
266 * of loading archetypes, so for now, just return - second pass will
267 * init these values.
268 */
269 if (!name) 260 if (!name_)
270 return 0; 261 return 0;
271 262
272 if (const char *tmp = shstr::find (name))
273 for (treasurelist * tl = first_treasurelist; tl != 0; tl = tl->next) 263 for (treasurelist *tl = first_treasurelist; tl != 0; tl = tl->next)
274 if (tmp == tl->name) 264 if (name_ == tl->name)
275 return tl; 265 return tl;
276 266
277 if (first_treasurelist) 267 if (first_treasurelist)
278 LOG (llevError, "Couldn't find treasurelist %s\n", name); 268 LOG (llevError, "Couldn't find treasurelist %s\n", name);
279 269
280 return 0; 270 return 0;
290 * being generated. 280 * being generated.
291 * If flag is GT_INVISIBLE, only invisible objects are generated (ie, only 281 * If flag is GT_INVISIBLE, only invisible objects are generated (ie, only
292 * abilities. This is used by summon spells, thus no summoned monsters 282 * abilities. This is used by summon spells, thus no summoned monsters
293 * start with equipment, but only their abilities). 283 * start with equipment, but only their abilities).
294 */ 284 */
295
296
297static void 285static void
298put_treasure (object *op, object *creator, int flags) 286put_treasure (object *op, object *creator, int flags)
299{ 287{
300 object *tmp; 288 object *tmp;
301 289
304 * this is the original object, or if this is an object that should be created 292 * this is the original object, or if this is an object that should be created
305 * by another object. 293 * by another object.
306 */ 294 */
307 if (flags & GT_ENVIRONMENT && op->type != SPELL) 295 if (flags & GT_ENVIRONMENT && op->type != SPELL)
308 { 296 {
309 op->x = creator->x;
310 op->y = creator->y;
311 SET_FLAG (op, FLAG_OBJ_ORIGINAL); 297 SET_FLAG (op, FLAG_OBJ_ORIGINAL);
312 insert_ob_in_map (op, creator->map, op, INS_NO_MERGE | INS_NO_WALK_ON); 298 op->insert_at (creator, creator, INS_NO_MERGE | INS_NO_WALK_ON);
313 } 299 }
314 else 300 else
315 { 301 {
316 op = insert_ob_in_ob (op, creator); 302 op = creator->insert (op);
303
317 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER)) 304 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER))
318 monster_check_apply (creator, op); 305 monster_check_apply (creator, op);
306
319 if ((flags & GT_UPDATE_INV) && (tmp = is_player_inv (creator)) != NULL) 307 if ((flags & GT_UPDATE_INV) && (tmp = creator->in_player ()))
320 esrv_send_item (tmp, op); 308 esrv_send_item (tmp, op);
321 } 309 }
322} 310}
323 311
324/* if there are change_xxx commands in the treasure, we include the changes 312/* if there are change_xxx commands in the treasure, we include the changes
349 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance) 337 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance)
350 { 338 {
351 if (t->name) 339 if (t->name)
352 { 340 {
353 if (strcmp (t->name, "NONE") && difficulty >= t->magic) 341 if (strcmp (t->name, "NONE") && difficulty >= t->magic)
342 {
343 treasurelist *tl = find_treasurelist (t->name);
344 if (tl)
354 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 345 create_treasure (tl, op, flag, difficulty, tries);
346 }
355 } 347 }
356 else 348 else
357 { 349 {
358 if (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)) 350 if (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE))
359 { 351 {
407 { 399 {
408 if (!strcmp (t->name, "NONE")) 400 if (!strcmp (t->name, "NONE"))
409 return; 401 return;
410 402
411 if (difficulty >= t->magic) 403 if (difficulty >= t->magic)
404 {
405 treasurelist *tl = find_treasurelist (t->name);
406 if (tl)
412 create_treasure (find_treasurelist (t->name), op, flag, difficulty, tries); 407 create_treasure (tl, op, flag, difficulty, tries);
408 }
413 else if (t->nrof) 409 else if (t->nrof)
414 create_one_treasure (tl, op, flag, difficulty, tries); 410 create_one_treasure (tl, op, flag, difficulty, tries);
415 411
416 return; 412 return;
417 } 413 }
458 * it instead takes a treasurelist. It is really just a wrapper around 454 * it instead takes a treasurelist. It is really just a wrapper around
459 * create_treasure. We create a dummy object that the treasure gets 455 * create_treasure. We create a dummy object that the treasure gets
460 * inserted into, and then return that treausre 456 * inserted into, and then return that treausre
461 */ 457 */
462object * 458object *
463generate_treasure (treasurelist * t, int difficulty) 459generate_treasure (treasurelist *t, int difficulty)
464{ 460{
461 difficulty = clamp (difficulty, 1, settings.max_level);
462
465 object *ob = get_object (), *tmp; 463 object *ob = object::create (), *tmp;
466 464
467 create_treasure (t, ob, 0, difficulty, 0); 465 create_treasure (t, ob, 0, difficulty, 0);
468 466
469 /* Don't want to free the object we are about to return */ 467 /* Don't want to free the object we are about to return */
470 tmp = ob->inv; 468 tmp = ob->inv;
471 if (tmp != NULL) 469 if (tmp != NULL)
472 remove_ob (tmp); 470 tmp->remove ();
471
473 if (ob->inv) 472 if (ob->inv)
474 {
475 LOG (llevError, "In generate treasure, created multiple objects.\n"); 473 LOG (llevError, "In generate treasure, created multiple objects.\n");
476 } 474
477 free_object (ob); 475 ob->destroy ();
478 return tmp; 476 return tmp;
479} 477}
480 478
481/* 479/*
482 * This is a new way of calculating the chance for an item to have 480 * This is a new way of calculating the chance for an item to have
859 } 857 }
860 858
861 if (difficulty < 1) 859 if (difficulty < 1)
862 difficulty = 1; 860 difficulty = 1;
863 861
862 if (INVOKE_OBJECT (ADD_BONUS, op,
863 ARG_OBJECT (creator != op ? creator : 0),
864 ARG_INT (difficulty), ARG_INT (max_magic),
865 ARG_INT (flags)))
866 return;
867
864 if (!(flags & GT_MINIMAL)) 868 if (!(flags & GT_MINIMAL))
865 { 869 {
866 if (op->arch == crown_arch) 870 if (op->arch == crown_arch)
867 { 871 {
868 set_magic (difficulty, op, max_magic, flags); 872 set_magic (difficulty, op, max_magic, flags);
1003 op->value *= 5; /* Since it's not just decoration */ 1007 op->value *= 5; /* Since it's not just decoration */
1004 1008
1005 case RING: 1009 case RING:
1006 if (op->arch == NULL) 1010 if (op->arch == NULL)
1007 { 1011 {
1008 remove_ob (op); 1012 op->destroy ();
1009 free_object (op);
1010 op = NULL; 1013 op = 0;
1011 break; 1014 break;
1012 } 1015 }
1013 1016
1014 if (op->arch != ring_arch && op->arch != amulet_arch) /* It's a special artifact! */ 1017 if (op->arch != ring_arch && op->arch != amulet_arch) /* It's a special artifact! */
1015 break; 1018 break;
1267 { 1270 {
1268 for (i = 0; i < depth; i++) 1271 for (i = 0; i < depth; i++)
1269 fprintf (logfile, " "); 1272 fprintf (logfile, " ");
1270 fprintf (logfile, "{ (list: %s)\n", &t->name); 1273 fprintf (logfile, "{ (list: %s)\n", &t->name);
1271 tl = find_treasurelist (t->name); 1274 tl = find_treasurelist (t->name);
1275 if (tl)
1272 dump_monster_treasure_rec (name, tl->items, depth + 2); 1276 dump_monster_treasure_rec (name, tl->items, depth + 2);
1273 for (i = 0; i < depth; i++) 1277 for (i = 0; i < depth; i++)
1274 fprintf (logfile, " "); 1278 fprintf (logfile, " ");
1275 fprintf (logfile, "} (end of list: %s)\n", &t->name); 1279 fprintf (logfile, "} (end of list: %s)\n", &t->name);
1276 } 1280 }
1277 else 1281 else
1394 art->chance = (uint16) value; 1398 art->chance = (uint16) value;
1395 else if (sscanf (cp, "difficulty %d", &value)) 1399 else if (sscanf (cp, "difficulty %d", &value))
1396 art->difficulty = (uint8) value; 1400 art->difficulty = (uint8) value;
1397 else if (!strncmp (cp, "Object", 6)) 1401 else if (!strncmp (cp, "Object", 6))
1398 { 1402 {
1399 art->item = get_object (); 1403 art->item = object::create ();
1400 1404
1401 if (!load_object (thawer, art->item, 0)) 1405 if (!load_object (thawer, art->item, 0))
1402 LOG (llevError, "Init_Artifacts: Could not load object.\n"); 1406 LOG (llevError, "Init_Artifacts: Could not load object.\n");
1403 1407
1404 art->item->name = strchr (cp, ' ') + 1; 1408 art->item->name = strchr (cp, ' ') + 1;
1493 CLEAR_FLAG (op, FLAG_ANIMATE); 1497 CLEAR_FLAG (op, FLAG_ANIMATE);
1494 /* so artifacts will join */ 1498 /* so artifacts will join */
1495 if (!QUERY_FLAG (op, FLAG_ALIVE)) 1499 if (!QUERY_FLAG (op, FLAG_ALIVE))
1496 op->speed = 0.0; 1500 op->speed = 0.0;
1497 1501
1498 update_ob_speed (op); 1502 op->set_speed (op->speed);
1499 } 1503 }
1500 1504
1501 if (change->nrof) 1505 if (change->nrof)
1502 op->nrof = RANDOM () % ((int) change->nrof) + 1; 1506 op->nrof = RANDOM () % ((int) change->nrof) + 1;
1503 1507
1515 { 1519 {
1516 object *tmp_obj; 1520 object *tmp_obj;
1517 1521
1518 /* Remove any spells this object currently has in it */ 1522 /* Remove any spells this object currently has in it */
1519 while (op->inv) 1523 while (op->inv)
1520 { 1524 op->inv->destroy ();
1521 tmp_obj = op->inv;
1522 remove_ob (tmp_obj);
1523 free_object (tmp_obj);
1524 }
1525 1525
1526 tmp_obj = arch_to_object (change->other_arch); 1526 tmp_obj = arch_to_object (change->other_arch);
1527 insert_ob_in_ob (tmp_obj, op); 1527 insert_ob_in_ob (tmp_obj, op);
1528 } 1528 }
1529 /* No harm setting this for potions/horns */ 1529 /* No harm setting this for potions/horns */
1566 op->gen_sp_armour = (op->gen_sp_armour * (change->gen_sp_armour)) / 100; 1566 op->gen_sp_armour = (op->gen_sp_armour * (change->gen_sp_armour)) / 100;
1567 1567
1568 op->item_power = change->item_power; 1568 op->item_power = change->item_power;
1569 1569
1570 for (i = 0; i < NROFATTACKS; i++) 1570 for (i = 0; i < NROFATTACKS; i++)
1571 {
1572 if (change->resist[i]) 1571 if (change->resist[i])
1573 {
1574 op->resist[i] += change->resist[i]; 1572 op->resist[i] += change->resist[i];
1575 }
1576 }
1577 1573
1578 if (change->stats.dam) 1574 if (change->stats.dam)
1579 { 1575 {
1580 if (change->stats.dam < 0) 1576 if (change->stats.dam < 0)
1581 op->stats.dam = (-change->stats.dam); 1577 op->stats.dam = (-change->stats.dam);
1859 free_artifact (at->next); 1855 free_artifact (at->next);
1860 1856
1861 if (at->allowed) 1857 if (at->allowed)
1862 free_charlinks (at->allowed); 1858 free_charlinks (at->allowed);
1863 1859
1864 at->item->free (1); 1860 at->item->destroy (1);
1865 1861
1866 delete at; 1862 delete at;
1867} 1863}
1868 1864
1869void 1865void
1870free_artifactlist (artifactlist * al) 1866free_artifactlist (artifactlist * al)
1871{ 1867{
1872 artifactlist *nextal; 1868 artifactlist *nextal;
1873 1869
1874 for (al = first_artifactlist; al != NULL; al = nextal) 1870 for (al = first_artifactlist; al; al = nextal)
1875 { 1871 {
1876 nextal = al->next; 1872 nextal = al->next;
1877 1873
1878 if (al->items) 1874 if (al->items)
1879 free_artifact (al->items); 1875 free_artifact (al->items);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines