本文整理汇总了C++中rf_has函数的典型用法代码示例。如果您正苦于以下问题:C++ rf_has函数的具体用法?C++ rf_has怎么用?C++ rf_has使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了rf_has函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: process_monster_multiply
/**
* Attempt to reproduce, if possible. All monsters are checked here for
* lore purposes, the unfit fail.
*/
static bool process_monster_multiply(struct chunk *c, struct monster *mon)
{
int k = 0, y, x;
struct monster_lore *lore = get_lore(mon->race);
/* Too many breeders on the level already */
if (num_repro >= z_info->repro_monster_max) return false;
/* Count the adjacent monsters */
for (y = mon->fy - 1; y <= mon->fy + 1; y++)
for (x = mon->fx - 1; x <= mon->fx + 1; x++)
if (c->squares[y][x].mon > 0) k++;
/* Multiply slower in crowded areas */
if ((k < 4) && (k == 0 || one_in_(k * z_info->repro_monster_rate))) {
/* Successful breeding attempt, learn about that now */
if (mflag_has(mon->mflag, MFLAG_VISIBLE))
rf_on(lore->flags, RF_MULTIPLY);
/* Leave now if not a breeder */
if (!rf_has(mon->race->flags, RF_MULTIPLY))
return false;
/* Try to multiply */
if (multiply_monster(mon)) {
/* Make a sound */
if (mflag_has(mon->mflag, MFLAG_VISIBLE))
sound(MSG_MULTIPLY);
/* Multiplying takes energy */
return true;
}
}
return false;
}
开发者ID:BardurArantsson,项目名称:angband,代码行数:41,代码来源:mon-move.c
示例2: make_ranged_throw
/**
* Helper function used with ranged_helper by do_cmd_throw.
*/
static struct attack_result make_ranged_throw(object_type *o_ptr, int y, int x) {
struct attack_result result = {FALSE, 0, 0, "hit"};
monster_type *m_ptr = cave_monster_at(cave, y, x);
monster_race *r_ptr = &r_info[m_ptr->r_idx];
int bonus = p_ptr->state.to_h + o_ptr->to_h;
int chance = p_ptr->state.skills[SKILL_TO_HIT_THROW] + bonus * BTH_PLUS_ADJ;
int chance2 = chance - distance(p_ptr->py, p_ptr->px, y, x);
int multiplier = 1;
const struct slay *best_s_ptr = NULL;
/* If we missed then we're done */
if (!test_hit(chance2, r_ptr->ac, m_ptr->ml)) return result;
result.success = TRUE;
improve_attack_modifier(o_ptr, m_ptr, &best_s_ptr, TRUE, FALSE);
/* If we have a slay, modify the multiplier appropriately */
if (best_s_ptr != NULL) {
result.hit_verb = best_s_ptr->range_verb;
multiplier += best_s_ptr->mult;
if (best_s_ptr->vuln_flag &&
rf_has(r_ptr->flags, best_s_ptr->vuln_flag))
multiplier += 1;
}
/* Apply damage: multiplier, slays, criticals, bonuses */
result.dmg = damroll(o_ptr->dd, o_ptr->ds);
result.dmg += o_ptr->to_d;
result.dmg *= multiplier;
result.dmg = critical_norm(o_ptr->weight, o_ptr->to_h, result.dmg, &result.msg_type);
return result;
}
开发者ID:nomadicwriter,项目名称:v4,代码行数:40,代码来源:attack.c
示例3: monster_death_stats
/*
* A rewrite of monster death that gets rid of some features
* That we don't want to deal with. Namely, no notifying the
* player and no generation of Morgoth artifacts
*
* It also replaces drop near with a new function that drops all
* the items on the exact square that the monster was on.
*/
void monster_death_stats(int m_idx)
{
struct object *obj;
struct monster *mon;
bool uniq;
assert(m_idx > 0);
mon = cave_monster(cave, m_idx);
/* Check if monster is UNIQUE */
uniq = rf_has(mon->race->flags,RF_UNIQUE);
/* Mimicked objects will have already been counted as floor objects */
mon->mimicked_obj = NULL;
/* Drop objects being carried */
obj = mon->held_obj;
while (obj) {
struct object *next = obj->next;
/* Object no longer held */
obj->held_m_idx = 0;
/* Get data */
get_obj_data(obj, mon->fy, mon->fx, true, uniq);
/* Delete the object */
delist_object(cave, obj);
object_delete(&obj);
/* Next */
obj = next;
}
/* Forget objects */
mon->held_obj = NULL;
}
开发者ID:fe051,项目名称:angband,代码行数:45,代码来源:wiz-stats.c
示例4: regen_monster
/**
* Monster regeneration of HPs.
*/
static void regen_monster(struct monster *mon)
{
/* Regenerate (if needed) */
if (mon->hp < mon->maxhp) {
/* Base regeneration */
int frac = mon->maxhp / 100;
/* Minimal regeneration rate */
if (!frac) frac = 1;
/* Some monsters regenerate quickly */
if (rf_has(mon->race->flags, RF_REGENERATE)) frac *= 2;
/* Regenerate */
mon->hp += frac;
/* Do not over-regenerate */
if (mon->hp > mon->maxhp) mon->hp = mon->maxhp;
/* Redraw (later) if needed */
if (player->upkeep->health_who == mon)
player->upkeep->redraw |= (PR_HEALTH);
}
}
开发者ID:BardurArantsson,项目名称:angband,代码行数:27,代码来源:mon-move.c
示例5: find_range
/**
* Calculate minimum and desired combat ranges. -BR-
*/
static void find_range(struct monster *mon)
{
u16b p_lev, m_lev;
u16b p_chp, p_mhp;
u16b m_chp, m_mhp;
u32b p_val, m_val;
/* Monsters will run up to z_info->flee_range grids out of sight */
int flee_range = z_info->max_sight + z_info->flee_range;
/* All "afraid" monsters will run away */
if (mon->m_timed[MON_TMD_FEAR])
mon->min_range = flee_range;
else {
/* Minimum distance - stay at least this far if possible */
mon->min_range = 1;
/* Examine player power (level) */
p_lev = player->lev;
/* Hack - increase p_lev based on specialty abilities */
/* Examine monster power (level plus morale) */
m_lev = mon->race->level + (mon->midx & 0x08) + 25;
/* Simple cases first */
if (m_lev + 3 < p_lev)
mon->min_range = flee_range;
else if (m_lev - 5 < p_lev) {
/* Examine player health */
p_chp = player->chp;
p_mhp = player->mhp;
/* Examine monster health */
m_chp = mon->hp;
m_mhp = mon->maxhp;
/* Prepare to optimize the calculation */
p_val = (p_lev * p_mhp) + (p_chp << 2); /* div p_mhp */
m_val = (m_lev * m_mhp) + (m_chp << 2); /* div m_mhp */
/* Strong players scare strong monsters */
if (p_val * m_mhp > m_val * p_mhp)
mon->min_range = flee_range;
}
}
if (mon->min_range < flee_range) {
/* Creatures that don't move never like to get too close */
if (rf_has(mon->race->flags, RF_NEVER_MOVE))
mon->min_range += 3;
/* Spellcasters that don't strike never like to get too close */
if (rf_has(mon->race->flags, RF_NEVER_BLOW))
mon->min_range += 3;
}
/* Maximum range to flee to */
if (!(mon->min_range < flee_range))
mon->min_range = flee_range;
/* Nearby monsters won't run away */
else if (mon->cdis < z_info->turn_range)
mon->min_range = 1;
/* Now find preferred range */
mon->best_range = mon->min_range;
/* Archers are quite happy at a good distance */
//if (rf_has(mon->race->flags, RF_ARCHER))
// mon->best_range += 3;
if (mon->race->freq_spell > 24) {
/* Breathers like point blank range */
if (flags_test(mon->race->spell_flags, RSF_SIZE, RSF_BREATH_MASK,
FLAG_END)
&& (mon->best_range < 6) && (mon->hp > mon->maxhp / 2))
mon->best_range = 6;
/* Other spell casters will sit back and cast */
else
mon->best_range += 3;
}
}
开发者ID:BardurArantsson,项目名称:angband,代码行数:90,代码来源:mon-move.c
示例6: draw_path
/**
* Draw a visible path over the squares between (x1,y1) and (x2,y2).
*
* The path consists of "*", which are white except where there is a
* monster, object or feature in the grid.
*
* This routine has (at least) three weaknesses:
* - remembered objects/walls which are no longer present are not shown,
* - squares which (e.g.) the player has walked through in the dark are
* treated as unknown space.
* - walls which appear strange due to hallucination aren't treated correctly.
*
* The first two result from information being lost from the dungeon arrays,
* which requires changes elsewhere
*/
static int draw_path(u16b path_n, struct loc *path_g, wchar_t *c, int *a,
int y1, int x1)
{
int i;
bool on_screen;
/* No path, so do nothing. */
if (path_n < 1) return 0;
/* The starting square is never drawn, but notice if it is being
* displayed. In theory, it could be the last such square.
*/
on_screen = panel_contains(y1, x1);
/* Draw the path. */
for (i = 0; i < path_n; i++) {
byte colour;
/* Find the co-ordinates on the level. */
int y = path_g[i].y;
int x = path_g[i].x;
struct monster *mon = square_monster(cave, y, x);
struct object *obj = square_object(cave, y, x);
/*
* As path[] is a straight line and the screen is oblong,
* there is only section of path[] on-screen.
* If the square being drawn is visible, this is part of it.
* If none of it has been drawn, continue until some of it
* is found or the last square is reached.
* If some of it has been drawn, finish now as there are no
* more visible squares to draw.
*/
if (panel_contains(y,x)) on_screen = TRUE;
else if (on_screen) break;
else continue;
/* Find the position on-screen */
move_cursor_relative(y,x);
/* This square is being overwritten, so save the original. */
Term_what(Term->scr->cx, Term->scr->cy, a+i, c+i);
/* Choose a colour. */
if (mon && mflag_has(mon->mflag, MFLAG_VISIBLE)) {
/* Mimics act as objects */
if (rf_has(mon->race->flags, RF_UNAWARE))
colour = COLOUR_YELLOW;
else
/* Visible monsters are red. */
colour = COLOUR_L_RED;
} else if (obj && obj->marked)
/* Known objects are yellow. */
colour = COLOUR_YELLOW;
else if ((!square_isprojectable(cave, y,x) && square_ismark(cave, y, x))
|| square_isseen(cave, y, x))
/* Known walls are blue. */
colour = COLOUR_BLUE;
else if (!square_ismark(cave, y, x) && !square_isseen(cave, y, x))
/* Unknown squares are grey. */
colour = COLOUR_L_DARK;
else
/* Unoccupied squares are white. */
colour = COLOUR_WHITE;
/* Draw the path segment */
(void)Term_addch(colour, L'*');
}
return i;
}
开发者ID:NickMcConnell,项目名称:FirstAgeAngband,代码行数:88,代码来源:ui-target.c
示例7: get_moves
/**
* Choose "logical" directions for monster movement
*/
static bool get_moves(struct chunk *c, struct monster *mon, int *dir)
{
int py = player->py;
int px = player->px;
int y, x;
/* Monsters will run up to z_info->flee_range grids out of sight */
int flee_range = z_info->max_sight + z_info->flee_range;
bool done = false;
/* Calculate range */
find_range(mon);
/* Flow towards the player */
if (get_moves_flow(c, mon)) {
/* Extract the "pseudo-direction" */
y = mon->ty - mon->fy;
x = mon->tx - mon->fx;
} else {
/* Head straight for the player */
y = player->py - mon->fy;
x = player->px - mon->fx;
}
/* Normal animal packs try to get the player out of corridors. */
if (rf_has(mon->race->flags, RF_GROUP_AI) &&
!flags_test(mon->race->flags, RF_SIZE, RF_PASS_WALL, RF_KILL_WALL,
FLAG_END)) {
int i, open = 0;
/* Count empty grids next to player */
for (i = 0; i < 8; i++) {
int ry = py + ddy_ddd[i];
int rx = px + ddx_ddd[i];
/* Check grid around the player for room interior (room walls count)
* or other empty space */
if (square_ispassable(c, ry, rx) || square_isroom(c, ry, rx)) {
/* One more open grid */
open++;
}
}
/* Not in an empty space and strong player */
if ((open < 7) && (player->chp > player->mhp / 2)) {
/* Find hiding place */
if (find_hiding(c, mon)) {
done = true;
y = mon->ty - mon->fy;
x = mon->tx - mon->fx;
}
}
}
/* Apply fear */
if (!done && (mon->min_range == flee_range)) {
/* Try to find safe place */
if (!find_safety(c, mon)) {
/* Just leg it away from the player */
y = (-y);
x = (-x);
} else {
/* Set a course for the safe place */
get_moves_fear(c, mon);
y = mon->ty - mon->fy;
x = mon->tx - mon->fx;
}
done = true;
}
/* Monster groups try to surround the player */
if (!done && rf_has(mon->race->flags, RF_GROUP_AI)) {
int i, yy = mon->ty, xx = mon->tx;
/* If we are not already adjacent */
if (mon->cdis > 1) {
/* Find an empty square near the player to fill */
int tmp = randint0(8);
for (i = 0; i < 8; i++) {
/* Pick squares near player (pseudo-randomly) */
yy = py + ddy_ddd[(tmp + i) & 7];
xx = px + ddx_ddd[(tmp + i) & 7];
/* Ignore filled grids */
if (!square_isempty(cave, yy, xx)) continue;
/* Try to fill this hole */
break;
}
}
/* Extract the new "pseudo-direction" */
y = yy - mon->fy;
x = xx - mon->fx;
}
//.........这里部分代码省略.........
开发者ID:BardurArantsson,项目名称:angband,代码行数:101,代码来源:mon-move.c
示例8: target_set_interactive_aux
//.........这里部分代码省略.........
else
{
strnfmt(out_val, sizeof(out_val),
"%s%s%s%s (%s), %s.",
s1, s2, s3, m_name, buf, coords);
}
prt(out_val, 0, 0);
/* Place cursor */
move_cursor_relative(y, x);
/* Command */
query = inkey_ex();
}
/* Normal commands */
if (query.key != 'r') break;
/* Toggle recall */
recall = !recall;
}
/* Stop on everything but "return"/"space" */
if ((query.key != '\n') && (query.key != '\r') && (query.key != ' ')) break;
/* Sometimes stop at "space" key */
if ((query.key == ' ') && !(mode & (TARGET_LOOK))) break;
/* Change the intro */
s1 = "It is ";
/* Hack -- take account of gender */
if (rf_has(r_ptr->flags, RF_FEMALE)) s1 = "She is ";
else if (rf_has(r_ptr->flags, RF_MALE)) s1 = "He is ";
/* Use a preposition */
s2 = "carrying ";
/* Scan all objects being carried */
for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
{
char o_name[80];
object_type *o_ptr;
/* Get the object */
o_ptr = &o_list[this_o_idx];
/* Get the next object */
next_o_idx = o_ptr->next_o_idx;
/* Obtain an object description */
object_desc(o_name, sizeof(o_name), o_ptr,
ODESC_PREFIX | ODESC_FULL);
/* Describe the object */
if (p_ptr->wizard)
{
strnfmt(out_val, sizeof(out_val),
"%s%s%s%s, %s (%d:%d).",
s1, s2, s3, o_name, coords, y, x);
}
else
{
strnfmt(out_val, sizeof(out_val),
开发者ID:EpicMan,项目名称:angband,代码行数:67,代码来源:target.c
示例9: eval_monster_power
/**
* Evaluate the whole monster list and write a new one. power and scaled_power
* are always adjusted, level, rarity and mexp only if requested.
*/
errr eval_monster_power(struct monster_race *racelist)
{
int i, j, iteration;
byte lvl;
struct monster_race *race = NULL;
ang_file *mon_fp;
char buf[1024];
bool dump = FALSE;
bool wrote = TRUE;
/* Allocate arrays */
power = mem_zalloc(z_info->r_max * sizeof(long));
scaled_power = mem_zalloc(z_info->r_max * sizeof(long));
final_hp = mem_zalloc(z_info->r_max * sizeof(long));
final_melee_dam = mem_zalloc(z_info->r_max * sizeof(long));
final_spell_dam = mem_zalloc(z_info->r_max * sizeof(long));
highest_threat = mem_zalloc(z_info->r_max * sizeof(int));
for (iteration = 0; iteration < 3; iteration ++) {
long hp, av_hp, dam, av_dam;
long *tot_hp = mem_zalloc(z_info->max_depth * sizeof(long));
long *tot_dam = mem_zalloc(z_info->max_depth * sizeof(long));
long *mon_count = mem_zalloc(z_info->max_depth * sizeof(long));
/* Reset the sum of all monster power values */
tot_mon_power = 0;
/* Go through r_info and evaluate power ratings & flows. */
for (i = 0; i < z_info->r_max; i++) {
/* Point at the "info" */
race = &racelist[i];
/* Set the current level */
lvl = race->level;
/* Maximum damage this monster can do in 10 game turns */
dam = eval_max_dam(race, i);
/* Adjust hit points based on resistances */
hp = eval_hp_adjust(race);
/* Hack -- set exp */
if (lvl == 0)
race->mexp = 0L;
else {
/* Compute depths of non-unique monsters */
if (!rf_has(race->flags, RF_UNIQUE)) {
long mexp = (hp * dam) / 25;
long threat = highest_threat[i];
/* Compute level algorithmically */
for (j = 1; (mexp > j + 4) || (threat > j + 5);
mexp -= j * j, threat -= (j + 4), j++);
/* Set level */
lvl = MIN(( j > 250 ? 90 + (j - 250) / 20 : /* Level 90+ */
(j > 130 ? 70 + (j - 130) / 6 : /* Level 70+ */
(j > 40 ? 40 + (j - 40) / 3 : /* Level 40+ */
j))), 99);
/* Set level */
if (arg_rebalance)
race->level = lvl;
}
if (arg_rebalance) {
/* Hack -- for Ungoliant */
if (hp > 10000)
race->mexp = (hp / 25) * (dam / lvl);
else race->mexp = (hp * dam) / (lvl * 25);
/* Round to 2 significant figures */
if (race->mexp > 100) {
if (race->mexp < 1000) {
race->mexp = (race->mexp + 5) / 10;
race->mexp *= 10;
}
else if (race->mexp < 10000) {
race->mexp = (race->mexp + 50) / 100;
race->mexp *= 100;
}
else if (race->mexp < 100000) {
race->mexp = (race->mexp + 500) / 1000;
race->mexp *= 1000;
}
else if (race->mexp < 1000000) {
race->mexp = (race->mexp + 5000) / 10000;
race->mexp *= 10000;
}
else if (race->mexp < 10000000) {
race->mexp = (race->mexp + 50000) / 100000;
race->mexp *= 100000;
}
}
}
//.........这里部分代码省略.........
开发者ID:Elfin-Jedi,项目名称:My-Angband-4.0.5,代码行数:101,代码来源:mon-power.c
示例10: flush_monster_messages
/**
* Show and delete the stacked monster messages.
* Some messages are delayed so that they show up after everything else.
* This is to avoid things like "The snaga dies. The snaga runs in fear!"
* So we only flush messages matching the delay parameter.
*/
static void flush_monster_messages(bool delay)
{
int i, r_idx, count;
const monster_race *r_ptr;
char buf[512];
char *action;
bool action_only;
/* Show every message */
for (i = 0; i < size_mon_msg; i++) {
if (mon_msg[i].delay != delay) continue;
/* Cache the monster count */
count = mon_msg[i].mon_count;
/* Paranoia */
if (count < 1) continue;
/* Start with an empty string */
buf[0] = '\0';
/* Cache the race index */
r_idx = mon_msg[i].mon_race;
/* Get the proper message action */
action = get_mon_msg_action(mon_msg[i].msg_code, (count > 1),
&r_info[r_idx]);
/* Is it a regular race? */
if (r_idx > 0) {
/* Get the race */
r_ptr = &r_info[r_idx];
}
/* It's the special mark for non-visible monsters */
else {
/* No race */
r_ptr = NULL;
}
/* Monster is marked as invisible */
if(mon_msg[i].mon_flags & 0x04) r_ptr = NULL;
/* Special message? */
action_only = (*action == '~');
/* Format the proper message for visible monsters */
if (r_ptr && !action_only)
{
char race_name[80];
/* Get the race name */
my_strcpy(race_name, r_ptr->name, sizeof(race_name));
/* Uniques */
if (rf_has(r_ptr->flags, RF_UNIQUE)) {
/* Just copy the race name */
my_strcpy(buf, (r_ptr->name), sizeof(buf));
}
/* We have more than one monster */
else if (count > 1) {
/* Get the plural of the race name */
plural_aux(race_name, sizeof(race_name));
/* Put the count and the race name together */
strnfmt(buf, sizeof(buf), "%d %s", count, race_name);
}
/* Normal lonely monsters */
else {
/* Just add a slight flavor */
strnfmt(buf, sizeof(buf), "the %s", race_name);
}
}
/* Format the message for non-viewable monsters if necessary */
else if (!r_ptr && !action_only) {
if (count > 1) {
/* Show the counter */
strnfmt(buf, sizeof(buf), "%d monsters", count);
}
else {
/* Just one non-visible monster */
my_strcpy(buf, "it", sizeof(buf));
}
}
/* Special message. Nuke the mark */
if (action_only)
++action;
/* Regular message */
else {
/* Add special mark. Monster is offscreen */
if (mon_msg[i].mon_flags & 0x02) my_strcat(buf, " (offscreen)",
sizeof(buf));
/* Add the separator */
//.........这里部分代码省略.........
开发者ID:artes-liberales,项目名称:angband,代码行数:101,代码来源:mon-msg.c
示例11: describe_origin
static bool describe_origin(textblock *tb, const object_type *o_ptr)
{
char origin_text[80];
if (o_ptr->origin_depth)
strnfmt(origin_text, sizeof(origin_text), "%d feet (level %d)",
o_ptr->origin_depth * 50, o_ptr->origin_depth);
else
my_strcpy(origin_text, "town", sizeof(origin_text));
switch (o_ptr->origin)
{
case ORIGIN_NONE:
case ORIGIN_MIXED:
case ORIGIN_STOLEN:
return FALSE;
case ORIGIN_BIRTH:
textblock_append(tb, "An inheritance from your family.\n");
break;
case ORIGIN_STORE:
textblock_append(tb, "Bought from a store.\n");
break;
case ORIGIN_FLOOR:
textblock_append(tb, "Found lying on the floor %s %s.\n",
(o_ptr->origin_depth ? "at" : "in"),
origin_text);
break;
case ORIGIN_PIT:
textblock_append(tb, "Found lying on the floor in a pit at %s.\n",
origin_text);
break;
case ORIGIN_VAULT:
textblock_append(tb, "Found lying on the floor in a vault at %s.\n",
origin_text);
break;
case ORIGIN_SPECIAL:
textblock_append(tb, "Found lying on the floor of a special room at %s.\n",
origin_text);
break;
case ORIGIN_LABYRINTH:
textblock_append(tb, "Found lying on the floor of a labyrinth at %s.\n",
origin_text);
break;
case ORIGIN_CAVERN:
textblock_append(tb, "Found lying on the floor of a cavern at %s.\n",
origin_text);
break;
case ORIGIN_RUBBLE:
textblock_append(tb, "Found under some rubble at %s.\n",
origin_text);
break;
case ORIGIN_DROP:
case ORIGIN_DROP_SPECIAL:
case ORIGIN_DROP_PIT:
case ORIGIN_DROP_VAULT:
case ORIGIN_DROP_SUMMON:
case ORIGIN_DROP_BREED:
case ORIGIN_DROP_POLY:
case ORIGIN_DROP_WIZARD:
{
const char *name;
if (r_info[o_ptr->origin_xtra].ridx)
name = r_info[o_ptr->origin_xtra].name;
else
name = "monster lost to history";
textblock_append(tb, "Dropped by ");
if (rf_has(r_info[o_ptr->origin_xtra].flags, RF_UNIQUE))
textblock_append(tb, "%s", name);
else
textblock_append(tb, "%s%s",
is_a_vowel(name[0]) ? "an " : "a ", name);
textblock_append(tb, " %s %s.\n",
(o_ptr->origin_depth ? "at" : "in"),
origin_text);
break;
}
case ORIGIN_DROP_UNKNOWN:
textblock_append(tb, "Dropped by an unknown monster %s %s.\n",
(o_ptr->origin_depth ? "at" : "in"),
origin_text);
break;
case ORIGIN_ACQUIRE:
textblock_append(tb, "Conjured forth by magic %s %s.\n",
(o_ptr->origin_depth ? "at" : "in"),
//.........这里部分代码省略.........
开发者ID:nomadicwriter,项目名称:v4,代码行数:101,代码来源:obj-info.c
示例12: object_absorb_merge
/**
* Allow one item to "absorb" another, assuming they are similar.
*
* The blending of the "note" field assumes that either (1) one has an
* inscription and the other does not, or (2) neither has an inscription.
* In both these cases, we can simply use the existing note, unless the
* blending object has a note, in which case we use that note.
*
* These assumptions are enforced by the "object_similar()" code.
*/
static void object_absorb_merge(struct object *obj1, const struct object *obj2)
{
int total;
/* First object gains any extra knowledge from second */
if (obj1->known && obj2->known) {
if (obj2->known->effect)
obj1->known->effect = obj1->effect;
player_know_object(player, obj1);
}
/* Merge inscriptions */
if (obj2->note)
obj1->note = obj2->note;
/* Combine timeouts for rod stacking */
if (tval_can_have_timeout(obj1))
obj1->timeout += obj2->timeout;
/* Combine pvals for wands and staves */
if (tval_can_have_charges(obj1) || tval_is_money(obj1)) {
total = obj1->pval + obj2->pval;
obj1->pval = total >= MAX_PVAL ? MAX_PVAL : total;
}
/* Combine origin data as best we can */
if (obj1->origin != obj2->origin ||
obj1->origin_depth != obj2->origin_depth ||
obj1->origin_xtra != obj2->origin_xtra) {
int act = 2;
if (obj1->origin_xtra && obj2->origin_xtra) {
struct monster_race *race1 = &r_info[obj1->origin_xtra];
struct monster_race *race2 = &r_info[obj2->origin_xtra];
bool r1_uniq = rf_has(race1->flags, RF_UNIQUE) ? true : false;
bool r2_uniq = rf_has(race2->flags, RF_UNIQUE) ? true : false;
if (r1_uniq && !r2_uniq) act = 0;
else if (r2_uniq && !r1_uniq) act = 1;
else act = 2;
}
switch (act)
{
/* Overwrite with obj2 */
case 1:
{
obj1->origin = obj2->origin;
obj1->origin_depth = obj2->origin_depth;
obj1->origin_xtra = obj2->origin_xtra;
}
/* Set as "mixed" */
case 2:
{
obj1->origin = ORIGIN_MIXED;
}
}
}
}
开发者ID:fizzix,项目名称:angband,代码行数:71,代码来源:obj-pile.c
示例13: process_monster_can_move
/**
* Work out if a monster can move through the grid, if necessary bashing
* down doors in the way.
*
* Returns true if the monster is able to move through the grid.
*/
static bool process_monster_can_move(struct chunk *c, struct monster *mon,
const char *m_name, int nx, int ny, bool *did_something)
{
struct monster_lore *lore = get_lore(mon->race);
/* Only fiery creatures can handle lava */
if (square_isfiery(c, ny, nx) && !rf_has(mon->race->flags, RF_IM_FIRE))
return false;
/* Floor is open? */
if (square_ispassable(c, ny, nx))
return true;
/* Permanent wall in the way */
if (square_iswall(c, ny, nx) && square_isperm(c, ny, nx))
return false;
/* Normal wall, door, or secret door in the way */
/* There's some kind of feature in the way, so learn about
* kill-wall and pass-wall now */
if (mflag_has(mon->mflag, MFLAG_VISIBLE)) {
rf_on(lore->flags, RF_PASS_WALL);
rf_on(lore->flags, RF_KILL_WALL);
}
/* Monster may be able to deal with walls and doors */
if (rf_has(mon->race->flags, RF_PASS_WALL)) {
return true;
} else if (rf_has(mon->race->flags, RF_KILL_WALL)) {
/* Remove the wall */
square_destroy_wall(c, ny, nx);
/* Note changes to viewable region */
if (square_isview(c, ny, nx))
player->upkeep->update |= (PU_UPDATE_VIEW | PU_MONSTERS);
/* Fully update the flow since terrain changed */
player->upkeep->update |= (PU_FORGET_FLOW | PU_UPDATE_FLOW);
return true;
} else if (square_iscloseddoor(c, ny, nx) ||
square_issecretdoor(c, ny, nx)) {
bool may_bash = rf_has(mon->race->flags, RF_BASH_DOOR) && one_in_(2);
/* Take a turn */
*did_something = true;
/* Learn about door abilities */
if (mflag_has(mon->mflag, MFLAG_VISIBLE)) {
rf_on(lore->flags, RF_OPEN_DOOR);
rf_on(lore->flags, RF_BASH_DOOR);
}
/* Creature can open or bash doors */
if (!rf_has(mon->race->flags, RF_OPEN_DOOR) &&
!rf_has(mon->race->flags, RF_BASH_DOOR))
return false;
/* Stuck door -- try to unlock it */
if (square_islockeddoor(c, ny, nx)) {
int k = square_door_power(c, ny, nx);
if (randint0(mon->hp / 10) > k) {
if (may_bash)
msg("%s slams against the door.", m_name);
else
msg("%s fiddles with the lock.", m_name);
/* Reduce the power of the door by one */
square_set_door_lock(c, ny, nx, k - 1);
}
} else {
/* Handle viewable doors */
if (square_isview(c, ny, nx))
player->upkeep->update |= (PU_UPDATE_VIEW | PU_MONSTERS);
/* Closed or secret door -- open or bash if allowed */
if (may_bash) {
square_smash_door(c, ny, nx);
msg("You hear a door burst open!");
disturb(player, 0);
/* Fall into doorway */
return true;
} else if (rf_has(mon->race->flags, RF_OPEN_DOOR)) {
square_open_door(c, ny, nx);
}
}
}
return false;
}
开发者ID:BardurArantsson,项目名称:angband,代码行数:100,代码来源:mon-move.c
示例14: mon_select
/**
* Use various selection criteria (set elsewhere) to restrict monster
* generation.
*
* This function is capable of selecting monsters by:
* - racial symbol (may be any of the characters allowed)
* - symbol color (may be any of up to four colors).
* - racial flag(s) (monster may have any allowed flag)
* - breath flag(s) (monster must have exactly the flags specified)
*
* Uniques may be forbidden, or allowed on rare occasions.
*
* Some situations (like the elemental war themed level) require special
* processing; this is done in helper functions called from this one.
*/
static bool mon_select(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
bool ok = FALSE;
bitflag mon_breath[RSF_SIZE];
/* Require correct breath attack */
rsf_copy(mon_breath, r_ptr->spell_flags);
flags_mask(mon_breath, RSF_SIZE, RSF_BREATH_MASK, FLAG_END);
/* Special case: Elemental war themed level. */
if (p_ptr->themed_level == THEME_ELEMENTAL) {
return (vault_aux_elemental(r_idx));
}
/* Special case: Estolad themed level. */
if (p_ptr->themed_level == THEME_ESTOLAD) {
if (!(rf_has(r_ptr->flags, RF_RACIAL)))
return (FALSE);
}
/* Require that the monster symbol be correct. */
if (d_char_req[0] != '\0') {
if (strchr(d_char_req, r_ptr->d_char) == 0)
return (FALSE);
}
/* Require correct racial type. */
if (racial_flag_mask) {
if (!(rf_has(r_ptr->flags, racial_flag_mask)))
return (FALSE);
/* Hack -- no invisible undead until deep. */
if ((p_ptr->danger < 40) && (rf_has(r_ptr->flags, RF_UNDEAD))
&& (rf_has(r_ptr->flags, RF_INVISIBLE)))
return (FALSE);
}
/* Require that monster breaths be exactly those specified. */
/* Exception for winged dragons */
if (!rsf_is_empty(breath_flag_mask)) {
/* 'd'ragons */
if (!rsf_is_equal(mon_breath, breath_flag_mask)
&& (r_ptr->d_char != 'D'))
return (FALSE);
/* Winged 'D'ragons */
if (r_ptr->d_char == 'D') {
if (!rsf_is_subset(mon_breath, breath_flag_mask))
return (FALSE);
/* Hack - this deals with all current Ds that need excluding */
if (rsf_has(r_ptr->flags, RSF_BRTH_SOUND))
return (FALSE);
}
}
/* Require that the monster color be correct. */
if (d_attr_req[0]) {
/* Check all allowed colors, if given. */
if ((d_attr_req[0]) && (r_ptr->d_attr == d_attr_req[0]))
ok = TRUE;
if ((d_attr_req[1]) && (r_ptr->d_attr == d_attr_req[1]))
ok = TRUE;
if ((d_attr_req[2]) && (r_ptr->d_attr == d_attr_req[2]))
ok = TRUE;
if ((d_attr_req[3]) && (r_ptr->d_attr == d_attr_req[3]))
ok = TRUE;
/* Hack -- No multihued dragons allowed in the arcane dragon pit. */
if ((strchr(d_char_req, 'd') || strchr(d_char_req, 'D'))
&& (d_attr_req[0] == TERM_VIOLET)
&& (rf_has(r_ptr->flags, RSF_BRTH_ACID)
|| rf_has(r_ptr->flags, RSF_BRTH_ELEC)
|| rf_has(r_ptr->flags, RSF_BRTH_FIRE)
|| rf_has(r_ptr->flags, RSF_BRTH_COLD)
|| rf_has(r_ptr->flags, RSF_BRTH_POIS))) {
return (FALSE);
}
/* Doesn't match any of the given colors? Not good. */
if (!ok)
return (FALSE);
//.........这里部分代码省略.........
开发者ID:LostTemplar,项目名称:Beleriand,代码行数:101,代码来源:gen-monster.c
示例15: rsf_wipe
/**
* Accept characters representing a race or group of monsters and
* an (adjusted) depth, and use these to set values for required racial
* type, monster symbol, monster symbol color, and breath type. -LM-
*
* This function is called to set restrictions, point the monster
* allocation function to mon_select(), and remake monster allocation.
* It undoes all of this things when called with the symbol '\0'.
*
* Describe the monsters (used by cheat_room) and determine if they
* should be neatly ordered or randomly placed (used in monster pits).
*/
extern char *mon_restrict(char symbol, byte depth, bool * ordered,
bool unique_ok)
{
int i, j;
/* Assume no definite name */
char name[80] = "misc";
/* Clear global monster restriction variables. */
allow_unique = unique_ok;
for (i = 0; i < 10; i++)
d_char_req[i] = '\0';
for (i = 0; i < 4; i++)
d_attr_req[i] = 0;
racial_flag_mask = 0;
rsf_wipe(breath_flag_mask);
/* No symbol, no restrictions. */
if (symbol == '\0') {
get_mon_num_hook = NULL;
get_mon_num_prep();
return ("misc");
}
/* Handle the "wild card" symbol '*' */
if (symbol == '*') {
for (i = 0; i < 2500; i++) {
/* Get a random monster. */
j = randint1(z_info->r_max - 1);
/* Must be a real monster */
if (!r_info[j].rarity)
continue;
/* Try for close to depth, accept in-depth if necessary */
if (i < 200) {
if ((!rf_has(r_info[j].flags, RF_UNIQUE))
&& (r_info[j].level != 0) && (r_info[j].level <= depth)
&& (ABS(r_info[j].level - p_ptr->danger) <
1 + (p_ptr->danger / 4)))
break;
} else {
if ((!rf_has(r_info[j].flags, RF_UNIQUE))
&& (r_info[j].level != 0) && (r_info[j].level <= depth))
break;
}
}
/* We've found a monster. */
if (i < 2499) {
/* ...use that monster's symbol for all monsters. */
symbol = r_info[j].d_char;
} else {
/* Paranoia - pit stays empty if no monster is found */
return (NULL);
}
}
/* Apply monster restrictions according to symbol. */
switch (symbol) {
/* All animals */
case 'A':
{
strcpy(name, "animal");
racial_flag_mask = RF_ANIMAL;
*ordered = FALSE;
break;
}
/* Insects */
case '1':
{
strcpy(name, "insect");
strcpy(d_char_req, "aclFIK");
*ordered = FALSE;
break;
}
/* Reptiles */
case '2':
{
strcpy(name, "reptile");
strcpy(d_char_req, "nJR");
*ordered = FALSE;
break;
}
//.........这里部分代码省略.........
开发者ID:LostTemplar,项目名称:Beleriand,代码行数:101,代码来源:gen-monster.c
示例16: cave_generate
/**
* Generate a random level.
*
* Confusingly, this function also generate the town level (level 0).
* \param c is the level we're going to end up with, in practice the global cave
* \param p is the current player struct, in practice the global player
*/
void cave_generate(struct chunk **c, struct player *p) {
const char *error = "no generation";
int y, x, tries = 0;
struct chunk *chunk;
assert(c);
/* Generate */
for (tries = 0; tries < 100 && error; tries++) {
struct dun_data dun_body;
error = NULL;
/* Mark the dungeon as being unready (to avoid artifact loss, etc) */
character_dungeon = FALSE;
/* Allocate global data (will be freed when we leave the loop) */
dun = &dun_body;
dun->cent = mem_zalloc(z_info->level_room_max * sizeof(struct loc));
dun->door = mem_zalloc(z_info->level_door_max * sizeof(struct loc));
dun->wall = mem_zalloc(z_info->wall_pierce_max * sizeof(struct loc));
dun->tunn = mem_zalloc(z_info->tunn_grid_max * sizeof(struct loc));
/* Choose a profile and build the level */
dun->profile = choose_profile(p->depth);
chunk = dun->profile->builder(p);
if (!chunk) {
error = "Failed to find builder";
mem_free(dun->cent);
mem_free(dun->door);
mem_free(dun->wall);
mem_free(dun->tunn);
continue;
}
/* Ensure quest monsters */
if (is_quest(chunk->depth)) {
int i;
for (i = 1; i < z_info->r_max; i++) {
monster_race *r_ptr = &r_info[i];
int y, x;
/* The monster must be an unseen quest monster of this depth. */
if (r_ptr->cur_num > 0) continue;
if (!rf_has(r_ptr->flags, RF_QUESTOR)) continue;
if (r_ptr->level != chunk->depth) continue;
/* Pick a location and place the monster */
find_empty(chunk, &y, &x);
place_new_monster(chunk, y, x, r_ptr, TRUE, TRUE, ORIGIN_DROP);
}
}
/* Clear generation flags. */
for (y = 0; y < chunk->height; y++) {
for (x = 0; x < chunk->width; x++) {
sqinfo_off(chunk->squares[y][x].info, SQUARE_WALL_INNER);
sqinfo_off(chunk->squares[y][x].info, SQUARE_WALL_OUTER);
sqinfo_off(chunk->squares[y][x].info, SQUARE_WALL_SOLID);
sqinfo_off(chunk->squares[y][x].info, SQUARE_MON_RESTRICT);
}
}
/* Regenerate levels that overflow their maxima */
if (cave_monster_max(chunk) >= z_info->level_monster_max)
error = "too many monsters";
if (error) ROOM_LOG("Generation restarted: %s.", error);
mem_free(dun->cent);
mem_free(dun->door);
mem_free(dun->wall);
mem_free(dun->tunn);
}
if (error) quit_fmt("cave_generate() failed 100 times!");
/* Free the old cave, use the new one */
if (*c)
cave_free(*c);
*c = chunk;
/* Place dungeon squares to trigger feeling (not in town) */
if (player->depth)
place_feeling(*c);
/* Save the town */
else if (!chunk_find_name("Town")) {
struct chunk *town = chunk_write(0, 0, z_info->town_hgt,
z_info->town_wid, FALSE, FALSE, FALSE);
town->name = string_make("Town");
chunk_list_add(town);
}
//.........这里部分代码省略.........
开发者ID:myshkin,项目名称:angband,代码行数:101,代码来源:generate.c
示例17: do_cmd_knowledge_monsters
/*
* Display known monsters.
*/
static void do_cmd_knowledge_monsters(const char *name, int row)
{
group_funcs r_funcs = { N_ELEMENTS(monster_group), FALSE, race_name,
m_cmp_race, default_group, mon_summary
};
member_funcs m_funcs =
{ display_monster, mon_lore, m_xchar, m_xattr, recall_prompt, 0,
0 };
int *monsters;
int m_count = 0;
int i;
size_t j;
for (i = 0; i < z_info->r_max; i++) {
monster_race *r_ptr = &r_info[i];
if (!OPT(cheat_know) && !l_list[i].sights)
continue;
if (!r_ptr->name)
continue;
if (rf_has(r_ptr->flags, RF_UNIQUE))
m_count++;
for (j = 1; j < N_ELEMENTS(monster_group) - 1; j++) {
const wchar_t *pat = monster_group[j].chars;
if (wcschr(pat, r_ptr->d_char))
m_count++;
}
}
default_join = C_ZNEW(m_count, join_t);
monsters = C_ZNEW(m_count, int);
m_count = 0;
for (i = 0; i < z_info->r_max; i++) {
monster_race *r_ptr = &r_info[i];
if (!OPT(cheat_know) && !l_list[i].sights)
continue;
if (!r_ptr->name)
continue;
for (j = 0; j < N_ELEMENTS(monster_group) - 1; j++) {
const wchar_t *pat = monster_group[j].chars;
if (j == 0 && !(rf_has(r_ptr->flags, RF_UNIQUE)))
continue;
else if (j > 0 && !wcschr(pat, r_ptr->d_char))
continue;
monsters[m_count] = m_count;
default_join[m_count].oid = i;
default_join[m_count++].gid = j;
}
}
display_knowledge("monsters", monsters, m_count, r_funcs, m_funcs,
" Sym Kills");
FREE(default_join);
FREE(monsters);
}
开发者ID:NickMcConnell,项目名称:FAangband,代码行数:64,代码来源:ui-knowledge.c
示例18: mon_resist_effect
/**
* Determines whether the given monster successfully resists the given effect.
*
* If MON_TMD_FLG_NOFAIL is set in `flag`, this returns false.
* Then we determine if the monster resists the effect for some racial
* reason. For example, the monster might have the NO_SLEEP flag, in which
* case it always resists sleep. Or if it breathes chaos, it always resists
* confusion. If the given monster doesn't resist for any of these reasons,
* then it makes a saving throw. If MON_TMD_MON_SOURCE is set in `flag`,
* indicating that another monster caused this effect, then the chance of
* success on the saving throw just depends on the monster's native de
|
请发表评论