OSDN Git Service

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