OSDN Git Service

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