-/* File: cmd5.c */
-
-/*
+/*!
+ * @file cmd5.c
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎËâË¡¤Ë´Ø¤¹¤ë¥³¥Þ¥ó¥É¤Î¼ÂÁõ / Spell/Prayer commands
+ * @date 2014/01/02
+ * @author
* Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
*
* This software may be copied and distributed for educational, research,
* are included in all such copies. Other copyrights may also apply.
*/
-/* Purpose: Spell/Prayer commands */
#include "angband.h"
+/*!
+ * @brief ÎΰèËâË¡¤Ë±þ¤¸¤Æµ»Ç½¤Î̾¾Î¤òÊÖ¤¹¡£
+ * @param tval ËâË¡½ñ¤Îtval
+ * @return ÎΰèËâË¡¤Îµ»Ç½Ì¾¾Î¤òÊݴɤ·¤¿Ê¸»úÎó¥Ý¥¤¥ó¥¿
+ */
cptr spell_category_name(int tval)
{
switch (tval)
}
}
-/*
+
+bool select_the_force = FALSE;
+
+/*!
+ * @brief ÎΰèËâË¡¤Î±ÜÍ÷¡¢³Ø½¬¡¢»ÈÍÑÁªÂò¤¹¤ë¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹½èÍý
* Allow user to choose a spell/prayer from the given book.
- *
+ * @param sn ÁªÂò¤·¤¿ËâË¡ID¤òÊÖ¤¹»²¾È¥Ý¥¤¥ó¥¿
+ * @param prompt ËâË¡¤òÍøÍѤ¹¤ëºÝ¤ÎÆ°»ìɽµ
+ * @param sval ËâÆ»½ñ¤Îsval
+ * @param learned ±ÜÍ÷/»ÈÍÑÁªÂò¤Ê¤é¤ÐTRUE¡¢³Ø½¬½èÍý¤Ê¤éFALSE
+ * @param use_realm ËâË¡ÎΰèID
+ * @return
+ * <pre>
* If a valid spell is chosen, saves it in '*sn' and returns TRUE
* If the user hits escape, returns FALSE, and set '*sn' to -1
* If there are no legal choices, returns FALSE, and sets '*sn' to -2
- *
* The "prompt" should be "cast", "recite", or "study"
* The "known" should be TRUE for cast/pray, FALSE for study
+ * </pre>
*/
-
-bool select_the_force = FALSE;
-
static int get_spell(int *sn, cptr prompt, int sval, bool learned, int use_realm)
{
int i;
byte spells[64];
bool flag, redraw, okay;
char choice;
- magic_type *s_ptr;
+ const magic_type *s_ptr;
char out_val[160];
cptr p;
#ifdef JP
return TRUE;
}
-
+/*!
+ * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤¬¥×¥ì¥¤¥ä¡¼¤¬»ÈÍѲÄǽ¤ÊËâÆ»½ñ¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param o_ptr ȽÄꤷ¤¿¤¤¥ª¥Ö²ñ¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @return ³Ø½¬¤Ç¤¤ëËâÆ»½ñ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
static bool item_tester_learn_spell(object_type *o_ptr)
{
s32b choices = realm_choices2[p_ptr->pclass];
return (FALSE);
}
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤¬ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤«¤òȽÄꤹ¤ë
+ * @return ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤Ê¤éTRUE¤òÊÖ¤¹
+ */
static bool player_has_no_spellbooks(void)
{
int i;
return TRUE;
}
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Î¿¦¶È¤¬Îýµ¤½Ñ»Õ¤Î»þ¡¢ÎΰèËâË¡¤ÈÎýµ¤½Ñ¤òÀڤ괹¤¨¤ë½èÍý¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹
+ * @param browse_only ËâË¡¤Èµ»Ç½¤Î±ÜÍ÷¤ò¹Ô¤¦¤Ê¤é¤ÐTRUE
+ * @return ËâÆ»½ñ¤ò°ìºý¤â»ý¤Ã¤Æ¤¤¤Ê¤¤¤Ê¤éTRUE¤òÊÖ¤¹
+ */
static void confirm_use_force(bool browse_only)
{
int item;
}
-/*
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎËâË¡¤Èµ»Ç½¤ò±ÜÍ÷¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
* Peruse the spells/prayers in a book
- *
+ * @return ¤Ê¤·
+ * @details
+ * <pre>
* Note that *all* spells in the book are listed
*
* Note that browsing is allowed while confused or blind,
* and in the dark, primarily to allow browsing in stores.
+ * </pre>
*/
void do_cmd_browse(void)
{
screen_load();
}
-
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÂèÆóËâË¡Îΰè¤òÊѹ¹¤¹¤ë /
+ * @param next_realm Êѹ¹Àè¤ÎËâË¡ÎΰèID
+ * @return ¤Ê¤·
+ */
static void change_realm2(int next_realm)
{
int i, j = 0;
}
-/*
+/*!
+ * @brief ËâË¡¤ò³Ø½¬¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
* Study a book to gain a new spell/prayer
+ * @return ¤Ê¤·
*/
void do_cmd_study(void)
{
p_ptr->window |= (PW_OBJECT);
}
-
+/*!
+ * @brief ±¿Ì¿¤ÎÎØ¡¢Ê¤Ӥ˥«¥ª¥¹Åª¤Ê¸ú²Ì¤Îȯư
+ * @param spell ¥é¥ó¥À¥à¤Ê¸ú²Ì¤òÁªÂò¤¹¤ë¤¿¤á¤Î´ð½àID
+ * @return ¤Ê¤·
+ */
static void wild_magic(int spell)
{
int counter = 0;
}
-/*
+/*!
+ * @brief ËâË¡¤ò±Ó¾§¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
* Cast a spell
+ * @return ¤Ê¤·
*/
void do_cmd_cast(void)
{
object_type *o_ptr;
- magic_type *s_ptr;
+ const magic_type *s_ptr;
cptr q, s;
+ bool over_exerted = FALSE;
+
/* Require spell ability */
if (!p_ptr->realm1 && (p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE))
{
return;
}
+ /* Hex */
+ if (p_ptr->realm1 == REALM_HEX)
+ {
+ if (hex_spell_fully())
+ {
+ bool flag = FALSE;
+#ifdef JP
+ msg_print("¤³¤ì°Ê¾å¿·¤·¤¤¼öʸ¤ò±Ó¾§¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£");
+#else
+ msg_print("Can not spell new spells more.");
+#endif
+ flush();
+ if (p_ptr->lev >= 35) flag = stop_hex_spell();
+ if (!flag) return;
+ }
+ }
+
if (p_ptr->pclass == CLASS_FORCETRAINER)
{
if (player_has_no_spellbooks())
use_realm = tval2realm(o_ptr->tval);
+ /* Hex */
+ if (use_realm == REALM_HEX)
+ {
+ if (hex_spelling(spell))
+ {
+#ifdef JP
+ msg_print("¤½¤Î¼öʸ¤Ï¤¹¤Ç¤Ë±Ó¾§Ãæ¤À¡£");
+#else
+ msg_print("You are already casting it.");
+#endif
+ return;
+ }
+ }
+
if (!is_magic(use_realm))
{
s_ptr = &technic_info[use_realm - MIN_TECHNIC][spell];
}
-
/* Spell failure chance */
chance = spell_chance(spell, use_realm);
+ /* Sufficient mana */
+ if (need_mana <= p_ptr->csp)
+ {
+ /* Use some mana */
+ p_ptr->csp -= need_mana;
+ }
+ else over_exerted = TRUE;
+
+ /* Redraw mana */
+ p_ptr->redraw |= (PR_MANA);
+
/* Failed spell */
if (randint0(100) < chance)
{
case REALM_CRUSADE:
if (randint1(100) < chance) chg_virtue(V_JUSTICE, -1);
break;
+ case REALM_HEX:
+ if (randint1(100) < chance) chg_virtue(V_COMPASSION, -1);
+ break;
default:
if (randint1(100) < chance) chg_virtue(V_KNOWLEDGE, -1);
break;
take_hit(DAMAGE_LOSELIFE, damroll(o_ptr->sval + 1, 6), "a miscast Death spell", -1);
#endif
- if ((spell > 15) && one_in_(6) && !p_ptr->hold_life)
+ if ((spell > 15) && one_in_(6) && !p_ptr->hold_exp)
lose_exp(spell * 250);
}
}
chg_virtue(V_NATURE, 1);
chg_virtue(V_HARMONY, 1);
break;
+ case REALM_HEX:
+ chg_virtue(V_JUSTICE, -1);
+ chg_virtue(V_FAITH, -1);
+ chg_virtue(V_HONOUR, -1);
+ chg_virtue(V_COMPASSION, -1);
+ break;
default:
chg_virtue(V_KNOWLEDGE, 1);
break;
if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_NATURE, 1);
if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HARMONY, 1);
break;
+ case REALM_HEX:
+ if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_JUSTICE, -1);
+ if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_FAITH, -1);
+ if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_HONOUR, -1);
+ if (randint1(100 + p_ptr->lev) < need_mana) chg_virtue(V_COMPASSION, -1);
+ break;
}
if (mp_ptr->spell_xtra & MAGIC_GAIN_EXP)
{
/* Take a turn */
energy_use = 100;
- /* Sufficient mana */
- if (need_mana <= p_ptr->csp)
- {
- /* Use some mana */
- p_ptr->csp -= need_mana;
- }
/* Over-exert the player */
- else
+ if(over_exerted)
{
int oops = need_mana;
case REALM_CRUSADE:
chg_virtue(V_JUSTICE, -10);
break;
+ case REALM_HEX:
+ chg_virtue(V_COMPASSION, 10);
+ break;
default:
chg_virtue(V_KNOWLEDGE, -10);
break;
}
}
- /* Redraw mana */
- p_ptr->redraw |= (PR_MANA);
-
/* Window stuff */
p_ptr->window |= (PW_PLAYER);
p_ptr->window |= (PW_SPELL);
}
-
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥â¥ó¥¹¥¿¡¼¤ò¥½¡¼¥È¤¹¤ë¤¿¤á¤ÎÈæ³Ó½èÍý
+ * @param u ¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤ÂÎÇÛÎó
+ * @param v ̤»ÈÍÑ
+ * @param a Èæ³ÓÂоݤΥâ¥ó¥¹¥¿¡¼ID1
+ * @param b Èæ³ÓÂоݤΥâ¥ó¥¹¥¿¡¼ID2
+ * @return 2ÈÖÌܤ¬Âç¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
{
u16b *who = (u16b*)(u);
return w1 <= w2;
}
+/*!
+ * @brief ¥Ú¥Ã¥È¤ÎÁ±°Â°À¤Ë±þ¤¸¤¿°Ý»ý¥³¥¹¥È¤ÎÅÓÃæ·×»»½èÍý
+ * @param m_ptr ·×»»´ð½à¤È¤Ê¤ë¥â¥ó¥¹¥¿¡¼¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @param inc m_ptr¤Ç»ØÄꤷ¤¿¥â¥ó¥¹¥¿¡¼¤ò°Ý»ý¥³¥¹¥È·×»»¤Ë²Ã¤¨¤ë¤Ê¤éTRUE¡¢³°¤¹¤Ê¤éFALSE¤ò»ØÄê
+ * @return ¤Ê¤·
+ */
+void check_pets_num_and_align(monster_type *m_ptr, bool inc)
+{
+ s32b old_friend_align = friend_align;
+ monster_race *r_ptr = &r_info[m_ptr->r_idx];
+
+ if (inc)
+ {
+ total_friends++;
+ if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
+ if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
+ }
+ else
+ {
+ total_friends--;
+ if (r_ptr->flags3 & RF3_GOOD) friend_align -= r_ptr->level;
+ if (r_ptr->flags3 & RF3_EVIL) friend_align += r_ptr->level;
+ }
+
+ if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
+}
+
+/*!
+ * @brief ¥Ú¥Ã¥È¤Î°Ý»ý¥³¥¹¥È·×»»
+ * @return °Ý»ý¥³¥¹¥È(%)
+ */
int calculate_upkeep(void)
{
s32b old_friend_align = friend_align;
int m_idx;
bool have_a_unique = FALSE;
+ s32b total_friend_levels = 0;
total_friends = 0;
- total_friend_levels = 0;
friend_align = 0;
for (m_idx = m_max - 1; m_idx >=1; m_idx--)
return 0;
}
+/*!
+ * @brief ¥Ú¥Ã¥È¤ò³«Êü¤¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó
+ * @return ¤Ê¤·
+ */
void do_cmd_pet_dismiss(void)
{
monster_type *m_ptr;
{
bool delete_this;
char friend_name[80];
- char buf[80];
bool kakunin;
/* Access the monster */
/* Hack -- handle stuff */
handle_stuff();
-
-#ifdef JP
- sprintf(buf, "%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/Unnamed (%dÂÎ)]", friend_name, max_pet - i);
-#else
- sprintf(buf, "Dismiss %s? [Yes/No/Unnamed (%d remain)]", friend_name, max_pet - i);
-#endif
- prt(buf, 0, 0);
-
+
+ msg_format(_("%s¤òÊü¤·¤Þ¤¹¤«¡© [Yes/No/Unnamed (%dÂÎ)]","Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i);
+
if (m_ptr->ml)
move_cursor_relative(m_ptr->fy, m_ptr->fx);
if (kakunin)
{
-#ifdef JP
- sprintf(buf, "ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ", friend_name);
-#else
- sprintf(buf, "Are you sure? (%s) ", friend_name);
-#endif
- if (!get_check(buf))
+ msg_format(_("ËÜÅö¤Ë¤è¤í¤·¤¤¤Ç¤¹¤«¡© (%s) ","Are you sure? (%s) "), friend_name);
+ ch = inkey();
+ if (ch != 'Y' && ch != 'y')
delete_this = FALSE;
}
break;
char m_name[80];
monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
- do_cmd_write_nikki(NIKKI_NAMED_PET, 2, m_name);
+ do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
}
if (pet_ctr == p_ptr->riding)
{
-#ifdef JP
- msg_format("%s¤«¤é¹ß¤ê¤¿¡£", friend_name);
-#else
- msg_format("You have got off %s. ", friend_name);
-#endif
+ msg_format(_("%s¤«¤é¹ß¤ê¤¿¡£","You have got off %s. "), friend_name);
p_ptr->riding = 0;
}
/* HACK : Add the line to message buffer */
-#ifdef JP
- sprintf(buf, "%s ¤òÊü¤·¤¿¡£", friend_name);
-#else
- sprintf(buf, "Dismissed %s.", friend_name);
-#endif
- message_add(buf);
+ msg_format(_("%s ¤òÊü¤·¤¿¡£","Dismissed %s."), friend_name);
p_ptr->window |= (PW_MESSAGE);
window_stuff();
#endif
}
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤Îµ³¾è/²¼ÇϽèÍýȽÄê
+ * @param c_ptr ¥×¥ì¥¤¥ä¡¼¤Î°ÜÆ°Àè¥Þ¥¹¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
+ * @param now_riding TRUE¤Ê¤é²¼ÇϽèÍý¡¢FALSE¤Ê¤é¤Ðµ³¾è½èÍý
+ * @return ²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
+ */
static bool player_can_ride_aux(cave_type *c_ptr, bool now_riding)
{
bool p_can_enter;
return p_can_enter;
}
+/*!
+ * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÍîÇÏȽÄê½èÍý
+ * @param dam ÍîÇÏȽÄê¤òȯ¤·¤¿ºÝ¤Ë¼õ¤±¤¿¥À¥á¡¼¥¸ÎÌ
+ * @param force TRUE¤Ê¤é¤Ð¶¯À©Åª¤ËÍîÇϤ¹¤ë
+ * @return ¼ÂºÝ¤ËÍîÇϤ·¤¿¤éTRUE¤òÊÖ¤¹
+ */
bool rakuba(int dam, bool force)
{
int i, y, x, oy, ox;
return fall_dam;
}
+/*!
+ * @brief ¥Ú¥Ã¥È¤«¤éµ³¾è/²¼ÇϤ¹¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
+ * @param force ¶¯À©Åª¤Ëµ³¾è/²¼ÇϤ¹¤ë¤Ê¤é¤ÐTRUE
+ * @return µ³¾è/²¼ÇϤǤ¤¿¤éTRUE
+ */
bool do_riding(bool force)
{
int x, y, dir = 0;
return TRUE;
}
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë̾Á°¤ò¤Ä¤±¤ë¥³¥Þ¥ó¥É¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó
+ * @return ¤Ê¤·
+ */
static void do_name_pet(void)
{
monster_type *m_ptr;
char m_name[80];
monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
- do_cmd_write_nikki(NIKKI_NAMED_PET, 0, m_name);
+ do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_NAME, m_name);
}
}
else
char m_name[80];
monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
- do_cmd_write_nikki(NIKKI_NAMED_PET, 1, m_name);
+ do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_UNNAME, m_name);
}
m_ptr->nickname = 0;
}
}
}
-/*
+
+/*!
+ * @brief ¥Ú¥Ã¥È¤Ë´Ø¤¹¤ë¥³¥Þ¥ó¥É¥ê¥¹¥È¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
* Issue a pet command
+ * @return ¤Ê¤·
*/
void do_cmd_pet(void)
{
int powers[36];
cptr power_desc[36];
bool flag, redraw;
- int ask;
char choice;
char out_val[160];
int pet_ctr;
int mode = 0;
- byte y = 1, x = 0;
- int ctr = 0;
char buf[160];
char target_buf[160];
+ int menu_line = use_menu ? 1 : 0;
+
num = 0;
#ifdef JP
powers[num++] = PET_TARGET;
#ifdef JP
-power_desc[num] = "¶á¤¯¤Ë¤¤¤í";
+ power_desc[num] = "¶á¤¯¤Ë¤¤¤í";
#else
power_desc[num] = "stay close";
#endif
powers[num++] = PET_FOLLOW_ME;
#ifdef JP
-power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»";
+ power_desc[num] = "Ũ¤ò¸«¤Ä¤±¤ÆÅݤ»";
#else
power_desc[num] = "seek and destroy";
#endif
powers[num++] = PET_SEEK_AND_DESTROY;
#ifdef JP
-power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í";
+ power_desc[num] = "¾¯¤·Î¥¤ì¤Æ¤¤¤í";
#else
power_desc[num] = "give me space";
#endif
powers[num++] = PET_ALLOW_SPACE;
#ifdef JP
-power_desc[num] = "Î¥¤ì¤Æ¤¤¤í";
+ power_desc[num] = "Î¥¤ì¤Æ¤¤¤í";
#else
power_desc[num] = "stay away";
#endif
#else
power_desc[num] = "pets open doors (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "pets open doors (now Off)";
#endif
-
}
powers[num++] = PET_OPEN_DOORS;
#else
power_desc[num] = "pets pick up items (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "pets pick up items (now Off)";
#endif
-
}
powers[num++] = PET_TAKE_ITEMS;
#else
power_desc[num] = "allow teleport (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "allow teleport (now Off)";
#endif
-
}
powers[num++] = PET_TELEPORT;
#else
power_desc[num] = "allow cast attack spell (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "allow cast attack spell (now Off)";
#endif
-
}
powers[num++] = PET_ATTACK_SPELL;
#else
power_desc[num] = "allow cast summon spell (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "allow cast summon spell (now Off)";
#endif
-
}
powers[num++] = PET_SUMMON_SPELL;
#else
power_desc[num] = "allow involve player in area spell (now On)";
#endif
-
}
else
{
#else
power_desc[num] = "allow involve player in area spell (now Off)";
#endif
-
}
powers[num++] = PET_BALL_SPELL;
#else
power_desc[num] = "get off a pet";
#endif
-
}
else
{
#else
power_desc[num] = "ride a pet";
#endif
-
}
powers[num++] = PET_RIDING;
}
}
+#ifdef ALLOW_REPEAT
+ if (!(repeat_pull(&i) && (i >= 0) && (i < num)))
+ {
+#endif /* ALLOW_REPEAT */
+
/* Nothing chosen yet */
flag = FALSE;
- /* Build a prompt (accept all spells) */
- if (num <= 26)
+ /* No redraw yet */
+ redraw = FALSE;
+
+ if (use_menu)
{
- /* Build a prompt (accept all spells) */
+ /* Save the screen */
+ screen_save();
+
+ /* Build a prompt */
#ifdef JP
-strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
+ strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:");
#else
- strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
+ strnfmt(out_val, 78, "(Command, ESC=exit) Choose command from menu.");
#endif
-
- I2A(0), I2A(num - 1));
}
else
{
+ /* Build a prompt */
+ strnfmt(out_val, 78,
#ifdef JP
-strnfmt(out_val, 78, "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
+ "(¥³¥Þ¥ó¥É %c-%c¡¢'*'=°ìÍ÷¡¢ESC=½ªÎ») ¥³¥Þ¥ó¥É¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤:",
#else
- strnfmt(out_val, 78, "(Command %c-%c, *=List, ESC=exit) Select a command: ",
+ "(Command %c-%c, *=List, ESC=exit) Select a command: ",
#endif
-
- I2A(0), '0' + num - 27);
+ I2A(0), I2A(num - 1));
}
- /* Show list */
- redraw = TRUE;
+ choice = (always_show_list || use_menu) ? ESCAPE : 1;
- /* Save the screen */
- Term_save();
+ /* Get a command from the user */
+ while (!flag)
+ {
+ int ask = TRUE;
- prt("", y++, x);
+ if (choice == ESCAPE) choice = ' ';
+ else if (!get_com(out_val, &choice, TRUE)) break;
- while (ctr < num)
- {
- prt(format("%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]), y + ctr, x);
- ctr++;
- }
+ if (use_menu && (choice != ' '))
+ {
+ switch (choice)
+ {
+ case '0':
+ screen_load();
+ return;
+
+ case '8':
+ case 'k':
+ case 'K':
+ menu_line += (num - 1);
+ break;
- if (ctr < 17)
- {
- prt("", y + ctr, x);
- }
- else
- {
- prt("", y + 17, x);
- }
+ case '2':
+ case 'j':
+ case 'J':
+ menu_line++;
+ break;
+
+ case '4':
+ case 'h':
+ case 'H':
+ menu_line = 1;
+ break;
+
+ case '6':
+ case 'l':
+ case 'L':
+ menu_line = num;
+ break;
+
+ case 'x':
+ case 'X':
+ case '\r':
+ case '\n':
+ i = menu_line - 1;
+ ask = FALSE;
+ break;
+ }
+ if (menu_line > num) menu_line -= num;
+ }
- /* Get a command from the user */
- while (!flag && get_com(out_val, &choice, TRUE))
- {
/* Request redraw */
- if ((choice == ' ') || (choice == '*') || (choice == '?'))
+ if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
{
/* Show the list */
- if (!redraw)
+ if (!redraw || use_menu)
{
- y = 1;
- x = 0;
- ctr = 0;
+ byte y = 1, x = 0;
+ int ctr = 0;
/* Show list */
redraw = TRUE;
/* Save the screen */
- Term_save();
+ if (!use_menu) screen_save();
prt("", y++, x);
- while (ctr < num)
+ /* Print list */
+ for (ctr = 0; ctr < num; ctr++)
{
- sprintf(buf, "%s%c) %s", (ctr == mode) ? "*" : " ", I2A(ctr), power_desc[ctr]);
+ /* Letter/number for power selection */
+#ifdef JP
+ if (use_menu) sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? "¡Õ" : " ");
+#else
+ if (use_menu) sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? "> " : " ");
+#endif
+ else sprintf(buf, "%c%c) ", (ctr == mode) ? '*' : ' ', I2A(ctr));
+
+ strcat(buf, power_desc[ctr]);
+
prt(buf, y + ctr, x);
- ctr++;
}
- if (ctr < 17)
- {
- prt("", y + ctr, x);
- }
- else
- {
- prt("", y + 17, x);
- }
+ prt("", y + MIN(ctr, 17), x);
}
/* Hide the list */
redraw = FALSE;
/* Restore the screen */
- Term_load();
+ screen_load();
}
/* Redo asking */
continue;
}
- if (isalpha(choice))
+ if (!use_menu)
{
/* Note verify */
ask = (isupper(choice));
/* Extract request */
i = (islower(choice) ? A2I(choice) : -1);
}
- else
- {
- ask = FALSE; /* Can't uppercase digits */
-
- i = choice - '0' + 26;
- }
/* Totally Illegal */
if ((i < 0) || (i >= num))
strnfmt(buf, 78, "Use %s? ", power_desc[i]);
#endif
-
/* Belay that order */
if (!get_check(buf)) continue;
}
}
/* Restore the screen */
- if (redraw) Term_load();
+ if (redraw) screen_load();
/* Abort if needed */
if (!flag)
return;
}
+#ifdef ALLOW_REPEAT
+ repeat_push(i);
+ }
+#endif /* ALLOW_REPEAT */
+
switch (powers[i])
{
case PET_DISMISS: /* Dismiss pets */