OSDN Git Service

[Refactor] rbm_type を enum class 化しつつ RaceBlowMethodType に改名。
[hengbandforosx/hengbandosx.git] / src / view / display-lore-attacks.cpp
1 #include "view/display-lore-attacks.h"
2 #include "locale/japanese.h"
3 #include "lore/combat-types-setter.h"
4 #include "lore/lore-calculator.h"
5 #include "lore/lore-util.h"
6 #include "monster-attack/monster-attack-types.h"
7 #include "monster-race/race-flags1.h"
8 #include "system/monster-race-definition.h"
9 #include "term/term-color-types.h"
10
11 #ifdef JP
12 /*!
13  * @brief [日本語]モンスター打撃の1回分を出力する
14  * @param lore_ptr 思い出情報へのポインタ
15  * @param attack_numbers 打撃の最大回数
16  * @param d1 ダメージダイス数
17  * @param d2 ダメージダイス面
18  * @param m 打撃の何番目か
19  */
20 static void display_monster_blow_jp(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
21 {
22     if (attack_numbers == 0) {
23         hooked_roff(format("%^sは", Who::who(lore_ptr->msex)));
24     }
25
26     if (d1 && d2 && (lore_ptr->know_everything || know_damage(lore_ptr->r_idx, m))) {
27         hook_c_roff(TERM_L_WHITE, format(" %dd%d ", d1, d2));
28         hooked_roff("のダメージで");
29     }
30
31     if (!lore_ptr->p) {
32         lore_ptr->p = "何か奇妙なことをする";
33         lore_ptr->pc = TERM_VIOLET;
34     }
35
36     /* XXしてYYし/XXしてYYする/XXし/XXする */
37     if (lore_ptr->q != nullptr)
38         jverb(lore_ptr->p, lore_ptr->jverb_buf, JVERB_TO);
39     else if (attack_numbers != lore_ptr->count - 1)
40         jverb(lore_ptr->p, lore_ptr->jverb_buf, JVERB_AND);
41     else
42         strcpy(lore_ptr->jverb_buf, lore_ptr->p);
43
44     hook_c_roff(lore_ptr->pc, lore_ptr->jverb_buf);
45
46     if (lore_ptr->q) {
47         if (attack_numbers != lore_ptr->count - 1)
48             jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
49         else
50             strcpy(lore_ptr->jverb_buf, lore_ptr->q);
51
52         hook_c_roff(lore_ptr->qc, lore_ptr->jverb_buf);
53     }
54
55     if (attack_numbers != lore_ptr->count - 1)
56         hooked_roff("、");
57 }
58 #else
59 /*!
60  * @brief [英語]モンスター打撃の1回分を出力する
61  * @param lore_ptr 思い出情報へのポインタ
62  * @param attack_numbers 打撃の最大回数
63  * @param d1 ダメージダイス数
64  * @param d2 ダメージダイス面
65  * @param m 打撃の何番目か
66  */
67 static void display_monster_blow_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
68 {
69     if (attack_numbers == 0) {
70         hooked_roff(format("%^s can ", Who::who(lore_ptr->msex)));
71     } else if (attack_numbers < lore_ptr->count - 1) {
72         hooked_roff(", ");
73     } else {
74         hooked_roff(", and ");
75     }
76
77     if (lore_ptr->p == nullptr) {
78         lore_ptr->p = "do something weird";
79         lore_ptr->pc = TERM_VIOLET;
80     }
81
82     hook_c_roff(lore_ptr->pc, lore_ptr->p);
83     if (lore_ptr->q != nullptr) {
84         hooked_roff(" to ");
85         hook_c_roff(lore_ptr->qc, lore_ptr->q);
86         if (d1 && d2 && (lore_ptr->know_everything || know_damage(lore_ptr->r_idx, m))) {
87             hooked_roff(" with damage");
88             hook_c_roff(TERM_L_WHITE, format(" %dd%d", d1, d2));
89         }
90     }
91 }
92 #endif
93
94 /*!
95  * @brief モンスター打撃の1回分を出力する(日英切替への踏み台)
96  * @param lore_ptr 思い出情報へのポインタ
97  * @param m 打撃の何番目か
98  * @param attack_numbers 打撃の最大回数
99  */
100 void display_monster_blow(lore_type *lore_ptr, int m, int attack_numbers)
101 {
102     int d1 = lore_ptr->r_ptr->blow[m].d_dice;
103     int d2 = lore_ptr->r_ptr->blow[m].d_side;
104     void (*display_monster_blows_pf)(lore_type *, int, int, int, int) = _(display_monster_blow_jp, display_monster_blow_en);
105     (*display_monster_blows_pf)(lore_ptr, attack_numbers, d1, d2, m);
106 }
107
108 /*!
109  * @brief モンスターの思い出に打撃に関する情報を出力する
110  * @param lore_ptr 思い出情報へのポインタ
111  */
112 void display_monster_blows(lore_type *lore_ptr)
113 {
114     const int max_attack_numbers = 4;
115     for (int m = 0; m < max_attack_numbers; m++) {
116         if (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::NONE || (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::SHOOT))
117             continue;
118
119         if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
120             lore_ptr->count++;
121     }
122
123     int attack_numbers = 0;
124     for (int m = 0; m < max_attack_numbers; m++) {
125         if (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::NONE || (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::SHOOT) || (((lore_ptr->r_ptr->r_blows[m] == 0) && !lore_ptr->know_everything)))
126             continue;
127
128         set_monster_blow_method(lore_ptr, m);
129         set_monster_blow_effect(lore_ptr, m);
130         display_monster_blow(lore_ptr, m, attack_numbers);
131         attack_numbers++;
132     }
133
134     if (attack_numbers > 0) {
135         hooked_roff(_("。", ".  "));
136     } else if (lore_ptr->flags1 & RF1_NEVER_BLOW) {
137         hooked_roff(format(_("%^sは物理的な攻撃方法を持たない。", "%^s has no physical attacks.  "), Who::who(lore_ptr->msex)));
138     } else {
139         hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack.  "), Who::whose(lore_ptr->msex)));
140     }
141 }