7 #include "player-attack/blood-sucking-processor.h"
8 #include "artifact/fixed-art-types.h"
9 #include "game-option/cheat-options.h"
10 #include "hpmp/hp-mp-processor.h"
11 #include "inventory/inventory-slot-types.h"
12 #include "monster-race/monster-race-hook.h"
13 #include "object-enchant/tr-types.h"
14 #include "player-attack/player-attack-util.h"
15 #include "realm/realm-hex-numbers.h"
16 #include "spell-realm/spells-hex.h"
17 #include "system/monster-type-definition.h"
18 #include "system/object-type-definition.h"
19 #include "system/player-type-definition.h"
20 #include "util/bit-flags-calculator.h"
21 #include "view/display-messages.h"
24 * @brief 生命のあるモンスターから吸血できるか判定する
25 * @param player_ptr プレイヤーへの参照ポインタ
26 * @param pa_ptr 直接攻撃構造体への参照ポインタ
28 void decide_blood_sucking(PlayerType *player_ptr, player_attack_type *pa_ptr)
30 bool is_blood_sucker = pa_ptr->flags.has(TR_VAMPIRIC);
31 is_blood_sucker |= pa_ptr->chaos_effect == CE_VAMPIRIC;
32 is_blood_sucker |= pa_ptr->mode == HISSATSU_DRAIN;
33 is_blood_sucker |= SpellHex(player_ptr).is_spelling_specific(HEX_VAMP_BLADE);
37 pa_ptr->can_drain = monster_living(pa_ptr->m_ptr->r_idx);
42 * @param pa_ptr 直接攻撃構造体への参照ポインタ
44 void calc_drain(player_attack_type *pa_ptr)
46 if (pa_ptr->attack_damage <= 0)
47 pa_ptr->can_drain = false;
49 if (pa_ptr->drain_result > pa_ptr->m_ptr->hp)
50 pa_ptr->drain_result = pa_ptr->m_ptr->hp;
55 * @param player_ptr プレイヤーへの参照ポインタ
56 * @param pa_ptr 直接攻撃構造体への参照ポインタ
57 * @param is_human モンスターが人間かどうか
59 static void drain_muramasa(PlayerType *player_ptr, player_attack_type *pa_ptr, const bool is_human)
64 auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand];
65 HIT_PROB to_h = o_ptr->to_h;
66 HIT_POINT to_d = o_ptr->to_d;
68 for (int i = 0; i < to_h + 3; i++)
76 for (int i = 0; i < to_d + 3; i++)
83 if ((o_ptr->to_h == to_h) && (o_ptr->to_d == to_d))
86 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
93 * @param player_ptr プレイヤーへの参照ポインタ
94 * @param pa_ptr 直接攻撃構造体への参照ポインタ
95 * @param drain_msg 吸血をした旨のメッセージを表示するかどうか
96 * @details 1行目の5がマジックナンバーで良く分からなかったので、取り敢えず元々あったコメントをベースに定数宣言しておいた
98 static void drain_result(PlayerType *player_ptr, player_attack_type *pa_ptr, bool *drain_msg)
100 const int real_drain = 5;
101 if (pa_ptr->drain_result <= real_drain)
104 int drain_heal = damroll(2, pa_ptr->drain_result / 6);
106 if (SpellHex(player_ptr).is_spelling_specific(HEX_VAMP_BLADE))
110 msg_format(_("Draining left: %d", "Draining left: %d"), pa_ptr->drain_left);
113 if (pa_ptr->drain_left == 0)
116 if (drain_heal < pa_ptr->drain_left) {
117 pa_ptr->drain_left -= drain_heal;
119 drain_heal = pa_ptr->drain_left;
120 pa_ptr->drain_left = 0;
124 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), pa_ptr->m_name);
128 drain_heal = (drain_heal * player_ptr->mutant_regenerate_mod) / 100;
129 hp_player(player_ptr, drain_heal);
133 * @brief 吸血処理のメインルーチン
134 * @param player_ptr プレイヤーへの参照ポインタ
135 * @param pa_ptr 直接攻撃構造体への参照ポインタ
136 * @param is_human 人間かどうか(村正用フラグ)
137 * @param drain_msg 吸血をした旨のメッセージを表示するかどうか
138 * @details モンスターが死んだ場合、(ゲームのフレーバー的に)吸血しない
140 void process_drain(PlayerType *player_ptr, player_attack_type *pa_ptr, const bool is_human, bool *drain_msg)
142 if (!pa_ptr->can_drain || (pa_ptr->drain_result <= 0))
145 auto *o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand];
146 if (o_ptr->name1 == ART_MURAMASA)
147 drain_muramasa(player_ptr, pa_ptr, is_human);
149 drain_result(player_ptr, pa_ptr, drain_msg);
151 pa_ptr->m_ptr->maxhp -= (pa_ptr->attack_damage + 7) / 8;
152 if (pa_ptr->m_ptr->hp > pa_ptr->m_ptr->maxhp)
153 pa_ptr->m_ptr->hp = pa_ptr->m_ptr->maxhp;
155 if (pa_ptr->m_ptr->maxhp < 1)
156 pa_ptr->m_ptr->maxhp = 1;