OSDN Git Service

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