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"
10 #include "locale/japanese.h"
15 * @brief [日本語]モンスター打撃の1回分を出力する
16 * @param lore_ptr 思い出情報へのポインタ
17 * @param attack_numbers 打撃の最大回数
22 static void display_monster_blow_jp(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
24 if (attack_numbers == 0) {
25 hooked_roff(format("%^sは", Who::who(lore_ptr->msex)));
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("のダメージで");
34 lore_ptr->p = "何か奇妙なことをする";
35 lore_ptr->pc = TERM_VIOLET;
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);
44 strcpy(lore_ptr->jverb_buf, lore_ptr->p);
46 hook_c_roff(lore_ptr->pc, lore_ptr->jverb_buf);
49 if (attack_numbers != lore_ptr->count - 1)
50 jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
52 strcpy(lore_ptr->jverb_buf, lore_ptr->q);
54 hook_c_roff(lore_ptr->qc, lore_ptr->jverb_buf);
57 if (attack_numbers != lore_ptr->count - 1)
62 * @brief [英語]モンスター打撃の1回分を出力する
63 * @param lore_ptr 思い出情報へのポインタ
64 * @param attack_numbers 打撃の最大回数
69 static void display_monster_blow_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
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) {
76 hooked_roff(", and ");
79 if (lore_ptr->p == nullptr) {
80 lore_ptr->p = "do something weird";
81 lore_ptr->pc = TERM_VIOLET;
84 hook_c_roff(lore_ptr->pc, lore_ptr->p);
85 if (lore_ptr->q != nullptr) {
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));
97 * @brief モンスター打撃の1回分を出力する(日英切替への踏み台)
98 * @param lore_ptr 思い出情報へのポインタ
100 * @param attack_numbers 打撃の最大回数
102 void display_monster_blow(lore_type *lore_ptr, int m, int attack_numbers)
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);
111 * @brief モンスターの思い出に打撃に関する情報を出力する
112 * @param lore_ptr 思い出情報へのポインタ
114 void display_monster_blows(lore_type *lore_ptr)
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))
121 if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
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)))
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);
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)));
142 hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack. "), Who::whose(lore_ptr->msex)));