number_pad:3,4,-1 (trunk only)

[See the cvs log from flag.h for comments pertaining to iflags.num_pad
and Cmd.num_pad, Cmd.commands[], Cmd.serialno.]
This commit is contained in:
nethack.rankin
2005-11-26 02:34:23 +00:00
parent 0076d5fc00
commit ea61a13add
14 changed files with 279 additions and 144 deletions

198
src/cmd.c
View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)cmd.c 3.5 2005/05/06 */
/* SCCS Id: @(#)cmd.c 3.5 2005/11/19 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -6,6 +6,8 @@
#include "func_tab.h"
/* #define DEBUG */ /* uncomment for debugging */
struct cmd Cmd = { 0 }; /* flag.h */
/*
* Some systems may have getchar() return EOF for various reasons, and
* we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
@@ -17,6 +19,8 @@
#define CMD_TRAVEL (char)0x90
#define CMD_CLICKLOOK (char)0x8F
#define NODIAG(monnum) ((monnum) == PM_GRID_BUG)
#ifdef DEBUG
/*
* only one "wiz_debug_cmd" routine should be available (in whatever
@@ -1655,12 +1659,101 @@ add_debug_extended_commands()
}
}
/* called at startup and after number_pad is twiddled */
void
reset_commands(initial)
boolean initial;
{
static const char
sdir[] = "hykulnjb><", sdir_swap_yz[] = "hzkulnjb><",
ndir[] = "47896321><", ndir_phone_layout[] = "41236987><";
static const int ylist[] = { 'y', 'Y', C('y'), M('y'), M('Y'), M(C('y')) };
const struct func_tab *cmdtmp;
boolean flagtemp;
int c, i, updated = 0;
if (initial) {
updated = 1;
for (i = 0; i < SIZE(cmdlist); i++) {
c = cmdlist[i].f_char & 0xff;
Cmd.commands[c] = &cmdlist[i];
}
Cmd.num_pad = FALSE;
Cmd.pcHack_compat = Cmd.phone_layout = Cmd.swap_yz = FALSE;
} else {
/* basic num_pad */
flagtemp = iflags.num_pad;
if (flagtemp != Cmd.num_pad) {
Cmd.num_pad = flagtemp;
++updated;
}
/* swap_yz mode (only applicable for !num_pad) */
flagtemp = (iflags.num_pad_mode & 1) ? !Cmd.num_pad : FALSE;
if (flagtemp != Cmd.swap_yz) {
Cmd.swap_yz = flagtemp;
++updated;
/* Cmd.swap_yz has been toggled;
perform the swap (or reverse previous one) */
for (i = 0; i < SIZE(ylist); i++) {
c = ylist[i] & 0xff;
cmdtmp = Cmd.commands[c]; /* tmp = [y] */
Cmd.commands[c] = Cmd.commands[c + 1]; /* [y] = [z] */
Cmd.commands[c + 1] = cmdtmp; /* [z] = tmp */
}
}
/* MSDOS compatibility mode (only applicable for num_pad) */
flagtemp = (iflags.num_pad_mode & 1) ? Cmd.num_pad : FALSE;
if (flagtemp != Cmd.pcHack_compat) {
Cmd.pcHack_compat = flagtemp;
++updated;
/* pcHack_compat has been toggled */
c = M('5') & 0xff;
cmdtmp = Cmd.commands['5'];
Cmd.commands['5'] = Cmd.commands[c];
Cmd.commands[c] = cmdtmp;
c = M('0') & 0xff;
Cmd.commands[c] = Cmd.pcHack_compat ? Cmd.commands['I'] : 0;
}
/* phone keypad layout (only applicable for num_pad) */
flagtemp = (iflags.num_pad_mode & 2) ? Cmd.num_pad : FALSE;
if (flagtemp != Cmd.phone_layout) {
Cmd.phone_layout = flagtemp;
++updated;
/* phone_layout has been toggled */
for (i = 0; i < 3; i++) {
c = '1' + i; /* 1,2,3 <-> 7,8,9 */
cmdtmp = Cmd.commands[c]; /* tmp = [1] */
Cmd.commands[c] = Cmd.commands[c + 6]; /* [1] = [7] */
Cmd.commands[c + 6] = cmdtmp; /* [7] = tmp */
c = (M('1') & 0xff) + i; /* M-1,M-2,M-3 <-> M-7,M-8,M-9 */
cmdtmp = Cmd.commands[c]; /* tmp = [M-1] */
Cmd.commands[c] = Cmd.commands[c + 6]; /* [M-1] = [M-7] */
Cmd.commands[c + 6] = cmdtmp; /* [M-7] = tmp */
}
}
} /*?initial*/
if (updated) Cmd.serialno++;
Cmd.dirchars = !Cmd.num_pad ? (!Cmd.swap_yz ? sdir : sdir_swap_yz) :
(!Cmd.phone_layout ? ndir : ndir_phone_layout);
Cmd.alphadirchars = !Cmd.num_pad ? Cmd.dirchars : sdir;
Cmd.move_W = Cmd.dirchars[0];
Cmd.move_NW = Cmd.dirchars[1];
Cmd.move_N = Cmd.dirchars[2];
Cmd.move_NE = Cmd.dirchars[3];
Cmd.move_E = Cmd.dirchars[4];
Cmd.move_SE = Cmd.dirchars[5];
Cmd.move_S = Cmd.dirchars[6];
Cmd.move_SW = Cmd.dirchars[7];
}
/* decide whether a character (user input keystroke) requests screen repaint */
boolean
redraw_cmd(c)
char c;
{
return (c == C('r') || (iflags.num_pad && c == C('l')));
return (c == C('r') || (Cmd.num_pad && c == C('l')));
}
static const char template[] = "%-18s %4ld %6ld";
@@ -1917,7 +2010,7 @@ register char *cmd;
context.move = FALSE;
return; /* probably we just had an interrupt */
}
if (iflags.num_pad && iflags.num_pad_mode == 1) {
if (Cmd.pcHack_compat) {
/* This handles very old inconsistent DOS/Windows behaviour
* in a new way: earlier, the keyboard handler mapped these,
* which caused counts to be strange when entered from the
@@ -1927,8 +2020,9 @@ register char *cmd;
case '5': *cmd = 'g'; break;
case M('5'): *cmd = 'G'; break;
case M('0'): *cmd = 'I'; break;
}
}
}
}
/* handle most movement commands */
do_walk = do_rush = prefix_seen = FALSE;
context.travel = context.travel1 = 0;
@@ -1939,14 +2033,14 @@ register char *cmd;
} else
prefix_seen = TRUE;
break;
case '5': if (!iflags.num_pad) break; /* else FALLTHRU */
case '5': if (!Cmd.num_pad) break; /* else FALLTHRU */
case 'G': if (movecmd(lowc(cmd[1]))) {
context.run = 3;
do_rush = TRUE;
} else
prefix_seen = TRUE;
break;
case '-': if (!iflags.num_pad) break; /* else FALLTHRU */
case '-': if (!Cmd.num_pad) break; /* else FALLTHRU */
/* Effects of movement commands and invisible monsters:
* m: always move onto space (even if 'I' remembered)
* F: always attack space (even if 'I' not remembered)
@@ -1973,7 +2067,7 @@ register char *cmd;
} else
prefix_seen = TRUE;
break;
case '0': if (!iflags.num_pad) break;
case '0': if (!Cmd.num_pad) break;
(void)ddoinv(); /* a convenience borrowed from the PC */
context.move = FALSE;
multi = 0;
@@ -1997,7 +2091,7 @@ register char *cmd;
default: if (movecmd(*cmd)) { /* ordinary movement */
context.run = 0; /* only matters here if it was 8 */
do_walk = TRUE;
} else if (movecmd(iflags.num_pad ?
} else if (movecmd(Cmd.num_pad ?
unmeta(*cmd) : lowc(*cmd))) {
context.run = 1;
do_rush = TRUE;
@@ -2039,8 +2133,12 @@ register char *cmd;
register const struct func_tab *tlist;
int res, NDECL((*func));
#if 0
for (tlist = cmdlist; tlist->f_char; tlist++) {
if ((*cmd & 0xff) != (tlist->f_char & 0xff)) continue;
#else
if ((tlist = Cmd.commands[*cmd & 0xff]) != 0) {
#endif
if (u.uburied && !tlist->can_if_buried) {
You_cant("do that while you are buried!");
@@ -2065,18 +2163,19 @@ register char *cmd;
if (bad_command) {
char expcmd[10];
register char *cp = expcmd;
register char c, *cp = expcmd;
while (*cmd && (int)(cp - expcmd) < (int)(sizeof expcmd - 3)) {
if (*cmd >= 040 && *cmd < 0177) {
*cp++ = *cmd++;
} else if (*cmd & 0200) {
while ((c = *cmd++) != '\0' &&
(int)(cp - expcmd) < (int)(sizeof expcmd - 3)) {
if (c >= 040 && c < 0177) {
*cp++ = c;
} else if (c & 0200) {
*cp++ = 'M';
*cp++ = '-';
*cp++ = *cmd++ &= ~0200;
*cp++ = c & ~0200;
} else {
*cp++ = '^';
*cp++ = *cmd++ ^ 0100;
*cp++ = c ^ 0100;
}
}
*cp = '\0';
@@ -2116,16 +2215,14 @@ int
movecmd(sym) /* also sets u.dz, but returns false for <> */
char sym;
{
register const char *dp;
register const char *sdp;
if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */
register const char *dp = index(Cmd.dirchars, sym);
u.dz = 0;
if(!(dp = index(sdp, sym))) return 0;
u.dx = xdir[dp-sdp];
u.dy = ydir[dp-sdp];
u.dz = zdir[dp-sdp];
if (u.dx && u.dy && u.umonnum == PM_GRID_BUG) {
if (!dp) return 0;
u.dx = xdir[dp - Cmd.dirchars];
u.dy = ydir[dp - Cmd.dirchars];
u.dz = zdir[dp - Cmd.dirchars];
if (u.dx && u.dy && NODIAG(u.umonnum)) {
u.dx = u.dy = 0;
return 0;
}
@@ -2250,34 +2347,28 @@ const char *msg;
putstr(win, 0, "");
}
}
if (iflags.num_pad && u.umonnum == PM_GRID_BUG) {
putstr(win, 0, "Valid direction keys in your current form (with number_pad on) are:");
putstr(win, 0, " 8 ");
putstr(win, 0, " | ");
putstr(win, 0, " 4- . -6");
putstr(win, 0, " | ");
putstr(win, 0, " 2 ");
} else if (u.umonnum == PM_GRID_BUG) {
if (NODIAG(u.umonnum)) {
putstr(win, 0, "Valid direction keys in your current form are:");
putstr(win, 0, " k ");
Sprintf(buf, " %c ", Cmd.move_N);
putstr(win, 0, buf);
putstr(win, 0, " | ");
putstr(win, 0, " h- . -l");
Sprintf(buf, " %c- . -%c", Cmd.move_W, Cmd.move_E);
putstr(win, 0, buf);
putstr(win, 0, " | ");
putstr(win, 0, " j ");
} else if (iflags.num_pad) {
putstr(win, 0, "Valid direction keys (with number_pad on) are:");
putstr(win, 0, " 7 8 9");
putstr(win, 0, " \\ | / ");
putstr(win, 0, " 4- . -6");
putstr(win, 0, " / | \\ ");
putstr(win, 0, " 1 2 3");
Sprintf(buf, " %c ", Cmd.move_S);
putstr(win, 0, buf);
} else {
putstr(win, 0, "Valid direction keys are:");
putstr(win, 0, " y k u");
Sprintf(buf, " %c %c %c",
Cmd.move_NW, Cmd.move_N, Cmd.move_NE);
putstr(win, 0, buf);
putstr(win, 0, " \\ | / ");
putstr(win, 0, " h- . -l");
Sprintf(buf, " %c- . -%c", Cmd.move_W, Cmd.move_E);
putstr(win, 0, buf);
putstr(win, 0, " / | \\ ");
putstr(win, 0, " b j n");
Sprintf(buf, " %c %c %c",
Cmd.move_SW, Cmd.move_S, Cmd.move_SE);
putstr(win, 0, buf);
};
putstr(win, 0, "");
putstr(win, 0, " < up");
@@ -2297,7 +2388,8 @@ const char *msg;
void
confdir()
{
register int x = (u.umonnum == PM_GRID_BUG) ? 2*rn2(4) : rn2(8);
register int x = NODIAG(u.umonnum) ? 2*rn2(4) : rn2(8);
u.dx = xdir[x];
u.dy = ydir[x];
return;
@@ -2373,8 +2465,8 @@ click_to_cmd(x, y, mod)
dir = xytod(x, y);
if (!m_at(u.ux+x, u.uy+y) && !test_move(u.ux, u.uy, x, y, TEST_MOVE)) {
cmd[1] = (iflags.num_pad ? ndir[dir] : sdir[dir]);
cmd[2] = 0;
cmd[1] = Cmd.dirchars[dir];
cmd[2] = '\0';
if (IS_DOOR(levl[u.ux+x][u.uy+y].typ)) {
/* slight assistance to the player: choose kick/open for them */
if (levl[u.ux+x][u.uy+y].doormask & D_LOCKED) {
@@ -2414,10 +2506,10 @@ click_to_cmd(x, y, mod)
/* move, attack, etc. */
cmd[1] = 0;
if(mod == CLICK_1) {
cmd[0] = (iflags.num_pad ? ndir[dir] : sdir[dir]);
cmd[0] = Cmd.dirchars[dir];
} else {
cmd[0] = (iflags.num_pad ? M(ndir[dir]) :
(sdir[dir] - 'a' + 'A')); /* run command */
cmd[0] = (Cmd.num_pad ? M(Cmd.dirchars[dir]) :
(Cmd.dirchars[dir] - 'a' + 'A')); /* run command */
}
return cmd;
@@ -2438,7 +2530,7 @@ parse()
context.move = 1;
flush_screen(1); /* Flush screen buffer. Put the cursor on the hero. */
if (!iflags.num_pad || (foo = readchar()) == 'n')
if (!Cmd.num_pad || (foo = readchar()) == 'n')
for (;;) {
foo = readchar();
if (foo >= '0' && foo <= '9') {
@@ -2477,7 +2569,7 @@ parse()
in_line[0] = foo;
in_line[1] = '\0';
if (foo == 'g' || foo == 'G' || foo == 'm' || foo == 'M' ||
foo == 'F' || (iflags.num_pad && (foo == '5' || foo == '-'))) {
foo == 'F' || (Cmd.num_pad && (foo == '5' || foo == '-'))) {
foo = readchar();
#ifdef REDO
savech((char)foo);