OSDN Git Service

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