/*
+ * research_mon
+ * -KMW-
+ */
+static bool research_mon(void)
+{
+ int i, n, r_idx;
+ char sym, query;
+ char buf[128];
+
+ bool notpicked;
+
+ bool recall = FALSE;
+
+ u16b why = 0;
+
+ u16b *who;
+
+ /* XTRA HACK WHATSEARCH */
+ bool all = FALSE;
+ bool uniq = FALSE;
+ bool norm = FALSE;
+ char temp[80] = "";
+
+ /* XTRA HACK REMEMBER_IDX */
+ static int old_sym = '\0';
+ static int old_i = 0;
+
+
+ /* Save the screen */
+ screen_save();
+
+ /* Get a character, or abort */
+#ifdef JP
+if (!get_com("¥â¥ó¥¹¥¿¡¼¤Îʸ»ú¤òÆþÎϤ·¤Æ²¼¤µ¤¤(µ¹æ or ^AÁ´,^U¥æ,^NÈó¥æ,^M̾Á°):", &sym, FALSE))
+#else
+ if (!get_com("Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): ", &sym, FALSE))
+#endif
+
+ {
+ /* Restore */
+ screen_load();
+
+ return (FALSE);
+ }
+
+ /* Find that character info, and describe it */
+ for (i = 0; ident_info[i]; ++i)
+ {
+ if (sym == ident_info[i][0]) break;
+ }
+
+ /* XTRA HACK WHATSEARCH */
+ if (sym == KTRL('A'))
+ {
+ all = TRUE;
+#ifdef JP
+ strcpy(buf, "Á´¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+ strcpy(buf, "Full monster list.");
+#endif
+ }
+ else if (sym == KTRL('U'))
+ {
+ all = uniq = TRUE;
+#ifdef JP
+ strcpy(buf, "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+ strcpy(buf, "Unique monster list.");
+#endif
+ }
+ else if (sym == KTRL('N'))
+ {
+ all = norm = TRUE;
+#ifdef JP
+ strcpy(buf, "¥æ¥Ë¡¼¥¯³°¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
+#else
+ strcpy(buf, "Non-unique monster list.");
+#endif
+ }
+ else if (sym == KTRL('M'))
+ {
+ all = TRUE;
+#ifdef JP
+ if (!get_string("̾Á°(±Ñ¸ì¤Î¾ì¹ç¾®Ê¸»ú¤Ç²Ä)",temp, 70))
+#else
+ if (!get_string("Enter name:",temp, 70))
+#endif
+ {
+ temp[0]=0;
+
+ /* Restore */
+ screen_load();
+
+ return FALSE;
+ }
+#ifdef JP
+ sprintf(buf, "̾Á°:%s¤Ë¥Þ¥Ã¥Á",temp);
+#else
+ sprintf(buf, "Monsters with a name \"%s\"",temp);
+#endif
+ }
+ else if (ident_info[i])
+ {
+ sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
+ }
+ else
+ {
+#ifdef JP
+sprintf(buf, "%c - %s", sym, "̵¸ú¤Êʸ»ú");
+#else
+ sprintf(buf, "%c - %s.", sym, "Unknown Symbol");
+#endif
+
+ }
+
+ /* Display the result */
+ prt(buf, 16, 10);
+
+
+ /* Allocate the "who" array */
+ C_MAKE(who, max_r_idx, u16b);
+
+ /* Collect matching monsters */
+ for (n = 0, i = 1; i < max_r_idx; i++)
+ {
+ monster_race *r_ptr = &r_info[i];
+
+ /* XTRA HACK WHATSEARCH */
+ /* Require non-unique monsters if needed */
+ if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+ /* Require unique monsters if needed */
+ if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
+
+ /* ̾Á°¸¡º÷ */
+ if (temp[0]){
+ int xx;
+ char temp2[80];
+
+ for (xx=0; temp[xx] && xx<80; xx++){
+#ifdef JP
+ if (iskanji( temp[xx])) { xx++; continue; }
+#endif
+ if (isupper(temp[xx])) temp[xx]=tolower(temp[xx]);
+ }
+
+#ifdef JP
+ strcpy(temp2, r_name+r_ptr->E_name);
+#else
+ strcpy(temp2, r_name+r_ptr->name);
+#endif
+ for (xx=0; temp2[xx] && xx<80; xx++)
+ if (isupper(temp2[xx])) temp2[xx]=tolower(temp2[xx]);
+
+#ifdef JP
+ if (strstr(temp2, temp) || strstr_j(r_name + r_ptr->name, temp) )
+#else
+ if (strstr(temp2, temp))
+#endif
+ who[n++]=i;
+ }
+ else if (all || (r_ptr->d_char == sym)) who[n++] = i;
+ }
+
+ /* Nothing to recall */
+ if (!n)
+ {
+ /* Free the "who" array */
+ C_KILL(who, max_r_idx, u16b);
+
+ /* Restore */
+ screen_load();
+
+ return (FALSE);
+ }
+
+ /* Sort by level */
+ why = 2;
+ query = 'y';
+
+ /* Sort if needed */
+ if (why)
+ {
+ /* Select the sort method */
+ ang_sort_comp = ang_sort_comp_hook;
+ ang_sort_swap = ang_sort_swap_hook;
+
+ /* Sort the array */
+ ang_sort(who, &why, n);
+ }
+
+
+ /* Start at the end */
+ /* XTRA HACK REMEMBER_IDX */
+ if (old_sym == sym && old_i < n) i = old_i;
+ else i = n - 1;
+
+ notpicked = TRUE;
+
+ /* Scan the monster memory */
+ while (notpicked)
+ {
+ /* Extract a race */
+ r_idx = who[i];
+
+ /* Save this monster ID */
+ p_ptr->monster_race_idx = r_idx;
+
+ /* Hack -- Handle stuff */
+ handle_stuff();
+
+ /* Hack -- Begin the prompt */
+ roff_top(r_idx);
+
+ /* Hack -- Complete the prompt */
+#ifdef JP
+Term_addstr(-1, TERM_WHITE, " ['r'»×¤¤½Ð, ' '¤Ç³¹Ô, ESC]");
+#else
+ Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC, space to continue]");
+#endif
+
+
+ /* Interact */
+ while (1)
+ {
+ /* Recall */
+ if (recall)
+ {
+ /* Recall on screen */
+ monster_race *r_ptr = &r_info[r_idx];
+ int m;
+
+ /* Get maximal info about this monster */
+ lore_do_probe(r_idx);
+
+ /* know every thing mode */
+ screen_roff(r_idx, 0x01);
+ notpicked = FALSE;
+
+ /* XTRA HACK REMEMBER_IDX */
+ old_sym = sym;
+ old_i = i;
+ }
+
+ /* Command */
+ query = inkey();
+
+ /* Normal commands */
+ if (query != 'r') break;
+
+ /* Toggle recall */
+ recall = !recall;
+ }
+
+ /* Stop scanning */
+ if (query == ESCAPE) break;
+
+ /* Move to "prev" monster */
+ if (query == '-')
+ {
+ if (++i == n)
+ {
+ i = 0;
+ if (!expand_list) break;
+ }
+ }
+
+ /* Move to "next" monster */
+ else
+ {
+ if (i-- == 0)
+ {
+ i = n - 1;
+ if (!expand_list) break;
+ }
+ }
+ }
+
+
+ /* Re-display the identity */
+ /* prt(buf, 5, 5);*/
+
+ /* Free the "who" array */
+ C_KILL(who, max_r_idx, u16b);
+
+ /* Restore */
+ screen_load();
+
+ return (!notpicked);
+}
+
+
+/*
* Execute a building command
*/
static void bldg_process_command(building_type *bldg, int i)
/*
- * The table of "symbol info" -- each entry is a string of the form
- * "X:desc" where "X" is the trigger, and "desc" is the "info".
- */
-static cptr ident_info[] =
-{
-#ifdef JP
- " :°Å°Ç",
- "!:Ìô, ¥ª¥¤¥ë",
- "\":¥¢¥ß¥å¥ì¥Ã¥È, ðô¾þ¤ê",
- "#:ÊÉ(±£¤·¥É¥¢)Ëô¤Ï¿¢Êª",
- "$:ºâÊõ(¶â¤«ÊõÀÐ)",
- "%:¹ÛÌ®(Íϴ䤫ÀбÑ)",
- "&:Ȣ",
- "':³«¤¤¤¿¥É¥¢",
- "(:Æð¤é¤«¤¤Ëɶñ",
- "):½â",
- "*:ºâÊõ¤ò´Þ¤ó¤À¹ÛÌ®¤Þ¤¿¤Ïµå·Á¤Î²øʪ",
- "+:ÊĤ¸¤¿¥É¥¢",
- ",:¿©¤Ùʪ, ¤ª¤Ð¤±¥¥Î¥³",
- "-:ËâË¡ËÀ, ¥í¥Ã¥É",
- ".:¾²",
- "/:´È¾õÉð´ï(¥¢¥Ã¥¯¥¹/¥Ñ¥¤¥¯/Åù)",
- "0:Çîʪ´Û¤ÎÆþ¸ý",
- "1:»¨²ß²°¤ÎÆþ¸ý",
- "2:Ëɶñ²°¤ÎÆþ¸ý",
- "3:Éð´ïÀìÌ珤ÎÆþ¸ý",
- "4:»û±¡¤ÎÆþ¸ý",
- "5:Ï£¶â½Ñ¤ÎŹ¤ÎÆþ¸ý",
- "6:ËâË¡¤ÎŹ¤ÎÆþ¸ý",
- "7:¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤ÎÆþ¸ý",
- "8:²æ¤¬²È¤ÎÆþ¸ý",
- "9:½ñŹ¤ÎÆþ¸ý",
- "::´äÀÐ",
- ";:²óÈò¤Î³¨Ê¸»ú/Çúȯ¤Î¥ë¡¼¥ó",
- "<:¾å¤ê³¬ÃÊ",
- "=:»ØÎØ",
- ">:²¼¤ê³¬ÃÊ",
- "?:´¬Êª",
- "@:¥×¥ì¥¤¥ä¡¼",
- "A:Å·»È",
- "B:Ļ",
- "C:¸¤",
- "D:¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à",
- "E:¥¨¥ì¥á¥ó¥¿¥ë",
- "F:¥È¥ó¥Ü",
- "G:¥´¡¼¥¹¥È",
- "H:»¨¼ï",
- "I:º«Ãî",
- "J:¥Ø¥Ó",
- "K:¥¥é¡¼¡¦¥Ó¡¼¥È¥ë",
- "L:¥ê¥Ã¥Á",
- "M:¿¼ó¤Îà¨ÃîÎà",
- "N:Ææ¤ÎÀ¸Êª",
- "O:¥ª¡¼¥¬",
- "P:µðÂç¿Í´Ö·¿À¸Êª",
- "Q:¥¯¥¤¥ë¥¹¥ë¥°(Ì®ÂǤÄÆù²ô)",
- "R:à¨ÃîÎà/ξÀ¸Îà",
- "S:ÃØéá/¥µ¥½¥ê/¥À¥Ë",
- "T:¥È¥í¥ë",
- "U:¾åµé¥Ç¡¼¥â¥ó",
- "V:¥Ð¥ó¥Ñ¥¤¥¢",
- "W:¥ï¥¤¥È/¥ì¥¤¥¹/Åù",
- "X:¥¾¡¼¥ó/¥¶¥ì¥ó/Åù",
- "Y:¥¤¥¨¥Æ¥£",
- "Z:¥Ï¥¦¥ó¥É",
- "[:·ø¤¤¥¢¡¼¥Þ¡¼",
- "\\:Æß´ï(¥á¥¤¥¹/¥à¥Á/Åù)",
- "]:¼ï¡¹¤ÎËɶñ",
- "^:¥È¥é¥Ã¥×",
- "_:¾ó",
- "`:¿Í·Á¡¤Ä¦Áü",
- "a:¥¢¥ê",
- "b:¥³¥¦¥â¥ê",
- "c:¥à¥«¥Ç",
- "d:¥É¥é¥´¥ó",
- "e:ÌܶÌ",
- "f:¥Í¥³",
- "g:¥´¡¼¥ì¥à",
- "h:¥Û¥Ó¥Ã¥È/¥¨¥ë¥Õ/¥É¥ï¡¼¥Õ",
- "i:¥Ù¥È¥Ù¥È",
- "j:¥¼¥ê¡¼",
- "k:¥³¥Ü¥ë¥É",
- "l:¿åÀ³À¸Êª",
- "m:¥â¥ë¥É",
- "n:¥Ê¡¼¥¬",
- "o:¥ª¡¼¥¯",
- "p:¿Í´Ö",
- "q:»Í½Ã",
- "r:¥Í¥º¥ß",
- "s:¥¹¥±¥ë¥È¥ó",
- "t:Ä®¤Î¿Í",
- "u:²¼µé¥Ç¡¼¥â¥ó",
- "v:¥Ü¥ë¥Æ¥Ã¥¯¥¹",
- "w:¥¤¥â¥à¥·/Âç·²",
- /* "x:unused", */
- "y:¥¤¡¼¥¯",
- "z:¥¾¥ó¥Ó/¥ß¥¤¥é",
- "{:Èô¤ÓÆ»¶ñ¤ÎÃÆ(Ìð/ÃÆ)",
- "|:Åá·õÎà(¥½¡¼¥É/¥À¥¬¡¼/Åù)",
- "}:Èô¤ÓÆ»¶ñ(µÝ/¥¯¥í¥¹¥Ü¥¦/¥¹¥ê¥ó¥°)",
- "~:¿å/ÍÏ´äή(¼ï¡¹¤Î¥¢¥¤¥Æ¥à)",
-#else
- " :A dark grid",
- "!:A potion (or oil)",
- "\":An amulet (or necklace)",
- "#:A wall (or secret door)",
- "$:Treasure (gold or gems)",
- "%:A vein (magma or quartz)",
- "&:A chest",
- "':An open door",
- "(:Soft armor",
- "):A shield",
- "*:A vein with treasure or a ball monster",
- "+:A closed door",
- ",:Food (or mushroom patch)",
- "-:A wand (or rod)",
- ".:Floor",
- "/:A polearm (Axe/Pike/etc)",
- "0:Entrance to Museum",
- "1:Entrance to General Store",
- "2:Entrance to Armory",
- "3:Entrance to Weaponsmith",
- "4:Entrance to Temple",
- "5:Entrance to Alchemy shop",
- "6:Entrance to Magic store",
- "7:Entrance to Black Market",
- "8:Entrance to your home",
- "9:Entrance to the bookstore",
- "::Rubble",
- ";:A glyph of warding / explosive rune",
- "<:An up staircase",
- "=:A ring",
- ">:A down staircase",
- "?:A scroll",
- "@:You",
- "A:Angel",
- "B:Bird",
- "C:Canine",
- "D:Ancient Dragon/Wyrm",
- "E:Elemental",
- "F:Dragon Fly",
- "G:Ghost",
- "H:Hybrid",
- "I:Insect",
- "J:Snake",
- "K:Killer Beetle",
- "L:Lich",
- "M:Multi-Headed Reptile",
- "N:Mystery Living",
- "O:Ogre",
- "P:Giant Humanoid",
- "Q:Quylthulg (Pulsing Flesh Mound)",
- "R:Reptile/Amphibian",
- "S:Spider/Scorpion/Tick",
- "T:Troll",
- "U:Major Demon",
- "V:Vampire",
- "W:Wight/Wraith/etc",
- "X:Xorn/Xaren/etc",
- "Y:Yeti",
- "Z:Zephyr Hound",
- "[:Hard armor",
- "\\:A hafted weapon (mace/whip/etc)",
- "]:Misc. armor",
- "^:A trap",
- "_:A staff",
- "`:A figurine or statue",
- "a:Ant",
- "b:Bat",
- "c:Centipede",
- "d:Dragon",
- "e:Floating Eye",
- "f:Feline",
- "g:Golem",
- "h:Hobbit/Elf/Dwarf",
- "i:Icky Thing",
- "j:Jelly",
- "k:Kobold",
- "l:Aquatic monster",
- "m:Mold",
- "n:Naga",
- "o:Orc",
- "p:Person/Human",
- "q:Quadruped",
- "r:Rodent",
- "s:Skeleton",
- "t:Townsperson",
- "u:Minor Demon",
- "v:Vortex",
- "w:Worm/Worm-Mass",
- /* "x:unused", */
- "y:Yeek",
- "z:Zombie/Mummy",
- "{:A missile (arrow/bolt/shot)",
- "|:An edged weapon (sword/dagger/etc)",
- "}:A launcher (bow/crossbow/sling)",
- "~:Fluid terrain (or miscellaneous item)",
-#endif
-
- NULL
-};
-
-
-/*
* Sorting hook -- Comp function -- see below
*
* We use "u" to point to array of monster indexes,
}
-/*
- * research_mon
- * -KMW-
- */
-bool research_mon(void)
-{
- int i, n, r_idx;
- char sym, query;
- char buf[128];
-
- bool notpicked;
-
- bool recall = FALSE;
-
- u16b why = 0;
-
- u16b *who;
-
- /* XTRA HACK WHATSEARCH */
- bool all = FALSE;
- bool uniq = FALSE;
- bool norm = FALSE;
- char temp[80] = "";
-
- /* XTRA HACK REMEMBER_IDX */
- static int old_sym = '\0';
- static int old_i = 0;
-
-
- /* Save the screen */
- screen_save();
-
- /* Get a character, or abort */
-#ifdef JP
-if (!get_com("¥â¥ó¥¹¥¿¡¼¤Îʸ»ú¤òÆþÎϤ·¤Æ²¼¤µ¤¤(µ¹æ or ^AÁ´,^U¥æ,^NÈó¥æ,^M̾Á°):", &sym, FALSE))
-#else
- if (!get_com("Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): ", &sym, FALSE))
-#endif
-
- {
- /* Restore */
- screen_load();
-
- return (FALSE);
- }
-
- /* Find that character info, and describe it */
- for (i = 0; ident_info[i]; ++i)
- {
- if (sym == ident_info[i][0]) break;
- }
-
- /* XTRA HACK WHATSEARCH */
- if (sym == KTRL('A'))
- {
- all = TRUE;
-#ifdef JP
- strcpy(buf, "Á´¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
-#else
- strcpy(buf, "Full monster list.");
-#endif
- }
- else if (sym == KTRL('U'))
- {
- all = uniq = TRUE;
-#ifdef JP
- strcpy(buf, "¥æ¥Ë¡¼¥¯¡¦¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
-#else
- strcpy(buf, "Unique monster list.");
-#endif
- }
- else if (sym == KTRL('N'))
- {
- all = norm = TRUE;
-#ifdef JP
- strcpy(buf, "¥æ¥Ë¡¼¥¯³°¥â¥ó¥¹¥¿¡¼¤Î¥ê¥¹¥È");
-#else
- strcpy(buf, "Non-unique monster list.");
-#endif
- }
- else if (sym == KTRL('M'))
- {
- all = TRUE;
-#ifdef JP
- if (!get_string("̾Á°(±Ñ¸ì¤Î¾ì¹ç¾®Ê¸»ú¤Ç²Ä)",temp, 70))
-#else
- if (!get_string("Enter name:",temp, 70))
-#endif
- {
- temp[0]=0;
-
- /* Restore */
- screen_load();
-
- return FALSE;
- }
-#ifdef JP
- sprintf(buf, "̾Á°:%s¤Ë¥Þ¥Ã¥Á",temp);
-#else
- sprintf(buf, "Monsters with a name \"%s\"",temp);
-#endif
- }
- else if (ident_info[i])
- {
- sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
- }
- else
- {
-#ifdef JP
-sprintf(buf, "%c - %s", sym, "̵¸ú¤Êʸ»ú");
-#else
- sprintf(buf, "%c - %s.", sym, "Unknown Symbol");
-#endif
-
- }
-
- /* Display the result */
- prt(buf, 16, 10);
-
-
- /* Allocate the "who" array */
- C_MAKE(who, max_r_idx, u16b);
-
- /* Collect matching monsters */
- for (n = 0, i = 1; i < max_r_idx; i++)
- {
- monster_race *r_ptr = &r_info[i];
-
- /* XTRA HACK WHATSEARCH */
- /* Require non-unique monsters if needed */
- if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue;
-
- /* Require unique monsters if needed */
- if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue;
-
- /* ̾Á°¸¡º÷ */
- if (temp[0]){
- int xx;
- char temp2[80];
-
- for (xx=0; temp[xx] && xx<80; xx++){
-#ifdef JP
- if (iskanji( temp[xx])) { xx++; continue; }
-#endif
- if (isupper(temp[xx])) temp[xx]=tolower(temp[xx]);
- }
-
-#ifdef JP
- strcpy(temp2, r_name+r_ptr->E_name);
-#else
- strcpy(temp2, r_name+r_ptr->name);
-#endif
- for (xx=0; temp2[xx] && xx<80; xx++)
- if (isupper(temp2[xx])) temp2[xx]=tolower(temp2[xx]);
-
-#ifdef JP
- if (strstr(temp2, temp) || strstr_j(r_name + r_ptr->name, temp) )
-#else
- if (strstr(temp2, temp))
-#endif
- who[n++]=i;
- }
- else if (all || (r_ptr->d_char == sym)) who[n++] = i;
- }
-
- /* Nothing to recall */
- if (!n)
- {
- /* Free the "who" array */
- C_KILL(who, max_r_idx, u16b);
-
- /* Restore */
- screen_load();
-
- return (FALSE);
- }
-
- /* Sort by level */
- why = 2;
- query = 'y';
-
- /* Sort if needed */
- if (why)
- {
- /* Select the sort method */
- ang_sort_comp = ang_sort_comp_hook;
- ang_sort_swap = ang_sort_swap_hook;
-
- /* Sort the array */
- ang_sort(who, &why, n);
- }
-
-
- /* Start at the end */
- /* XTRA HACK REMEMBER_IDX */
- if (old_sym == sym && old_i < n) i = old_i;
- else i = n - 1;
-
- notpicked = TRUE;
-
- /* Scan the monster memory */
- while (notpicked)
- {
- /* Extract a race */
- r_idx = who[i];
-
- /* Save this monster ID */
- p_ptr->monster_race_idx = r_idx;
-
- /* Hack -- Handle stuff */
- handle_stuff();
-
- /* Hack -- Begin the prompt */
- roff_top(r_idx);
-
- /* Hack -- Complete the prompt */
-#ifdef JP
-Term_addstr(-1, TERM_WHITE, " ['r'»×¤¤½Ð, ' '¤Ç³¹Ô, ESC]");
-#else
- Term_addstr(-1, TERM_WHITE, " [(r)ecall, ESC, space to continue]");
-#endif
-
-
- /* Interact */
- while (1)
- {
- /* Recall */
- if (recall)
- {
- /* Recall on screen */
- monster_race *r_ptr = &r_info[r_idx];
- int m;
-
- /* Hack -- Maximal info */
- r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
-
- /* Observe "maximal" attacks */
- for (m = 0; m < 4; m++)
- {
- /* Examine "actual" blows */
- if (r_ptr->blow[m].effect || r_ptr->blow[m].method)
- {
- /* Hack -- maximal observations */
- r_ptr->r_blows[m] = MAX_UCHAR;
- }
- }
-
- /* Hack -- maximal drops */
- r_ptr->r_drop_gold = r_ptr->r_drop_item =
- (((r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) +
- ((r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) +
- ((r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) +
- ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) +
- ((r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) +
- ((r_ptr->flags1 & RF1_DROP_60) ? 1 : 0));
-
- /* Hack -- but only "valid" drops */
- if (r_ptr->flags1 & RF1_ONLY_GOLD) r_ptr->r_drop_item = 0;
- if (r_ptr->flags1 & RF1_ONLY_ITEM) r_ptr->r_drop_gold = 0;
-
- /* Hack -- observe many spells */
- r_ptr->r_cast_spell = MAX_UCHAR;
-
- /* Hack -- know all the flags */
- r_ptr->r_flags1 = r_ptr->flags1;
- r_ptr->r_flags2 = r_ptr->flags2;
- r_ptr->r_flags3 = r_ptr->flags3;
- r_ptr->r_flags4 = r_ptr->flags4;
- r_ptr->r_flags5 = r_ptr->flags5;
- r_ptr->r_flags6 = r_ptr->flags6;
-
- r_ptr->r_xtra1 |= MR1_SINKA;
-
- /* know every thing mode */
- screen_roff(r_idx, 0x01);
- notpicked = FALSE;
-
- /* XTRA HACK REMEMBER_IDX */
- old_sym = sym;
- old_i = i;
- }
-
- /* Command */
- query = inkey();
-
- /* Normal commands */
- if (query != 'r') break;
-
- /* Toggle recall */
- recall = !recall;
- }
-
- /* Stop scanning */
- if (query == ESCAPE) break;
-
- /* Move to "prev" monster */
- if (query == '-')
- {
- if (++i == n)
- {
- i = 0;
- if (!expand_list) break;
- }
- }
-
- /* Move to "next" monster */
- else
- {
- if (i-- == 0)
- {
- i = n - 1;
- if (!expand_list) break;
- }
- }
- }
-
-
- /* Re-display the identity */
- /* prt(buf, 5, 5);*/
-
- /* Free the "who" array */
- C_KILL(who, max_r_idx, u16b);
-
- /* Restore */
- screen_load();
-
- return (!notpicked);
-}
-
*/
extern int max_macrotrigger;
-extern char *macro_template;
-extern char *macro_modifier_chr;
-extern char *macro_modifier_name[MAX_MACRO_MOD];
-extern char *macro_trigger_name[MAX_MACRO_TRIG];
-extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG];
+extern cptr macro_template;
+extern cptr macro_modifier_chr;
+extern cptr macro_modifier_name[MAX_MACRO_MOD];
+extern cptr macro_trigger_name[MAX_MACRO_TRIG];
+extern cptr macro_trigger_keycode[2][MAX_MACRO_TRIG];
/* ÆüËܸìÈǵ¡Ç½ÄɲäǻȤ¦ */
extern byte conv_terrain2feat[MAX_WILDERNESS];
extern cptr silly_attacks[MAX_SILLY_ATTACK];
extern monster_power monster_powers[MAX_MONSPELLS];
+extern cptr ident_info[];
/* variable.c */
extern cptr copyright[5];
extern void do_cmd_look(void);
extern void do_cmd_locate(void);
extern void do_cmd_query_symbol(void);
-extern bool research_mon(void);
extern void kamaenaoshi(int item);
extern bool ang_sort_comp_hook(vptr u, vptr v, int a, int b);
extern void ang_sort_swap_hook(vptr u, vptr v, int a, int b);
extern errr get_mon_num_prep(monster_hook_type monster_hook, monster_hook_type monster_hook2);
extern s16b get_mon_num(int level);
extern void monster_desc(char *desc, monster_type *m_ptr, int mode);
-extern void lore_do_probe(int m_idx);
+extern int lore_do_probe(int r_idx);
extern void lore_treasure(int m_idx, int num_item, int num_gold);
extern void sanity_blast(monster_type *m_ptr, bool necro);
extern void update_mon(int m_idx, bool full);
}
}
}
- /* set macro trigger names and a template */
+ /* Initialize macro trigger names and a template */
/* Process "T:<trigger>:<keycode>:<shift-keycode>" */
/* Process "T:<template>:<modifier chr>:<modifier name>:..." */
else if (buf[0] == 'T')
{
int len, tok;
tok = tokenize(buf+2, 2+MAX_MACRO_MOD, zz, 0);
+
+ /* Process "T:<template>:<modifier chr>:<modifier name>:..." */
if (tok >= 4)
{
int i;
if (macro_template != NULL)
{
- free(macro_template);
+ num = strlen(macro_modifier_chr);
+
+ /* Kill the template string */
+ string_free(macro_template);
macro_template = NULL;
+
+ /* Kill flag characters of modifier keys */
+ string_free(macro_modifier_chr);
+
+ /* Kill corresponding modifier names */
+ for (i = 0; i < num; i++)
+ {
+ string_free(macro_modifier_name[i]);
+ }
+
+ /* Kill trigger name strings */
for (i = 0; i < max_macrotrigger; i++)
- free(macro_trigger_name[i]);
+ {
+ string_free(macro_trigger_name[i]);
+ string_free(macro_trigger_keycode[0][i]);
+ string_free(macro_trigger_keycode[1][i]);
+ }
+
max_macrotrigger = 0;
}
if (*zz[0] == '\0') return 0; /* clear template */
+
+ /* Number of modifier flags */
num = strlen(zz[1]);
- if (2 + num != tok) return 1; /* error */
- len = strlen(zz[0])+1+num+1;
- for (i = 0; i < num; i++)
- len += strlen(zz[2+i])+1;
- macro_template = malloc(len);
-
- strcpy(macro_template, zz[0]);
- macro_modifier_chr =
- macro_template + strlen(macro_template) + 1;
- strcpy(macro_modifier_chr, zz[1]);
- macro_modifier_name[0] =
- macro_modifier_chr + strlen(macro_modifier_chr) + 1;
+ /* Limit the number */
+ num = MIN(MAX_MACRO_MOD, num);
+
+ /* Stop if number of modifier is not correct */
+ if (2 + num != tok) return 1;
+
+ /* Get a template string */
+ macro_template = string_make(zz[0]);
+
+ /* Get flag characters of modifier keys */
+ macro_modifier_chr = string_make(zz[1]);
+
+ /* Get corresponding modifier names */
for (i = 0; i < num; i++)
{
- strcpy(macro_modifier_name[i], zz[2+i]);
- macro_modifier_name[i+1] = macro_modifier_name[i] +
- strlen(macro_modifier_name[i]) + 1;
+ macro_modifier_name[i] = string_make(zz[2+i]);
}
}
+
+ /* Process "T:<trigger>:<keycode>:<shift-keycode>" */
else if (tok >= 2)
{
+ char buf[1024];
int m;
char *t, *s;
if (max_macrotrigger >= MAX_MACRO_TRIG)
m = max_macrotrigger;
max_macrotrigger++;
- len = strlen(zz[0]) + 1 + strlen(zz[1]) + 1;
- if (tok == 3)
- len += strlen(zz[2]) + 1;
- macro_trigger_name[m] = malloc(len);
-
- t = macro_trigger_name[m];
+ /* Take into account the escape character */
+ t = buf;
s = zz[0];
while (*s)
{
}
*t = '\0';
- macro_trigger_keycode[0][m] = macro_trigger_name[m] +
- strlen(macro_trigger_name[m]) + 1;
- strcpy(macro_trigger_keycode[0][m], zz[1]);
- if (tok == 3)
- {
- macro_trigger_keycode[1][m] = macro_trigger_keycode[0][m] +
- strlen(macro_trigger_keycode[0][m]) + 1;
- strcpy(macro_trigger_keycode[1][m], zz[2]);
- }
- else
- {
- macro_trigger_keycode[1][m] = macro_trigger_keycode[0][m];
- }
+ /* Get a trigger name */
+ macro_trigger_name[m] = string_make(buf);
+
+ /* Get the corresponding key code */
+ macro_trigger_keycode[0][m] = string_make(zz[1]);
+
+ /* Key code of a combination of it with the shift key */
+ macro_trigger_keycode[1][m] = string_make(zz[2]);
}
+
+ /* No error */
return 0;
}
* When a monster is at a place where player will return,
* Get out of the my way!
*/
-static void get_out_monster()
+static void get_out_monster(void)
{
int tries = 0;
int dis = 1;
flags6 = (r_ptr->flags6 & r_ptr->r_flags6);
flags7 = (r_ptr->flags7 & r_ptr->flags7);
- /* cheat_know or reserch_mon() */
+ /* cheat_know or research_mon() */
if (cheat_know || (mode & 0x01))
know_everything = TRUE;
/*
* Learn about a monster (by "probing" it)
+ *
+ * Return the number of new flags learnt. -Mogami-
*/
-void lore_do_probe(int m_idx)
+int lore_do_probe(int r_idx)
{
- monster_type *m_ptr = &m_list[m_idx];
-
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
+ monster_race *r_ptr = &r_info[r_idx];
+ int i, n = 0;
+ byte tmp_byte;
+
+ /* Maximal info about awareness */
+ if (r_ptr->r_wake != MAX_UCHAR) n++;
+ if (r_ptr->r_ignore != MAX_UCHAR) n++;
+ r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR;
+
+ /* Observe "maximal" attacks */
+ for (i = 0; i < 4; i++)
+ {
+ /* Examine "actual" blows */
+ if (r_ptr->blow[i].effect || r_ptr->blow[i].method)
+ {
+ /* Maximal observations */
+ if (r_ptr->r_blows[i] != MAX_UCHAR) n++;
+ r_ptr->r_blows[i] = MAX_UCHAR;
+ }
+ }
+
+ /* Maximal drops */
+ tmp_byte =
+ (((r_ptr->flags1 & RF1_DROP_4D2) ? 8 : 0) +
+ ((r_ptr->flags1 & RF1_DROP_3D2) ? 6 : 0) +
+ ((r_ptr->flags1 & RF1_DROP_2D2) ? 4 : 0) +
+ ((r_ptr->flags1 & RF1_DROP_1D2) ? 2 : 0) +
+ ((r_ptr->flags1 & RF1_DROP_90) ? 1 : 0) +
+ ((r_ptr->flags1 & RF1_DROP_60) ? 1 : 0));
+
+ /* Only "valid" drops */
+ if (!(r_ptr->flags1 & RF1_ONLY_GOLD))
+ {
+ if (r_ptr->r_drop_item != tmp_byte) n++;
+ r_ptr->r_drop_item = tmp_byte;
+ }
+ if (!(r_ptr->flags1 & RF1_ONLY_ITEM))
+ {
+ if (r_ptr->r_drop_gold != tmp_byte) n++;
+ r_ptr->r_drop_gold = tmp_byte;
+ }
+
+ /* Observe many spells */
+ if (r_ptr->r_cast_spell != MAX_UCHAR) n++;
+ r_ptr->r_cast_spell = MAX_UCHAR;
+
+ /* Count unknown flags */
+ for (i = 0; i < 32; i++)
+ {
+ if (!(r_ptr->r_flags1 & (1L << i)) &&
+ (r_ptr->flags1 & (1L << i))) n++;
+ if (!(r_ptr->r_flags2 & (1L << i)) &&
+ (r_ptr->flags2 & (1L << i))) n++;
+ if (!(r_ptr->r_flags3 & (1L << i)) &&
+ (r_ptr->flags3 & (1L << i))) n++;
+ if (!(r_ptr->r_flags4 & (1L << i)) &&
+ (r_ptr->flags4 & (1L << i))) n++;
+ if (!(r_ptr->r_flags5 & (1L << i)) &&
+ (r_ptr->flags5 & (1L << i))) n++;
+ if (!(r_ptr->r_flags6 & (1L << i)) &&
+ (r_ptr->flags6 & (1L << i))) n++;
+
+ /* r_flags7 is actually unused */
+#if 0
+ if (!(r_ptr->r_flags7 & (1L << i)) &&
+ (r_ptr->flags7 & (1L << i))) n++;
+#endif
+ }
- /* Hack -- Memorize some flags */
+ /* Know all the flags */
r_ptr->r_flags1 = r_ptr->flags1;
r_ptr->r_flags2 = r_ptr->flags2;
r_ptr->r_flags3 = r_ptr->flags3;
+ r_ptr->r_flags4 = r_ptr->flags4;
+ r_ptr->r_flags5 = r_ptr->flags5;
+ r_ptr->r_flags6 = r_ptr->flags6;
+
+ /* r_flags7 is actually unused */
+ /* r_ptr->r_flags7 = r_ptr->flags7; */
+
+ /* Know about evolution */
+ if (!(r_ptr->r_xtra1 & MR1_SINKA)) n++;
+ r_ptr->r_xtra1 |= MR1_SINKA;
/* Update monster recall window */
- if (p_ptr->monster_race_idx == m_ptr->r_idx)
+ if (p_ptr->monster_race_idx == r_idx)
{
/* Window stuff */
p_ptr->window |= (PW_MONSTER);
}
+
+ /* Return the number of new flags learnt */
+ return n;
}
char m_name[80];
/* Start the message */
+ if (!probe)
+ {
#ifdef JP
- if (!probe) {msg_print("Ä´ººÃæ...");msg_print(NULL);}
+ msg_print("Ä´ººÃæ...");
#else
- if (!probe) {msg_print("Probing...");msg_print(NULL);}
+ msg_print("Probing...");
#endif
+ }
+
+ msg_print(NULL);
if (m_ptr->ap_r_idx != m_ptr->r_idx)
{
p_ptr->window |= (PW_MESSAGE);
window_stuff();
- /* Learn all of the non-spell, non-treasure flags */
- lore_do_probe(i);
-
if (m_ptr->ml) move_cursor_relative(m_ptr->fy, m_ptr->fx);
inkey();
Term_erase(0, 0, 255);
+ /* Learn everything about this monster */
+ if (lore_do_probe(m_ptr->r_idx))
+ {
+#ifdef JP
+ /* Note that we learnt some new flags -Mogami- */
+ msg_format("%s¤Ë¤Ä¤¤¤Æ¤µ¤é¤Ë¾Ü¤·¤¯¤Ê¤Ã¤¿µ¤¤¬¤¹¤ë¡£", m_name);
+#else
+ char buf[80];
+
+ /* Get base name of monster */
+ strcpy(buf, (r_name + r_ptr->name));
+
+ /* Pluralize it */
+ plural_aux(buf);
+
+ /* Note that we learnt some new flags -Mogami- */
+ msg_format("You now know more about %s.", buf);
+#endif
+ /* Clear -more- prompt */
+ msg_print(NULL);
+ }
+
/* Probe worked */
probe = TRUE;
}
"pusupusu"
};
#endif
+
+
+/*
+ * The table of "symbol info" -- each entry is a string of the form
+ * "X:desc" where "X" is the trigger, and "desc" is the "info".
+ */
+cptr ident_info[] =
+{
+#ifdef JP
+ " :°Å°Ç",
+ "!:Ìô, ¥ª¥¤¥ë",
+ "\":¥¢¥ß¥å¥ì¥Ã¥È, ðô¾þ¤ê",
+ "#:ÊÉ(±£¤·¥É¥¢)Ëô¤Ï¿¢Êª",
+ "$:ºâÊõ(¶â¤«ÊõÀÐ)",
+ "%:¹ÛÌ®(Íϴ䤫ÀбÑ)",
+ "&:Ȣ",
+ "':³«¤¤¤¿¥É¥¢",
+ "(:Æð¤é¤«¤¤Ëɶñ",
+ "):½â",
+ "*:ºâÊõ¤ò´Þ¤ó¤À¹ÛÌ®¤Þ¤¿¤Ïµå·Á¤Î²øʪ",
+ "+:ÊĤ¸¤¿¥É¥¢",
+ ",:¿©¤Ùʪ, ¤ª¤Ð¤±¥¥Î¥³",
+ "-:ËâË¡ËÀ, ¥í¥Ã¥É",
+ ".:¾²",
+ "/:´È¾õÉð´ï(¥¢¥Ã¥¯¥¹/¥Ñ¥¤¥¯/Åù)",
+ "0:Çîʪ´Û¤ÎÆþ¸ý",
+ "1:»¨²ß²°¤ÎÆþ¸ý",
+ "2:Ëɶñ²°¤ÎÆþ¸ý",
+ "3:Éð´ïÀìÌ珤ÎÆþ¸ý",
+ "4:»û±¡¤ÎÆþ¸ý",
+ "5:Ï£¶â½Ñ¤ÎŹ¤ÎÆþ¸ý",
+ "6:ËâË¡¤ÎŹ¤ÎÆþ¸ý",
+ "7:¥Ö¥é¥Ã¥¯¥Þ¡¼¥±¥Ã¥È¤ÎÆþ¸ý",
+ "8:²æ¤¬²È¤ÎÆþ¸ý",
+ "9:½ñŹ¤ÎÆþ¸ý",
+ "::´äÀÐ",
+ ";:²óÈò¤Î³¨Ê¸»ú/Çúȯ¤Î¥ë¡¼¥ó",
+ "<:¾å¤ê³¬ÃÊ",
+ "=:»ØÎØ",
+ ">:²¼¤ê³¬ÃÊ",
+ "?:´¬Êª",
+ "@:¥×¥ì¥¤¥ä¡¼",
+ "A:Å·»È",
+ "B:Ļ",
+ "C:¸¤",
+ "D:¸ÅÂå¥É¥é¥´¥ó/¥ï¥¤¥¢¡¼¥à",
+ "E:¥¨¥ì¥á¥ó¥¿¥ë",
+ "F:¥È¥ó¥Ü",
+ "G:¥´¡¼¥¹¥È",
+ "H:»¨¼ï",
+ "I:º«Ãî",
+ "J:¥Ø¥Ó",
+ "K:¥¥é¡¼¡¦¥Ó¡¼¥È¥ë",
+ "L:¥ê¥Ã¥Á",
+ "M:¿¼ó¤Îà¨ÃîÎà",
+ "N:Ææ¤ÎÀ¸Êª",
+ "O:¥ª¡¼¥¬",
+ "P:µðÂç¿Í´Ö·¿À¸Êª",
+ "Q:¥¯¥¤¥ë¥¹¥ë¥°(Ì®ÂǤÄÆù²ô)",
+ "R:à¨ÃîÎà/ξÀ¸Îà",
+ "S:ÃØéá/¥µ¥½¥ê/¥À¥Ë",
+ "T:¥È¥í¥ë",
+ "U:¾åµé¥Ç¡¼¥â¥ó",
+ "V:¥Ð¥ó¥Ñ¥¤¥¢",
+ "W:¥ï¥¤¥È/¥ì¥¤¥¹/Åù",
+ "X:¥¾¡¼¥ó/¥¶¥ì¥ó/Åù",
+ "Y:¥¤¥¨¥Æ¥£",
+ "Z:¥Ï¥¦¥ó¥É",
+ "[:·ø¤¤¥¢¡¼¥Þ¡¼",
+ "\\:Æß´ï(¥á¥¤¥¹/¥à¥Á/Åù)",
+ "]:¼ï¡¹¤ÎËɶñ",
+ "^:¥È¥é¥Ã¥×",
+ "_:¾ó",
+ "`:¿Í·Á¡¤Ä¦Áü",
+ "a:¥¢¥ê",
+ "b:¥³¥¦¥â¥ê",
+ "c:¥à¥«¥Ç",
+ "d:¥É¥é¥´¥ó",
+ "e:ÌܶÌ",
+ "f:¥Í¥³",
+ "g:¥´¡¼¥ì¥à",
+ "h:¥Û¥Ó¥Ã¥È/¥¨¥ë¥Õ/¥É¥ï¡¼¥Õ",
+ "i:¥Ù¥È¥Ù¥È",
+ "j:¥¼¥ê¡¼",
+ "k:¥³¥Ü¥ë¥É",
+ "l:¿åÀ³À¸Êª",
+ "m:¥â¥ë¥É",
+ "n:¥Ê¡¼¥¬",
+ "o:¥ª¡¼¥¯",
+ "p:¿Í´Ö",
+ "q:»Í½Ã",
+ "r:¥Í¥º¥ß",
+ "s:¥¹¥±¥ë¥È¥ó",
+ "t:Ä®¤Î¿Í",
+ "u:²¼µé¥Ç¡¼¥â¥ó",
+ "v:¥Ü¥ë¥Æ¥Ã¥¯¥¹",
+ "w:¥¤¥â¥à¥·/Âç·²",
+ /* "x:unused", */
+ "y:¥¤¡¼¥¯",
+ "z:¥¾¥ó¥Ó/¥ß¥¤¥é",
+ "{:Èô¤ÓÆ»¶ñ¤ÎÃÆ(Ìð/ÃÆ)",
+ "|:Åá·õÎà(¥½¡¼¥É/¥À¥¬¡¼/Åù)",
+ "}:Èô¤ÓÆ»¶ñ(µÝ/¥¯¥í¥¹¥Ü¥¦/¥¹¥ê¥ó¥°)",
+ "~:¿å/ÍÏ´äή(¼ï¡¹¤Î¥¢¥¤¥Æ¥à)",
+#else
+ " :A dark grid",
+ "!:A potion (or oil)",
+ "\":An amulet (or necklace)",
+ "#:A wall (or secret door)",
+ "$:Treasure (gold or gems)",
+ "%:A vein (magma or quartz)",
+ "&:A chest",
+ "':An open door",
+ "(:Soft armor",
+ "):A shield",
+ "*:A vein with treasure or a ball monster",
+ "+:A closed door",
+ ",:Food (or mushroom patch)",
+ "-:A wand (or rod)",
+ ".:Floor",
+ "/:A polearm (Axe/Pike/etc)",
+ "0:Entrance to Museum",
+ "1:Entrance to General Store",
+ "2:Entrance to Armory",
+ "3:Entrance to Weaponsmith",
+ "4:Entrance to Temple",
+ "5:Entrance to Alchemy shop",
+ "6:Entrance to Magic store",
+ "7:Entrance to Black Market",
+ "8:Entrance to your home",
+ "9:Entrance to the bookstore",
+ "::Rubble",
+ ";:A glyph of warding / explosive rune",
+ "<:An up staircase",
+ "=:A ring",
+ ">:A down staircase",
+ "?:A scroll",
+ "@:You",
+ "A:Angel",
+ "B:Bird",
+ "C:Canine",
+ "D:Ancient Dragon/Wyrm",
+ "E:Elemental",
+ "F:Dragon Fly",
+ "G:Ghost",
+ "H:Hybrid",
+ "I:Insect",
+ "J:Snake",
+ "K:Killer Beetle",
+ "L:Lich",
+ "M:Multi-Headed Reptile",
+ "N:Mystery Living",
+ "O:Ogre",
+ "P:Giant Humanoid",
+ "Q:Quylthulg (Pulsing Flesh Mound)",
+ "R:Reptile/Amphibian",
+ "S:Spider/Scorpion/Tick",
+ "T:Troll",
+ "U:Major Demon",
+ "V:Vampire",
+ "W:Wight/Wraith/etc",
+ "X:Xorn/Xaren/etc",
+ "Y:Yeti",
+ "Z:Zephyr Hound",
+ "[:Hard armor",
+ "\\:A hafted weapon (mace/whip/etc)",
+ "]:Misc. armor",
+ "^:A trap",
+ "_:A staff",
+ "`:A figurine or statue",
+ "a:Ant",
+ "b:Bat",
+ "c:Centipede",
+ "d:Dragon",
+ "e:Floating Eye",
+ "f:Feline",
+ "g:Golem",
+ "h:Hobbit/Elf/Dwarf",
+ "i:Icky Thing",
+ "j:Jelly",
+ "k:Kobold",
+ "l:Aquatic monster",
+ "m:Mold",
+ "n:Naga",
+ "o:Orc",
+ "p:Person/Human",
+ "q:Quadruped",
+ "r:Rodent",
+ "s:Skeleton",
+ "t:Townsperson",
+ "u:Minor Demon",
+ "v:Vortex",
+ "w:Worm/Worm-Mass",
+ /* "x:unused", */
+ "y:Yeek",
+ "z:Zombie/Mummy",
+ "{:A missile (arrow/bolt/shot)",
+ "|:An edged weapon (sword/dagger/etc)",
+ "}:A launcher (bow/crossbow/sling)",
+ "~:Fluid terrain (or miscellaneous item)",
+#endif
+
+ NULL
+};
+
+
int max_macrotrigger = 0;
-char *macro_template = NULL;
-char *macro_modifier_chr;
-char *macro_modifier_name[MAX_MACRO_MOD];
-char *macro_trigger_name[MAX_MACRO_TRIG];
-char *macro_trigger_keycode[2][MAX_MACRO_TRIG];
+cptr macro_template = NULL;
+cptr macro_modifier_chr;
+cptr macro_modifier_name[MAX_MACRO_MOD];
+cptr macro_trigger_name[MAX_MACRO_TRIG];
+cptr macro_trigger_keycode[2][MAX_MACRO_TRIG];
/* ¥ì¥Ù¥ë¥¢¥Ã¥×¤Î»þ¤Ë¾å¾ºÎ̤òɽ¼¨¤¹¤ë¤Î¤Ë»È¤¦ */
int level_up = 0;