X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fautopick.c;h=76df7267515eb3d65a99490adca88ff8eed62ed6;hb=214cab5f3f64a0501f4ec4d6fe6609729e0d5023;hp=36caa5f9ef4e7cc489780cbd46f46ccc9c681208;hpb=a8032cc1758264e9a59e4960e40b2e3b9fac07cb;p=hengband%2Fhengband.git diff --git a/src/autopick.c b/src/autopick.c index 36caa5f9e..76df72675 100644 --- a/src/autopick.c +++ b/src/autopick.c @@ -18,158 +18,161 @@ /* * Macros for Keywords */ -#define FLG_ALL 0 -#define FLG_COLLECTING 1 -#define FLG_UNAWARE 2 -#define FLG_UNIDENTIFIED 3 -#define FLG_IDENTIFIED 4 -#define FLG_STAR_IDENTIFIED 5 -#define FLG_BOOSTED 6 -#define FLG_MORE_THAN 7 -#define FLG_DICE 8 -#define FLG_MORE_BONUS 9 -#define FLG_MORE_BONUS2 10 -#define FLG_WORTHLESS 11 -#define FLG_ARTIFACT 12 -#define FLG_EGO 13 -#define FLG_NAMELESS 14 -#define FLG_WANTED 15 -#define FLG_UNIQUE 16 -#define FLG_HUMAN 17 -#define FLG_UNREADABLE 18 -#define FLG_REALM1 19 -#define FLG_REALM2 20 -#define FLG_FIRST 21 -#define FLG_SECOND 22 -#define FLG_THIRD 23 -#define FLG_FOURTH 24 - -#define FLG_ITEMS 30 -#define FLG_WEAPONS 31 -#define FLG_ARMORS 32 -#define FLG_MISSILES 33 -#define FLG_DEVICES 34 -#define FLG_LIGHTS 35 -#define FLG_JUNKS 36 -#define FLG_SPELLBOOKS 37 -#define FLG_HAFTED 38 -#define FLG_SHIELDS 39 -#define FLG_BOWS 40 -#define FLG_RINGS 41 -#define FLG_AMULETS 42 -#define FLG_SUITS 43 -#define FLG_CLOAKS 44 -#define FLG_HELMS 45 -#define FLG_GLOVES 46 -#define FLG_BOOTS 47 -#define FLG_FAVORITE 48 +#define FLG_ALL 0 +#define FLG_UNAWARE 1 +#define FLG_UNIDENTIFIED 2 +#define FLG_IDENTIFIED 3 +#define FLG_STAR_IDENTIFIED 4 +#define FLG_COLLECTING 5 +#define FLG_ARTIFACT 6 +#define FLG_EGO 7 +#define FLG_GOOD 10 +#define FLG_NAMELESS 11 +#define FLG_AVERAGE 12 +#define FLG_WORTHLESS 13 +#define FLG_RARE 14 +#define FLG_COMMON 15 +#define FLG_BOOSTED 16 +#define FLG_MORE_DICE 17 +#define FLG_MORE_BONUS 18 +#define FLG_WANTED 19 +#define FLG_UNIQUE 20 +#define FLG_HUMAN 21 +#define FLG_UNREADABLE 22 +#define FLG_REALM1 23 +#define FLG_REALM2 24 +#define FLG_FIRST 25 +#define FLG_SECOND 26 +#define FLG_THIRD 27 +#define FLG_FOURTH 28 + +#define FLG_ITEMS 30 +#define FLG_WEAPONS 31 +#define FLG_FAVORITE_WEAPONS 32 +#define FLG_ARMORS 33 +#define FLG_MISSILES 34 +#define FLG_DEVICES 35 +#define FLG_LIGHTS 36 +#define FLG_JUNKS 37 +#define FLG_CORPSES 38 +#define FLG_SPELLBOOKS 39 +#define FLG_HAFTED 40 +#define FLG_SHIELDS 41 +#define FLG_BOWS 42 +#define FLG_RINGS 43 +#define FLG_AMULETS 44 +#define FLG_SUITS 45 +#define FLG_CLOAKS 46 +#define FLG_HELMS 47 +#define FLG_GLOVES 48 +#define FLG_BOOTS 49 #define FLG_NOUN_BEGIN FLG_ITEMS -#define FLG_NOUN_END FLG_FAVORITE +#define FLG_NOUN_END FLG_BOOTS #ifdef JP -#define KEY_ALL "¤¹¤Ù¤Æ¤Î" - -#ifdef MAC_MPW -/* - * MEGA HACK -- MPW¤Î¥Ð¥°½ü¤±¡£ - * pre-processÃæ¤Ë¡Ö¼ý¡×¤Î»ú¤Î2¥Ð¥¤¥ÈÌܤ¬¾¡¼ê¤Ë¾Ã¤¨¤Æ¤·¤Þ¤¦¡£ - */ -#define KEY_COLLECTING "\x8e\xfb½¸Ãæ¤Î" -#else -#define KEY_COLLECTING "¼ý½¸Ãæ¤Î" -#endif - -#define KEY_UNIDENTIFIED "̤´ÕÄê¤Î" -#define KEY_IDENTIFIED "´ÕÄêºÑ¤ß¤Î" -#define KEY_STAR_IDENTIFIED "*´ÕÄê*ºÑ¤ß¤Î" -#define KEY_BOOSTED "¥À¥¤¥¹Ìܤΰ㤦" -#define KEY_MORE_THAN "¥À¥¤¥¹ÌÜ" -#define KEY_DICE "°Ê¾å¤Î" -#define KEY_MORE_BONUS "½¤ÀµÃÍ" -#define KEY_MORE_BONUS2 "°Ê¾å¤Î" -#define KEY_WORTHLESS "̵²ÁÃͤÎ" -#define KEY_ARTIFACT "¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È" -#define KEY_EGO "¥¨¥´" -#define KEY_NAMELESS "̵ÌäÎ" -#define KEY_UNAWARE "̤ȽÌÀ¤Î" -#define KEY_WANTED "¾Þ¶â¼ó¤Î" -#define KEY_UNIQUE "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î" -#define KEY_HUMAN "¿Í´Ö¤Î" -#define KEY_UNREADABLE "Æɤá¤Ê¤¤" -#define KEY_REALM1 "Âè°ìÎΰè¤Î" -#define KEY_REALM2 "ÂèÆóÎΰè¤Î" -#define KEY_FIRST "1ºýÌܤÎ" -#define KEY_SECOND "2ºýÌܤÎ" -#define KEY_THIRD "3ºýÌܤÎ" -#define KEY_FOURTH "4ºýÌܤÎ" -#define KEY_ITEMS "¥¢¥¤¥Æ¥à" -#define KEY_WEAPONS "Éð´ï" -#define KEY_ARMORS "Ëɶñ" -#define KEY_MISSILES "Ìð" -#define KEY_DEVICES "ËâË¡¥¢¥¤¥Æ¥à" -#define KEY_LIGHTS "¸÷¸»" -#define KEY_JUNKS "¤¬¤é¤¯¤¿" -#define KEY_SPELLBOOKS "ËâË¡½ñ" -#define KEY_HAFTED "Æß´ï" -#define KEY_SHIELDS "½â" -#define KEY_BOWS "µÝ" -#define KEY_RINGS "»ØÎØ" -#define KEY_AMULETS "¥¢¥ß¥å¥ì¥Ã¥È" -#define KEY_SUITS "³»" -#define KEY_CLOAKS "¥¯¥í¡¼¥¯" -#define KEY_HELMS "³õ" -#define KEY_GLOVES "äƼê" -#define KEY_BOOTS "·¤" -#define KEY_FAVORITE "ÆÀ°ÕÉð´ï" +static char KEY_ALL[] = "¤¹¤Ù¤Æ¤Î"; +static char KEY_UNAWARE[] = "̤ȽÌÀ¤Î"; +static char KEY_UNIDENTIFIED[] = "̤´ÕÄê¤Î"; +static char KEY_IDENTIFIED[] = "´ÕÄêºÑ¤ß¤Î"; +static char KEY_STAR_IDENTIFIED[] = "*´ÕÄê*ºÑ¤ß¤Î"; +static char KEY_COLLECTING[] = "¼ý½¸Ãæ¤Î"; +static char KEY_ARTIFACT[] = "¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È"; +static char KEY_EGO[] = "¥¨¥´"; +static char KEY_GOOD[] = "¾å¼Á¤Î"; +static char KEY_NAMELESS[] = "̵ÌäÎ"; +static char KEY_AVERAGE[] = "ʤÎ"; +static char KEY_WORTHLESS[] = "̵²ÁÃͤÎ"; +static char KEY_RARE[] = "¥ì¥¢¤Ê"; +static char KEY_COMMON[] = "¤¢¤ê¤Õ¤ì¤¿"; +static char KEY_BOOSTED[] = "¥À¥¤¥¹Ìܤΰ㤦"; +static char KEY_MORE_THAN[] = "¥À¥¤¥¹ÌÜ"; +static char KEY_DICE[] = "°Ê¾å¤Î"; +static char KEY_MORE_BONUS[] = "½¤ÀµÃÍ"; +static char KEY_MORE_BONUS2[] = "°Ê¾å¤Î"; +static char KEY_WANTED[] = "¾Þ¶â¼ó¤Î"; +static char KEY_UNIQUE[] = "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î"; +static char KEY_HUMAN[] = "¿Í´Ö¤Î"; +static char KEY_UNREADABLE[] = "Æɤá¤Ê¤¤"; +static char KEY_REALM1[] = "Âè°ìÎΰè¤Î"; +static char KEY_REALM2[] = "ÂèÆóÎΰè¤Î"; +static char KEY_FIRST[] = "1ºýÌܤÎ"; +static char KEY_SECOND[] = "2ºýÌܤÎ"; +static char KEY_THIRD[] = "3ºýÌܤÎ"; +static char KEY_FOURTH[] = "4ºýÌܤÎ"; +static char KEY_ITEMS[] = "¥¢¥¤¥Æ¥à"; +static char KEY_WEAPONS[] = "Éð´ï"; +static char KEY_FAVORITE_WEAPONS[] = "ÆÀ°ÕÉð´ï"; +static char KEY_ARMORS[] = "Ëɶñ"; +static char KEY_MISSILES[] = "Ìð"; +static char KEY_DEVICES[] = "ËâË¡¥¢¥¤¥Æ¥à"; +static char KEY_LIGHTS[] = "¸÷¸»"; +static char KEY_JUNKS[] = "¤¬¤é¤¯¤¿"; +static char KEY_CORPSES[] = "»àÂΤä¹ü"; +static char KEY_SPELLBOOKS[] = "ËâË¡½ñ"; +static char KEY_HAFTED[] = "Æß´ï"; +static char KEY_SHIELDS[] = "½â"; +static char KEY_BOWS[] = "µÝ"; +static char KEY_RINGS[] = "»ØÎØ"; +static char KEY_AMULETS[] = "¥¢¥ß¥å¥ì¥Ã¥È"; +static char KEY_SUITS[] = "³»"; +static char KEY_CLOAKS[] = "¥¯¥í¡¼¥¯"; +static char KEY_HELMS[] = "³õ"; +static char KEY_GLOVES[] = "äƼê"; +static char KEY_BOOTS[] = "·¤"; #else -#define KEY_ALL "all" -#define KEY_COLLECTING "collecting" -#define KEY_UNIDENTIFIED "unidentified" -#define KEY_IDENTIFIED "identified" -#define KEY_STAR_IDENTIFIED "*identified*" -#define KEY_BOOSTED "dice boosted" -#define KEY_MORE_THAN "more than" -#define KEY_DICE " dice" -#define KEY_MORE_BONUS "more bonus than" -#define KEY_MORE_BONUS2 "" -#define KEY_WORTHLESS "worthless" -#define KEY_ARTIFACT "artifact" -#define KEY_EGO "ego" -#define KEY_NAMELESS "nameless" -#define KEY_UNAWARE "unaware" -#define KEY_WANTED "wanted" -#define KEY_UNIQUE "unique monster's" -#define KEY_HUMAN "human" -#define KEY_UNREADABLE "unreadable" -#define KEY_REALM1 "first realm's" -#define KEY_REALM2 "second realm's" -#define KEY_FIRST "first" -#define KEY_SECOND "second" -#define KEY_THIRD "third" -#define KEY_FOURTH "fourth" -#define KEY_ITEMS "items" -#define KEY_WEAPONS "weapons" -#define KEY_ARMORS "armors" -#define KEY_MISSILES "missiles" -#define KEY_DEVICES "magical devices" -#define KEY_LIGHTS "lights" -#define KEY_JUNKS "junks" -#define KEY_SPELLBOOKS "spellbooks" -#define KEY_HAFTED "hafted weapons" -#define KEY_SHIELDS "shields" -#define KEY_BOWS "bows" -#define KEY_RINGS "rings" -#define KEY_AMULETS "amulets" -#define KEY_SUITS "suits" -#define KEY_CLOAKS "cloaks" -#define KEY_HELMS "helms" -#define KEY_GLOVES "gloves" -#define KEY_BOOTS "boots" -#define KEY_FAVORITE "favorite weapons" +static char KEY_ALL[] = "all"; +static char KEY_UNAWARE[] = "unaware"; +static char KEY_UNIDENTIFIED[] = "unidentified"; +static char KEY_IDENTIFIED[] = "identified"; +static char KEY_STAR_IDENTIFIED[] = "*identified*"; +static char KEY_COLLECTING[] = "collecting"; +static char KEY_ARTIFACT[] = "artifact"; +static char KEY_EGO[] = "ego"; +static char KEY_GOOD[] = "good"; +static char KEY_NAMELESS[] = "nameless"; +static char KEY_AVERAGE[] = "average"; +static char KEY_WORTHLESS[] = "worthless"; +static char KEY_RARE[] = "rare"; +static char KEY_COMMON[] = "common"; +static char KEY_BOOSTED[] = "dice boosted"; +static char KEY_MORE_THAN[] = "more than"; +static char KEY_DICE[] = " dice"; +static char KEY_MORE_BONUS[] = "more bonus than"; +static char KEY_MORE_BONUS2[] = ""; +static char KEY_WANTED[] = "wanted"; +static char KEY_UNIQUE[] = "unique monster's"; +static char KEY_HUMAN[] = "human"; +static char KEY_UNREADABLE[] = "unreadable"; +static char KEY_REALM1[] = "first realm's"; +static char KEY_REALM2[] = "second realm's"; +static char KEY_FIRST[] = "first"; +static char KEY_SECOND[] = "second"; +static char KEY_THIRD[] = "third"; +static char KEY_FOURTH[] = "fourth"; +static char KEY_ITEMS[] = "items"; +static char KEY_WEAPONS[] = "weapons"; +static char KEY_FAVORITE_WEAPONS[] = "favorite weapons"; +static char KEY_ARMORS[] = "armors"; +static char KEY_MISSILES[] = "missiles"; +static char KEY_DEVICES[] = "magical devices"; +static char KEY_LIGHTS[] = "lights"; +static char KEY_JUNKS[] = "junks"; +static char KEY_CORPSES[] = "corpses or skeletons"; +static char KEY_SPELLBOOKS[] = "spellbooks"; +static char KEY_HAFTED[] = "hafted weapons"; +static char KEY_SHIELDS[] = "shields"; +static char KEY_BOWS[] = "bows"; +static char KEY_RINGS[] = "rings"; +static char KEY_AMULETS[] = "amulets"; +static char KEY_SUITS[] = "suits"; +static char KEY_CLOAKS[] = "cloaks"; +static char KEY_HELMS[] = "helms"; +static char KEY_GLOVES[] = "gloves"; +static char KEY_BOOTS[] = "boots"; #endif /* JP */ @@ -198,7 +201,7 @@ /* * A function to create new entry */ -bool autopick_new_entry(autopick_type *entry, cptr str) +static bool autopick_new_entry(autopick_type *entry, cptr str, bool allow_default) { cptr insc; int i; @@ -207,7 +210,7 @@ bool autopick_new_entry(autopick_type *entry, cptr str) cptr prev_ptr, ptr, old_ptr; int prev_flg; - if (str[1] == ':') switch (str[0]) + if (str[0] && str[1] == ':') switch (str[0]) { case '?': case '%': case 'A': case 'P': case 'C': @@ -216,9 +219,10 @@ bool autopick_new_entry(autopick_type *entry, cptr str) entry->flag[0] = entry->flag[1] = 0L; entry->dice = 0; + entry->bonus = 0; act = DO_AUTOPICK | DO_DISPLAY; - while (1) + while (TRUE) { if ((act & DO_AUTOPICK) && *str == '!') { @@ -274,6 +278,9 @@ bool autopick_new_entry(autopick_type *entry, cptr str) } buf[i] = '\0'; + /* Skip empty line unless allow_default */ + if (!allow_default && *buf == 0) return FALSE; + /* Skip comment line */ if (*buf == 0 && insc) return FALSE; @@ -287,6 +294,7 @@ bool autopick_new_entry(autopick_type *entry, cptr str) 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); @@ -312,7 +320,7 @@ bool autopick_new_entry(autopick_type *entry, cptr str) if (k > 0 && k <= 2) { (void)MATCH_KEY(KEY_DICE); - ADD_FLG(FLG_MORE_THAN); + ADD_FLG(FLG_MORE_DICE); } else ptr = prev_ptr; @@ -337,7 +345,11 @@ bool autopick_new_entry(autopick_type *entry, cptr str) if (k > 0 && k <= 2) { +#ifdef JP (void)MATCH_KEY(KEY_MORE_BONUS2); +#else + if (' ' == *ptr) ptr++; +#endif ADD_FLG(FLG_MORE_BONUS); } else @@ -346,8 +358,11 @@ bool autopick_new_entry(autopick_type *entry, cptr str) 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_UNAWARE)) ADD_FLG(FLG_UNAWARE); + 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); @@ -367,11 +382,13 @@ bool autopick_new_entry(autopick_type *entry, cptr str) 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); @@ -383,7 +400,6 @@ bool autopick_new_entry(autopick_type *entry, cptr str) 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); - else if (MATCH_KEY2(KEY_FAVORITE)) ADD_FLG_NOUN(FLG_FAVORITE); /* Last 'keyword' must be at the correct location */ if (*ptr == ':') @@ -421,24 +437,281 @@ bool autopick_new_entry(autopick_type *entry, cptr str) /* + * Get auto-picker entry from o_ptr. + */ +static void autopick_entry_from_object(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 + + char name_str[MAX_NLEN]; + + /* Initialize name string */ + 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; + + /* Unaware */ + if (!object_is_aware(o_ptr)) + { + ADD_FLG(FLG_UNAWARE); + bol_mark = TRUE; + } + + /* Not really identified */ + else if (!object_is_known(o_ptr)) + { + if (!(o_ptr->ident & IDENT_SENSE)) + { + ADD_FLG(FLG_UNIDENTIFIED); + bol_mark = TRUE; + } + else + { + /* Pseudo-identified */ + 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: + /* XXX No appropriate flag */ + /* ADD_FLG(); */ + break; + + default: + /* Never reach here */ + break; + } + } + } + + /* Identified */ + else + { + /* Ego objects */ + 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 + + /* Don't use the object description */ + name = FALSE; + + /* Restrict to 'common' equipments */ + if (!object_is_rare(o_ptr)) ADD_FLG(FLG_COMMON); + } + + ADD_FLG(FLG_EGO); + } + + /* Artifact */ + else if (object_is_artifact(o_ptr)) + ADD_FLG(FLG_ARTIFACT); + + /* Non-ego, non-artifact */ + else + { + /* Wearable nameless object */ + if (object_is_equipment(o_ptr)) + ADD_FLG(FLG_NAMELESS); + + bol_mark = TRUE; + } + + } + + /* Melee weapon with boosted dice */ + 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); + } + + /* Wanted monster's corpse */ + if (object_is_shoukinkubi(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(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 && + p_ptr->pclass != CLASS_SORCERER && + p_ptr->pclass != CLASS_RED_MAGE) + { + ADD_FLG(FLG_REALM1); + name = FALSE; + } + + if (REALM2_BOOK == o_ptr->tval && + p_ptr->pclass != CLASS_SORCERER && + p_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); + + /* Prepare the object description */ + if (name) + { + char o_name[MAX_NLEN]; + + object_desc(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); + } + + /* Register the name in lowercase */ + str_tolower(name_str); + entry->name = string_make(name_str); + + return; +} + + +/* * A function to delete entry */ -void autopick_free_entry(autopick_type *entry) +static void autopick_free_entry(autopick_type *entry) { string_free(entry->name); string_free(entry->insc); + entry->name = NULL; + entry->insc = NULL; } +#define MAX_AUTOPICK_DEFAULT 200 + /* - * Initialize auto-picker preference + * Initialize the autopick */ -void init_autopicker(void) +static void init_autopick(void) { static const char easy_autopick_inscription[] = "(:=g"; autopick_type entry; int i; + if (!autopick_list) + { + max_max_autopick = MAX_AUTOPICK_DEFAULT; + C_MAKE(autopick_list, max_max_autopick, autopick_type); + max_autopick = 0; + } + /* Clear old entries */ for( i = 0; i < max_autopick; i++) autopick_free_entry(&autopick_list[i]); @@ -446,23 +719,137 @@ void init_autopicker(void) max_autopick = 0; /* There is always one entry "=g" */ - autopick_new_entry(&entry, easy_autopick_inscription); + autopick_new_entry(&entry, easy_autopick_inscription, TRUE); autopick_list[max_autopick++] = entry; } +#define PT_DEFAULT 0 +#define PT_WITH_PNAME 1 + +/* + * Get file name for autopick preference + */ +static cptr pickpref_filename(int filename_mode) +{ +#ifdef JP + static const char namebase[] = "picktype"; +#else + static const char namebase[] = "pickpref"; +#endif + + switch (filename_mode) + { + case PT_DEFAULT: + return format("%s.prf", namebase); + + case PT_WITH_PNAME: + return format("%s-%s.prf", namebase, player_base); + + default: + return NULL; + } +} + + +/* + * Load an autopick preference file + */ +void autopick_load_pref(bool disp_mes) +{ + char buf[80]; + errr err; + + /* Free old entries */ + init_autopick(); + + /* Try a filename with player name */ + my_strcpy(buf, pickpref_filename(PT_WITH_PNAME), sizeof(buf)); + + /* Load the file */ + err = process_autopick_file(buf); + + if (err == 0 && disp_mes) + { + /* Success */ +#ifdef JP + msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf); +#else + msg_format("Loaded '%s'.", buf); +#endif + } + + /* No file found */ + if (0 > err) + { + /* Use default name */ + my_strcpy(buf, pickpref_filename(PT_DEFAULT), sizeof(buf)); + + /* Load the file */ + err = process_autopick_file(buf); + + if (err == 0 && disp_mes) + { + /* Success */ +#ifdef JP + msg_format("%s¤òÆɤ߹þ¤ß¤Þ¤·¤¿¡£", buf); +#else + msg_format("Loaded '%s'.", buf); +#endif + } + } + + if (err && disp_mes) + { + /* Failed */ +#ifdef JP + msg_print("¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£"); +#else + msg_print("Failed to reload autopick preference."); +#endif + } +} + + +/* + * Add one line to autopick_list[] + */ +static void add_autopick_list(autopick_type *entry) +{ + /* There is no enough space to add one line */ + if (max_autopick >= max_max_autopick) + { + int old_max_max_autopick = max_max_autopick; + autopick_type *old_autopick_list = autopick_list; + + /* Increase size of list */ + max_max_autopick += MAX_AUTOPICK_DEFAULT; + + /* Allocate */ + C_MAKE(autopick_list, max_max_autopick, autopick_type); + + /* Copy from old list to new list */ + (void)C_COPY(autopick_list, old_autopick_list, old_max_max_autopick, autopick_type); + + /* Kill old list */ + C_KILL(old_autopick_list, old_max_max_autopick, autopick_type); + } + + /* Add one line */ + autopick_list[max_autopick] = *entry; + + max_autopick++; +} + /* * Process line for auto picker/destroyer. */ -errr process_pickpref_file_line(char *buf) +errr process_autopick_file_command(char *buf) { - autopick_type entry; + autopick_type an_entry, *entry = &an_entry; int i; - if (max_autopick == MAX_AUTOPICK) - return 1; - /* Nuke illegal char */ for(i = 0; buf[i]; i++) { @@ -478,17 +865,21 @@ errr process_pickpref_file_line(char *buf) } buf[i] = 0; - if (!autopick_new_entry(&entry, buf)) return 0; + if (!autopick_new_entry(entry, buf, FALSE)) return 0; /* Already has the same entry? */ for(i = 0; i < max_autopick; i++) - if(!strcmp(entry.name, autopick_list[i].name) - && entry.flag[0] == autopick_list[i].flag[0] - && entry.flag[1] == autopick_list[i].flag[1] - && entry.dice == autopick_list[i].dice - && entry.bonus == autopick_list[i].bonus) return 0; + if(!strcmp(entry->name, autopick_list[i].name) + && entry->flag[0] == autopick_list[i].flag[0] + && entry->flag[1] == autopick_list[i].flag[1] + && entry->dice == autopick_list[i].dice + && entry->bonus == autopick_list[i].bonus) + { + autopick_free_entry(entry); + return 0; + } - autopick_list[max_autopick++] = entry; + add_autopick_list(entry); return 0; } @@ -512,13 +903,13 @@ cptr autopick_line_from_entry(autopick_type *entry) if (IS_FLG(FLG_ALL)) ADD_KEY(KEY_ALL); if (IS_FLG(FLG_COLLECTING)) ADD_KEY(KEY_COLLECTING); + if (IS_FLG(FLG_UNAWARE)) ADD_KEY(KEY_UNAWARE); if (IS_FLG(FLG_UNIDENTIFIED)) ADD_KEY(KEY_UNIDENTIFIED); if (IS_FLG(FLG_IDENTIFIED)) ADD_KEY(KEY_IDENTIFIED); if (IS_FLG(FLG_STAR_IDENTIFIED)) ADD_KEY(KEY_STAR_IDENTIFIED); - if (IS_FLG(FLG_UNAWARE)) ADD_KEY(KEY_UNAWARE); if (IS_FLG(FLG_BOOSTED)) ADD_KEY(KEY_BOOSTED); - if (IS_FLG(FLG_MORE_THAN)) + if (IS_FLG(FLG_MORE_DICE)) { ADD_KEY(KEY_MORE_THAN); strcat(ptr, format("%d", entry->dice)); @@ -543,18 +934,24 @@ cptr autopick_line_from_entry(autopick_type *entry) if (IS_FLG(FLG_UNIQUE)) ADD_KEY(KEY_UNIQUE); if (IS_FLG(FLG_HUMAN)) ADD_KEY(KEY_HUMAN); if (IS_FLG(FLG_WORTHLESS)) ADD_KEY(KEY_WORTHLESS); + if (IS_FLG(FLG_GOOD)) ADD_KEY(KEY_GOOD); if (IS_FLG(FLG_NAMELESS)) ADD_KEY(KEY_NAMELESS); + if (IS_FLG(FLG_AVERAGE)) ADD_KEY(KEY_AVERAGE); + if (IS_FLG(FLG_RARE)) ADD_KEY(KEY_RARE); + if (IS_FLG(FLG_COMMON)) ADD_KEY(KEY_COMMON); if (IS_FLG(FLG_EGO)) ADD_KEY(KEY_EGO); if (IS_FLG(FLG_ARTIFACT)) ADD_KEY(KEY_ARTIFACT); if (IS_FLG(FLG_ITEMS)) ADD_KEY2(KEY_ITEMS); else if (IS_FLG(FLG_WEAPONS)) ADD_KEY2(KEY_WEAPONS); + else if (IS_FLG(FLG_FAVORITE_WEAPONS)) ADD_KEY2(KEY_FAVORITE_WEAPONS); else if (IS_FLG(FLG_ARMORS)) ADD_KEY2(KEY_ARMORS); else if (IS_FLG(FLG_MISSILES)) ADD_KEY2(KEY_MISSILES); else if (IS_FLG(FLG_DEVICES)) ADD_KEY2(KEY_DEVICES); else if (IS_FLG(FLG_LIGHTS)) ADD_KEY2(KEY_LIGHTS); else if (IS_FLG(FLG_JUNKS)) ADD_KEY2(KEY_JUNKS); + else if (IS_FLG(FLG_CORPSES)) ADD_KEY2(KEY_CORPSES); else if (IS_FLG(FLG_SPELLBOOKS)) ADD_KEY2(KEY_SPELLBOOKS); else if (IS_FLG(FLG_HAFTED)) ADD_KEY2(KEY_HAFTED); else if (IS_FLG(FLG_SHIELDS)) ADD_KEY2(KEY_SHIELDS); @@ -566,7 +963,6 @@ cptr autopick_line_from_entry(autopick_type *entry) else if (IS_FLG(FLG_HELMS)) ADD_KEY2(KEY_HELMS); else if (IS_FLG(FLG_GLOVES)) ADD_KEY2(KEY_GLOVES); else if (IS_FLG(FLG_BOOTS)) ADD_KEY2(KEY_BOOTS); - else if (IS_FLG(FLG_FAVORITE)) ADD_KEY2(KEY_FAVORITE); /* You don't need sepalator after adjective */ /* 'artifact' is not true adjective */ @@ -627,69 +1023,6 @@ static cptr autopick_line_from_entry_kill(autopick_type *entry) /* - * Favorite weapons - */ -static bool is_favorite(object_type *o_ptr, bool others_ok) -{ - /* Only weapons match */ - switch(o_ptr->tval) - { - case TV_BOW: case TV_HAFTED: case TV_POLEARM: - case TV_SWORD: case TV_DIGGING: - break; - default: return FALSE; - } - - /* Favorite weapons are varied depend on the class */ - switch (p_ptr->pclass) - { - case CLASS_PRIEST: - { - u32b flgs[TR_FLAG_SIZE]; - object_flags_known(o_ptr, flgs); - - if (!have_flag(flgs, TR_BLESSED) && - !(o_ptr->tval == TV_HAFTED)) - return FALSE; - break; - } - - case CLASS_MONK: - case CLASS_FORCETRAINER: - /* Icky to wield? */ - if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_BOW][o_ptr->sval])) - return FALSE; - break; - - case CLASS_BEASTMASTER: - case CLASS_CAVALRY: - { - u32b flgs[TR_FLAG_SIZE]; - object_flags_known(o_ptr, flgs); - - /* Is it known to be suitable to using while riding? */ - if (!(have_flag(flgs, TR_RIDING))) - return FALSE; - - break; - } - - case CLASS_NINJA: - /* Icky to wield? */ - if (s_info[p_ptr->pclass].w_max[o_ptr->tval-TV_BOW][o_ptr->sval] <= WEAPON_EXP_BEGINNER) - return FALSE; - break; - - default: - /* Non-special class */ - if (others_ok) return TRUE; - else return FALSE; - } - - return TRUE; -} - -/* * A function for Auto-picker/destroyer * Examine whether the object matches to the entry */ @@ -698,42 +1031,46 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam int j; cptr ptr = entry->name; + /*** Unaware items ***/ + if (IS_FLG(FLG_UNAWARE) && object_is_aware(o_ptr)) + return FALSE; + /*** Unidentified ***/ if (IS_FLG(FLG_UNIDENTIFIED) - && (object_known_p(o_ptr) || (o_ptr->ident & IDENT_SENSE))) + && (object_is_known(o_ptr) || (o_ptr->ident & IDENT_SENSE))) return FALSE; /*** Identified ***/ - if (IS_FLG(FLG_IDENTIFIED) && !object_known_p(o_ptr)) + if (IS_FLG(FLG_IDENTIFIED) && !object_is_known(o_ptr)) return FALSE; /*** *Identified* ***/ if (IS_FLG(FLG_STAR_IDENTIFIED) && - (!object_known_p(o_ptr) || !(o_ptr->ident & IDENT_MENTAL))) + (!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL))) return FALSE; /*** Dice boosted (weapon of slaying) ***/ if (IS_FLG(FLG_BOOSTED)) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; - - switch( o_ptr->tval ) + + /* Require melee weapon */ + if (!object_is_melee_weapon(o_ptr)) + return FALSE; + + /* Require boosted dice */ + if ((o_ptr->dd == k_ptr->dd) && (o_ptr->ds == k_ptr->ds)) + return FALSE; + + /* In Vault Quest, Dice must be hide.*/ + if(!object_is_known(o_ptr) && object_is_quest_target(o_ptr)) { - case TV_HAFTED: - case TV_POLEARM: - case TV_SWORD: - case TV_DIGGING: - if ((o_ptr->dd != k_ptr->dd) || (o_ptr->ds != k_ptr->ds)) - break; - else - return FALSE; - default: return FALSE; } } /*** Weapons which dd*ds is more than nn ***/ - if (IS_FLG(FLG_MORE_THAN)) + if (IS_FLG(FLG_MORE_DICE)) { if (o_ptr->dd * o_ptr->ds < entry->dice) return FALSE; @@ -742,7 +1079,7 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam /*** Weapons whic dd*ds is more than nn ***/ if (IS_FLG(FLG_MORE_BONUS)) { - if (!object_known_p(o_ptr)) return FALSE; + if (!object_is_known(o_ptr)) return FALSE; if (o_ptr->pval) { @@ -765,46 +1102,155 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam /*** Artifact object ***/ if (IS_FLG(FLG_ARTIFACT)) { - if (!object_known_p(o_ptr) || (!o_ptr->name1 && !o_ptr->art_name)) + if (!object_is_known(o_ptr) || !object_is_artifact(o_ptr)) return FALSE; } /*** Ego object ***/ if (IS_FLG(FLG_EGO)) { - if (!object_known_p(o_ptr) || !o_ptr->name2) + /* Need to be an ego item */ + if (!object_is_ego(o_ptr)) return FALSE; + + /* Need to be known to be an ego */ + if (!object_is_known(o_ptr) && + !((o_ptr->ident & IDENT_SENSE) && o_ptr->feeling == FEEL_EXCELLENT)) + return FALSE; + } + + /*** Good ***/ + if (IS_FLG(FLG_GOOD)) + { + if (!object_is_equipment(o_ptr)) return FALSE; + + /* Identified */ + if (object_is_known(o_ptr)) + { + /* Artifacts and Ego objects are not okay */ + if (!object_is_nameless(o_ptr)) + return FALSE; + + /* Average are not okay */ + if (o_ptr->to_a <= 0 && (o_ptr->to_h + o_ptr->to_d) <= 0) + return FALSE; + } + + /* Pseudo-identified */ + else if (o_ptr->ident & IDENT_SENSE) + { + switch (o_ptr->feeling) + { + case FEEL_GOOD: + /* It's good */ + break; + + default: + /* It's not good */ + return FALSE; + } + } + + /* Unidentified */ + else + { + /* Not known to be good */ return FALSE; + } } /*** Nameless ***/ if (IS_FLG(FLG_NAMELESS)) { - switch (o_ptr->tval) - { - case TV_WHISTLE: - case TV_SHOT: case TV_ARROW: case TV_BOLT: case TV_BOW: - case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD: - case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: - case TV_SHIELD: case TV_CLOAK: - case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: - case TV_LITE: case TV_AMULET: case TV_RING: case TV_CARD: - if ((!object_known_p(o_ptr) || o_ptr->inscription - || o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) + if (!object_is_equipment(o_ptr)) return FALSE; + + /* Identified */ + if (object_is_known(o_ptr)) + { + /* Artifacts and Ego objects are not okay */ + if (!object_is_nameless(o_ptr)) return FALSE; - break; - default: - /* don't match */ + } + + /* Pseudo-identified */ + else if (o_ptr->ident & IDENT_SENSE) + { + switch (o_ptr->feeling) + { + case FEEL_AVERAGE: + case FEEL_GOOD: + case FEEL_BROKEN: + case FEEL_CURSED: + /* It's nameless */ + break; + + default: + /* It's not nameless */ + return FALSE; + } + } + + /* Unidentified */ + else + { + /* Not known to be nameless */ return FALSE; } } - /*** Unaware items ***/ - if (IS_FLG(FLG_UNAWARE) && object_aware_p(o_ptr)) + /*** Average ***/ + if (IS_FLG(FLG_AVERAGE)) + { + if (!object_is_equipment(o_ptr)) return FALSE; + + /* Identified */ + if (object_is_known(o_ptr)) + { + /* Artifacts and Ego objects are not okay */ + if (!object_is_nameless(o_ptr)) + return FALSE; + + /* Cursed or broken objects are not okay */ + if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) + return FALSE; + + /* Good are not okay */ + if (o_ptr->to_a > 0 || (o_ptr->to_h + o_ptr->to_d) > 0) + return FALSE; + } + + /* Pseudo-identified */ + else if (o_ptr->ident & IDENT_SENSE) + { + switch (o_ptr->feeling) + { + case FEEL_AVERAGE: + /* It's average */ + break; + + default: + /* It's not average */ + return FALSE; + } + } + + /* Unidentified */ + else + { + /* Not known to be average */ + return FALSE; + } + } + + /*** Rere equipments ***/ + if (IS_FLG(FLG_RARE) && !object_is_rare(o_ptr)) + return FALSE; + + /*** Common equipments ***/ + if (IS_FLG(FLG_COMMON) && object_is_rare(o_ptr)) return FALSE; /*** Wanted monster's corpse/skeletons ***/ - if (IS_FLG(FLG_WANTED) && - (o_ptr->tval != TV_CORPSE || !object_is_shoukinkubi(o_ptr))) + if (IS_FLG(FLG_WANTED) && !object_is_shoukinkubi(o_ptr)) return FALSE; /*** Unique monster's corpse/skeletons/statues ***/ @@ -816,7 +1262,7 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam /*** Human corpse/skeletons (for Daemon magic) ***/ if (IS_FLG(FLG_HUMAN) && (o_ptr->tval != TV_CORPSE || - !strchr("pht", r_info[o_ptr->pval].d_char))) + !my_strchr("pht", r_info[o_ptr->pval].d_char))) return FALSE; /*** Unreadable spellbooks ***/ @@ -862,33 +1308,22 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam /*** Items ***/ if (IS_FLG(FLG_WEAPONS)) { - switch(o_ptr->tval) - { - case TV_BOW: case TV_HAFTED: case TV_POLEARM: - case TV_SWORD: case TV_DIGGING: - break; - default: return FALSE; - } + if (!object_is_weapon(o_ptr)) + return FALSE; + } + else if (IS_FLG(FLG_FAVORITE_WEAPONS)) + { + if (!object_is_favorite(o_ptr)) + return FALSE; } else if (IS_FLG(FLG_ARMORS)) { - switch(o_ptr->tval) - { - case TV_BOOTS: case TV_GLOVES: case TV_CLOAK: case TV_CROWN: - case TV_HELM: case TV_SHIELD: case TV_SOFT_ARMOR: - case TV_HARD_ARMOR: case TV_DRAG_ARMOR: - break; - default: return FALSE; - } + if (!object_is_armour(o_ptr)) + return FALSE; } else if (IS_FLG(FLG_MISSILES)) { - switch(o_ptr->tval) - { - case TV_SHOT: case TV_BOLT: case TV_ARROW: - break; - default: return FALSE; - } + if (!object_is_ammo(o_ptr)) return FALSE; } else if (IS_FLG(FLG_DEVICES)) { @@ -914,6 +1349,11 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam default: return FALSE; } } + else if (IS_FLG(FLG_CORPSES)) + { + if (o_ptr->tval != TV_CORPSE && o_ptr->tval != TV_SKELETON) + return FALSE; + } else if (IS_FLG(FLG_SPELLBOOKS)) { if (!(o_ptr->tval >= TV_LIFE_BOOK)) @@ -971,11 +1411,6 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam if (!(o_ptr->tval == TV_BOOTS)) return FALSE; } - else if (IS_FLG(FLG_FAVORITE)) - { - if (!is_favorite(o_ptr, TRUE)) - return FALSE; - } /* Keyword don't match */ if (*ptr == '^') @@ -985,11 +1420,7 @@ static bool is_autopick_aux(object_type *o_ptr, autopick_type *entry, cptr o_nam } else { -#ifdef JP - if (!strstr_j(o_name, ptr)) return FALSE; -#else - if (!strstr(o_name, ptr)) return FALSE; -#endif + if (!my_strstr(o_name, ptr)) return FALSE; } /* TRUE when it need not to be 'collecting' */ @@ -1023,21 +1454,14 @@ int is_autopick(object_type *o_ptr) char o_name[MAX_NLEN]; if (o_ptr->tval == TV_GOLD) return -1; - - object_desc(o_name, o_ptr, FALSE, 3); - /* Force to be lower case string */ - for (i = 0; o_name[i]; i++) - { -#ifdef JP - if (iskanji(o_name[i])) - i++; - else -#endif - if (isupper(o_name[i])) - o_name[i] = tolower(o_name[i]); - } - + /* Prepare object name string first */ + object_desc(o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + + /* Convert the string to lower case */ + str_tolower(o_name); + + /* Look for a matching entry in the list */ for (i=0; i < max_autopick; i++) { autopick_type *entry = &autopick_list[i]; @@ -1053,36 +1477,19 @@ int is_autopick(object_type *o_ptr) /* * Auto inscription */ -void auto_inscribe_item(int item, int idx) +static void auto_inscribe_item(object_type *o_ptr, int idx) { - object_type *o_ptr; - - /* Get the item (in the pack) */ - if (item >= 0) o_ptr = &inventory[item]; - - /* Get the item (on the floor) */ - else o_ptr = &o_list[0 - item]; - - /* Auto-inscription or Re-inscribe for resistances {%} */ - if ((idx < 0 || !autopick_list[idx].insc) && !o_ptr->inscription) - return; + /* Are there auto-inscription? */ + if (idx < 0 || !autopick_list[idx].insc) return; if (!o_ptr->inscription) o_ptr->inscription = quark_add(autopick_list[idx].insc); - if (item > INVEN_PACK) - { - /* Redraw inscription */ - p_ptr->window |= (PW_EQUIP); + /* Redraw inscription */ + p_ptr->window |= (PW_EQUIP | PW_INVEN); - /* {.} and {$} effect p_ptr->warning and TRC_TELEPORT_SELF */ - p_ptr->update |= (PU_BONUS); - } - else if (item >= 0) - { - /* Redraw inscription */ - p_ptr->window |= (PW_INVEN); - } + /* {.} and {$} effect p_ptr->warning and TRC_TELEPORT_SELF */ + p_ptr->update |= (PU_BONUS); } @@ -1096,22 +1503,21 @@ static bool is_opt_confirm_destroy(object_type *o_ptr) /* Known to be worthless? */ if (leave_worth) if (object_value(o_ptr) > 0) return FALSE; - + if (leave_equip) - if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_DRAG_ARMOR)) return FALSE; - + if (object_is_weapon_armour_ammo(o_ptr)) return FALSE; + if (leave_chest) if ((o_ptr->tval == TV_CHEST) && o_ptr->pval) return FALSE; - + if (leave_wanted) { - if (o_ptr->tval == TV_CORPSE - && object_is_shoukinkubi(o_ptr)) return FALSE; + if (object_is_shoukinkubi(o_ptr)) return FALSE; } - + if (leave_corpse) if (o_ptr->tval == TV_CORPSE) return FALSE; - + if (leave_junk) if ((o_ptr->tval == TV_SKELETON) || (o_ptr->tval == TV_BOTTLE) || (o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_STATUE)) return FALSE; @@ -1121,7 +1527,7 @@ static bool is_opt_confirm_destroy(object_type *o_ptr) { if (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_CORPSE && - strchr("pht", r_info[o_ptr->pval].d_char)) + my_strchr("pht", r_info[o_ptr->pval].d_char)) return FALSE; } @@ -1134,61 +1540,55 @@ static bool is_opt_confirm_destroy(object_type *o_ptr) else if (p_ptr->pclass == CLASS_NINJA) { if (o_ptr->tval == TV_LITE && - o_ptr->name2 == EGO_LITE_DARKNESS) + o_ptr->name2 == EGO_LITE_DARKNESS && object_is_known(o_ptr)) return FALSE; } else if (p_ptr->pclass == CLASS_BEASTMASTER || p_ptr->pclass == CLASS_CAVALRY) { if (o_ptr->tval == TV_WAND && - o_ptr->sval == SV_WAND_HEAL_MONSTER) + o_ptr->sval == SV_WAND_HEAL_MONSTER && object_is_aware(o_ptr)) return FALSE; } } - + if (o_ptr->tval == TV_GOLD) return FALSE; - + return TRUE; } /* * Automatically destroy an item if it is to be destroyed + * + * When always_pickup is 'yes', we disable auto-destroyer function of + * auto-picker/destroyer, and do only easy-auto-destroyer. */ static object_type autopick_last_destroyed_object; -bool auto_destroy_item(int item, int autopick_idx) +static void auto_destroy_item(object_type *o_ptr, int autopick_idx) { bool destroy = FALSE; - object_type *o_ptr; - - /* Don't destroy equipped items */ - if (item > INVEN_PACK) return FALSE; - - /* Get the item (in the pack) */ - if (item >= 0) o_ptr = &inventory[item]; - - /* Get the item (on the floor) */ - else o_ptr = &o_list[0 - item]; - /* Easy-Auto-Destroyer */ + /* Easy-Auto-Destroyer (3rd priority) */ if (is_opt_confirm_destroy(o_ptr)) destroy = TRUE; - /* Protected by auto-picker */ + /* Protected by auto-picker (2nd priotity) */ if (autopick_idx >= 0 && !(autopick_list[autopick_idx].action & DO_AUTODESTROY)) destroy = FALSE; + /* Auto-destroyer works only when !always_pickup */ if (!always_pickup) { - /* Auto-picker/destroyer */ + /* Auto-picker/destroyer (1st priority) */ if (autopick_idx >= 0 && (autopick_list[autopick_idx].action & DO_AUTODESTROY)) destroy = TRUE; } /* Not to be destroyed */ - if (!destroy) return FALSE; + if (!destroy) return; /* Now decided to destroy */ @@ -1200,7 +1600,7 @@ bool auto_destroy_item(int item, int autopick_idx) char o_name[MAX_NLEN]; /* Describe the object (with {terrible/special}) */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); /* Message */ #ifdef JP @@ -1210,24 +1610,24 @@ bool auto_destroy_item(int item, int autopick_idx) #endif /* Done */ - return TRUE; + return; } /* Record name of destroyed item */ - COPY(&autopick_last_destroyed_object, o_ptr, object_type); + (void)COPY(&autopick_last_destroyed_object, o_ptr, object_type); /* Destroy Later */ o_ptr->marked |= OM_AUTODESTROY; p_ptr->notice |= PN_AUTODESTROY; - return TRUE; + return; } /* * Auto-destroy marked item */ -static void delayed_auto_destroy_aux(int item) +static void autopick_delayed_alter_aux(int item) { object_type *o_ptr; @@ -1237,12 +1637,12 @@ static void delayed_auto_destroy_aux(int item) /* Get the item (on the floor) */ else o_ptr = &o_list[0 - item]; - if (o_ptr->k_idx && o_ptr->marked & OM_AUTODESTROY) + if (o_ptr->k_idx && (o_ptr->marked & OM_AUTODESTROY)) { char o_name[MAX_NLEN]; /* Describe the object (with {terrible/special}) */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); /* Eliminate the item (from the pack) */ if (item >= 0) @@ -1268,9 +1668,9 @@ static void delayed_auto_destroy_aux(int item) /* - * Auto-destroy marked item in inventry and on floor + * Auto-destroy marked items in inventry and on floor */ -void delayed_auto_destroy(void) +void autopick_delayed_alter(void) { int item; @@ -1279,23 +1679,52 @@ void delayed_auto_destroy(void) * skipping after inven_item_optimize() */ for (item = INVEN_TOTAL - 1; item >= 0 ; item--) - delayed_auto_destroy_aux(item); + autopick_delayed_alter_aux(item); /* Scan the pile of objects */ item = cave[py][px].o_idx; while (item) { int next = o_list[item].next_o_idx; - delayed_auto_destroy_aux(-item); + autopick_delayed_alter_aux(-item); item = next; } } /* + * Auto-inscription and/or destroy + * + * Auto-destroyer works only on inventory or on floor stack only when + * requested. + */ +void autopick_alter_item(int item, bool destroy) +{ + object_type *o_ptr; + int idx; + + /* Get the item (in the pack) */ + if (item >= 0) o_ptr = &inventory[item]; + + /* Get the item (on the floor) */ + else o_ptr = &o_list[0 - item]; + + /* Get the index in the auto-pick/destroy list */ + idx = is_autopick(o_ptr); + + /* Do auto-inscription */ + auto_inscribe_item(o_ptr, idx); + + /* Do auto-destroy if needed */ + if (destroy && item <= INVEN_PACK) + auto_destroy_item(o_ptr, idx); +} + + +/* * Automatically pickup/destroy items in this grid. */ -void auto_pickup_items(cave_type *c_ptr) +void autopick_pickup_items(cave_type *c_ptr) { s16b this_o_idx, next_o_idx = 0; @@ -1313,7 +1742,7 @@ void auto_pickup_items(cave_type *c_ptr) idx = is_autopick(o_ptr); /* Item index for floor -1,-2,-3,... */ - auto_inscribe_item((-this_o_idx), idx); + auto_inscribe_item(o_ptr, idx); if (idx >= 0 && (autopick_list[idx].action & (DO_AUTOPICK | DO_QUERY_AUTOPICK))) @@ -1325,7 +1754,7 @@ void auto_pickup_items(cave_type *c_ptr) char o_name[MAX_NLEN]; /* Describe the object */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); /* Message */ #ifdef JP @@ -1350,7 +1779,7 @@ void auto_pickup_items(cave_type *c_ptr) } /* Describe the object */ - object_desc(o_name, o_ptr, TRUE, 3); + object_desc(o_name, o_ptr, 0); #ifdef JP sprintf(out_val, "%s¤ò½¦¤¤¤Þ¤¹¤«? ", o_name); @@ -1367,8 +1796,6 @@ void auto_pickup_items(cave_type *c_ptr) } py_pickup_aux(this_o_idx); - - continue; } /* @@ -1379,67 +1806,362 @@ void auto_pickup_items(cave_type *c_ptr) */ else { - if (auto_destroy_item((-this_o_idx), idx)) - continue; + auto_destroy_item(o_ptr, idx); } - } + } /* for () */ } -/******** Auto-picker/destroyer editor **********/ - -#define MAX_YANK MAX_LINELEN - -#define MARK_MARK 0x01 -#define MARK_BY_SHIFT 0x02 - -/* - * Struct for yank buffer - */ -typedef struct chain_str { - struct chain_str *next; - char s[1]; -} chain_str_type; - +static const char autoregister_header[] = "?:$AUTOREGISTER"; /* - * Data struct for text editor + * Clear auto registered lines in the picktype.prf . */ -typedef struct { - int wid, hgt; - int cx, cy; - int upper, left; - int old_wid, old_hgt; - int old_cy; - int old_upper, old_left; - int mx, my; - byte mark; +static bool clear_auto_register(void) +{ + char tmp_file[1024]; + char pref_file[1024]; + char buf[1024]; + FILE *pref_fff; + FILE *tmp_fff; + int num = 0; + bool autoregister = FALSE; + bool okay = TRUE; - object_type *search_o_ptr; - cptr search_str; - cptr last_destroyed; + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(PT_WITH_PNAME)); + pref_fff = my_fopen(pref_file, "r"); - chain_str_type *yank; - bool yank_eol; + if (!pref_fff) + { + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(PT_DEFAULT)); + pref_fff = my_fopen(pref_file, "r"); + } - cptr *lines_list; + if (!pref_fff) + { + /* No file yet */ + return TRUE; + } - byte dirty_flags; - int dirty_line; - int filename_mode; - int old_com_id; -} text_body_type; + /* Open a new (temporary) file */ + tmp_fff = my_fopen_temp(tmp_file, sizeof(tmp_file)); + if (!tmp_fff) + { + /* Close the preference file */ + fclose(pref_fff); -/* - * Dirty flag for text editor +#ifdef JP + msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", tmp_file); +#else + msg_format("Failed to create temporary file %s.", tmp_file); +#endif + msg_print(NULL); + return FALSE; + } + + + /* Loop for every line */ + while (TRUE) + { + /* Read a line */ + if (my_fgets(pref_fff, buf, sizeof(buf))) break; + + if (autoregister) + { + /* Delete auto-registered line */ + + /* Count auto-destroy preference lines */ + if (buf[0] != '#' && buf[0] != '?') num++; + } + + /* We are looking for auto-registered line */ + else + { + if (streq(buf, autoregister_header)) + { + /* Delete all further lines */ + autoregister = TRUE; + } + else + { + /* Copy orginally lines */ + fprintf(tmp_fff, "%s\n", buf); + } + } + } + + /* Close files */ + my_fclose(pref_fff); + my_fclose(tmp_fff); + + if (num) + { +#ifdef JP + msg_format("°ÊÁ°¤Î¥­¥ã¥é¥¯¥¿¡¼ÍѤμ«Æ°ÀßÄê(%d¹Ô)¤¬»Ä¤Ã¤Æ¤¤¤Þ¤¹¡£", num); + strcpy(buf, "¸Å¤¤ÀßÄê¹Ô¤Ïºï½ü¤·¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©"); +#else + msg_format("Auto registered lines (%d lines) for previous character are remaining.", num); + strcpy(buf, "These lines will be deleted. Are you sure? "); +#endif + + /* You can cancel it */ + if (!get_check(buf)) + { + okay = FALSE; + autoregister = FALSE; + +#ifdef JP + msg_print("¥¨¥Ç¥£¥¿¤Î¥«¥Ã¥È&¥Ú¡¼¥¹¥ÈÅù¤ò»È¤Ã¤ÆɬÍפʹԤòÈòÆñ¤·¤Æ¤¯¤À¤µ¤¤¡£"); +#else + msg_print("Use cut & paste of auto picker editor (_) to keep old prefs."); +#endif + } + } + + + /* If there are some changes, overwrite the original file with new one */ + if (autoregister) + { + /* Copy contents of temporary file */ + + tmp_fff = my_fopen(tmp_file, "r"); + pref_fff = my_fopen(pref_file, "w"); + + while (!my_fgets(tmp_fff, buf, sizeof(buf))) + fprintf(pref_fff, "%s\n", buf); + + my_fclose(pref_fff); + my_fclose(tmp_fff); + } + + /* Kill the temporary file */ + fd_kill(tmp_file); + + return okay; +} + + +/* + * Automatically register an auto-destroy preference line + */ +bool autopick_autoregister(object_type *o_ptr) +{ + char buf[1024]; + char pref_file[1024]; + FILE *pref_fff; + autopick_type an_entry, *entry = &an_entry; + + int match_autopick = is_autopick(o_ptr); + + /* Already registered */ + if (match_autopick != -1) + { + cptr what; + byte act = autopick_list[match_autopick].action; + +#ifdef JP + if (act & DO_AUTOPICK) what = "¼«Æ°¤Ç½¦¤¦"; + else if (act & DO_AUTODESTROY) what = "¼«Æ°Ç˲õ¤¹¤ë"; + else if (act & DONT_AUTOPICK) what = "ÊüÃÖ¤¹¤ë"; + else /* if (act & DO_QUERY_AUTOPICK) */ what = "³Îǧ¤·¤Æ½¦¤¦"; + + msg_format("¤½¤Î¥¢¥¤¥Æ¥à¤Ï´û¤Ë%s¤è¤¦¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£", what); +#else + if (act & DO_AUTOPICK) what = "auto-pickup"; + else if (act & DO_AUTODESTROY) what = "auto-destroy"; + else if (act & DONT_AUTOPICK) what = "leave on floor"; + else /* if (act & DO_QUERY_AUTOPICK) */ what = "query auto-pickup"; + + msg_format("The object is already registered to %s.", what); +#endif + + return FALSE; + } + + /* Known to be an artifact? */ + if ((object_is_known(o_ptr) && object_is_artifact(o_ptr)) || + ((o_ptr->ident & IDENT_SENSE) && + (o_ptr->feeling == FEEL_TERRIBLE || o_ptr->feeling == FEEL_SPECIAL))) + { + char o_name[MAX_NLEN]; + + /* Describe the object (with {terrible/special}) */ + object_desc(o_name, o_ptr, 0); + + /* Message */ +#ifdef JP + msg_format("%s¤ÏÇ˲õÉÔǽ¤À¡£", o_name); +#else + msg_format("You cannot auto-destroy %s.", o_name); +#endif + + /* Done */ + return FALSE; + } + + + if (!p_ptr->autopick_autoregister) + { + /* Clear old auto registered lines */ + if (!clear_auto_register()) return FALSE; + } + + /* Try a filename with player name */ + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(PT_WITH_PNAME)); + pref_fff = my_fopen(pref_file, "r"); + + if (!pref_fff) + { + /* Use default name */ + path_build(pref_file, sizeof(pref_file), ANGBAND_DIR_USER, pickpref_filename(PT_DEFAULT)); + pref_fff = my_fopen(pref_file, "r"); + } + + /* Check the header */ + while (TRUE) + { + /* Read a line */ + if (my_fgets(pref_fff, buf, sizeof(buf))) + { + /* No header found */ + p_ptr->autopick_autoregister = FALSE; + + break; + } + + if (streq(buf, autoregister_header)) + { + /* Found the header */ + p_ptr->autopick_autoregister = TRUE; + + break; + } + } + + /* Close read only FILE* */ + fclose(pref_fff); + + /* Open for append */ + pref_fff = my_fopen(pref_file, "a"); + + /* Failure */ + if (!pref_fff) { +#ifdef JP + msg_format("%s ¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", pref_file); +#else + msg_format("Failed to open %s.", pref_file); +#endif + msg_print(NULL); + + /* Failed */ + return FALSE; + } + + if (!p_ptr->autopick_autoregister) + { + /* Add the header */ + fprintf(pref_fff, "%s\n", autoregister_header); + +#ifdef JP + fprintf(pref_fff, "%s\n", "# *·Ù¹ð!!* °Ê¹ß¤Î¹Ô¤Ï¼«Æ°ÅÐÏ¿¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£"); + fprintf(pref_fff, "%s\n", "# ¸å¤Ç¼«Æ°Åª¤Ëºï½ü¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢É¬ÍפʹԤϾå¤ÎÊý¤Ø°ÜÆ°¤·¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£"); +#else + fprintf(pref_fff, "%s\n", "# *Waring!* The lines below will be deleated later."); + fprintf(pref_fff, "%s\n", "# Keep it by cut & paste if you need these lines for future characters."); +#endif + + /* Now auto register is in-use */ + p_ptr->autopick_autoregister = TRUE; + } + + /* Get a preference entry */ + autopick_entry_from_object(entry, o_ptr); + + /* Set to auto-destroy (with no-display) */ + entry->action = DO_AUTODESTROY; + + /* Load the new line as preference */ + add_autopick_list(entry); + + /* Add a line to the file */ + /* Don't kill "entry" */ + fprintf(pref_fff, "%s\n", autopick_line_from_entry(entry)); + + /* Close the file */ + fclose(pref_fff); + + return TRUE; +} + + +/******** Auto-picker/destroyer editor **********/ + +#define MAX_YANK MAX_LINELEN +#define MAX_LINES 3000 + +#define MARK_MARK 0x01 +#define MARK_BY_SHIFT 0x02 + +#define LSTAT_BYPASS 0x01 +#define LSTAT_EXPRESSION 0x02 +#define LSTAT_AUTOREGISTER 0x04 + +#define QUIT_WITHOUT_SAVE 1 +#define QUIT_AND_SAVE 2 + +/* + * Struct for yank buffer + */ +typedef struct chain_str { + struct chain_str *next; + char s[1]; +} chain_str_type; + + +/* + * Data struct for text editor */ -#define DIRTY_ALL 0x01 -#define DIRTY_MODE 0x04 -#define DIRTY_SCREEN 0x08 -#define DIRTY_NOT_FOUND 0x10 -#define DIRTY_NO_SEARCH 0x20 +typedef struct { + int wid, hgt; + int cx, cy; + int upper, left; + int old_wid, old_hgt; + int old_cy; + int old_upper, old_left; + int mx, my; + byte mark; + + object_type *search_o_ptr; + cptr search_str; + cptr last_destroyed; + + chain_str_type *yank; + bool yank_eol; + + cptr *lines_list; + byte states[MAX_LINES]; + u16b dirty_flags; + int dirty_line; + int filename_mode; + int old_com_id; + + bool changed; +} text_body_type; + + +/* + * Dirty flag for text editor + */ +#define DIRTY_ALL 0x0001 +#define DIRTY_MODE 0x0004 +#define DIRTY_SCREEN 0x0008 +#define DIRTY_NOT_FOUND 0x0010 +#define DIRTY_NO_SEARCH 0x0020 +#define DIRTY_EXPRESSION 0x0040 +#define DIRTY_SKIP_INACTIVE 0x0080 +#define DIRTY_INACTIVE 0x0100 /* * Describe which kind of object is Auto-picked/destroyed @@ -1464,6 +2186,10 @@ static void describe_autopick(char *buff, autopick_type *entry) if (IS_FLG(FLG_COLLECTING)) before_str[before_n++] = "¼ý½¸Ãæ¤Ç´û¤Ë»ý¤Ã¤Æ¤¤¤ë¥¹¥í¥Ã¥È¤Ë¤Þ¤È¤á¤é¤ì¤ë"; + /*** Unaware items ***/ + if (IS_FLG(FLG_UNAWARE)) + before_str[before_n++] = "̤´ÕÄê¤Ç¤½¤Î¸ú²Ì¤âȽÌÀ¤·¤Æ¤¤¤Ê¤¤"; + /*** Unidentified ***/ if (IS_FLG(FLG_UNIDENTIFIED)) before_str[before_n++] = "̤´ÕÄê¤Î"; @@ -1484,7 +2210,7 @@ static void describe_autopick(char *buff, autopick_type *entry) } /*** Weapons whose dd*ds is more than nn ***/ - if (IS_FLG(FLG_MORE_THAN)) + if (IS_FLG(FLG_MORE_DICE)) { static char more_than_desc_str[] = "___"; before_str[before_n++] = "¥À¥á¡¼¥¸¥À¥¤¥¹¤ÎºÇÂçÃͤ¬"; @@ -1524,6 +2250,13 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "ÁõÈ÷"; } + /*** Good ***/ + if (IS_FLG(FLG_GOOD)) + { + before_str[before_n++] = "¾å¼Á¤Î"; + body_str = "ÁõÈ÷"; + } + /*** Nameless ***/ if (IS_FLG(FLG_NAMELESS)) { @@ -1531,9 +2264,26 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "ÁõÈ÷"; } - /*** Unaware items ***/ - if (IS_FLG(FLG_UNAWARE)) - before_str[before_n++] = "̤´ÕÄê¤Ç¤½¤Î¸ú²Ì¤âȽÌÀ¤·¤Æ¤¤¤Ê¤¤"; + /*** Average ***/ + if (IS_FLG(FLG_AVERAGE)) + { + before_str[before_n++] = "ʤÎ"; + body_str = "ÁõÈ÷"; + } + + /*** Rare equipments ***/ + if (IS_FLG(FLG_RARE)) + { + before_str[before_n++] = "¥É¥é¥´¥óÁõÈ÷¤ä¥«¥ª¥¹¡¦¥Ö¥ì¡¼¥ÉÅù¤ò´Þ¤àÄÁ¤·¤¤"; + body_str = "ÁõÈ÷"; + } + + /*** Common equipments ***/ + if (IS_FLG(FLG_COMMON)) + { + before_str[before_n++] = "¤¢¤ê¤Õ¤ì¤¿(¥É¥é¥´¥óÁõÈ÷¤ä¥«¥ª¥¹¡¦¥Ö¥ì¡¼¥ÉÅù¤ÎÄÁ¤·¤¤Êª¤Ç¤Ï¤Ê¤¤)"; + body_str = "ÁõÈ÷"; + } /*** Wanted monster's corpse/skeletons ***/ if (IS_FLG(FLG_WANTED)) @@ -1610,6 +2360,8 @@ static void describe_autopick(char *buff, autopick_type *entry) ; /* Nothing to do */ else if (IS_FLG(FLG_WEAPONS)) body_str = "Éð´ï"; + else if (IS_FLG(FLG_FAVORITE_WEAPONS)) + body_str = "ÆÀ°ÕÉð´ï"; else if (IS_FLG(FLG_ARMORS)) body_str = "Ëɶñ"; else if (IS_FLG(FLG_MISSILES)) @@ -1620,6 +2372,8 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "¸÷¸»ÍѤΥ¢¥¤¥Æ¥à"; else if (IS_FLG(FLG_JUNKS)) body_str = "Àޤ줿ËÀÅù¤Î¥¬¥é¥¯¥¿"; + else if (IS_FLG(FLG_CORPSES)) + body_str = "»àÂΤä¹ü"; else if (IS_FLG(FLG_SPELLBOOKS)) body_str = "ËâË¡½ñ"; else if (IS_FLG(FLG_HAFTED)) @@ -1642,8 +2396,6 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "äƼê"; else if (IS_FLG(FLG_BOOTS)) body_str = "¥Ö¡¼¥Ä"; - else if (IS_FLG(FLG_FAVORITE)) - body_str = "ÆÀ°ÕÉð´ï"; *buff = '\0'; if (!before_n) @@ -1673,13 +2425,13 @@ static void describe_autopick(char *buff, autopick_type *entry) { strncat(buff, format("¤Ë¡Ö%s¡×", insc), 80); - if (strstr(insc, "%%all")) + if (my_strstr(insc, "%%all")) strcat(buff, "(%%all¤ÏÁ´Ç½ÎϤòɽ¤¹±Ñ»ú¤Îµ­¹æ¤ÇÃÖ´¹)"); - else if (strstr(insc, "%all")) + else if (my_strstr(insc, "%all")) strcat(buff, "(%all¤ÏÁ´Ç½ÎϤòɽ¤¹µ­¹æ¤ÇÃÖ´¹)"); - else if (strstr(insc, "%%")) + else if (my_strstr(insc, "%%")) strcat(buff, "(%%¤ÏÄɲÃǽÎϤòɽ¤¹±Ñ»ú¤Îµ­¹æ¤ÇÃÖ´¹)"); - else if (strstr(insc, "%")) + else if (my_strstr(insc, "%")) strcat(buff, "(%¤ÏÄɲÃǽÎϤòɽ¤¹µ­¹æ¤ÇÃÖ´¹)"); strcat(buff, "¤È¹ï¤ó¤Ç"); @@ -1706,7 +2458,7 @@ static void describe_autopick(char *buff, autopick_type *entry) strcat(buff, "Á´ÂΥޥå×('M')¤Ç'M'¤ò²¡¤·¤¿¤È¤­¤Ëɽ¼¨¤¹¤ë¡£"); } else - strcat(buff, "Á´ÂΥޥåפˤÏɽ¼¨¤·¤Ê¤¤"); + strcat(buff, "Á´ÂΥޥåפˤÏɽ¼¨¤·¤Ê¤¤¡£"); #else /* JP */ @@ -1720,6 +2472,13 @@ static void describe_autopick(char *buff, autopick_type *entry) if (IS_FLG(FLG_COLLECTING)) which_str[which_n++] = "can be absorbed into an existing inventory slot"; + /*** Unaware items ***/ + if (IS_FLG(FLG_UNAWARE)) + { + before_str[before_n++] = "unidentified"; + whose_str[whose_n++] = "basic abilities are not known"; + } + /*** Unidentified ***/ if (IS_FLG(FLG_UNIDENTIFIED)) before_str[before_n++] = "unidentified"; @@ -1732,6 +2491,22 @@ static void describe_autopick(char *buff, autopick_type *entry) if (IS_FLG(FLG_STAR_IDENTIFIED)) before_str[before_n++] = "fully identified"; + /*** Rare equipments ***/ + if (IS_FLG(FLG_RARE)) + { + before_str[before_n++] = "very rare"; + body_str = "equipments"; + after_str[after_n++] = "such like Dragon armors, Blades of Chaos, etc."; + } + + /*** Common equipments ***/ + if (IS_FLG(FLG_COMMON)) + { + before_str[before_n++] = "relatively common"; + body_str = "equipments"; + after_str[after_n++] = "compared to very rare Dragon armors, Blades of Chaos, etc."; + } + /*** Worthless items ***/ if (IS_FLG(FLG_WORTHLESS)) { @@ -1751,6 +2526,13 @@ static void describe_autopick(char *buff, autopick_type *entry) before_str[before_n++] = "ego"; } + /*** Good ***/ + if (IS_FLG(FLG_GOOD)) + { + body_str = "equipment"; + which_str[which_n++] = "have good quality"; + } + /*** Nameless ***/ if (IS_FLG(FLG_NAMELESS)) { @@ -1758,11 +2540,11 @@ static void describe_autopick(char *buff, autopick_type *entry) which_str[which_n++] = "is neither ego-item nor artifact"; } - /*** Unaware items ***/ - if (IS_FLG(FLG_UNAWARE)) + /*** Average ***/ + if (IS_FLG(FLG_AVERAGE)) { - before_str[before_n++] = "unidentified"; - whose_str[whose_n++] = "basic abilities are not known"; + body_str = "equipment"; + which_str[which_n++] = "have average quality"; } /*** Dice boosted (weapon of slaying) ***/ @@ -1773,7 +2555,7 @@ static void describe_autopick(char *buff, autopick_type *entry) } /*** Weapons whose dd*ds is more than nn ***/ - if (IS_FLG(FLG_MORE_THAN)) + if (IS_FLG(FLG_MORE_DICE)) { static char more_than_desc_str[] = "maximum damage from dice is bigger than __"; @@ -1871,6 +2653,8 @@ static void describe_autopick(char *buff, autopick_type *entry) ; /* Nothing to do */ else if (IS_FLG(FLG_WEAPONS)) body_str = "weapons"; + else if (IS_FLG(FLG_FAVORITE_WEAPONS)) + body_str = "favorite weapons"; else if (IS_FLG(FLG_ARMORS)) body_str = "armors"; else if (IS_FLG(FLG_MISSILES)) @@ -1881,6 +2665,8 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "light sources"; else if (IS_FLG(FLG_JUNKS)) body_str = "junk such as broken sticks"; + else if (IS_FLG(FLG_CORPSES)) + body_str = "corpses or skeletons"; else if (IS_FLG(FLG_SPELLBOOKS)) body_str = "spellbooks"; else if (IS_FLG(FLG_HAFTED)) @@ -1903,8 +2689,6 @@ static void describe_autopick(char *buff, autopick_type *entry) body_str = "gloves"; else if (IS_FLG(FLG_BOOTS)) body_str = "boots"; - else if (IS_FLG(FLG_FAVORITE)) - body_str = "favorite weapons"; /* Prepare a string for item name */ if (*str) @@ -1935,9 +2719,9 @@ static void describe_autopick(char *buff, autopick_type *entry) { strncat(buff, format("and inscribe \"%s\"", insc), 80); - if (strstr(insc, "%all")) + if (my_strstr(insc, "%all")) strcat(buff, ", replacing %all with code string representing all abilities,"); - else if (strstr(insc, "%")) + else if (my_strstr(insc, "%")) strcat(buff, ", replacing % with code string representing extra random abilities,"); strcat(buff, " on "); @@ -2020,12 +2804,10 @@ static void describe_autopick(char *buff, autopick_type *entry) } -#define MAX_LINES 3000 - /* * Read whole lines of a file to memory */ -static cptr *read_text_lines(cptr filename, bool user) +static cptr *read_text_lines(cptr filename) { cptr *lines_list = NULL; FILE *fff; @@ -2033,14 +2815,7 @@ static cptr *read_text_lines(cptr filename, bool user) int lines = 0; char buf[1024]; - if (user) - { - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, filename); - } - else - { - path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, filename); - } + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, filename); /* Open the file */ fff = my_fopen(buf, "r"); @@ -2067,39 +2842,102 @@ static cptr *read_text_lines(cptr filename, bool user) } -#define PT_DEFAULT 0 -#define PT_WITH_PNAME 1 - -static cptr *read_pickpref_text_lines(int *filename_mode_p) +/* + * Copy the default autopick file to the user directory + */ +static void prepare_default_pickpref(void) { - char buf[1024]; - cptr *lines_list; - + const cptr messages[] = { #ifdef JP - sprintf(buf, "picktype-%s.prf", player_name); + "¤¢¤Ê¤¿¤Ï¡Ö¼«Æ°½¦¤¤¥¨¥Ç¥£¥¿¡×¤ò½é¤á¤Æµ¯Æ°¤·¤Þ¤·¤¿¡£", + "¼«Æ°½¦¤¤¤Î¥æ¡¼¥¶¡¼ÀßÄê¥Õ¥¡¥¤¥ë¤¬¤Þ¤À½ñ¤«¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢", + "´ðËÜŪ¤Ê¼«Æ°½¦¤¤ÀßÄê¥Õ¥¡¥¤¥ë¤òlib/pref/picktype.prf¤«¤é¥³¥Ô¡¼¤·¤Þ¤¹¡£", + NULL #else - sprintf(buf, "pickpref-%s.prf", player_name); + "You have activated the Auto-Picker Editor for the first time.", + "Since user pref file for autopick is not yet created,", + "the default setting is loaded from lib/pref/pickpref.prf .", + NULL #endif - lines_list = read_text_lines(buf, TRUE); + }; - if (!lines_list) - { -#ifdef JP - lines_list = read_text_lines("picktype.prf", TRUE); -#else - lines_list = read_text_lines("pickpref.prf", TRUE); -#endif - *filename_mode_p = PT_DEFAULT; - } + char buf[1024]; + FILE *pref_fp; + FILE *user_fp; + int i; + cptr filename = pickpref_filename(PT_DEFAULT); - if (!lines_list) - { -#ifdef JP - lines_list = read_text_lines("picktype.prf", FALSE); -#else - lines_list = read_text_lines("pickpref.prf", FALSE); -#endif - *filename_mode_p = PT_WITH_PNAME; + /* Display messages */ + for (i = 0; messages[i]; i++) msg_print(messages[i]); + msg_print(NULL); + + + /* Open new file */ + path_build(buf, sizeof(buf), ANGBAND_DIR_USER, filename); + user_fp = my_fopen(buf, "w"); + + /* Failed */ + if (!user_fp) return; + + /* Write header messages for a notification */ + fprintf(user_fp, "#***\n"); + for (i = 0; messages[i]; i++) + { + fprintf(user_fp, "#*** %s\n", messages[i]); + } + fprintf(user_fp, "#***\n\n\n"); + + + /* Open the default file */ + path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, filename); + pref_fp = my_fopen(buf, "r"); + + /* Failed */ + if (!pref_fp) + { + my_fclose(user_fp); + return; + } + + /* Copy the contents of default file */ + while (!my_fgets(pref_fp, buf, sizeof(buf))) + fprintf(user_fp, "%s\n", buf); + + my_fclose(user_fp); + my_fclose(pref_fp); +} + +/* + * Read an autopick prefence file to memory + * Prepare default if no user file is found + */ +static cptr *read_pickpref_text_lines(int *filename_mode_p) +{ + char buf[1024]; + cptr *lines_list; + + /* Try a filename with player name */ + *filename_mode_p = PT_WITH_PNAME; + strcpy(buf, pickpref_filename(*filename_mode_p)); + lines_list = read_text_lines(buf); + + if (!lines_list) + { + /* Use default name */ + *filename_mode_p = PT_DEFAULT; + strcpy(buf, pickpref_filename(*filename_mode_p)); + lines_list = read_text_lines(buf); + } + + if (!lines_list) + { + /* There is no preference file in the user directory */ + + /* Copy the default autopick file to the user directory */ + prepare_default_pickpref(); + + /* Use default name again */ + lines_list = read_text_lines(buf); } if (!lines_list) @@ -2107,7 +2945,6 @@ static cptr *read_pickpref_text_lines(int *filename_mode_p) /* Allocate list of pointers */ C_MAKE(lines_list, MAX_LINES, cptr); lines_list[0] = string_make(""); - *filename_mode_p = PT_WITH_PNAME; } return lines_list; } @@ -2152,7 +2989,7 @@ static void free_text_lines(cptr *lines_list) string_free(lines_list[lines]); /* free list of pointers */ - C_FREE((char **)lines_list, MAX_LINES, char *); + C_KILL(lines_list, MAX_LINES, cptr); } @@ -2161,40 +2998,30 @@ static void free_text_lines(cptr *lines_list) */ static void toggle_keyword(text_body_type *tb, int flg) { - int by1, by2, bx1, bx2, y; + int by1, by2, y; bool add = TRUE; bool fixed = FALSE; - /* Select this line */ - if (!tb->mark) tb->my = tb->cy; - - if (tb->my < tb->cy) + /* Some lines are selected */ + if (tb->mark) { - by1 = tb->my; - by2 = tb->cy; - bx1 = tb->mx; - bx2 = tb->cx; + by1 = MIN(tb->my, tb->cy); + by2 = MAX(tb->my, tb->cy); } - else + + /* No mark -- Select current line */ + else /* if (!tb->mark) */ { - by2 = tb->my; - by1 = tb->cy; - bx2 = tb->mx; - bx1 = tb->cx; + by1 = by2 = tb->cy; } - /* String on these lines are not really selected */ - if (tb->lines_list[by1][bx1] == '\0' && by1 < tb->cy) by1++; - if (bx2 == 0 && tb->cy < by2) by2--; - /* Set/Reset flag of each line */ for (y = by1; y <= by2; y++) { autopick_type an_entry, *entry = &an_entry; - if (!autopick_new_entry(entry, tb->lines_list[y])) - return; + if (!autopick_new_entry(entry, tb->lines_list[y], !fixed)) continue; string_free(tb->lines_list[y]); @@ -2225,10 +3052,18 @@ static void toggle_keyword(text_body_type *tb, int flg) } /* You can use only one flag in artifact/ego/nameless */ - else if (FLG_ARTIFACT <= flg && flg <= FLG_NAMELESS) + else if (FLG_ARTIFACT <= flg && flg <= FLG_AVERAGE) + { + int i; + for (i = FLG_ARTIFACT; i <= FLG_AVERAGE; i++) + REM_FLG(i); + } + + /* You can use only one flag in rare/common */ + else if (FLG_RARE <= flg && flg <= FLG_COMMON) { int i; - for (i = FLG_ARTIFACT; i <= FLG_NAMELESS; i++) + for (i = FLG_RARE; i <= FLG_COMMON; i++) REM_FLG(i); } @@ -2239,6 +3074,9 @@ static void toggle_keyword(text_body_type *tb, int flg) /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Text is changed */ + tb->changed = TRUE; } } @@ -2249,39 +3087,30 @@ static void toggle_keyword(text_body_type *tb, int flg) static void toggle_command_letter(text_body_type *tb, byte flg) { autopick_type an_entry, *entry = &an_entry; - int by1, by2, bx1, bx2, y; + int by1, by2, y; bool add = TRUE; bool fixed = FALSE; - /* Select this line */ - if (!tb->mark) tb->my = tb->cy; - - if (tb->my < tb->cy) + /* Some lines are selected */ + if (tb->mark) { - by1 = tb->my; - by2 = tb->cy; - bx1 = tb->mx; - bx2 = tb->cx; + by1 = MIN(tb->my, tb->cy); + by2 = MAX(tb->my, tb->cy); } - else + + /* No mark -- Select current line */ + else /* if (!tb->mark) */ { - by2 = tb->my; - by1 = tb->cy; - bx2 = tb->mx; - bx1 = tb->cx; + by1 = by2 = tb->cy; } - /* String on these lines are not really selected */ - if (tb->lines_list[by1][bx1] == '\0' && by1 < tb->cy) by1++; - if (bx2 == 0 && tb->cy < by2) by2--; - /* Set/Reset flag of each line */ for (y = by1; y <= by2; y++) { int wid = 0; - if (!autopick_new_entry(entry, tb->lines_list[y])) continue; + if (!autopick_new_entry(entry, tb->lines_list[y], FALSE)) continue; string_free(tb->lines_list[y]); @@ -2330,6 +3159,9 @@ static void toggle_command_letter(text_body_type *tb, byte flg) /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Text is changed */ + tb->changed = TRUE; } } @@ -2338,191 +3170,150 @@ static void toggle_command_letter(text_body_type *tb, byte flg) */ static void add_keyword(text_body_type *tb, int flg) { - autopick_type an_entry, *entry = &an_entry; - - if (!autopick_new_entry(entry, tb->lines_list[tb->cy])) - return; + int by1, by2, y; - /* There is the flag already */ - if (IS_FLG(flg)) + /* Some lines are selected */ + if (tb->mark) { - /* Free memory for the entry */ - autopick_free_entry(entry); + by1 = MIN(tb->my, tb->cy); + by2 = MAX(tb->my, tb->cy); + } - return; + /* No mark -- Select current line */ + else /* if (!tb->mark) */ + { + by1 = by2 = tb->cy; } - string_free(tb->lines_list[tb->cy]); - /* Remove all noun flag */ - if (FLG_NOUN_BEGIN <= flg && flg <= FLG_NOUN_END) + /* Set/Reset flag of each line */ + for (y = by1; y <= by2; y++) { - int i; - for (i = FLG_NOUN_BEGIN; i <= FLG_NOUN_END; i++) - REM_FLG(i); + autopick_type an_entry, *entry = &an_entry; + + if (!autopick_new_entry(entry, tb->lines_list[y], FALSE)) continue; + + /* There is the flag already */ + if (IS_FLG(flg)) + { + /* Free memory for the entry */ + autopick_free_entry(entry); + + continue; + } + + string_free(tb->lines_list[y]); + + /* Remove all noun flag */ + if (FLG_NOUN_BEGIN <= flg && flg <= FLG_NOUN_END) + { + int i; + for (i = FLG_NOUN_BEGIN; i <= FLG_NOUN_END; i++) + REM_FLG(i); + } + + ADD_FLG(flg); + + tb->lines_list[y] = autopick_line_from_entry_kill(entry); + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; + + /* Text is changed */ + tb->changed = TRUE; } +} - ADD_FLG(flg); - tb->lines_list[tb->cy] = autopick_line_from_entry_kill(entry); +/* + * Check if this line is expression or not. + * And update it if it is. + */ +static void check_expression_line(text_body_type *tb, int y) +{ + cptr s = tb->lines_list[y]; - /* Now dirty */ - tb->dirty_line = tb->cy; + if ((s[0] == '?' && s[1] == ':') || + (tb->states[y] & LSTAT_BYPASS)) + { + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; + } } /* - * Insert return code and split the line + * Add an empty line at the last of the file */ -static bool insert_return_code(cptr *lines_list, int cx, int cy) +static bool add_empty_line(text_body_type *tb) { - char buf[MAX_LINELEN]; - int i, j, k; + int k; - for (k = 0; lines_list[k]; k++) + for (k = 0; tb->lines_list[k]; k++) /* count number of lines */ ; + /* Too many lines! */ if (k >= MAX_LINES - 2) return FALSE; - k--; - /* Move down lines */ - for (; cy < k; k--) - lines_list[k+1] = lines_list[k]; + /* The last line is already empty */ + if (!tb->lines_list[k-1][0]) return FALSE; - /* Split current line */ - for (i = j = 0; lines_list[cy][i] && i < cx; i++) - { -#ifdef JP - if (iskanji(lines_list[cy][i])) - buf[j++] = lines_list[cy][i++]; -#endif - buf[j++] = lines_list[cy][i]; - } - buf[j] = '\0'; - lines_list[cy+1] = string_make(&lines_list[cy][i]); - string_free(lines_list[cy]); - lines_list[cy] = string_make(buf); + /* Create new empty line */ + tb->lines_list[k] = string_make(""); + + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; + + /* Text is changed */ + tb->changed = TRUE; + + /* A line is added */ return TRUE; } /* - * Get auto-picker entry from o_ptr. + * Insert return code and split the line */ -void autopick_entry_from_object(autopick_type *entry, object_type *o_ptr) +static bool insert_return_code(text_body_type *tb) { - char o_name[MAX_NLEN]; - object_desc(o_name, o_ptr, FALSE, 0); - - entry->name = string_make(o_name); - 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_aware_p(o_ptr)) - ADD_FLG(FLG_UNAWARE); - if (object_value(o_ptr) <= 0) - ADD_FLG(FLG_WORTHLESS); - - if (object_known_p(o_ptr)) - { - if (o_ptr->name2) - ADD_FLG(FLG_EGO); - else if (o_ptr->name1 || o_ptr->art_name) - ADD_FLG(FLG_ARTIFACT); - } + char buf[MAX_LINELEN]; + int i, j, k; - switch(o_ptr->tval) - { - object_kind *k_ptr; - case TV_HAFTED: case TV_POLEARM: case TV_SWORD: case TV_DIGGING: - 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); - } + for (k = 0; tb->lines_list[k]; k++) + /* count number of lines */ ; - if (o_ptr->tval == TV_CORPSE && object_is_shoukinkubi(o_ptr)) - { - REM_FLG(FLG_WORTHLESS); - ADD_FLG(FLG_WANTED); - } + if (k >= MAX_LINES - 2) return FALSE; + k--; - if ((o_ptr->tval == TV_CORPSE || o_ptr->tval == TV_STATUE) - && (r_info[o_ptr->pval].flags1 & RF1_UNIQUE)) + /* Move down lines */ + for (; tb->cy < k; k--) { - REM_FLG(FLG_WORTHLESS); - ADD_FLG(FLG_UNIQUE); + tb->lines_list[k+1] = tb->lines_list[k]; + tb->states[k+1] = tb->states[k]; } - if (o_ptr->tval == TV_CORPSE && strchr("pht", r_info[o_ptr->pval].d_char)) + /* Split current line */ + for (i = j = 0; tb->lines_list[tb->cy][i] && i < tb->cx; i++) { - REM_FLG(FLG_WORTHLESS); - ADD_FLG(FLG_HUMAN); +#ifdef JP + if (iskanji(tb->lines_list[tb->cy][i])) + buf[j++] = tb->lines_list[tb->cy][i++]; +#endif + buf[j++] = tb->lines_list[tb->cy][i]; } + buf[j] = '\0'; + tb->lines_list[tb->cy+1] = string_make(&tb->lines_list[tb->cy][i]); + string_free(tb->lines_list[tb->cy]); + tb->lines_list[tb->cy] = string_make(buf); - if (o_ptr->tval >= TV_LIFE_BOOK && - !check_book_realm(o_ptr->tval, o_ptr->sval)) - ADD_FLG(FLG_UNREADABLE); - - if (REALM1_BOOK == o_ptr->tval && - p_ptr->pclass != CLASS_SORCERER && - p_ptr->pclass != CLASS_RED_MAGE) - ADD_FLG(FLG_REALM1); - - if (REALM2_BOOK == o_ptr->tval && - p_ptr->pclass != CLASS_SORCERER && - p_ptr->pclass != CLASS_RED_MAGE) - ADD_FLG(FLG_REALM2); - - 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); + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; - if (o_ptr->tval == TV_SHOT || o_ptr->tval == TV_BOLT - || o_ptr->tval == TV_ARROW) - 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_LIFE_BOOK) - ADD_FLG(FLG_SPELLBOOKS); - else if (is_favorite(o_ptr, FALSE)) - ADD_FLG(FLG_FAVORITE); - 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); + /* Text is changed */ + tb->changed = TRUE; - return; + return TRUE; } @@ -2590,7 +3381,7 @@ static byte get_object_for_search(object_type **o_handle, cptr *search_strp) *o_handle = o_ptr; string_free(*search_strp); - object_desc(buf, *o_handle, FALSE, 3); + object_desc(buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); *search_strp = string_make(format("<%s>", buf)); return 1; } @@ -2608,7 +3399,7 @@ static byte get_destroyed_object_for_search(object_type **o_handle, cptr *search *o_handle = &autopick_last_destroyed_object; string_free(*search_strp); - object_desc(buf, *o_handle, FALSE, 3); + object_desc(buf, *o_handle, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); *search_strp = string_make(format("<%s>", buf)); return 1; } @@ -2620,46 +3411,106 @@ static byte get_destroyed_object_for_search(object_type **o_handle, cptr *search static byte get_string_for_search(object_type **o_handle, cptr *search_strp) { int pos = 0; + + /* + * Text color + * TERM_YELLOW : Overwrite mode + * TERM_WHITE : Insert mode + */ + byte color = TERM_YELLOW; char buf[MAX_NLEN+20]; + const int len = 80; #ifdef JP - int k_flag[MAX_NLEN+20]; char prompt[] = "¸¡º÷(^I:»ý¤Áʪ ^L:Ç˲õ¤µ¤ì¤¿Êª): "; #else char prompt[] = "Search key(^I:inven ^L:destroyed): "; #endif int col = sizeof(prompt) - 1; + /* Prepare string buffer for edit */ if (*search_strp) strcpy(buf, *search_strp); else buf[0] = '\0'; + /* Object searching mode */ + if (*o_handle) + { + color = TERM_L_GREEN; + } + /* Display prompt */ prt(prompt, 0, 0); - /* Display the default answer */ - Term_erase(col, 0, 255); - Term_putstr(col, 0, -1, TERM_YELLOW, buf); /* Process input */ - while (1) + while (TRUE) { bool back = FALSE; - int i; + int skey; + + /* Display the string */ + Term_erase(col, 0, 255); + Term_putstr(col, 0, -1, color, buf); /* Place cursor */ Term_gotoxy(col + pos, 0); - /* Get a key */ - i = inkey(); - - /* HACK -- ignore macro defined on ASCII keys */ - if (strlen(inkey_macro_trigger_string) == 1) - i = inkey_macro_trigger_string[0]; - + /* Get a special key code */ + skey = inkey_special(TRUE); /* Analyze the key */ - switch (i) + switch (skey) + { + case SKEY_LEFT: + case KTRL('b'): { + int i = 0; + + /* Now on insert mode */ + color = TERM_WHITE; + + /* No move at beginning of line */ + if (0 == pos) break; + + while (TRUE) + { + int next_pos = i + 1; + +#ifdef JP + if (iskanji(buf[i])) next_pos++; +#endif + + /* Is there the cursor at next position? */ + if (next_pos >= pos) break; + + /* Move to next */ + i = next_pos; + } + + /* Get previous position */ + pos = i; + + break; + } + + case SKEY_RIGHT: + case KTRL('f'): + /* Now on insert mode */ + color = TERM_WHITE; + + /* No move at end of line */ + if ('\0' == buf[pos]) break; + +#ifdef JP + /* Move right */ + if (iskanji(buf[pos])) pos += 2; + else pos++; +#else + pos++; +#endif + + break; + case ESCAPE: return 0; @@ -2670,7 +3521,7 @@ static byte get_string_for_search(object_type **o_handle, cptr *search_strp) case '\n': case '\r': case KTRL('s'): - if (!pos && *o_handle) return (back ? -1 : 1); + if (*o_handle) return (back ? -1 : 1); string_free(*search_strp); *search_strp = string_make(buf); *o_handle = NULL; @@ -2686,143 +3537,332 @@ static byte get_string_for_search(object_type **o_handle, cptr *search_strp) return 1; break; - case 0x7F: case '\010': -#ifdef JP - if (pos > 0) + { + /* Backspace */ + + int i = 0; + + /* Now on insert mode */ + color = TERM_WHITE; + + /* No move at beginning of line */ + if (0 == pos) break; + + while (TRUE) { - pos--; - if (k_flag[pos]) pos--; + int next_pos = i + 1; + +#ifdef JP + if (iskanji(buf[i])) next_pos++; +#endif + + /* Is there the cursor at next position? */ + if (next_pos >= pos) break; + + /* Move to next */ + i = next_pos; } -#else - if (pos > 0) pos--; + + /* Get previous position */ + pos = i; + + /* Fall through to 'Delete key' */ + } + + case 0x7F: + case KTRL('d'): + /* Delete key */ + { + int dst, src; + + /* Now on insert mode */ + color = TERM_WHITE; + + /* No move at end of line */ + if ('\0' == buf[pos]) break; + + /* Position of next character */ + src = pos + 1; + +#ifdef JP + /* Next character is one more byte away */ + if (iskanji(buf[pos])) src++; #endif + + dst = pos; + + /* Move characters at src to dst */ + while ('\0' != (buf[dst++] = buf[src++])) + /* loop */; + break; + } default: + { + /* Insert a character */ + + char tmp[100]; + char c; + + /* Ignore special keys */ + if (skey & SKEY_MASK) break; + + /* Get a character code */ + c = (char)skey; + + /* Was non insert mode? */ + if (color != TERM_WHITE) + { + /* Was object searching mode */ + if (color == TERM_L_GREEN) + { + /* Cancel the mode */ + *o_handle = NULL; + + /* Remove indicating string */ + string_free(*search_strp); + *search_strp = NULL; + } + + /* Overwrite default string */ + buf[0] = '\0'; + + /* Go to insert mode */ + color = TERM_WHITE; + } + + /* Save right part of string */ + strcpy(tmp, buf + pos); #ifdef JP - if (iskanji(i)) + if (iskanji(c)) { - int next; + char next; + /* Bypass macro processing */ inkey_base = TRUE; - next = inkey (); - if (pos + 1 < MAX_NLEN) + next = inkey(); + + if (pos + 1 < len) { - buf[pos++] = i; - buf[pos] = next; - k_flag[pos++] = 1; + buf[pos++] = c; + buf[pos++] = next; + } + else + { + bell(); } - else bell(); } - else if (pos < MAX_NLEN && isprint(i)) + else +#endif { - buf[pos] = i; - k_flag[pos++] = 0; - } - else bell(); +#ifdef JP + if (pos < len && (isprint(c) || iskana(c))) #else - if (pos < MAX_NLEN && isprint(i)) buf[pos++] = i; - else bell(); + if (pos < len && isprint(c)) #endif + { + buf[pos++] = c; + } + else + { + bell(); + } + } + + /* Terminate */ + buf[pos] = '\0'; + + /* Write back the left part of string */ + my_strcat(buf, tmp, len + 1); + break; + } /* default: */ + } - /* Terminate */ - buf[pos] = '\0'; + /* Object searching mode was cancelled? */ + if (*o_handle && color != TERM_L_GREEN) + { + /* Cancel the mode */ + *o_handle = NULL; - /* Update the entry */ - Term_erase(col, 0, 255); - Term_putstr(col, 0, -1, TERM_WHITE, buf); - } + /* Remove indicating string */ + buf[0] = '\0'; + string_free(*search_strp); + *search_strp = NULL; - /* Never reached */ + } + + + } /* while (TRUE) */ } /* * Search next line matches for o_ptr */ -static bool search_for_object(cptr *lines_list, object_type *o_ptr, int *cxp, int *cyp, bool forward) +static void search_for_object(text_body_type *tb, object_type *o_ptr, bool forward) { - int i; autopick_type an_entry, *entry = &an_entry; char o_name[MAX_NLEN]; + int bypassed_cy = -1; - object_desc(o_name, o_ptr, FALSE, 3); + /* Start searching from current cursor position */ + int i = tb->cy; - /* Force to be lower case string */ - for (i = 0; o_name[i]; i++) - { -#ifdef JP - if (iskanji(o_name[i])) - i++; - else -#endif - if (isupper(o_name[i])) - o_name[i] = tolower(o_name[i]); - } - - i = *cyp; + /* Prepare object name string first */ + object_desc(o_name, o_ptr, (OD_NO_FLAVOR | OD_OMIT_PREFIX | OD_NO_PLURAL)); + + /* Convert the string to lower case */ + str_tolower(o_name); - while (1) + while (TRUE) { + bool match; + + /* End of list? */ if (forward) { - if (!lines_list[++i]) break; + if (!tb->lines_list[++i]) break; } else { if (--i < 0) break; } - if (!autopick_new_entry(entry, lines_list[i])) continue; + /* Is this line is a correct entry? */ + if (!autopick_new_entry(entry, tb->lines_list[i], FALSE)) continue; + + /* Does this line match to the object? */ + match = is_autopick_aux(o_ptr, entry, o_name); + autopick_free_entry(entry); + if (!match) continue; + + /* Found a line but it's inactive */ + if (tb->states[i] & LSTAT_BYPASS) + { + /* If it is first found, remember it */ + if (bypassed_cy == -1) bypassed_cy = i; + } - if (is_autopick_aux(o_ptr, entry, o_name)) + /* Found an active line! */ + else { - *cxp = 0; - *cyp = i; - return TRUE; + /* Move to this line */ + tb->cx = 0; + tb->cy = i; + + if (bypassed_cy != -1) + { + /* Mark as some lines are skipped */ + tb->dirty_flags |= DIRTY_SKIP_INACTIVE; + } + + /* Found it! */ + return; } } - return FALSE; + if (bypassed_cy != -1) + { + /* Move to the remembered line */ + tb->cx = 0; + tb->cy = bypassed_cy; + + /* Mark as this line is inactive */ + tb->dirty_flags |= DIRTY_INACTIVE; + } + + else + { + /* Mark as NOT FOUND */ + tb->dirty_flags |= DIRTY_NOT_FOUND; + } + + return; } /* * Search next line matches to the string */ -static bool search_for_string(cptr *lines_list, cptr search_str, int *cxp, int *cyp, bool forward) +static void search_for_string(text_body_type *tb, cptr search_str, bool forward) { - int i = *cyp; + int bypassed_cy = -1; + int bypassed_cx = 0; + + /* Start searching from current cursor position */ + int i = tb->cy; - while (1) + while (TRUE) { cptr pos; + /* End of list? */ if (forward) { - if (!lines_list[++i]) break; + if (!tb->lines_list[++i]) break; } else { if (--i < 0) break; } -#ifdef JP - pos = strstr_j(lines_list[i], search_str); -#else - pos = strstr(lines_list[i], search_str); -#endif - if (pos) + + /* Look for the string pattern */ + pos = my_strstr(tb->lines_list[i], search_str); + + /* Not found! */ + if (!pos) continue; + + /* Found a line but it's inactive */ + if ((tb->states[i] & LSTAT_BYPASS) && + !(tb->states[i] & LSTAT_EXPRESSION)) { - *cxp = (int)(pos - lines_list[i]); - *cyp = i; - return TRUE; + /* If it is first found, remember it */ + if (bypassed_cy == -1) + { + bypassed_cy = i; + bypassed_cx = (int)(pos - tb->lines_list[i]); + } + } + + /* Found an active line! */ + else + { + /* Move to this location */ + tb->cx = (int)(pos - tb->lines_list[i]); + tb->cy = i; + + if (bypassed_cy != -1) + { + /* Mark as some lines are skipped */ + tb->dirty_flags |= DIRTY_SKIP_INACTIVE; + } + + /* Found it! */ + return; } } - return FALSE; + if (bypassed_cy != -1) + { + /* Move to the remembered line */ + tb->cx = bypassed_cx; + tb->cy = bypassed_cy; + + /* Mark as this line is inactive */ + tb->dirty_flags |= DIRTY_INACTIVE; + } + + else + { + /* Mark as NOT FOUND */ + tb->dirty_flags |= DIRTY_NOT_FOUND; + } + + return; } @@ -2832,226 +3872,230 @@ static bool search_for_string(cptr *lines_list, cptr search_str, int *cxp, int * * Editor command id's */ #define EC_QUIT 1 -#define EC_REVERT 2 -#define EC_HELP 3 -#define EC_RETURN 4 -#define EC_LEFT 5 -#define EC_DOWN 6 -#define EC_UP 7 -#define EC_RIGHT 8 -#define EC_BOL 9 -#define EC_EOL 10 -#define EC_PGUP 11 -#define EC_PGDOWN 12 -#define EC_TOP 13 -#define EC_BOTTOM 14 -#define EC_CUT 15 -#define EC_COPY 16 -#define EC_PASTE 17 -#define EC_BLOCK 18 -#define EC_KILL_LINE 19 -#define EC_DELETE_CHAR 20 -#define EC_BACKSPACE 21 -#define EC_SEARCH_STR 22 -#define EC_SEARCH_FORW 23 -#define EC_SEARCH_BACK 24 -#define EC_SEARCH_OBJ 25 -#define EC_SEARCH_DESTROYED 26 -#define EC_INSERT_OBJECT 27 -#define EC_INSERT_DESTROYED 28 -#define EC_INSERT_BLOCK 29 -#define EC_INSERT_MACRO 30 -#define EC_INSERT_KEYMAP 31 -#define EC_CL_AUTOPICK 32 -#define EC_CL_DESTROY 33 -#define EC_CL_LEAVE 34 -#define EC_CL_QUERY 35 -#define EC_CL_NO_DISP 36 -#define EC_OK_COLLECTING 37 -#define EC_IK_UNAWARE 38 -#define EC_IK_UNIDENTIFIED 39 -#define EC_IK_IDENTIFIED 40 -#define EC_IK_STAR_IDENTIFIED 41 -#define EC_OK_BOOSTED 42 -#define EC_OK_MORE_THAN 43 -#define EC_OK_MORE_BONUS 44 -#define EC_OK_WORTHLESS 45 -#define EC_OK_ARTIFACT 46 -#define EC_OK_EGO 47 -#define EC_OK_NAMELESS 48 -#define EC_OK_WANTED 49 -#define EC_OK_UNIQUE 50 -#define EC_OK_HUMAN 51 -#define EC_OK_UNREADABLE 52 -#define EC_OK_REALM1 53 -#define EC_OK_REALM2 54 -#define EC_OK_FIRST 55 -#define EC_OK_SECOND 56 -#define EC_OK_THIRD 57 -#define EC_OK_FOURTH 58 -#define EC_KK_WEAPONS 59 -#define EC_KK_FAVORITE 60 -#define EC_KK_ARMORS 61 -#define EC_KK_MISSILES 62 -#define EC_KK_DEVICES 63 -#define EC_KK_LIGHTS 64 -#define EC_KK_JUNKS 65 -#define EC_KK_SPELLBOOKS 66 -#define EC_KK_SHIELDS 67 -#define EC_KK_BOWS 68 -#define EC_KK_RINGS 69 -#define EC_KK_AMULETS 70 -#define EC_KK_SUITS 71 -#define EC_KK_CLOAKS 72 -#define EC_KK_HELMS 73 -#define EC_KK_GLOVES 74 -#define EC_KK_BOOTS 75 +#define EC_SAVEQUIT 2 +#define EC_REVERT 3 +#define EC_HELP 4 +#define EC_RETURN 5 +#define EC_LEFT 6 +#define EC_DOWN 7 +#define EC_UP 8 +#define EC_RIGHT 9 +#define EC_BOL 10 +#define EC_EOL 11 +#define EC_PGUP 12 +#define EC_PGDOWN 13 +#define EC_TOP 14 +#define EC_BOTTOM 15 +#define EC_CUT 16 +#define EC_COPY 17 +#define EC_PASTE 18 +#define EC_BLOCK 19 +#define EC_KILL_LINE 20 +#define EC_DELETE_CHAR 21 +#define EC_BACKSPACE 22 +#define EC_SEARCH_STR 23 +#define EC_SEARCH_FORW 24 +#define EC_SEARCH_BACK 25 +#define EC_SEARCH_OBJ 26 +#define EC_SEARCH_DESTROYED 27 +#define EC_INSERT_OBJECT 28 +#define EC_INSERT_DESTROYED 29 +#define EC_INSERT_BLOCK 30 +#define EC_INSERT_MACRO 31 +#define EC_INSERT_KEYMAP 32 +#define EC_CL_AUTOPICK 33 +#define EC_CL_DESTROY 34 +#define EC_CL_LEAVE 35 +#define EC_CL_QUERY 36 +#define EC_CL_NO_DISP 37 +#define EC_OK_COLLECTING 38 +#define EC_IK_UNAWARE 39 +#define EC_IK_UNIDENTIFIED 40 +#define EC_IK_IDENTIFIED 41 +#define EC_IK_STAR_IDENTIFIED 42 +#define EC_OK_BOOSTED 43 +#define EC_OK_MORE_DICE 44 +#define EC_OK_MORE_BONUS 45 +#define EC_OK_WORTHLESS 46 +#define EC_OK_ARTIFACT 47 +#define EC_OK_EGO 48 +#define EC_OK_GOOD 49 +#define EC_OK_NAMELESS 50 +#define EC_OK_AVERAGE 51 +#define EC_OK_RARE 52 +#define EC_OK_COMMON 53 +#define EC_OK_WANTED 54 +#define EC_OK_UNIQUE 55 +#define EC_OK_HUMAN 56 +#define EC_OK_UNREADABLE 57 +#define EC_OK_REALM1 58 +#define EC_OK_REALM2 59 +#define EC_OK_FIRST 60 +#define EC_OK_SECOND 61 +#define EC_OK_THIRD 62 +#define EC_OK_FOURTH 63 +#define EC_KK_WEAPONS 64 +#define EC_KK_FAVORITE_WEAPONS 65 +#define EC_KK_ARMORS 66 +#define EC_KK_MISSILES 67 +#define EC_KK_DEVICES 68 +#define EC_KK_LIGHTS 69 +#define EC_KK_JUNKS 70 +#define EC_KK_CORPSES 71 +#define EC_KK_SPELLBOOKS 72 +#define EC_KK_SHIELDS 73 +#define EC_KK_BOWS 74 +#define EC_KK_RINGS 75 +#define EC_KK_AMULETS 76 +#define EC_KK_SUITS 77 +#define EC_KK_CLOAKS 78 +#define EC_KK_HELMS 79 +#define EC_KK_GLOVES 80 +#define EC_KK_BOOTS 81 /* Manu names */ #ifdef JP -#define MN_QUIT "¥»¡¼¥Ö¤·¤Æ½ªÎ»" -#define MN_REVERT "Á´¤Æ¤ÎÊѹ¹¤òÇË´þ" -#define MN_HELP "¥Ø¥ë¥×" - -#define MN_MOVE "¥«¡¼¥½¥ë°ÜÆ°" -#define MN_LEFT "º¸" -#define MN_DOWN "²¼" -#define MN_UP "¾å" -#define MN_RIGHT "±¦" -#define MN_BOL "¹Ô¤ÎÀèƬ" -#define MN_EOL "¹Ô¤Î½ªÃ¼" -#define MN_PGUP "¾å¤Î¥Ú¡¼¥¸" -#define MN_PGDOWN "²¼¤Î¥Ú¡¼¥¸" -#define MN_TOP "1¹ÔÌܤذÜÆ°" -#define MN_BOTTOM "ºÇ²¼¹Ô¤Ø°ÜÆ°" - -#define MN_EDIT "ÊÔ½¸" -#define MN_CUT "ÁªÂòÈϰϤò¥«¥Ã¥È" -#define MN_COPY "ÁªÂòÈϰϤò¥³¥Ô¡¼" -#define MN_PASTE "¥Ú¡¼¥¹¥È" -#define MN_BLOCK "ÁªÂòÈϰϤλØÄê" -#define MN_KILL_LINE "¹Ô¤Î»Ä¤ê¤òºï½ü" -#define MN_DELETE_CHAR "1ʸ»úºï½ü" -#define MN_BACKSPACE "¥Ð¥Ã¥¯¥¹¥Ú¡¼¥¹" -#define MN_RETURN "²þ¹Ô" -#define MN_RETURN "²þ¹Ô" - -#define MN_SEARCH "¸¡º÷" -#define MN_SEARCH_STR "ʸ»úÎó¤Ç¸¡º÷" -#define MN_SEARCH_FORW "Á°Êý¤ØºÆ¸¡º÷" -#define MN_SEARCH_BACK "¸åÊý¤ØºÆ¸¡º÷" -#define MN_SEARCH_OBJ "¥¢¥¤¥Æ¥à¤òÁªÂò¤·¤Æ¸¡º÷" -#define MN_SEARCH_DESTROYED "¼«Æ°Ç˲õ¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Ç¸¡º÷" - -#define MN_INSERT "¿§¡¹ÁÞÆþ" -#define MN_INSERT_OBJECT "ÁªÂò¤·¤¿¥¢¥¤¥Æ¥à¤Î̾Á°¤òÁÞÆþ" -#define MN_INSERT_DESTROYED "¼«Æ°Ç˲õ¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Î̾Á°¤òÁÞÆþ" -#define MN_INSERT_BLOCK "¾ò·ïʬ´ô¥Ö¥í¥Ã¥¯¤ÎÎã¤òÁÞÆþ" -#define MN_INSERT_MACRO "¥Þ¥¯¥íÄêµÁ¤òÁÞÆþ" -#define MN_INSERT_KEYMAP "¥­¡¼¥Þ¥Ã¥×ÄêµÁ¤òÁÞÆþ" - -#define MN_COMMAND_LETTER "½¦¤¤/Ç˲õ/ÊüÃÖ¤ÎÁªÂò" -#define MN_CL_AUTOPICK "¡Ö ¡× (¼«Æ°½¦¤¤)" -#define MN_CL_DESTROY "¡Ö!¡× (¼«Æ°Ç˲õ)" -#define MN_CL_LEAVE "¡Ö~¡× (ÊüÃÖ)" -#define MN_CL_QUERY "¡Ö;¡× (³Îǧ¤·¤Æ½¦¤¦)" -#define MN_CL_NO_DISP "¡Ö(¡× (¥Þ¥Ã¥×¥³¥Þ¥ó¥É¤Çɽ¼¨¤·¤Ê¤¤)" - -#define MN_ADJECTIVE_GEN "·ÁÍÆ»ì(°ìÈÌ)¤ÎÁªÂò" - -#define MN_ADJECTIVE_SPECIAL "·ÁÍÆ»ì(Æüì)¤ÎÁªÂò" -#define MN_BOOSTED "¥À¥¤¥¹Ìܤΰ㤦 (Éð´ï)" -#define MN_MORE_THAN "¥À¥¤¥¹ÌÜ # °Ê¾å¤Î (Éð´ï)" -#define MN_MORE_BONUS "½¤ÀµÃÍ # °Ê¾å¤Î (»ØÎØÅù)" -#define MN_ARTIFACT "¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È (ÁõÈ÷)" -#define MN_EGO "¥¨¥´ (ÁõÈ÷)" -#define MN_NAMELESS "̵ÌäΠ(ÁõÈ÷)" -#define MN_WANTED "¾Þ¶â¼ó¤Î (»àÂÎ)" -#define MN_UNIQUE "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î (»àÂÎ)" -#define MN_HUMAN "¿Í´Ö¤Î (»àÂÎ)" -#define MN_UNREADABLE "Æɤá¤Ê¤¤ (ËâË¡½ñ)" -#define MN_REALM1 "Âè°ìÎΰè¤Î (ËâË¡½ñ)" -#define MN_REALM2 "ÂèÆóÎΰè¤Î (ËâË¡½ñ)" -#define MN_FIRST "1ºýÌܤΠ(ËâË¡½ñ)" -#define MN_SECOND "2ºýÌܤΠ(ËâË¡½ñ)" -#define MN_THIRD "3ºýÌܤΠ(ËâË¡½ñ)" -#define MN_FOURTH "4ºýÌܤΠ(ËâË¡½ñ)" - -#define MN_NOUN "̾»ì¤ÎÁªÂò" +static char MN_QUIT[] = "¥»¡¼¥Ö̵¤·¤Ç½ªÎ»"; +static char MN_SAVEQUIT[] = "¥»¡¼¥Ö¤·¤Æ½ªÎ»"; +static char MN_REVERT[] = "Á´¤Æ¤ÎÊѹ¹¤òÇË´þ"; +static char MN_HELP[] = "¥Ø¥ë¥×"; + +static char MN_MOVE[] = "¥«¡¼¥½¥ë°ÜÆ°"; +static char MN_LEFT[] = "º¸ (¢«Ìð°õ¥­¡¼)"; +static char MN_DOWN[] = "²¼ (¢­Ìð°õ¥­¡¼)"; +static char MN_UP[] = "¾å (¢¬Ìð°õ¥­¡¼)"; +static char MN_RIGHT[] = "±¦ (¢ªÌð°õ¥­¡¼)"; +static char MN_BOL[] = "¹Ô¤ÎÀèƬ"; +static char MN_EOL[] = "¹Ô¤Î½ªÃ¼"; +static char MN_PGUP[] = "¾å¤Î¥Ú¡¼¥¸ (PageUp¥­¡¼)"; +static char MN_PGDOWN[] = "²¼¤Î¥Ú¡¼¥¸ (PageDown¥­¡¼)"; +static char MN_TOP[] = "1¹ÔÌܤذÜÆ° (Home¥­¡¼)"; +static char MN_BOTTOM[] = "ºÇ²¼¹Ô¤Ø°ÜÆ°(End¥­¡¼)"; + +static char MN_EDIT[] = "ÊÔ½¸"; +static char MN_CUT[] = "¥«¥Ã¥È"; +static char MN_COPY[] = "¥³¥Ô¡¼"; +static char MN_PASTE[] = "¥Ú¡¼¥¹¥È"; +static char MN_BLOCK[] = "ÁªÂòÈϰϤλØÄê"; +static char MN_KILL_LINE[] = "¹Ô¤Î»Ä¤ê¤òºï½ü"; +static char MN_DELETE_CHAR[] = "1ʸ»úºï½ü"; +static char MN_BACKSPACE[] = "¥Ð¥Ã¥¯¥¹¥Ú¡¼¥¹"; +static char MN_RETURN[] = "²þ¹Ô"; + +static char MN_SEARCH[] = "¸¡º÷"; +static char MN_SEARCH_STR[] = "ʸ»úÎó¤Ç¸¡º÷"; +static char MN_SEARCH_FORW[] = "Á°Êý¤ØºÆ¸¡º÷"; +static char MN_SEARCH_BACK[] = "¸åÊý¤ØºÆ¸¡º÷"; +static char MN_SEARCH_OBJ[] = "¥¢¥¤¥Æ¥à¤òÁªÂò¤·¤Æ¸¡º÷"; +static char MN_SEARCH_DESTROYED[] = "¼«Æ°Ç˲õ¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Ç¸¡º÷"; + +static char MN_INSERT[] = "¿§¡¹ÁÞÆþ"; +static char MN_INSERT_OBJECT[] = "ÁªÂò¤·¤¿¥¢¥¤¥Æ¥à¤Î̾Á°¤òÁÞÆþ"; +static char MN_INSERT_DESTROYED[] = "¼«Æ°Ç˲õ¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤Î̾Á°¤òÁÞÆþ"; +static char MN_INSERT_BLOCK[] = "¾ò·ïʬ´ô¥Ö¥í¥Ã¥¯¤ÎÎã¤òÁÞÆþ"; +static char MN_INSERT_MACRO[] = "¥Þ¥¯¥íÄêµÁ¤òÁÞÆþ"; +static char MN_INSERT_KEYMAP[] = "¥­¡¼¥Þ¥Ã¥×ÄêµÁ¤òÁÞÆþ"; + +static char MN_COMMAND_LETTER[] = "½¦¤¤/Ç˲õ/ÊüÃÖ¤ÎÁªÂò"; +static char MN_CL_AUTOPICK[] = "¡Ö ¡× (¼«Æ°½¦¤¤)"; +static char MN_CL_DESTROY[] = "¡Ö!¡× (¼«Æ°Ç˲õ)"; +static char MN_CL_LEAVE[] = "¡Ö~¡× (ÊüÃÖ)"; +static char MN_CL_QUERY[] = "¡Ö;¡× (³Îǧ¤·¤Æ½¦¤¦)"; +static char MN_CL_NO_DISP[] = "¡Ö(¡× (¥Þ¥Ã¥×¥³¥Þ¥ó¥É¤Çɽ¼¨¤·¤Ê¤¤)"; + +static char MN_ADJECTIVE_GEN[] = "·ÁÍÆ»ì(°ìÈÌ)¤ÎÁªÂò"; +static char MN_RARE[] = "¥ì¥¢¤Ê (ÁõÈ÷)"; +static char MN_COMMON[] = "¤¢¤ê¤Õ¤ì¤¿ (ÁõÈ÷)"; + +static char MN_ADJECTIVE_SPECIAL[] = "·ÁÍÆ»ì(Æüì)¤ÎÁªÂò"; +static char MN_BOOSTED[] = "¥À¥¤¥¹Ìܤΰ㤦 (Éð´ï)"; +static char MN_MORE_DICE[] = "¥À¥¤¥¹ÌÜ # °Ê¾å¤Î (Éð´ï)"; +static char MN_MORE_BONUS[] = "½¤ÀµÃÍ # °Ê¾å¤Î (»ØÎØÅù)"; +static char MN_WANTED[] = "¾Þ¶â¼ó¤Î (»àÂÎ)"; +static char MN_UNIQUE[] = "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î (»àÂÎ)"; +static char MN_HUMAN[] = "¿Í´Ö¤Î (»àÂÎ)"; +static char MN_UNREADABLE[] = "Æɤá¤Ê¤¤ (ËâË¡½ñ)"; +static char MN_REALM1[] = "Âè°ìÎΰè¤Î (ËâË¡½ñ)"; +static char MN_REALM2[] = "ÂèÆóÎΰè¤Î (ËâË¡½ñ)"; +static char MN_FIRST[] = "1ºýÌܤΠ(ËâË¡½ñ)"; +static char MN_SECOND[] = "2ºýÌܤΠ(ËâË¡½ñ)"; +static char MN_THIRD[] = "3ºýÌܤΠ(ËâË¡½ñ)"; +static char MN_FOURTH[] = "4ºýÌܤΠ(ËâË¡½ñ)"; + +static char MN_NOUN[] = "̾»ì¤ÎÁªÂò"; #else -#define MN_QUIT "Save & Quit" -#define MN_REVERT "Revert all changes" -#define MN_HELP "Help" - -#define MN_MOVE "Move cursor" -#define MN_LEFT "Left" -#define MN_DOWN "Down" -#define MN_UP "Up" -#define MN_RIGHT "Right" -#define MN_BOL "Beggining of line" -#define MN_EOL "End of line" -#define MN_PGUP "Page up" -#define MN_PGDOWN "Page down" -#define MN_TOP "Top" -#define MN_BOTTOM "Bottom" - -#define MN_EDIT "Edit" -#define MN_CUT "Cut" -#define MN_COPY "Copy" -#define MN_PASTE "Paste" -#define MN_BLOCK "Select block" -#define MN_KILL_LINE "Kill rest of line" -#define MN_DELETE_CHAR "Delete character" -#define MN_BACKSPACE "Backspace" -#define MN_RETURN "Return" -#define MN_RETURN "Return" - -#define MN_SEARCH "Search" -#define MN_SEARCH_STR "Search by string" -#define MN_SEARCH_FORW "Search forward" -#define MN_SEARCH_BACK "Search backward" -#define MN_SEARCH_OBJ "Search by inventory object" -#define MN_SEARCH_DESTROYED "Search by destroyed object" - -#define MN_INSERT "Insert..." -#define MN_INSERT_OBJECT "Insert name of choosen object" -#define MN_INSERT_DESTROYED "Insert name of destroyed object" -#define MN_INSERT_BLOCK "Insert conditional block" -#define MN_INSERT_MACRO "Insert a macro definition" -#define MN_INSERT_KEYMAP "Insert a keymap definition" - -#define MN_COMMAND_LETTER "Command letter" -#define MN_CL_AUTOPICK "' ' (Auto pick)" -#define MN_CL_DESTROY "'!' (Auto destroy)" -#define MN_CL_LEAVE "'~' (Leave it on the floor)" -#define MN_CL_QUERY "';' (Query to pick up)" -#define MN_CL_NO_DISP "'(' (No display on the large map)" - -#define MN_ADJECTIVE_GEN "Adjective (general)" - -#define MN_ADJECTIVE_SPECIAL "Adjective (special)" -#define MN_BOOSTED "dice boosted (weapons)" -#define MN_MORE_THAN "more than # dice (weapons)" -#define MN_MORE_BONUS "more bonus than # (rings etc.)" -#define MN_ARTIFACT "artifact (equipments)" -#define MN_EGO "ego (equipments)" -#define MN_NAMELESS "nameless (equipments)" -#define MN_WANTED "wanted (corpse)" -#define MN_UNIQUE "unique (corpse)" -#define MN_HUMAN "human (corpse)" -#define MN_UNREADABLE "unreadable (spellbooks)" -#define MN_REALM1 "realm1 (spellbooks)" -#define MN_REALM2 "realm2 (spellbooks)" -#define MN_FIRST "first (spellbooks)" -#define MN_SECOND "second (spellbooks)" -#define MN_THIRD "third (spellbooks)" -#define MN_FOURTH "fourth (spellbooks)" - -#define MN_NOUN "Keywords (noun)" +static char MN_QUIT[] = "Quit without save"; +static char MN_SAVEQUIT[] = "Save & Quit"; +static char MN_REVERT[] = "Revert all changes"; +static char MN_HELP[] = "Help"; + +static char MN_MOVE[] = "Move cursor"; +static char MN_LEFT[] = "Left (Left Arrow key)"; +static char MN_DOWN[] = "Down (Down Arrow key)"; +static char MN_UP[] = "Up (Up Arrow key)"; +static char MN_RIGHT[] = "Right (Right Arrow key)"; +static char MN_BOL[] = "Beggining of line"; +static char MN_EOL[] = "End of line"; +static char MN_PGUP[] = "Page up (PageUp key)"; +static char MN_PGDOWN[] = "Page down(PageDown key)"; +static char MN_TOP[] = "Top (Home key)"; +static char MN_BOTTOM[] = "Bottom (End key)"; + +static char MN_EDIT[] = "Edit"; +static char MN_CUT[] = "Cut"; +static char MN_COPY[] = "Copy"; +static char MN_PASTE[] = "Paste"; +static char MN_BLOCK[] = "Select block"; +static char MN_KILL_LINE[] = "Kill rest of line"; +static char MN_DELETE_CHAR[] = "Delete character"; +static char MN_BACKSPACE[] = "Backspace"; +static char MN_RETURN[] = "Return"; + +static char MN_SEARCH[] = "Search"; +static char MN_SEARCH_STR[] = "Search by string"; +static char MN_SEARCH_FORW[] = "Search forward"; +static char MN_SEARCH_BACK[] = "Search backward"; +static char MN_SEARCH_OBJ[] = "Search by inventory object"; +static char MN_SEARCH_DESTROYED[] = "Search by destroyed object"; + +static char MN_INSERT[] = "Insert..."; +static char MN_INSERT_OBJECT[] = "Insert name of choosen object"; +static char MN_INSERT_DESTROYED[] = "Insert name of destroyed object"; +static char MN_INSERT_BLOCK[] = "Insert conditional block"; +static char MN_INSERT_MACRO[] = "Insert a macro definition"; +static char MN_INSERT_KEYMAP[] = "Insert a keymap definition"; + +static char MN_COMMAND_LETTER[] = "Command letter"; +static char MN_CL_AUTOPICK[] = "' ' (Auto pick)"; +static char MN_CL_DESTROY[] = "'!' (Auto destroy)"; +static char MN_CL_LEAVE[] = "'~' (Leave it on the floor)"; +static char MN_CL_QUERY[] = "';' (Query to pick up)"; +static char MN_CL_NO_DISP[] = "'(' (No display on the large map)"; + +static char MN_ADJECTIVE_GEN[] = "Adjective (general)"; +static char MN_RARE[] = "rare (equipments)"; +static char MN_COMMON[] = "common (equipments)"; + +static char MN_ADJECTIVE_SPECIAL[] = "Adjective (special)"; +static char MN_BOOSTED[] = "dice boosted (weapons)"; +static char MN_MORE_DICE[] = "more than # dice (weapons)"; +static char MN_MORE_BONUS[] = "more bonus than # (rings etc.)"; +static char MN_WANTED[] = "wanted (corpse)"; +static char MN_UNIQUE[] = "unique (corpse)"; +static char MN_HUMAN[] = "human (corpse)"; +static char MN_UNREADABLE[] = "unreadable (spellbooks)"; +static char MN_REALM1[] = "realm1 (spellbooks)"; +static char MN_REALM2[] = "realm2 (spellbooks)"; +static char MN_FIRST[] = "first (spellbooks)"; +static char MN_SECOND[] = "second (spellbooks)"; +static char MN_THIRD[] = "third (spellbooks)"; +static char MN_FOURTH[] = "fourth (spellbooks)"; + +static char MN_NOUN[] = "Keywords (noun)"; #endif @@ -3066,21 +4110,10 @@ typedef struct { command_menu_type menu_data[] = { + {MN_HELP, 0, -1, EC_HELP}, {MN_QUIT, 0, KTRL('q'), EC_QUIT}, + {MN_SAVEQUIT, 0, KTRL('w'), EC_SAVEQUIT}, {MN_REVERT, 0, KTRL('z'), EC_REVERT}, - {MN_HELP, 0, -1, EC_HELP}, - - {MN_MOVE, 0, -1, -1}, - {MN_LEFT, 1, KTRL('b'), EC_LEFT}, - {MN_DOWN, 1, KTRL('n'), EC_DOWN}, - {MN_UP, 1, KTRL('p'), EC_UP}, - {MN_RIGHT, 1, KTRL('f'), EC_RIGHT}, - {MN_BOL, 1, KTRL('a'), EC_BOL}, - {MN_EOL, 1, KTRL('e'), EC_EOL}, - {MN_PGUP, 1, KTRL('o'), EC_PGUP}, - {MN_PGDOWN, 1, KTRL('l'), EC_PGDOWN}, - {MN_TOP, 1, KTRL('y'), EC_TOP}, - {MN_BOTTOM, 1, KTRL('u'), EC_BOTTOM}, {MN_EDIT, 0, -1, -1}, {MN_CUT, 1, KTRL('x'), EC_CUT}, @@ -3097,9 +4130,21 @@ command_menu_type menu_data[] = {MN_SEARCH_STR, 1, KTRL('s'), EC_SEARCH_STR}, {MN_SEARCH_FORW, 1, -1, EC_SEARCH_FORW}, {MN_SEARCH_BACK, 1, KTRL('r'), EC_SEARCH_BACK}, - {MN_SEARCH_OBJ, 1, -1, EC_SEARCH_OBJ}, + {MN_SEARCH_OBJ, 1, KTRL('y'), EC_SEARCH_OBJ}, {MN_SEARCH_DESTROYED, 1, -1, EC_SEARCH_DESTROYED}, + {MN_MOVE, 0, -1, -1}, + {MN_LEFT, 1, KTRL('b'), EC_LEFT}, + {MN_DOWN, 1, KTRL('n'), EC_DOWN}, + {MN_UP, 1, KTRL('p'), EC_UP}, + {MN_RIGHT, 1, KTRL('f'), EC_RIGHT}, + {MN_BOL, 1, KTRL('a'), EC_BOL}, + {MN_EOL, 1, KTRL('e'), EC_EOL}, + {MN_PGUP, 1, KTRL('o'), EC_PGUP}, + {MN_PGDOWN, 1, KTRL('l'), EC_PGDOWN}, + {MN_TOP, 1, KTRL('t'), EC_TOP}, + {MN_BOTTOM, 1, KTRL('u'), EC_BOTTOM}, + {MN_INSERT, 0, -1, -1}, {MN_INSERT_OBJECT, 1, KTRL('i'), EC_INSERT_OBJECT}, {MN_INSERT_DESTROYED, 1, -1, EC_INSERT_DESTROYED}, @@ -3107,28 +4152,25 @@ command_menu_type menu_data[] = {MN_INSERT_MACRO, 1, -1, EC_INSERT_MACRO}, {MN_INSERT_KEYMAP, 1, -1, EC_INSERT_KEYMAP}, - {MN_COMMAND_LETTER, 0, -1, -1}, - {MN_CL_AUTOPICK, 1, -1, EC_CL_AUTOPICK}, - {MN_CL_DESTROY, 1, -1, EC_CL_DESTROY}, - {MN_CL_LEAVE, 1, -1, EC_CL_LEAVE}, - {MN_CL_QUERY, 1, -1, EC_CL_QUERY}, - {MN_CL_NO_DISP, 1, -1, EC_CL_NO_DISP}, - {MN_ADJECTIVE_GEN, 0, -1, -1}, {KEY_UNAWARE, 1, -1, EC_IK_UNAWARE}, {KEY_UNIDENTIFIED, 1, -1, EC_IK_UNIDENTIFIED}, {KEY_IDENTIFIED, 1, -1, EC_IK_IDENTIFIED}, {KEY_STAR_IDENTIFIED, 1, -1, EC_IK_STAR_IDENTIFIED}, {KEY_COLLECTING, 1, -1, EC_OK_COLLECTING}, + {KEY_ARTIFACT, 1, -1, EC_OK_ARTIFACT}, + {KEY_EGO, 1, -1, EC_OK_EGO}, + {KEY_GOOD, 1, -1, EC_OK_GOOD}, + {KEY_NAMELESS, 1, -1, EC_OK_NAMELESS}, + {KEY_AVERAGE, 1, -1, EC_OK_AVERAGE}, {KEY_WORTHLESS, 1, -1, EC_OK_WORTHLESS}, + {MN_RARE, 1, -1, EC_OK_RARE}, + {MN_COMMON, 1, -1, EC_OK_COMMON}, {MN_ADJECTIVE_SPECIAL, 0, -1, -1}, {MN_BOOSTED, 1, -1, EC_OK_BOOSTED}, - {MN_MORE_THAN, 1, -1, EC_OK_MORE_THAN}, + {MN_MORE_DICE, 1, -1, EC_OK_MORE_DICE}, {MN_MORE_BONUS, 1, -1, EC_OK_MORE_BONUS}, - {MN_ARTIFACT, 1, -1, EC_OK_ARTIFACT}, - {MN_EGO, 1, -1, EC_OK_EGO}, - {MN_NAMELESS, 1, -1, EC_OK_NAMELESS}, {MN_WANTED, 1, -1, EC_OK_WANTED}, {MN_UNIQUE, 1, -1, EC_OK_UNIQUE}, {MN_HUMAN, 1, -1, EC_OK_HUMAN}, @@ -3142,12 +4184,13 @@ command_menu_type menu_data[] = {MN_NOUN, 0, -1, -1}, {KEY_WEAPONS, 1, -1, EC_KK_WEAPONS}, - {KEY_FAVORITE, 1, -1, EC_KK_FAVORITE}, + {KEY_FAVORITE_WEAPONS, 1, -1, EC_KK_FAVORITE_WEAPONS}, {KEY_ARMORS, 1, -1, EC_KK_ARMORS}, {KEY_MISSILES, 1, -1, EC_KK_MISSILES}, {KEY_DEVICES, 1, -1, EC_KK_DEVICES}, {KEY_LIGHTS, 1, -1, EC_KK_LIGHTS}, {KEY_JUNKS, 1, -1, EC_KK_JUNKS}, + {KEY_CORPSES, 1, -1, EC_KK_CORPSES}, {KEY_SPELLBOOKS, 1, -1, EC_KK_SPELLBOOKS}, {KEY_SHIELDS, 1, -1, EC_KK_SHIELDS}, {KEY_BOWS, 1, -1, EC_KK_BOWS}, @@ -3159,6 +4202,15 @@ command_menu_type menu_data[] = {KEY_GLOVES, 1, -1, EC_KK_GLOVES}, {KEY_BOOTS, 1, -1, EC_KK_BOOTS}, + {MN_COMMAND_LETTER, 0, -1, -1}, + {MN_CL_AUTOPICK, 1, -1, EC_CL_AUTOPICK}, + {MN_CL_DESTROY, 1, -1, EC_CL_DESTROY}, + {MN_CL_LEAVE, 1, -1, EC_CL_LEAVE}, + {MN_CL_QUERY, 1, -1, EC_CL_QUERY}, + {MN_CL_NO_DISP, 1, -1, EC_CL_NO_DISP}, + + {MN_DELETE_CHAR, -1, 0x7F, EC_DELETE_CHAR}, + {NULL, -1, -1, 0} }; @@ -3231,7 +4283,7 @@ static int do_command_menu(int level, int start) } strcat(linestr, "+"); - while (1) + while (TRUE) { int com_id; char key; @@ -3346,6 +4398,7 @@ static void kill_yank_chain(text_body_type *tb) { chain_str_type *chain = tb->yank; tb->yank = NULL; + tb->yank_eol = TRUE; while (chain) { @@ -3354,36 +4407,121 @@ static void kill_yank_chain(text_body_type *tb) rnfree(chain, sizeof(chain_str_type) + len * sizeof(char)); - chain = next; + chain = next; + } +} + + +static void add_str_to_yank(text_body_type *tb, cptr str) +{ + chain_str_type *chain; + + tb->yank_eol = FALSE; + + if (NULL == tb->yank) + { + tb->yank = new_chain_str(str); + return; + } + + chain = tb->yank; + + while (TRUE) + { + if (!chain->next) + { + chain->next = new_chain_str(str); + return; + } + + /* Go to next */ + chain = chain->next; + } +} + + +/* + * Do work for the copy editor-command + */ +static void copy_text_to_yank(text_body_type *tb) +{ + int len = strlen(tb->lines_list[tb->cy]); + + /* Correct cursor location */ + if (tb->cx > len) tb->cx = len; + + /* Use single line? */ + if (!tb->mark) + { + /* Select a single line */ + tb->cx = 0; + tb->my = tb->cy; + tb->mx = len; + } + + /* Kill old yank buffer */ + kill_yank_chain(tb); + + + /* Single line case */ + if (tb->my == tb->cy) + { + int i; + char buf[MAX_LINELEN]; + int bx1 = MIN(tb->mx, tb->cx); + int bx2 = MAX(tb->mx, tb->cx); + + /* Correct fake cursor position */ + if (bx2 > len) bx2 = len; + + /* Whole part of this line is selected */ + if (bx1 == 0 && bx2 == len) + { + /* Copy this line */ + add_str_to_yank(tb, tb->lines_list[tb->cy]); + + /* Add end of line to the buffer */ + add_str_to_yank(tb, ""); + } + + /* Segment of this line is selected */ + else + { + for (i = 0; i < bx2 - bx1; i++) + { + buf[i] = tb->lines_list[tb->cy][bx1 + i]; + } + buf[i] = '\0'; + + /* Copy this segment of line */ + add_str_to_yank(tb, buf); + } } -} - - -static void add_str_to_yank(text_body_type *tb, cptr str) -{ - chain_str_type *chain; - - tb->yank_eol = FALSE; - if (NULL == tb->yank) + /* Multiple lines case */ + else /* if (tb->my != tb->cy) */ { - tb->yank = new_chain_str(str); - return; - } + int y; - chain = tb->yank; + int by1 = MIN(tb->my, tb->cy); + int by2 = MAX(tb->my, tb->cy); - while (1) - { - if (!chain->next) + /* Copy lines */ + for (y = by1; y <= by2; y++) { - chain->next = new_chain_str(str); - return; + /* Copy this line */ + add_str_to_yank(tb, tb->lines_list[y]); } - /* Go to next */ - chain = chain->next; + /* Add final end of line to the buffer */ + add_str_to_yank(tb, ""); } + + /* Disable selection */ + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; } @@ -3395,7 +4533,7 @@ static void add_str_to_yank(text_body_type *tb, cptr str) static void draw_text_editor(text_body_type *tb) { int i; - int by1 = -1, bx1 = -1, by2 = -1, bx2 = -1; + int by1 = 0, by2 = 0; /* Get size */ Term_get_size(&tb->wid, &tb->hgt); @@ -3414,7 +4552,12 @@ static void draw_text_editor(text_body_type *tb) i++; if (i == tb->cx) { - tb->cx--; + /* + * Move to a correct position in the + * left or right + */ + if (i & 1) tb->cx--; + else tb->cx++; break; } } @@ -3462,28 +4605,56 @@ static void draw_text_editor(text_body_type *tb) Term_putstr(0, tb->hgt + 1, sepa_length, TERM_WHITE, buf); } - if (tb->mark) + if (tb->dirty_flags & DIRTY_EXPRESSION) { - /* Correct cursor location */ - int tmp_cx = MIN(tb->cx, (int)strlen(tb->lines_list[tb->cy])); - - tb->dirty_flags |= DIRTY_ALL; + int y; + byte state = 0; - if (tb->my < tb->cy || - (tb->my == tb->cy && tb->mx < tmp_cx)) - { - by1 = tb->my; - bx1 = tb->mx; - by2 = tb->cy; - bx2 = tmp_cx; - } - else + for (y = 0; tb->lines_list[y]; y++) { - by2 = tb->my; - bx2 = tb->mx; - by1 = tb->cy; - bx1 = tmp_cx; + char f; + cptr v; + cptr s = tb->lines_list[y]; + char *ss, *s_keep; + int s_len; + + /* Update this line's state */ + tb->states[y] = state; + + if (*s++ != '?') continue; + if (*s++ != ':') continue; + + /* Lines below this line are auto-registered */ + if (streq(s, "$AUTOREGISTER")) + state |= LSTAT_AUTOREGISTER; + + s_len = strlen(s); + ss = (char *)string_make(s); + s_keep = ss; + + /* Parse the expr */ + v = process_pref_file_expr(&ss, &f); + + /* Set flag */ + if (streq(v, "0")) state |= LSTAT_BYPASS; + else state &= ~LSTAT_BYPASS; + + /* Cannot use string_free() because the string was "destroyed" */ + C_KILL(s_keep, s_len + 1, char); + + /* Re-update this line's state */ + tb->states[y] = state | LSTAT_EXPRESSION; } + + tb->dirty_flags |= DIRTY_ALL; + } + + if (tb->mark) + { + tb->dirty_flags |= DIRTY_ALL; + + by1 = MIN(tb->my, tb->cy); + by2 = MAX(tb->my, tb->cy); } /* Dump up to tb->hgt lines of messages */ @@ -3492,6 +4663,7 @@ static void draw_text_editor(text_body_type *tb) int j; int leftcol = 0; cptr msg; + byte color; int y = tb->upper+i; /* clean or dirty? */ @@ -3522,27 +4694,47 @@ static void draw_text_editor(text_body_type *tb) /* Erase line */ Term_erase(0, i + 1, tb->wid); - if (!tb->mark) + if (tb->states[y] & LSTAT_AUTOREGISTER) + { + /* Warning color -- These lines will be deleted later */ + color = TERM_L_RED; + } + else + { + /* Bypassed line will be displayed by darker color */ + if (tb->states[y] & LSTAT_BYPASS) color = TERM_SLATE; + else color = TERM_WHITE; + } + + /* No mark or Out of mark */ + if (!tb->mark || (y < by1 || by2 < y)) + { + /* Dump the messages, bottom to top */ + Term_putstr(leftcol, i + 1, tb->wid - 1, color, msg); + } + + /* Multiple lines selected */ + else if (by1 != by2) { /* Dump the messages, bottom to top */ - Term_putstr(leftcol, i + 1, tb->wid - 1, TERM_WHITE, msg); + Term_putstr(leftcol, i + 1, tb->wid - 1, TERM_YELLOW, msg); } + /* Single line selected */ else { int x0 = leftcol + tb->left; + int len = strlen(tb->lines_list[tb->cy]); + int bx1 = MIN(tb->mx, tb->cx); + int bx2 = MAX(tb->mx, tb->cx); - int sx0 = 0; - int sx1 = 0; - - if (by1 <= y && y < by2) sx1 = strlen(msg); - if (y == by1) sx0 = bx1; - if (y == by2) sx1 = bx2; + /* Correct cursor location */ + if (bx2 > len) bx2 = len; Term_gotoxy(leftcol, i + 1); - if (x0 < sx0) Term_addstr(sx0 - x0, TERM_WHITE, msg); - if (x0 < sx1) Term_addstr(sx1 - sx0, TERM_YELLOW, msg + (sx0 - x0)); - Term_addstr(-1, TERM_WHITE, msg + (sx1 - x0)); + if (x0 < bx1) Term_addstr(bx1 - x0, color, msg); + if (x0 < bx2) Term_addstr(bx2 - bx1, TERM_YELLOW, msg + (bx1 - x0)); + Term_addstr(-1, color, msg + (bx2 - x0)); } } @@ -3556,6 +4748,8 @@ static void draw_text_editor(text_body_type *tb) if (tb->old_cy != tb->cy || (tb->dirty_flags & (DIRTY_ALL | DIRTY_NOT_FOUND | DIRTY_NO_SEARCH)) || tb->dirty_line == tb->cy) { autopick_type an_entry, *entry = &an_entry; + cptr str1 = NULL, str2 = NULL; + /* Clear information line */ for (i = 0; i < DESCRIPT_HGT; i++) @@ -3568,64 +4762,123 @@ static void draw_text_editor(text_body_type *tb) if (tb->dirty_flags & DIRTY_NOT_FOUND) { #ifdef JP - prt(format("¥Ñ¥¿¡¼¥ó¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s", tb->search_str), tb->hgt + 1 + 1, 0); + str1 = format("¥Ñ¥¿¡¼¥ó¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s", tb->search_str); +#else + str1 = format("Pattern not found: %s", tb->search_str); +#endif + } + else if (tb->dirty_flags & DIRTY_SKIP_INACTIVE) + { +#ifdef JP + str1 = format("̵¸ú¾õÂ֤ιԤò¥¹¥­¥Ã¥×¤·¤Þ¤·¤¿¡£(%s¤ò¸¡º÷Ãæ)", tb->search_str); +#else + str1 = format("Some inactive lines are skipped. (Searching %s)", tb->search_str); +#endif + } + else if (tb->dirty_flags & DIRTY_INACTIVE) + { +#ifdef JP + str1 = format("̵¸ú¾õÂ֤ιԤÀ¤±¤¬¸«ÉÕ¤«¤ê¤Þ¤·¤¿¡£(%s¤ò¸¡º÷Ãæ)", tb->search_str); #else - prt(format("Pattern not found: %s", tb->search_str), tb->hgt + 1 + 1, 0); + str1 = format("Found only an inactive line. (Searching %s)", tb->search_str); #endif } else if (tb->dirty_flags & DIRTY_NO_SEARCH) { #ifdef JP - prt("¸¡º÷Ãæ¤Î¥Ñ¥¿¡¼¥ó¤¬¤¢¤ê¤Þ¤»¤ó('/'¤Ç¸¡º÷)¡£", tb->hgt + 1 + 1, 0); + str1 = "¸¡º÷¤¹¤ë¥Ñ¥¿¡¼¥ó¤¬¤¢¤ê¤Þ¤»¤ó(^S ¤Ç¸¡º÷)¡£"; #else - prt("No pattern to search. (Press '/' to search.)", tb->hgt +1 + 1, 0); + str1 = "No pattern to search. (Press ^S to search.)"; #endif } else if (tb->lines_list[tb->cy][0] == '#') { #ifdef JP - prt("¤³¤Î¹Ô¤Ï¥³¥á¥ó¥È¤Ç¤¹¡£", tb->hgt +1 + 1, 0); + str1 = "¤³¤Î¹Ô¤Ï¥³¥á¥ó¥È¤Ç¤¹¡£"; #else - prt("This line is a comment.", tb->hgt +1 + 1, 0); + str1 = "This line is a comment."; #endif } - else if (tb->lines_list[tb->cy][1] == ':') + else if (tb->lines_list[tb->cy][0] && tb->lines_list[tb->cy][1] == ':') { switch(tb->lines_list[tb->cy][0]) { case '?': #ifdef JP - prt("¤³¤Î¹Ô¤Ï¾ò·ïʬ´ô¼°¤Ç¤¹¡£", tb->hgt +1 + 1, 0); + str1 = "¤³¤Î¹Ô¤Ï¾ò·ïʬ´ô¼°¤Ç¤¹¡£"; #else - prt("This line is a Conditional Expression.", tb->hgt +1 + 1, 0); + str1 = "This line is a Conditional Expression."; #endif + break; case 'A': #ifdef JP - prt("¤³¤Î¹Ô¤Ï¥Þ¥¯¥í¤Î¼Â¹ÔÆâÍƤòÄêµÁ¤·¤Þ¤¹¡£", tb->hgt +1 + 1, 0); + str1 = "¤³¤Î¹Ô¤Ï¥Þ¥¯¥í¤Î¼Â¹ÔÆâÍƤòÄêµÁ¤·¤Þ¤¹¡£"; #else - prt("This line defines a Macro action.", tb->hgt +1 + 1, 0); + str1 = "This line defines a Macro action."; #endif break; case 'P': #ifdef JP - prt("¤³¤Î¹Ô¤Ï¥Þ¥¯¥í¤Î¥È¥ê¥¬¡¼¡¦¥­¡¼¤òÄêµÁ¤·¤Þ¤¹¡£", tb->hgt +1 + 1, 0); + str1 = "¤³¤Î¹Ô¤Ï¥Þ¥¯¥í¤Î¥È¥ê¥¬¡¼¡¦¥­¡¼¤òÄêµÁ¤·¤Þ¤¹¡£"; #else - prt("This line defines a Macro trigger key.", tb->hgt +1 + 1, 0); + str1 = "This line defines a Macro trigger key."; #endif break; case 'C': #ifdef JP - prt("¤³¤Î¹Ô¤Ï¥­¡¼ÇÛÃÖ¤òÄêµÁ¤·¤Þ¤¹¡£", tb->hgt +1 + 1, 0); + str1 = "¤³¤Î¹Ô¤Ï¥­¡¼ÇÛÃÖ¤òÄêµÁ¤·¤Þ¤¹¡£"; +#else + str1 = "This line defines a Keymap."; +#endif + break; + } + + switch(tb->lines_list[tb->cy][0]) + { + case '?': + if (tb->states[tb->cy] & LSTAT_BYPASS) + { +#ifdef JP + str2 = "¸½ºß¤Î¼°¤ÎÃͤϡֵ¶(=0)¡×¤Ç¤¹¡£"; +#else + str2 = "The expression is 'False'(=0) currently."; +#endif + } + else + { +#ifdef JP + str2 = "¸½ºß¤Î¼°¤ÎÃͤϡֿ¿(=1)¡×¤Ç¤¹¡£"; #else - prt("This line defines a Keymap.", tb->hgt +1 + 1, 0); + str2 = "The expression is 'True'(=1) currently."; #endif + } + break; + + default: + if (tb->states[tb->cy] & LSTAT_AUTOREGISTER) + { +#ifdef JP + str2 = "¤³¤Î¹Ô¤Ï¸å¤Çºï½ü¤µ¤ì¤Þ¤¹¡£"; +#else + str2 = "This line will be delete later."; +#endif + } + + else if (tb->states[tb->cy] & LSTAT_BYPASS) + { +#ifdef JP + str2 = "¤³¤Î¹Ô¤Ï¸½ºß¤Ï̵¸ú¤Ê¾õÂ֤Ǥ¹¡£"; +#else + str2 = "This line is bypassed currently."; +#endif + } break; } } /* Get description of an autopicker preference line */ - else if (autopick_new_entry(entry, tb->lines_list[tb->cy])) + else if (autopick_new_entry(entry, tb->lines_list[tb->cy], FALSE)) { char buf[MAX_LINELEN]; char temp[MAX_LINELEN]; @@ -3633,6 +4886,24 @@ static void draw_text_editor(text_body_type *tb) describe_autopick(buf, entry); + if (tb->states[tb->cy] & LSTAT_AUTOREGISTER) + { +#ifdef JP + strcat(buf, "¤³¤Î¹Ô¤Ï¸å¤Çºï½ü¤µ¤ì¤Þ¤¹¡£"); +#else + strcat(buf, " This line will be delete later."); +#endif + } + + if (tb->states[tb->cy] & LSTAT_BYPASS) + { +#ifdef JP + strcat(buf, "¤³¤Î¹Ô¤Ï¸½ºß¤Ï̵¸ú¤Ê¾õÂ֤Ǥ¹¡£"); +#else + strcat(buf, " This line is bypassed currently."); +#endif + } + roff_to_buf(buf, 81, temp, sizeof(temp)); t = temp; for (i = 0; i < 3; i++) @@ -3647,6 +4918,12 @@ static void draw_text_editor(text_body_type *tb) } autopick_free_entry(entry); } + + /* Draw the first line */ + if (str1) prt(str1, tb->hgt +1 + 1, 0); + + /* Draw the second line */ + if (str2) prt(str2, tb->hgt +1 + 2, 0); } } @@ -3654,18 +4931,15 @@ static void draw_text_editor(text_body_type *tb) /* * Kill segment of a line */ -static void kill_line_segment(text_body_type *tb, int y, int x0, int x1) +static void kill_line_segment(text_body_type *tb, int y, int x0, int x1, bool whole) { char buf[MAX_LINELEN]; cptr s = tb->lines_list[y]; char *d = buf; int x; - /* No segment? */ - if (x0 == x1) return; - /* Kill whole line? */ - if (x0 == 0 && s[x1] == '\0') + if (whole && x0 == 0 && s[x1] == '\0' && tb->lines_list[y+1]) { int i; @@ -3676,9 +4950,15 @@ static void kill_line_segment(text_body_type *tb, int y, int x0, int x1) tb->lines_list[i] = tb->lines_list[i+1]; tb->lines_list[i] = NULL; + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; + return; } + /* No segment? */ + if (x0 == x1) return; + /* Before the segment */ for (x = 0; x < x0; x++) *(d++) = s[x]; @@ -3692,67 +4972,19 @@ static void kill_line_segment(text_body_type *tb, int y, int x0, int x1) /* Replace */ string_free(tb->lines_list[y]); tb->lines_list[y] = string_make(buf); -} - - -/* - * Kill text in the block selection - */ -static bool kill_text_in_selection(text_body_type *tb) -{ - int by1, bx1, by2, bx2; - int y; - - /* Correct cursor location */ - if ((uint)tb->cx > strlen(tb->lines_list[tb->cy])) - tb->cx = (int)strlen(tb->lines_list[tb->cy]); - - if (tb->my < tb->cy || - (tb->my == tb->cy && tb->mx < tb->cx)) - { - by1 = tb->my; - bx1 = tb->mx; - by2 = tb->cy; - bx2 = tb->cx; - } - else - { - by2 = tb->my; - bx2 = tb->mx; - by1 = tb->cy; - bx1 = tb->cx; - } - - /* Kill lines in reverse order */ - for (y = by2; y >= by1; y--) - { - int x0 = 0; - int x1 = strlen(tb->lines_list[y]); - - if (y == by1) x0 = bx1; - if (y == by2) x1 = bx2; - - kill_line_segment(tb, y, x0, x1); - } - - /* Correct cursor position */ - tb->cy = by1; - tb->cx = bx1; - - /* Disable selection */ - tb->mark = 0; - /* Now dirty */ - tb->dirty_flags |= DIRTY_ALL; + /* Expressions may need re-evaluation */ + check_expression_line(tb, y); - return TRUE; + /* Text is changed */ + tb->changed = TRUE; } /* * Get a trigger key and insert ASCII string for the trigger */ -static bool insert_macro_line(cptr *lines_list, int cy) +static bool insert_macro_line(text_body_type *tb) { char tmp[1024]; char buf[1024]; @@ -3795,10 +5027,12 @@ static bool insert_macro_line(cptr *lines_list, int cy) /* Null */ if(!tmp[0]) return FALSE; + tb->cx = 0; + /* Insert preference string */ - insert_return_code(lines_list, 0, cy); - string_free(lines_list[cy]); - lines_list[cy] = string_make(format("P:%s", tmp)); + insert_return_code(tb); + string_free(tb->lines_list[tb->cy]); + tb->lines_list[tb->cy] = string_make(format("P:%s", tmp)); /* Acquire action */ i = macro_find_exact(buf); @@ -3815,9 +5049,9 @@ static bool insert_macro_line(cptr *lines_list, int cy) } /* Insert blank action preference line */ - insert_return_code(lines_list, 0, cy); - string_free(lines_list[cy]); - lines_list[cy] = string_make(format("A:%s", tmp)); + insert_return_code(tb); + string_free(tb->lines_list[tb->cy]); + tb->lines_list[tb->cy] = string_make(format("A:%s", tmp)); return TRUE; } @@ -3826,7 +5060,7 @@ static bool insert_macro_line(cptr *lines_list, int cy) /* * Get a command key and insert ASCII string for the key */ -static bool insert_keymap_line(cptr *lines_list, int cy) +static bool insert_keymap_line(text_body_type *tb) { char tmp[1024]; char buf[2]; @@ -3861,18 +5095,32 @@ static bool insert_keymap_line(cptr *lines_list, int cy) /* Null */ if(!tmp[0]) return FALSE; + tb->cx = 0; + /* Insert preference string */ - insert_return_code(lines_list, 0, cy); - string_free(lines_list[cy]); - lines_list[cy] = string_make(format("C:%d:%s", mode, tmp)); + insert_return_code(tb); + string_free(tb->lines_list[tb->cy]); + tb->lines_list[tb->cy] = string_make(format("C:%d:%s", mode, tmp)); /* Look up the keymap */ act = keymap_act[mode][(byte)(buf[0])]; + if (act) + { + /* Analyze the current action */ + ascii_to_text(tmp, act); + } + else + { + /* No keymap defined -- Use trigger key itself as a default */ + + /* Nothing to do (use tmp) */ + } + /* Insert blank action preference line */ - insert_return_code(lines_list, 0, cy); - string_free(lines_list[cy]); - lines_list[cy] = string_make(format("A:%s", act)); + insert_return_code(tb); + string_free(tb->lines_list[tb->cy]); + tb->lines_list[tb->cy] = string_make(format("A:%s", tmp)); return TRUE; } @@ -3886,7 +5134,18 @@ static bool do_editor_command(text_body_type *tb, int com_id) switch(com_id) { case EC_QUIT: - return TRUE; + if (tb->changed) + { +#ifdef JP + if (!get_check("Á´¤Æ¤ÎÊѹ¹¤òÇË´þ¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡© ")) break; +#else + if (!get_check("Discard all changes and quit. Are you sure? ")) break; +#endif + } + return QUIT_WITHOUT_SAVE; + + case EC_SAVEQUIT: + return QUIT_AND_SAVE; case EC_REVERT: /* Revert to original */ @@ -3898,9 +5157,12 @@ static bool do_editor_command(text_body_type *tb, int com_id) free_text_lines(tb->lines_list); tb->lines_list = read_pickpref_text_lines(&tb->filename_mode); - tb->dirty_flags |= DIRTY_ALL | DIRTY_MODE; + tb->dirty_flags |= DIRTY_ALL | DIRTY_MODE | DIRTY_EXPRESSION; tb->cx = tb->cy = 0; tb->mark = 0; + + /* Text is not changed */ + tb->changed = FALSE; break; case EC_HELP: @@ -3918,13 +5180,16 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_RETURN: /* Split a line or insert end of line */ - /* - * If there is a selection, kill it, and replace it - * with return code. - */ - if (tb->mark) kill_text_in_selection(tb); + /* Ignore selection */ + if (tb->mark) + { + tb->mark = 0; - insert_return_code(tb->lines_list, tb->cx, tb->cy); + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; + } + + insert_return_code(tb); tb->cy++; tb->cx = 0; @@ -3937,10 +5202,30 @@ static bool do_editor_command(text_body_type *tb, int com_id) if (0 < tb->cx) { int len; +#ifdef JP + int i; +#endif tb->cx--; len = strlen(tb->lines_list[tb->cy]); if (len < tb->cx) tb->cx = len; + +#ifdef JP + /* Don't let cursor at second byte of kanji */ + for (i = 0; tb->lines_list[tb->cy][i]; i++) + { + if (iskanji(tb->lines_list[tb->cy][i])) + { + i++; + if (i == tb->cx) + { + /* Move to the left */ + tb->cx--; + break; + } + } + } +#endif } else if (tb->cy > 0) { @@ -3951,7 +5236,17 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_DOWN: /* Next line */ - if (tb->lines_list[tb->cy + 1]) tb->cy++; + + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) + { + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; + } + + /* Go down */ + tb->cy++; + break; case EC_UP: @@ -3971,13 +5266,19 @@ static bool do_editor_command(text_body_type *tb, int com_id) len = strlen(tb->lines_list[tb->cy]); if (len < tb->cx) { - if (tb->lines_list[tb->cy + 1]) + /* Correct the cursor position */ + tb->cx = len; + + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) { - tb->cy++; - tb->cx = 0; + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; } - else - tb->cx = len; + + /* Move to the beginning of next line */ + tb->cy++; + tb->cx = 0; } break; } @@ -4001,124 +5302,166 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_PGDOWN: /* Page down */ - while (tb->cy < tb->upper + tb->hgt && tb->lines_list[tb->cy + 1]) + while (tb->cy < tb->upper + tb->hgt) + { + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) + { + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; + } + tb->cy++; + } + tb->upper = tb->cy; break; - case EC_TOP: - tb->cy = 0; - break; + case EC_TOP: + tb->cy = 0; + break; + + case EC_BOTTOM: + while (TRUE) + { + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) + { + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; + } + + tb->cy++; + } + + /* Always at the biginning of the last line */ + tb->cx = 0; + + break; + + case EC_CUT: + { + /* Copy the text first */ + copy_text_to_yank(tb); + + /* Single line case */ + if (tb->my == tb->cy) + { + int bx1 = MIN(tb->mx, tb->cx); + int bx2 = MAX(tb->mx, tb->cx); + int len = strlen(tb->lines_list[tb->cy]); + + /* Correct fake cursor position */ + if (bx2 > len) bx2 = len; + + kill_line_segment(tb, tb->cy, bx1, bx2, TRUE); + + /* New cursor position */ + tb->cx = bx1; + } + + /* Multiple lines case */ + else /* if (tb->my != tb->cy) */ + { + int y; + + int by1 = MIN(tb->my, tb->cy); + int by2 = MAX(tb->my, tb->cy); + + /* Kill lines in reverse order */ + for (y = by2; y >= by1; y--) + { + int len = strlen(tb->lines_list[y]); + + kill_line_segment(tb, y, 0, len, TRUE); + } + + /* New cursor position */ + tb->cy = by1; + tb->cx = 0; + } + - case EC_BOTTOM: - while (tb->lines_list[tb->cy + 1]) - tb->cy++; - break; + /* Disable selection */ + tb->mark = 0; - case EC_CUT: - { - /* Copy the text first */ - do_editor_command(tb, EC_COPY); + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; - /* Kill all */ - kill_text_in_selection(tb); + /* Text is changed */ + tb->changed = TRUE; break; } case EC_COPY: - { - int by1, bx1, by2, bx2; - int y; + copy_text_to_yank(tb); - /* Use single line? */ - if (!tb->mark) + /* + * Move cursor position to the end of the selection + * + * Pressing ^C ^V correctly duplicates the selection. + */ + if (tb->my == tb->cy) { - tb->my = tb->cy; - tb->mx = 0; - if (!tb->lines_list[tb->cy]) - { - /* Select bottom line */ - tb->cx = strlen(tb->lines_list[tb->cy]); - } - else + tb->cx = MAX(tb->cx, tb->mx); + + /* + * When whole line is selected, the end of + * line code is also copyed. + */ + if (!tb->lines_list[tb->cy][tb->cx]) { - /* Select a single line */ - tb->cx = 0; + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) + { + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; + } + + /* Go to the beginning of next line */ tb->cy++; + tb->cx = 0; } } - - /* Correct cursor location */ - if ((uint)tb->cx > strlen(tb->lines_list[tb->cy])) - tb->cx = (int)strlen(tb->lines_list[tb->cy]); - - if (tb->my < tb->cy || - (tb->my == tb->cy && tb->mx < tb->cx)) - { - by1 = tb->my; - bx1 = tb->mx; - by2 = tb->cy; - bx2 = tb->cx; - } else { - by2 = tb->my; - bx2 = tb->mx; - by1 = tb->cy; - bx1 = tb->cx; - } - - /* Kill old yank buffer */ - kill_yank_chain(tb); - - /* Copy string to yank buffer */ - for (y = by1; y <= by2; y++) - { - int i; - char buf[MAX_LINELEN]; - - int x0 = 0; - int x1 = strlen(tb->lines_list[y]); + tb->cy = MAX(tb->cy, tb->my); - if (y == by1) x0 = bx1; - if (y == by2) x1 = bx2; - - for (i = 0; i < x1 - x0; i++) + /* Is this the last line? */ + if (!tb->lines_list[tb->cy + 1]) { - buf[i] = tb->lines_list[y][x0 + i]; + /* Add one more empty line if possible */ + if (!add_empty_line(tb)) break; } - buf[i] = '\0'; - add_str_to_yank(tb, buf); + /* Go down */ + tb->cy++; } - /* Disable selection */ - tb->mark = 0; - - /* Now dirty */ - tb->dirty_flags |= DIRTY_ALL; break; - } case EC_PASTE: { /* Paste killed text */ chain_str_type *chain = tb->yank; + int len = strlen(tb->lines_list[tb->cy]); /* Nothing to do? */ if (!chain) break; /* Correct cursor location */ - if ((uint)tb->cx > strlen(tb->lines_list[tb->cy])) - tb->cx = (int)strlen(tb->lines_list[tb->cy]); + if (tb->cx > len) tb->cx = len; - /* - * If there is a selection, kill text, and - * replace it with the yank text. - */ - if (tb->mark) kill_text_in_selection(tb); + /* Ignore selection */ + if (tb->mark) + { + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; + } /* Paste text */ while (chain) @@ -4150,7 +5493,7 @@ static bool do_editor_command(text_body_type *tb, int com_id) { /* There is an end of line between chain nodes */ - insert_return_code(tb->lines_list, tb->cx, tb->cy); + insert_return_code(tb); /* Replace this line with new one */ string_free(tb->lines_list[tb->cy]); @@ -4186,6 +5529,13 @@ static bool do_editor_command(text_body_type *tb, int com_id) /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; + + /* Text is changed */ + tb->changed = TRUE; + break; } @@ -4219,9 +5569,14 @@ static bool do_editor_command(text_body_type *tb, int com_id) } else { + int len = strlen(tb->lines_list[tb->cy]); + /* Mark the point 1 */ tb->my = tb->cy; tb->mx = tb->cx; + + /* Correct cursor location */ + if (tb->cx > len) tb->mx = len; } } break; @@ -4230,34 +5585,19 @@ static bool do_editor_command(text_body_type *tb, int com_id) { /* Kill rest of line */ - int i; - char buf[MAX_LINELEN]; - cptr line; - - /* If there is a selection, kill it */ - if (tb->mark) - { - if (kill_text_in_selection(tb)) break; - } + int len = strlen(tb->lines_list[tb->cy]); /* Correct cursor location */ - if ((uint)tb->cx > strlen(tb->lines_list[tb->cy])) - tb->cx = (int)strlen(tb->lines_list[tb->cy]); + if (tb->cx > len) tb->cx = len; - /* Save preceding string */ - for (i = 0; tb->lines_list[tb->cy][i] && i < tb->cx; i++) + /* Ignore selection */ + if (tb->mark) { -#ifdef JP - if (iskanji(tb->lines_list[tb->cy][i])) - { - buf[i] = tb->lines_list[tb->cy][i]; - i++; - } -#endif - buf[i] = tb->lines_list[tb->cy][i]; + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; } - buf[i] = '\0'; - line = string_make(buf); /* Append only if this command is repeated. */ if (tb->old_com_id != com_id) @@ -4267,14 +5607,12 @@ static bool do_editor_command(text_body_type *tb, int com_id) } /* Really deleted some text */ - if (strlen(tb->lines_list[tb->cy] + i)) + if (tb->cx < len) { /* Add deleted string to yank buffer */ - add_str_to_yank(tb, tb->lines_list[tb->cy] + i); + add_str_to_yank(tb, &(tb->lines_list[tb->cy][tb->cx])); - /* Replace current line with 'preceding string' */ - string_free(tb->lines_list[tb->cy]); - tb->lines_list[tb->cy] = line; + kill_line_segment(tb, tb->cy, tb->cx, len, FALSE); /* Now dirty */ tb->dirty_line = tb->cy; @@ -4283,21 +5621,29 @@ static bool do_editor_command(text_body_type *tb, int com_id) break; } - /* Delete the end of line character only */ + /* Cut the end of line character only */ if (tb->yank_eol) add_str_to_yank(tb, ""); - else tb->yank_eol = TRUE; + + /* Cut end of line */ + tb->yank_eol = TRUE; do_editor_command(tb, EC_DELETE_CHAR); break; } case EC_DELETE_CHAR: + { /* DELETE == go forward + BACK SPACE */ - /* If there is a selection, kill it */ + int len; + + /* Ignore selection */ if (tb->mark) { - if (kill_text_in_selection(tb)) break; + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; } #ifdef JP @@ -4305,8 +5651,25 @@ static bool do_editor_command(text_body_type *tb, int com_id) #endif tb->cx++; + /* Pass through the end of line to next line */ + len = strlen(tb->lines_list[tb->cy]); + if (len < tb->cx) + { + if (tb->lines_list[tb->cy + 1]) + { + tb->cy++; + tb->cx = 0; + } + else + { + tb->cx = len; + break; + } + } + do_editor_command(tb, EC_BACKSPACE); break; + } case EC_BACKSPACE: { @@ -4315,26 +5678,18 @@ static bool do_editor_command(text_body_type *tb, int com_id) int len, i, j, k; char buf[MAX_LINELEN]; - /* If there is a selection, kill it */ + /* Ignore selection */ if (tb->mark) { - if (kill_text_in_selection(tb)) break; + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; } + /* Move to correct collumn */ len = strlen(tb->lines_list[tb->cy]); - if (len < tb->cx) - { - if (tb->lines_list[tb->cy + 1]) - { - tb->cy++; - tb->cx = 0; - } - else - { - tb->cx = len; - break; - } - } + if (len < tb->cx) tb->cx = len; if (tb->cx == 0) { @@ -4346,13 +5701,22 @@ static bool do_editor_command(text_body_type *tb, int com_id) string_free(tb->lines_list[tb->cy-1]); string_free(tb->lines_list[tb->cy]); tb->lines_list[tb->cy-1] = string_make(buf); + for (i = tb->cy; tb->lines_list[i+1]; i++) tb->lines_list[i] = tb->lines_list[i+1]; + tb->lines_list[i] = NULL; tb->cy--; /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Expressions need re-evaluation */ + tb->dirty_flags |= DIRTY_EXPRESSION; + + /* Text is changed */ + tb->changed = TRUE; + break; } @@ -4378,6 +5742,13 @@ static bool do_editor_command(text_body_type *tb, int com_id) /* Now dirty */ tb->dirty_line = tb->cy; + + /* Expressions may need re-evaluation */ + check_expression_line(tb, tb->cy); + + /* Text is changed */ + tb->changed = TRUE; + break; } @@ -4400,11 +5771,11 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_SEARCH_FORW: if (tb->search_o_ptr) { - if (!search_for_object(tb->lines_list, tb->search_o_ptr, &tb->cx, &tb->cy, TRUE)) tb->dirty_flags |= DIRTY_NOT_FOUND; + search_for_object(tb, tb->search_o_ptr, TRUE); } - else if (tb->search_str) + else if (tb->search_str && tb->search_str[0]) { - if (!search_for_string(tb->lines_list, tb->search_str, &tb->cx, &tb->cy, TRUE)) tb->dirty_flags |= DIRTY_NOT_FOUND; + search_for_string(tb, tb->search_str, TRUE); } else { @@ -4415,11 +5786,11 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_SEARCH_BACK: if (tb->search_o_ptr) { - if (!search_for_object(tb->lines_list, tb->search_o_ptr, &tb->cx, &tb->cy, FALSE)) tb->dirty_flags |= DIRTY_NOT_FOUND; + search_for_object(tb, tb->search_o_ptr, FALSE); } - else if (tb->search_str) + else if (tb->search_str && tb->search_str[0]) { - if (!search_for_string(tb->lines_list, tb->search_str, &tb->cx, &tb->cy, FALSE)) tb->dirty_flags |= DIRTY_NOT_FOUND; + search_for_string(tb, tb->search_str, FALSE); } else { @@ -4437,7 +5808,13 @@ static bool do_editor_command(text_body_type *tb, int com_id) break; case EC_SEARCH_DESTROYED: - if (!get_destroyed_object_for_search(&tb->search_o_ptr, &tb->search_str)) break; + if (!get_destroyed_object_for_search(&tb->search_o_ptr, &tb->search_str)) + { + /* There is no object to search */ + tb->dirty_flags |= DIRTY_NO_SEARCH; + + break; + } do_editor_command(tb, EC_SEARCH_FORW); break; @@ -4455,10 +5832,10 @@ static bool do_editor_command(text_body_type *tb, int com_id) break; } - insert_return_code(tb->lines_list, 0, tb->cy); + tb->cx = 0; + insert_return_code(tb); string_free(tb->lines_list[tb->cy]); tb->lines_list[tb->cy] = autopick_line_from_entry_kill(entry); - tb->cx = 0; /* Now dirty because of item/equip menu */ tb->dirty_flags |= DIRTY_SCREEN; @@ -4470,41 +5847,49 @@ static bool do_editor_command(text_body_type *tb, int com_id) /* Insert a name of last destroyed item */ if (tb->last_destroyed) { - insert_return_code(tb->lines_list, 0, tb->cy); + tb->cx = 0; + insert_return_code(tb); string_free(tb->lines_list[tb->cy]); tb->lines_list[tb->cy] = string_make(tb->last_destroyed); - tb->cx = 0; /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Text is changed */ + tb->changed = TRUE; } break; case EC_INSERT_BLOCK: { /* Insert a conditinal expression line */ - char classrace[80]; + char expression[80]; /* Conditional Expression for Class and Race */ - sprintf(classrace, "?:[AND [EQU $RACE %s] [EQU $CLASS %s]]", + sprintf(expression, "?:[AND [EQU $RACE %s] [EQU $CLASS %s] [GEQ $LEVEL %02d]]", #ifdef JP - rp_ptr->E_title, cp_ptr->E_title + rp_ptr->E_title, cp_ptr->E_title, #else - rp_ptr->title, cp_ptr->title + rp_ptr->title, cp_ptr->title, #endif + p_ptr->lev ); - insert_return_code(tb->lines_list, 0, tb->cy); + tb->cx = 0; + insert_return_code(tb); string_free(tb->lines_list[tb->cy]); - tb->lines_list[tb->cy] = string_make(classrace); + tb->lines_list[tb->cy] = string_make(expression); tb->cy++; - insert_return_code(tb->lines_list, 0, tb->cy); + insert_return_code(tb); string_free(tb->lines_list[tb->cy]); tb->lines_list[tb->cy] = string_make("?:1"); - tb->cx = 0; /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; + + /* Text is changed */ + tb->changed = TRUE; + break; } @@ -4521,14 +5906,16 @@ static bool do_editor_command(text_body_type *tb, int com_id) #else Term_putstr(0, tb->cy - tb->upper + 1, tb->wid - 1, TERM_YELLOW, "P:: "); #endif - if (insert_macro_line(tb->lines_list, tb->cy)) + if (insert_macro_line(tb)) { /* Prepare to input action */ tb->cx = 2; /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; - tb->dirty_flags |= DIRTY_MODE; + + /* Text is changed */ + tb->changed = TRUE; } break; @@ -4547,14 +5934,16 @@ static bool do_editor_command(text_body_type *tb, int com_id) Term_putstr(0, tb->cy - tb->upper + 1, tb->wid - 1, TERM_YELLOW, format("C:%d:: ", (rogue_like_commands ? KEYMAP_MODE_ROGUE : KEYMAP_MODE_ORIG))); #endif - if (insert_keymap_line(tb->lines_list, tb->cy)) + if (insert_keymap_line(tb)) { /* Prepare to input action */ tb->cx = 2; /* Now dirty */ tb->dirty_flags |= DIRTY_ALL; - tb->dirty_flags |= DIRTY_MODE; + + /* Text is changed */ + tb->changed = TRUE; } break; @@ -4569,12 +5958,13 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_IK_IDENTIFIED: toggle_keyword(tb, FLG_IDENTIFIED); break; case EC_IK_STAR_IDENTIFIED: toggle_keyword(tb, FLG_STAR_IDENTIFIED); break; case EC_KK_WEAPONS: toggle_keyword(tb, FLG_WEAPONS); break; - case EC_KK_FAVORITE: toggle_keyword(tb, FLG_FAVORITE); break; + case EC_KK_FAVORITE_WEAPONS: toggle_keyword(tb, FLG_FAVORITE_WEAPONS); break; case EC_KK_ARMORS: toggle_keyword(tb, FLG_ARMORS); break; case EC_KK_MISSILES: toggle_keyword(tb, FLG_MISSILES); break; case EC_KK_DEVICES: toggle_keyword(tb, FLG_DEVICES); break; case EC_KK_LIGHTS: toggle_keyword(tb, FLG_LIGHTS); break; case EC_KK_JUNKS: toggle_keyword(tb, FLG_JUNKS); break; + case EC_KK_CORPSES: toggle_keyword(tb, FLG_CORPSES); break; case EC_KK_SPELLBOOKS: toggle_keyword(tb, FLG_SPELLBOOKS); break; case EC_KK_SHIELDS: toggle_keyword(tb, FLG_SHIELDS); break; case EC_KK_BOWS: toggle_keyword(tb, FLG_BOWS); break; @@ -4587,12 +5977,16 @@ static bool do_editor_command(text_body_type *tb, int com_id) case EC_KK_BOOTS: toggle_keyword(tb, FLG_BOOTS); break; case EC_OK_COLLECTING: toggle_keyword(tb, FLG_COLLECTING); break; case EC_OK_BOOSTED: toggle_keyword(tb, FLG_BOOSTED); break; - case EC_OK_MORE_THAN: toggle_keyword(tb, FLG_MORE_THAN); break; + case EC_OK_MORE_DICE: toggle_keyword(tb, FLG_MORE_DICE); break; case EC_OK_MORE_BONUS: toggle_keyword(tb, FLG_MORE_BONUS); break; case EC_OK_WORTHLESS: toggle_keyword(tb, FLG_WORTHLESS); break; case EC_OK_ARTIFACT: toggle_keyword(tb, FLG_ARTIFACT); break; case EC_OK_EGO: toggle_keyword(tb, FLG_EGO); break; + case EC_OK_GOOD: toggle_keyword(tb, FLG_GOOD); break; case EC_OK_NAMELESS: toggle_keyword(tb, FLG_NAMELESS); break; + case EC_OK_AVERAGE: toggle_keyword(tb, FLG_AVERAGE); break; + case EC_OK_RARE: toggle_keyword(tb, FLG_RARE); break; + case EC_OK_COMMON: toggle_keyword(tb, FLG_COMMON); break; case EC_OK_WANTED: toggle_keyword(tb, FLG_WANTED); break; case EC_OK_UNIQUE: toggle_keyword(tb, FLG_UNIQUE); break; case EC_OK_HUMAN: toggle_keyword(tb, FLG_HUMAN); break; @@ -4685,6 +6079,87 @@ static void insert_single_letter(text_body_type *tb, int key) /* Now dirty */ tb->dirty_line = tb->cy; + + /* Expressions may need re-evaluation */ + check_expression_line(tb, tb->cy); + + /* Text is changed */ + tb->changed = TRUE; +} + + +/* + * Check special key code and get a movement command id + */ +static int analyze_move_key(text_body_type *tb, int skey) +{ + int com_id; + + /* Not a special key */ + if (!(skey & SKEY_MASK)) return 0; + + /* Convert from a special key code to an editor command */ + switch(skey & ~SKEY_MOD_MASK) + { + case SKEY_DOWN: com_id = EC_DOWN; break; + case SKEY_LEFT: com_id = EC_LEFT; break; + case SKEY_RIGHT: com_id = EC_RIGHT; break; + case SKEY_UP: com_id = EC_UP; break; + case SKEY_PGUP: com_id = EC_PGUP; break; + case SKEY_PGDOWN: com_id = EC_PGDOWN; break; + case SKEY_TOP: com_id = EC_TOP; break; + case SKEY_BOTTOM: com_id = EC_BOTTOM; break; + + default: + /* Not a special movement key */ + return 0; + } + + /* Without shift modifier */ + if (!(skey & SKEY_MOD_SHIFT)) + { + /* + * Un-shifted cursor keys cancells + * selection created by shift+cursor. + */ + if (tb->mark & MARK_BY_SHIFT) + { + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; + } + } + + /* With shift modifier */ + else + { + /* Start selection by shift + cursor keys */ + if (!tb->mark) + { + int len = strlen(tb->lines_list[tb->cy]); + + tb->mark = MARK_MARK | MARK_BY_SHIFT; + tb->my = tb->cy; + tb->mx = tb->cx; + + /* Correct cursor location */ + if (tb->cx > len) tb->mx = len; + + /* Need to redraw text */ + if (com_id == EC_UP || com_id == EC_DOWN) + { + /* Redraw all text */ + tb->dirty_flags |= DIRTY_ALL; + } + else + { + tb->dirty_line = tb->cy; + } + } + } + + return com_id; } /* @@ -4692,6 +6167,9 @@ static void insert_single_letter(text_body_type *tb, int key) */ void do_cmd_edit_autopick(void) { + static int cx_save = 0; + static int cy_save = 0; + text_body_type text_body, *tb = &text_body; autopick_type an_entry, *entry = &an_entry; @@ -4701,9 +6179,12 @@ void do_cmd_edit_autopick(void) int key = -1; static s32b old_autosave_turn = 0L; - bool quit = FALSE; + byte quit = 0; - tb->cx = tb->cy = tb->upper = tb->left = 0; + tb->changed = FALSE; + tb->cx = cx_save; + tb->cy = cy_save; + tb->upper = tb->left = 0; tb->mark = 0; tb->mx = tb->my = 0; tb->old_cy = tb->old_upper = tb->old_left = -1; @@ -4714,9 +6195,14 @@ void do_cmd_edit_autopick(void) tb->search_o_ptr = NULL; tb->search_str = NULL; tb->last_destroyed = NULL; - tb->dirty_flags = DIRTY_ALL | DIRTY_MODE; + tb->dirty_flags = DIRTY_ALL | DIRTY_MODE | DIRTY_EXPRESSION; tb->dirty_line = -1; - tb->filename_mode = PT_WITH_PNAME; + tb->filename_mode = PT_DEFAULT; + + if (turn < old_autosave_turn) + { + while (old_autosave_turn > turn) old_autosave_turn -= TURNS_PER_TICK * TOWN_DAWN; + } /* Autosave */ if (turn > old_autosave_turn + 100L) @@ -4729,7 +6215,7 @@ void do_cmd_edit_autopick(void) update_playtime(); /* Free old entries */ - init_autopicker(); + init_autopick(); /* Command Description of the 'Last Destroyed Item' */ if (autopick_last_destroyed_object.k_idx) @@ -4758,16 +6244,15 @@ void do_cmd_edit_autopick(void) while (!quit) { int com_id = 0; - size_t trig_len; /* Draw_everythig */ draw_text_editor(tb); /* Display header line */ #ifdef JP - prt("(^Q:½ªÎ», ESC:¥á¥Ë¥å¡¼, ¤½¤Î¾:ÆþÎÏ)", 0, 0); + prt("(^Q:½ªÎ» ^W:¥»¡¼¥Ö¤·¤Æ½ªÎ», ESC:¥á¥Ë¥å¡¼, ¤½¤Î¾:ÆþÎÏ)", 0, 0); #else - prt("(^Q:quit, ESC:menu, Other:input text)", 0, 0); + prt("(^Q:Quit, ^W:Save&Quit, ESC:Menu, Other:Input text)", 0, 0); #endif if (!tb->mark) { @@ -4795,103 +6280,13 @@ void do_cmd_edit_autopick(void) tb->old_hgt = tb->hgt; /* Get a command */ - key = inkey(); - - /* Count length of macro trigger which induced this key */ - trig_len = strlen(inkey_macro_trigger_string); - - /* HACK -- ignore macro defined on ASCII keys */ - if (trig_len == 1) - { - /* Get original key */ - key = inkey_macro_trigger_string[0]; - } - - /* Delete key */ - if (key == 0x7F) key = KTRL('d'); - - - /* Cursor key macroes to direction command */ - if (trig_len > 1) - { - switch (key) - { - case '2': - com_id = EC_DOWN; - break; - case '4': - com_id = EC_LEFT; - break; - case '6': - com_id = EC_RIGHT; - break; - case '8': - com_id = EC_UP; - break; - } - - if (com_id) - { - /* - * Un-shifted cursor keys cancells - * selection created by shift+cursor. - */ - if (tb->mark & MARK_BY_SHIFT) - { - tb->mark = 0; - - /* Now dirty */ - tb->dirty_flags |= DIRTY_ALL; - } - } - - /* Mega Hack!!! Start selection with shift + cursor keys */ - else - { - char buf[1024]; - - /* Get ascii form */ - ascii_to_text(buf, inkey_macro_trigger_string); - - if (strstr(buf, "shift-Down")) - com_id = EC_DOWN; - else if (strstr(buf, "shift-Left")) - com_id = EC_LEFT; - else if (strstr(buf, "shift-Right")) - com_id = EC_RIGHT; - else if (strstr(buf, "shift-Up")) - com_id = EC_UP; - - if (com_id) - { - /* Kill further macro expansion */ - flush(); - - /* Start selection */ - if (!tb->mark) - { - tb->mark = MARK_MARK | MARK_BY_SHIFT; - tb->my = tb->cy; - tb->mx = tb->cx; - - /* Need to redraw text */ - if (com_id == EC_UP || com_id == EC_DOWN) - { - /* Redraw all text */ - tb->dirty_flags |= DIRTY_ALL; - } - else - { - tb->dirty_line = tb->cy; - } - } - } - } - } + key = inkey_special(TRUE); - if (com_id) + /* Special keys */ + if (key & SKEY_MASK) { - /* Already done */ + /* Get a movement command */ + com_id = analyze_move_key(tb, key); } /* Open the menu */ @@ -4904,13 +6299,16 @@ void do_cmd_edit_autopick(void) } /* Insert a character */ - else if (!iscntrl(key & 0xff)) + else if (!iscntrl((unsigned char)key)) { - /* - * If there is a selection, kill text, and - * replace it with a single letter. - */ - if (tb->mark) kill_text_in_selection(tb); + /* Ignore selection */ + if (tb->mark) + { + tb->mark = 0; + + /* Now dirty */ + tb->dirty_flags |= DIRTY_ALL; + } insert_single_letter(tb, key); @@ -4925,41 +6323,32 @@ void do_cmd_edit_autopick(void) } if (com_id) quit = do_editor_command(tb, com_id); - } /* while (1) */ + } /* while (TRUE) */ /* Restore the screen */ screen_load(); - switch (tb->filename_mode) - { - case PT_DEFAULT: -#ifdef JP - strcpy(buf, "picktype.prf"); -#else - strcpy(buf, "pickpref.prf"); -#endif - break; + /* Get the filename of preference */ + strcpy(buf, pickpref_filename(tb->filename_mode)); - case PT_WITH_PNAME: -#ifdef JP - sprintf(buf, "picktype-%s.prf", player_name); -#else - sprintf(buf, "pickpref-%s.prf", player_name); -#endif - break; - } + if (quit == QUIT_AND_SAVE) + write_text_lines(buf, tb->lines_list); - write_text_lines(buf, tb->lines_list); free_text_lines(tb->lines_list); + string_free(tb->search_str); string_free(tb->last_destroyed); /* Destroy string chain */ kill_yank_chain(tb); /* Reload autopick pref */ - process_pickpref_file(buf); + process_autopick_file(buf); /* HACK -- reset start_time so that playtime is not increase while edit */ start_time = time(NULL); + + /* Save cursor location */ + cx_save = tb->cx; + cy_save = tb->cy; }