Rejigger the prefix input
Make prefix commands cancel themselves when pressed twice, with a message saying so. Hopefully this fixes the problems I introduced.
This commit is contained in:
99
src/cmd.c
99
src/cmd.c
@@ -147,7 +147,7 @@ static void mon_chain(winid, const char *, struct monst *, boolean, long *,
|
|||||||
static void contained_stats(winid, const char *, long *, long *);
|
static void contained_stats(winid, const char *, long *, long *);
|
||||||
static void misc_stats(winid, long *, long *);
|
static void misc_stats(winid, long *, long *);
|
||||||
static boolean accept_menu_prefix(const struct ext_func_tab *);
|
static boolean accept_menu_prefix(const struct ext_func_tab *);
|
||||||
|
static void reset_cmd_vars(void);
|
||||||
static void add_herecmd_menuitem(winid, int (*)(void), const char *);
|
static void add_herecmd_menuitem(winid, int (*)(void), const char *);
|
||||||
static char here_cmd_menu(boolean);
|
static char here_cmd_menu(boolean);
|
||||||
static char there_cmd_menu(boolean, int, int);
|
static char there_cmd_menu(boolean, int, int);
|
||||||
@@ -2035,6 +2035,12 @@ do_run_southwest(void)
|
|||||||
int
|
int
|
||||||
do_reqmenu(void)
|
do_reqmenu(void)
|
||||||
{
|
{
|
||||||
|
if (iflags.menu_requested) {
|
||||||
|
Norep("Double %s prefix, canceled.", visctrl(cmd_from_func(do_reqmenu)));
|
||||||
|
iflags.menu_requested = FALSE;
|
||||||
|
return ECMD_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
iflags.menu_requested = TRUE;
|
iflags.menu_requested = TRUE;
|
||||||
return ECMD_OK;
|
return ECMD_OK;
|
||||||
}
|
}
|
||||||
@@ -2043,6 +2049,13 @@ do_reqmenu(void)
|
|||||||
int
|
int
|
||||||
do_rush(void)
|
do_rush(void)
|
||||||
{
|
{
|
||||||
|
if ((g.domove_attempting & DOMOVE_RUSH)) {
|
||||||
|
Norep("Double rush prefix, canceled.");
|
||||||
|
g.context.run = 0;
|
||||||
|
g.domove_attempting = 0;
|
||||||
|
return ECMD_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
g.context.run = 2;
|
g.context.run = 2;
|
||||||
g.domove_attempting |= DOMOVE_RUSH;
|
g.domove_attempting |= DOMOVE_RUSH;
|
||||||
return ECMD_OK;
|
return ECMD_OK;
|
||||||
@@ -2052,6 +2065,13 @@ do_rush(void)
|
|||||||
int
|
int
|
||||||
do_run(void)
|
do_run(void)
|
||||||
{
|
{
|
||||||
|
if ((g.domove_attempting & DOMOVE_RUSH)) {
|
||||||
|
Norep("Double run prefix, canceled.");
|
||||||
|
g.context.run = 0;
|
||||||
|
g.domove_attempting = 0;
|
||||||
|
return ECMD_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
g.context.run = 3;
|
g.context.run = 3;
|
||||||
g.domove_attempting |= DOMOVE_RUSH;
|
g.domove_attempting |= DOMOVE_RUSH;
|
||||||
return ECMD_OK;
|
return ECMD_OK;
|
||||||
@@ -3746,6 +3766,19 @@ rnd_extcmd_idx(void)
|
|||||||
return rn2(extcmdlist_length + 1) - 1;
|
return rn2(extcmdlist_length + 1) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reset_cmd_vars(void)
|
||||||
|
{
|
||||||
|
g.context.run = 0;
|
||||||
|
g.context.nopick = g.context.forcefight = FALSE;
|
||||||
|
g.context.move = g.context.mv = FALSE;
|
||||||
|
g.domove_attempting = 0;
|
||||||
|
g.multi = 0;
|
||||||
|
iflags.menu_requested = FALSE;
|
||||||
|
g.context.travel = g.context.travel1 = 0;
|
||||||
|
cmdq_clear();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rhack(char *cmd)
|
rhack(char *cmd)
|
||||||
{
|
{
|
||||||
@@ -3754,10 +3787,9 @@ rhack(char *cmd)
|
|||||||
firsttime = (cmd == 0);
|
firsttime = (cmd == 0);
|
||||||
struct _cmd_queue *cmdq = NULL;
|
struct _cmd_queue *cmdq = NULL;
|
||||||
const struct ext_func_tab *cmdq_ec = NULL;
|
const struct ext_func_tab *cmdq_ec = NULL;
|
||||||
|
boolean was_m_prefix = FALSE;
|
||||||
|
|
||||||
iflags.menu_requested = FALSE;
|
reset_cmd_vars();
|
||||||
prefix_seen = FALSE;
|
|
||||||
g.context.nopick = 0;
|
|
||||||
got_prefix_input:
|
got_prefix_input:
|
||||||
#ifdef SAFERHANGUP
|
#ifdef SAFERHANGUP
|
||||||
if (g.program_state.done_hup)
|
if (g.program_state.done_hup)
|
||||||
@@ -3783,21 +3815,14 @@ got_prefix_input:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*cmd == g.Cmd.spkeys[NHKF_ESC]) {
|
if (*cmd == g.Cmd.spkeys[NHKF_ESC]) {
|
||||||
g.context.move = FALSE;
|
reset_cmd_vars();
|
||||||
iflags.menu_requested = FALSE;
|
|
||||||
g.context.run = 0;
|
|
||||||
g.context.nopick = g.context.forcefight = FALSE;
|
|
||||||
g.context.mv = FALSE;
|
|
||||||
g.multi = 0;
|
|
||||||
g.domove_attempting = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Special case of *cmd == ' ' handled better below */
|
/* Special case of *cmd == ' ' handled better below */
|
||||||
if (!*cmd || *cmd == (char) 0377) {
|
if (!*cmd || *cmd == (char) 0377) {
|
||||||
nhbell();
|
nhbell();
|
||||||
g.context.move = FALSE;
|
reset_cmd_vars();
|
||||||
iflags.menu_requested = FALSE;
|
|
||||||
return; /* probably we just had an interrupt */
|
return; /* probably we just had an interrupt */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3817,13 +3842,18 @@ got_prefix_input:
|
|||||||
/* current - use *cmd to directly index cmdlist array */
|
/* current - use *cmd to directly index cmdlist array */
|
||||||
if (tlist != 0) {
|
if (tlist != 0) {
|
||||||
if (!can_do_extcmd(tlist)) {
|
if (!can_do_extcmd(tlist)) {
|
||||||
|
/* can_do_extcmd() already gave a message */
|
||||||
|
reset_cmd_vars();
|
||||||
res = ECMD_OK;
|
res = ECMD_OK;
|
||||||
cmdq_clear();
|
} else if (prefix_seen && !(tlist->flags & PREFIXCMD)
|
||||||
} else if (prefix_seen && !accept_menu_prefix(tlist)
|
&& was_m_prefix && !accept_menu_prefix(tlist)) {
|
||||||
&& !(tlist->flags & PREFIXCMD)) {
|
/* we got 'm' prefix previously, can this command accept one? */
|
||||||
/* we got a prefix previously, can this command accept one? */
|
reset_cmd_vars();
|
||||||
res = ECMD_OK;
|
res = ECMD_OK;
|
||||||
cmdq_clear();
|
prefix_seen = FALSE;
|
||||||
|
was_m_prefix = FALSE;
|
||||||
|
pline("The %s command does not accept %s prefix.",
|
||||||
|
tlist->ef_txt, visctrl(cmd_from_func(do_reqmenu)));
|
||||||
} else {
|
} else {
|
||||||
/* we discard 'const' because some compilers seem to have
|
/* we discard 'const' because some compilers seem to have
|
||||||
trouble with the pointer passed to set_occupation() */
|
trouble with the pointer passed to set_occupation() */
|
||||||
@@ -3833,20 +3863,27 @@ got_prefix_input:
|
|||||||
res = (*func)(); /* perform the command */
|
res = (*func)(); /* perform the command */
|
||||||
|
|
||||||
if ((tlist->flags & PREFIXCMD)) {
|
if ((tlist->flags & PREFIXCMD)) {
|
||||||
/* it was a prefix command, mark and get another command */
|
/* it was a prefix command, mark and get another cmd */
|
||||||
|
if ((res & ECMD_CANCEL)) {
|
||||||
|
/* prefix commands cancel if pressed twice */
|
||||||
|
reset_cmd_vars();
|
||||||
|
return;
|
||||||
|
}
|
||||||
prefix_seen = TRUE;
|
prefix_seen = TRUE;
|
||||||
bad_command = FALSE;
|
bad_command = FALSE;
|
||||||
cmdq_ec = NULL;
|
cmdq_ec = NULL;
|
||||||
|
if (func == do_reqmenu)
|
||||||
|
was_m_prefix = TRUE;
|
||||||
goto got_prefix_input;
|
goto got_prefix_input;
|
||||||
|
} else if (!(tlist->flags & MOVEMENTCMD)
|
||||||
|
&& g.domove_attempting) {
|
||||||
|
/* not a movement command, but a move prefix earlier? */
|
||||||
|
/* just do nothing */
|
||||||
} else if (((g.domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)) != 0L)
|
} else if (((g.domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)) != 0L)
|
||||||
&& !g.context.travel && !dxdy_moveok()) {
|
&& !g.context.travel && !dxdy_moveok()) {
|
||||||
/* trying to move diagonally as a grid bug */
|
/* trying to move diagonally as a grid bug */
|
||||||
You_cant("get there from here...");
|
You_cant("get there from here...");
|
||||||
g.context.run = 0;
|
reset_cmd_vars();
|
||||||
g.context.nopick = g.context.forcefight = FALSE;
|
|
||||||
g.context.move = g.context.mv = FALSE;
|
|
||||||
g.multi = 0;
|
|
||||||
iflags.menu_requested = FALSE;
|
|
||||||
return;
|
return;
|
||||||
} else if ((g.domove_attempting & DOMOVE_WALK) != 0L) {
|
} else if ((g.domove_attempting & DOMOVE_WALK) != 0L) {
|
||||||
if (g.multi)
|
if (g.multi)
|
||||||
@@ -3867,17 +3904,19 @@ got_prefix_input:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
prefix_seen = FALSE;
|
prefix_seen = FALSE;
|
||||||
|
was_m_prefix = FALSE;
|
||||||
}
|
}
|
||||||
if ((res & ECMD_CANCEL)) {
|
if ((res & ECMD_CANCEL)) {
|
||||||
/* command was canceled by user, maybe they declined to
|
/* command was canceled by user, maybe they declined to
|
||||||
pick an object to act on. */
|
pick an object to act on. */
|
||||||
iflags.menu_requested = FALSE;
|
reset_cmd_vars();
|
||||||
cmdq_clear();
|
prefix_seen = FALSE;
|
||||||
|
cmdq_ec = NULL;
|
||||||
}
|
}
|
||||||
if (!(res & ECMD_TIME)) {
|
if (!(res & ECMD_TIME)) {
|
||||||
iflags.menu_requested = FALSE;
|
reset_cmd_vars();
|
||||||
g.context.move = FALSE;
|
prefix_seen = FALSE;
|
||||||
g.multi = 0;
|
cmdq_ec = NULL;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user