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"
13 * @brief [日本語]モンスター打撃の1回分を出力する
14 * @param lore_ptr 思い出情報へのポインタ
15 * @param attack_numbers 打撃の最大回数
20 static void display_monster_blow_jp(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
22 if (attack_numbers == 0) {
23 hooked_roff(format("%^sは", Who::who(lore_ptr->msex)));
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("のダメージで");
32 lore_ptr->p = "何か奇妙なことをする";
33 lore_ptr->pc = TERM_VIOLET;
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);
42 strcpy(lore_ptr->jverb_buf, lore_ptr->p);
44 hook_c_roff(lore_ptr->pc, lore_ptr->jverb_buf);
47 if (attack_numbers != lore_ptr->count - 1)
48 jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
50 strcpy(lore_ptr->jverb_buf, lore_ptr->q);
52 hook_c_roff(lore_ptr->qc, lore_ptr->jverb_buf);
55 if (attack_numbers != lore_ptr->count - 1)
60 * @brief [英語]モンスター打撃の1回分を出力する
61 * @param lore_ptr 思い出情報へのポインタ
62 * @param attack_numbers 打撃の最大回数
67 static void display_monster_blow_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
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) {
74 hooked_roff(", and ");
77 if (lore_ptr->p == nullptr) {
78 lore_ptr->p = "do something weird";
79 lore_ptr->pc = TERM_VIOLET;
82 hook_c_roff(lore_ptr->pc, lore_ptr->p);
83 if (lore_ptr->q != nullptr) {
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));
95 * @brief モンスター打撃の1回分を出力する(日英切替への踏み台)
96 * @param lore_ptr 思い出情報へのポインタ
98 * @param attack_numbers 打撃の最大回数
100 void display_monster_blow(lore_type *lore_ptr, int m, int attack_numbers)
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);
109 * @brief モンスターの思い出に打撃に関する情報を出力する
110 * @param lore_ptr 思い出情報へのポインタ
112 void display_monster_blows(lore_type *lore_ptr)
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))
119 if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything)
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)))
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);
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)));
139 hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack. "), Who::whose(lore_ptr->msex)));