</ItemDefinitionGroup>\r
<ItemGroup>\r
<ClCompile Include="..\..\src\artifact.c" />\r
+ <ClCompile Include="..\..\src\autopick\autopick-entry.c" />\r
<ClCompile Include="..\..\src\autopick\autopick-menu-data-table.c" />\r
<ClCompile Include="..\..\src\autopick\autopick.c" />\r
<ClCompile Include="..\..\src\avatar.c" />\r
<ClInclude Include="..\..\src\autopick\autopick-commands-table.h" />\r
<ClInclude Include="..\..\src\autopick\autopick-dirty-flags.h" />\r
<ClInclude Include="..\..\src\autopick\autopick-editor-table.h" />\r
+ <ClInclude Include="..\..\src\autopick\autopick-entry.h" />\r
<ClInclude Include="..\..\src\autopick\autopick-flags-table.h" />\r
<ClInclude Include="..\..\src\autopick\autopick-key-flag-process.h" />\r
<ClInclude Include="..\..\src\autopick\autopick-keys-table.h" />\r
<ClCompile Include="..\..\src\autopick\autopick-menu-data-table.c">
<Filter>autopick</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\autopick\autopick-entry.c">
+ <Filter>autopick</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\gamevalue.h" />
<ClInclude Include="..\..\src\autopick\autopick-methods-table.h">
<Filter>autopick</Filter>
</ClInclude>
+ <ClInclude Include="..\..\src\autopick\autopick-entry.h">
+ <Filter>autopick</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\wall.bmp" />
autopick/autopick-key-flag-process.h autopick/autopick-key-table.h \
autopick/autopick-menu-data-table.c autopick/autopick-menu-data-table.h \
autopick/autopick-methods-table.h autopick/autopick-util.h \
+ autopick/autopick-entry.c autopick/autopick-entry.h \
\
avatar.h avatar.c birth.c birth.h \
\
--- /dev/null
+#include "angband.h"
+#include "autopick/autopick-util.h"
+#include "autopick/autopick-entry.h"
+#include "autopick/autopick-flags-table.h"
+#include "autopick/autopick-keys-table.h"
+#include "autopick/autopick-methods-table.h"
+#include "autopick/autopick-key-flag-process.h"
+#include "object-ego.h"
+#include "object/object-kind.h"
+#include "object-flavor.h"
+#include "object-hook.h"
+
+#ifdef JP
+static char kanji_colon[] = ":";
+#endif
+
+/*
+ * A function to create new entry
+ */
+bool autopick_new_entry(autopick_type *entry, concptr str, bool allow_default)
+{
+ if (str[0] && str[1] == ':') switch (str[0])
+ {
+ case '?': case '%':
+ case 'A': case 'P': case 'C':
+ return FALSE;
+ }
+
+ entry->flag[0] = entry->flag[1] = 0L;
+ entry->dice = 0;
+ entry->bonus = 0;
+
+ byte act = DO_AUTOPICK | DO_DISPLAY;
+ while (TRUE)
+ {
+ if ((act & DO_AUTOPICK) && *str == '!')
+ {
+ act &= ~DO_AUTOPICK;
+ act |= DO_AUTODESTROY;
+ str++;
+ continue;
+ }
+
+ if ((act & DO_AUTOPICK) && *str == '~')
+ {
+ act &= ~DO_AUTOPICK;
+ act |= DONT_AUTOPICK;
+ str++;
+ continue;
+ }
+
+ if ((act & DO_AUTOPICK) && *str == ';')
+ {
+ act &= ~DO_AUTOPICK;
+ act |= DO_QUERY_AUTOPICK;
+ str++;
+ continue;
+ }
+
+ if ((act & DO_DISPLAY) && *str == '(')
+ {
+ act &= ~DO_DISPLAY;
+ str++;
+ continue;
+ }
+
+ break;
+ }
+
+ concptr insc = NULL;
+ char buf[MAX_LINELEN];
+ int i;
+ for (i = 0; *str; i++)
+ {
+ char c = *str++;
+#ifdef JP
+ if (iskanji(c))
+ {
+ buf[i++] = c;
+ buf[i] = *str++;
+ continue;
+ }
+#endif
+ if (c == '#')
+ {
+ buf[i] = '\0';
+ insc = str;
+ break;
+ }
+
+ if (isupper(c)) c = (char)tolower(c);
+
+ buf[i] = c;
+ }
+
+ buf[i] = '\0';
+ if (!allow_default && *buf == 0) return FALSE;
+ if (*buf == 0 && insc) return FALSE;
+
+ concptr prev_ptr, ptr;
+ ptr = prev_ptr = buf;
+ concptr old_ptr = NULL;
+ while (old_ptr != ptr)
+ {
+ old_ptr = ptr;
+ if (MATCH_KEY(KEY_ALL)) ADD_FLG(FLG_ALL);
+ if (MATCH_KEY(KEY_COLLECTING)) ADD_FLG(FLG_COLLECTING);
+ if (MATCH_KEY(KEY_UNAWARE)) ADD_FLG(FLG_UNAWARE);
+ if (MATCH_KEY(KEY_UNIDENTIFIED)) ADD_FLG(FLG_UNIDENTIFIED);
+ if (MATCH_KEY(KEY_IDENTIFIED)) ADD_FLG(FLG_IDENTIFIED);
+ if (MATCH_KEY(KEY_STAR_IDENTIFIED)) ADD_FLG(FLG_STAR_IDENTIFIED);
+ if (MATCH_KEY(KEY_BOOSTED)) ADD_FLG(FLG_BOOSTED);
+
+ /*** Weapons whose dd*ds is more than nn ***/
+ if (MATCH_KEY2(KEY_MORE_THAN))
+ {
+ int k = 0;
+ entry->dice = 0;
+
+ while (' ' == *ptr) ptr++;
+
+ while ('0' <= *ptr && *ptr <= '9')
+ {
+ entry->dice = 10 * entry->dice + (*ptr - '0');
+ ptr++;
+ k++;
+ }
+
+ if (k > 0 && k <= 2)
+ {
+ (void)MATCH_KEY(KEY_DICE);
+ ADD_FLG(FLG_MORE_DICE);
+ }
+ else
+ ptr = prev_ptr;
+ }
+
+ /*** Items whose magical bonus is more than n ***/
+ if (MATCH_KEY2(KEY_MORE_BONUS))
+ {
+ int k = 0;
+ entry->bonus = 0;
+
+ while (' ' == *ptr) ptr++;
+
+ while ('0' <= *ptr && *ptr <= '9')
+ {
+ entry->bonus = 10 * entry->bonus + (*ptr - '0');
+ ptr++;
+ k++;
+ }
+
+ if (k > 0 && k <= 2)
+ {
+#ifdef JP
+ (void)MATCH_KEY(KEY_MORE_BONUS2);
+#else
+ if (' ' == *ptr) ptr++;
+#endif
+ ADD_FLG(FLG_MORE_BONUS);
+ }
+ else
+ ptr = prev_ptr;
+ }
+
+ if (MATCH_KEY(KEY_WORTHLESS)) ADD_FLG(FLG_WORTHLESS);
+ if (MATCH_KEY(KEY_EGO)) ADD_FLG(FLG_EGO);
+ if (MATCH_KEY(KEY_GOOD)) ADD_FLG(FLG_GOOD);
+ if (MATCH_KEY(KEY_NAMELESS)) ADD_FLG(FLG_NAMELESS);
+ if (MATCH_KEY(KEY_AVERAGE)) ADD_FLG(FLG_AVERAGE);
+ if (MATCH_KEY(KEY_RARE)) ADD_FLG(FLG_RARE);
+ if (MATCH_KEY(KEY_COMMON)) ADD_FLG(FLG_COMMON);
+ if (MATCH_KEY(KEY_WANTED)) ADD_FLG(FLG_WANTED);
+ if (MATCH_KEY(KEY_UNIQUE)) ADD_FLG(FLG_UNIQUE);
+ if (MATCH_KEY(KEY_HUMAN)) ADD_FLG(FLG_HUMAN);
+ if (MATCH_KEY(KEY_UNREADABLE)) ADD_FLG(FLG_UNREADABLE);
+ if (MATCH_KEY(KEY_REALM1)) ADD_FLG(FLG_REALM1);
+ if (MATCH_KEY(KEY_REALM2)) ADD_FLG(FLG_REALM2);
+ if (MATCH_KEY(KEY_FIRST)) ADD_FLG(FLG_FIRST);
+ if (MATCH_KEY(KEY_SECOND)) ADD_FLG(FLG_SECOND);
+ if (MATCH_KEY(KEY_THIRD)) ADD_FLG(FLG_THIRD);
+ if (MATCH_KEY(KEY_FOURTH)) ADD_FLG(FLG_FOURTH);
+ }
+
+ int prev_flg = -1;
+ if (MATCH_KEY2(KEY_ARTIFACT)) ADD_FLG_NOUN(FLG_ARTIFACT);
+
+ if (MATCH_KEY2(KEY_ITEMS)) ADD_FLG_NOUN(FLG_ITEMS);
+ else if (MATCH_KEY2(KEY_WEAPONS)) ADD_FLG_NOUN(FLG_WEAPONS);
+ else if (MATCH_KEY2(KEY_FAVORITE_WEAPONS)) ADD_FLG_NOUN(FLG_FAVORITE_WEAPONS);
+ else if (MATCH_KEY2(KEY_ARMORS)) ADD_FLG_NOUN(FLG_ARMORS);
+ else if (MATCH_KEY2(KEY_MISSILES)) ADD_FLG_NOUN(FLG_MISSILES);
+ else if (MATCH_KEY2(KEY_DEVICES)) ADD_FLG_NOUN(FLG_DEVICES);
+ else if (MATCH_KEY2(KEY_LIGHTS)) ADD_FLG_NOUN(FLG_LIGHTS);
+ else if (MATCH_KEY2(KEY_JUNKS)) ADD_FLG_NOUN(FLG_JUNKS);
+ else if (MATCH_KEY2(KEY_CORPSES)) ADD_FLG_NOUN(FLG_CORPSES);
+ else if (MATCH_KEY2(KEY_SPELLBOOKS)) ADD_FLG_NOUN(FLG_SPELLBOOKS);
+ else if (MATCH_KEY2(KEY_HAFTED)) ADD_FLG_NOUN(FLG_HAFTED);
+ else if (MATCH_KEY2(KEY_SHIELDS)) ADD_FLG_NOUN(FLG_SHIELDS);
+ else if (MATCH_KEY2(KEY_BOWS)) ADD_FLG_NOUN(FLG_BOWS);
+ else if (MATCH_KEY2(KEY_RINGS)) ADD_FLG_NOUN(FLG_RINGS);
+ else if (MATCH_KEY2(KEY_AMULETS)) ADD_FLG_NOUN(FLG_AMULETS);
+ else if (MATCH_KEY2(KEY_SUITS)) ADD_FLG_NOUN(FLG_SUITS);
+ else if (MATCH_KEY2(KEY_CLOAKS)) ADD_FLG_NOUN(FLG_CLOAKS);
+ else if (MATCH_KEY2(KEY_HELMS)) ADD_FLG_NOUN(FLG_HELMS);
+ else if (MATCH_KEY2(KEY_GLOVES)) ADD_FLG_NOUN(FLG_GLOVES);
+ else if (MATCH_KEY2(KEY_BOOTS)) ADD_FLG_NOUN(FLG_BOOTS);
+
+ if (*ptr == ':')
+ ptr++;
+#ifdef JP
+ else if (ptr[0] == kanji_colon[0] && ptr[1] == kanji_colon[1])
+ ptr += 2;
+#endif
+ else if (*ptr == '\0')
+ {
+ if (prev_flg == -1)
+ ADD_FLG_NOUN(FLG_ITEMS);
+ }
+ else
+ {
+ if (prev_flg != -1)
+ {
+ entry->flag[prev_flg / 32] &= ~(1L << (prev_flg % 32));
+ ptr = prev_ptr;
+ }
+ }
+
+ entry->name = string_make(ptr);
+ entry->action = act;
+ entry->insc = string_make(insc);
+
+ return TRUE;
+}
+
+
+/*
+ * Get auto-picker entry from o_ptr.
+ */
+void autopick_entry_from_object(player_type *player_ptr, autopick_type *entry, object_type *o_ptr)
+{
+ /* Assume that object name is to be added */
+ bool name = TRUE;
+
+#ifdef JP
+ /* エゴ銘が邪魔かもしれないので、デフォルトで「^」は付けない */
+ bool bol_mark = FALSE;
+#else
+ /* We can always use the ^ mark in English */
+ bool bol_mark = TRUE;
+#endif
+
+ GAME_TEXT name_str[MAX_NLEN];
+
+ name_str[0] = '\0';
+ entry->insc = string_make(quark_str(o_ptr->inscription));
+ entry->action = DO_AUTOPICK | DO_DISPLAY;
+ entry->flag[0] = entry->flag[1] = 0L;
+ entry->dice = 0;
+
+ if (!object_is_aware(o_ptr))
+ {
+ ADD_FLG(FLG_UNAWARE);
+ bol_mark = TRUE;
+ }
+ else if (!object_is_known(o_ptr))
+ {
+ if (!(o_ptr->ident & IDENT_SENSE))
+ {
+ ADD_FLG(FLG_UNIDENTIFIED);
+ bol_mark = TRUE;
+ }
+ else
+ {
+ switch (o_ptr->feeling)
+ {
+ case FEEL_AVERAGE:
+ case FEEL_GOOD:
+ ADD_FLG(FLG_NAMELESS);
+ bol_mark = TRUE;
+ break;
+
+ case FEEL_BROKEN:
+ case FEEL_CURSED:
+ ADD_FLG(FLG_NAMELESS);
+ ADD_FLG(FLG_WORTHLESS);
+ bol_mark = TRUE;
+ break;
+
+ case FEEL_TERRIBLE:
+ case FEEL_WORTHLESS:
+ ADD_FLG(FLG_WORTHLESS);
+ break;
+
+ case FEEL_EXCELLENT:
+ ADD_FLG(FLG_EGO);
+ break;
+
+ case FEEL_UNCURSED:
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (object_is_ego(o_ptr))
+ {
+ if (object_is_weapon_armour_ammo(o_ptr))
+ {
+ /*
+ * Base name of ego weapons and armors
+ * are almost meaningless.
+ * Register the ego type only.
+ */
+ ego_item_type *e_ptr = &e_info[o_ptr->name2];
+#ifdef JP
+ /* エゴ銘には「^」マークが使える */
+ sprintf(name_str, "^%s", e_name + e_ptr->name);
+#else
+ /* We ommit the basename and cannot use the ^ mark */
+ strcpy(name_str, e_name + e_ptr->name);
+#endif
+ name = FALSE;
+ if (!object_is_rare(o_ptr)) ADD_FLG(FLG_COMMON);
+ }
+
+ ADD_FLG(FLG_EGO);
+ }
+ else if (object_is_artifact(o_ptr))
+ ADD_FLG(FLG_ARTIFACT);
+ else
+ {
+ if (object_is_equipment(o_ptr))
+ ADD_FLG(FLG_NAMELESS);
+
+ bol_mark = TRUE;
+ }
+
+ }
+
+ if (object_is_melee_weapon(o_ptr))
+ {
+ object_kind *k_ptr = &k_info[o_ptr->k_idx];
+
+ if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds))
+ ADD_FLG(FLG_BOOSTED);
+ }
+
+ if (object_is_bounty(o_ptr))
+ {
+ REM_FLG(FLG_WORTHLESS);
+ ADD_FLG(FLG_WANTED);
+ }
+
+ if ((o_ptr->tval == TV_CORPSE || o_ptr->tval == TV_STATUE)
+ && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE))
+ {
+ ADD_FLG(FLG_UNIQUE);
+ }
+
+ if (o_ptr->tval == TV_CORPSE && my_strchr("pht", r_info[o_ptr->pval].d_char))
+ {
+ ADD_FLG(FLG_HUMAN);
+ }
+
+ if (o_ptr->tval >= TV_LIFE_BOOK &&
+ !check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval))
+ {
+ ADD_FLG(FLG_UNREADABLE);
+ if (o_ptr->tval != TV_ARCANE_BOOK) name = FALSE;
+ }
+
+ if (REALM1_BOOK == o_ptr->tval &&
+ player_ptr->pclass != CLASS_SORCERER &&
+ player_ptr->pclass != CLASS_RED_MAGE)
+ {
+ ADD_FLG(FLG_REALM1);
+ name = FALSE;
+ }
+
+ if (REALM2_BOOK == o_ptr->tval &&
+ player_ptr->pclass != CLASS_SORCERER &&
+ player_ptr->pclass != CLASS_RED_MAGE)
+ {
+ ADD_FLG(FLG_REALM2);
+ name = FALSE;
+ }
+
+ if (o_ptr->tval >= TV_LIFE_BOOK && 0 == o_ptr->sval)
+ ADD_FLG(FLG_FIRST);
+ if (o_ptr->tval >= TV_LIFE_BOOK && 1 == o_ptr->sval)
+ ADD_FLG(FLG_SECOND);
+ if (o_ptr->tval >= TV_LIFE_BOOK && 2 == o_ptr->sval)
+ ADD_FLG(FLG_THIRD);
+ if (o_ptr->tval >= TV_LIFE_BOOK && 3 == o_ptr->sval)
+ ADD_FLG(FLG_FOURTH);
+
+ if (object_is_ammo(o_ptr))
+ ADD_FLG(FLG_MISSILES);
+ else if (o_ptr->tval == TV_SCROLL || o_ptr->tval == TV_STAFF
+ || o_ptr->tval == TV_WAND || o_ptr->tval == TV_ROD)
+ ADD_FLG(FLG_DEVICES);
+ else if (o_ptr->tval == TV_LITE)
+ ADD_FLG(FLG_LIGHTS);
+ else if (o_ptr->tval == TV_SKELETON || o_ptr->tval == TV_BOTTLE
+ || o_ptr->tval == TV_JUNK || o_ptr->tval == TV_STATUE)
+ ADD_FLG(FLG_JUNKS);
+ else if (o_ptr->tval == TV_CORPSE)
+ ADD_FLG(FLG_CORPSES);
+ else if (o_ptr->tval >= TV_LIFE_BOOK)
+ ADD_FLG(FLG_SPELLBOOKS);
+ else if (o_ptr->tval == TV_POLEARM || o_ptr->tval == TV_SWORD
+ || o_ptr->tval == TV_DIGGING || o_ptr->tval == TV_HAFTED)
+ ADD_FLG(FLG_WEAPONS);
+ else if (o_ptr->tval == TV_SHIELD)
+ ADD_FLG(FLG_SHIELDS);
+ else if (o_ptr->tval == TV_BOW)
+ ADD_FLG(FLG_BOWS);
+ else if (o_ptr->tval == TV_RING)
+ ADD_FLG(FLG_RINGS);
+ else if (o_ptr->tval == TV_AMULET)
+ ADD_FLG(FLG_AMULETS);
+ else if (o_ptr->tval == TV_DRAG_ARMOR || o_ptr->tval == TV_HARD_ARMOR ||
+ o_ptr->tval == TV_SOFT_ARMOR)
+ ADD_FLG(FLG_SUITS);
+ else if (o_ptr->tval == TV_CLOAK)
+ ADD_FLG(FLG_CLOAKS);
+ else if (o_ptr->tval == TV_HELM)
+ ADD_FLG(FLG_HELMS);
+ else if (o_ptr->tval == TV_GLOVES)
+ ADD_FLG(FLG_GLOVES);
+ else if (o_ptr->tval == TV_BOOTS)
+ ADD_FLG(FLG_BOOTS);
+
+ if (!name)
+ {
+ str_tolower(name_str);
+ entry->name = string_make(name_str);
+ return;
+ }
+
+ GAME_TEXT o_name[MAX_NLEN];
+ object_desc(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL | OD_NAME_ONLY));
+
+ /*
+ * If necessary, add a '^' which indicates the
+ * beginning of line.
+ */
+ sprintf(name_str, "%s%s", bol_mark ? "^" : "", o_name);
+ str_tolower(name_str);
+ entry->name = string_make(name_str);
+}
--- /dev/null
+#pragma once
+
+bool autopick_new_entry(autopick_type *entry, concptr str, bool allow_default);
+void autopick_entry_from_object(player_type *player_ptr, autopick_type *entry, object_type *o_ptr);
#include "autopick/autopick-menu-data-table.h"
#include "autopick/autopick-methods-table.h"
#include "autopick/autopick-keys-table.h"
+#include "autopick/autopick-entry.h"
#include "gameterm.h"
#include "autopick/autopick.h"
#include "core.h"
#include "monsterrace.h"
#include "view-mainwindow.h" // 暫定。後で消す
-#ifdef JP
-static char kanji_colon[] = ":";
-#endif
-
/*
* 自動拾い/破壊設定のリストに関する変数 / List for auto-picker/destroyer entries
*/
static object_type autopick_last_destroyed_object;
/*
- * A function to create new entry
- */
-static bool autopick_new_entry(autopick_type *entry, concptr str, bool allow_default)
-{
- if (str[0] && str[1] == ':') switch (str[0])
- {
- case '?': case '%':
- case 'A': case 'P': case 'C':
- return FALSE;
- }
-
- entry->flag[0] = entry->flag[1] = 0L;
- entry->dice = 0;
- entry->bonus = 0;
-
- byte act = DO_AUTOPICK | DO_DISPLAY;
- while (TRUE)
- {
- if ((act & DO_AUTOPICK) && *str == '!')
- {
- act &= ~DO_AUTOPICK;
- act |= DO_AUTODESTROY;
- str++;
- continue;
- }
-
- if ((act & DO_AUTOPICK) && *str == '~')
- {
- act &= ~DO_AUTOPICK;
- act |= DONT_AUTOPICK;
- str++;
- continue;
- }
-
- if ((act & DO_AUTOPICK) && *str == ';')
- {
- act &= ~DO_AUTOPICK;
- act |= DO_QUERY_AUTOPICK;
- str++;
- continue;
- }
-
- if ((act & DO_DISPLAY) && *str == '(')
- {
- act &= ~DO_DISPLAY;
- str++;
- continue;
- }
-
- break;
- }
-
- concptr insc = NULL;
- char buf[MAX_LINELEN];
- int i;
- for (i = 0; *str; i++)
- {
- char c = *str++;
-#ifdef JP
- if (iskanji(c))
- {
- buf[i++] = c;
- buf[i] = *str++;
- continue;
- }
-#endif
- if (c == '#')
- {
- buf[i] = '\0';
- insc = str;
- break;
- }
-
- if (isupper(c)) c = (char)tolower(c);
-
- buf[i] = c;
- }
-
- buf[i] = '\0';
- if (!allow_default && *buf == 0) return FALSE;
- if (*buf == 0 && insc) return FALSE;
-
- concptr prev_ptr, ptr;
- ptr = prev_ptr = buf;
- concptr old_ptr = NULL;
- while (old_ptr != ptr)
- {
- old_ptr = ptr;
- if (MATCH_KEY(KEY_ALL)) ADD_FLG(FLG_ALL);
- if (MATCH_KEY(KEY_COLLECTING)) ADD_FLG(FLG_COLLECTING);
- if (MATCH_KEY(KEY_UNAWARE)) ADD_FLG(FLG_UNAWARE);
- if (MATCH_KEY(KEY_UNIDENTIFIED)) ADD_FLG(FLG_UNIDENTIFIED);
- if (MATCH_KEY(KEY_IDENTIFIED)) ADD_FLG(FLG_IDENTIFIED);
- if (MATCH_KEY(KEY_STAR_IDENTIFIED)) ADD_FLG(FLG_STAR_IDENTIFIED);
- if (MATCH_KEY(KEY_BOOSTED)) ADD_FLG(FLG_BOOSTED);
-
- /*** Weapons whose dd*ds is more than nn ***/
- if (MATCH_KEY2(KEY_MORE_THAN))
- {
- int k = 0;
- entry->dice = 0;
-
- while (' ' == *ptr) ptr++;
-
- while ('0' <= *ptr && *ptr <= '9')
- {
- entry->dice = 10 * entry->dice + (*ptr - '0');
- ptr++;
- k++;
- }
-
- if (k > 0 && k <= 2)
- {
- (void)MATCH_KEY(KEY_DICE);
- ADD_FLG(FLG_MORE_DICE);
- }
- else
- ptr = prev_ptr;
- }
-
- /*** Items whose magical bonus is more than n ***/
- if (MATCH_KEY2(KEY_MORE_BONUS))
- {
- int k = 0;
- entry->bonus = 0;
-
- while (' ' == *ptr) ptr++;
-
- while ('0' <= *ptr && *ptr <= '9')
- {
- entry->bonus = 10 * entry->bonus + (*ptr - '0');
- ptr++;
- k++;
- }
-
- if (k > 0 && k <= 2)
- {
-#ifdef JP
- (void)MATCH_KEY(KEY_MORE_BONUS2);
-#else
- if (' ' == *ptr) ptr++;
-#endif
- ADD_FLG(FLG_MORE_BONUS);
- }
- else
- ptr = prev_ptr;
- }
-
- if (MATCH_KEY(KEY_WORTHLESS)) ADD_FLG(FLG_WORTHLESS);
- if (MATCH_KEY(KEY_EGO)) ADD_FLG(FLG_EGO);
- if (MATCH_KEY(KEY_GOOD)) ADD_FLG(FLG_GOOD);
- if (MATCH_KEY(KEY_NAMELESS)) ADD_FLG(FLG_NAMELESS);
- if (MATCH_KEY(KEY_AVERAGE)) ADD_FLG(FLG_AVERAGE);
- if (MATCH_KEY(KEY_RARE)) ADD_FLG(FLG_RARE);
- if (MATCH_KEY(KEY_COMMON)) ADD_FLG(FLG_COMMON);
- if (MATCH_KEY(KEY_WANTED)) ADD_FLG(FLG_WANTED);
- if (MATCH_KEY(KEY_UNIQUE)) ADD_FLG(FLG_UNIQUE);
- if (MATCH_KEY(KEY_HUMAN)) ADD_FLG(FLG_HUMAN);
- if (MATCH_KEY(KEY_UNREADABLE)) ADD_FLG(FLG_UNREADABLE);
- if (MATCH_KEY(KEY_REALM1)) ADD_FLG(FLG_REALM1);
- if (MATCH_KEY(KEY_REALM2)) ADD_FLG(FLG_REALM2);
- if (MATCH_KEY(KEY_FIRST)) ADD_FLG(FLG_FIRST);
- if (MATCH_KEY(KEY_SECOND)) ADD_FLG(FLG_SECOND);
- if (MATCH_KEY(KEY_THIRD)) ADD_FLG(FLG_THIRD);
- if (MATCH_KEY(KEY_FOURTH)) ADD_FLG(FLG_FOURTH);
- }
-
- int prev_flg = -1;
- if (MATCH_KEY2(KEY_ARTIFACT)) ADD_FLG_NOUN(FLG_ARTIFACT);
-
- if (MATCH_KEY2(KEY_ITEMS)) ADD_FLG_NOUN(FLG_ITEMS);
- else if (MATCH_KEY2(KEY_WEAPONS)) ADD_FLG_NOUN(FLG_WEAPONS);
- else if (MATCH_KEY2(KEY_FAVORITE_WEAPONS)) ADD_FLG_NOUN(FLG_FAVORITE_WEAPONS);
- else if (MATCH_KEY2(KEY_ARMORS)) ADD_FLG_NOUN(FLG_ARMORS);
- else if (MATCH_KEY2(KEY_MISSILES)) ADD_FLG_NOUN(FLG_MISSILES);
- else if (MATCH_KEY2(KEY_DEVICES)) ADD_FLG_NOUN(FLG_DEVICES);
- else if (MATCH_KEY2(KEY_LIGHTS)) ADD_FLG_NOUN(FLG_LIGHTS);
- else if (MATCH_KEY2(KEY_JUNKS)) ADD_FLG_NOUN(FLG_JUNKS);
- else if (MATCH_KEY2(KEY_CORPSES)) ADD_FLG_NOUN(FLG_CORPSES);
- else if (MATCH_KEY2(KEY_SPELLBOOKS)) ADD_FLG_NOUN(FLG_SPELLBOOKS);
- else if (MATCH_KEY2(KEY_HAFTED)) ADD_FLG_NOUN(FLG_HAFTED);
- else if (MATCH_KEY2(KEY_SHIELDS)) ADD_FLG_NOUN(FLG_SHIELDS);
- else if (MATCH_KEY2(KEY_BOWS)) ADD_FLG_NOUN(FLG_BOWS);
- else if (MATCH_KEY2(KEY_RINGS)) ADD_FLG_NOUN(FLG_RINGS);
- else if (MATCH_KEY2(KEY_AMULETS)) ADD_FLG_NOUN(FLG_AMULETS);
- else if (MATCH_KEY2(KEY_SUITS)) ADD_FLG_NOUN(FLG_SUITS);
- else if (MATCH_KEY2(KEY_CLOAKS)) ADD_FLG_NOUN(FLG_CLOAKS);
- else if (MATCH_KEY2(KEY_HELMS)) ADD_FLG_NOUN(FLG_HELMS);
- else if (MATCH_KEY2(KEY_GLOVES)) ADD_FLG_NOUN(FLG_GLOVES);
- else if (MATCH_KEY2(KEY_BOOTS)) ADD_FLG_NOUN(FLG_BOOTS);
-
- if (*ptr == ':')
- ptr++;
-#ifdef JP
- else if (ptr[0] == kanji_colon[0] && ptr[1] == kanji_colon[1])
- ptr += 2;
-#endif
- else if (*ptr == '\0')
- {
- if (prev_flg == -1)
- ADD_FLG_NOUN(FLG_ITEMS);
- }
- else
- {
- if (prev_flg != -1)
- {
- entry->flag[prev_flg / 32] &= ~(1L << (prev_flg % 32));
- ptr = prev_ptr;
- }
- }
-
- entry->name = string_make(ptr);
- entry->action = act;
- entry->insc = string_make(insc);
-
- return TRUE;
-}
-
-
-/*
- * Get auto-picker entry from o_ptr.
- */
-static void autopick_entry_from_object(player_type *player_ptr, autopick_type *entry, object_type *o_ptr)
-{
- /* Assume that object name is to be added */
- bool name = TRUE;
-
-#ifdef JP
- /* エゴ銘が邪魔かもしれないので、デフォルトで「^」は付けない */
- bool bol_mark = FALSE;
-#else
- /* We can always use the ^ mark in English */
- bool bol_mark = TRUE;
-#endif
-
- GAME_TEXT name_str[MAX_NLEN];
-
- name_str[0] = '\0';
- entry->insc = string_make(quark_str(o_ptr->inscription));
- entry->action = DO_AUTOPICK | DO_DISPLAY;
- entry->flag[0] = entry->flag[1] = 0L;
- entry->dice = 0;
-
- if (!object_is_aware(o_ptr))
- {
- ADD_FLG(FLG_UNAWARE);
- bol_mark = TRUE;
- }
- else if (!object_is_known(o_ptr))
- {
- if (!(o_ptr->ident & IDENT_SENSE))
- {
- ADD_FLG(FLG_UNIDENTIFIED);
- bol_mark = TRUE;
- }
- else
- {
- switch (o_ptr->feeling)
- {
- case FEEL_AVERAGE:
- case FEEL_GOOD:
- ADD_FLG(FLG_NAMELESS);
- bol_mark = TRUE;
- break;
-
- case FEEL_BROKEN:
- case FEEL_CURSED:
- ADD_FLG(FLG_NAMELESS);
- ADD_FLG(FLG_WORTHLESS);
- bol_mark = TRUE;
- break;
-
- case FEEL_TERRIBLE:
- case FEEL_WORTHLESS:
- ADD_FLG(FLG_WORTHLESS);
- break;
-
- case FEEL_EXCELLENT:
- ADD_FLG(FLG_EGO);
- break;
-
- case FEEL_UNCURSED:
- break;
-
- default:
- break;
- }
- }
- }
- else
- {
- if (object_is_ego(o_ptr))
- {
- if (object_is_weapon_armour_ammo(o_ptr))
- {
- /*
- * Base name of ego weapons and armors
- * are almost meaningless.
- * Register the ego type only.
- */
- ego_item_type *e_ptr = &e_info[o_ptr->name2];
-#ifdef JP
- /* エゴ銘には「^」マークが使える */
- sprintf(name_str, "^%s", e_name + e_ptr->name);
-#else
- /* We ommit the basename and cannot use the ^ mark */
- strcpy(name_str, e_name + e_ptr->name);
-#endif
- name = FALSE;
- if (!object_is_rare(o_ptr)) ADD_FLG(FLG_COMMON);
- }
-
- ADD_FLG(FLG_EGO);
- }
- else if (object_is_artifact(o_ptr))
- ADD_FLG(FLG_ARTIFACT);
- else
- {
- if (object_is_equipment(o_ptr))
- ADD_FLG(FLG_NAMELESS);
-
- bol_mark = TRUE;
- }
-
- }
-
- if (object_is_melee_weapon(o_ptr))
- {
- object_kind *k_ptr = &k_info[o_ptr->k_idx];
-
- if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds))
- ADD_FLG(FLG_BOOSTED);
- }
-
- if (object_is_bounty(o_ptr))
- {
- REM_FLG(FLG_WORTHLESS);
- ADD_FLG(FLG_WANTED);
- }
-
- if ((o_ptr->tval == TV_CORPSE || o_ptr->tval == TV_STATUE)
- && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE))
- {
- ADD_FLG(FLG_UNIQUE);
- }
-
- if (o_ptr->tval == TV_CORPSE && my_strchr("pht", r_info[o_ptr->pval].d_char))
- {
- ADD_FLG(FLG_HUMAN);
- }
-
- if (o_ptr->tval >= TV_LIFE_BOOK &&
- !check_book_realm(player_ptr, o_ptr->tval, o_ptr->sval))
- {
- ADD_FLG(FLG_UNREADABLE);
- if (o_ptr->tval != TV_ARCANE_BOOK) name = FALSE;
- }
-
- if (REALM1_BOOK == o_ptr->tval &&
- player_ptr->pclass != CLASS_SORCERER &&
- player_ptr->pclass != CLASS_RED_MAGE)
- {
- ADD_FLG(FLG_REALM1);
- name = FALSE;
- }
-
- if (REALM2_BOOK == o_ptr->tval &&
- player_ptr->pclass != CLASS_SORCERER &&
- player_ptr->pclass != CLASS_RED_MAGE)
- {
- ADD_FLG(FLG_REALM2);
- name = FALSE;
- }
-
- if (o_ptr->tval >= TV_LIFE_BOOK && 0 == o_ptr->sval)
- ADD_FLG(FLG_FIRST);
- if (o_ptr->tval >= TV_LIFE_BOOK && 1 == o_ptr->sval)
- ADD_FLG(FLG_SECOND);
- if (o_ptr->tval >= TV_LIFE_BOOK && 2 == o_ptr->sval)
- ADD_FLG(FLG_THIRD);
- if (o_ptr->tval >= TV_LIFE_BOOK && 3 == o_ptr->sval)
- ADD_FLG(FLG_FOURTH);
-
- if (object_is_ammo(o_ptr))
- ADD_FLG(FLG_MISSILES);
- else if (o_ptr->tval == TV_SCROLL || o_ptr->tval == TV_STAFF
- || o_ptr->tval == TV_WAND || o_ptr->tval == TV_ROD)
- ADD_FLG(FLG_DEVICES);
- else if (o_ptr->tval == TV_LITE)
- ADD_FLG(FLG_LIGHTS);
- else if (o_ptr->tval == TV_SKELETON || o_ptr->tval == TV_BOTTLE
- || o_ptr->tval == TV_JUNK || o_ptr->tval == TV_STATUE)
- ADD_FLG(FLG_JUNKS);
- else if (o_ptr->tval == TV_CORPSE)
- ADD_FLG(FLG_CORPSES);
- else if (o_ptr->tval >= TV_LIFE_BOOK)
- ADD_FLG(FLG_SPELLBOOKS);
- else if (o_ptr->tval == TV_POLEARM || o_ptr->tval == TV_SWORD
- || o_ptr->tval == TV_DIGGING || o_ptr->tval == TV_HAFTED)
- ADD_FLG(FLG_WEAPONS);
- else if (o_ptr->tval == TV_SHIELD)
- ADD_FLG(FLG_SHIELDS);
- else if (o_ptr->tval == TV_BOW)
- ADD_FLG(FLG_BOWS);
- else if (o_ptr->tval == TV_RING)
- ADD_FLG(FLG_RINGS);
- else if (o_ptr->tval == TV_AMULET)
- ADD_FLG(FLG_AMULETS);
- else if (o_ptr->tval == TV_DRAG_ARMOR || o_ptr->tval == TV_HARD_ARMOR ||
- o_ptr->tval == TV_SOFT_ARMOR)
- ADD_FLG(FLG_SUITS);
- else if (o_ptr->tval == TV_CLOAK)
- ADD_FLG(FLG_CLOAKS);
- else if (o_ptr->tval == TV_HELM)
- ADD_FLG(FLG_HELMS);
- else if (o_ptr->tval == TV_GLOVES)
- ADD_FLG(FLG_GLOVES);
- else if (o_ptr->tval == TV_BOOTS)
- ADD_FLG(FLG_BOOTS);
-
- if (!name)
- {
- str_tolower(name_str);
- entry->name = string_make(name_str);
- return;
- }
-
- GAME_TEXT o_name[MAX_NLEN];
- object_desc(player_ptr, o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL | OD_NAME_ONLY));
-
- /*
- * If necessary, add a '^' which indicates the
- * beginning of line.
- */
- sprintf(name_str, "%s%s", bol_mark ? "^" : "", o_name);
- str_tolower(name_str);
- entry->name = string_make(name_str);
-}
-
-
-/*
* A function to delete entry
*/
static void autopick_free_entry(autopick_type *entry)