Package: bsdgames Version: 2.17-1 Severity: wishlist Tags: patch A wrote a patch for atc a couple years ago. It changes the keys used for direction in the RULES structs depending on a command line option. I just cleaned it up a bit to work with 2.17 in hope that others can use it.
Please forward this feature to upstream if you think they may want it. -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (500, 'unstable'), (500, 'testing') Architecture: i386 (i686) Kernel: Linux 2.4.27-1-686 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages bsdgames depends on: ii libc6 2.3.2.ds1-18 GNU C Library: Shared libraries an ii libgcc1 1:3.4.2-2 GCC support library ii libncurses5 5.4-4 Shared libraries for terminal hand ii libstdc++5 1:3.3.4-13 The GNU Standard C++ Library v3 ii wamerican [wordlist] 5-4 American English dictionary words ii wbritish [wordlist] 5-4 British English dictionary words f ii wenglish 5-4 American English dictionary words -- no debconf information
diff -ru bsdgames-2.17-1.orig/atc/atc.6.in bsdgames-2.17-1.mine/atc/atc.6.in --- bsdgames-2.17-1.orig/atc/atc.6.in 2004-01-02 10:04:51.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/atc.6.in 2005-05-24 13:06:48.000000000 -0700 @@ -45,6 +45,7 @@ .Op Fl u?lstp .Op Fl gf Ar "game name" .Op Fl r Ar "random seed" +.Op Fl k Ar "keyboard" .Sh DESCRIPTION .Nm lets you try your hand at the nerve wracking duties of the air traffic @@ -81,6 +82,11 @@ .It Fl f Ar game Same as .Fl g . +.It Fl k Ar keyboard +Select an alternate keyboard map for the direction keys. ``dvorak'' uses +keys around ``o'' in dvorak layout and ``numpad'' uses the numbers +found on the right of many keyboards. The default is ``qwerty'', described in +.Sx INPUT . .It Fl r Ar seed Set the random seed. The purpose of this flag is questionable. @@ -223,11 +229,14 @@ .Em [0\-9] means any single digit, and .Aq Em dir -refers to a direction, given by the keys around the `s' key: ``wedcxzaq''. +refers to a direction, given by a square of keys on the keyboard, by +default the keys around the `s' in a qwerty layout: ``wedcxzaq''. The +.Fl k +option may be used to select a different group of keys. In absolute references, `q' refers to North-West or 315 degrees, and `w' refers to North, or 0 degrees. In relative references, `q' refers to \-45 degrees or 45 degrees left, and `w' -refers to 0 degrees, or no change in direction. +refers to 0 degrees, or no change in direction. .Pp All commands start with a plane letter. This indicates the recipient of the command. @@ -280,7 +289,10 @@ (not .Em to .Aq dir . ) -`w' (0 degrees) is no turn. +With the default keyboard map ( +.Fl k +qwerty +) `w' (0 degrees) is no turn. `e' is 45 degrees; `q' gives \-45 degrees counterclockwise, that is, 45 degrees clockwise. .It "t- [ dir ]" diff -ru bsdgames-2.17-1.orig/atc/def.h bsdgames-2.17-1.mine/atc/def.h --- bsdgames-2.17-1.orig/atc/def.h 2003-12-16 18:47:37.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/def.h 2005-05-21 05:45:36.000000000 -0700 @@ -60,6 +60,8 @@ #define MAXDIR 8 +#define KEYBOARD_DIR_NUM 3 + #define D_LEFT 1 #define D_RIGHT 2 #define D_UP 3 diff -ru bsdgames-2.17-1.orig/atc/extern.c bsdgames-2.17-1.mine/atc/extern.c --- bsdgames-2.17-1.orig/atc/extern.c 2003-12-16 18:47:37.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/extern.c 2005-05-21 05:45:36.000000000 -0700 @@ -54,7 +54,7 @@ char GAMES[] = "Game_List"; -int clck, safe_planes, start_time, test_mode; +int clck, safe_planes, start_time, test_mode, keyboard_dir; const char *file; @@ -66,6 +66,18 @@ struct termios tty_start, tty_new; +const char keyboard_dir_maps[KEYBOARD_DIR_NUM][MAXDIR] = { + {'w','e','d','c','x','z','a','q' }, + {',','.','e','j','q',';','a','\'' }, + {'8','9','6','3','2','1','4','7' } +}; + +const char * keyboard_dir_names[KEYBOARD_DIR_NUM] = { + "qwerty", + "dvorak", + "numpad" +}; + DISPLACEMENT displacement[MAXDIR] = { { 0, -1 }, { 1, -1 }, diff -ru bsdgames-2.17-1.orig/atc/extern.h bsdgames-2.17-1.mine/atc/extern.h --- bsdgames-2.17-1.orig/atc/extern.h 2004-01-27 12:52:07.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/extern.h 2005-05-24 12:49:10.000000000 -0700 @@ -46,7 +46,11 @@ extern char GAMES[]; extern const char *file; -extern int clck, safe_planes, start_time, test_mode; +extern int clck, safe_planes, start_time, test_mode, keyboard_dir; + +const char keyboard_dir_maps[KEYBOARD_DIR_NUM][MAXDIR]; + +const char * keyboard_dir_names[KEYBOARD_DIR_NUM]; extern FILE *filein, *fileout; @@ -84,6 +88,7 @@ void ioclrtoeol(int); void ioerror(int, int, const char *); void iomove(int); +int keyboard_dir_remap(const char *); int list_games(void); int log_score(int); void log_score_quit(int) __attribute__((__noreturn__)); diff -ru bsdgames-2.17-1.orig/atc/input.c bsdgames-2.17-1.mine/atc/input.c --- bsdgames-2.17-1.orig/atc/input.c 2005-02-15 22:24:50.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/input.c 2005-05-24 12:49:26.000000000 -0700 @@ -657,19 +657,65 @@ { int dir; - dir = -1; - switch (ch) { - case 'w': dir = 0; break; - case 'e': dir = 1; break; - case 'd': dir = 2; break; - case 'c': dir = 3; break; - case 'x': dir = 4; break; - case 'z': dir = 5; break; - case 'a': dir = 6; break; - case 'q': dir = 7; break; - default: - fprintf(stderr, "bad character in dir_no\n"); - break; + for( dir=0; dir<MAXDIR; ++dir ) { + if( ch == keyboard_dir_maps[keyboard_dir][dir] ) + return (dir); } - return (dir); + + fprintf(stderr, "bad character in dir_no\n"); + return (-1); +} + +// Load the map for the selected keyboard_dir into passed state rules +// Call once for each state that uses the direction keys. Do not call +// more than once with the same state. +void +keyboard_dir_load(state) + STATE state; +{ + int rule = 0; + int key = 0; + + // Find the first direction rule by looking for the default + // key binding + while( rule<state.num_rules && state.rule[rule].token!='w' ) + ++rule; + + // Copy the new key bindings + for( key=0; key<MAXDIR && rule<state.num_rules; ) { + state.rule[rule].token = keyboard_dir_maps[keyboard_dir][key]; + rule++; + key++; + } + } + +// Pass the name of a keyboard_dir map. Returns 1 on success, +// -1 on error. +// Call once to rename the keybindings in the rules. Do not call +// again in the same execution. +int +keyboard_dir_remap(name) + const char *name; +{ + int i; + + for( i=0; i<KEYBOARD_DIR_NUM; i++ ) { + if( strcmp(name, keyboard_dir_names[i]) == 0) { + keyboard_dir = i; + if( i > 0 ) { + // If name is not the default then modify the RULE structs for states that use directions + keyboard_dir_load(st[2]); + keyboard_dir_load(st[6]); + } + return 1; + } + } + + fprintf( stderr, "Bad key map name. Your choices are: " ); + for( i=0; i<KEYBOARD_DIR_NUM; i++ ) { + fprintf( stderr, "%s%s", keyboard_dir_names[i], i!=(KEYBOARD_DIR_NUM-1)? ", " : "\n" ); + } + return -1; +} + diff -ru bsdgames-2.17-1.orig/atc/main.c bsdgames-2.17-1.mine/atc/main.c --- bsdgames-2.17-1.orig/atc/main.c 2003-12-16 18:47:37.000000000 -0800 +++ bsdgames-2.17-1.mine/atc/main.c 2005-05-24 12:33:18.000000000 -0700 @@ -70,6 +70,7 @@ int f_printpath = 0; const char *file = NULL; int ch; + const char *keyboard_dir_name = NULL; struct sigaction sa; #ifdef BSD struct itimerval itv; @@ -81,7 +82,7 @@ start_time = seed = time(NULL); - while ((ch = getopt(ac, av, "ulstpg:f:r:")) != -1) { + while ((ch = getopt(ac, av, "ulstpg:f:r:k:")) != -1) { switch (ch) { case '?': case 'u': @@ -105,6 +106,9 @@ case 'g': file = optarg; break; + case 'k': + keyboard_dir_name = optarg; + break; } } if (optind < ac) @@ -113,7 +117,7 @@ if (f_usage) fprintf(stderr, - "Usage: %s -[u?lstp] [-[gf] game_name] [-r random seed]\n", + "Usage: %s -[u?lstp] [-[gf] game_name] [-r random seed] [-k keyboard map]\n", av[0]); if (f_showscore) log_score(1); @@ -135,9 +139,17 @@ else file = okay_game(file); + // Force use of default keyboard when reading game + keyboard_dir = 0; if (file == NULL || read_file(file) < 0) exit(1); + if (keyboard_dir_name == NULL) + keyboard_dir = 0; + else + if (keyboard_dir_remap(keyboard_dir_name) < 0) + exit(1); + init_gr(); setup_screen(sp);