ver 0.2 CHANGES: ver 0.2: modify do_name.c:getpos() to work with DYNKEY INSTRUCITONS: Define DYNKEY in config.h (and recompile) and add lines: MAPPING= to your configuration file. The right part is not especially clever--you'll have to type the standard nethack key for that function. Think of it as mildly inconvenient function nomenclature.. If you had a German keyboard, you'd want: example 1: MAP=z y MAP=y z MAP=Z Y MAP=Y Z MAP=C-z C-y MAP=C-y C-z MAP=M-z M-y MAP=M-y M-z OR example 2: SWAP=z y SWAP=Z Y SWAP=C-z C-y SWAP=M-z M-y http://nh.gmuf.com/dynkey-343.diff diff -ruX exclude nethack-3.4.3-orig/include/extern.h nethack-3.4.3/include/extern.h --- nethack-3.4.3-orig/include/extern.h 2003-12-16 08:41:34.000000000 +0100 +++ nethack-3.4.3/include/extern.h 2003-12-19 20:09:44.000000000 +0100 @@ -174,7 +174,14 @@ E int FDECL(isok, (int,int)); E int FDECL(get_adjacent_loc, (const char *, const char *, XCHAR_P, XCHAR_P, coord *)); E const char *FDECL(click_to_cmd, (int,int,int)); +#ifdef DYNKEY +E int FDECL(map_dkb, (char, char)); +E char FDECL(keydesc2char, (char *)); +E char FDECL(greadchar, (boolean)); +#define readchar() greadchar(FALSE) +#else E char NDECL(readchar); +#endif #ifdef WIZARD E void NDECL(sanity_check); #endif @@ -1401,6 +1408,9 @@ E void FDECL(set_wc_option_mod_status, (unsigned long, int)); E void FDECL(set_wc2_option_mod_status, (unsigned long, int)); E void FDECL(set_option_mod_status, (const char *,int)); +#ifdef DYNKEY +E void FDECL(add_dkb, (char *, boolean)); +#endif #ifdef AUTOPICKUP_EXCEPTIONS E int FDECL(add_autopickup_exception, (const char *)); E void NDECL(free_autopickup_exceptions); diff -ruX exclude nethack-3.4.3-orig/include/func_tab.h nethack-3.4.3/include/func_tab.h --- nethack-3.4.3-orig/include/func_tab.h 2003-12-16 08:41:34.000000000 +0100 +++ nethack-3.4.3/include/func_tab.h 2003-12-21 11:52:17.000000000 +0100 @@ -5,6 +5,13 @@ #ifndef FUNC_TAB_H #define FUNC_TAB_H +#ifdef DYNKEY +struct dkb_tab { + char bound_char; + char cmd_char; +}; +#endif + struct func_tab { char f_char; boolean can_if_buried; @@ -19,5 +26,6 @@ }; extern struct ext_func_tab extcmdlist[]; +extern struct dkb_tab *dkblist; #endif /* FUNC_TAB_H */ diff -ruX exclude nethack-3.4.3-orig/src/cmd.c nethack-3.4.3/src/cmd.c --- nethack-3.4.3-orig/src/cmd.c 2003-12-16 08:41:34.000000000 +0100 +++ nethack-3.4.3/src/cmd.c 2003-12-21 11:45:12.000000000 +0100 @@ -1474,6 +1474,58 @@ {0,0,0,0} }; +#ifdef DYNKEY + +/* let's not get too dynamic */ +#define DYNKEY_SZ (sizeof(struct dkb_tab) * (26*4+40)) + +struct dkb_tab *dkblist = (struct dkb_tab *) 0; + +static int dkblist_sz=-1; + +int +map_dkb(b, c) +char b, c; +{ + if(dkblist_sz<0) { + dkblist=(struct dkb_tab *) alloc(DYNKEY_SZ+1); /* 0-term */ + memset(dkblist, 0, DYNKEY_SZ+1); + dkblist_sz=0; + } + dkblist_sz++; + if(sizeof(struct dkb_tab) * dkblist_sz>DYNKEY_SZ) + return 0; + dkblist[dkblist_sz-1].bound_char=b; + dkblist[dkblist_sz-1].cmd_char=c; + return 1; +} + +char +keydesc2char(desc) +char *desc; +{ + char key; + int l=strlen(desc); + + if(l) + key=desc[l-1]; + switch(l) { + case 1: + return key; + case 3: + if(desc[1]=='-') + if(desc[0]=='M') + return M(key); + else if(desc[0]=='C') + return C(key); + /*fall through*/ + default: + return 0; + } +} +#undef DYNKEY_SZ +#endif /* DYNKEY */ + struct ext_func_tab extcmdlist[] = { {"adjust", "adjust inventory letters", doorganize, TRUE}, {"chat", "talk to someone", dotalk, TRUE}, /* converse? */ @@ -2083,9 +2135,14 @@ #ifdef REDO if(in_doagain || *readchar_queue) - dirsym = readchar(); - else + dirsym = +#ifdef DYNKEY + greadchar(TRUE); +#else + readchar(); #endif + else +#endif /* REDO */ dirsym = yn_function ((s && *s != '^') ? s : "In what direction?", (char *)0, '\0'); #ifdef REDO @@ -2331,9 +2388,20 @@ flags.move = 1; flush_screen(1); /* Flush screen buffer. Put the cursor on the hero. */ - if (!iflags.num_pad || (foo = readchar()) == 'n') + if (!iflags.num_pad || (foo = +#ifdef DYNKEY + greadchar(TRUE) +#else + readchar() +#endif + ) == 'n') for (;;) { - foo = readchar(); + foo = +#ifdef DYNKEY + greadchar(TRUE); +#else + readchar(); +#endif if (foo >= '0' && foo <= '9') { multi = 10 * multi + foo - '0'; if (multi < 0 || multi >= LARGEST_INT) multi = LARGEST_INT; @@ -2371,7 +2439,13 @@ in_line[1] = '\0'; if (foo == 'g' || foo == 'G' || foo == 'm' || foo == 'M' || foo == 'F' || (iflags.num_pad && (foo == '5' || foo == '-'))) { - foo = readchar(); + foo = +#ifdef DYNKEY + greadchar(TRUE); +#else + readchar(); +#endif + #ifdef REDO savech((char)foo); #endif @@ -2405,7 +2479,12 @@ #ifdef OVL0 char +#ifdef DYNKEY +greadchar(dynkey) +boolean dynkey; +#else readchar() +#endif { register int sym; int x = u.ux, y = u.uy, mod = 0; @@ -2443,6 +2522,17 @@ readchar_queue = click_to_cmd(x, y, mod); sym = *readchar_queue++; } +#ifdef DYNKEY + if(dkblist && dynkey) { + register const struct dkb_tab *dlist; + + for(dlist = dkblist; dlist->bound_char; dlist++) { + if((sym & 0xff) != (dlist->bound_char & 0xff)) continue; + sym=dlist->cmd_char; + break; + } + } +#endif return((char) sym); } diff -ruX exclude nethack-3.4.3-orig/src/do_name.c nethack-3.4.3/src/do_name.c --- nethack-3.4.3-orig/src/do_name.c 2003-12-16 08:41:35.000000000 +0100 +++ nethack-3.4.3/src/do_name.c 2003-12-21 11:52:03.000000000 +0100 @@ -69,7 +69,21 @@ lock_mouse_cursor(TRUE); #endif for (;;) { +#ifdef DYNKEY +#include "func_tab.h" +#endif c = nh_poskey(&tx, &ty, &sidx); +#ifdef DYNKEY + if(dkblist) { + register const struct dkb_tab *dlist; + + for(dlist = dkblist; dlist->bound_char; dlist++) { + if((c & 0xff) != (dlist->bound_char & 0xff)) continue; + c=dlist->cmd_char; + break; + } + } +#endif if (c == '\033') { cx = cy = -10; msg_given = TRUE; /* force clear */ diff -ruX exclude nethack-3.4.3-orig/src/files.c nethack-3.4.3/src/files.c --- nethack-3.4.3-orig/src/files.c 2003-12-16 08:41:35.000000000 +0100 +++ nethack-3.4.3/src/files.c 2003-12-19 20:09:44.000000000 +0100 @@ -1720,6 +1720,12 @@ } else if (match_varname(buf, "AUTOPICKUP_EXCEPTION", 5)) { add_autopickup_exception(bufp); #endif +#ifdef DYNKEY + } else if (match_varname(buf, "MAPPING", 3)) { + add_dkb(bufp, FALSE); + } else if (match_varname(buf, "SWAP", 4)) { + add_dkb(bufp, TRUE); +#endif #ifdef NOCWD_ASSUMPTIONS } else if (match_varname(buf, "HACKDIR", 4)) { adjust_prefix(bufp, HACKPREFIX); diff -ruX exclude nethack-3.4.3-orig/src/options.c nethack-3.4.3/src/options.c --- nethack-3.4.3-orig/src/options.c 2003-12-16 08:41:35.000000000 +0100 +++ nethack-3.4.3/src/options.c 2003-12-19 20:09:45.000000000 +0100 @@ -3262,6 +3262,31 @@ } #endif /* AUTOPICKUP_EXCEPTIONS */ +#ifdef DYNKEY +void +add_dkb(bufp, swap) +char *bufp; +boolean swap; +{ + char *p; + char b, c; + + if(!(p=index(bufp,' '))) { + raw_printf("DYNKEY MAP: bad mapping: %s.", bufp); + return; + } + *p++='\0'; + + b=keydesc2char(bufp); + c=keydesc2char(p); + if(b && c) { + if(!map_dkb(b, c) || (swap && !map_dkb(c, b))) + raw_printf("DYNKEY MAP: map_dkb error"); + } else + raw_printf("DYNKEY MAP: invalid key: %s.", b==0?bufp:p); +} +#endif /* DYNKEY */ + /* data for option_help() */ static const char *opt_intro[] = { "",