1 #include "monster/monster-describer.h"
2 #include "io/files-util.h"
3 #include "monster-race/monster-race.h"
4 #include "monster-race/race-flags1.h"
5 #include "monster/monster-description-types.h"
6 #include "monster/monster-flag-types.h"
7 #include "monster/monster-info.h"
8 #include "system/floor-type-definition.h"
9 #include "util/quarks.h"
10 #include "util/string-processor.h"
11 #include "view/display-messages.h"
14 #include "locale/english.h"
18 * @brief モンスターの呼称を作成する / Build a string describing a monster in some way.
19 * @param desc 記述出力先の文字列参照ポインタ
20 * @param m_ptr モンスターの参照ポインタ
24 void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_FLAGS mode)
27 r_ptr = &r_info[m_ptr->ap_r_idx];
28 concptr name = (mode & MD_TRUE_NAME) ? (r_name + real_r_ptr(m_ptr)->name) : (r_name + r_ptr->name);
29 GAME_TEXT silly_name[1024];
31 if (player_ptr->image && !(mode & MD_IGNORE_HALLU)) {
33 if (!get_rnd_line(_("silly_j.txt", "silly.txt"), m_ptr->r_idx, silly_name))
38 monster_race *hallu_race;
41 hallu_race = &r_info[randint1(max_r_idx - 1)];
42 } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
44 strcpy(silly_name, (r_name + hallu_race->name));
50 bool seen = (m_ptr && ((mode & MD_ASSUME_VISIBLE) || (!(mode & MD_ASSUME_HIDDEN) && m_ptr->ml)));
51 bool pron = (m_ptr && ((seen && (mode & MD_PRON_VISIBLE)) || (!seen && (mode & MD_PRON_HIDDEN))));
53 /* First, try using pronouns, or describing hidden monsters */
54 floor_type *floor_ptr = player_ptr->current_floor_ptr;
57 if (r_ptr->flags1 & (RF1_FEMALE))
59 else if (r_ptr->flags1 & (RF1_MALE))
65 concptr res = _("何か", "it");
66 switch (kind + (mode & (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE))) {
70 case 0x00 + (MD_OBJECTIVE):
73 case 0x00 + (MD_POSSESSIVE):
74 res = _("何かの", "its");
76 case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):
77 res = _("何か自身", "itself");
79 case 0x00 + (MD_INDEF_HIDDEN):
80 res = _("何か", "something");
82 case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
83 res = _("何か", "something");
85 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
86 res = _("何か", "something's");
88 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
89 res = _("それ自身", "itself");
94 case 0x10 + (MD_OBJECTIVE):
97 case 0x10 + (MD_POSSESSIVE):
100 case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):
101 res = _("彼自身", "himself");
103 case 0x10 + (MD_INDEF_HIDDEN):
104 res = _("誰か", "someone");
106 case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
107 res = _("誰か", "someone");
109 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
110 res = _("誰かの", "someone's");
112 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
113 res = _("彼自身", "himself");
116 res = _("彼女", "she");
118 case 0x20 + (MD_OBJECTIVE):
119 res = _("彼女", "her");
121 case 0x20 + (MD_POSSESSIVE):
122 res = _("彼女の", "her");
124 case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):
125 res = _("彼女自身", "herself");
127 case 0x20 + (MD_INDEF_HIDDEN):
128 res = _("誰か", "someone");
130 case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
131 res = _("誰か", "someone");
133 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
134 res = _("誰かの", "someone's");
136 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
137 res = _("彼女自身", "herself");
141 (void)strcpy(desc, res);
145 /* Handle visible monsters, "reflexive" request */
146 if ((mode & (MD_POSSESSIVE | MD_OBJECTIVE)) == (MD_POSSESSIVE | MD_OBJECTIVE)) {
147 /* The monster is visible, so use its gender */
148 if (r_ptr->flags1 & (RF1_FEMALE))
149 strcpy(desc, _("彼女自身", "herself"));
150 else if (r_ptr->flags1 & (RF1_MALE))
151 strcpy(desc, _("彼自身", "himself"));
153 strcpy(desc, _("それ自身", "itself"));
157 /* Handle all other visible monster requests */
159 if (is_pet(m_ptr) && !is_original_ap(m_ptr)) {
165 while (strncmp(t, "』", 2) && *t)
169 (void)sprintf(desc, "%s?』", buf);
171 (void)sprintf(desc, "%s?", name);
173 (void)sprintf(desc, "%s?", name);
176 if ((r_ptr->flags1 & RF1_UNIQUE) && !(player_ptr->image && !(mode & MD_IGNORE_HALLU))) {
177 if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && !(mode & MD_TRUE_NAME)) {
183 while (strncmp(t, "』", 2) && *t)
187 (void)sprintf(desc, "%s?』", buf);
189 (void)sprintf(desc, "%s?", name);
191 (void)sprintf(desc, "%s?", name);
193 } else if (player_ptr->phase_out && !(player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr))) {
194 (void)sprintf(desc, _("%sもどき", "fake %s"), name);
196 (void)strcpy(desc, name);
198 } else if (mode & MD_INDEF_VISIBLE) {
200 (void)strcpy(desc, "");
202 (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
204 (void)strcat(desc, name);
207 (void)strcpy(desc, _("あなたの", "your "));
209 (void)strcpy(desc, _("", "the "));
211 (void)strcat(desc, name);
215 if (m_ptr->nickname) {
217 sprintf(buf, _("「%s」", " called %s"), quark_str(m_ptr->nickname));
221 if (player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr)) {
222 strcat(desc, _("(乗馬中)", "(riding)"));
225 if ((mode & MD_IGNORE_HALLU) && (m_ptr->mflag2 & MFLAG2_CHAMELEON)) {
226 if (r_ptr->flags1 & RF1_UNIQUE) {
227 strcat(desc, _("(カメレオンの王)", "(Chameleon Lord)"));
229 strcat(desc, _("(カメレオン)", "(Chameleon)"));
233 if ((mode & MD_IGNORE_HALLU) && !is_original_ap(m_ptr)) {
234 strcat(desc, format("(%s)", r_name + r_info[m_ptr->r_idx].name));
237 /* Handle the Possessive as a special afterthought */
238 if (mode & MD_POSSESSIVE) {
239 (void)strcat(desc, _("の", "'s"));
244 * @brief ダメージを受けたモンスターの様子を記述する / Dump a message describing a monster's reaction to damage
245 * @param player_ptr プレーヤーへの参照ポインタ
246 * @param m_idx モンスター情報ID
250 * Technically should attempt to treat "Beholder"'s as jelly's
252 void message_pain(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam)
254 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[m_idx];
255 monster_race *r_ptr = &r_info[m_ptr->r_idx];
257 GAME_TEXT m_name[MAX_NLEN];
259 monster_desc(player_ptr, m_name, m_ptr, 0);
262 msg_format(_("%^sはダメージを受けていない。", "%^s is unharmed."), m_name);
266 HIT_POINT newhp = m_ptr->hp;
267 HIT_POINT oldhp = newhp + dam;
268 HIT_POINT tmp = (newhp * 100L) / oldhp;
269 PERCENTAGE percentage = tmp;
271 if (angband_strchr(",ejmvwQ", r_ptr->d_char)) {
273 msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name);
274 else if (percentage > 75)
275 msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name);
276 else if (percentage > 50)
277 msg_format(_("%^sは縮こまった。", "%^s squelches."), m_name);
278 else if (percentage > 35)
279 msg_format(_("%^sは痛みに震えた。", "%^s quivers in pain."), m_name);
280 else if (percentage > 20)
281 msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name);
282 else if (percentage > 10)
283 msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name);
285 msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name);
289 if (angband_strchr("l", r_ptr->d_char)) {
291 msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name);
292 else if (percentage > 75)
293 msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name);
294 else if (percentage > 50)
295 msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name);
296 else if (percentage > 35)
297 msg_format(_("%^sは痛みに震えた。", "%^s quivers in pain."), m_name);
298 else if (percentage > 20)
299 msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name);
300 else if (percentage > 10)
301 msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name);
303 msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name);
307 if (angband_strchr("g#+<>", r_ptr->d_char)) {
309 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
310 else if (percentage > 75)
311 msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
312 else if (percentage > 50)
313 msg_format(_("%^sは雷鳴のように吠えた。", "%^s roars thunderously."), m_name);
314 else if (percentage > 35)
315 msg_format(_("%^sは苦しげに吠えた。", "%^s rumbles."), m_name);
316 else if (percentage > 20)
317 msg_format(_("%^sはうめいた。", "%^s grunts."), m_name);
318 else if (percentage > 10)
319 msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name);
321 msg_format(_("%^sはくしゃくしゃになった。", "%^s crumples."), m_name);
325 if (angband_strchr("JMR", r_ptr->d_char) || !isalpha(r_ptr->d_char)) {
327 msg_format(_("%^sはほとんど気にとめていない。", "%^s barely notices."), m_name);
328 else if (percentage > 75)
329 msg_format(_("%^sはシーッと鳴いた。", "%^s hisses."), m_name);
330 else if (percentage > 50)
331 msg_format(_("%^sは怒って頭を上げた。", "%^s rears up in anger."), m_name);
332 else if (percentage > 35)
333 msg_format(_("%^sは猛然と威嚇した。", "%^s hisses furiously."), m_name);
334 else if (percentage > 20)
335 msg_format(_("%^sは身もだえした。", "%^s writhes about."), m_name);
336 else if (percentage > 10)
337 msg_format(_("%^sは苦痛で身もだえした。", "%^s writhes in agony."), m_name);
339 msg_format(_("%^sはぐにゃぐにゃと痙攣した。", "%^s jerks limply."), m_name);
343 if (angband_strchr("f", r_ptr->d_char)) {
345 msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
346 else if (percentage > 75)
347 msg_format(_("%^sは吠えた。", "%^s roars."), m_name);
348 else if (percentage > 50)
349 msg_format(_("%^sは怒って吠えた。", "%^s growls angrily."), m_name);
350 else if (percentage > 35)
351 msg_format(_("%^sは痛みでシーッと鳴いた。", "%^s hisses with pain."), m_name);
352 else if (percentage > 20)
353 msg_format(_("%^sは痛みで弱々しく鳴いた。", "%^s mewls in pain."), m_name);
354 else if (percentage > 10)
355 msg_format(_("%^sは苦痛にうめいた。", "%^s hisses in agony."), m_name);
357 msg_format(_("%sは哀れな鳴き声を出した。", "%^s mewls pitifully."), m_name);
361 if (angband_strchr("acFIKS", r_ptr->d_char)) {
363 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
364 else if (percentage > 75)
365 msg_format(_("%^sはキーキー鳴いた。", "%^s chitters."), m_name);
366 else if (percentage > 50)
367 msg_format(_("%^sはヨロヨロ逃げ回った。", "%^s scuttles about."), m_name);
368 else if (percentage > 35)
369 msg_format(_("%^sはうるさく鳴いた。", "%^s twitters."), m_name);
370 else if (percentage > 20)
371 msg_format(_("%^sは痛みに痙攣した。", "%^s jerks in pain."), m_name);
372 else if (percentage > 10)
373 msg_format(_("%^sは苦痛で痙攣した。", "%^s jerks in agony."), m_name);
375 msg_format(_("%^sはピクピクひきつった。", "%^s twitches."), m_name);
379 if (angband_strchr("B", r_ptr->d_char)) {
381 msg_format(_("%^sはさえずった。", "%^s chirps."), m_name);
382 else if (percentage > 75)
383 msg_format(_("%^sはピーピー鳴いた。", "%^s twitters."), m_name);
384 else if (percentage > 50)
385 msg_format(_("%^sはギャーギャー鳴いた。", "%^s squawks."), m_name);
386 else if (percentage > 35)
387 msg_format(_("%^sはギャーギャー鳴きわめいた。", "%^s chatters."), m_name);
388 else if (percentage > 20)
389 msg_format(_("%^sは苦しんだ。", "%^s jeers."), m_name);
390 else if (percentage > 10)
391 msg_format(_("%^sはのたうち回った。", "%^s flutters about."), m_name);
393 msg_format(_("%^sはキーキーと鳴き叫んだ。", "%^s squeaks."), m_name);
397 if (angband_strchr("duDLUW", r_ptr->d_char)) {
399 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
400 else if (percentage > 75)
401 msg_format(_("%^sはしり込みした。", "%^s flinches."), m_name);
402 else if (percentage > 50)
403 msg_format(_("%^sは痛みでシーッと鳴いた。", "%^s hisses in pain."), m_name);
404 else if (percentage > 35)
405 msg_format(_("%^sは痛みでうなった。", "%^s snarls with pain."), m_name);
406 else if (percentage > 20)
407 msg_format(_("%^sは痛みに吠えた。", "%^s roars with pain."), m_name);
408 else if (percentage > 10)
409 msg_format(_("%^sは苦しげに叫んだ。", "%^s gasps."), m_name);
411 msg_format(_("%^sは弱々しくうなった。", "%^s snarls feebly."), m_name);
415 if (angband_strchr("s", r_ptr->d_char)) {
417 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
418 else if (percentage > 75)
419 msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
420 else if (percentage > 50)
421 msg_format(_("%^sはカタカタと笑った。", "%^s rattles."), m_name);
422 else if (percentage > 35)
423 msg_format(_("%^sはよろめいた。", "%^s stumbles."), m_name);
424 else if (percentage > 20)
425 msg_format(_("%^sはカタカタ言った。", "%^s rattles."), m_name);
426 else if (percentage > 10)
427 msg_format(_("%^sはよろめいた。", "%^s staggers."), m_name);
429 msg_format(_("%^sはガタガタ言った。", "%^s clatters."), m_name);
433 if (angband_strchr("z", r_ptr->d_char)) {
435 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
436 else if (percentage > 75)
437 msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
438 else if (percentage > 50)
439 msg_format(_("%^sはうめいた。", "%^s groans."), m_name);
440 else if (percentage > 35)
441 msg_format(_("%sは苦しげにうめいた。", "%^s moans."), m_name);
442 else if (percentage > 20)
443 msg_format(_("%^sは躊躇した。", "%^s hesitates."), m_name);
444 else if (percentage > 10)
445 msg_format(_("%^sはうなった。", "%^s grunts."), m_name);
447 msg_format(_("%^sはよろめいた。", "%^s staggers."), m_name);
451 if (angband_strchr("G", r_ptr->d_char)) {
453 msg_format(_("%sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
454 else if (percentage > 75)
455 msg_format(_("%sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
456 else if (percentage > 50)
457 msg_format(_("%sはうめいた。", "%^s moans."), m_name);
458 else if (percentage > 35)
459 msg_format(_("%^sは泣きわめいた。", "%^s wails."), m_name);
460 else if (percentage > 20)
461 msg_format(_("%^sは吠えた。", "%^s howls."), m_name);
462 else if (percentage > 10)
463 msg_format(_("%sは弱々しくうめいた。", "%^s moans softly."), m_name);
465 msg_format(_("%^sはかすかにうめいた。", "%^s sighs."), m_name);
469 if (angband_strchr("CZ", r_ptr->d_char)) {
471 msg_format(_("%^sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
472 else if (percentage > 75)
473 msg_format(_("%^sは痛みでうなった。", "%^s snarls with pain."), m_name);
474 else if (percentage > 50)
475 msg_format(_("%^sは痛みでキャンキャン吠えた。", "%^s yelps in pain."), m_name);
476 else if (percentage > 35)
477 msg_format(_("%^sは痛みで鳴きわめいた。", "%^s howls in pain."), m_name);
478 else if (percentage > 20)
479 msg_format(_("%^sは苦痛のあまり鳴きわめいた。", "%^s howls in agony."), m_name);
480 else if (percentage > 10)
481 msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name);
483 msg_format(_("%^sは弱々しく吠えた。", "%^s yelps feebly."), m_name);
487 if (angband_strchr("Xbilqrt", r_ptr->d_char)) {
489 msg_format(_("%^sは攻撃を気にとめていない。", "%^s ignores the attack."), m_name);
490 else if (percentage > 75)
491 msg_format(_("%^sは痛みでうなった。", "%^s grunts with pain."), m_name);
492 else if (percentage > 50)
493 msg_format(_("%^sは痛みで叫んだ。", "%^s squeals in pain."), m_name);
494 else if (percentage > 35)
495 msg_format(_("%^sは痛みで絶叫した。", "%^s shrieks in pain."), m_name);
496 else if (percentage > 20)
497 msg_format(_("%^sは苦痛のあまり絶叫した。", "%^s shrieks in agony."), m_name);
498 else if (percentage > 10)
499 msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name);
501 msg_format(_("%^sは弱々しく叫んだ。", "%^s cries out feebly."), m_name);
506 msg_format(_("%^sは攻撃に肩をすくめた。", "%^s shrugs off the attack."), m_name);
507 else if (percentage > 75)
508 msg_format(_("%^sは痛みでうなった。", "%^s grunts with pain."), m_name);
509 else if (percentage > 50)
510 msg_format(_("%^sは痛みで叫んだ。", "%^s cries out in pain."), m_name);
511 else if (percentage > 35)
512 msg_format(_("%^sは痛みで絶叫した。", "%^s screams in pain."), m_name);
513 else if (percentage > 20)
514 msg_format(_("%^sは苦痛のあまり絶叫した。", "%^s screams in agony."), m_name);
515 else if (percentage > 10)
516 msg_format(_("%^sは苦痛でもだえ苦しんだ。", "%^s writhes in agony."), m_name);
518 msg_format(_("%^sは弱々しく叫んだ。", "%^s cries out feebly."), m_name);