-#include "effect/effect-feature.h"
-#include "core/player-update-types.h"
+#include "effect/effect-feature.h"
#include "dungeon/dungeon-flag-types.h"
#include "effect/effect-characteristics.h"
#include "effect/effect-processor.h" // 暫定、後で消す.
#include "player/special-defense-types.h"
#include "room/door-definition.h"
#include "spell-class/spells-mirror-master.h"
+#include "system/angband-system.h"
#include "system/dungeon-info.h"
#include "system/floor-type-definition.h"
#include "system/grid-type-definition.h"
#include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
+#include "system/terrain-type-definition.h"
#include "timed-effect/player-blindness.h"
#include "timed-effect/timed-effects.h"
#include "util/bit-flags-calculator.h"
* Line 2 -- forbid monsters
* Line 3 -- forbid the player
*/
-static bool cave_naked_bold(PlayerType *player_ptr, POSITION y, POSITION x)
+static bool cave_naked_bold(PlayerType *player_ptr, const Pos2D &pos)
{
auto *floor_ptr = player_ptr->current_floor_ptr;
- return cave_clean_bold(floor_ptr, y, x) && (floor_ptr->grid_array[y][x].m_idx == 0) && !player_bold(player_ptr, y, x);
+ return cave_clean_bold(floor_ptr, pos.y, pos.x) && (floor_ptr->get_grid(pos).m_idx == 0) && !player_ptr->is_located_at(pos);
}
/*!
*/
bool affect_feature(PlayerType *player_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, int dam, AttributeType typ)
{
- auto *floor_ptr = player_ptr->current_floor_ptr;
- auto *g_ptr = &floor_ptr->grid_array[y][x];
- auto *f_ptr = &terrains_info[g_ptr->feat];
+ const Pos2D pos(y, x);
+ auto &floor = *player_ptr->current_floor_ptr;
+ auto &grid = floor.get_grid(pos);
+ const auto &terrain = grid.get_terrain();
- bool obvious = false;
- bool known = player_has_los_bold(player_ptr, y, x);
+ auto obvious = false;
+ auto known = grid.has_los();
who = who ? who : 0;
dam = (dam + r) / (r + 1);
- if (f_ptr->flags.has(FloorFeatureType::TREE)) {
+ if (terrain.flags.has(TerrainCharacteristics::TREE)) {
concptr message;
switch (typ) {
case AttributeType::POIS:
cave_set_feat(player_ptr, y, x, one_in_(3) ? feat_brake : feat_grass);
/* Observe */
- if (g_ptr->is_mark()) {
+ if (grid.is_mark()) {
obvious = true;
}
}
break;
}
case AttributeType::KILL_TRAP: {
- if (is_hidden_door(player_ptr, g_ptr)) {
+ if (is_hidden_door(player_ptr, grid)) {
disclose_grid(player_ptr, y, x);
if (known) {
obvious = true;
}
}
- if (is_trap(player_ptr, g_ptr->feat)) {
+ if (is_trap(player_ptr, grid.feat)) {
if (known) {
msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!"));
obvious = true;
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::DISARM);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::DISARM);
}
- if (is_closed_door(player_ptr, g_ptr->feat) && f_ptr->power && f_ptr->flags.has(FloorFeatureType::OPEN)) {
- FEAT_IDX old_feat = g_ptr->feat;
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::DISARM);
- if (known && (old_feat != g_ptr->feat)) {
+ if (is_closed_door(player_ptr, grid.feat) && terrain.power && terrain.flags.has(TerrainCharacteristics::OPEN)) {
+ FEAT_IDX old_feat = grid.feat;
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::DISARM);
+ if (known && (old_feat != grid.feat)) {
msg_print(_("カチッと音がした!", "Click!"));
obvious = true;
}
}
- if (player_ptr->effects()->blindness()->is_blind() || !player_has_los_bold(player_ptr, y, x)) {
+ if (player_ptr->effects()->blindness()->is_blind() || !grid.has_los()) {
break;
}
- g_ptr->info &= ~(CAVE_UNSAFE);
+ grid.info &= ~(CAVE_UNSAFE);
lite_spot(player_ptr, y, x);
obvious = true;
break;
}
case AttributeType::KILL_DOOR: {
- if (is_trap(player_ptr, g_ptr->feat) || f_ptr->flags.has(FloorFeatureType::DOOR)) {
+ if (is_trap(player_ptr, grid.feat) || terrain.flags.has(TerrainCharacteristics::DOOR)) {
if (known) {
msg_print(_("まばゆい閃光が走った!", "There is a bright flash of light!"));
obvious = true;
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::TUNNEL);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::TUNNEL);
}
- if (player_ptr->effects()->blindness()->is_blind() || !player_has_los_bold(player_ptr, y, x)) {
+ if (player_ptr->effects()->blindness()->is_blind() || !grid.has_los()) {
break;
}
- g_ptr->info &= ~(CAVE_UNSAFE);
+ grid.info &= ~(CAVE_UNSAFE);
lite_spot(player_ptr, y, x);
obvious = true;
break;
}
case AttributeType::JAM_DOOR: {
- if (f_ptr->flags.has_not(FloorFeatureType::SPIKE)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::SPIKE)) {
break;
}
- int16_t old_mimic = g_ptr->mimic;
- terrain_type *mimic_f_ptr = &terrains_info[g_ptr->get_feat_mimic()];
+ int16_t old_mimic = grid.mimic;
+ const auto &terrain_mimic = grid.get_terrain_mimic();
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::SPIKE);
- g_ptr->mimic = old_mimic;
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::SPIKE);
+ grid.mimic = old_mimic;
note_spot(player_ptr, y, x);
lite_spot(player_ptr, y, x);
- if (!known || mimic_f_ptr->flags.has_not(FloorFeatureType::OPEN)) {
+ if (!known || terrain_mimic.flags.has_not(TerrainCharacteristics::OPEN)) {
break;
}
- msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), mimic_f_ptr->name.c_str());
+ msg_format(_("%sに何かがつっかえて開かなくなった。", "The %s seems stuck."), terrain_mimic.name.data());
obvious = true;
break;
}
case AttributeType::KILL_WALL: {
- if (f_ptr->flags.has_not(FloorFeatureType::HURT_ROCK)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::HURT_ROCK)) {
break;
}
- if (known && g_ptr->is_mark()) {
- msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), terrains_info[g_ptr->get_feat_mimic()].name.c_str());
+ if (known && grid.is_mark()) {
+ msg_format(_("%sが溶けて泥になった!", "The %s turns into mud!"), grid.get_terrain_mimic().name.data());
obvious = true;
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
- player_ptr->update |= (PU_FLOW);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
break;
}
case AttributeType::MAKE_DOOR: {
- if (!cave_naked_bold(player_ptr, y, x)) {
+ if (!cave_naked_bold(player_ptr, pos)) {
break;
}
- if (player_bold(player_ptr, y, x)) {
+ if (player_ptr->is_located_at(pos)) {
break;
}
cave_set_feat(player_ptr, y, x, feat_door[DOOR_DOOR].closed);
- if (g_ptr->is_mark()) {
+ if (grid.is_mark()) {
obvious = true;
}
break;
}
case AttributeType::MAKE_TRAP: {
- place_trap(player_ptr, y, x);
+ place_trap(&floor, y, x);
break;
}
case AttributeType::MAKE_TREE: {
- if (!cave_naked_bold(player_ptr, y, x)) {
+ if (!cave_naked_bold(player_ptr, pos)) {
break;
}
- if (player_bold(player_ptr, y, x)) {
+ if (player_ptr->is_located_at(pos)) {
break;
}
cave_set_feat(player_ptr, y, x, feat_tree);
- if (g_ptr->is_mark()) {
+ if (grid.is_mark()) {
obvious = true;
}
break;
}
case AttributeType::MAKE_RUNE_PROTECTION: {
- if (!cave_naked_bold(player_ptr, y, x)) {
+ if (!cave_naked_bold(player_ptr, pos)) {
break;
}
- g_ptr->info |= CAVE_OBJECT;
- g_ptr->mimic = feat_rune_protection;
+ grid.info |= CAVE_OBJECT;
+ grid.mimic = feat_rune_protection;
note_spot(player_ptr, y, x);
lite_spot(player_ptr, y, x);
break;
}
case AttributeType::STONE_WALL: {
- if (!cave_naked_bold(player_ptr, y, x)) {
+ if (!cave_naked_bold(player_ptr, pos)) {
break;
}
- if (player_bold(player_ptr, y, x)) {
+ if (player_ptr->is_located_at(pos)) {
break;
}
cave_set_feat(player_ptr, y, x, feat_granite);
break;
}
case AttributeType::LAVA_FLOW: {
- if (f_ptr->flags.has(FloorFeatureType::PERMANENT)) {
+ if (terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
break;
}
if (dam == 1) {
- if (f_ptr->flags.has_not(FloorFeatureType::FLOOR)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::FLOOR)) {
break;
}
cave_set_feat(player_ptr, y, x, feat_shallow_lava);
break;
}
case AttributeType::WATER_FLOW: {
- if (f_ptr->flags.has(FloorFeatureType::PERMANENT)) {
+ if (terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
break;
}
if (dam == 1) {
- if (f_ptr->flags.has_not(FloorFeatureType::FLOOR)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::FLOOR)) {
break;
}
cave_set_feat(player_ptr, y, x, feat_shallow_water);
}
case AttributeType::LITE_WEAK:
case AttributeType::LITE: {
- if (dungeons_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::DARKNESS)) {
+ if (floor.get_dungeon_definition().flags.has(DungeonFeatureType::DARKNESS)) {
break;
}
- g_ptr->info |= (CAVE_GLOW);
+ grid.info |= (CAVE_GLOW);
note_spot(player_ptr, y, x);
lite_spot(player_ptr, y, x);
update_local_illumination(player_ptr, y, x);
if (player_can_see_bold(player_ptr, y, x)) {
obvious = true;
}
- if (g_ptr->m_idx) {
- update_monster(player_ptr, g_ptr->m_idx, false);
+ if (grid.m_idx) {
+ update_monster(player_ptr, grid.m_idx, false);
}
- if (player_bold(player_ptr, y, x)) {
+ if (player_ptr->is_located_at(pos)) {
set_superstealth(player_ptr, false);
}
case AttributeType::DARK_WEAK:
case AttributeType::DARK:
case AttributeType::ABYSS: {
- bool do_dark = !player_ptr->phase_out && !g_ptr->is_mirror();
+ auto do_dark = !AngbandSystem::get_instance().is_phase_out() && !grid.is_mirror();
if (!do_dark) {
break;
}
- if ((floor_ptr->dun_level > 0) || !is_daytime()) {
+ if ((floor.dun_level > 0) || !is_daytime()) {
for (int j = 0; j < 9; j++) {
- int by = y + ddy_ddd[j];
- int bx = x + ddx_ddd[j];
-
- if (!in_bounds2(floor_ptr, by, bx)) {
+ const Pos2D pos_neighbor(y + ddy_ddd[j], x + ddx_ddd[j]);
+ if (!in_bounds2(&floor, pos_neighbor.y, pos_neighbor.x)) {
continue;
}
- grid_type *cc_ptr = &floor_ptr->grid_array[by][bx];
- if (terrains_info[cc_ptr->get_feat_mimic()].flags.has(FloorFeatureType::GLOW)) {
+ const auto &grid_neighbor = floor.get_grid(pos_neighbor);
+ if (grid_neighbor.get_terrain_mimic().flags.has(TerrainCharacteristics::GLOW)) {
do_dark = false;
break;
}
}
}
- g_ptr->info &= ~(CAVE_GLOW);
+ grid.info &= ~(CAVE_GLOW);
/* Hack -- Forget "boring" grids */
- if (f_ptr->flags.has_not(FloorFeatureType::REMEMBER) || has_element_resist(player_ptr, ElementRealmType::DARKNESS, 1)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::REMEMBER) || has_element_resist(player_ptr, ElementRealmType::DARKNESS, 1)) {
/* Forget */
- g_ptr->info &= ~(CAVE_MARK);
+ grid.info &= ~(CAVE_MARK);
note_spot(player_ptr, y, x);
}
if (player_can_see_bold(player_ptr, y, x)) {
obvious = true;
}
- if (g_ptr->m_idx) {
- update_monster(player_ptr, g_ptr->m_idx, false);
+ if (grid.m_idx) {
+ update_monster(player_ptr, grid.m_idx, false);
}
break;
}
case AttributeType::SHARDS:
case AttributeType::ROCKET: {
- if (g_ptr->is_mirror()) {
+ if (grid.is_mirror()) {
msg_print(_("鏡が割れた!", "The mirror was shattered!"));
sound(SOUND_GLASS);
SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
(PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI));
}
- if (f_ptr->flags.has_not(FloorFeatureType::GLASS) || f_ptr->flags.has(FloorFeatureType::PERMANENT) || (dam < 50)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::GLASS) || terrain.flags.has(TerrainCharacteristics::PERMANENT) || (dam < 50)) {
break;
}
- if (known && (g_ptr->is_mark())) {
- msg_format(_("%sが割れた!", "The %s crumbled!"), terrains_info[g_ptr->get_feat_mimic()].name.c_str());
+ if (known && (grid.is_mark())) {
+ msg_format(_("%sが割れた!", "The %s crumbled!"), grid.get_terrain_mimic().name.data());
sound(SOUND_GLASS);
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
- player_ptr->update |= (PU_FLOW);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
break;
}
case AttributeType::SOUND: {
- if (g_ptr->is_mirror() && player_ptr->lev < 40) {
+ if (grid.is_mirror() && player_ptr->lev < 40) {
msg_print(_("鏡が割れた!", "The mirror was shattered!"));
sound(SOUND_GLASS);
SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
(PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI));
}
- if (f_ptr->flags.has_not(FloorFeatureType::GLASS) || f_ptr->flags.has(FloorFeatureType::PERMANENT) || (dam < 200)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::GLASS) || terrain.flags.has(TerrainCharacteristics::PERMANENT) || (dam < 200)) {
break;
}
- if (known && (g_ptr->is_mark())) {
- msg_format(_("%sが割れた!", "The %s crumbled!"), terrains_info[g_ptr->get_feat_mimic()].name.c_str());
+ if (known && (grid.is_mark())) {
+ msg_format(_("%sが割れた!", "The %s crumbled!"), grid.get_terrain_mimic().name.data());
sound(SOUND_GLASS);
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_ROCK);
- player_ptr->update |= (PU_FLOW);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_ROCK);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
break;
}
case AttributeType::DISINTEGRATE: {
- if (g_ptr->is_mirror() || g_ptr->is_rune_protection() || g_ptr->is_rune_explosion()) {
+ if (grid.is_mirror() || grid.is_rune_protection() || grid.is_rune_explosion()) {
SpellsMirrorMaster(player_ptr).remove_mirror(y, x);
}
- if (f_ptr->flags.has_not(FloorFeatureType::HURT_DISI) || f_ptr->flags.has(FloorFeatureType::PERMANENT)) {
+ if (terrain.flags.has_not(TerrainCharacteristics::HURT_DISI) || terrain.flags.has(TerrainCharacteristics::PERMANENT)) {
break;
}
- cave_alter_feat(player_ptr, y, x, FloorFeatureType::HURT_DISI);
- player_ptr->update |= (PU_FLOW);
+ cave_alter_feat(player_ptr, y, x, TerrainCharacteristics::HURT_DISI);
+ RedrawingFlagsUpdater::get_instance().set_flag(StatusRecalculatingFlag::FLOW);
break;
}
default: