diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 23d7fb7c7..b0eba3531 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D1X-Rebirth Changelog +20100118 +-------- +main/kconfig.c: Make kconfig menus into windows - allowing drawing of the game screen behind, changing of item to change while question mark flashing and clicking out of item change + 20100117 -------- main/menu.c: Respond to EVENT_NEWMENU_SELECTED for options_menuset and input_menuset, so the input menu will have THE event loop for kconfig diff --git a/main/kconfig.c b/main/kconfig.c index eedf1c14d..7400d7cc3 100644 --- a/main/kconfig.c +++ b/main/kconfig.c @@ -26,6 +26,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "error.h" #include "pstypes.h" #include "gr.h" +#include "window.h" #include "console.h" #include "key.h" #include "palette.h" @@ -73,8 +74,6 @@ char *mousebutton_textra[13] = { "M4", "M5", "M6", "M7", "M8", "M9", "M10","M11" ubyte system_keys[] = { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_MINUS, KEY_EQUAL, KEY_PRINT_SCREEN }; -extern void nm_draw_background1(char * filename); - control_info Controls; fix Cruise_speed=0; @@ -106,7 +105,22 @@ typedef struct kc_item { } kc_item; int Num_items=23; -kc_item *All_items; + +typedef struct kc_menu +{ + window *wind; + kc_item *items; + char *title; + int nitems; + int citem; + int old_axis[JOY_MAX_AXES]; + ubyte changing; + ubyte time_stopped; + ubyte q_fade_i; // for flashing the question mark +#ifdef NEWMENU_MOUSE + ubyte mouse_state, omouse_state; +#endif +} kc_menu; //----------- WARNING!!!!!!! ------------------------------------------- // THESE NEXT FOUR BLOCKS OF DATA ARE GENERATED BY PRESSING DEL+F12 WHEN @@ -285,12 +299,12 @@ kc_item kc_d1x[NUM_D1X_CONTROLS] = { }; void kc_drawitem( kc_item *item, int is_current ); -void kc_change_key( kc_item * item ); -void kc_change_joybutton( kc_item * item ); -void kc_change_mousebutton( kc_item * item ); -void kc_change_joyaxis( kc_item * item ); -void kc_change_mouseaxis( kc_item * item ); -void kc_change_invert( kc_item * item ); +void kc_change_key( kc_menu *menu, kc_item * item ); +void kc_change_joybutton( kc_menu *menu, kc_item * item ); +void kc_change_mousebutton( kc_menu *menu, kc_item * item ); +void kc_change_joyaxis( kc_menu *menu, kc_item * item ); +void kc_change_mouseaxis( kc_menu *menu, kc_item * item ); +void kc_change_invert( kc_menu *menu, kc_item * item ); int isJoyRotationKey(int test_key) { @@ -487,11 +501,13 @@ int get_item_height(kc_item *item) } #endif -grs_canvas kconfig_sub_canvas; -int kc_d1x_flag=0; +void nm_draw_background1(char * filename); +void kc_drawquestion( kc_menu *menu, kc_item *item ); -void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) +void kconfig_sub_draw_table(kc_menu *menu) { + grs_canvas * save_canvas = grd_curcanv; + grs_font * save_font; char * p; int i; int w = FSPACX(290), h = FSPACY(170); @@ -502,19 +518,14 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) #endif nm_draw_background(((SWIDTH-w)/2)-BORDERX,((SHEIGHT-h)/2)-BORDERY,((SWIDTH-w)/2)+w+BORDERX,((SHEIGHT-h)/2)+h+BORDERY); - if (kc_d1x_flag) { - items = kc_d1x; - nitems = NUM_D1X_CONTROLS; - title = "WEAPON KEYS"; - } - - gr_set_current_canvas(&kconfig_sub_canvas); + gr_set_current_canvas(window_get_canvas(menu->wind)); + save_font = grd_curcanv->cv_font; grd_curcanv->cv_font = MEDIUM3_FONT; - p = strchr( title, '\n' ); + p = strchr( menu->title, '\n' ); if ( p ) *p = 32; - gr_string( 0x8000, FSPACY(8), title ); + gr_string( 0x8000, FSPACY(8), menu->title ); if ( p ) *p = '\n'; grd_curcanv->cv_font = GAME_FONT; @@ -522,7 +533,7 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) gr_string( 0x8000, FSPACY(21), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits"); gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); - if ( items == kc_keyboard ) + if ( menu->items == kc_keyboard ) { gr_set_fontcolor( BM_XRGB(31,27,6), -1 ); gr_setcolor( BM_XRGB(31,27,6) ); @@ -541,7 +552,7 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) gr_string( FSPACX(264), FSPACY(40), "OR" ); } - else if ( items == kc_joystick ) + else if ( menu->items == kc_joystick ) { gr_set_fontcolor( BM_XRGB(31,27,6), -1 ); gr_setcolor( BM_XRGB(31,27,6) ); @@ -569,7 +580,7 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) gr_string( FSPACX(261), FSPACY(43), "OR" ); } - else if ( items == kc_mouse ) + else if ( menu->items == kc_mouse ) { gr_set_fontcolor( BM_XRGB(31,27,6), -1 ); gr_setcolor( BM_XRGB(31,27,6) ); @@ -581,7 +592,7 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) gr_string( FSPACX(246), FSPACY(129), TXT_AXIS ); gr_string( FSPACX(276), FSPACY(129), TXT_INVERT ); } - else if ( items == kc_d1x ) + else if ( menu->items == kc_d1x ) { gr_set_fontcolor( BM_XRGB(31,27,6), -1 ); gr_setcolor( BM_XRGB(31,27,6) ); @@ -590,183 +601,216 @@ void kconfig_sub_draw_table(kc_item * items,int nitems, char * title) gr_string(FSPACX(210), FSPACY(50), "JOYSTICK"); } - for (i=0; initems; i++ ) { + kc_drawitem( &menu->items[i], 0 ); } + kc_drawitem( &menu->items[menu->citem], 1 ); + + if (menu->changing) + { + switch( menu->items[menu->citem].type ) + { + case BT_KEY: gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_KEY ); break; + case BT_MOUSE_BUTTON: gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_MBUTTON ); break; + case BT_MOUSE_AXIS: gr_string( 0x8000, FSPACY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS ); break; + case BT_JOY_BUTTON: gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_JBUTTON ); break; + case BT_JOY_AXIS: gr_string( 0x8000, FSPACY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS ); break; + } + kc_drawquestion( menu, &menu->items[menu->citem] ); + } + gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); + grd_curcanv->cv_font = save_font; + gr_set_current_canvas( save_canvas ); } -void kconfig_sub(kc_item * items,int nitems, char * title) +void kconfig_start_changing(kc_menu *menu) { - grs_font * save_font; - int i,k,ocitem,citem; - int time_stopped = 0; - grs_canvas * save_canvas; -#ifdef NEWMENU_MOUSE - int mouse_state, omouse_state, mx, my, mz, x1, x2, y1, y2; -#endif - - All_items = items; - Num_items = nitems; - -#ifdef NETWORK - if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) ) -#else - if (Endlevel_sequence) -#endif + if (menu->items[menu->citem].type == BT_INVERT) { - time_stopped = 1; - stop_time(); + kc_change_invert(menu, &menu->items[menu->citem]); + return; + } + + gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); + menu->q_fade_i = 0; // start question mark flasher + + game_flush_inputs(); + if (menu->items[menu->citem].type == BT_JOY_AXIS) + joystick_read_raw_axis( JOY_ALL_AXIS, menu->old_axis ); + + menu->changing = 1; +} + +int kconfig_handler(window *wind, d_event *event, kc_menu *menu) +{ + grs_canvas * save_canvas = grd_curcanv; + int i,k; +#ifdef NEWMENU_MOUSE + int mx, my, mz, x1, x2, y1, y2; +#endif + + if (event->type == EVENT_DRAW) + { + kconfig_sub_draw_table(menu); + return 1; + } + else if (event->type == EVENT_CLOSE) + { + game_flush_inputs(); + newmenu_hide_cursor(); + if (menu->time_stopped) + start_time(); + d_free(menu); + + // Update save values... + + for (i=0; isc_canvas, (SWIDTH - FSPACX(320))/2, (SHEIGHT - FSPACY(200))/2, FSPACX(320), FSPACY(200)); - - save_font = grd_curcanv->cv_font; - - game_flush_inputs(); - - citem = 0; - - newmenu_show_cursor(); - -#ifdef NEWMENU_MOUSE - mouse_state = omouse_state = 0; -#endif - - nm_draw_background1(NULL); - - while(1) - { + if (menu->changing) + timer_delay(f0_1/10); + else timer_delay2(50); - gr_flip(); - if (items == kc_d1x) - kc_d1x_flag=1; - else - kc_d1x_flag=0; - kconfig_sub_draw_table(items,nitems,title); - kc_drawitem( &items[citem], 1 ); - - //see if redbook song needs to be restarted - RBACheckFinishedHook(); - - k = key_inkey(); - + + //see if redbook song needs to be restarted + RBACheckFinishedHook(); + + k = key_inkey(); + #ifdef NEWMENU_MOUSE - omouse_state = mouse_state; - mouse_state = mouse_button_state(0); + newmenu_show_cursor(); // possibly hidden + menu->omouse_state = menu->mouse_state; + menu->mouse_state = mouse_button_state(0); #endif + + if (menu->changing) + { + if (k == KEY_ESC) + menu->changing = 0; + else + switch( menu->items[menu->citem].type ) + { + case BT_KEY: kc_change_key( menu, &menu->items[menu->citem] ); break; + case BT_MOUSE_BUTTON: kc_change_mousebutton( menu, &menu->items[menu->citem] ); break; + case BT_MOUSE_AXIS: kc_change_mouseaxis( menu, &menu->items[menu->citem] ); break; + case BT_JOY_BUTTON: kc_change_joybutton( menu, &menu->items[menu->citem] ); break; + case BT_JOY_AXIS: kc_change_joyaxis( menu, &menu->items[menu->citem] ); break; + } + + if (!menu->changing) + { + gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); + game_flush_inputs(); + return 1; + } + } #ifdef NETWORK - if ( !time_stopped ) - if (multi_menu_poll() == -1) - k = -2; + if ( !menu->time_stopped ) + if (multi_menu_poll() == -1) + k = -2; #endif - ocitem = citem; - switch( k ) - { - case KEY_BACKSP: - Int3(); - break; + switch( k ) + { + case KEY_BACKSP: + Int3(); + break; #ifdef macintosh - case KEY_COMMAND+KEY_SHIFTED+KEY_3: + case KEY_COMMAND+KEY_SHIFTED+KEY_3: #endif - case KEY_PRINT_SCREEN: - save_screen_shot(0); - break; - case KEY_CTRLED+KEY_D: - items[citem].value = 255; - kc_drawitem( &items[citem], 1 ); - break; - case KEY_CTRLED+KEY_R: - if ( items==kc_keyboard ) + case KEY_PRINT_SCREEN: + save_screen_shot(0); + break; + case KEY_CTRLED+KEY_D: + menu->items[menu->citem].value = 255; + break; + case KEY_CTRLED+KEY_R: + if ( menu->items==kc_keyboard ) + { + for (i=0; iitems[i].value=DefaultKeySettings[0][i]; } - else if ( items==kc_d1x ) + } + else if ( menu->items==kc_d1x ) + { + for(i=0;iitems[i].value=DefaultKeySettingsD1X[i]; } - else if ( items==kc_mouse ) + } + else if ( menu->items==kc_mouse ) + { + for (i=0; iitems[i].value = DefaultKeySettings[PlayerCfg.ControlType][i]; } - else + } + else + { + for (i=0; iitems[i].value = DefaultKeySettings[PlayerCfg.ControlType][i]; } - kc_drawitem( &items[citem], 1 ); - break; + } + break; case KEY_DELETE: - items[citem].value=255; - kc_drawitem( &items[citem], 1 ); - break; + menu->items[menu->citem].value=255; + break; case KEY_UP: case KEY_PAD8: #ifdef TABLE_CREATION - if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem); + if (menu->items[menu->citem].u==-1) menu->items[menu->citem].u=find_next_item_up( menu->items,menu->nitems, menu->citem); #endif - citem = items[citem].u; - break; + menu->citem = menu->items[menu->citem].u; + break; case KEY_DOWN: case KEY_PAD2: #ifdef TABLE_CREATION - if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem); + if (menu->items[menu->citem].d==-1) menu->items[menu->citem].d=find_next_item_down( menu->items,menu->nitems, menu->citem); #endif - citem = items[citem].d; - break; + menu->citem = menu->items[menu->citem].d; + break; case KEY_LEFT: case KEY_PAD4: #ifdef TABLE_CREATION - if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem); + if (menu->items[menu->citem].l==-1) menu->items[menu->citem].l=find_next_item_left( menu->items,menu->nitems, menu->citem); #endif - citem = items[citem].l; - break; + menu->citem = menu->items[menu->citem].l; + break; case KEY_RIGHT: case KEY_PAD6: #ifdef TABLE_CREATION - if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem); + if (menu->items[menu->citem].r==-1) menu->items[menu->citem].r=find_next_item_right( menu->items,menu->nitems, menu->citem); #endif - citem = items[citem].r; - break; + menu->citem = menu->items[menu->citem].r; + break; case KEY_ENTER: case KEY_PADENTER: - switch( items[citem].type ) { - case BT_KEY: kc_change_key( &items[citem] ); break; - case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break; - case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break; - case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break; - case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break; - case BT_INVERT: kc_change_invert( &items[citem] ); break; - } - break; + kconfig_start_changing(menu); + break; case -2: case KEY_ESC: - grd_curcanv->cv_font = save_font; - - gr_set_current_canvas( save_canvas ); - game_flush_inputs(); - newmenu_hide_cursor(); - if (time_stopped) - start_time(); - return; + window_close(wind); + break; #ifdef TABLE_CREATION case KEY_F12: { FILE * fp; @@ -795,7 +839,7 @@ void kconfig_sub(kc_item * items,int nitems, char * title) kc_d1x[i].r = find_next_item_right( kc_d1x,NUM_D1X_CONTROLS, i); } fp = fopen( "kconfig.cod", "wt" ); - + fprintf( fp, "ubyte DefaultKeySettings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" ); for (i=0; icv_bitmap.bm_x + FSPACX(items[i].x) + FSPACX(items[i].w1); - x2 = x1 + FSPACX(items[i].w2); - y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(items[i].y); - y2 = y1 + item_height; - if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - citem = i; - break; - } + } - } - else if ( !mouse_state && omouse_state ) { - int item_height; - - mouse_get_pos(&mx, &my, &mz); - item_height = get_item_height( &items[citem] ); - x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(items[citem].x) + FSPACX(items[citem].w1); - x2 = x1 + FSPACX(items[citem].w2); - y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(items[citem].y); + break; +#endif + case 0: // some other event + break; + + default: + return 0; + break; + } + +#ifdef NEWMENU_MOUSE + gr_set_current_canvas(window_get_canvas(wind)); + + if ( (menu->mouse_state && !menu->omouse_state) || (menu->mouse_state && menu->omouse_state) ) { + int item_height; + + mouse_get_pos(&mx, &my, &mz); + for (i=0; initems; i++ ) { + item_height = get_item_height( &menu->items[i] ); + x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[i].x) + FSPACX(menu->items[i].w1); + x2 = x1 + FSPACX(menu->items[i].w2); + y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[i].y); y2 = y1 + item_height; if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { - newmenu_hide_cursor(); - switch( items[citem].type ) { - case BT_KEY: kc_change_key( &items[citem] ); break; - case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break; - case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break; - case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break; - case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break; - case BT_INVERT: kc_change_invert( &items[citem] ); break; - } - newmenu_show_cursor(); + menu->citem = i; + break; } } -#endif // NEWMENU_MOUSE - - if (ocitem!=citem) { - newmenu_hide_cursor(); - kc_drawitem( &items[ocitem], 0 ); - kc_drawitem( &items[citem], 1 ); - newmenu_show_cursor(); + } + else if ( !menu->mouse_state && menu->omouse_state ) { + int item_height; + + mouse_get_pos(&mx, &my, &mz); + item_height = get_item_height( &menu->items[menu->citem] ); + x1 = grd_curcanv->cv_bitmap.bm_x + FSPACX(menu->items[menu->citem].x) + FSPACX(menu->items[menu->citem].w1); + x2 = x1 + FSPACX(menu->items[menu->citem].w2); + y1 = grd_curcanv->cv_bitmap.bm_y + FSPACY(menu->items[menu->citem].y); + y2 = y1 + item_height; + if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) { + kconfig_start_changing(menu); + } + else + { + // Click out of changing mode - kreatordxx + menu->changing = 0; + gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); + game_flush_inputs(); + return 1; } } + + gr_set_current_canvas(save_canvas); +#endif // NEWMENU_MOUSE + + return 1; +} + +void kconfig_sub(kc_item * items,int nitems, char *title) +{ + kc_menu *menu; + + MALLOC(menu, kc_menu, 1); + if (!menu) + return; + + menu->time_stopped = 0; + menu->items = items; + menu->nitems = nitems; + menu->title = title; + menu->citem = 0; + menu->changing = 0; + +#ifdef NETWORK + if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) ) +#else + if (Endlevel_sequence) +#endif + { + menu->time_stopped = 1; + stop_time(); + } + + game_flush_inputs(); + + newmenu_show_cursor(); + +#ifdef NEWMENU_MOUSE + menu->mouse_state = menu->omouse_state = 0; +#endif + + nm_draw_background1(NULL); + + if (!(menu->wind = window_create(&grd_curscreen->sc_canvas, (SWIDTH - FSPACX(320))/2, (SHEIGHT - FSPACY(200))/2, FSPACX(320), FSPACY(200), + (int (*)(window *, d_event *, void *))kconfig_handler, menu))) + d_free(menu); } @@ -954,9 +1041,7 @@ void kc_drawitem( kc_item *item, int is_current ) } -static int looper=0; - -void kc_drawquestion( kc_item *item ) +void kc_drawquestion( kc_menu *menu, kc_item *item ) { int c, x, w, h, aw; @@ -964,9 +1049,9 @@ void kc_drawquestion( kc_item *item ) c = BM_XRGB(21,0,24); - gr_setcolor( gr_fade_table[fades[looper]*256+c] ); - looper++; - if (looper>63) looper=0; + gr_setcolor( gr_fade_table[fades[menu->q_fade_i]*256+c] ); + menu->q_fade_i++; + if (menu->q_fade_i>63) menu->q_fade_i=0; gr_urect( FSPACX(item->w1+item->x), FSPACY(item->y-1), FSPACX(item->w1+item->x+item->w2), FSPACY(item->y)+h ); @@ -977,267 +1062,135 @@ void kc_drawquestion( kc_item *item ) gr_string( x, FSPACY(item->y), "?" ); } -void kc_change_key( kc_item * item ) +void kc_change_key( kc_menu *menu, kc_item * item ) { - int i,n,f,k; - ubyte keycode; + int i,n,f; + ubyte keycode = 255; - gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); - - game_flush_inputs(); - keycode=255; - k=255; - - while( (k!=KEY_ESC) && (keycode==255) ) - { -#ifdef NETWORK - if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) - multi_menu_poll(); -#endif - k = key_inkey(); - timer_delay(f0_1/10); - - gr_flip(); - kconfig_sub_draw_table(kc_keyboard,NUM_KEY_CONTROLS,"KEYBOARD"); - gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_KEY ); - kc_drawquestion( item ); - - for (i=0; i<256; i++ ) { - if (keyd_pressed[i] && (strlen(key_text[i])>0)) { - f = 0; - for (n=0; n0)) { + f = 0; + for (n=0; nnitems; i++ ) { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_KEY) && (menu->items[i].value==keycode) ) { + menu->items[i].value = 255; } } item->value = keycode; + menu->changing = 0; } - kc_drawitem( item, 1 ); - - gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) ); - game_flush_inputs(); - } -void kc_change_joybutton( kc_item * item ) +void kc_change_joybutton( kc_menu *menu, kc_item * item ) { - int n,i,k; - ubyte code; + int n,i; + ubyte code = 255; - gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); - - game_flush_inputs(); - code=255; - k=255; - - while( (k!=KEY_ESC) && (code==255)) - { -#ifdef NETWORK - if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) - multi_menu_poll(); -#endif - k = key_inkey(); - timer_delay(f0_1/10); - - if (k == KEY_PRINT_SCREEN) - save_screen_shot(0); - - gr_flip(); - kconfig_sub_draw_table(kc_joystick,NUM_JOYSTICK_CONTROLS,"JOYSTICK"); - gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_JBUTTON ); - kc_drawquestion( item ); - - for (i = 0; i < JOY_MAX_BUTTONS; i++) + for (i = 0; i < JOY_MAX_BUTTONS; i++) + { + if ( joy_get_button_state(i) ) { - if ( joy_get_button_state(i) ) - code = i; + code = i; + menu->changing = 0; } } if (code!=255) { - for (i=0; initems; i++ ) { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_JOY_BUTTON) && (menu->items[i].value==code) ) { + menu->items[i].value = 255; } } item->value = code; + menu->changing = 0; } - kc_drawitem( item, 1 ); - game_flush_inputs(); } -void kc_change_mousebutton( kc_item * item ) +void kc_change_mousebutton( kc_menu *menu, kc_item * item ) { - int n,i,b,k; - ubyte code; + int n,i,b; + ubyte code = 255; - gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); - - game_flush_inputs(); - code=255; - k=255; - - while( (k!=KEY_ESC) && (code==255)) - { -#ifdef NETWORK - if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) - multi_menu_poll(); -#endif - k = key_inkey(); - timer_delay(f0_1/10); - - if (k == KEY_PRINT_SCREEN) - save_screen_shot(0); - - gr_flip(); - kconfig_sub_draw_table(kc_mouse,NUM_MOUSE_CONTROLS,"MOUSE"); - gr_string( 0x8000, FSPACY(INFO_Y), TXT_PRESS_NEW_MBUTTON ); - kc_drawquestion( item ); - - b = mouse_get_btns(); - for (i = 0; i < 16; i++ ) { - if ( b & (1<nitems; i++ ) { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_MOUSE_BUTTON) && (menu->items[i].value==code) ) { + menu->items[i].value = 255; } } item->value = code; + menu->changing = 0; } - kc_drawitem( item, 1 ); - game_flush_inputs(); - } -void kc_change_joyaxis( kc_item * item ) +void kc_change_joyaxis( kc_menu *menu, kc_item * item ) { int axis[JOY_MAX_AXES]; - int old_axis[JOY_MAX_AXES]; int numaxis = joy_num_axes; - int n,i,k; - ubyte code; + int n,i; + ubyte code = 255; - gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); + joystick_read_raw_axis( JOY_ALL_AXIS, axis ); - game_flush_inputs(); - code=255; - k=255; - - joystick_read_raw_axis( JOY_ALL_AXIS, old_axis ); - - while( (k!=KEY_ESC) && (code==255)) - { -#ifdef NETWORK - if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) - multi_menu_poll(); -#endif - k = key_inkey(); - timer_delay(f0_1/10); - - if (k == KEY_PRINT_SCREEN) - save_screen_shot(0); - - gr_flip(); - kconfig_sub_draw_table(kc_joystick,NUM_JOYSTICK_CONTROLS,"JOYSTICK"); - gr_string( 0x8000, FSPACY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS ); - kc_drawquestion( item ); - - joystick_read_raw_axis( JOY_ALL_AXIS, axis ); - - for (i=0; i4096 ) - { - code = i; - con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i); - } + for (i=0; iold_axis[i])>4096 ) + { + code = i; + con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i); } } if (code!=255) { - for (i=0; initems; i++ ) { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_JOY_AXIS) && (menu->items[i].value==code) ) { + menu->items[i].value = 255; } } item->value = code; + menu->changing = 0; } - - kc_drawitem( item, 1 ); - game_flush_inputs(); - } -void kc_change_mouseaxis( kc_item * item ) +void kc_change_mouseaxis( kc_menu *menu, kc_item * item ) { - int i,n,k; - ubyte code; + int i,n; + ubyte code = 255; int dx,dy,dz; - gr_set_fontcolor( BM_XRGB(28,28,28), -1 ); - - game_flush_inputs(); - code=255; - k=255; + mouse_get_delta( &dx, &dy, &dz ); + if ( abs(dx)>20 ) code = 0; + if ( abs(dy)>20 ) code = 1; + if ( abs(dz)>20 ) code = 2; - while( (k!=KEY_ESC) && (code==255)) - { -#ifdef NETWORK - if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) - multi_menu_poll(); -#endif - k = key_inkey(); - timer_delay(f0_1/10); - - if (k == KEY_PRINT_SCREEN) - save_screen_shot(0); - - gr_flip(); - kconfig_sub_draw_table(kc_mouse,NUM_MOUSE_CONTROLS,"MOUSE"); - gr_string( 0x8000, FSPACY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS ); - kc_drawquestion( item ); - - mouse_get_delta( &dx, &dy, &dz ); - if ( abs(dx)>20 ) code = 0; - if ( abs(dy)>20 ) code = 1; - if ( abs(dz)>20 ) code = 2; - } if (code!=255) { - for (i=0; initems; i++ ) { + n = item - menu->items; + if ( (i!=n) && (menu->items[i].type==BT_MOUSE_AXIS) && (menu->items[i].value==code) ) { + menu->items[i].value = 255; } } item->value = code; + menu->changing = 0; } - kc_drawitem( item, 1 ); - game_flush_inputs(); } -void kc_change_invert( kc_item * item ) +void kc_change_invert( kc_menu *menu, kc_item * item ) { game_flush_inputs(); @@ -1246,16 +1199,13 @@ void kc_change_invert( kc_item * item ) else item->value = 1; - kc_drawitem( item, 1 ); - + menu->changing = 0; // in case we were changing something else } #include "screens.h" void kconfig(int n, char * title) { - int i; - set_screen_mode( SCREEN_MENU ); kc_set_controls(); @@ -1276,27 +1226,6 @@ void kconfig(int n, char * title) Int3(); return; } - - reset_cockpit(); //force cockpit redraw next time - - // Update save values... - - for (i=0; i