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-table.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);
45 hook_c_roff(lore_ptr->pc, lore_ptr->jverb_buf);
48 if (attack_numbers != lore_ptr->count - 1) {
49 jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
51 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) {
63 * @brief [英語]モンスター打撃の1回分を出力する
64 * @param lore_ptr 思い出情報へのポインタ
65 * @param attack_numbers 打撃の最大回数
70 static void display_monster_blow_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
72 if (attack_numbers == 0) {
73 hooked_roff(format("%^s can ", Who::who(lore_ptr->msex)));
74 } else if (attack_numbers < lore_ptr->count - 1) {
77 hooked_roff(", and ");
80 if (lore_ptr->p == nullptr) {
81 lore_ptr->p = "do something weird";
82 lore_ptr->pc = TERM_VIOLET;
85 hook_c_roff(lore_ptr->pc, lore_ptr->p);
86 if (lore_ptr->q != nullptr) {
88 hook_c_roff(lore_ptr->qc, lore_ptr->q);
89 if (d1 && d2 && (lore_ptr->know_everything || know_damage(lore_ptr->r_idx, m))) {
90 hooked_roff(" with damage");
91 hook_c_roff(TERM_L_WHITE, format(" %dd%d", d1, d2));
98 * @brief モンスター打撃の1回分を出力する(日英切替への踏み台)
99 * @param lore_ptr 思い出情報へのポインタ
101 * @param attack_numbers 打撃の最大回数
103 void display_monster_blow(lore_type *lore_ptr, int m, int attack_numbers)
105 int d1 = lore_ptr->r_ptr->blow[m].d_dice;
106 int d2 = lore_ptr->r_ptr->blow[m].d_side;
107 void (*display_monster_blows_pf)(lore_type *, int, int, int, int) = _(display_monster_blow_jp, display_monster_blow_en);
108 (*display_monster_blows_pf)(lore_ptr, attack_numbers, d1, d2, m);
112 * @brief モンスターの思い出に打撃に関する情報を出力する
113 * @param lore_ptr 思い出情報へのポインタ
115 void display_monster_blows(lore_type *lore_ptr)
117 const int max_attack_numbers = 4;
118 for (int m = 0; m < max_attack_numbers; m++) {
119 if (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::NONE || (lore_ptr->r_ptr->blow[m].method == RaceBlowMethodType::SHOOT)) {
123 if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything) {
128 int attack_numbers = 0;
129 for (int m = 0; m < max_attack_numbers; m++) {
130 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))) {
134 set_monster_blow_method(lore_ptr, m);
135 set_monster_blow_effect(lore_ptr, m);
136 display_monster_blow(lore_ptr, m, attack_numbers);
140 if (attack_numbers > 0) {
141 hooked_roff(_("。", ". "));
142 } else if (lore_ptr->behavior_flags.has(MonsterBehaviorType::NEVER_BLOW)) {
143 hooked_roff(format(_("%^sは物理的な攻撃方法を持たない。", "%^s has no physical attacks. "), Who::who(lore_ptr->msex)));
145 hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack. "), Who::whose(lore_ptr->msex)));