return false;
}
- if (!cave_has_flag_grid(g_ptr, FF_TUNNEL)) {
+ if (!g_ptr->cave_has_flag(FF_TUNNEL)) {
msg_print(_("そこには掘るものが見当たらない。", "You see nothing there to tunnel."));
return false;
}
if (snipe_type == SP_KILL_WALL) {
g_ptr = &shooter_ptr->current_floor_ptr->grid_array[ny][nx];
- if (cave_has_flag_grid(g_ptr, FF_HURT_ROCK) && !g_ptr->m_idx) {
+ if (g_ptr->cave_has_flag(FF_HURT_ROCK) && !g_ptr->m_idx) {
if (any_bits(g_ptr->info, (CAVE_MARK)))
msg_print(_("岩が砕け散った。", "Wall rocks were shattered."));
/* Forget the wall */
*/
bool feat_supports_los(FEAT_IDX f_idx) { return has_flag(f_info[f_idx].flags, FF_LOS); }
-bool cave_los_grid(grid_type *grid_ptr) { return feat_supports_los(grid_ptr->feat); }
-
-bool cave_has_flag_grid(grid_type *grid_ptr, int feature_flags) { return has_flag(f_info[grid_ptr->feat].flags, feature_flags); }
-
/*
* Determine if a "legal" grid is a "clean" floor grid
* Determine if terrain-change spells are allowed in a grid.
bool cave_stop_disintegration(floor_type *floor_ptr, POSITION y, POSITION x);
bool cave_los_bold(floor_type *floor_ptr, POSITION y, POSITION x);
bool feat_supports_los(FEAT_IDX f_idx);
-bool cave_los_grid(grid_type *grid_ptr);
-bool cave_has_flag_grid(grid_type *grid_ptr, int feature_flags);
bool cave_clean_bold(floor_type *floor_ptr, POSITION y, POSITION x);
bool cave_drop_bold(floor_type *floor_ptr, POSITION y, POSITION x);
bool pattern_tile(floor_type *floor_ptr, POSITION y, POSITION x);
continue;
/* Do not convert permanent features */
- if (cave_has_flag_grid(g_ptr, FF_PERMANENT))
+ if (g_ptr->cave_has_flag(FF_PERMANENT))
continue;
/*
continue;
/* Want square to be in the circle and accessable. */
- if ((distance(j, i, y, x) < 4) && !cave_has_flag_grid(g_ptr, FF_PERMANENT)) {
+ if ((distance(j, i, y, x) < 4) && !g_ptr->cave_has_flag(FF_PERMANENT)) {
/*
* Clear previous contents, add feature
* The border mainly gets trees, while the center gets rubble
continue;
g_ptr = &floor_ptr->grid_array[y][x];
- if (!cave_has_flag_grid(g_ptr, FF_MOVE) && !is_closed_door(subject_ptr, g_ptr->feat))
+ if (!g_ptr->cave_has_flag(FF_MOVE) && !is_closed_door(subject_ptr, g_ptr->feat))
continue;
if (!player_has_los_bold(subject_ptr, y, x))
continue;
for (x = 0; x < floor_ptr->width; x++) {
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
- if (!cave_has_flag_grid(g_ptr, FF_ENTRANCE))
+ if (!g_ptr->cave_has_flag(FF_ENTRANCE))
continue;
if (g_ptr->m_idx != 0)
POSITION x = x1 + ddx_ddd[i];
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
- if (cave_has_flag_grid(g_ptr, FF_WALL) || !g_ptr->is_floor() || g_ptr->is_room())
+ if (g_ptr->cave_has_flag(FF_WALL) || !g_ptr->is_floor() || g_ptr->is_room())
continue;
k++;
*/
bool is_hidden_door(player_type *player_ptr, grid_type *g_ptr)
{
- if ((g_ptr->mimic || cave_has_flag_grid(g_ptr, FF_SECRET)) && is_closed_door(player_ptr, g_ptr->feat))
+ if ((g_ptr->mimic || g_ptr->cave_has_flag(FF_SECRET)) && is_closed_door(player_ptr, g_ptr->feat))
return true;
else
return false;
bool can_move = false;
switch (i) {
case FLOW_CAN_FLY:
- can_move = cave_has_flag_grid(g_ptr, FF_MOVE) || cave_has_flag_grid(g_ptr, FF_CAN_FLY);
+ can_move = g_ptr->cave_has_flag(FF_MOVE) || g_ptr->cave_has_flag(FF_CAN_FLY);
break;
default:
- can_move = cave_has_flag_grid(g_ptr, FF_MOVE);
+ can_move = g_ptr->cave_has_flag(FF_MOVE);
break;
}
bool cave_valid_bold(floor_type *floor_ptr, POSITION y, POSITION x)
{
grid_type *g_ptr = &floor_ptr->grid_array[y][x];
- if (cave_has_flag_grid(g_ptr, FF_PERMANENT))
+ if (g_ptr->cave_has_flag(FF_PERMANENT))
return false;
for (const auto this_o_idx : g_ptr->o_idx_list) {
{
grid_type *g_ptr = &trapped_ptr->current_floor_ptr->grid_array[y][x];
- if (cave_has_flag_grid(g_ptr, FF_SECRET)) {
+ if (g_ptr->cave_has_flag(FF_SECRET)) {
/* No longer hidden */
cave_alter_feat(trapped_ptr, y, x, FF_SECRET);
} else if (g_ptr->mimic) {
term_queue_bigchar(panel_col_of(nx), ny - panel_row_prt, a, c, ta, tc);
}
- if (g_ptr->is_mark() && !cave_has_flag_grid(g_ptr, FF_PROJECT))
+ if (g_ptr->is_mark() && !g_ptr->cave_has_flag(FF_PROJECT))
break;
if (nx == x && ny == y)
return false;
}
- if (!cave_has_flag_grid(g_ptr, FF_CAN_DIG) || !cave_has_flag_grid(g_ptr, FF_HURT_ROCK)) {
+ if (!g_ptr->cave_has_flag(FF_CAN_DIG) || !g_ptr->cave_has_flag(FF_HURT_ROCK)) {
msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo."));
return true;
}
if ((g_ptr->info & (CAVE_MNLT | CAVE_VIEW)) != CAVE_VIEW)
return;
- if (!cave_los_grid(g_ptr)) {
+ if (!feat_supports_los(g_ptr->feat)) {
if (((y < subject_ptr->y) && (y > ml_ptr->mon_fy)) || ((y > subject_ptr->y) && (y < ml_ptr->mon_fy))) {
dpf = subject_ptr->y - ml_ptr->mon_fy;
d = y - ml_ptr->mon_fy;
if ((g_ptr->info & (CAVE_LITE | CAVE_MNLT | CAVE_MNDK | CAVE_VIEW)) != CAVE_VIEW)
return;
- if (!cave_los_grid(g_ptr) && !cave_has_flag_grid(g_ptr, FF_PROJECT)) {
+ if (!feat_supports_los(g_ptr->feat) && !g_ptr->cave_has_flag(FF_PROJECT)) {
if (((y < subject_ptr->y) && (y > ml_ptr->mon_fy)) || ((y > subject_ptr->y) && (y < ml_ptr->mon_fy))) {
dpf = subject_ptr->y - ml_ptr->mon_fy;
d = y - ml_ptr->mon_fy;
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 2, ml_ptr->mon_fx, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 2, ml_ptr->mon_fx - 1, ml_ptr);
g_ptr = &floor_ptr->grid_array[ml_ptr->mon_fy + 2][ml_ptr->mon_fx];
- if ((rad == 3) && cave_has_flag_grid(g_ptr, f_flag)) {
+ if ((rad == 3) && g_ptr->cave_has_flag(f_flag)) {
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 3, ml_ptr->mon_fx + 1, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 3, ml_ptr->mon_fx, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 3, ml_ptr->mon_fx - 1, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 2, ml_ptr->mon_fx, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 2, ml_ptr->mon_fx - 1, ml_ptr);
g_ptr = &floor_ptr->grid_array[ml_ptr->mon_fy - 2][ml_ptr->mon_fx];
- if ((rad == 3) && cave_has_flag_grid(g_ptr, f_flag)) {
+ if ((rad == 3) && g_ptr->cave_has_flag(f_flag)) {
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 3, ml_ptr->mon_fx + 1, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 3, ml_ptr->mon_fx, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 3, ml_ptr->mon_fx - 1, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy, ml_ptr->mon_fx + 2, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 1, ml_ptr->mon_fx + 2, ml_ptr);
g_ptr = &floor_ptr->grid_array[ml_ptr->mon_fy][ml_ptr->mon_fx + 2];
- if ((rad == 3) && cave_has_flag_grid(g_ptr, f_flag)) {
+ if ((rad == 3) && g_ptr->cave_has_flag(f_flag)) {
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 1, ml_ptr->mon_fx + 3, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy, ml_ptr->mon_fx + 3, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 1, ml_ptr->mon_fx + 3, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy, ml_ptr->mon_fx - 2, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 1, ml_ptr->mon_fx - 2, ml_ptr);
g_ptr = &floor_ptr->grid_array[ml_ptr->mon_fy][ml_ptr->mon_fx - 2];
- if ((rad == 3) && cave_has_flag_grid(g_ptr, f_flag)) {
+ if ((rad == 3) && g_ptr->cave_has_flag(f_flag)) {
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy + 1, ml_ptr->mon_fx - 3, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy, ml_ptr->mon_fx - 3, ml_ptr);
add_mon_lite(subject_ptr, points, ml_ptr->mon_fy - 1, ml_ptr->mon_fx - 3, ml_ptr);
int next_y = *yp + tonari_y[next][i];
grid_type *g_ptr;
g_ptr = &target_ptr->current_floor_ptr->grid_array[next_y][next_x];
- if (!cave_has_flag_grid(g_ptr, f_flag))
+ if (!g_ptr->cave_has_flag(f_flag))
continue;
if (path_check(target_ptr, m_ptr->fy, m_ptr->fx, next_y, next_x)) {
continue;
/* Skip non-empty grids */
- if (!cave_has_flag_grid(g_ptr, FF_MOVE) && !cave_has_flag_grid(g_ptr, FF_CAN_FLY)) {
+ if (!g_ptr->cave_has_flag(FF_MOVE) && !g_ptr->cave_has_flag(FF_CAN_FLY)) {
if (!can_player_ride_pet(creature_ptr, g_ptr, false))
continue;
}
- if (cave_has_flag_grid(g_ptr, FF_PATTERN))
+ if (g_ptr->cave_has_flag(FF_PATTERN))
continue;
/* Count "safe" grids */
grid_type *g2_c_ptr;
g1_c_ptr = &floor_ptr->grid_array[y1][x1];
g2_c_ptr = &floor_ptr->grid_array[y2][x2];
- bool f1 = (cave_los_grid(g1_c_ptr));
- bool f2 = (cave_los_grid(g2_c_ptr));
+ bool f1 = (feat_supports_los(g1_c_ptr->feat));
+ bool f2 = (feat_supports_los(g2_c_ptr->feat));
if (!f1 && !f2)
return true;
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
- bool wall = (!cave_los_grid(g_ptr));
+ bool wall = (!feat_supports_los(g_ptr->feat));
bool z1 = (v1 && (g1_c_ptr->info & CAVE_XTRA));
bool z2 = (v2 && (g2_c_ptr->info & CAVE_XTRA));
if (z1 && z2) {
g_ptr = &floor_ptr->grid_array[y + d][x + d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y + d, x + d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y + d][x - d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y + d, x - d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y - d][x + d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y - d, x + d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y - d][x - d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y - d, x - d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y + d][x];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y + d, x);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y - d][x];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y - d, x);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y][x + d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y, x + d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
g_ptr = &floor_ptr->grid_array[y][x - d];
g_ptr->info |= CAVE_XTRA;
cave_view_hack(floor_ptr, y, x - d);
- if (!cave_los_grid(g_ptr))
+ if (!feat_supports_los(g_ptr->feat))
break;
}
*/
static bool is_cave_empty_grid(player_type *player_ptr, grid_type *g_ptr)
{
- bool is_empty_grid = cave_has_flag_grid(g_ptr, FF_PLACE);
+ bool is_empty_grid = g_ptr->cave_has_flag(FF_PLACE);
is_empty_grid &= g_ptr->m_idx == 0;
is_empty_grid &= !player_grid(player_ptr, g_ptr);
return is_empty_grid;
}
}
- if (cave_has_flag_grid(g_ptr, flag)) {
+ if (g_ptr->cave_has_flag(flag)) {
disclose_grid(caster_ptr, y, x);
g_ptr->info |= (CAVE_MARK);
lite_spot(caster_ptr, y, x);
delete_all_items_from_floor(caster_ptr, y, x);
/* Destroy "non-permanent" grids */
- if (cave_has_flag_grid(g_ptr, FF_PERMANENT))
+ if (g_ptr->cave_has_flag(FF_PERMANENT))
continue;
/* Wall (or floor) type */
for (int i = 0; i < 9; i++) {
g_ptr = &caster_ptr->current_floor_ptr->grid_array[caster_ptr->y + ddy_ddd[i]][caster_ptr->x + ddx_ddd[i]];
- if (!cave_has_flag_grid(g_ptr, FF_PROJECT)) {
+ if (!g_ptr->cave_has_flag(FF_PROJECT)) {
if (!g_ptr->mimic || !has_flag(f_info[g_ptr->mimic].flags, FF_PROJECT) || !permanent_wall(&f_info[g_ptr->feat])) {
do_call = false;
break;
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
- if (!cave_has_flag_grid(g_ptr, FF_STORE)) {
+ if (!g_ptr->cave_has_flag(FF_STORE)) {
msg_print(_("ここには店がありません。", "You see no store here."));
return;
}
{
return f_info[this->mimic ? this->mimic : this->feat].mimic;
}
+
+bool grid_type::cave_has_flag(int feature_flags)
+{
+ return has_flag(f_info[this->feat].flags, feature_flags);
+}
byte get_cost(monster_race *r_ptr);
byte get_distance(monster_race *r_ptr);
FEAT_IDX get_feat_mimic();
+ bool cave_has_flag(int feature_flags);
private:
flow_type get_grid_flow_type(monster_race *r_ptr);
if (!g_ptr->is_mark())
return false;
- if (cave_has_flag_grid(g_ptr, FF_LESS) || cave_has_flag_grid(g_ptr, FF_MORE) || cave_has_flag_grid(g_ptr, FF_QUEST_ENTER)
- || cave_has_flag_grid(g_ptr, FF_QUEST_EXIT))
+ if (g_ptr->cave_has_flag(FF_LESS) || g_ptr->cave_has_flag(FF_MORE) || g_ptr->cave_has_flag(FF_QUEST_ENTER)
+ || g_ptr->cave_has_flag(FF_QUEST_EXIT))
return true;
- if (cave_has_flag_grid(g_ptr, FF_STORE) || cave_has_flag_grid(g_ptr, FF_BLDG))
+ if (g_ptr->cave_has_flag(FF_STORE) || g_ptr->cave_has_flag(FF_BLDG))
return true;
return false;
* @brief 指定したシンボルのマスかどうかを判定するための条件式コールバック
*/
std::unordered_map<int, std::function<bool(grid_type *)>> tgt_pt_symbol_call_back = {
- { '<', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STAIRS) && cave_has_flag_grid(g_ptr, FF_LESS); } },
- { '>', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STAIRS) && cave_has_flag_grid(g_ptr, FF_MORE); } },
- { '+', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_BLDG); } },
- { '0', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '0'); } },
- { '!', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '1'); } },
- { '"', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '2'); } },
- { '#', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '3'); } },
- { '$', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '4'); } },
- { '%', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '5'); } },
- { '&', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '6'); } },
- { '\'', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '7'); } },
- { '(', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '8'); } },
- { ')', [](grid_type *g_ptr) { return cave_has_flag_grid(g_ptr, FF_STORE) && cave_is_symbol_grid(g_ptr, '9'); } },
+ { '<', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STAIRS) && g_ptr->cave_has_flag(FF_LESS); } },
+ { '>', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STAIRS) && g_ptr->cave_has_flag(FF_MORE); } },
+ { '+', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_BLDG); } },
+ { '0', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '0'); } },
+ { '!', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '1'); } },
+ { '"', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '2'); } },
+ { '#', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '3'); } },
+ { '$', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '4'); } },
+ { '%', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '5'); } },
+ { '&', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '6'); } },
+ { '\'', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '7'); } },
+ { '(', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '8'); } },
+ { ')', [](grid_type *g_ptr) { return g_ptr->cave_has_flag(FF_STORE) && cave_is_symbol_grid(g_ptr, '9'); } },
};
/*!