本文整理汇总了C++中randcalc函数的典型用法代码示例。如果您正苦于以下问题:C++ randcalc函数的具体用法?C++ randcalc怎么用?C++ randcalc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了randcalc函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: ego_apply_magic
/**
* Apply generation magic to an ego-item.
*/
void ego_apply_magic(struct object *obj, int level)
{
int i, x, resist = 0;
bitflag newf[OF_SIZE];
/* Extra powers */
if (kf_has(obj->ego->kind_flags, KF_RAND_SUSTAIN)) {
create_mask(newf, false, OFT_SUST, OFT_MAX);
of_on(obj->flags, get_new_attr(obj->flags, newf));
}
else if (kf_has(obj->ego->kind_flags, KF_RAND_POWER)) {
create_mask(newf, false, OFT_PROT, OFT_MISC, OFT_MAX);
of_on(obj->flags, get_new_attr(obj->flags, newf));
}
else if (kf_has(obj->ego->kind_flags, KF_RAND_HI_RES))
/* Get a high resist if available, mark it as random */
if (random_high_resist(obj, &resist)) {
obj->el_info[resist].res_level = 1;
obj->el_info[resist].flags |= EL_INFO_RANDOM;
}
/* Apply extra obj->ego bonuses */
obj->to_h += randcalc(obj->ego->to_h, level, RANDOMISE);
obj->to_d += randcalc(obj->ego->to_d, level, RANDOMISE);
obj->to_a += randcalc(obj->ego->to_a, level, RANDOMISE);
/* Apply modifiers */
for (i = 0; i < OBJ_MOD_MAX; i++) {
x = randcalc(obj->ego->modifiers[i], level, RANDOMISE);
obj->modifiers[i] += x;
}
/* Apply flags */
of_union(obj->flags, obj->ego->flags);
of_diff(obj->flags, obj->ego->flags_off);
/* Add slays and brands */
copy_slay(&obj->slays, obj->ego->slays);
copy_brand(&obj->brands, obj->ego->brands);
/* Add resists */
for (i = 0; i < ELEM_MAX; i++) {
/* Take the larger of ego and base object resist levels */
obj->el_info[i].res_level =
MAX(obj->ego->el_info[i].res_level, obj->el_info[i].res_level);
/* Union of flags so as to know when ignoring is notable */
obj->el_info[i].flags |= obj->ego->el_info[i].flags;
}
/* Add effect (ego effect will trump object effect, when there are any) */
if (obj->ego->effect) {
obj->effect = obj->ego->effect;
obj->time = obj->ego->time;
}
return;
}
开发者ID:Axydlbaaxr,项目名称:angband,代码行数:61,代码来源:obj-make.c
示例2: object_prep
/**
* Prepare an object based on an object kind.
*/
void object_prep(object_type * o_ptr, int k_idx, aspect rand_aspect)
{
int i;
object_kind *k_ptr = &k_info[k_idx];
/* Clear the record */
(void) WIPE(o_ptr, object_type);
/* Save the kind */
o_ptr->k_idx = k_idx;
o_ptr->kind = k_ptr;
/* Efficiency -- tval/sval */
o_ptr->tval = k_ptr->tval;
o_ptr->sval = k_ptr->sval;
/* Default "pval" */
o_ptr->pval = randcalc(k_ptr->pval, k_ptr->level, rand_aspect);
/* Default number */
o_ptr->number = 1;
/* Default weight */
o_ptr->weight = k_ptr->weight;
/* Default magic */
o_ptr->to_h = randcalc(k_ptr->to_h, k_ptr->level, rand_aspect);
o_ptr->to_d = randcalc(k_ptr->to_d, k_ptr->level, rand_aspect);
o_ptr->to_a = randcalc(k_ptr->to_a, k_ptr->level, rand_aspect);
/* Default power */
o_ptr->ac = k_ptr->ac;
o_ptr->dd = k_ptr->dd;
o_ptr->ds = k_ptr->ds;
/* Default effect and time */
o_ptr->effect = k_ptr->effect;
o_ptr->time = k_ptr->time;
/* Default flags */
of_copy(o_ptr->flags_obj, k_ptr->flags_obj);
cf_copy(o_ptr->flags_curse, k_ptr->flags_curse);
/* Default resists, bonuses, multiples */
for (i = 0; i < MAX_P_RES; i++)
o_ptr->percent_res[i] = k_ptr->percent_res[i];
for (i = 0; i < A_MAX; i++)
o_ptr->bonus_stat[i] = k_ptr->bonus_stat[i];
for (i = 0; i < MAX_P_BONUS; i++)
o_ptr->bonus_other[i] = k_ptr->bonus_other[i];
for (i = 0; i < MAX_P_SLAY; i++)
o_ptr->multiple_slay[i] = k_ptr->multiple_slay[i];
for (i = 0; i < MAX_P_BRAND; i++)
o_ptr->multiple_brand[i] = k_ptr->multiple_brand[i];
}
开发者ID:LostTemplar,项目名称:Beleriand,代码行数:59,代码来源:obj-make.c
示例3: kind_is_good
/**
* Test whether an object is intrinsically good.
*
* Note that this test only applies to the object *kind*, so it is
* possible to choose a kind which is good, and then later cause
* the actual object to be cursed. We do explicitly forbid objects
* which are known to be boring or which start out somewhat damaged.
*/
static bool kind_is_good(const object_kind *kind)
{
if (of_has(kind->flags, OF_GOOD) ||
of_has(kind->base->flags, OF_GOOD)) return TRUE;
if (randcalc(kind->to_a, 0, MINIMISE) < 0) return FALSE;
if (randcalc(kind->to_d, 0, MINIMISE) < 0) return FALSE;
if (kind_is_armour(kind->tval)) return TRUE;
if (randcalc(kind->to_h, 0, MINIMISE) < 0) return FALSE;
if (kind_is_weapon(kind->tval) || kind_is_ammo(kind->tval)) return TRUE;
return FALSE;
}
开发者ID:nomadicwriter,项目名称:v4,代码行数:19,代码来源:obj-make.c
示例4: object_prep
/**
* Wipe an object clean and make it a standard object of the specified kind.
*/
void object_prep(object_type *o_ptr, struct object_kind *k, int lev,
aspect rand_aspect)
{
int i, flag, pval;
bitflag flags[OF_SIZE], f2[OF_SIZE];
/* Clean slate */
WIPE(o_ptr, object_type);
/* Assign the kind and copy across data */
o_ptr->kind = k;
o_ptr->tval = k->tval;
o_ptr->sval = k->sval;
o_ptr->ac = k->ac;
o_ptr->dd = k->dd;
o_ptr->ds = k->ds;
o_ptr->weight = k->weight;
/* Default number */
o_ptr->number = 1;
/* Apply pvals and then copy flags */
of_copy(f2, k->flags);
for (i = 0; i < k->num_pvals; i++) {
of_copy(flags, k->pval_flags[i]);
pval = randcalc(k->pval[i], lev, rand_aspect);
for (flag = of_next(flags, FLAG_START); flag != FLAG_END;
flag = of_next(flags, flag + 1))
/* Prevent phantom flags */
if (pval)
object_add_pval(o_ptr, pval, flag);
else
of_off(f2, flag);
}
of_copy(o_ptr->flags, k->base->flags);
of_union(o_ptr->flags, f2);
/* Assign charges/food/fuel value (wands/staves/food/oil) */
o_ptr->extent = randcalc(k->extent, lev, rand_aspect);
/* Default fuel for lamps */
if (o_ptr->tval == TV_LIGHT) {
if (o_ptr->sval == SV_LIGHT_TORCH)
o_ptr->timeout = DEFAULT_TORCH;
else if (o_ptr->sval == SV_LIGHT_LANTERN)
o_ptr->timeout = DEFAULT_LAMP;
}
/* Default magic */
o_ptr->to_h = randcalc(k->to_h, lev, rand_aspect);
o_ptr->to_d = randcalc(k->to_d, lev, rand_aspect);
o_ptr->to_a = randcalc(k->to_a, lev, rand_aspect);
}
开发者ID:nomadicwriter,项目名称:v4,代码行数:56,代码来源:obj-make.c
示例5: adjust_dam
/**
* Adjust damage according to resistance or vulnerability.
*
* \param p is the player
* \param type is the attack type we are checking.
* \param dam is the unadjusted damage.
* \param dam_aspect is the calc we want (min, avg, max, random).
* \param resist is the degree of resistance (-1 = vuln, 3 = immune).
*/
int adjust_dam(struct player *p, int type, int dam, aspect dam_aspect,
int resist, bool actual)
{
int i, denom = 0;
/* If an actual player exists, get their actual resist */
if (p && p->race) {
/* Ice is a special case */
int res_type = (type == PROJ_ICE) ? PROJ_COLD: type;
resist = p->state.el_info[res_type].res_level;
/* Notice element stuff */
if (actual) {
equip_learn_element(p, res_type);
}
}
if (resist == 3) /* immune */
return 0;
/* Hack - acid damage is halved by armour, holy orb is halved */
if ((type == PROJ_ACID && p && minus_ac(p)) || type == PROJ_HOLY_ORB)
dam = (dam + 1) / 2;
if (resist == -1) /* vulnerable */
return (dam * 4 / 3);
/* Variable resists vary the denominator, so we need to invert the logic
* of dam_aspect. (m_bonus is unused) */
switch (dam_aspect) {
case MINIMISE:
denom = randcalc(projections[type].denominator, 0, MAXIMISE);
break;
case MAXIMISE:
denom = randcalc(projections[type].denominator, 0, MINIMISE);
break;
case AVERAGE:
case EXTREMIFY:
case RANDOMISE:
denom = randcalc(projections[type].denominator, 0, dam_aspect);
break;
default:
assert(0);
}
for (i = resist; i > 0; i--)
if (denom)
dam = dam * projections[type].numerator / denom;
return dam;
}
开发者ID:datatypevoid,项目名称:angband,代码行数:60,代码来源:project-player.c
示例6: object_copy_amt
/**
* Prepare an object `dst` representing `amt` objects, based on an existing
* object `src` representing at least `amt` objects.
*
* Takes care of the charge redistribution concerns of stacked items.
*/
void object_copy_amt(struct object *dest, struct object *src, int amt)
{
int charge_time = randcalc(src->time, 0, AVERAGE), max_time;
/* Get a copy of the object */
object_copy(dest, src);
/* Modify quantity */
dest->number = amt;
dest->note = src->note;
/*
* If the item has charges/timeouts, set them to the correct level
* too. We split off the same amount as distribute_charges.
*/
if (tval_can_have_charges(src))
dest->pval = src->pval * amt / src->number;
if (tval_can_have_timeout(src)) {
max_time = charge_time * amt;
if (src->timeout > max_time)
dest->timeout = max_time;
else
dest->timeout = src->timeout;
}
}
开发者ID:fizzix,项目名称:angband,代码行数:33,代码来源:obj-pile.c
示例7: monster_critical
/**
* Critical blow. All hits that do 95% of total possible damage,
* and which also do at least 20 damage, or, sometimes, N damage.
* This is used only to determine "cuts" and "stuns".
*/
static int monster_critical(random_value dice, int rlev, int dam)
{
int max = 0;
int total = randcalc(dice, rlev, MAXIMISE);
/* Must do at least 95% of perfect */
if (dam < total * 19 / 20) return (0);
/* Weak blows rarely work */
if ((dam < 20) && (randint0(100) >= dam)) return (0);
/* Perfect damage */
if (dam == total) max++;
/* Super-charge */
if (dam >= 20)
while (randint0(100) < 2) max++;
/* Critical damage */
if (dam > 45) return (6 + max);
if (dam > 33) return (5 + max);
if (dam > 25) return (4 + max);
if (dam > 18) return (3 + max);
if (dam > 11) return (2 + max);
return (1 + max);
}
开发者ID:CrypticGator,项目名称:angband,代码行数:31,代码来源:mon-attack.c
示例8: place_trap
/**
* Make a new trap of the given type. Return true if successful.
*
* We choose a player trap at random if the index is not legal. This means that
* things which are not player traps must be picked by passing a valid index.
*
* This should be the only function that places traps in the dungeon
* except the savefile loading code.
*/
void place_trap(struct chunk *c, int y, int x, int t_idx, int trap_level)
{
struct trap *new_trap;
/* We've been called with an illegal index; choose a random trap */
if ((t_idx <= 0) || (t_idx >= z_info->trap_max)) {
/* Require the correct terrain */
if (!square_player_trap_allowed(c, y, x)) return;
t_idx = pick_trap(c, c->squares[y][x].feat, trap_level);
}
/* Failure */
if (t_idx < 0) return;
/* Allocate a new trap for this grid (at the front of the list) */
new_trap = mem_zalloc(sizeof(*new_trap));
new_trap->next = square_trap(c, y, x);
c->squares[y][x].trap = new_trap;
/* Set the details */
new_trap->t_idx = t_idx;
new_trap->kind = &trap_info[t_idx];
new_trap->fy = y;
new_trap->fx = x;
new_trap->power = randcalc(new_trap->kind->power, trap_level, RANDOMISE);
trf_copy(new_trap->flags, trap_info[t_idx].flags);
/* Toggle on the trap marker */
sqinfo_on(c->squares[y][x].info, SQUARE_TRAP);
/* Redraw the grid */
square_light_spot(c, y, x);
}
开发者ID:magnate,项目名称:angband,代码行数:43,代码来源:trap.c
示例9: kind_is_good
/**
* Hack -- determine if a template is "good".
*
* Note that this test only applies to the object *kind*, so it is
* possible to choose a kind which is "good", and then later cause
* the actual object to be cursed. We do explicitly forbid objects
* which are known to be boring or which start out somewhat damaged.
*/
bool kind_is_good(const struct object_kind *kind)
{
/* Some item types are (almost) always good */
switch (kind->tval)
{
/* Armor -- Good unless damaged */
case TV_HARD_ARMOR:
case TV_SOFT_ARMOR:
case TV_DRAG_ARMOR:
case TV_SHIELD:
case TV_CLOAK:
case TV_BOOTS:
case TV_GLOVES:
case TV_HELM:
case TV_CROWN:
{
if (randcalc(kind->to_a, 0, MINIMISE) < 0) return (false);
return true;
}
/* Weapons -- Good unless damaged */
case TV_BOW:
case TV_SWORD:
case TV_HAFTED:
case TV_POLEARM:
case TV_DIGGING:
{
if (randcalc(kind->to_h, 0, MINIMISE) < 0) return (false);
if (randcalc(kind->to_d, 0, MINIMISE) < 0) return (false);
return true;
}
/* Ammo -- Arrows/Bolts are good */
case TV_BOLT:
case TV_ARROW:
{
return true;
}
}
/* Anything with the GOOD flag */
if (kf_has(kind->kind_flags, KF_GOOD))
return true;
/* Assume not good */
return (false);
}
开发者ID:CrypticGator,项目名称:angband,代码行数:55,代码来源:obj-make.c
示例10: obj_known_effect
/**
* Gives the known effects of using the given item.
*
* Fills in:
* - the effect
* - whether the effect can be aimed
* - the minimum and maximum time in game turns for the item to recharge
* (or zero if it does not recharge)
* - the percentage chance of the effect failing when used
*
* Return false if the object has no effect.
*/
static bool obj_known_effect(const struct object *obj, struct effect **effect,
bool *aimed, int *min_recharge,
int *max_recharge, int *failure_chance)
{
random_value timeout = {0, 0, 0, 0};
*effect = 0;
*min_recharge = 0;
*max_recharge = 0;
*failure_chance = 0;
*aimed = false;
if (object_effect_is_known(obj)) {
*effect = object_effect(obj);
timeout = obj->time;
if (effect_aim(*effect))
*aimed = true;;
} else if (object_effect(obj)) {
/* Don't know much - be vague */
*effect = NULL;
if (!obj->artifact && effect_aim(object_effect(obj)))
*aimed = true;
return true;
} else {
/* No effect - no info */
return false;
}
if (randcalc(timeout, 0, MAXIMISE) > 0) {
*min_recharge = randcalc(timeout, 0, MINIMISE);
*max_recharge = randcalc(timeout, 0, MAXIMISE);
}
if (tval_is_edible(obj) || tval_is_potion(obj) || tval_is_scroll(obj)) {
*failure_chance = 0;
} else {
*failure_chance = get_use_device_chance(obj);
}
return true;
}
开发者ID:Chillbon,项目名称:angband,代码行数:55,代码来源:obj-info.c
示例11: make_object
/**
* Attempt to make an object
*
* \param c is the current dungeon level.
* \param j_ptr is the object struct to be populated.
* \param lev is the creation level of the object (not necessarily == depth).
* \param good is whether the object is to be good
* \param great is whether the object is to be great
* \param value is the value to be returned to the calling function
*
* Returns the whether or not creation worked.
*/
bool make_object(struct cave *c, object_type *j_ptr, int lev, bool good,
bool great, s32b *value)
{
int base, art, div;
object_kind *kind;
/* Base level and artifact chance for the object */
if (great) {
art = ART_GREAT;
base = lev + 10 + m_bonus(5, lev);
} else if (good) {
art = ART_GOOD;
base = lev + 5 + m_bonus(5, lev);
} else {
art = ART_NORMAL;
base = lev;
}
/* Small hack to bring artifact frequencies at low depths in line with V */
div = 9 - p_ptr->depth;
if (div < 1)
div = 1;
/* Try to make an artifact */
if (one_in_(art * div)) {
if (make_artifact(j_ptr, lev)) {
if (value)
*value = object_value_real(j_ptr, 1, FALSE, TRUE);
return TRUE;
}
}
/* Get the object, prep it and apply magic */
kind = get_obj_num(base, good || great);
if (!kind) return FALSE;
object_prep(j_ptr, kind, base, RANDOMISE);
apply_magic(j_ptr, base, FALSE, good, great);
/* Generate multiple items */
if (kind->gen_mult_prob >= randint1(100))
j_ptr->number = randcalc(kind->stack_size, lev, RANDOMISE);
if (j_ptr->number >= MAX_STACK_SIZE)
j_ptr->number = MAX_STACK_SIZE - 1;
/* Return value, increased for uncursed out-of-depth objects */
if (value)
*value = object_value_real(j_ptr, j_ptr->number, FALSE, TRUE);
if (!cursed_p(j_ptr->flags) && (kind->alloc_min > c->depth)) {
if (value) *value = (kind->alloc_min - c->depth) * (*value / 5);
}
return TRUE;
}
开发者ID:nomadicwriter,项目名称:v4,代码行数:67,代码来源:obj-make.c
示例12: ego_apply_magic
/**
* Apply generation magic to an ego-item.
*/
void ego_apply_magic(object_type *o_ptr, int level)
{
int i, flag, x;
bitflag flags[OF_SIZE], newf[OF_SIZE], f2[OF_SIZE];
object_flags(o_ptr, flags);
/* Extra powers */
if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_SUSTAIN)
create_mask(newf, FALSE, OFT_SUST, OFT_MAX);
else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_RESIST)
create_mask(newf, FALSE, OFT_HRES, OFT_MAX);
else if (o_ptr->ego->xtra == OBJECT_XTRA_TYPE_POWER)
create_mask(newf, FALSE, OFT_PROT, OFT_MISC, OFT_MAX);
if (o_ptr->ego->xtra)
of_on(o_ptr->flags, get_new_attr(flags, newf));
/* Apply extra o_ptr->ego bonuses */
o_ptr->to_h += randcalc(o_ptr->ego->to_h, level, RANDOMISE);
o_ptr->to_d += randcalc(o_ptr->ego->to_d, level, RANDOMISE);
o_ptr->to_a += randcalc(o_ptr->ego->to_a, level, RANDOMISE);
/* Apply pvals */
of_copy(f2, o_ptr->ego->flags);
for (i = 0; i < o_ptr->ego->num_pvals; i++) {
of_copy(flags, o_ptr->ego->pval_flags[i]);
x = randcalc(o_ptr->ego->pval[i], level, RANDOMISE);
for (flag = of_next(flags, FLAG_START); flag != FLAG_END;
flag = of_next(flags, flag + 1))
/* Prevent phantom flags */
if (x)
object_add_pval(o_ptr, x, flag);
else
of_off(f2, flag);
}
/* Apply remaining flags */
of_union(o_ptr->flags, f2);
return;
}
开发者ID:Dasaan,项目名称:angband,代码行数:45,代码来源:obj-make.c
示例13: make_artifact_special
/**
* Attempt to make an object
*
* \param c is the current dungeon level.
* \param lev is the creation level of the object (not necessarily == depth).
* \param good is whether the object is to be good
* \param great is whether the object is to be great
* \param extra_roll is whether we get an extra roll in apply_magic()
* \param value is the value to be returned to the calling function
* \param tval is the desired tval, or 0 if we allow any tval
*
* \return a pointer to the newly allocated object, or NULL on failure.
*/
struct object *make_object(struct chunk *c, int lev, bool good, bool great,
bool extra_roll, s32b *value, int tval)
{
int base;
struct object_kind *kind;
struct object *new_obj;
/* Try to make a special artifact */
if (one_in_(good ? 10 : 1000)) {
new_obj = make_artifact_special(lev);
if (new_obj) {
if (value) *value = object_value_real(new_obj, 1, false);
return new_obj;
}
/* If we failed to make an artifact, the player gets a good item */
good = true;
}
/* Base level for the object */
base = (good ? (lev + 10) : lev);
/* Try to choose an object kind */
kind = get_obj_num(base, good || great, tval);
if (!kind)
return NULL;
/* Make the object, prep it and apply magic */
new_obj = object_new();
object_prep(new_obj, kind, lev, RANDOMISE);
if (one_in_(20) && tval_is_wearable(new_obj)) {
apply_curse(new_obj, &lev);
}
apply_magic(new_obj, lev, true, good, great, extra_roll);
apply_curse_knowledge(new_obj);
/* Generate multiple items */
if (kind->gen_mult_prob >= randint1(100))
new_obj->number = randcalc(kind->stack_size, lev, RANDOMISE);
if (new_obj->number > z_info->stack_size)
new_obj->number = z_info->stack_size;
/* Get the value */
if (value)
*value = object_value_real(new_obj, new_obj->number, false);
/* Boost of 20% per level OOD for uncursed objects */
if ((!new_obj->curses) && (kind->alloc_min > c->depth)) {
if (value) *value += (kind->alloc_min - c->depth) * (*value / 5);
}
return new_obj;
}
开发者ID:fizzix,项目名称:angband,代码行数:67,代码来源:obj-make.c
示例14: object_prep
/*
* Prepare an object based on an object kind.
* Use the specified randomization aspect
*/
void object_prep(object_type *o_ptr, int k_idx, int lev, aspect rand_aspect)
{
object_kind *k_ptr = &k_info[k_idx];
/* Clear the record */
(void)WIPE(o_ptr, object_type);
/* Save the kind index */
o_ptr->k_idx = k_idx;
/* Efficiency -- tval/sval */
o_ptr->tval = k_ptr->tval;
o_ptr->sval = k_ptr->sval;
/* Default number */
o_ptr->number = 1;
/* Default "pval" */
o_ptr->pval = randcalc(k_ptr->pval, lev, rand_aspect);
/* Default weight */
o_ptr->weight = k_ptr->weight;
/* Assign charges (wands/staves only) */
if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF)
o_ptr->pval = randcalc(k_ptr->charge, lev, rand_aspect);
/* Default magic */
o_ptr->to_h = randcalc(k_ptr->to_h, lev, rand_aspect);
o_ptr->to_d = randcalc(k_ptr->to_d, lev, rand_aspect);
o_ptr->to_a = randcalc(k_ptr->to_a, lev, rand_aspect);
/* Default power */
o_ptr->ac = k_ptr->ac;
o_ptr->dd = k_ptr->dd;
o_ptr->ds = k_ptr->ds;
/* Hack -- cursed items are always "cursed" */
if (of_has(k_ptr->flags, OF_LIGHT_CURSE))
of_on(o_ptr->flags, OF_LIGHT_CURSE);
}
开发者ID:cinereaste,项目名称:angband,代码行数:45,代码来源:obj-make.c
示例15: obj_known_effect
/**
* Gives the known effects of using the given item.
*
* Fills in:
* - the effect id, or OBJ_KNOWN_PRESENT if there is an effect but details
* are unknown
* - whether the effect can be aimed
* - the minimum and maximum time in game turns for the item to recharge
* (or zero if it does not recharge)
* - the percentage chance of the effect failing when used
*
* Return FALSE if the object has no effect.
*/
static bool obj_known_effect(const struct object *obj, int *effect, bool *aimed, int *min_recharge, int *max_recharge, int *failure_chance)
{
random_value timeout = {0, 0, 0, 0};
*effect = 0;
*min_recharge = 0;
*max_recharge = 0;
*failure_chance = 0;
*aimed = FALSE;
if (object_effect_is_known(obj)) {
*effect = object_effect(obj);
timeout = obj->time;
} else if (object_effect(obj)) {
/* Don't know much - be vague */
*effect = OBJ_KNOWN_PRESENT;
if (!obj->artifact && effect_aim(obj->effect))
*aimed = TRUE;
return TRUE;
} else {
/* No effect - no info */
return FALSE;
}
if (randcalc(timeout, 0, MAXIMISE) > 0) {
*min_recharge = randcalc(timeout, 0, MINIMISE);
*max_recharge = randcalc(timeout, 0, MAXIMISE);
}
if (tval_is_food(obj) || tval_is_potion(obj) || tval_is_scroll(obj)) {
*failure_chance = 0;
} else {
*failure_chance = get_use_device_chance(obj);
}
return TRUE;
}
开发者ID:pnd10,项目名称:angband,代码行数:52,代码来源:obj-info.c
示例16: make_artifact_special
/**
* Attempt to make an object
*
* \param c is the current dungeon level.
* \param lev is the creation level of the object (not necessarily == depth).
* \param good is whether the object is to be good
* \param great is whether the object is to be great
* \param extra_roll is whether we get an extra roll in apply_magic()
* \param value is the value to be returned to the calling function
* \param tval is the desired tval, or 0 if we allow any tval
*
* \return a pointer to the newly allocated object, or NULL on failure.
*/
struct object *make_object(struct chunk *c, int lev, bool good, bool great,
bool extra_roll, s32b *value, int tval)
{
int base;
object_kind *kind;
struct object *new_obj;
/* Try to make a special artifact */
if (one_in_(good ? 10 : 1000)) {
new_obj = make_artifact_special(lev);
if (new_obj) {
if (value) *value = object_value_real(new_obj, 1, FALSE, TRUE);
return new_obj;
}
/* If we failed to make an artifact, the player gets a good item */
good = TRUE;
}
/* Base level for the object */
base = (good ? (lev + 10) : lev);
/* Try to choose an object kind */
kind = get_obj_num(base, good || great, tval);
if (!kind)
return NULL;
/* Make the object, prep it and apply magic */
new_obj = object_new();
object_prep(new_obj, kind, lev, RANDOMISE);
apply_magic(new_obj, lev, TRUE, good, great, extra_roll);
/* Generate multiple items */
if (kind->gen_mult_prob >= randint1(100))
new_obj->number = randcalc(kind->stack_size, lev, RANDOMISE);
if (new_obj->number > z_info->stack_size)
new_obj->number = z_info->stack_size;
/* Return value, increased for uncursed out-of-depth objects */
if (value)
*value = object_value_real(new_obj, new_obj->number, FALSE, TRUE);
/* This seems to imply objects get less value from being > 1 but < 5
* levels out of depth - should it be *value +=... - NRM */
if (!cursed_p(new_obj->flags) && (kind->alloc_min > c->depth)) {
if (value) *value = (kind->alloc_min - c->depth) * (*value / 5);
}
return new_obj;
}
开发者ID:myshkin,项目名称:angband,代码行数:64,代码来源:obj-make.c
示例17: make_object
/*
* Attempt to make an object (normal or good/great)
*
* This routine plays nasty games to generate the "special artifacts".
*
* We assume that the given object has been "wiped".
*/
bool make_object(object_type *j_ptr, int lev, bool good, bool great)
{
int k_idx, base;
object_kind *k_ptr;
/* Try to make a special artifact */
if (one_in_(good ? 10 : 1000))
{
if (make_artifact_special(j_ptr, lev)) return TRUE;
/* If we failed to make an artifact, the player gets a great item */
good = great = TRUE;
}
/* Base level for the object */
base = (good ? (lev + 10) : lev);
/* Get the object */
k_idx = get_obj_num(base, good || great);
if (!k_idx) return FALSE;
/* Prepare the object */
object_prep(j_ptr, &k_info[k_idx], lev, RANDOMISE);
/* Apply magic (allow artifacts) */
apply_magic(j_ptr, lev, TRUE, good, great);
/* Generate multiple items */
k_ptr = &k_info[j_ptr->k_idx];
if (k_ptr->gen_mult_prob >= 100 ||
k_ptr->gen_mult_prob >= randint1(100))
{
j_ptr->number = randcalc(k_ptr->stack_size, lev, RANDOMISE);
}
/* Notice "okay" out-of-depth objects */
if (!cursed_p(j_ptr) && (k_info[j_ptr->k_idx].level > p_ptr->depth))
{
/* Rating increase */
rating += (k_info[j_ptr->k_idx].alloc_min - p_ptr->depth);
/* Cheat -- peek at items */
if (OPT(cheat_peek)) object_mention(j_ptr);
}
return TRUE;
}
开发者ID:NickMcConnell,项目名称:RePosBand,代码行数:56,代码来源:obj-make.c
示例18: eval_blow_effect
static long eval_blow_effect(int effect, random_value atk_dam, int rlev)
{
int adjustment = monster_blow_effect_eval(effect);
int power = randcalc(atk_dam, rlev, MAXIMISE);
if (effect == RBE_POISON) {
power *= 5;
power /= 4;
power += rlev;
} else {
power += adjustment;
}
return power;
}
开发者ID:Elfin-Jedi,项目名称:My-Angband-4.0.5,代码行数:15,代码来源:mon-power.c
示例19: object_prep
/**
* Wipe an object clean and make it a standard object of the specified kind.
*/
void object_prep(object_type *o_ptr, struct object_kind *k, int lev,
aspect rand_aspect)
{
int i, flag, x;
bitflag flags[OF_SIZE];
/* Clean slate */
WIPE(o_ptr, object_type);
/* Assign the kind and copy across data */
o_ptr->kind = k;
o_ptr->tval = k->tval;
o_ptr->sval = k->sval;
o_ptr->ac = k->ac;
o_ptr->dd = k->dd;
o_ptr->ds = k->ds;
o_ptr->weight = k->weight;
/* Default number */
o_ptr->number = 1;
/* Apply pvals and then copy flags */
for (i = 0; i < k->num_pvals; i++) {
of_copy(flags, k->pval_flags[i]);
x = randcalc(k->pval[i], lev, rand_aspect);
for (flag = of_next(flags, FLAG_START); flag != FLAG_END;
flag = of_next(flags, flag + 1))
object_add_pval(o_ptr, x, flag);
}
of_copy(o_ptr->flags, k->base->flags);
of_union(o_ptr->flags, k->flags);
/* Assign charges (wands/staves only) */
if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF)
o_ptr->pval[DEFAULT_PVAL] = randcalc(k->charge, lev, rand_aspect);
/* Assign flagless pval for food or oil */
if (o_ptr->tval == TV_FOOD || o_ptr->tval == TV_POTION ||
o_ptr->tval == TV_FLASK)
o_ptr->pval[DEFAULT_PVAL]
= randcalc(k->pval[DEFAULT_PVAL], lev, rand_aspect);
/* Default fuel for lamps */
if (o_ptr->tval == TV_LIGHT) {
if (o_ptr->sval == SV_LIGHT_TORCH)
o_ptr->timeout = DEFAULT_TORCH;
else if (o_ptr->sval == SV_LIGHT_LANTERN)
o_ptr->timeout = DEFAULT_LAMP;
}
/* Default magic */
o_ptr->to_h = randcalc(k->to_h, lev, rand_aspect);
o_ptr->to_d = randcalc(k->to_d, lev, rand_aspect);
o_ptr->to_a = randcalc(k->to_a, lev, rand_aspect);
}
开发者ID:Raale,项目名称:angband,代码行数:58,代码来源:obj-make.c
示例20: obj_desc_charges
static size_t obj_desc_charges(const object_type * o_ptr, char *buf, size_t max,
size_t end)
{
object_kind *k_ptr = &k_info[o_ptr->k_idx];
bool aware = object_aware_p(o_ptr);
/* Wands and Staffs have charges */
if (aware && (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND))
strnfcat(buf, max, &end, " (%d charge%s)", o_ptr->pval,
PLURAL(o_ptr->pval));
/* Charging things */
else if (o_ptr->timeout > 0) {
if (o_ptr->tval == TV_ROD && o_ptr->number > 1) {
int power;
int time_base = randcalc(k_ptr->time, 0, MINIMISE);
if (!time_base)
time_base = 1;
/*
* Find out how many rods are charging, by dividing
* current timeout by each rod's maximum timeout.
* Ensure that any remainder is rounded up. Display
* very discharged stacks as merely fully discharged.
*/
power = (o_ptr->timeout + (time_base - 1)) / time_base;
if (power > o_ptr->number)
power = o_ptr->number;
/* Display prettily */
strnfcat(buf, max, &end, " (%d charging)", power);
}
/* Artifacts, single rods */
else if (!(o_ptr->tval == TV_LIGHT && !artifact_p(o_ptr))) {
strnfcat(buf, max, &end, " (charging)");
}
}
return end;
}
开发者ID:LostTemplar,项目名称:Beleriand,代码行数:43,代码来源:obj-desc.c
注:本文中的randcalc函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论