OSDN Git Service

7e3d1a6b6856fe0aaba5023a7ce7515114506863
[hengbandforosx/hengbandosx.git] / src / autopick / autopick-entry.cpp
1 #include "autopick/autopick-entry.h"
2 #include "autopick/autopick-flags-table.h"
3 #include "autopick/autopick-key-flag-process.h"
4 #include "autopick/autopick-keys-table.h"
5 #include "autopick/autopick-methods-table.h"
6 #include "autopick/autopick-util.h"
7 #include "core/show-file.h"
8 #include "flavor/flavor-describer.h"
9 #include "flavor/object-flavor-types.h"
10 #include "floor/floor-object.h"
11 #include "monster-race/monster-race.h"
12 #include "monster-race/race-flags1.h"
13 #include "object-enchant/item-feeling.h"
14 #include "object-enchant/object-ego.h"
15 #include "object-enchant/special-object-flags.h"
16 #include "object-hook/hook-quest.h"
17 #include "object-hook/hook-weapon.h"
18 #include "object/item-use-flags.h"
19 #include "object/object-info.h"
20 #include "object/object-kind.h"
21 #include "perception/object-perception.h"
22 #include "player-base/player-class.h"
23 #include "player/player-realm.h"
24 #include "system/monster-race-definition.h"
25 #include "system/object-type-definition.h"
26 #include "system/player-type-definition.h"
27 #include "util/quarks.h"
28 #include "util/string-processor.h"
29
30 #ifdef JP
31 static char kanji_colon[] = ":";
32 #endif
33
34 /*!
35  * @brief A function to create new entry
36  */
37 bool autopick_new_entry(autopick_type *entry, concptr str, bool allow_default)
38 {
39     if (str[0] && str[1] == ':')
40         switch (str[0]) {
41         case '?':
42         case '%':
43         case 'A':
44         case 'P':
45         case 'C':
46             return false;
47         }
48
49     entry->flag[0] = entry->flag[1] = 0L;
50     entry->dice = 0;
51     entry->bonus = 0;
52
53     byte act = DO_AUTOPICK | DO_DISPLAY;
54     while (true) {
55         if ((act & DO_AUTOPICK) && *str == '!') {
56             act &= ~DO_AUTOPICK;
57             act |= DO_AUTODESTROY;
58             str++;
59             continue;
60         }
61
62         if ((act & DO_AUTOPICK) && *str == '~') {
63             act &= ~DO_AUTOPICK;
64             act |= DONT_AUTOPICK;
65             str++;
66             continue;
67         }
68
69         if ((act & DO_AUTOPICK) && *str == ';') {
70             act &= ~DO_AUTOPICK;
71             act |= DO_QUERY_AUTOPICK;
72             str++;
73             continue;
74         }
75
76         if ((act & DO_DISPLAY) && *str == '(') {
77             act &= ~DO_DISPLAY;
78             str++;
79             continue;
80         }
81
82         break;
83     }
84
85     concptr insc = nullptr;
86     char buf[MAX_LINELEN];
87     int i;
88     for (i = 0; *str; i++) {
89         char c = *str++;
90 #ifdef JP
91         if (iskanji(c)) {
92             buf[i++] = c;
93             buf[i] = *str++;
94             continue;
95         }
96 #endif
97         if (c == '#') {
98             buf[i] = '\0';
99             insc = str;
100             break;
101         }
102
103         if (isupper(c))
104             c = (char)tolower(c);
105
106         buf[i] = c;
107     }
108
109     buf[i] = '\0';
110     if (!allow_default && *buf == 0)
111         return false;
112     if (*buf == 0 && insc)
113         return false;
114
115     concptr prev_ptr, ptr;
116     ptr = prev_ptr = buf;
117     concptr old_ptr = nullptr;
118     while (old_ptr != ptr) {
119         old_ptr = ptr;
120         if (MATCH_KEY(KEY_ALL))
121             ADD_FLG(FLG_ALL);
122         if (MATCH_KEY(KEY_COLLECTING))
123             ADD_FLG(FLG_COLLECTING);
124         if (MATCH_KEY(KEY_UNAWARE))
125             ADD_FLG(FLG_UNAWARE);
126         if (MATCH_KEY(KEY_UNIDENTIFIED))
127             ADD_FLG(FLG_UNIDENTIFIED);
128         if (MATCH_KEY(KEY_IDENTIFIED))
129             ADD_FLG(FLG_IDENTIFIED);
130         if (MATCH_KEY(KEY_STAR_IDENTIFIED))
131             ADD_FLG(FLG_STAR_IDENTIFIED);
132         if (MATCH_KEY(KEY_BOOSTED))
133             ADD_FLG(FLG_BOOSTED);
134
135         /*** Weapons whose dd*ds is more than nn ***/
136         if (MATCH_KEY2(KEY_MORE_THAN)) {
137             int k = 0;
138             entry->dice = 0;
139
140             while (' ' == *ptr)
141                 ptr++;
142
143             while ('0' <= *ptr && *ptr <= '9') {
144                 entry->dice = 10 * entry->dice + (*ptr - '0');
145                 ptr++;
146                 k++;
147             }
148
149             if (k > 0 && k <= 2) {
150                 (void)MATCH_KEY(KEY_DICE);
151                 ADD_FLG(FLG_MORE_DICE);
152             } else
153                 ptr = prev_ptr;
154         }
155
156         /*** Items whose magical bonus is more than n ***/
157         if (MATCH_KEY2(KEY_MORE_BONUS)) {
158             int k = 0;
159             entry->bonus = 0;
160
161             while (' ' == *ptr)
162                 ptr++;
163
164             while ('0' <= *ptr && *ptr <= '9') {
165                 entry->bonus = 10 * entry->bonus + (*ptr - '0');
166                 ptr++;
167                 k++;
168             }
169
170             if (k > 0 && k <= 2) {
171 #ifdef JP
172                 (void)MATCH_KEY(KEY_MORE_BONUS2);
173 #else
174                 if (' ' == *ptr)
175                     ptr++;
176 #endif
177                 ADD_FLG(FLG_MORE_BONUS);
178             } else
179                 ptr = prev_ptr;
180         }
181
182         if (MATCH_KEY(KEY_WORTHLESS))
183             ADD_FLG(FLG_WORTHLESS);
184         if (MATCH_KEY(KEY_EGO))
185             ADD_FLG(FLG_EGO);
186         if (MATCH_KEY(KEY_GOOD))
187             ADD_FLG(FLG_GOOD);
188         if (MATCH_KEY(KEY_NAMELESS))
189             ADD_FLG(FLG_NAMELESS);
190         if (MATCH_KEY(KEY_AVERAGE))
191             ADD_FLG(FLG_AVERAGE);
192         if (MATCH_KEY(KEY_RARE))
193             ADD_FLG(FLG_RARE);
194         if (MATCH_KEY(KEY_COMMON))
195             ADD_FLG(FLG_COMMON);
196         if (MATCH_KEY(KEY_WANTED))
197             ADD_FLG(FLG_WANTED);
198         if (MATCH_KEY(KEY_UNIQUE))
199             ADD_FLG(FLG_UNIQUE);
200         if (MATCH_KEY(KEY_HUMAN))
201             ADD_FLG(FLG_HUMAN);
202         if (MATCH_KEY(KEY_UNREADABLE))
203             ADD_FLG(FLG_UNREADABLE);
204         if (MATCH_KEY(KEY_REALM1))
205             ADD_FLG(FLG_REALM1);
206         if (MATCH_KEY(KEY_REALM2))
207             ADD_FLG(FLG_REALM2);
208         if (MATCH_KEY(KEY_FIRST))
209             ADD_FLG(FLG_FIRST);
210         if (MATCH_KEY(KEY_SECOND))
211             ADD_FLG(FLG_SECOND);
212         if (MATCH_KEY(KEY_THIRD))
213             ADD_FLG(FLG_THIRD);
214         if (MATCH_KEY(KEY_FOURTH))
215             ADD_FLG(FLG_FOURTH);
216     }
217
218     int prev_flg = -1;
219     if (MATCH_KEY2(KEY_ARTIFACT))
220         ADD_FLG_NOUN(FLG_ARTIFACT);
221
222     if (MATCH_KEY2(KEY_ITEMS))
223         ADD_FLG_NOUN(FLG_ITEMS);
224     else if (MATCH_KEY2(KEY_WEAPONS))
225         ADD_FLG_NOUN(FLG_WEAPONS);
226     else if (MATCH_KEY2(KEY_FAVORITE_WEAPONS))
227         ADD_FLG_NOUN(FLG_FAVORITE_WEAPONS);
228     else if (MATCH_KEY2(KEY_ARMORS))
229         ADD_FLG_NOUN(FLG_ARMORS);
230     else if (MATCH_KEY2(KEY_MISSILES))
231         ADD_FLG_NOUN(FLG_MISSILES);
232     else if (MATCH_KEY2(KEY_DEVICES))
233         ADD_FLG_NOUN(FLG_DEVICES);
234     else if (MATCH_KEY2(KEY_LIGHTS))
235         ADD_FLG_NOUN(FLG_LIGHTS);
236     else if (MATCH_KEY2(KEY_JUNKS))
237         ADD_FLG_NOUN(FLG_JUNKS);
238     else if (MATCH_KEY2(KEY_CORPSES))
239         ADD_FLG_NOUN(FLG_CORPSES);
240     else if (MATCH_KEY2(KEY_SPELLBOOKS))
241         ADD_FLG_NOUN(FLG_SPELLBOOKS);
242     else if (MATCH_KEY2(KEY_HAFTED))
243         ADD_FLG_NOUN(FLG_HAFTED);
244     else if (MATCH_KEY2(KEY_SHIELDS))
245         ADD_FLG_NOUN(FLG_SHIELDS);
246     else if (MATCH_KEY2(KEY_BOWS))
247         ADD_FLG_NOUN(FLG_BOWS);
248     else if (MATCH_KEY2(KEY_RINGS))
249         ADD_FLG_NOUN(FLG_RINGS);
250     else if (MATCH_KEY2(KEY_AMULETS))
251         ADD_FLG_NOUN(FLG_AMULETS);
252     else if (MATCH_KEY2(KEY_SUITS))
253         ADD_FLG_NOUN(FLG_SUITS);
254     else if (MATCH_KEY2(KEY_CLOAKS))
255         ADD_FLG_NOUN(FLG_CLOAKS);
256     else if (MATCH_KEY2(KEY_HELMS))
257         ADD_FLG_NOUN(FLG_HELMS);
258     else if (MATCH_KEY2(KEY_GLOVES))
259         ADD_FLG_NOUN(FLG_GLOVES);
260     else if (MATCH_KEY2(KEY_BOOTS))
261         ADD_FLG_NOUN(FLG_BOOTS);
262
263     if (*ptr == ':')
264         ptr++;
265 #ifdef JP
266     else if (ptr[0] == kanji_colon[0] && ptr[1] == kanji_colon[1])
267         ptr += 2;
268 #endif
269     else if (*ptr == '\0') {
270         if (prev_flg == -1)
271             ADD_FLG_NOUN(FLG_ITEMS);
272     } else {
273         if (prev_flg != -1) {
274             entry->flag[prev_flg / 32] &= ~(1UL << (prev_flg % 32));
275             ptr = prev_ptr;
276         }
277     }
278
279     entry->name = ptr;
280     entry->action = act;
281     entry->insc = insc != nullptr ? insc : "";
282
283     return true;
284 }
285
286 /*!
287  * @brief Get auto-picker entry from o_ptr.
288  */
289 void autopick_entry_from_object(PlayerType *player_ptr, autopick_type *entry, ObjectType *o_ptr)
290 {
291     /* Assume that object name is to be added */
292     bool name = true;
293     GAME_TEXT name_str[MAX_NLEN + 32];
294     name_str[0] = '\0';
295     auto insc = quark_str(o_ptr->inscription);
296     entry->insc = insc != nullptr ? insc : "";
297     entry->action = DO_AUTOPICK | DO_DISPLAY;
298     entry->flag[0] = entry->flag[1] = 0L;
299     entry->dice = 0;
300
301     // エゴ銘が邪魔かもしれないので、デフォルトで「^」は付けない.
302     // We can always use the ^ mark in English.
303     bool is_hat_added = _(false, true);
304     if (!o_ptr->is_aware()) {
305         ADD_FLG(FLG_UNAWARE);
306         is_hat_added = true;
307     } else if (!o_ptr->is_known()) {
308         if (!(o_ptr->ident & IDENT_SENSE)) {
309             ADD_FLG(FLG_UNIDENTIFIED);
310             is_hat_added = true;
311         } else {
312             switch (o_ptr->feeling) {
313             case FEEL_AVERAGE:
314             case FEEL_GOOD:
315                 ADD_FLG(FLG_NAMELESS);
316                 is_hat_added = true;
317                 break;
318
319             case FEEL_BROKEN:
320             case FEEL_CURSED:
321                 ADD_FLG(FLG_NAMELESS);
322                 ADD_FLG(FLG_WORTHLESS);
323                 is_hat_added = true;
324                 break;
325
326             case FEEL_TERRIBLE:
327             case FEEL_WORTHLESS:
328                 ADD_FLG(FLG_WORTHLESS);
329                 break;
330
331             case FEEL_EXCELLENT:
332                 ADD_FLG(FLG_EGO);
333                 break;
334
335             case FEEL_UNCURSED:
336                 break;
337
338             default:
339                 break;
340             }
341         }
342     } else {
343         if (o_ptr->is_ego()) {
344             if (o_ptr->is_weapon_armour_ammo()) {
345                 /*
346                  * Base name of ego weapons and armors
347                  * are almost meaningless.
348                  * Register the ego type only.
349                  */
350                 auto *e_ptr = &e_info[o_ptr->ego_idx];
351 #ifdef JP
352                 /* エゴ銘には「^」マークが使える */
353                 sprintf(name_str, "^%s", e_ptr->name.c_str());
354 #else
355                 /* We ommit the basename and cannot use the ^ mark */
356                 strcpy(name_str, e_ptr->name.c_str());
357 #endif
358                 name = false;
359                 if (!o_ptr->is_rare())
360                     ADD_FLG(FLG_COMMON);
361             }
362
363             ADD_FLG(FLG_EGO);
364         } else if (o_ptr->is_artifact())
365             ADD_FLG(FLG_ARTIFACT);
366         else {
367             if (o_ptr->is_equipment())
368                 ADD_FLG(FLG_NAMELESS);
369
370             is_hat_added = true;
371         }
372     }
373
374     if (o_ptr->is_melee_weapon()) {
375         auto *k_ptr = &k_info[o_ptr->k_idx];
376
377         if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds))
378             ADD_FLG(FLG_BOOSTED);
379     }
380
381     if (object_is_bounty(player_ptr, o_ptr)) {
382         REM_FLG(FLG_WORTHLESS);
383         ADD_FLG(FLG_WANTED);
384     }
385
386     if ((o_ptr->tval == ItemKindType::CORPSE || o_ptr->tval == ItemKindType::STATUE) && r_info[o_ptr->pval].kind_flags.has(MonsterKindType::UNIQUE)) {
387         ADD_FLG(FLG_UNIQUE);
388     }
389
390     if (o_ptr->tval == ItemKindType::CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char)) {
391         ADD_FLG(FLG_HUMAN);
392     }
393
394     if (o_ptr->tval >= ItemKindType::LIFE_BOOK && !check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval)) {
395         ADD_FLG(FLG_UNREADABLE);
396         if (o_ptr->tval != ItemKindType::ARCANE_BOOK)
397             name = false;
398     }
399
400     PlayerClass pc(player_ptr);
401     auto realm_except_class = pc.equals(PlayerClassType::SORCERER) || pc.equals(PlayerClassType::RED_MAGE);
402
403     if ((get_realm1_book(player_ptr) == o_ptr->tval) && !realm_except_class) {
404         ADD_FLG(FLG_REALM1);
405         name = false;
406     }
407
408     if ((get_realm2_book(player_ptr) == o_ptr->tval) && !realm_except_class) {
409         ADD_FLG(FLG_REALM2);
410         name = false;
411     }
412
413     if (o_ptr->tval >= ItemKindType::LIFE_BOOK && 0 == o_ptr->sval)
414         ADD_FLG(FLG_FIRST);
415     if (o_ptr->tval >= ItemKindType::LIFE_BOOK && 1 == o_ptr->sval)
416         ADD_FLG(FLG_SECOND);
417     if (o_ptr->tval >= ItemKindType::LIFE_BOOK && 2 == o_ptr->sval)
418         ADD_FLG(FLG_THIRD);
419     if (o_ptr->tval >= ItemKindType::LIFE_BOOK && 3 == o_ptr->sval)
420         ADD_FLG(FLG_FOURTH);
421
422     if (o_ptr->is_ammo())
423         ADD_FLG(FLG_MISSILES);
424     else if (o_ptr->tval == ItemKindType::SCROLL || o_ptr->tval == ItemKindType::STAFF || o_ptr->tval == ItemKindType::WAND || o_ptr->tval == ItemKindType::ROD)
425         ADD_FLG(FLG_DEVICES);
426     else if (o_ptr->tval == ItemKindType::LITE)
427         ADD_FLG(FLG_LIGHTS);
428     else if (o_ptr->tval == ItemKindType::SKELETON || o_ptr->tval == ItemKindType::BOTTLE || o_ptr->tval == ItemKindType::JUNK || o_ptr->tval == ItemKindType::STATUE)
429         ADD_FLG(FLG_JUNKS);
430     else if (o_ptr->tval == ItemKindType::CORPSE)
431         ADD_FLG(FLG_CORPSES);
432     else if (o_ptr->tval >= ItemKindType::LIFE_BOOK)
433         ADD_FLG(FLG_SPELLBOOKS);
434     else if (o_ptr->tval == ItemKindType::POLEARM || o_ptr->tval == ItemKindType::SWORD || o_ptr->tval == ItemKindType::DIGGING || o_ptr->tval == ItemKindType::HAFTED)
435         ADD_FLG(FLG_WEAPONS);
436     else if (o_ptr->tval == ItemKindType::SHIELD)
437         ADD_FLG(FLG_SHIELDS);
438     else if (o_ptr->tval == ItemKindType::BOW)
439         ADD_FLG(FLG_BOWS);
440     else if (o_ptr->tval == ItemKindType::RING)
441         ADD_FLG(FLG_RINGS);
442     else if (o_ptr->tval == ItemKindType::AMULET)
443         ADD_FLG(FLG_AMULETS);
444     else if (o_ptr->tval == ItemKindType::DRAG_ARMOR || o_ptr->tval == ItemKindType::HARD_ARMOR || o_ptr->tval == ItemKindType::SOFT_ARMOR)
445         ADD_FLG(FLG_SUITS);
446     else if (o_ptr->tval == ItemKindType::CLOAK)
447         ADD_FLG(FLG_CLOAKS);
448     else if (o_ptr->tval == ItemKindType::HELM)
449         ADD_FLG(FLG_HELMS);
450     else if (o_ptr->tval == ItemKindType::GLOVES)
451         ADD_FLG(FLG_GLOVES);
452     else if (o_ptr->tval == ItemKindType::BOOTS)
453         ADD_FLG(FLG_BOOTS);
454
455     if (!name) {
456         str_tolower(name_str);
457         entry->name = name_str;
458         return;
459     }
460
461     GAME_TEXT o_name[MAX_NLEN];
462     describe_flavor(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL | OD_NAME_ONLY));
463
464     /*
465      * If necessary, add a '^' which indicates the
466      * beginning of line.
467      */
468     sprintf(name_str, "%s%s", is_hat_added ? "^" : "", o_name);
469     str_tolower(name_str);
470     entry->name = name_str;
471 }
472
473 /*!
474  * @brief Reconstruct preference line from entry
475  */
476 concptr autopick_line_from_entry(autopick_type *entry)
477 {
478     char buf[MAX_LINELEN];
479     *buf = '\0';
480     if (!(entry->action & DO_DISPLAY))
481         strcat(buf, "(");
482     if (entry->action & DO_QUERY_AUTOPICK)
483         strcat(buf, ";");
484     if (entry->action & DO_AUTODESTROY)
485         strcat(buf, "!");
486     if (entry->action & DONT_AUTOPICK)
487         strcat(buf, "~");
488
489     char *ptr;
490     ptr = buf;
491     if (IS_FLG(FLG_ALL))
492         ADD_KEY(KEY_ALL);
493     if (IS_FLG(FLG_COLLECTING))
494         ADD_KEY(KEY_COLLECTING);
495     if (IS_FLG(FLG_UNAWARE))
496         ADD_KEY(KEY_UNAWARE);
497     if (IS_FLG(FLG_UNIDENTIFIED))
498         ADD_KEY(KEY_UNIDENTIFIED);
499     if (IS_FLG(FLG_IDENTIFIED))
500         ADD_KEY(KEY_IDENTIFIED);
501     if (IS_FLG(FLG_STAR_IDENTIFIED))
502         ADD_KEY(KEY_STAR_IDENTIFIED);
503     if (IS_FLG(FLG_BOOSTED))
504         ADD_KEY(KEY_BOOSTED);
505
506     if (IS_FLG(FLG_MORE_DICE)) {
507         ADD_KEY(KEY_MORE_THAN);
508         strcat(ptr, format("%d", entry->dice));
509         ADD_KEY(KEY_DICE);
510     }
511
512     if (IS_FLG(FLG_MORE_BONUS)) {
513         ADD_KEY(KEY_MORE_BONUS);
514         strcat(ptr, format("%d", entry->bonus));
515         ADD_KEY(KEY_MORE_BONUS2);
516     }
517
518     if (IS_FLG(FLG_UNREADABLE))
519         ADD_KEY(KEY_UNREADABLE);
520     if (IS_FLG(FLG_REALM1))
521         ADD_KEY(KEY_REALM1);
522     if (IS_FLG(FLG_REALM2))
523         ADD_KEY(KEY_REALM2);
524     if (IS_FLG(FLG_FIRST))
525         ADD_KEY(KEY_FIRST);
526     if (IS_FLG(FLG_SECOND))
527         ADD_KEY(KEY_SECOND);
528     if (IS_FLG(FLG_THIRD))
529         ADD_KEY(KEY_THIRD);
530     if (IS_FLG(FLG_FOURTH))
531         ADD_KEY(KEY_FOURTH);
532     if (IS_FLG(FLG_WANTED))
533         ADD_KEY(KEY_WANTED);
534     if (IS_FLG(FLG_UNIQUE))
535         ADD_KEY(KEY_UNIQUE);
536     if (IS_FLG(FLG_HUMAN))
537         ADD_KEY(KEY_HUMAN);
538     if (IS_FLG(FLG_WORTHLESS))
539         ADD_KEY(KEY_WORTHLESS);
540     if (IS_FLG(FLG_GOOD))
541         ADD_KEY(KEY_GOOD);
542     if (IS_FLG(FLG_NAMELESS))
543         ADD_KEY(KEY_NAMELESS);
544     if (IS_FLG(FLG_AVERAGE))
545         ADD_KEY(KEY_AVERAGE);
546     if (IS_FLG(FLG_RARE))
547         ADD_KEY(KEY_RARE);
548     if (IS_FLG(FLG_COMMON))
549         ADD_KEY(KEY_COMMON);
550     if (IS_FLG(FLG_EGO))
551         ADD_KEY(KEY_EGO);
552
553     if (IS_FLG(FLG_ARTIFACT))
554         ADD_KEY(KEY_ARTIFACT);
555
556     bool sepa_flag = true;
557     if (IS_FLG(FLG_ITEMS))
558         ADD_KEY2(KEY_ITEMS);
559     else if (IS_FLG(FLG_WEAPONS))
560         ADD_KEY2(KEY_WEAPONS);
561     else if (IS_FLG(FLG_FAVORITE_WEAPONS))
562         ADD_KEY2(KEY_FAVORITE_WEAPONS);
563     else if (IS_FLG(FLG_ARMORS))
564         ADD_KEY2(KEY_ARMORS);
565     else if (IS_FLG(FLG_MISSILES))
566         ADD_KEY2(KEY_MISSILES);
567     else if (IS_FLG(FLG_DEVICES))
568         ADD_KEY2(KEY_DEVICES);
569     else if (IS_FLG(FLG_LIGHTS))
570         ADD_KEY2(KEY_LIGHTS);
571     else if (IS_FLG(FLG_JUNKS))
572         ADD_KEY2(KEY_JUNKS);
573     else if (IS_FLG(FLG_CORPSES))
574         ADD_KEY2(KEY_CORPSES);
575     else if (IS_FLG(FLG_SPELLBOOKS))
576         ADD_KEY2(KEY_SPELLBOOKS);
577     else if (IS_FLG(FLG_HAFTED))
578         ADD_KEY2(KEY_HAFTED);
579     else if (IS_FLG(FLG_SHIELDS))
580         ADD_KEY2(KEY_SHIELDS);
581     else if (IS_FLG(FLG_BOWS))
582         ADD_KEY2(KEY_BOWS);
583     else if (IS_FLG(FLG_RINGS))
584         ADD_KEY2(KEY_RINGS);
585     else if (IS_FLG(FLG_AMULETS))
586         ADD_KEY2(KEY_AMULETS);
587     else if (IS_FLG(FLG_SUITS))
588         ADD_KEY2(KEY_SUITS);
589     else if (IS_FLG(FLG_CLOAKS))
590         ADD_KEY2(KEY_CLOAKS);
591     else if (IS_FLG(FLG_HELMS))
592         ADD_KEY2(KEY_HELMS);
593     else if (IS_FLG(FLG_GLOVES))
594         ADD_KEY2(KEY_GLOVES);
595     else if (IS_FLG(FLG_BOOTS))
596         ADD_KEY2(KEY_BOOTS);
597     else if (!IS_FLG(FLG_ARTIFACT))
598         sepa_flag = false;
599
600     if (!entry->name.empty()) {
601         if (sepa_flag)
602             strcat(buf, ":");
603
604         int i = strlen(buf);
605         int j = 0;
606         while (entry->name[j] && i < MAX_LINELEN - 2 - 1) {
607 #ifdef JP
608             if (iskanji(entry->name[j]))
609                 buf[i++] = entry->name[j++];
610 #endif
611             buf[i++] = entry->name[j++];
612         }
613         buf[i] = '\0';
614     }
615
616     if (entry->insc.empty())
617         return string_make(buf);
618
619     int i, j = 0;
620     strcat(buf, "#");
621     i = strlen(buf);
622
623     while (entry->insc[j] && i < MAX_LINELEN - 2) {
624 #ifdef JP
625         if (iskanji(entry->insc[j]))
626             buf[i++] = entry->insc[j++];
627 #endif
628         buf[i++] = entry->insc[j++];
629     }
630
631     buf[i] = '\0';
632     return string_make(buf);
633 }
634
635 /*!
636  * @brief Reconstruct preference line from entry and kill entry
637  */
638 concptr autopick_line_from_entry_kill(autopick_type *entry)
639 {
640     concptr ptr = autopick_line_from_entry(entry);
641     return ptr;
642 }
643
644 /*!
645  * @brief Choose an item and get auto-picker entry from it.
646  */
647 bool entry_from_choosed_object(PlayerType *player_ptr, autopick_type *entry)
648 {
649     concptr q = _("どのアイテムを登録しますか? ", "Enter which item? ");
650     concptr s = _("アイテムを持っていない。", "You have nothing to enter.");
651     ObjectType *o_ptr;
652     o_ptr = choose_object(player_ptr, nullptr, q, s, USE_INVEN | USE_FLOOR | USE_EQUIP);
653     if (!o_ptr)
654         return false;
655
656     autopick_entry_from_object(player_ptr, entry, o_ptr);
657     return true;
658 }