Crossfire Server, Trunk  R22010
treasure.c File Reference
#include "global.h"
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "loader.h"
#include "sproto.h"
#include "treasure.h"
+ Include dependency graph for treasure.c:

Go to the source code of this file.


#define DICE2   (get_magic(2) == 2 ? 2 : 1)
#define num_resist_table   19


static void change_treasure (treasure *t, object *op)
static void create_all_treasures (treasure *t, object *op, int flag, int difficulty, int tries)
static void create_one_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries)
void create_treasure (treasurelist *t, object *op, int flag, int difficulty, int tries)
void dump_monster_treasure (const char *name)
static void dump_monster_treasure_rec (const char *name, treasure *t, int depth)
static void fix_flesh_item (object *item, const object *donor)
void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags)
object * generate_treasure (treasurelist *t, int difficulty)
static int get_magic (int diff)
void init_archetype_pointers (void)
static int level_for_item (const object *op, int difficulty)
static int magic_from_difficulty (int difficulty)
static void put_treasure (object *op, object *creator, int flags)
void set_abs_magic (object *op, int magic)
static void set_magic (int difficulty, object *op, int max_magic, int flags)
static void set_ring_bonus (object *op, int bonus)
static int special_potion (object *op)
static void trap_adjust (object *trap, int difficulty)
static objectlink * treasure_find_matching_type (treasure *t, int type, objectlink *olp, int tries)
objectlink * treasurelist_find_matching_type (const treasurelist *randomitems, int type, int traverse)


static const int difftomagic_list [DIFFLEVELS][MAXMAGIC+1]
static int resist_table []
const char *const spell_mapping []

Detailed Description

Everything concerning treasures.

See also
Treasure lists

Definition in file treasure.c.

Macro Definition Documentation


#define DICE2   (get_magic(2) == 2 ? 2 : 1)

Definition at line 858 of file treasure.c.

Referenced by fix_generated_item().



Definition at line 859 of file treasure.c.

◆ num_resist_table

#define num_resist_table   19

Number of items in resist_table.

Definition at line 54 of file treasure.c.

Referenced by set_ring_bonus().



TREASURE_DEBUG does some checking on the treasurelists after loading. It is useful for finding bugs in the treasures file. Since it only slows the startup some (and not actual game play), it is by default left on

Definition at line 26 of file treasure.c.

Function Documentation

◆ dump_monster_treasure()

void dump_monster_treasure ( const char *  name)

For debugging purposes. Dumps all treasures for a given monster. Created originally by Raphael Quinet for debugging the alchemy code.

Definition at line 1227 of file treasure.c.

References dump_monster_treasure_rec(), get_next_archetype(), logfile, and strcasecmp().

Referenced by init_beforeplay().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dump_monster_treasure_rec()

static void dump_monster_treasure_rec ( const char *  name,
treasure t,
int  depth 

For debugging purposes. Dumps all treasures recursively (see below).

Definition at line 1182 of file treasure.c.

References find_treasurelist(), treasurestruct::item, treasureliststruct::items, logfile, treasurestruct::name, treasurestruct::next, treasurestruct::next_no, and treasurestruct::next_yes.

Referenced by dump_monster_treasure().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fix_flesh_item()

static void fix_flesh_item ( object *  item,
const object *  donor 

Objects of type FLESH are similar to type FOOD, except they inherit properties (name, food value, etc). based on the original owner (or 'donor' if you like). -b.t.

itemFLESH item to fix based on the donor.
donorwhat monster will give item.

Definition at line 1255 of file treasure.c.

References AT_ACID, AT_POISON, find_archetype(), FLAG_MONSTER, FLAG_NO_STEAL, FREE_AND_COPY, isqrt(), llevError, LOG(), MAX_BUF, NROFATTACKS, QUERY_FLAG, SET_FLAG, snprintf, and try_find_face().

Referenced by fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fix_generated_item()

void fix_generated_item ( object *  op,
object *  creator,
int  difficulty,
int  max_magic,
int  flags 

fix_generated_item(): This is called after an item is generated, in order to set it up right. This produced magical bonuses, puts spells into scrolls/books/wands, makes it unidentified, hides the value, etc.

4/28/96 added creator object from which op may now inherit properties based on op->type. Right now, which stuff the creator passes on is object type dependant. I know this is a spagetti manuever, but is there a cleaner way to do this? b.t.

opobject to fix.
creatorfor who op was created. Can be NULL.
difficultydifficulty level.
max_magicmaximum magic for the item.
  • GT_ENVIRONMENT: if not set, calls fix_flesh_item().
  • GT_STARTEQUIP: Sets FLAG_STARTEQUIP on item if appropriate, or clears the item's value.
  • GT_MINIMAL: Does minimal processing on the object - just enough to make it a working object - don't change magic, value, etc, but set it material type as appropriate, for objects that need spell objects, set those, etc

Definition at line 887 of file treasure.c.

References add_string(), amulet_arch, calc_item_power(), CHANCE_FOR_ARTIFACT, create_archetype(), create_treasure(), crown_arch, DICE2, fix_flesh_item(), FLAG_ALIVE, FLAG_BLESSED, FLAG_CURSED, FLAG_DAMNED, FLAG_IS_THROWN, FLAG_MONSTER, FLAG_NO_PICK, FLAG_STARTEQUIP, FREE_AND_COPY, generate_artifact(), GET_ANIM_ID, get_power_from_ench(), GT_ENVIRONMENT, GT_MINIMAL, GT_ONLY_GOOD, GT_STARTEQUIP, level_for_item(), llevDebug, LOG(), NUM_ANIMATIONS, object_free_drop_inventory(), object_insert_in_ob(), object_remove(), QUERY_FLAG, RANDOM, ring_arch, rndm(), rod_adjust(), SET_ANIMATION, SET_FLAG, set_magic(), set_materialname(), set_ring_bonus(), special_potion(), spell_mapping, tailor_readable_ob(), and trap_adjust().

Referenced by convert_item(), create_all_treasures(), create_one_treasure(), god_gives_present(), move_creator(), and polymorph_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ get_magic()

static int get_magic ( int  diff)

get_magic(diff) will return a random number between 0 and 4. diff can be any value above 2. The higher the diff-variable, the higher is the chance of returning a low number. It is only used in fix_generated_treasure() to set bonuses on rings and amulets. Another scheme is used to calculate the magic of weapons and armours.

Definition at line 799 of file treasure.c.

References RANDOM.

◆ init_archetype_pointers()

void init_archetype_pointers ( void  )

Initialize global archtype pointers:

Definition at line 65 of file treasure.c.

References amulet_arch, crown_arch, find_archetype(), and ring_arch.

Referenced by init_beforeplay().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ level_for_item()

static int level_for_item ( const object *  op,
int  difficulty 

Calculate the appropriate level for wands staves and scrolls.

This code presumes that op has had its spell object created (in op->inv)

opitem we're trying to get the level of
difficultymap difficulty.
generated level, 0 if invalid item.

Definition at line 312 of file treasure.c.

References level, llevError, LOG(), MAX_SPELLITEM_LEVEL, and rndm().

Referenced by fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ magic_from_difficulty()

static int magic_from_difficulty ( int  difficulty)

This is used when determining the magical bonus created on specific maps.

random magic bonus.

Definition at line 561 of file treasure.c.

References DIFFLEVELS, difftomagic_list, llevError, LOG(), MAXMAGIC, and RANDOM.

Referenced by set_magic().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_abs_magic()

void set_abs_magic ( object *  op,
int  magic 

Sets magical bonus in an object, and recalculates the effect on the armour variable, and the effect on speed of armour. This function doesn't work properly, should add use of archetypes to make it truly absolute.

Patched to utilize settings values for the speed/weight adjustments, rather than hardcoded ones. Daniel Hawkins 2021-01-19

opobject we're modifying.
magicmagic modifier.

Definition at line 601 of file treasure.c.

References Settings::armor_speed_improvement, Settings::armor_speed_linear, Settings::armor_weight_linear, Settings::armor_weight_reduction, ARMOUR_SPEED, RANDOM, and settings.

Referenced by add_abilities(), command_create(), improve_armour(), and set_magic().

+ Here is the caller graph for this function:

◆ set_magic()

static void set_magic ( int  difficulty,
object *  op,
int  max_magic,
int  flags 

Sets a random magical bonus in the given object based upon the given difficulty, and the given max possible bonus.

Item will be cursed if magic is megative.

difficultydifficulty we want the item to be.
opthe object.
max_magicwhat should be the maximum magic of the item.
flagscombination of GT_xxx flags.

Definition at line 649 of file treasure.c.

References FLAG_CURSED, GT_ONLY_GOOD, magic_from_difficulty(), set_abs_magic(), and SET_FLAG.

Referenced by command_create(), and fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_ring_bonus()

static void set_ring_bonus ( object *  op,
int  bonus 

Randomly adds one magical ability to the given object.

Modified for Partial Resistance in many ways: 1) Since rings can have multiple bonuses, if the same bonus is rolled again, increase it - the bonuses now stack with other bonuses previously rolled and ones the item might natively have. 2) Add code to deal with new PR method.

Changes the item's value.

opring or amulet to change.
bonusbonus to add to item.

Definition at line 678 of file treasure.c.

References FABS, FLAG_REFL_MISSILE, FLAG_REFL_SPELL, get_attr_value(), num_resist_table, RANDOM, resist_table, set_attr_value(), and SET_FLAG.

Referenced by fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ special_potion()

static int special_potion ( object *  op)

Check if object is a special potion.

opobject to check.
1 if op is a special potion (resistance, attribute, ...), 0 else.

Definition at line 1331 of file treasure.c.


Referenced by fix_generated_item().

+ Here is the caller graph for this function:

◆ trap_adjust()

static void trap_adjust ( object *  trap,
int  difficulty 

Adjust trap difficulty to the map. The default traps are too strong for wimpy level 1 players, and unthreatening to anyone of high level

traptrap to adjust.
difficultymap difficulty.

Definition at line 820 of file treasure.c.

References AT_DEATH, AT_POISON, and rndm().

Referenced by fix_generated_item().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ treasure_find_matching_type()

static objectlink* treasure_find_matching_type ( treasure t,
int  type,
objectlink *  olp,
int  tries 

This is the function that does the actual work for treasurelist_find_matching_type(). See notes below on what we are doing here. Note that the logic here follows that of create_all_treasures(), except we do not care about difficulty or chances.

ttreasure entry we are working on.
typeobject type we are matching against.
olplinked list pointer, may be null.
triesFor each depth, increases by one. This is needed because treasurelists can loop back on each other (A->B, B->C, C->A), so we needto make sure we do not get in an infinite loop.
linked list of entries. This may be NULL if nothing is found.

Definition at line 1373 of file treasure.c.

References find_treasurelist(), get_objectlink(), treasurestruct::item, treasureliststruct::items, treasurestruct::name, treasurestruct::next, treasurestruct::next_no, and treasurestruct::next_yes.

Referenced by treasurelist_find_matching_type().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ treasurelist_find_matching_type()

objectlink* treasurelist_find_matching_type ( const treasurelist randomitems,
int  type,
int  traverse 

This function looks at the passed in treasurelist and returns all objects on it, or on treasurelists it references, of matching type. The oblinkpt linked list will return a pointer to all the archetype clones. This is useful for functions that need to examine treasurelists and potentially revoke or add a partial set of items on the list. This removes the need of other functions to have their own parsing logic of treasurelists. Note that this will return all objects that may show up on the the treasurelist of matching type. This does not look at difficulty, yes/no combinations, etc. In general, functions that call this should have some idea of what the treasurelist may be/what it may have on it. The contents of the linked list may not be unique - it is entirely possible that due to treasurelist traversals, the same item shows up multiple times, and there is no check here for that. The order of items on the returned linked list should not be taken to be meaningful in any way - based on different processing algorithms, the results could change. As of this writing, order is reverse from that of the treasurelists, simply because that is fastest way to process them.

randomitemsThe treasurelist to examine.
typethe object type (arch->clone.type) to match against.
traverseIf true, then this will process any treasurelists that this treasurelist points to, and so on.
oblinkpt linked list containing pointers to the arch->clone fields. Those objects should not be altered in any way, and must be copied to a new object before being used. the returned oblinkpt must be freed with free_objectlink(), otherwise, this will result in a memory leak.

Definition at line 1450 of file treasure.c.

References treasureliststruct::items, and treasure_find_matching_type().

Referenced by START_TEST().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ difftomagic_list

const int difftomagic_list[DIFFLEVELS][MAXMAGIC+1]

Based upon the specified difficulty and upon the difftomagic_list array, a random magical bonus is returned. This is a new way of calculating the chance for an item to have a specific magical bonus The array has two arguments, the difficulty of the level, and the magical bonus "wanted".

Definition at line 348 of file treasure.c.

Referenced by magic_from_difficulty().

◆ resist_table

int resist_table[]
Initial value:
= {
Definition: attack.h:62
Definition: attack.h:65
#define ATNR_SLOW
Definition: attack.h:60
Definition: attack.h:54
Definition: attack.h:61
Definition: attack.h:73
#define ATNR_DEATH
Definition: attack.h:66
#define ATNR_BLIND
Definition: attack.h:71
#define ATNR_FEAR
Definition: attack.h:63
#define ATNR_MAGIC
Definition: attack.h:50
Definition: attack.h:70
Definition: attack.h:49
Definition: attack.h:52
Definition: attack.h:59
#define ATNR_DRAIN
Definition: attack.h:56
Definition: attack.h:58
#define ATNR_COLD
Definition: attack.h:53
#define ATNR_ACID
Definition: attack.h:55
#define ATNR_FIRE
Definition: attack.h:51
Definition: attack.h:74

Resistances which can show up on rings and amulets. If you want to weight things so certain resistances show up more often than others, just add more entries in the table for the protections you want to show up.

Definition at line 45 of file treasure.c.

Referenced by set_ring_bonus().

◆ spell_mapping

const char* const spell_mapping[]

Referenced by fix_generated_item().