OSDN Git Service

c4772e5691ad6fd6230dbf18422730b378edbf3e
[hengbandforosx/hengbandosx.git] / src / monster / monster-describer.cpp
1 #include "monster/monster-describer.h"
2 #include "io/files-util.h"
3 #include "locale/english.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags1.h"
6 #include "monster/monster-description-types.h"
7 #include "monster/monster-flag-types.h"
8 #include "monster/monster-info.h"
9 #include "system/floor-type-definition.h"
10 #include "system/monster-entity.h"
11 #include "system/monster-race-info.h"
12 #include "system/player-type-definition.h"
13 #include "timed-effect/player-hallucination.h"
14 #include "timed-effect/timed-effects.h"
15 #include "util/quarks.h"
16 #include "util/string-processor.h"
17 #include "view/display-messages.h"
18
19 /*!
20  * @brief モンスターの呼称を作成する / Build a string describing a monster in some way.
21  * @param m_ptr モンスターの参照ポインタ
22  * @param mode 呼称オプション
23  * @return std::string 要求されたモンスターの説明を含む文字列
24  */
25 std::string monster_desc(PlayerType *player_ptr, MonsterEntity *m_ptr, BIT_FLAGS mode)
26 {
27     MonsterRaceInfo *r_ptr;
28     r_ptr = &monraces_info[m_ptr->ap_r_idx];
29     concptr name = (mode & MD_TRUE_NAME) ? m_ptr->get_real_r_ref().name.data() : r_ptr->name.data();
30     GAME_TEXT silly_name[1024];
31     bool named = false;
32     auto is_hallucinated = player_ptr->effects()->hallucination()->is_hallucinated();
33     if (is_hallucinated && !(mode & MD_IGNORE_HALLU)) {
34         if (one_in_(2)) {
35             if (!get_random_line(_("silly_j.txt", "silly.txt"), enum2i(m_ptr->r_idx), silly_name)) {
36                 named = true;
37             }
38         }
39
40         if (!named) {
41             MonsterRaceInfo *hallu_race;
42
43             do {
44                 auto r_idx = MonsterRace::pick_one_at_random();
45                 hallu_race = &monraces_info[r_idx];
46             } while (hallu_race->name.empty() || hallu_race->kind_flags.has(MonsterKindType::UNIQUE));
47
48             strcpy(silly_name, (hallu_race->name.data()));
49         }
50
51         name = silly_name;
52     }
53
54     bool seen = (m_ptr && ((mode & MD_ASSUME_VISIBLE) || (!(mode & MD_ASSUME_HIDDEN) && m_ptr->ml)));
55     bool pron = (m_ptr && ((seen && (mode & MD_PRON_VISIBLE)) || (!seen && (mode & MD_PRON_HIDDEN))));
56
57     /* First, try using pronouns, or describing hidden monsters */
58     auto *floor_ptr = player_ptr->current_floor_ptr;
59     if (!seen || pron) {
60         int kind = 0x00;
61         if (r_ptr->flags1 & (RF1_FEMALE)) {
62             kind = 0x20;
63         } else if (r_ptr->flags1 & (RF1_MALE)) {
64             kind = 0x10;
65         }
66
67         if (!m_ptr || !pron) {
68             kind = 0x00;
69         }
70
71         concptr res = _("何か", "it");
72         switch (kind + (mode & (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE))) {
73         case 0x00:
74             res = _("何か", "it");
75             break;
76         case 0x00 + (MD_OBJECTIVE):
77             res = _("何か", "it");
78             break;
79         case 0x00 + (MD_POSSESSIVE):
80             res = _("何かの", "its");
81             break;
82         case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):
83             res = _("何か自身", "itself");
84             break;
85         case 0x00 + (MD_INDEF_HIDDEN):
86             res = _("何か", "something");
87             break;
88         case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
89             res = _("何か", "something");
90             break;
91         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
92             res = _("何か", "something's");
93             break;
94         case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
95             res = _("それ自身", "itself");
96             break;
97         case 0x10:
98             res = _("彼", "he");
99             break;
100         case 0x10 + (MD_OBJECTIVE):
101             res = _("彼", "him");
102             break;
103         case 0x10 + (MD_POSSESSIVE):
104             res = _("彼の", "his");
105             break;
106         case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):
107             res = _("彼自身", "himself");
108             break;
109         case 0x10 + (MD_INDEF_HIDDEN):
110             res = _("誰か", "someone");
111             break;
112         case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
113             res = _("誰か", "someone");
114             break;
115         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
116             res = _("誰かの", "someone's");
117             break;
118         case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
119             res = _("彼自身", "himself");
120             break;
121         case 0x20:
122             res = _("彼女", "she");
123             break;
124         case 0x20 + (MD_OBJECTIVE):
125             res = _("彼女", "her");
126             break;
127         case 0x20 + (MD_POSSESSIVE):
128             res = _("彼女の", "her");
129             break;
130         case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):
131             res = _("彼女自身", "herself");
132             break;
133         case 0x20 + (MD_INDEF_HIDDEN):
134             res = _("誰か", "someone");
135             break;
136         case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
137             res = _("誰か", "someone");
138             break;
139         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
140             res = _("誰かの", "someone's");
141             break;
142         case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
143             res = _("彼女自身", "herself");
144             break;
145         }
146
147         return res;
148     }
149
150     /* Handle visible monsters, "reflexive" request */
151     if ((mode & (MD_POSSESSIVE | MD_OBJECTIVE)) == (MD_POSSESSIVE | MD_OBJECTIVE)) {
152         /* The monster is visible, so use its gender */
153         if (r_ptr->flags1 & (RF1_FEMALE)) {
154             return _("彼女自身", "herself");
155         } else if (r_ptr->flags1 & (RF1_MALE)) {
156             return _("彼自身", "himself");
157         } else {
158             return _("それ自身", "itself");
159         }
160     }
161
162     /* Handle all other visible monster requests */
163     /* Tanuki? */
164     std::string desc;
165     if (m_ptr->is_pet() && !m_ptr->is_original_ap()) {
166 #ifdef JP
167         char *t;
168         char buf[128];
169         strcpy(buf, name);
170         t = buf;
171         while (strncmp(t, "』", 2) && *t) {
172             t++;
173         }
174         if (*t) {
175             *t = '\0';
176             desc = format("%s?』", buf);
177         } else {
178             desc = format("%s?", name);
179         }
180 #else
181         desc = format("%s?", name);
182 #endif
183     } else {
184         if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) && !(is_hallucinated && !(mode & MD_IGNORE_HALLU))) {
185             if (m_ptr->mflag2.has(MonsterConstantFlagType::CHAMELEON) && !(mode & MD_TRUE_NAME)) {
186 #ifdef JP
187                 char *t;
188                 char buf[128];
189                 strcpy(buf, name);
190                 t = buf;
191                 while (strncmp(t, "』", 2) && *t) {
192                     t++;
193                 }
194                 if (*t) {
195                     *t = '\0';
196                     desc = format("%s?』", buf);
197                 } else {
198                     desc = format("%s?", name);
199                 }
200 #else
201                 desc = format("%s?", name);
202 #endif
203             } else if (player_ptr->phase_out && !(player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr))) {
204                 desc = format(_("%sもどき", "fake %s"), name);
205             } else {
206                 desc = name;
207             }
208         } else if (mode & MD_INDEF_VISIBLE) {
209 #ifndef JP
210             desc = is_a_vowel(name[0]) ? "an " : "a ";
211 #endif
212             desc.append(name);
213         } else {
214             if (m_ptr->is_pet()) {
215                 desc = _("あなたの", "your ");
216             } else {
217                 desc = _("", "the ");
218             }
219
220             desc.append(name);
221         }
222     }
223
224     if (m_ptr->is_named()) {
225         desc.append(_("「", " called ")).append(m_ptr->nickname).append(_("」", ""));
226     }
227
228     if (player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr)) {
229         desc.append(_("(乗馬中)", "(riding)"));
230     }
231
232     if ((mode & MD_IGNORE_HALLU) && m_ptr->mflag2.has(MonsterConstantFlagType::CHAMELEON)) {
233         if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
234             desc.append(_("(カメレオンの王)", "(Chameleon Lord)"));
235         } else {
236             desc.append(_("(カメレオン)", "(Chameleon)"));
237         }
238     }
239
240     if ((mode & MD_IGNORE_HALLU) && !m_ptr->is_original_ap()) {
241         desc.append("(").append(monraces_info[m_ptr->r_idx].name).append(")");
242     }
243
244     /* Handle the Possessive as a special afterthought */
245     if (mode & MD_POSSESSIVE) {
246         desc.append(_("の", "'s"));
247     }
248
249     return desc;
250 }
251
252 /*!
253  * @brief ダメージを受けたモンスターの様子を記述する / Dump a message describing a monster's reaction to damage
254  * @param player_ptr プレイヤーへの参照ポインタ
255  * @param m_idx モンスター情報ID
256  * @param dam 与えたダメージ
257  * @details
258  * Technically should attempt to treat "Beholder"'s as jelly's
259  */
260 void message_pain(PlayerType *player_ptr, MONSTER_IDX m_idx, int dam)
261 {
262     auto *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
263     auto *r_ptr = &monraces_info[m_ptr->r_idx];
264
265     const auto m_name = monster_desc(player_ptr, m_ptr, 0);
266
267     if (dam == 0) {
268         if (m_ptr->ml) {
269             msg_format(_("%^sはダメージを受けていない。", "%^s is unharmed."), m_name.data());
270         }
271         return;
272     }
273
274     int newhp = m_ptr->hp;
275     int oldhp = newhp + dam;
276     int tmp = (newhp * 100L) / oldhp;
277     PERCENTAGE percentage = tmp;
278
279     if (angband_strchr(",ejmvwQ", r_ptr->d_char)) {
280         if (percentage > 95) {
281             msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name.data());
282         } else if (percentage > 75) {
283             msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name.data());
284         } else if (percentage > 50) {
285             msg_format(_("%^sは縮こまった。", "%^s squelches."), m_name.data());
286         } else if (percentage > 35) {
287             msg_format(_("%^sは痛みに震えた。", "%^s quivers in pain."), m_name.data());
288         } else if (percentage > 20) {
289             msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name.data());
290         } else if (percentage > 10) {
291             msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name.data());
292         } else {
293             msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name.data());
294         }
295         return;
296     }
297
298     if (angband_strchr("l", r_ptr->d_char)) {
299         if (percentage > 95) {
300             msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name.data());
301         } else if (percentage > 75) {
302             msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name.data());
303         } else if (percentage > 50) {
304             msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name.data());
305         } else if (percentage > 35) {
306             msg_format(_("%^sは痛みに震えた。", "%^s quivers in pain."), m_name.data());
307         } else if (percentage > 20) {
308             msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name.data());
309         } else if (percentage > 10) {
310             msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name.data());
311         } else {
312             msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name.data());
313         }
314         return;
315     }
316
317     if (angband_strchr("g#+<>", r_ptr->d_char)) {
318         if (percentage > 95) {
319             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
320         } else if (percentage > 75) {
321             msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
322         } else if (percentage > 50) {
323             msg_format(_("%^sは雷鳴のように吠えた。", "%^s roars thunderously."), m_name.data());
324         } else if (percentage > 35) {
325             msg_format(_("%^sは苦しげに吠えた。", "%^s rumbles."), m_name.data());
326         } else if (percentage > 20) {
327             msg_format(_("%^sはうめいた。", "%^s grunts."), m_name.data());
328         } else if (percentage > 10) {
329             msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name.data());
330         } else {
331             msg_format(_("%^sはくしゃくしゃになった。", "%^s crumples."), m_name.data());
332         }
333         return;
334     }
335
336     if (angband_strchr("JMR", r_ptr->d_char) || !isalpha(r_ptr->d_char)) {
337         if (percentage > 95) {
338             msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name.data());
339         } else if (percentage > 75) {
340             msg_format(_("%^sはシーッと鳴いた。", "%^s hisses."), m_name.data());
341         } else if (percentage > 50) {
342             msg_format(_("%^sは怒って頭を上げた。", "%^s rears up in anger."), m_name.data());
343         } else if (percentage > 35) {
344             msg_format(_("%^sは猛然と威嚇した。", "%^s hisses furiously."), m_name.data());
345         } else if (percentage > 20) {
346             msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name.data());
347         } else if (percentage > 10) {
348             msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name.data());
349         } else {
350             msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name.data());
351         }
352         return;
353     }
354
355     if (angband_strchr("f", r_ptr->d_char)) {
356         if (percentage > 95) {
357             msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
358         } else if (percentage > 75) {
359             msg_format(_("%^sは吠えた。", "%^s roars."), m_name.data());
360         } else if (percentage > 50) {
361             msg_format(_("%^sは怒って吠えた。", "%^s growls angrily."), m_name.data());
362         } else if (percentage > 35) {
363             msg_format(_("%^sは痛みでシーッと鳴いた。", "%^s hisses with pain."), m_name.data());
364         } else if (percentage > 20) {
365             msg_format(_("%^sは痛みで弱々しく鳴いた。", "%^s mewls in pain."), m_name.data());
366         } else if (percentage > 10) {
367             msg_format(_("%^sは苦痛にうめいた。", "%^s hisses in agony."), m_name.data());
368         } else {
369             msg_format(_("%sは哀れな鳴き声を出した。", "%^s mewls pitifully."), m_name.data());
370         }
371         return;
372     }
373
374     if (angband_strchr("acFIKS", r_ptr->d_char)) {
375         if (percentage > 95) {
376             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
377         } else if (percentage > 75) {
378             msg_format(_("%^sはキーキー鳴いた。", "%^s chitters."), m_name.data());
379         } else if (percentage > 50) {
380             msg_format(_("%^sはヨロヨロ逃げ回った。", "%^s scuttles about."), m_name.data());
381         } else if (percentage > 35) {
382             msg_format(_("%^sはうるさく鳴いた。", "%^s twitters."), m_name.data());
383         } else if (percentage > 20) {
384             msg_format(_("%^sは痛みに痙攣した。", "%^s jerks in pain."), m_name.data());
385         } else if (percentage > 10) {
386             msg_format(_("%^sは苦痛で痙攣した。", "%^s jerks in agony."), m_name.data());
387         } else {
388             msg_format(_("%^sはピクピクひきつった。", "%^s twitches."), m_name.data());
389         }
390         return;
391     }
392
393     if (angband_strchr("B", r_ptr->d_char)) {
394         if (percentage > 95) {
395             msg_format(_("%^sはさえずった。", "%^s chirps."), m_name.data());
396         } else if (percentage > 75) {
397             msg_format(_("%^sはピーピー鳴いた。", "%^s twitters."), m_name.data());
398         } else if (percentage > 50) {
399             msg_format(_("%^sはギャーギャー鳴いた。", "%^s squawks."), m_name.data());
400         } else if (percentage > 35) {
401             msg_format(_("%^sはギャーギャー鳴きわめいた。", "%^s chatters."), m_name.data());
402         } else if (percentage > 20) {
403             msg_format(_("%^sは苦しんだ。", "%^s jeers."), m_name.data());
404         } else if (percentage > 10) {
405             msg_format(_("%^sはのたうち回った。", "%^s flutters about."), m_name.data());
406         } else {
407             msg_format(_("%^sはキーキーと鳴き叫んだ。", "%^s squeaks."), m_name.data());
408         }
409         return;
410     }
411
412     if (angband_strchr("duDLUW", r_ptr->d_char)) {
413         if (percentage > 95) {
414             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
415         } else if (percentage > 75) {
416             msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name.data());
417         } else if (percentage > 50) {
418             msg_format(_("%^sは痛みでシーッと鳴いた。", "%^s hisses in pain."), m_name.data());
419         } else if (percentage > 35) {
420             msg_format(_("%^sは痛みでうなった。", "%^s snarls with pain."), m_name.data());
421         } else if (percentage > 20) {
422             msg_format(_("%^sは痛みに吠えた。", "%^s roars with pain."), m_name.data());
423         } else if (percentage > 10) {
424             msg_format(_("%^sは苦しげに叫んだ。", "%^s gasps."), m_name.data());
425         } else {
426             msg_format(_("%^sは弱々しくうなった。", "%^s snarls feebly."), m_name.data());
427         }
428         return;
429     }
430
431     if (angband_strchr("s", r_ptr->d_char)) {
432         if (percentage > 95) {
433             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
434         } else if (percentage > 75) {
435             msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
436         } else if (percentage > 50) {
437             msg_format(_("%^sはカタカタと笑った。", "%^s rattles."), m_name.data());
438         } else if (percentage > 35) {
439             msg_format(_("%^sはよろめいた。", "%^s stumbles."), m_name.data());
440         } else if (percentage > 20) {
441             msg_format(_("%^sはカタカタ言った。", "%^s rattles."), m_name.data());
442         } else if (percentage > 10) {
443             msg_format(_("%^sはよろめいた。", "%^s staggers."), m_name.data());
444         } else {
445             msg_format(_("%^sはガタガタ言った。", "%^s clatters."), m_name.data());
446         }
447         return;
448     }
449
450     if (angband_strchr("z", r_ptr->d_char)) {
451         if (percentage > 95) {
452             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
453         } else if (percentage > 75) {
454             msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
455         } else if (percentage > 50) {
456             msg_format(_("%^sはうめいた。", "%^s groans."), m_name.data());
457         } else if (percentage > 35) {
458             msg_format(_("%sは苦しげにうめいた。", "%^s moans."), m_name.data());
459         } else if (percentage > 20) {
460             msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name.data());
461         } else if (percentage > 10) {
462             msg_format(_("%^sはうなった。", "%^s grunts."), m_name.data());
463         } else {
464             msg_format(_("%^sはよろめいた。", "%^s staggers."), m_name.data());
465         }
466         return;
467     }
468
469     if (angband_strchr("G", r_ptr->d_char)) {
470         if (percentage > 95) {
471             msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
472         } else if (percentage > 75) {
473             msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
474         } else if (percentage > 50) {
475             msg_format(_("%sはうめいた。", "%^s moans."), m_name.data());
476         } else if (percentage > 35) {
477             msg_format(_("%^sは泣きわめいた。", "%^s wails."), m_name.data());
478         } else if (percentage > 20) {
479             msg_format(_("%^sは吠えた。", "%^s howls."), m_name.data());
480         } else if (percentage > 10) {
481             msg_format(_("%sは弱々しくうめいた。", "%^s moans softly."), m_name.data());
482         } else {
483             msg_format(_("%^sはかすかにうめいた。", "%^s sighs."), m_name.data());
484         }
485         return;
486     }
487
488     if (angband_strchr("CZ", r_ptr->d_char)) {
489         if (percentage > 95) {
490             msg_format(_("%^sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
491         } else if (percentage > 75) {
492             msg_format(_("%^sは痛みでうなった。", "%^s snarls with pain."), m_name.data());
493         } else if (percentage > 50) {
494             msg_format(_("%^sは痛みでキャンキャン吠えた。", "%^s yelps in pain."), m_name.data());
495         } else if (percentage > 35) {
496             msg_format(_("%^sは痛みで鳴きわめいた。", "%^s howls in pain."), m_name.data());
497         } else if (percentage > 20) {
498             msg_format(_("%^sは苦痛のあまり鳴きわめいた。", "%^s howls in agony."), m_name.data());
499         } else if (percentage > 10) {
500             msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name.data());
501         } else {
502             msg_format(_("%^sは弱々しく吠えた。", "%^s yelps feebly."), m_name.data());
503         }
504         return;
505     }
506
507     if (angband_strchr("Xbilqrt", r_ptr->d_char)) {
508         if (percentage > 95) {
509             msg_format(_("%^sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name.data());
510         } else if (percentage > 75) {
511             msg_format(_("%^sは痛みでうなった。", "%^s grunts with pain."), m_name.data());
512         } else if (percentage > 50) {
513             msg_format(_("%^sは痛みで叫んだ。", "%^s squeals in pain."), m_name.data());
514         } else if (percentage > 35) {
515             msg_format(_("%^sは痛みで絶叫した。", "%^s shrieks in pain."), m_name.data());
516         } else if (percentage > 20) {
517             msg_format(_("%^sは苦痛のあまり絶叫した。", "%^s shrieks in agony."), m_name.data());
518         } else if (percentage > 10) {
519             msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name.data());
520         } else {
521             msg_format(_("%^sは弱々しく叫んだ。", "%^s cries out feebly."), m_name.data());
522         }
523         return;
524     }
525
526     if (percentage > 95) {
527         msg_format(_("%^sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name.data());
528     } else if (percentage > 75) {
529         msg_format(_("%^sは痛みでうなった。", "%^s grunts with pain."), m_name.data());
530     } else if (percentage > 50) {
531         msg_format(_("%^sは痛みで叫んだ。", "%^s cries out in pain."), m_name.data());
532     } else if (percentage > 35) {
533         msg_format(_("%^sは痛みで絶叫した。", "%^s screams in pain."), m_name.data());
534     } else if (percentage > 20) {
535         msg_format(_("%^sは苦痛のあまり絶叫した。", "%^s screams in agony."), m_name.data());
536     } else if (percentage > 10) {
537         msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name.data());
538     } else {
539         msg_format(_("%^sは弱々しく叫んだ。", "%^s cries out feebly."), m_name.data());
540     }
541 }