/* * prefs.c * * Select preferences */ #include "graphics.h" #include "grv.h" /* * Keyboard map */ SDLKey kbd_keys[NKEYS] = { SDLK_w, /* Up */ SDLK_a, /* Left */ SDLK_s, /* Right */ SDLK_z, /* Down */ SDLK_u, /* Shoot up */ SDLK_h, /* Shoot left */ SDLK_j, /* Shoot right */ SDLK_n, /* Shoot down */ SDLK_SPACE, /* Stop */ SDLK_ESCAPE, /* Escape */ SDLK_F1, /* Pause */ }; static void load_keys(void) { FILE *f; unsigned long keycode; int i; f = fopen("grvkeys.dat", "rt"); if ( !f ) return; for ( i = 0 ; i < NKEYS ; i++ ) { if ( fscanf(f, "%lu", &keycode) != 1 ) break; kbd_keys[i] = keycode; } fclose(f); } static void save_keys(void) { FILE *f; int i; f = fopen("grvkeys.dat", "wt"); if ( !f ) return; for ( i = 0 ; i < NKEYS ; i++ ) { fprintf(f, "%lu\n", (unsigned long)kbd_keys[i]); } fclose(f); } void load_prefs(void) { load_keys(); } void set_keys(void) { int i, j; int bad; initscreen(40); lprint( 3, 6, "Move up . . . . . ."); lprint( 4, 6, "Move left . . . . ."); lprint( 5, 6, "Move right . . . ."); lprint( 6, 6, "Move down . . . . ."); lprint( 7, 6, "Shoot up . . . . ."); lprint( 8, 6, "Shoot left . . . ."); lprint( 9, 6, "Shoot right . . . ."); lprint(10, 6, "Shoot down . . . ."); lprint(11, 6, "Dead stop . . . . ."); lprint(12, 6, "Quick escape . . ."); lprint(13, 6, "Pause game . . . ."); while ( 1 ) { bad = 0; color(0,gp.c); for ( i = 0 ; i < NKEYS ; i++ ) lprintf(i+3, 26, "%-10s", SDL_GetKeyName(kbd_keys[i])); for ( i = 0 ; i < NKEYS ; i++ ) { color(0,gp.c2); lprintf(i+3, 26, "%-10s", SDL_GetKeyName(kbd_keys[i])); kbd_keys[i] = get_key()->keysym.sym; color(0,gp.c); lprintf(i+3, 26, "%-10s", SDL_GetKeyName(kbd_keys[i])); lprint(20,5," "); for ( j = 0 ; j < i ; j++ ) if ( kbd_keys[i] == kbd_keys[j] ) bad = 1; } if ( bad ) { color(15,gp.c); lprint(20,5,"ERROR: Duplicated keys"); } else { save_keys(); color(0,gp.c); lprint(20,5,"Edit again? (Y/N) "); while ( !bad ) { switch ( get_key()->keysym.sym ) { case SDLK_y: bad = 1; break; case SDLK_n: return; default: break; } } } } }