OSDN Git Service

62b45661f3eff805e19bfa02d746441a4d307fca
[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-table.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
45     hook_c_roff(lore_ptr->pc, lore_ptr->jverb_buf);
46
47     if (lore_ptr->q) {
48         if (attack_numbers != lore_ptr->count - 1) {
49             jverb(lore_ptr->q, lore_ptr->jverb_buf, JVERB_AND);
50         } else {
51             strcpy(lore_ptr->jverb_buf, lore_ptr->q);
52         }
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 }
61 #else
62 /*!
63  * @brief [英語]モンスター打撃の1回分を出力する
64  * @param lore_ptr 思い出情報へのポインタ
65  * @param attack_numbers 打撃の最大回数
66  * @param d1 ダメージダイス数
67  * @param d2 ダメージダイス面
68  * @param m 打撃の何番目か
69  */
70 static void display_monster_blow_en(lore_type *lore_ptr, int attack_numbers, int d1, int d2, int m)
71 {
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) {
75         hooked_roff(", ");
76     } else {
77         hooked_roff(", and ");
78     }
79
80     if (lore_ptr->p == nullptr) {
81         lore_ptr->p = "do something weird";
82         lore_ptr->pc = TERM_VIOLET;
83     }
84
85     hook_c_roff(lore_ptr->pc, lore_ptr->p);
86     if (lore_ptr->q != nullptr) {
87         hooked_roff(" to ");
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));
92         }
93     }
94 }
95 #endif
96
97 /*!
98  * @brief モンスター打撃の1回分を出力する(日英切替への踏み台)
99  * @param lore_ptr 思い出情報へのポインタ
100  * @param m 打撃の何番目か
101  * @param attack_numbers 打撃の最大回数
102  */
103 void display_monster_blow(lore_type *lore_ptr, int m, int attack_numbers)
104 {
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);
109 }
110
111 /*!
112  * @brief モンスターの思い出に打撃に関する情報を出力する
113  * @param lore_ptr 思い出情報へのポインタ
114  */
115 void display_monster_blows(lore_type *lore_ptr)
116 {
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)) {
120             continue;
121         }
122
123         if (lore_ptr->r_ptr->r_blows[m] || lore_ptr->know_everything) {
124             lore_ptr->count++;
125         }
126     }
127
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))) {
131             continue;
132         }
133
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);
137         attack_numbers++;
138     }
139
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)));
144     } else {
145         hooked_roff(format(_("%s攻撃については何も知らない。", "Nothing is known about %s attack.  "), Who::whose(lore_ptr->msex)));
146     }
147 }