1 #include "monster/monster-describer.h"
2 #include "floor/floor.h"
3 #include "io/files-util.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/monster2.h" // todo 相互参照している.
10 * @brief モンスターの呼称を作成する / Build a string describing a monster in some way.
11 * @param desc 記述出力先の文字列参照ポインタ
12 * @param m_ptr モンスターの参照ポインタ
16 void monster_desc(player_type *player_ptr, char *desc, monster_type *m_ptr, BIT_FLAGS mode)
19 r_ptr = &r_info[m_ptr->ap_r_idx];
20 concptr name = (mode & MD_TRUE_NAME) ? (r_name + real_r_ptr(m_ptr)->name) : (r_name + r_ptr->name);
21 GAME_TEXT silly_name[1024];
23 if (player_ptr->image && !(mode & MD_IGNORE_HALLU)) {
25 if (!get_rnd_line(_("silly_j.txt", "silly.txt"), m_ptr->r_idx, silly_name))
30 monster_race *hallu_race;
33 hallu_race = &r_info[randint1(max_r_idx - 1)];
34 } while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
36 strcpy(silly_name, (r_name + hallu_race->name));
42 bool seen = (m_ptr && ((mode & MD_ASSUME_VISIBLE) || (!(mode & MD_ASSUME_HIDDEN) && m_ptr->ml)));
43 bool pron = (m_ptr && ((seen && (mode & MD_PRON_VISIBLE)) || (!seen && (mode & MD_PRON_HIDDEN))));
45 /* First, try using pronouns, or describing hidden monsters */
46 floor_type *floor_ptr = player_ptr->current_floor_ptr;
49 if (r_ptr->flags1 & (RF1_FEMALE))
51 else if (r_ptr->flags1 & (RF1_MALE))
57 concptr res = _("何か", "it");
58 switch (kind + (mode & (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE))) {
63 case 0x00 + (MD_OBJECTIVE):
66 case 0x00 + (MD_POSSESSIVE):
69 case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):
72 case 0x00 + (MD_INDEF_HIDDEN):
75 case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
78 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
81 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
88 case 0x00 + (MD_OBJECTIVE):
91 case 0x00 + (MD_POSSESSIVE):
94 case 0x00 + (MD_POSSESSIVE | MD_OBJECTIVE):
97 case 0x00 + (MD_INDEF_HIDDEN):
100 case 0x00 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
103 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
106 case 0x00 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
115 case 0x10 + (MD_OBJECTIVE):
118 case 0x10 + (MD_POSSESSIVE):
121 case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):
124 case 0x10 + (MD_INDEF_HIDDEN):
127 case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
130 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
133 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
140 case 0x10 + (MD_OBJECTIVE):
143 case 0x10 + (MD_POSSESSIVE):
146 case 0x10 + (MD_POSSESSIVE | MD_OBJECTIVE):
149 case 0x10 + (MD_INDEF_HIDDEN):
152 case 0x10 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
155 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
158 case 0x10 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
167 case 0x20 + (MD_OBJECTIVE):
170 case 0x20 + (MD_POSSESSIVE):
173 case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):
176 case 0x20 + (MD_INDEF_HIDDEN):
179 case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
182 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
185 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
192 case 0x20 + (MD_OBJECTIVE):
195 case 0x20 + (MD_POSSESSIVE):
198 case 0x20 + (MD_POSSESSIVE | MD_OBJECTIVE):
201 case 0x20 + (MD_INDEF_HIDDEN):
204 case 0x20 + (MD_INDEF_HIDDEN | MD_OBJECTIVE):
207 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE):
210 case 0x20 + (MD_INDEF_HIDDEN | MD_POSSESSIVE | MD_OBJECTIVE):
216 (void)strcpy(desc, res);
220 /* Handle visible monsters, "reflexive" request */
221 if ((mode & (MD_POSSESSIVE | MD_OBJECTIVE)) == (MD_POSSESSIVE | MD_OBJECTIVE)) {
222 /* The monster is visible, so use its gender */
223 if (r_ptr->flags1 & (RF1_FEMALE))
224 strcpy(desc, _("彼女自身", "herself"));
225 else if (r_ptr->flags1 & (RF1_MALE))
226 strcpy(desc, _("彼自身", "himself"));
228 strcpy(desc, _("それ自身", "itself"));
232 /* Handle all other visible monster requests */
234 if (is_pet(m_ptr) && !is_original_ap(m_ptr)) {
240 while (strncmp(t, "』", 2) && *t)
244 (void)sprintf(desc, "%s?』", buf);
246 (void)sprintf(desc, "%s?", name);
248 (void)sprintf(desc, "%s?", name);
251 if ((r_ptr->flags1 & RF1_UNIQUE) && !(player_ptr->image && !(mode & MD_IGNORE_HALLU))) {
252 if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && !(mode & MD_TRUE_NAME)) {
258 while (strncmp(t, "』", 2) && *t)
262 (void)sprintf(desc, "%s?』", buf);
264 (void)sprintf(desc, "%s?", name);
266 (void)sprintf(desc, "%s?", name);
268 } else if (player_ptr->phase_out && !(player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr))) {
269 (void)sprintf(desc, _("%sもどき", "fake %s"), name);
271 (void)strcpy(desc, name);
273 } else if (mode & MD_INDEF_VISIBLE) {
275 (void)strcpy(desc, "");
277 (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a ");
279 (void)strcat(desc, name);
282 (void)strcpy(desc, _("あなたの", "your "));
284 (void)strcpy(desc, _("", "the "));
286 (void)strcat(desc, name);
290 if (m_ptr->nickname) {
292 sprintf(buf, _("「%s」", " called %s"), quark_str(m_ptr->nickname));
296 if (player_ptr->riding && (&floor_ptr->m_list[player_ptr->riding] == m_ptr)) {
297 strcat(desc, _("(乗馬中)", "(riding)"));
300 if ((mode & MD_IGNORE_HALLU) && (m_ptr->mflag2 & MFLAG2_CHAMELEON)) {
301 if (r_ptr->flags1 & RF1_UNIQUE) {
302 strcat(desc, _("(カメレオンの王)", "(Chameleon Lord)"));
304 strcat(desc, _("(カメレオン)", "(Chameleon)"));
308 if ((mode & MD_IGNORE_HALLU) && !is_original_ap(m_ptr)) {
309 strcat(desc, format("(%s)", r_name + r_info[m_ptr->r_idx].name));
312 /* Handle the Possessive as a special afterthought */
313 if (mode & MD_POSSESSIVE) {
314 (void)strcat(desc, _("の", "'s"));