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.28 by root, Tue Dec 26 08:54:59 2006 UTC vs.
Revision 1.31 by pippijn, Sat Jan 6 14:42:29 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
3 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
6 7
7 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
8 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
156 * so that the treasure name can be printed out 157 * so that the treasure name can be printed out
157 */ 158 */
158static void 159static void
159check_treasurelist (const treasure *t, const treasurelist * tl) 160check_treasurelist (const treasure *t, const treasurelist * tl)
160{ 161{
161 if (t->item == NULL && t->name == NULL)
162 LOG (llevError, "Treasurelist %s has element with no name or archetype\n", &tl->name);
163 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))
164 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);
165 /* find_treasurelist will print out its own error message */ 164 /* find_treasurelist will print out its own error message */
166 if (t->name && *t->name) 165 if (t->name && *t->name)
167 (void) find_treasurelist (t->name); 166 find_treasurelist (t->name);
168 if (t->next) 167 if (t->next)
169 check_treasurelist (t->next, tl); 168 check_treasurelist (t->next, tl);
170 if (t->next_yes) 169 if (t->next_yes)
171 check_treasurelist (t->next_yes, tl); 170 check_treasurelist (t->next_yes, tl);
172 if (t->next_no) 171 if (t->next_no)
292 * 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
293 * by another object. 292 * by another object.
294 */ 293 */
295 if (flags & GT_ENVIRONMENT && op->type != SPELL) 294 if (flags & GT_ENVIRONMENT && op->type != SPELL)
296 { 295 {
297 op->x = creator->x;
298 op->y = creator->y;
299 SET_FLAG (op, FLAG_OBJ_ORIGINAL); 296 SET_FLAG (op, FLAG_OBJ_ORIGINAL);
300 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);
301 } 298 }
302 else 299 else
303 { 300 {
304 op = insert_ob_in_ob (op, creator); 301 op = creator->insert (op);
305 302
306 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER)) 303 if ((flags & GT_APPLY) && QUERY_FLAG (creator, FLAG_MONSTER))
307 monster_check_apply (creator, op); 304 monster_check_apply (creator, op);
308 305
309 if ((flags & GT_UPDATE_INV) && (tmp = creator->in_player ())) 306 if ((flags & GT_UPDATE_INV) && (tmp = creator->in_player ()))
338 335
339 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance) 336 if ((int) t->chance >= 100 || (RANDOM () % 100 + 1) < (int) t->chance)
340 { 337 {
341 if (t->name) 338 if (t->name)
342 { 339 {
343 if (strcmp (t->name, "NONE") && difficulty >= t->magic) 340 if (difficulty >= t->magic)
344 { 341 {
345 treasurelist *tl = find_treasurelist (t->name); 342 treasurelist *tl = find_treasurelist (t->name);
346 if (tl) 343 if (tl)
347 create_treasure (tl, op, flag, difficulty, tries); 344 create_treasure (tl, op, flag, difficulty, tries);
348 } 345 }
349 } 346 }
350 else 347 else
351 { 348 {
352 if (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)) 349 if (t->item && (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE)))
353 { 350 {
354 tmp = arch_to_object (t->item); 351 tmp = arch_to_object (t->item);
355 if (t->nrof && tmp->nrof <= 1) 352 if (t->nrof && tmp->nrof <= 1)
356 tmp->nrof = RANDOM () % ((int) t->nrof) + 1; 353 tmp->nrof = RANDOM () % ((int) t->nrof) + 1;
357 fix_generated_item (tmp, op, difficulty, t->magic, flag); 354 fix_generated_item (tmp, op, difficulty, t->magic, flag);
397 return; 394 return;
398 } 395 }
399 396
400 if (t->name) 397 if (t->name)
401 { 398 {
402 if (!strcmp (t->name, "NONE"))
403 return;
404
405 if (difficulty >= t->magic) 399 if (difficulty >= t->magic)
406 { 400 {
407 treasurelist *tl = find_treasurelist (t->name); 401 treasurelist *tl = find_treasurelist (t->name);
408 if (tl) 402 if (tl)
409 create_treasure (tl, op, flag, difficulty, tries); 403 create_treasure (tl, op, flag, difficulty, tries);
412 create_one_treasure (tl, op, flag, difficulty, tries); 406 create_one_treasure (tl, op, flag, difficulty, tries);
413 407
414 return; 408 return;
415 } 409 }
416 410
417 if ((t->item && t->item->clone.invisible != 0) || flag != GT_INVISIBLE) 411 if (t->item && (t->item->clone.invisible != 0 || flag != GT_INVISIBLE))
418 { 412 {
419 object *tmp = arch_to_object (t->item); 413 object *tmp = arch_to_object (t->item);
420 414
421 if (!tmp) 415 if (!tmp)
422 return; 416 return;
436 * list transitions, or so that excessively good treasure will not be 430 * list transitions, or so that excessively good treasure will not be
437 * 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
438 * to do that. 432 * to do that.
439 */ 433 */
440void 434void
441create_treasure (treasurelist * t, object *op, int flag, int difficulty, int tries) 435create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries)
442{ 436{
443 437
444 if (tries++ > 100) 438 if (tries++ > 100)
445 { 439 {
446 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); 440 LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n");
447 return; 441 return;
448 } 442 }
449 if (t->total_chance) 443 if (tl->total_chance)
450 create_one_treasure (t, op, flag, difficulty, tries); 444 create_one_treasure (tl, op, flag, difficulty, tries);
451 else 445 else
452 create_all_treasures (t->items, op, flag, difficulty, tries); 446 create_all_treasures (tl->items, op, flag, difficulty, tries);
453} 447}
454 448
455/* This is similar to the old generate treasure function. However, 449/* This is similar to the old generate treasure function. However,
456 * 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
457 * create_treasure. We create a dummy object that the treasure gets 451 * create_treasure. We create a dummy object that the treasure gets
458 * inserted into, and then return that treausre 452 * inserted into, and then return that treausre
459 */ 453 */
460object * 454object *
461generate_treasure (treasurelist *t, int difficulty) 455generate_treasure (treasurelist *tl, int difficulty)
462{ 456{
463 difficulty = clamp (difficulty, 1, settings.max_level); 457 difficulty = clamp (difficulty, 1, settings.max_level);
464 458
465 object *ob = object::create (), *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 tmp->remove (); 466 tmp->remove ();
1178 */ 1172 */
1179 1173
1180static artifactlist * 1174static artifactlist *
1181get_empty_artifactlist (void) 1175get_empty_artifactlist (void)
1182{ 1176{
1183 artifactlist *tl = (artifactlist *) malloc (sizeof (artifactlist)); 1177 artifactlist *al = (artifactlist *) malloc (sizeof (artifactlist));
1184 1178
1185 if (tl == NULL) 1179 if (al == NULL)
1186 fatal (OUT_OF_MEMORY); 1180 fatal (OUT_OF_MEMORY);
1187 tl->next = NULL; 1181 al->next = NULL;
1188 tl->items = NULL; 1182 al->items = NULL;
1189 tl->total_chance = 0; 1183 al->total_chance = 0;
1190 return tl; 1184 return al;
1191} 1185}
1192 1186
1193/* 1187/*
1194 * Allocate and return the pointer to an empty artifact structure. 1188 * Allocate and return the pointer to an empty artifact structure.
1195 */ 1189 */
1196 1190
1197static artifact * 1191static artifact *
1198get_empty_artifact (void) 1192get_empty_artifact (void)
1199{ 1193{
1200 artifact *t = (artifact *) malloc (sizeof (artifact)); 1194 artifact *a = (artifact *) malloc (sizeof (artifact));
1201 1195
1202 if (t == NULL) 1196 if (a == NULL)
1203 fatal (OUT_OF_MEMORY); 1197 fatal (OUT_OF_MEMORY);
1204 t->item = NULL; 1198 a->item = NULL;
1205 t->next = NULL; 1199 a->next = NULL;
1206 t->chance = 0; 1200 a->chance = 0;
1207 t->difficulty = 0; 1201 a->difficulty = 0;
1208 t->allowed = NULL; 1202 a->allowed = NULL;
1209 return t; 1203 return a;
1210} 1204}
1211 1205
1212/* 1206/*
1213 * 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
1214 * of objects on it. 1208 * of objects on it.
1264 treasurelist *tl; 1258 treasurelist *tl;
1265 int i; 1259 int i;
1266 1260
1267 if (depth > 100) 1261 if (depth > 100)
1268 return; 1262 return;
1269 while (t != NULL) 1263 while (t)
1270 { 1264 {
1271 if (t->name != NULL) 1265 if (t->name)
1272 { 1266 {
1273 for (i = 0; i < depth; i++) 1267 for (i = 0; i < depth; i++)
1274 fprintf (logfile, " "); 1268 fprintf (logfile, " ");
1275 fprintf (logfile, "{ (list: %s)\n", &t->name); 1269 fprintf (logfile, "{ (list: %s)\n", &t->name);
1276 tl = find_treasurelist (t->name); 1270 tl = find_treasurelist (t->name);
1282 } 1276 }
1283 else 1277 else
1284 { 1278 {
1285 for (i = 0; i < depth; i++) 1279 for (i = 0; i < depth; i++)
1286 fprintf (logfile, " "); 1280 fprintf (logfile, " ");
1287 if (t->item->clone.type == FLESH) 1281 if (t->item && t->item->clone.type == FLESH)
1288 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name); 1282 fprintf (logfile, "%s's %s\n", name, &t->item->clone.name);
1289 else 1283 else
1290 fprintf (logfile, "%s\n", &t->item->clone.name); 1284 fprintf (logfile, "%s\n", &t->item->clone.name);
1291 } 1285 }
1286
1292 if (t->next_yes != NULL) 1287 if (t->next_yes)
1293 { 1288 {
1294 for (i = 0; i < depth; i++) 1289 for (i = 0; i < depth; i++)
1295 fprintf (logfile, " "); 1290 fprintf (logfile, " ");
1296 fprintf (logfile, " (if yes)\n"); 1291 fprintf (logfile, " (if yes)\n");
1297 dump_monster_treasure_rec (name, t->next_yes, depth + 1); 1292 dump_monster_treasure_rec (name, t->next_yes, depth + 1);
1298 } 1293 }
1294
1299 if (t->next_no != NULL) 1295 if (t->next_no)
1300 { 1296 {
1301 for (i = 0; i < depth; i++) 1297 for (i = 0; i < depth; i++)
1302 fprintf (logfile, " "); 1298 fprintf (logfile, " ");
1303 fprintf (logfile, " (if no)\n"); 1299 fprintf (logfile, " (if no)\n");
1304 dump_monster_treasure_rec (name, t->next_no, depth + 1); 1300 dump_monster_treasure_rec (name, t->next_no, depth + 1);
1305 } 1301 }
1302
1306 t = t->next; 1303 t = t->next;
1307 } 1304 }
1308} 1305}
1309 1306
1310/* 1307/*
1810/* special_potion() - so that old potion code is still done right. */ 1807/* special_potion() - so that old potion code is still done right. */
1811 1808
1812int 1809int
1813special_potion (object *op) 1810special_potion (object *op)
1814{ 1811{
1815
1816 int i;
1817
1818 if (op->attacktype) 1812 if (op->attacktype)
1819 return 1; 1813 return 1;
1820 1814
1821 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)
1822 return 1; 1816 return 1;
1823 1817
1824 for (i = 0; i < NROFATTACKS; i++) 1818 for (int i = 0; i < NROFATTACKS; i++)
1825 if (op->resist[i]) 1819 if (op->resist[i])
1826 return 1; 1820 return 1;
1827 1821
1828 return 0; 1822 return 0;
1829} 1823}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines