/*!
* Determine if a "boundary" grid is "floor mimic"
* @param grid_type *g_ptr
- * @param terrain_type *f_ptr
- * @param terrain_type *mimic_f_ptr
+ * @param TerrainType *f_ptr
+ * @param TerrainType *mimic_f_ptr
* @return 移動不能であればTRUE
* @todo 負論理なので反転させたい
*/
-static bool boundary_floor(grid_type *g_ptr, terrain_type *f_ptr, terrain_type *mimic_f_ptr)
+static bool boundary_floor(grid_type *g_ptr, TerrainType *f_ptr, TerrainType *mimic_f_ptr)
{
bool is_boundary_floor = g_ptr->mimic > 0;
is_boundary_floor &= permanent_wall(f_ptr);
}
} else if (!p_can_enter && !p_can_kill_walls) {
FEAT_IDX feat = g_ptr->get_feat_mimic();
- terrain_type *mimic_f_ptr = &terrains_info[feat];
+ TerrainType *mimic_f_ptr = &terrains_info[feat];
concptr name = mimic_f_ptr->name.c_str();
can_move = false;
if (!g_ptr->is_mark() && !player_can_see_bold(player_ptr, y, x)) {
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[row][col];
FEAT_IDX feat = g_ptr->get_feat_mimic();
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[feat];
if (g_ptr->m_idx) {
auto *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
bool exe_tunnel(PlayerType *player_ptr, POSITION y, POSITION x)
{
grid_type *g_ptr;
- terrain_type *f_ptr, *mimic_f_ptr;
+ TerrainType *f_ptr, *mimic_f_ptr;
int power;
concptr name;
bool more = false;
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
FEAT_IDX feat = g_ptr->get_feat_mimic();
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[feat];
PlayerEnergy(player_ptr).set_player_turn_energy(100);
if (g_ptr->m_idx) {
}
auto *floor_ptr = player_ptr->current_floor_ptr;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[floor_ptr->grid_array[y][x].feat];
if ((floor_ptr->grid_array[y][x].info & CAVE_MARK) && (f_ptr->flags.has(TerrainCharacteristics::WALL) || f_ptr->flags.has(TerrainCharacteristics::CAN_DIG) || (f_ptr->flags.has(TerrainCharacteristics::DOOR) && floor_ptr->grid_array[y][x].mimic))) {
msg_print(_("そこには行くことができません!", "You cannot travel there!"));
int l;
for (l = SAFE_MAX_ATTEMPTS; l > 0; l--) {
grid_type *g_ptr;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
y = randint0(floor_ptr->height);
x = randint0(floor_ptr->width);
g_ptr = &floor_ptr->grid_array[y][x];
}
int16_t old_mimic = g_ptr->mimic;
- terrain_type *mimic_f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
+ TerrainType *mimic_f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::SPIKE);
g_ptr->mimic = old_mimic;
{
for (int j = 0; j < dd_ptr->tunn_n; j++) {
grid_type *g_ptr;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
dd_ptr->tunnel_y = dd_ptr->tunn[j].y;
dd_ptr->tunnel_x = dd_ptr->tunn[j].x;
g_ptr = &player_ptr->current_floor_ptr->grid_array[dd_ptr->tunnel_y][dd_ptr->tunnel_x];
int dummy = 0;
grid_type *g_ptr;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
- terrain_type *streamer_ptr = &terrains_info[feat];
+ TerrainType *streamer_ptr = &terrains_info[feat];
bool streamer_is_wall = streamer_ptr->flags.has(TerrainCharacteristics::WALL) && streamer_ptr->flags.has_not(TerrainCharacteristics::PERMANENT);
bool streamer_may_have_gold = streamer_ptr->flags.has(TerrainCharacteristics::MAY_HAVE_GOLD);
*/
bool pattern_seq(PlayerType *player_ptr, POSITION c_y, POSITION c_x, POSITION n_y, POSITION n_x)
{
- terrain_type *cur_f_ptr = &terrains_info[player_ptr->current_floor_ptr->grid_array[c_y][c_x].feat];
- terrain_type *new_f_ptr = &terrains_info[player_ptr->current_floor_ptr->grid_array[n_y][n_x].feat];
+ TerrainType *cur_f_ptr = &terrains_info[player_ptr->current_floor_ptr->grid_array[c_y][c_x].feat];
+ TerrainType *new_f_ptr = &terrains_info[player_ptr->current_floor_ptr->grid_array[n_y][n_x].feat];
bool is_pattern_tile_cur = cur_f_ptr->flags.has(TerrainCharacteristics::PATTERN);
bool is_pattern_tile_new = new_f_ptr->flags.has(TerrainCharacteristics::PATTERN);
if (!is_pattern_tile_cur && !is_pattern_tile_new) {
continue;
}
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
auto can_darken = !g_ptr->is_mirror();
can_darken &= f_ptr->flags.has_none_of({ TerrainCharacteristics::QUEST_ENTER, TerrainCharacteristics::ENTRANCE });
for (x = 0; x < floor_ptr->width; x++) {
grid_type *g_ptr;
g_ptr = &floor_ptr->grid_array[y][x];
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
if (f_ptr->flags.has_not(TerrainCharacteristics::BLDG)) {
continue;
/*** Terrain feature variables ***/
/* The terrain feature arrays */
-std::vector<terrain_type> terrains_info;
+std::vector<TerrainType> terrains_info;
/* Nothing */
FEAT_IDX feat_none;
/*
* Determine if a "feature" is "permanent wall"
*/
-bool permanent_wall(terrain_type *f_ptr)
+bool permanent_wall(TerrainType *f_ptr)
{
return f_ptr->flags.has_all_of({ TerrainCharacteristics::WALL, TerrainCharacteristics::PERMANENT });
}
#define F_LIT_MAX 3
/*!
- * @struct feature_state
- * @brief 地形状態変化指定構造体 / Feature state structure
+ * @brief 地形状態変化指定構造体
*/
-struct feature_state {
+class TerrainState {
+public:
+ TerrainState() = default;
TerrainCharacteristics action{}; /*!< 変化条件をFF_*のIDで指定 */
std::string result_tag{}; /*!< 変化先ID */
FEAT_IDX result{}; /*!< 変化先ID */
};
/*!
- * @struct terrain_type
- * @brief 地形情報の構造体 / Information about terrain "features"
+ * @brief 地形情報の構造体
*/
-struct terrain_type {
+class TerrainType {
+public:
+ TerrainType() = default;
FEAT_IDX idx{};
std::string name; /*!< 地形名 */
std::string text; /*!< 地形説明 */
FEAT_IDX destroyed{}; /*!< *破壊*に巻き込まれた時の地形移行先(未実装?) / Default destroyed state */
EnumClassFlagGroup<TerrainCharacteristics> flags{}; /*!< 地形の基本特性ビット配列 / Flags */
int16_t priority{}; /*!< 縮小表示で省略する際の表示優先度 / Map priority */
- feature_state state[MAX_FEAT_STATES]{}; /*!< feature_state テーブル */
+ TerrainState state[MAX_FEAT_STATES]{}; /*!< TerrainState テーブル */
FEAT_SUBTYPE subtype{}; /*!< 副特性値 */
FEAT_POWER power{}; /*!< 地形強度 */
TERM_COLOR d_attr[F_LIT_MAX]{}; /*!< デフォルトの地形シンボルカラー / Default feature attribute */
char x_char[F_LIT_MAX]{}; /*!< 設定変更後の地形シンボルアルファベット / Desired feature character */
};
-extern std::vector<terrain_type> terrains_info;
+extern std::vector<TerrainType> terrains_info;
/*** Terrain feature variables ***/
extern FEAT_IDX feat_none;
bool is_trap(PlayerType *player_ptr, FEAT_IDX feat);
void apply_default_feat_lighting(TERM_COLOR *f_attr, char *f_char);
bool is_ascii_graphics(char x);
-bool permanent_wall(terrain_type *f_ptr);
+bool permanent_wall(TerrainType *f_ptr);
FEAT_IDX feat_locked_door_random(int door_type);
FEAT_IDX feat_jammed_door_random(int door_type);
void cave_set_feat(PlayerType *player_ptr, POSITION y, POSITION x, FEAT_IDX feat);
int max_attempts = 10000;
grid_type *g_ptr;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
auto *floor_ptr = player_ptr->current_floor_ptr;
while (max_attempts--) {
cave_set_feat(player_ptr, y, x, newfeat);
if (!(terrain_action_flags[enum2i(action)] & FAF_NO_DROP)) {
- terrain_type *old_f_ptr = &terrains_info[oldfeat];
+ TerrainType *old_f_ptr = &terrains_info[oldfeat];
auto *f_ptr = &terrains_info[newfeat];
bool found = false;
}
if (terrain_action_flags[enum2i(action)] & FAF_CRASH_GLASS) {
- terrain_type *old_f_ptr = &terrains_info[oldfeat];
+ TerrainType *old_f_ptr = &terrains_info[oldfeat];
if (old_f_ptr->flags.has(TerrainCharacteristics::GLASS) && w_ptr->character_dungeon) {
project(player_ptr, PROJECT_WHO_GLASS_SHARDS, 1, y, x, std::min(floor_ptr->dun_level, 100) / 4, AttributeType::SHARDS,
/*!
* @brief テキストトークンを走査してフラグを一つ得る(地形情報向け) /
- * Grab one flag in an terrain_type from a textual string
+ * Grab one flag in an TerrainType from a textual string
* @param f_ptr 地形情報を保管する先の構造体参照ポインタ
* @param what 参照元の文字列ポインタ
* @return 見つけたらtrue
*/
-static bool grab_one_feat_flag(terrain_type *f_ptr, std::string_view what)
+static bool grab_one_feat_flag(TerrainType *f_ptr, std::string_view what)
{
if (EnumClassFlagGroup<TerrainCharacteristics>::grab_one_flag(f_ptr->flags, f_info_flags, what)) {
return true;
/*!
* @brief テキストトークンを走査してフラグ(ステート)を一つ得る(地形情報向け2) /
- * Grab an action in an terrain_type from a textual string
+ * Grab an action in an TerrainType from a textual string
* @param f_ptr 地形情報を保管する先の構造体参照ポインタ
* @param what 参照元の文字列ポインタ
* @param count ステートの保存先ID
* @return 見つけたらtrue
*/
-static bool grab_one_feat_action(terrain_type *f_ptr, std::string_view what, int count)
+static bool grab_one_feat_action(TerrainType *f_ptr, std::string_view what, int count)
{
if (auto it = f_info_flags.find(what); it != f_info_flags.end()) {
f_ptr->state[count].action = it->second;
*/
errr parse_terrains_info(std::string_view buf, angband_header *)
{
- static terrain_type *f_ptr = nullptr;
+ static TerrainType *f_ptr = nullptr;
const auto &tokens = str_split(buf, ':', false, 10);
if (tokens[0] == "N") {
*/
static errr decide_feature_type(int i, int num, char **zz)
{
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[i];
TERM_COLOR n1 = (TERM_COLOR)strtol(zz[1], nullptr, 0);
char *cur_char_ptr;
while (!flag) {
char ch;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
if (redraw) {
clear_from(0);
#include "util/bit-flags-calculator.h"
#include "view/display-messages.h"
-static bool check_hp_for_feat_destruction(terrain_type *f_ptr, monster_type *m_ptr)
+static bool check_hp_for_feat_destruction(TerrainType *f_ptr, monster_type *m_ptr)
{
return f_ptr->flags.has_not(TerrainCharacteristics::GLASS) || monraces_info[m_ptr->r_idx].behavior_flags.has(MonsterBehaviorType::STUPID) || (m_ptr->hp >= std::max(m_ptr->maxhp / 3, 200));
}
auto *r_ptr = &monraces_info[m_ptr->r_idx];
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
if (player_bold(player_ptr, ny, nx)) {
turn_flags_ptr->do_move = true;
auto *r_ptr = &monraces_info[m_ptr->r_idx];
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
turn_flags_ptr->do_move = false;
if ((r_ptr->behavior_flags.has_not(MonsterBehaviorType::OPEN_DOOR)) || f_ptr->flags.has_not(TerrainCharacteristics::OPEN) || (m_ptr->is_pet() && ((player_ptr->pet_extra_flags & PF_OPEN_DOORS) == 0))) {
* @param g_ptr グリッドへの参照ポインタ
* @param f_ptr 地形への参照ポインタ
*/
-static void bash_glass_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, terrain_type *f_ptr, bool may_bash)
+static void bash_glass_door(PlayerType *player_ptr, turn_flags *turn_flags_ptr, monster_type *m_ptr, TerrainType *f_ptr, bool may_bash)
{
auto *r_ptr = &monraces_info[m_ptr->r_idx];
if (!may_bash || (r_ptr->behavior_flags.has_not(MonsterBehaviorType::BASH_DOOR)) || f_ptr->flags.has_not(TerrainCharacteristics::BASH) || (m_ptr->is_pet() && ((player_ptr->pet_extra_flags & PF_OPEN_DOORS) == 0))) {
return true;
}
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
bool may_bash = bash_normal_door(player_ptr, turn_flags_ptr, m_ptr, ny, nx);
bash_glass_door(player_ptr, turn_flags_ptr, m_ptr, f_ptr, may_bash);
auto *r_ptr = &monraces_info[m_ptr->r_idx];
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[ny][nx];
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
if (!turn_flags_ptr->did_kill_wall || !turn_flags_ptr->do_move) {
return true;
}
turn_flags_ptr->do_turn = true;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
if (f_ptr->flags.has(TerrainCharacteristics::TREE) && r_ptr->feature_flags.has_not(MonsterFeatureType::CAN_FLY) && (r_ptr->wilderness_flags.has_not(MonsterWildernessType::WILD_WOOD))) {
m_ptr->energy_need += ENERGY_NEED();
POSITION x = player_ptr->x + ddx[dir];
grid_type *g_ptr;
g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
- terrain_type *f_ptr, *mimic_f_ptr;
+ TerrainType *f_ptr, *mimic_f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
mimic_f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
auto *g_ptr = &floor_ptr->grid_array[ny][nx];
grid_type *oc_ptr = &floor_ptr->grid_array[oy][ox];
auto *f_ptr = &terrains_info[g_ptr->feat];
- terrain_type *of_ptr = &terrains_info[oc_ptr->feat];
+ TerrainType *of_ptr = &terrains_info[oc_ptr->feat];
if (!(mpe_mode & MPE_STAYING)) {
MONSTER_IDX om_idx = oc_ptr->m_idx;
}
g_ptr->info |= CAVE_ROOM;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->feat];
if (g_ptr->is_floor()) {
for (int i = -1; i <= 1; i++) {
}
if (auto it = std::find_if(terrains_info.begin(), terrains_info.end(),
- [subtype = stores[i]](const terrain_type &f_ref) {
+ [subtype = stores[i]](const TerrainType &f_ref) {
return f_ref.flags.has(TerrainCharacteristics::STORE) && (i2enum<StoreSaleType>(static_cast<int>(f_ref.subtype)) == subtype);
});
it != terrains_info.end()) {
/* Feature code (applying "mimic" field) */
FEAT_IDX feat = g_ptr->get_feat_mimic();
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[feat];
/* Scan all neighbors */
/* Feature code (applying "mimic" field) */
FEAT_IDX feat = g_ptr->get_feat_mimic();
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[feat];
/* Memorize normal features */
monster_type *m_ptr;
OBJECT_IDX next_o_idx;
FEAT_IDX feat;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
concptr name;
};
* 周り全てが壁に囲まれている壁についてはオプション状態による。
* 1か所でも空きがあるか、壁ではない地形、金を含む地形、永久岩は表示。
*/
-static bool is_revealed_wall(floor_type *floor_ptr, terrain_type *f_ptr, POSITION y, POSITION x)
+static bool is_revealed_wall(floor_type *floor_ptr, TerrainType *f_ptr, POSITION y, POSITION x)
{
if (view_hidden_walls) {
if (view_unsafe_walls) {
}
FEAT_IDX f_idx = floor_ptr->grid_array[dy][dx].feat;
- terrain_type *n_ptr = &terrains_info[f_idx];
+ TerrainType *n_ptr = &terrains_info[f_idx];
if (n_ptr->flags.has(TerrainCharacteristics::WALL)) {
n++;
}
sprintf(line, _("(X:%03d Y:%03d) %sの足元の発見済みアイテム一覧", "Found items at (%03d,%03d) under %s"), x, y, r_ptr->name.c_str());
}
} else {
- const terrain_type *const f_ptr = &terrains_info[g_ptr->feat];
+ const TerrainType *const f_ptr = &terrains_info[g_ptr->feat];
concptr fn = f_ptr->name.c_str();
char buf[512];
cave_set_feat(player_ptr, y, x, static_cast<FEAT_IDX>(f_val1));
g_ptr->mimic = (int16_t)f_val2;
- terrain_type *f_ptr;
+ TerrainType *f_ptr;
f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
if (f_ptr->flags.has(TerrainCharacteristics::RUNE_PROTECTION) || f_ptr->flags.has(TerrainCharacteristics::RUNE_EXPLOSION)) {