OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / mind / mind-ninja.cpp
index 222dffe..62d681b 100644 (file)
@@ -3,7 +3,7 @@
 #include "cmd-item/cmd-throw.h"
 #include "combat/combat-options-type.h"
 #include "core/disturbance.h"
-#include "core/player-redraw-types.h"
+#include "effect/attribute-types.h"
 #include "effect/effect-characteristics.h"
 #include "effect/effect-processor.h"
 #include "effect/spells-effect-util.h"
@@ -12,7 +12,6 @@
 #include "floor/floor-util.h"
 #include "floor/geometry.h"
 #include "game-option/disturbance-options.h"
-#include "grid/feature.h"
 #include "grid/grid.h"
 #include "inventory/inventory-slot-types.h"
 #include "mind/mind-mirror-master.h"
 #include "spell-kind/spells-lite.h"
 #include "spell-kind/spells-perception.h"
 #include "spell-kind/spells-teleport.h"
-#include "effect/attribute-types.h"
 #include "spell/spells-status.h"
 #include "status/action-setter.h"
 #include "status/body-improvement.h"
 #include "status/element-resistance.h"
 #include "status/temporary-resistance.h"
+#include "system/baseitem-info.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/object-type-definition.h"
+#include "system/item-entity.h"
+#include "system/monster-entity.h"
+#include "system/monster-race-info.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
+#include "system/terrain-type-definition.h"
 #include "target/projection-path-calculator.h"
 #include "target/target-checker.h"
 #include "target/target-getter.h"
+#include "timed-effect/player-blindness.h"
+#include "timed-effect/player-confusion.h"
+#include "timed-effect/player-hallucination.h"
+#include "timed-effect/player-paralysis.h"
 #include "timed-effect/player-stun.h"
 #include "timed-effect/timed-effects.h"
 #include "util/bit-flags-calculator.h"
@@ -75,14 +80,18 @@ bool kawarimi(PlayerType *player_ptr, bool success)
         return false;
     }
 
-    ObjectType forge;
-    ObjectType *q_ptr = &forge;
+    ItemEntity forge;
+    auto *q_ptr = &forge;
     if (player_ptr->is_dead) {
         return false;
     }
 
-    auto effects = player_ptr->effects();
-    if (player_ptr->confused || player_ptr->blind || player_ptr->paralyzed || player_ptr->hallucinated) {
+    const auto effects = player_ptr->effects();
+    const auto is_confused = effects->confusion()->is_confused();
+    const auto is_blind = effects->blindness()->is_blind();
+    const auto is_hallucinated = effects->hallucination()->is_hallucinated();
+    const auto is_paralyzed = effects->paralysis()->is_paralyzed();
+    if (is_confused || is_blind || is_paralyzed || is_hallucinated) {
         return false;
     }
 
@@ -90,10 +99,11 @@ bool kawarimi(PlayerType *player_ptr, bool success)
         return false;
     }
 
+    auto &rfu = RedrawingFlagsUpdater::get_instance();
     if (!success && one_in_(3)) {
         msg_print(_("変わり身失敗!逃げられなかった。", "Kawarimi failed! You couldn't run away."));
         ninja_data->kawarimi = false;
-        player_ptr->redraw |= (PR_STATUS);
+        rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
         return false;
     }
 
@@ -102,19 +112,20 @@ bool kawarimi(PlayerType *player_ptr, bool success)
 
     teleport_player(player_ptr, 10 + randint1(90), TELEPORT_SPONTANEOUS);
     q_ptr->wipe();
-    const int SV_WOODEN_STATUE = 0;
-    q_ptr->prep(lookup_kind(ItemKindType::STATUE, SV_WOODEN_STATUE));
+    const int sv_wooden_statue = 0;
+    q_ptr->prep(lookup_baseitem_id({ ItemKindType::STATUE, sv_wooden_statue }));
 
-    q_ptr->pval = MON_NINJA;
+    q_ptr->pval = enum2i(MonsterRaceId::NINJA);
     (void)drop_near(player_ptr, q_ptr, -1, y, x);
 
-    if (success)
+    if (success) {
         msg_print(_("攻撃を受ける前に素早く身をひるがえした。", "You have turned around just before the attack hit you."));
-    else
+    } else {
         msg_print(_("変わり身失敗!攻撃を受けてしまった。", "Kawarimi failed! You are hit by the attack."));
+    }
 
     ninja_data->kawarimi = false;
-    player_ptr->redraw |= (PR_STATUS);
+    rfu.set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
     return true;
 }
 
@@ -126,13 +137,15 @@ bool kawarimi(PlayerType *player_ptr, bool success)
  */
 bool rush_attack(PlayerType *player_ptr, bool *mdeath)
 {
-    if (mdeath)
+    if (mdeath) {
         *mdeath = false;
+    }
 
     project_length = 5;
     DIRECTION dir;
-    if (!get_aim_dir(player_ptr, &dir))
+    if (!get_aim_dir(player_ptr, &dir)) {
         return false;
+    }
 
     int tx = player_ptr->x + project_length * ddx[dir];
     int ty = player_ptr->y + project_length * ddy[dir];
@@ -143,25 +156,23 @@ bool rush_attack(PlayerType *player_ptr, bool *mdeath)
     }
 
     int tm_idx = 0;
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
-    if (in_bounds(floor_ptr, ty, tx))
+    auto *floor_ptr = player_ptr->current_floor_ptr;
+    if (in_bounds(floor_ptr, ty, tx)) {
         tm_idx = floor_ptr->grid_array[ty][tx].m_idx;
+    }
 
-    uint16_t path_g[32];
-    int path_n = projection_path(player_ptr, path_g, project_length, player_ptr->y, player_ptr->x, ty, tx, PROJECT_STOP | PROJECT_KILL);
+    projection_path path_g(player_ptr, project_length, player_ptr->y, player_ptr->x, ty, tx, PROJECT_STOP | PROJECT_KILL);
     project_length = 0;
-    if (!path_n)
+    if (path_g.path_num() == 0) {
         return true;
+    }
 
     ty = player_ptr->y;
     tx = player_ptr->x;
     bool tmp_mdeath = false;
     bool moved = false;
-    for (int i = 0; i < path_n; i++) {
-        monster_type *m_ptr;
-
-        int ny = get_grid_y(path_g[i]);
-        int nx = get_grid_x(path_g[i]);
+    for (const auto &[ny, nx] : path_g) {
+        MonsterEntity *m_ptr;
 
         if (is_cave_empty_bold(player_ptr, ny, nx) && player_can_enter(player_ptr, floor_ptr->grid_array[ny][nx].feat, 0)) {
             ty = ny;
@@ -179,8 +190,9 @@ bool rush_attack(PlayerType *player_ptr, bool *mdeath)
             break;
         }
 
-        if (!player_bold(player_ptr, ty, tx))
+        if (!player_bold(player_ptr, ty, tx)) {
             teleport_player_to(player_ptr, ty, tx, TELEPORT_NONMAGICAL);
+        }
         update_monster(player_ptr, floor_ptr->grid_array[ny][nx].m_idx, true);
 
         m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[ny][nx].m_idx];
@@ -191,24 +203,26 @@ bool rush_attack(PlayerType *player_ptr, bool *mdeath)
             msg_format("There is %s in the way!", m_ptr->ml ? (tm_idx ? "another monster" : "a monster") : "someone");
 #endif
         } else if (!player_bold(player_ptr, ty, tx)) {
-            GAME_TEXT m_name[MAX_NLEN];
-            monster_desc(player_ptr, m_name, m_ptr, 0);
-            msg_format(_("素早く%sの懐に入り込んだ!", "You quickly jump in and attack %s!"), m_name);
+            const auto m_name = monster_desc(player_ptr, m_ptr, 0);
+            msg_format(_("素早く%sの懐に入り込んだ!", "You quickly jump in and attack %s!"), m_name.data());
         }
 
-        if (!player_bold(player_ptr, ty, tx))
+        if (!player_bold(player_ptr, ty, tx)) {
             teleport_player_to(player_ptr, ty, tx, TELEPORT_NONMAGICAL);
+        }
         moved = true;
         tmp_mdeath = do_cmd_attack(player_ptr, ny, nx, HISSATSU_NYUSIN);
 
         break;
     }
 
-    if (!moved && !player_bold(player_ptr, ty, tx))
+    if (!moved && !player_bold(player_ptr, ty, tx)) {
         teleport_player_to(player_ptr, ty, tx, TELEPORT_NONMAGICAL);
+    }
 
-    if (mdeath)
+    if (mdeath) {
         *mdeath = tmp_mdeath;
+    }
     return true;
 }
 
@@ -219,40 +233,45 @@ bool rush_attack(PlayerType *player_ptr, bool *mdeath)
  */
 void process_surprise_attack(PlayerType *player_ptr, player_attack_type *pa_ptr)
 {
-    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
-    if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND + pa_ptr->hand) || player_ptr->is_icky_wield[pa_ptr->hand])
+    auto *r_ptr = &monraces_info[pa_ptr->m_ptr->r_idx];
+    if (!has_melee_weapon(player_ptr, enum2i(INVEN_MAIN_HAND) + pa_ptr->hand) || player_ptr->is_icky_wield[pa_ptr->hand]) {
         return;
+    }
 
     int tmp = player_ptr->lev * 6 + (player_ptr->skill_stl + 10) * 4;
-    if (player_ptr->monlite && (pa_ptr->mode != HISSATSU_NYUSIN))
+    if (player_ptr->monlite && (pa_ptr->mode != HISSATSU_NYUSIN)) {
         tmp /= 3;
-    if (has_aggravate(player_ptr))
+    }
+    if (has_aggravate(player_ptr)) {
         tmp /= 2;
-    if (r_ptr->level > (player_ptr->lev * player_ptr->lev / 20 + 10))
+    }
+    if (r_ptr->level > (player_ptr->lev * player_ptr->lev / 20 + 10)) {
         tmp /= 3;
+    }
 
     auto ninja_data = PlayerClass(player_ptr).get_specific_data<ninja_data_type>();
-    if (monster_csleep_remaining(pa_ptr->m_ptr) && pa_ptr->m_ptr->ml) {
+    if (pa_ptr->m_ptr->is_asleep() && pa_ptr->m_ptr->ml) {
         /* Can't backstab creatures that we can't see, right? */
         pa_ptr->backstab = true;
     } else if ((ninja_data && ninja_data->s_stealth) && (randint0(tmp) > (r_ptr->level + 20)) &&
-               pa_ptr->m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL)) {
+               pa_ptr->m_ptr->ml && !r_ptr->resistance_flags.has(MonsterResistanceType::RESIST_ALL)) {
         pa_ptr->surprise_attack = true;
-    } else if (monster_fear_remaining(pa_ptr->m_ptr) && pa_ptr->m_ptr->ml) {
+    } else if (pa_ptr->m_ptr->is_fearful() && pa_ptr->m_ptr->ml) {
         pa_ptr->stab_fleeing = true;
     }
 }
 
 void print_surprise_attack(player_attack_type *pa_ptr)
 {
-    if (pa_ptr->backstab)
+    if (pa_ptr->backstab) {
         msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), pa_ptr->m_name);
-    else if (pa_ptr->surprise_attack)
+    } else if (pa_ptr->surprise_attack) {
         msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), pa_ptr->m_name);
-    else if (pa_ptr->stab_fleeing)
+    } else if (pa_ptr->stab_fleeing) {
         msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), pa_ptr->m_name);
-    else if (!pa_ptr->monk_attack)
+    } else if (!pa_ptr->monk_attack) {
         msg_format(_("%sを攻撃した。", "You hit %s."), pa_ptr->m_name);
+    }
 }
 
 /*!
@@ -272,8 +291,9 @@ void calc_surprise_attack_damage(PlayerType *player_ptr, player_attack_type *pa_
         return;
     }
 
-    if (pa_ptr->stab_fleeing)
+    if (pa_ptr->stab_fleeing) {
         pa_ptr->attack_damage = (3 * pa_ptr->attack_damage) / 2;
+    }
 }
 
 /*!
@@ -290,10 +310,10 @@ bool hayagake(PlayerType *player_ptr)
         return true;
     }
 
-    grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
-    feature_type *f_ptr = &f_info[g_ptr->feat];
+    auto *g_ptr = &player_ptr->current_floor_ptr->grid_array[player_ptr->y][player_ptr->x];
+    auto *f_ptr = &terrains_info[g_ptr->feat];
 
-    if (f_ptr->flags.has_not(FloorFeatureType::PROJECT) || (!player_ptr->levitation && f_ptr->flags.has(FloorFeatureType::DEEP))) {
+    if (f_ptr->flags.has_not(TerrainCharacteristics::PROJECT) || (!player_ptr->levitation && f_ptr->flags.has(TerrainCharacteristics::DEEP))) {
         msg_print(_("ここでは素早く動けない。", "You cannot run in here."));
     } else {
         set_action(player_ptr, ACTION_HAYAGAKE);
@@ -313,8 +333,9 @@ bool set_superstealth(PlayerType *player_ptr, bool set)
     bool notice = false;
 
     auto ninja_data = PlayerClass(player_ptr).get_specific_data<ninja_data_type>();
-    if (!ninja_data || player_ptr->is_dead)
+    if (!ninja_data || player_ptr->is_dead) {
         return false;
+    }
 
     if (set) {
         if (!ninja_data->s_stealth) {
@@ -337,12 +358,15 @@ bool set_superstealth(PlayerType *player_ptr, bool set)
         }
     }
 
-    if (!notice)
+    if (!notice) {
         return false;
-    player_ptr->redraw |= (PR_STATUS);
+    }
 
-    if (disturb_state)
+    RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
+    if (disturb_state) {
         disturb(player_ptr, false, false);
+    }
+
     return true;
 }
 
@@ -353,19 +377,20 @@ bool set_superstealth(PlayerType *player_ptr, bool set)
  * @param spell 発動する特殊技能のID
  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
  */
-bool cast_ninja_spell(PlayerType *player_ptr, mind_ninja_type spell)
+bool cast_ninja_spell(PlayerType *player_ptr, MindNinjaType spell)
 {
     POSITION x = 0, y = 0;
     DIRECTION dir;
     PLAYER_LEVEL plev = player_ptr->lev;
     auto ninja_data = PlayerClass(player_ptr).get_specific_data<ninja_data_type>();
     switch (spell) {
-    case DARKNESS_CREATION:
+    case MindNinjaType::DARKNESS_CREATION:
         (void)unlite_area(player_ptr, 0, 3);
         break;
-    case DETECT_NEAR:
-        if (plev > 44)
+    case MindNinjaType::DETECT_NEAR:
+        if (plev > 44) {
             wiz_lite(player_ptr, true);
+        }
 
         detect_monsters_normal(player_ptr, DETECT_RAD_DEFAULT);
         if (plev > 4) {
@@ -374,61 +399,66 @@ bool cast_ninja_spell(PlayerType *player_ptr, mind_ninja_type spell)
             detect_stairs(player_ptr, DETECT_RAD_DEFAULT);
         }
 
-        if (plev > 14)
+        if (plev > 14) {
             detect_objects_normal(player_ptr, DETECT_RAD_DEFAULT);
+        }
 
         break;
-    case HIDE_LEAVES:
+    case MindNinjaType::HIDE_LEAVES:
         teleport_player(player_ptr, 10, TELEPORT_SPONTANEOUS);
         break;
-    case KAWARIMI:
+    case MindNinjaType::KAWARIMI:
         if (ninja_data && !ninja_data->kawarimi) {
             msg_print(_("敵の攻撃に対して敏感になった。", "You are now prepared to evade any attacks."));
             ninja_data->kawarimi = true;
-            player_ptr->redraw |= (PR_STATUS);
+            RedrawingFlagsUpdater::get_instance().set_flag(MainWindowRedrawingFlag::TIMED_EFFECT);
         }
 
         break;
-    case ABSCONDING:
+    case MindNinjaType::ABSCONDING:
         teleport_player(player_ptr, player_ptr->lev * 5, TELEPORT_SPONTANEOUS);
         break;
-    case HIT_AND_AWAY:
-        if (!hit_and_away(player_ptr))
+    case MindNinjaType::HIT_AND_AWAY:
+        if (!hit_and_away(player_ptr)) {
             return false;
+        }
 
         break;
-    case BIND_MONSTER:
-        if (!get_aim_dir(player_ptr, &dir))
+    case MindNinjaType::BIND_MONSTER:
+        if (!get_aim_dir(player_ptr, &dir)) {
             return false;
+        }
 
         (void)stasis_monster(player_ptr, dir);
         break;
-    case ANCIENT_KNOWLEDGE:
+    case MindNinjaType::ANCIENT_KNOWLEDGE:
         return ident_spell(player_ptr, false);
-    case FLOATING:
+    case MindNinjaType::FLOATING:
         set_tim_levitation(player_ptr, randint1(20) + 20, false);
         break;
-    case HIDE_FLAMES:
+    case MindNinjaType::HIDE_FLAMES:
         fire_ball(player_ptr, AttributeType::FIRE, 0, 50 + plev, plev / 10 + 2);
         teleport_player(player_ptr, 30, TELEPORT_SPONTANEOUS);
         set_oppose_fire(player_ptr, (TIME_EFFECT)plev, false);
         break;
-    case NYUSIN:
+    case MindNinjaType::NYUSIN:
         return rush_attack(player_ptr, nullptr);
-    case SYURIKEN_SPREADING: {
+    case MindNinjaType::SYURIKEN_SPREADING: {
         for (int i = 0; i < 8; i++) {
             OBJECT_IDX slot;
 
             for (slot = 0; slot < INVEN_PACK; slot++) {
-                if (player_ptr->inventory_list[slot].tval == ItemKindType::SPIKE)
+                if (player_ptr->inventory_list[slot].bi_key.tval() == ItemKindType::SPIKE) {
                     break;
+                }
             }
 
             if (slot == INVEN_PACK) {
-                if (!i)
+                if (!i) {
                     msg_print(_("くさびを持っていない。", "You have no Iron Spikes."));
-                else
+                } else {
                     msg_print(_("くさびがなくなった。", "You have no more Iron Spikes."));
+                }
 
                 return false;
             }
@@ -439,16 +469,17 @@ bool cast_ninja_spell(PlayerType *player_ptr, mind_ninja_type spell)
 
         break;
     }
-    case CHAIN_HOOK:
+    case MindNinjaType::CHAIN_HOOK:
         (void)fetch_monster(player_ptr);
         break;
-    case SMOKE_BALL:
-        if (!get_aim_dir(player_ptr, &dir))
+    case MindNinjaType::SMOKE_BALL:
+        if (!get_aim_dir(player_ptr, &dir)) {
             return false;
+        }
 
         fire_ball(player_ptr, AttributeType::OLD_CONF, dir, plev * 3, 3);
         break;
-    case SWAP_POSITION:
+    case MindNinjaType::SWAP_POSITION:
         project_length = -1;
         if (!get_aim_dir(player_ptr, &dir)) {
             project_length = 0;
@@ -458,28 +489,30 @@ bool cast_ninja_spell(PlayerType *player_ptr, mind_ninja_type spell)
         project_length = 0;
         (void)teleport_swap(player_ptr, dir);
         break;
-    case EXPLOSIVE_RUNE:
+    case MindNinjaType::EXPLOSIVE_RUNE:
         create_rune_explosion(player_ptr, player_ptr->y, player_ptr->x);
         break;
-    case HIDE_MUD:
+    case MindNinjaType::HIDE_MUD:
         (void)set_pass_wall(player_ptr, randint1(plev / 2) + plev / 2, false);
         set_oppose_acid(player_ptr, (TIME_EFFECT)plev, false);
         break;
-    case HIDE_MIST:
+    case MindNinjaType::HIDE_MIST:
         fire_ball(player_ptr, AttributeType::POIS, 0, 75 + plev * 2 / 3, plev / 5 + 2);
         fire_ball(player_ptr, AttributeType::HYPODYNAMIA, 0, 75 + plev * 2 / 3, plev / 5 + 2);
         fire_ball(player_ptr, AttributeType::CONFUSION, 0, 75 + plev * 2 / 3, plev / 5 + 2);
         teleport_player(player_ptr, 30, TELEPORT_SPONTANEOUS);
         break;
-    case PURGATORY_FLAME: {
+    case MindNinjaType::PURGATORY_FLAME: {
         int num = damroll(3, 9);
         for (int k = 0; k < num; k++) {
-            AttributeType typ = one_in_(2) ? AttributeType::FIRE : one_in_(3) ? AttributeType::NETHER : AttributeType::PLASMA;
+            AttributeType typ = one_in_(2) ? AttributeType::FIRE : one_in_(3) ? AttributeType::NETHER
+                                                                              : AttributeType::PLASMA;
             int attempts = 1000;
             while (attempts--) {
                 scatter(player_ptr, &y, &x, player_ptr->y, player_ptr->x, 4, PROJECT_NONE);
-                if (!player_bold(player_ptr, y, x))
+                if (!player_bold(player_ptr, y, x)) {
                     break;
+                }
             }
 
             project(player_ptr, 0, 0, y, x, damroll(6 + plev / 8, 10), typ, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL));
@@ -487,7 +520,7 @@ bool cast_ninja_spell(PlayerType *player_ptr, mind_ninja_type spell)
 
         break;
     }
-    case ALTER_EGO:
+    case MindNinjaType::ALTER_EGO:
         set_multishadow(player_ptr, 6 + randint1(6), false);
         break;
     default: