OSDN Git Service

[Refactor] #37353 Separated hook-checker.c/h from object-hook.c/h
[hengband/hengband.git] / src / object-enchant / vorpal-weapon.c
1 #include "object-enchant/vorpal-weapon.h"
2 #include "art-definition/art-sword-types.h"
3 #include "io/files-util.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags-resistance.h"
6 #include "view/display-messages.h"
7
8 /*!
9  * @brief ヴォーパル武器で攻撃した時のメッセージ表示
10  * @param pa_ptr 直接攻撃構造体への参照ポインタ
11  * @param int 倍率
12  * @return なし
13  */
14 static void print_vorpal_message(player_attack_type *pa_ptr, const int magnification)
15 {
16     switch (magnification) {
17     case 2:
18         msg_format(_("%sを斬った!", "You gouge %s!"), pa_ptr->m_name);
19         break;
20     case 3:
21         msg_format(_("%sをぶった斬った!", "You maim %s!"), pa_ptr->m_name);
22         break;
23     case 4:
24         msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), pa_ptr->m_name);
25         break;
26     case 5:
27         msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), pa_ptr->m_name);
28         break;
29     case 6:
30         msg_format(_("%sを刺身にした!", "You smite %s!"), pa_ptr->m_name);
31         break;
32     case 7:
33         msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), pa_ptr->m_name);
34         break;
35     default:
36         msg_format(_("%sを細切れにした!", "You shred %s!"), pa_ptr->m_name);
37         break;
38     }
39 }
40
41 /*!
42  * @brief チェンソーのノイズ音を表示する
43  * @param o_ptr チェンソーへの参照ポインタ
44  * @return なし
45  */
46 static void print_chainsword_noise(object_type *o_ptr)
47 {
48     if ((o_ptr->name1 != ART_CHAINSWORD) || one_in_(2))
49         return;
50
51     char chainsword_noise[1024];
52     if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
53         msg_print(chainsword_noise);
54 }
55
56 /*!
57  * @brief ヴォーパル武器利用時の処理メインルーチン
58  * @param attacker_ptr プレーヤーへの参照ポインタ
59  * @param pa_ptr 直接攻撃構造体への参照ポインタ
60  * @param vorpal_cut メッタ斬りにできるかどうか
61  * @param vorpal_chance ヴォーパル倍率上昇の機会値
62  * @return なし
63  */
64 void process_vorpal_attack(player_type *attacker_ptr, player_attack_type *pa_ptr, const bool vorpal_cut, const int vorpal_chance)
65 {
66     if (!vorpal_cut)
67         return;
68
69     object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + pa_ptr->hand];
70     int vorpal_magnification = 2;
71     print_chainsword_noise(o_ptr);
72     if (o_ptr->name1 == ART_VORPAL_BLADE)
73         msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
74     else
75         msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), pa_ptr->m_name);
76
77     while (one_in_(vorpal_chance))
78         vorpal_magnification++;
79
80     pa_ptr->attack_damage *= (HIT_POINT)vorpal_magnification;
81     monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
82     if (((r_ptr->flagsr & RFR_RES_ALL) ? pa_ptr->attack_damage / 100 : pa_ptr->attack_damage) > pa_ptr->m_ptr->hp)
83         msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), pa_ptr->m_name);
84     else
85         print_vorpal_message(pa_ptr, vorpal_magnification);
86
87     pa_ptr->drain_result = pa_ptr->drain_result * 3 / 2;
88 }