OSDN Git Service

[Refactor] enum spells-typeをenum class AttributeTypeに置換
[hengbandforosx/hengbandosx.git] / src / spell-kind / spells-lite.cpp
index 75e7920..6f98331 100644 (file)
@@ -1,6 +1,4 @@
-#include <vector>
-
-#include "dungeon/dungeon-flag-types.h"
+#include "dungeon/dungeon-flag-types.h"
 #include "dungeon/dungeon.h"
 #include "effect/effect-characteristics.h"
 #include "effect/effect-processor.h"
@@ -20,8 +18,9 @@
 #include "player/special-defense-types.h"
 #include "spell-kind/spells-launcher.h"
 #include "spell-kind/spells-lite.h"
-#include "spell/spell-types.h"
+#include "effect/attribute-types.h"
 #include "system/floor-type-definition.h"
+#include "system/grid-type-definition.h"
 #include "system/monster-race-definition.h"
 #include "system/monster-type-definition.h"
 #include "system/player-type-definition.h"
 #include "util/point-2d.h"
 #include "view/display-messages.h"
 #include "world/world.h"
+#include <vector>
 
 using PassBoldFunc = bool (*)(floor_type *, POSITION, POSITION);
 
 /*!
  * @brief 指定した座標全てを照らす。
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param points 明るくすべき座標たち
  * @details
  * <pre>
@@ -49,46 +49,46 @@ using PassBoldFunc = bool (*)(floor_type *, POSITION, POSITION);
  * NORMAL monsters wake up 1/4 the time when illuminated
  * STUPID monsters wake up 1/10 the time when illuminated
  * </pre>
- * @todo この辺、xとyが引数になっているが、caster_ptr->xとcaster_ptr->yで全て置き換えが効くはず……
+ * @todo この辺、xとyが引数になっているが、player_ptr->xとplayer_ptr->yで全て置き換えが効くはず……
  */
-static void cave_temp_room_lite(player_type *caster_ptr, const std::vector<Pos2D> &points)
+static void cave_temp_room_lite(player_type *player_ptr, const std::vector<Pos2D> &points)
 {
     for (const auto &point : points) {
         const POSITION y = point.y;
         const POSITION x = point.x;
 
-        grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
+        grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
         g_ptr->info &= ~(CAVE_TEMP);
         g_ptr->info |= (CAVE_GLOW);
         if (g_ptr->m_idx) {
             PERCENTAGE chance = 25;
-            monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
+            monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
             monster_race *r_ptr = &r_info[m_ptr->r_idx];
-            update_monster(caster_ptr, g_ptr->m_idx, false);
+            update_monster(player_ptr, g_ptr->m_idx, false);
             if (r_ptr->flags2 & (RF2_STUPID))
                 chance = 10;
             if (r_ptr->flags2 & (RF2_SMART))
                 chance = 100;
 
             if (monster_csleep_remaining(m_ptr) && (randint0(100) < chance)) {
-                (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, 0);
+                (void)set_monster_csleep(player_ptr, g_ptr->m_idx, 0);
                 if (m_ptr->ml) {
                     GAME_TEXT m_name[MAX_NLEN];
-                    monster_desc(caster_ptr, m_name, m_ptr, 0);
+                    monster_desc(player_ptr, m_name, m_ptr, 0);
                     msg_format(_("%^sが目を覚ました。", "%^s wakes up."), m_name);
                 }
             }
         }
 
-        note_spot(caster_ptr, y, x);
-        lite_spot(caster_ptr, y, x);
-        update_local_illumination(caster_ptr, y, x);
+        note_spot(player_ptr, y, x);
+        lite_spot(player_ptr, y, x);
+        update_local_illumination(player_ptr, y, x);
     }
 }
 
 /*!
  * @brief 指定した座標全てを暗くする。
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param points 暗くすべき座標たち
  * @details
  * <pre>
@@ -98,29 +98,29 @@ static void cave_temp_room_lite(player_type *caster_ptr, const std::vector<Pos2D
  * This routine is used (only) by "unlite_room()"
  * Also, process all affected monsters
  * </pre>
- * @todo この辺、xとyが引数になっているが、caster_ptr->xとcaster_ptr->yで全て置き換えが効くはず……
+ * @todo この辺、xとyが引数になっているが、player_ptr->xとplayer_ptr->yで全て置き換えが効くはず……
  */
-static void cave_temp_room_unlite(player_type *caster_ptr, const std::vector<Pos2D> &points)
+static void cave_temp_room_unlite(player_type *player_ptr, const std::vector<Pos2D> &points)
 {
     for (const auto &point : points) {
         const POSITION y = point.y;
         const POSITION x = point.x;
 
-        grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
-        bool do_dark = !is_mirror_grid(g_ptr);
+        grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[y][x];
+        bool do_dark = !g_ptr->is_mirror();
         g_ptr->info &= ~(CAVE_TEMP);
         if (!do_dark)
             continue;
 
-        if (caster_ptr->current_floor_ptr->dun_level || !is_daytime()) {
+        if (player_ptr->current_floor_ptr->dun_level || !is_daytime()) {
             for (int j = 0; j < 9; j++) {
                 POSITION by = y + ddy_ddd[j];
                 POSITION bx = x + ddx_ddd[j];
 
-                if (in_bounds2(caster_ptr->current_floor_ptr, by, bx)) {
-                    grid_type *cc_ptr = &caster_ptr->current_floor_ptr->grid_array[by][bx];
+                if (in_bounds2(player_ptr->current_floor_ptr, by, bx)) {
+                    grid_type *cc_ptr = &player_ptr->current_floor_ptr->grid_array[by][bx];
 
-                    if (has_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) {
+                    if (f_info[cc_ptr->get_feat_mimic()].flags.has(FF::GLOW)) {
                         do_dark = false;
                         break;
                     }
@@ -132,18 +132,18 @@ static void cave_temp_room_unlite(player_type *caster_ptr, const std::vector<Pos
         }
 
         g_ptr->info &= ~(CAVE_GLOW);
-        if (!has_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_REMEMBER)) {
+        if (f_info[g_ptr->get_feat_mimic()].flags.has_not(FF::REMEMBER)) {
             if (!view_torch_grids)
                 g_ptr->info &= ~(CAVE_MARK);
-            note_spot(caster_ptr, y, x);
+            note_spot(player_ptr, y, x);
         }
 
         if (g_ptr->m_idx) {
-            update_monster(caster_ptr, g_ptr->m_idx, false);
+            update_monster(player_ptr, g_ptr->m_idx, false);
         }
 
-        lite_spot(caster_ptr, y, x);
-        update_local_illumination(caster_ptr, y, x);
+        lite_spot(player_ptr, y, x);
+        update_local_illumination(player_ptr, y, x);
     }
 }
 
@@ -173,7 +173,7 @@ static int next_to_open(floor_type *floor_ptr, const POSITION cy, const POSITION
         }
     }
 
-    return MAX(len, blen);
+    return std::max(len, blen);
 }
 
 /*!
@@ -201,7 +201,7 @@ static int next_to_walls_adj(floor_type *floor_ptr, const POSITION cy, const POS
 
 /*!
  * @brief (y,x) が指定条件を満たすなら points に加える
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param points 座標記録用配列
  * @param y 部屋内のy座標1点
  * @param x 部屋内のx座標1点
@@ -209,9 +209,9 @@ static int next_to_walls_adj(floor_type *floor_ptr, const POSITION cy, const POS
  * @param pass_bold 地形条件を返す関数ポインタ
  */
 static void cave_temp_room_aux(
-    player_type *caster_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x, const bool only_room, const PassBoldFunc pass_bold)
+    player_type *player_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x, const bool only_room, const PassBoldFunc pass_bold)
 {
-    floor_type *floor_ptr = caster_ptr->current_floor_ptr;
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
     grid_type *g_ptr = &floor_ptr->grid_array[y][x];
 
     // 既に points に追加済みなら何もしない。
@@ -223,7 +223,7 @@ static void cave_temp_room_aux(
             return;
         if (!in_bounds2(floor_ptr, y, x))
             return;
-        if (distance(caster_ptr->y, caster_ptr->x, y, x) > get_max_range(caster_ptr))
+        if (distance(player_ptr->y, player_ptr->x, y, x) > get_max_range(player_ptr))
             return;
 
         /* Verify this grid */
@@ -247,14 +247,14 @@ static void cave_temp_room_aux(
 
 /*!
  * @brief (y,x) が明るくすべきマスなら points に加える
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param points 座標記録用配列
  * @param y 指定Y座標
  * @param x 指定X座標
  */
-static void cave_temp_lite_room_aux(player_type *caster_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x)
+static void cave_temp_lite_room_aux(player_type *player_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x)
 {
-    cave_temp_room_aux(caster_ptr, points, y, x, false, cave_los_bold);
+    cave_temp_room_aux(player_ptr, points, y, x, false, cave_los_bold);
 }
 
 /*!
@@ -264,37 +264,37 @@ static void cave_temp_lite_room_aux(player_type *caster_ptr, std::vector<Pos2D>
  * @param x 指定X座標
  * @return 射線を通すならばtrueを返す。
  */
-static bool cave_pass_dark_bold(floor_type *floor_ptr, POSITION y, POSITION x) { return cave_has_flag_bold(floor_ptr, y, x, FF_PROJECT); }
+static bool cave_pass_dark_bold(floor_type *floor_ptr, POSITION y, POSITION x) { return cave_has_flag_bold(floor_ptr, y, x, FF::PROJECT); }
 
 /*!
  * @brief (y,x) が暗くすべきマスなら points に加える
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param y 指定Y座標
  * @param x 指定X座標
  */
-static void cave_temp_unlite_room_aux(player_type *caster_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x)
+static void cave_temp_unlite_room_aux(player_type *player_ptr, std::vector<Pos2D> &points, const POSITION y, const POSITION x)
 {
-    cave_temp_room_aux(caster_ptr, points, y, x, true, cave_pass_dark_bold);
+    cave_temp_room_aux(player_ptr, points, y, x, true, cave_pass_dark_bold);
 }
 
 /*!
  * @brief (y1,x1) を含む全ての部屋を照らす。 / Illuminate any room containing the given location.
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param y1 指定Y座標
  * @param x1 指定X座標
  *
  * NOTE: 部屋に限らないかも?
  */
-void lite_room(player_type *caster_ptr, const POSITION y1, const POSITION x1)
+void lite_room(player_type *player_ptr, const POSITION y1, const POSITION x1)
 {
     // 明るくするマスを記録する配列。
     std::vector<Pos2D> points;
 
-    floor_type *floor_ptr = caster_ptr->current_floor_ptr;
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
 
     // (y1,x1) を起点として明るくするマスを記録していく。
     // 実質幅優先探索。
-    cave_temp_lite_room_aux(caster_ptr, points, y1, x1);
+    cave_temp_lite_room_aux(player_ptr, points, y1, x1);
     for (size_t i = 0; i < size(points); i++) {
         const auto &point = points[i];
         const POSITION y = point.y;
@@ -303,43 +303,42 @@ void lite_room(player_type *caster_ptr, const POSITION y1, const POSITION x1)
         if (!cave_los_bold(floor_ptr, y, x))
             continue;
 
-        cave_temp_lite_room_aux(caster_ptr, points, y + 1, x);
-        cave_temp_lite_room_aux(caster_ptr, points, y - 1, x);
-        cave_temp_lite_room_aux(caster_ptr, points, y, x + 1);
-        cave_temp_lite_room_aux(caster_ptr, points, y, x - 1);
+        cave_temp_lite_room_aux(player_ptr, points, y + 1, x);
+        cave_temp_lite_room_aux(player_ptr, points, y - 1, x);
+        cave_temp_lite_room_aux(player_ptr, points, y, x + 1);
+        cave_temp_lite_room_aux(player_ptr, points, y, x - 1);
 
-        cave_temp_lite_room_aux(caster_ptr, points, y + 1, x + 1);
-        cave_temp_lite_room_aux(caster_ptr, points, y - 1, x - 1);
-        cave_temp_lite_room_aux(caster_ptr, points, y - 1, x + 1);
-        cave_temp_lite_room_aux(caster_ptr, points, y + 1, x - 1);
+        cave_temp_lite_room_aux(player_ptr, points, y + 1, x + 1);
+        cave_temp_lite_room_aux(player_ptr, points, y - 1, x - 1);
+        cave_temp_lite_room_aux(player_ptr, points, y - 1, x + 1);
+        cave_temp_lite_room_aux(player_ptr, points, y + 1, x - 1);
     }
 
     // 記録したマスを実際に明るくする。
-    cave_temp_room_lite(caster_ptr, points);
+    cave_temp_room_lite(player_ptr, points);
 
     // 超隠密状態の更新。
-    if (caster_ptr->special_defense & NINJA_S_STEALTH) {
-        if (floor_ptr->grid_array[caster_ptr->y][caster_ptr->x].info & CAVE_GLOW)
-            set_superstealth(caster_ptr, false);
+    if (floor_ptr->grid_array[player_ptr->y][player_ptr->x].info & CAVE_GLOW) {
+        set_superstealth(player_ptr, false);
     }
 }
 
 /*!
  * @brief (y1,x1) を含む全ての部屋を暗くする。 / Darken all rooms containing the given location
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param y1 指定Y座標
  * @param x1 指定X座標
  */
-void unlite_room(player_type *caster_ptr, const POSITION y1, const POSITION x1)
+void unlite_room(player_type *player_ptr, const POSITION y1, const POSITION x1)
 {
     // 暗くするマスを記録する配列。
     std::vector<Pos2D> points;
 
-    floor_type *floor_ptr = caster_ptr->current_floor_ptr;
+    floor_type *floor_ptr = player_ptr->current_floor_ptr;
 
     // (y1,x1) を起点として暗くするマスを記録していく。
     // 実質幅優先探索。
-    cave_temp_unlite_room_aux(caster_ptr, points, y1, x1);
+    cave_temp_unlite_room_aux(player_ptr, points, y1, x1);
     for (size_t i = 0; i < size(points); i++) {
         const auto &point = points[i];
         const POSITION y = point.y;
@@ -348,30 +347,30 @@ void unlite_room(player_type *caster_ptr, const POSITION y1, const POSITION x1)
         if (!cave_pass_dark_bold(floor_ptr, y, x))
             continue;
 
-        cave_temp_unlite_room_aux(caster_ptr, points, y + 1, x);
-        cave_temp_unlite_room_aux(caster_ptr, points, y - 1, x);
-        cave_temp_unlite_room_aux(caster_ptr, points, y, x + 1);
-        cave_temp_unlite_room_aux(caster_ptr, points, y, x - 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y + 1, x);
+        cave_temp_unlite_room_aux(player_ptr, points, y - 1, x);
+        cave_temp_unlite_room_aux(player_ptr, points, y, x + 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y, x - 1);
 
-        cave_temp_unlite_room_aux(caster_ptr, points, y + 1, x + 1);
-        cave_temp_unlite_room_aux(caster_ptr, points, y - 1, x - 1);
-        cave_temp_unlite_room_aux(caster_ptr, points, y - 1, x + 1);
-        cave_temp_unlite_room_aux(caster_ptr, points, y + 1, x - 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y + 1, x + 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y - 1, x - 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y - 1, x + 1);
+        cave_temp_unlite_room_aux(player_ptr, points, y + 1, x - 1);
     }
 
     // 記録したマスを実際に暗くする。
-    cave_temp_room_unlite(caster_ptr, points);
+    cave_temp_room_unlite(player_ptr, points);
 }
 
 /*!
  * @brief スターライトの効果を発生させる
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param magic 魔法による効果であればTRUE、スターライトの杖による効果であればFALSE
  * @return 常にTRUE
  */
-bool starlight(player_type *caster_ptr, bool magic)
+bool starlight(player_type *player_ptr, bool magic)
 {
-    if (!caster_ptr->blind && !magic) {
+    if (!player_ptr->blind && !magic) {
         msg_print(_("杖の先が明るく輝いた...", "The end of the staff glows brightly..."));
     }
 
@@ -382,14 +381,14 @@ bool starlight(player_type *caster_ptr, bool magic)
         attempts = 1000;
 
         while (attempts--) {
-            scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 4, PROJECT_LOS);
-            if (!cave_has_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT))
+            scatter(player_ptr, &y, &x, player_ptr->y, player_ptr->x, 4, PROJECT_LOS);
+            if (!cave_has_flag_bold(player_ptr->current_floor_ptr, y, x, FF::PROJECT))
                 continue;
-            if (!player_bold(caster_ptr, y, x))
+            if (!player_bold(player_ptr, y, x))
                 break;
         }
 
-        project(caster_ptr, 0, 0, y, x, damroll(6 + caster_ptr->lev / 8, 10), GF_LITE_WEAK,
+        project(player_ptr, 0, 0, y, x, damroll(6 + player_ptr->lev / 8, 10), AttributeType::LITE_WEAK,
             (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL | PROJECT_LOS));
     }
 
@@ -398,60 +397,60 @@ bool starlight(player_type *caster_ptr, bool magic)
 
 /*!
  * @brief プレイヤー位置を中心にLITE_WEAK属性を通じた照明処理を行う / Hack -- call light around the player Affect all monsters in the projection radius
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param dam 威力
  * @param rad 効果半径
  * @return 作用が実際にあった場合TRUEを返す
  */
-bool lite_area(player_type *caster_ptr, HIT_POINT dam, POSITION rad)
+bool lite_area(player_type *player_ptr, HIT_POINT dam, POSITION rad)
 {
-    if (d_info[caster_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
+    if (d_info[player_ptr->dungeon_idx].flags.has(DF::DARKNESS)) {
         msg_print(_("ダンジョンが光を吸収した。", "The darkness of this dungeon absorbs your light."));
         return false;
     }
 
-    if (!caster_ptr->blind) {
+    if (!player_ptr->blind) {
         msg_print(_("白い光が辺りを覆った。", "You are surrounded by a white light."));
     }
 
     BIT_FLAGS flg = PROJECT_GRID | PROJECT_KILL;
-    (void)project(caster_ptr, 0, rad, caster_ptr->y, caster_ptr->x, dam, GF_LITE_WEAK, flg);
+    (void)project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, dam, AttributeType::LITE_WEAK, flg);
 
-    lite_room(caster_ptr, caster_ptr->y, caster_ptr->x);
+    lite_room(player_ptr, player_ptr->y, player_ptr->x);
 
     return true;
 }
 
 /*!
  * @brief プレイヤー位置を中心にLITE_DARK属性を通じた消灯処理を行う / Hack -- call light around the player Affect all monsters in the projection radius
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param dam 威力
  * @param rad 効果半径
  * @return 作用が実際にあった場合TRUEを返す
  */
-bool unlite_area(player_type *caster_ptr, HIT_POINT dam, POSITION rad)
+bool unlite_area(player_type *player_ptr, HIT_POINT dam, POSITION rad)
 {
-    if (!caster_ptr->blind) {
+    if (!player_ptr->blind) {
         msg_print(_("暗闇が辺りを覆った。", "Darkness surrounds you."));
     }
 
     BIT_FLAGS flg = PROJECT_GRID | PROJECT_KILL;
-    (void)project(caster_ptr, 0, rad, caster_ptr->y, caster_ptr->x, dam, GF_DARK_WEAK, flg);
+    (void)project(player_ptr, 0, rad, player_ptr->y, player_ptr->x, dam, AttributeType::DARK_WEAK, flg);
 
-    unlite_room(caster_ptr, caster_ptr->y, caster_ptr->x);
+    unlite_room(player_ptr, player_ptr->y, player_ptr->x);
 
     return true;
 }
 
 /*!
  * @brief LITE_WEAK属性による光源ビーム処理
- * @param caster_ptr プレーヤーへの参照ポインタ
+ * @param player_ptr プレイヤーへの参照ポインタ
  * @param dir 方向(5ならばグローバル変数 target_col/target_row の座標を目標にする)
  * @param dam 威力
  * @return 作用が実際にあった場合TRUEを返す
  */
-bool lite_line(player_type *caster_ptr, DIRECTION dir, HIT_POINT dam)
+bool lite_line(player_type *player_ptr, DIRECTION dir, HIT_POINT dam)
 {
     BIT_FLAGS flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL;
-    return (project_hook(caster_ptr, GF_LITE_WEAK, dir, dam, flg));
+    return (project_hook(player_ptr, AttributeType::LITE_WEAK, dir, dam, flg));
 }