bool cmd_limit_cast(PlayerType *player_ptr)
{
const auto &floor = *player_ptr->current_floor_ptr;
- if (floor.is_in_dungeon() && (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC))) {
+ if (floor.is_in_dungeon() && (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MAGIC))) {
msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
msg_print(nullptr);
return true;
}
}
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
sound(SOUND_ATTACK_FAILED);
msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
return false;
floor.quest_number = random_quest_number(floor, floor.dun_level);
}
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
const auto guardian = dungeon.final_guardian;
if ((floor.dun_level == dungeon.maxdepth) && MonsterRace(guardian).is_valid()) {
const auto &guardian_ref = monraces_info[guardian];
{
GAME_TURN tmp_last_visit = sf_ptr->last_visit;
const auto &floor = *player_ptr->current_floor_ptr;
- int alloc_chance = dungeons_info[floor.dungeon_idx].max_m_alloc_chance;
+ auto alloc_chance = floor.get_dungeon_definition().max_m_alloc_chance;
while (tmp_last_visit > w_ptr->game_turn) {
tmp_last_visit -= TURNS_PER_TICK * TOWN_DAWN;
}
}
auto &floor = *player_ptr->current_floor_ptr;
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
if (any_bits(mode, CFM_DOWN)) {
if (!floor.is_in_dungeon()) {
move_num = dungeon.mindepth;
player_ptr->leaving_dungeon = true;
if (!vanilla_town && !lite_town) {
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
player_ptr->wilderness_y = dungeon.dy;
player_ptr->wilderness_x = dungeon.dx;
}
int shaft_num = 0;
auto *f_ptr = &terrains_info[feat];
auto &floor = *player_ptr->current_floor_ptr;
+ const auto &dungeon = floor.get_dungeon_definition();
if (f_ptr->flags.has(TerrainCharacteristics::LESS)) {
if (ironman_downward || !floor.dun_level) {
return true;
}
- if (floor.dun_level > dungeons_info[floor.dungeon_idx].mindepth) {
+ if (floor.dun_level > dungeon.mindepth) {
shaft_num = (randint1(num + 1)) / 2;
}
} else if (f_ptr->flags.has(TerrainCharacteristics::MORE)) {
}
}
- if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+ if (floor.dun_level >= dungeon.maxdepth) {
return true;
}
- if ((floor.dun_level < dungeons_info[floor.dungeon_idx].maxdepth - 1) && !inside_quest(quest_number(floor, floor.dun_level + 1))) {
+ if ((floor.dun_level < dungeon.maxdepth - 1) && !inside_quest(quest_number(floor, floor.dun_level + 1))) {
shaft_num = (randint1(num) + 1) / 2;
}
} else {
max_level = 100;
}
} else {
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
max_level = dungeon.maxdepth;
min_level = dungeon.mindepth;
}
up_stairs = false;
}
- if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+ if (floor.dun_level >= floor.get_dungeon_definition().maxdepth) {
down_stairs = false;
}
}
/* Hack -- no trap doors on the deepest level */
- if (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth) {
+ if (floor.dun_level >= floor.get_dungeon_definition().maxdepth) {
continue;
}
return make_pair(q_idx, std::string(_("クエスト:", "Quest:")));
} else {
char desc[40];
+ const auto &dungeon = floor.get_dungeon_definition();
#ifdef JP
- strnfmt(desc, sizeof(desc), "%d階(%s):", (int)floor.dun_level, dungeons_info[floor.dungeon_idx].name.data());
+ strnfmt(desc, sizeof(desc), "%d階(%s):", (int)floor.dun_level, dungeon.name.data());
#else
- strnfmt(desc, sizeof(desc), "%s L%d:", dungeons_info[floor.dungeon_idx].name.data(), (int)floor.dun_level);
+ strnfmt(desc, sizeof(desc), "%s L%d:", dungeon.name.data(), (int)floor.dun_level);
#endif
return make_pair(q_idx, std::string(desc));
}
}
case DiaryKind::MAXDEAPTH: {
constexpr auto mes = _(" %2d:%02d %20s %sの最深階%d階に到達した。\n", " %2d:%02d %20s reached level %d of %s for the first time.\n");
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
fprintf(fff, mes, hour, min, note_level.data(), _(dungeon.name.data(), num), _(num, dungeon.name.data()));
break;
}
case DiaryKind::TRUMP: {
constexpr auto mes = _(" %2d:%02d %20s %s%sの最深階を%d階にセットした。\n", " %2d:%02d %20s reset recall level of %s to %d %s.\n");
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
fprintf(fff, mes, hour, min, note_level.data(), note.data(), _(dungeon.name.data(), (int)max_dlv[num]), _((int)max_dlv[num], dungeon.name.data()));
break;
}
case DiaryKind::RECALL:
if (!num) {
constexpr auto mes = _(" %2d:%02d %20s 帰還を使って%sの%d階へ下りた。\n", " %2d:%02d %20s recalled to dungeon level %d of %s.\n");
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
fprintf(fff, mes, hour, min, note_level.data(), _(dungeon.name.data(), (int)max_dlv[floor.dungeon_idx]), _((int)max_dlv[floor.dungeon_idx], dungeon.name.data()));
} else {
constexpr auto mes = _(" %2d:%02d %20s 帰還を使って地上へと戻った。\n", " %2d:%02d %20s recalled from dungeon to surface.\n");
const auto &floor_ref = *player_ptr->current_floor_ptr;
auto to = !floor_ref.is_in_dungeon()
? _("地上", "the surface")
- : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, dungeons_info[floor.dungeon_idx].name.data());
+ : format(_("%d階(%s)", "level %d of %s"), floor.dun_level, floor.get_dungeon_definition().name.data());
constexpr auto mes = _(" %2d:%02d %20s %sへとパターンの力で移動した。\n", " %2d:%02d %20s used Pattern to teleport to %s.\n");
fprintf(fff, mes, hour, min, note_level.data(), to.data());
break;
turn_flags_ptr->do_move = false;
}
- if (turn_flags_ptr->do_move && dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE) && !m_ptr->is_confused()) {
+ if (turn_flags_ptr->do_move && floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE) && !m_ptr->is_confused()) {
if (r_ptr->behavior_flags.has_not(MonsterBehaviorType::STUPID)) {
turn_flags_ptr->do_move = false;
} else if (is_original_ap_and_seen(player_ptr, m_ptr)) {
if (monst_attack_monst(player_ptr, m_idx, g_ptr->m_idx)) {
return true;
}
- if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has_not(DungeonFeatureType::NO_MELEE)) {
return false;
}
if (m_ptr->is_confused()) {
return false;
}
- if ((r_ptr->flags7 & RF7_CHAMELEON) && dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::CHAMELEON)) {
+ if ((r_ptr->flags7 & RF7_CHAMELEON) && floor.get_dungeon_definition().flags.has(DungeonFeatureType::CHAMELEON)) {
return true;
}
}
auto *r_ptr = &monraces_info[r_idx];
- dungeon_type *d_ptr = &dungeons_info[floor.dungeon_idx];
+ dungeon_type *d_ptr = &floor.get_dungeon_definition();
if (r_ptr->wilderness_flags.has(MonsterWildernessType::WILD_ONLY)) {
return d_ptr->mon_wilderness_flags.has(MonsterWildernessType::WILD_MOUNTAIN) && r_ptr->wilderness_flags.has(MonsterWildernessType::WILD_MOUNTAIN);
}
auto chance_nasty = std::max(max_num_nasty_monsters, chance_nasty_monster - over_days / 2);
auto nasty_level = std::min(max_depth_nasty_monster, over_days / 3);
const auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::MAZE)) {
+ const auto &dungeon = floor.get_dungeon_definition();
+ if (dungeon.flags.has(DungeonFeatureType::MAZE)) {
chance_nasty = std::min(chance_nasty / 2, chance_nasty - 10);
if (chance_nasty < 2) {
chance_nasty = 2;
}
/* Boost the max_level */
- if ((option & GMN_ARENA) || dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::BEGINNER)) {
+ if ((option & GMN_ARENA) || dungeon.flags.has_not(DungeonFeatureType::BEGINNER)) {
/* Nightmare mode allows more out-of depth monsters */
if (ironman_nightmare && !randint0(chance_nasty)) {
/* What a bizarre calculation */
um_ptr->fx = um_ptr->m_ptr->fx;
um_ptr->flag = false;
um_ptr->easy = false;
- um_ptr->in_darkness = dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
+ um_ptr->in_darkness = floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS) && !player_ptr->see_nocto;
um_ptr->full = full;
return um_ptr;
}
{
auto chance_good = this->lev + 10;
const auto &floor = *this->player_ptr->current_floor_ptr;
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
if (chance_good > dungeon.obj_good) {
chance_good = dungeon.obj_good;
}
static int old_damage = 0;
auto &floor = *player_ptr->current_floor_ptr;
+ const auto &dungeon = floor.get_dungeon_definition();
for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) {
for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) {
int dam_max0 = 0;
if (projectable(player_ptr, my, mx, yy, xx)) {
const auto flags = r_ptr->ability_flags;
- if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::NO_MAGIC)) {
+ if (dungeon.flags.has_not(DungeonFeatureType::NO_MAGIC)) {
if (flags.has(MonsterAbilityType::BA_CHAO)) {
spell_damcalc_by_spellnum(player_ptr, MonsterAbilityType::BA_CHAO, AttributeType::CHAOS, g_ptr->m_idx, &dam_max0);
}
}
}
/* Monster melee attacks */
- if (r_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW) || dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (r_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW) || dungeon.flags.has(DungeonFeatureType::NO_MELEE)) {
dam_max += dam_max0;
continue;
}
bool vampirism(PlayerType *player_ptr)
{
const auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
return false;
}
msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
return std::nullopt;
}
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
return "";
}
if (player_ptr->current_floor_ptr->grid_array[y][x].m_idx) {
return std::nullopt;
}
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
return "";
}
x = player_ptr->x + ddx[dir];
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::NO_MELEE)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::NO_MELEE)) {
msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
return "";
}
auto *g_ptr = &floor.grid_array[y][x];
reset_bits(g_ptr->info, CAVE_OBJECT);
g_ptr->mimic = 0;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
reset_bits(g_ptr->info, CAVE_GLOW);
if (!view_torch_grids) {
reset_bits(g_ptr->info, CAVE_MARK);
static bool detect_feat_flag(PlayerType *player_ptr, POSITION range, TerrainCharacteristics flag, bool known)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
{
auto &floor = *player_ptr->current_floor_ptr;
POSITION range2 = range;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range2 /= 3;
}
{
auto &floor = *player_ptr->current_floor_ptr;
POSITION range2 = range;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range2 /= 3;
}
bool detect_objects_magic(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_normal(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_invis(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_evil(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_nonliving(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_mind(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool detect_monsters_string(PlayerType *player_ptr, POSITION range, concptr Match)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
/* Perma-lite the grid */
- if (dungeons_info[floor.dungeon_idx].flags.has_not(DungeonFeatureType::DARKNESS) && !ninja) {
+ if (floor.get_dungeon_definition().flags.has_not(DungeonFeatureType::DARKNESS) && !ninja) {
g_ptr->info |= (CAVE_GLOW);
}
void map_area(PlayerType *player_ptr, POSITION range)
{
auto &floor = *player_ptr->current_floor_ptr;
- if (dungeons_info[floor.dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
range /= 3;
}
bool down = true;
auto &floor = *player_ptr->current_floor_ptr;
- if (inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth)) {
+ if (inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= floor.get_dungeon_definition().maxdepth)) {
down = false;
}
is_special_floor |= player_ptr->phase_out;
is_special_floor |= inside_quest(floor.quest_number) && !inside_quest(random_quest_number(floor, floor.dun_level));
auto is_invalid_floor = idx <= 0;
- is_invalid_floor &= inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= dungeons_info[floor.dungeon_idx].maxdepth);
+ is_invalid_floor &= inside_quest(quest_number(floor, floor.dun_level)) || (floor.dun_level >= floor.get_dungeon_definition().maxdepth);
is_invalid_floor &= floor.dun_level >= 1;
is_invalid_floor &= ironman_downward;
return is_special_floor || is_invalid_floor;
}
}
- const auto &dungeon = dungeons_info[floor.dungeon_idx];
+ const auto &dungeon = floor.get_dungeon_definition();
if ((ironman_downward && (m_idx <= 0)) || (floor.dun_level <= dungeon.mindepth)) {
#ifdef JP
if (see_m) {