OSDN Git Service

[Refactor] #2628 Renamed object-type-definition.cpp/h to item-entity.cpp/h
[hengbandforosx/hengbandosx.git] / src / flavor / tval-description-switcher.cpp
1 /*!
2  * @brief 個々のアイテム種別について、未鑑定名/鑑定後の正式な名前を取得する処理
3  * @date 2020/07/07
4  * @author Hourier
5  */
6
7 #include "flavor/tval-description-switcher.h"
8 #include "flavor/flavor-util.h"
9 #include "locale/english.h"
10 #include "monster-race/monster-race.h"
11 #include "object-enchant/trg-types.h"
12 #include "object/tval-types.h"
13 #include "system/baseitem-info-definition.h"
14 #include "system/item-entity.h"
15 #include "system/monster-race-definition.h"
16 #include "util/enum-converter.h"
17 #ifdef JP
18 #else
19 #include "monster-race/race-flags1.h"
20 #include "player-info/class-info.h"
21 #endif
22
23 static void describe_monster_ball(flavor_type *flavor_ptr)
24 {
25     const auto r_idx = i2enum<MonsterRaceId>(flavor_ptr->o_ptr->pval);
26     auto *r_ptr = &monraces_info[r_idx];
27     if (!flavor_ptr->known) {
28         return;
29     }
30
31     if (!MonsterRace(r_idx).is_valid()) {
32         flavor_ptr->modstr = _(" (空)", " (empty)");
33         return;
34     }
35
36 #ifdef JP
37     sprintf(flavor_ptr->tmp_val2, " (%s)", r_ptr->name.data());
38     flavor_ptr->modstr = flavor_ptr->tmp_val2;
39 #else
40     flavor_ptr->t = format("%s", r_ptr->name.data());
41     if (r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
42         sprintf(flavor_ptr->tmp_val2, " (%s%s)", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
43         flavor_ptr->modstr = flavor_ptr->tmp_val2;
44     } else {
45         sprintf(flavor_ptr->tmp_val2, "(%s)", flavor_ptr->t);
46         flavor_ptr->modstr = flavor_ptr->t;
47     }
48 #endif
49 }
50
51 static void describe_statue(flavor_type *flavor_ptr)
52 {
53     const auto r_idx = i2enum<MonsterRaceId>(flavor_ptr->o_ptr->pval);
54     auto *r_ptr = &monraces_info[r_idx];
55 #ifdef JP
56     flavor_ptr->modstr = r_ptr->name.data();
57 #else
58     flavor_ptr->t = format("%s", r_ptr->name.data());
59     if (r_ptr->kind_flags.has_not(MonsterKindType::UNIQUE)) {
60         sprintf(flavor_ptr->tmp_val2, "%s%s", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
61         flavor_ptr->modstr = flavor_ptr->tmp_val2;
62     } else {
63         flavor_ptr->modstr = flavor_ptr->t;
64     }
65 #endif
66 }
67
68 static void describe_corpse(flavor_type *flavor_ptr)
69 {
70     const auto r_idx = i2enum<MonsterRaceId>(flavor_ptr->o_ptr->pval);
71     auto *r_ptr = &monraces_info[r_idx];
72     flavor_ptr->modstr = r_ptr->name.data();
73 #ifdef JP
74     flavor_ptr->basenm = "#%";
75 #else
76     if (r_ptr->kind_flags.has(MonsterKindType::UNIQUE)) {
77         flavor_ptr->basenm = "& % of #";
78     } else {
79         flavor_ptr->basenm = "& # %";
80     }
81 #endif
82 }
83
84 static void describe_amulet(flavor_type *flavor_ptr)
85 {
86     if (flavor_ptr->aware && (flavor_ptr->o_ptr->is_fixed_artifact() || flavor_ptr->k_ptr->gen_flags.has(ItemGenerationTraitType::INSTA_ART))) {
87         return;
88     }
89
90     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
91     if (!flavor_ptr->flavor) {
92         flavor_ptr->basenm = _("%のアミュレット", "& Amulet~ of %");
93     } else if (flavor_ptr->aware) {
94         flavor_ptr->basenm = _("%の#アミュレット", "& # Amulet~ of %");
95     } else {
96         flavor_ptr->basenm = _("#アミュレット", "& # Amulet~");
97     }
98 }
99
100 static void describe_ring(flavor_type *flavor_ptr)
101 {
102     if (flavor_ptr->aware && (flavor_ptr->o_ptr->is_fixed_artifact() || flavor_ptr->k_ptr->gen_flags.has(ItemGenerationTraitType::INSTA_ART))) {
103         return;
104     }
105
106     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
107     if (!flavor_ptr->flavor) {
108         flavor_ptr->basenm = _("%の指輪", "& Ring~ of %");
109     } else if (flavor_ptr->aware) {
110         flavor_ptr->basenm = _("%の#指輪", "& # Ring~ of %");
111     } else {
112         flavor_ptr->basenm = _("#指輪", "& # Ring~");
113     }
114
115     if (!flavor_ptr->k_ptr->to_h && !flavor_ptr->k_ptr->to_d && (flavor_ptr->o_ptr->to_h || flavor_ptr->o_ptr->to_d)) {
116         flavor_ptr->show_weapon = true;
117     }
118 }
119
120 static void describe_staff(flavor_type *flavor_ptr)
121 {
122     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
123     if (!flavor_ptr->flavor) {
124         flavor_ptr->basenm = _("%の杖", "& Staff~ of %");
125     } else if (flavor_ptr->aware) {
126         flavor_ptr->basenm = _("%の#杖", "& # Staff~ of %");
127     } else {
128         flavor_ptr->basenm = _("#杖", "& # Staff~");
129     }
130 }
131
132 static void describe_wand(flavor_type *flavor_ptr)
133 {
134     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
135     if (!flavor_ptr->flavor) {
136         flavor_ptr->basenm = _("%の魔法棒", "& Wand~ of %");
137     } else if (flavor_ptr->aware) {
138         flavor_ptr->basenm = _("%の#魔法棒", "& # Wand~ of %");
139     } else {
140         flavor_ptr->basenm = _("#魔法棒", "& # Wand~");
141     }
142 }
143
144 static void describe_rod(flavor_type *flavor_ptr)
145 {
146     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
147     if (!flavor_ptr->flavor) {
148         flavor_ptr->basenm = _("%のロッド", "& Rod~ of %");
149     } else if (flavor_ptr->aware) {
150         flavor_ptr->basenm = _("%の#ロッド", "& # Rod~ of %");
151     } else {
152         flavor_ptr->basenm = _("#ロッド", "& # Rod~");
153     }
154 }
155
156 static void describe_scroll(flavor_type *flavor_ptr)
157 {
158     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
159     if (!flavor_ptr->flavor) {
160         flavor_ptr->basenm = _("%の巻物", "& Scroll~ of %");
161     } else if (flavor_ptr->aware) {
162         flavor_ptr->basenm = _("「#」と書かれた%の巻物", "& Scroll~ titled \"#\" of %");
163     } else {
164         flavor_ptr->basenm = _("「#」と書かれた巻物", "& Scroll~ titled \"#\"");
165     }
166 }
167
168 static void describe_potion(flavor_type *flavor_ptr)
169 {
170     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
171     if (!flavor_ptr->flavor) {
172         flavor_ptr->basenm = _("%の薬", "& Potion~ of %");
173     } else if (flavor_ptr->aware) {
174         flavor_ptr->basenm = _("%の#薬", "& # Potion~ of %");
175     } else {
176         flavor_ptr->basenm = _("#薬", "& # Potion~");
177     }
178 }
179
180 static void describe_food(flavor_type *flavor_ptr)
181 {
182     if (flavor_ptr->k_ptr->flavor_name.empty()) {
183         return;
184     }
185
186     flavor_ptr->modstr = flavor_ptr->flavor_k_ptr->flavor_name.data();
187     if (!flavor_ptr->flavor) {
188         flavor_ptr->basenm = _("%のキノコ", "& Mushroom~ of %");
189     } else if (flavor_ptr->aware) {
190         flavor_ptr->basenm = _("%の#キノコ", "& # Mushroom~ of %");
191     } else {
192         flavor_ptr->basenm = _("#キノコ", "& # Mushroom~");
193     }
194 }
195
196 static void describe_book_life(flavor_type *flavor_ptr)
197 {
198 #ifdef JP
199     flavor_ptr->basenm = "生命の魔法書%";
200 #else
201     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
202         flavor_ptr->basenm = "& Book~ of Life Magic %";
203     } else {
204         flavor_ptr->basenm = "& Life Spellbook~ %";
205     }
206 #endif
207 }
208
209 static void describe_book_sorcery(flavor_type *flavor_ptr)
210 {
211 #ifdef JP
212     flavor_ptr->basenm = "仙術の魔法書%";
213 #else
214     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
215         flavor_ptr->basenm = "& Book~ of Sorcery %";
216     } else {
217         flavor_ptr->basenm = "& Sorcery Spellbook~ %";
218     }
219 #endif
220 }
221
222 static void describe_book_nature(flavor_type *flavor_ptr)
223 {
224 #ifdef JP
225     flavor_ptr->basenm = "自然の魔法書%";
226 #else
227     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
228         flavor_ptr->basenm = "& Book~ of Nature Magic %";
229     } else {
230         flavor_ptr->basenm = "& Nature Spellbook~ %";
231     }
232 #endif
233 }
234
235 static void describe_book_chaos(flavor_type *flavor_ptr)
236 {
237 #ifdef JP
238     flavor_ptr->basenm = "カオスの魔法書%";
239 #else
240     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
241         flavor_ptr->basenm = "& Book~ of Chaos Magic %";
242     } else {
243         flavor_ptr->basenm = "& Chaos Spellbook~ %";
244     }
245 #endif
246 }
247
248 static void describe_book_death(flavor_type *flavor_ptr)
249 {
250 #ifdef JP
251     flavor_ptr->basenm = "暗黒の魔法書%";
252 #else
253     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
254         flavor_ptr->basenm = "& Book~ of Death Magic %";
255     } else {
256         flavor_ptr->basenm = "& Death Spellbook~ %";
257     }
258 #endif
259 }
260
261 static void describe_book_trump(flavor_type *flavor_ptr)
262 {
263 #ifdef JP
264     flavor_ptr->basenm = "トランプの魔法書%";
265 #else
266     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
267         flavor_ptr->basenm = "& Book~ of Trump Magic %";
268     } else {
269         flavor_ptr->basenm = "& Trump Spellbook~ %";
270     }
271 #endif
272 }
273
274 static void describe_book_arcane(flavor_type *flavor_ptr)
275 {
276 #ifdef JP
277     flavor_ptr->basenm = "秘術の魔法書%";
278 #else
279     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
280         flavor_ptr->basenm = "& Book~ of Arcane Magic %";
281     } else {
282         flavor_ptr->basenm = "& Arcane Spellbook~ %";
283     }
284 #endif
285 }
286
287 static void describe_book_craft(flavor_type *flavor_ptr)
288 {
289 #ifdef JP
290     flavor_ptr->basenm = "匠の魔法書%";
291 #else
292     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
293         flavor_ptr->basenm = "& Book~ of Craft Magic %";
294     } else {
295         flavor_ptr->basenm = "& Craft Spellbook~ %";
296     }
297 #endif
298 }
299
300 static void describe_book_demon(flavor_type *flavor_ptr)
301 {
302 #ifdef JP
303     flavor_ptr->basenm = "悪魔の魔法書%";
304 #else
305     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
306         flavor_ptr->basenm = "& Book~ of Daemon Magic %";
307     } else {
308         flavor_ptr->basenm = "& Daemon Spellbook~ %";
309     }
310 #endif
311 }
312
313 static void describe_book_crusade(flavor_type *flavor_ptr)
314 {
315 #ifdef JP
316     flavor_ptr->basenm = "破邪の魔法書%";
317 #else
318     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
319         flavor_ptr->basenm = "& Book~ of Crusade Magic %";
320     } else {
321         flavor_ptr->basenm = "& Crusade Spellbook~ %";
322     }
323 #endif
324 }
325
326 static void describe_book_hex(flavor_type *flavor_ptr)
327 {
328 #ifdef JP
329     flavor_ptr->basenm = "呪術の魔法書%";
330 #else
331     if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
332         flavor_ptr->basenm = "& Book~ of Hex Magic %";
333     } else {
334         flavor_ptr->basenm = "& Hex Spellbook~ %";
335     }
336 #endif
337 }
338
339 void switch_tval_description(flavor_type *flavor_ptr)
340 {
341     switch (flavor_ptr->o_ptr->tval) {
342     case ItemKindType::NONE:
343         flavor_ptr->basenm = _("(なし)", "(Nothing)");
344         break;
345     case ItemKindType::SKELETON:
346     case ItemKindType::BOTTLE:
347     case ItemKindType::JUNK:
348     case ItemKindType::SPIKE:
349     case ItemKindType::FLASK:
350     case ItemKindType::CHEST:
351     case ItemKindType::WHISTLE:
352         break;
353     case ItemKindType::CAPTURE:
354         describe_monster_ball(flavor_ptr);
355         break;
356     case ItemKindType::FIGURINE:
357     case ItemKindType::STATUE:
358         describe_statue(flavor_ptr);
359         break;
360     case ItemKindType::CORPSE:
361         describe_corpse(flavor_ptr);
362         break;
363     case ItemKindType::SHOT:
364     case ItemKindType::BOLT:
365     case ItemKindType::ARROW:
366     case ItemKindType::BOW:
367     case ItemKindType::HAFTED:
368     case ItemKindType::POLEARM:
369     case ItemKindType::SWORD:
370     case ItemKindType::DIGGING:
371         flavor_ptr->show_weapon = true;
372         break;
373     case ItemKindType::BOOTS:
374     case ItemKindType::GLOVES:
375     case ItemKindType::CLOAK:
376     case ItemKindType::CROWN:
377     case ItemKindType::HELM:
378     case ItemKindType::SHIELD:
379     case ItemKindType::SOFT_ARMOR:
380     case ItemKindType::HARD_ARMOR:
381     case ItemKindType::DRAG_ARMOR:
382         flavor_ptr->show_armour = true;
383         break;
384     case ItemKindType::LITE:
385         break;
386     case ItemKindType::AMULET:
387         describe_amulet(flavor_ptr);
388         break;
389     case ItemKindType::RING:
390         describe_ring(flavor_ptr);
391         break;
392     case ItemKindType::CARD:
393         break;
394     case ItemKindType::STAFF:
395         describe_staff(flavor_ptr);
396         break;
397     case ItemKindType::WAND:
398         describe_wand(flavor_ptr);
399         break;
400     case ItemKindType::ROD:
401         describe_rod(flavor_ptr);
402         break;
403     case ItemKindType::SCROLL:
404         describe_scroll(flavor_ptr);
405         break;
406     case ItemKindType::POTION:
407         describe_potion(flavor_ptr);
408         break;
409     case ItemKindType::FOOD:
410         describe_food(flavor_ptr);
411         break;
412     case ItemKindType::PARCHMENT:
413         flavor_ptr->basenm = _("羊皮紙 - %", "& Parchment~ - %");
414         break;
415     case ItemKindType::LIFE_BOOK:
416         describe_book_life(flavor_ptr);
417         break;
418     case ItemKindType::SORCERY_BOOK:
419         describe_book_sorcery(flavor_ptr);
420         break;
421     case ItemKindType::NATURE_BOOK:
422         describe_book_nature(flavor_ptr);
423         break;
424     case ItemKindType::CHAOS_BOOK:
425         describe_book_chaos(flavor_ptr);
426         break;
427     case ItemKindType::DEATH_BOOK:
428         describe_book_death(flavor_ptr);
429         break;
430     case ItemKindType::TRUMP_BOOK:
431         describe_book_trump(flavor_ptr);
432         break;
433     case ItemKindType::ARCANE_BOOK:
434         describe_book_arcane(flavor_ptr);
435         break;
436     case ItemKindType::CRAFT_BOOK:
437         describe_book_craft(flavor_ptr);
438         break;
439     case ItemKindType::DEMON_BOOK:
440         describe_book_demon(flavor_ptr);
441         break;
442     case ItemKindType::CRUSADE_BOOK:
443         describe_book_crusade(flavor_ptr);
444         break;
445     case ItemKindType::MUSIC_BOOK:
446         flavor_ptr->basenm = _("歌集%", "& Song Book~ %");
447         break;
448     case ItemKindType::HISSATSU_BOOK:
449         flavor_ptr->basenm = _("& 武芸の書%", "Book~ of Kendo %");
450         break;
451     case ItemKindType::HEX_BOOK:
452         describe_book_hex(flavor_ptr);
453         break;
454     case ItemKindType::GOLD:
455         strcpy(flavor_ptr->buf, flavor_ptr->basenm);
456         return;
457     default:
458         strcpy(flavor_ptr->buf, _("(なし)", "(nothing)"));
459         return;
460     }
461 }