diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f5d71d38a..b98159493 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,7 @@ D1X-Rebirth Changelog 20100630 -------- main/gameseq.c: If multi_level_sync() fails, restart menu music since level music is playing already +main/game.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/newmenu.h, main/weapon.c: Removed SurfingNet global and made tabs a parameter of newmenu_dotiny; Same procedure with MenuReordering which is replaced with newmenu_doreorder to set reordering flag specifically 20100629 -------- diff --git a/main/game.c b/main/game.c index b0fcfa43b..081a83b80 100644 --- a/main/game.c +++ b/main/game.c @@ -797,7 +797,7 @@ void show_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "(Use \x85-# for F#. e.g. \x85-1 for F1)"; #endif - newmenu_dotiny( NULL, TXT_KEYS, nitems, m, free_help, NULL ); + newmenu_dotiny( NULL, TXT_KEYS, nitems, m, 0, free_help, NULL ); } void show_netgame_help() @@ -827,7 +827,7 @@ void show_netgame_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "kick: (*)\t KICK PLAYER (*) FROM GAME (Host-only)"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "KillReactor\t BLOW UP THE MINE (Host-only)"; - newmenu_dotiny( NULL, TXT_KEYS, nitems, m, free_help, NULL ); + newmenu_dotiny( NULL, TXT_KEYS, nitems, m, 0, free_help, NULL ); } void show_newdemo_help() @@ -857,7 +857,7 @@ void show_newdemo_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "(Use \x85-# for F#. e.g. \x85-1 for F1)"; #endif - newmenu_dotiny( NULL, "DEMO PLAYBACK CONTROLS", nitems, m, free_help, NULL ); + newmenu_dotiny( NULL, "DEMO PLAYBACK CONTROLS", nitems, m, 0, free_help, NULL ); } //temp function until Matt cleans up game sequencing diff --git a/main/net_ipx.c b/main/net_ipx.c index 50c754e55..2830f2113 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -93,7 +93,6 @@ int IPX_Socket=0; int IPX_allow_socket_changes = 1; IPX_sequence_packet IPX_Seq; extern obj_position Player_init[MAX_PLAYERS]; -extern ubyte SurfingNet; extern void game_disable_cheats(); int net_ipx_wait_for_snyc(); @@ -3241,7 +3240,6 @@ int net_ipx_join_poll( newmenu *menu, d_event *event, void *menu_text ) break; case EVENT_WINDOW_CLOSE: - SurfingNet=0; d_free(menu_text); d_free(menus); @@ -3513,8 +3511,7 @@ void net_ipx_join_game() } num_active_ipx_changed = 1; - SurfingNet=1; - newmenu_dotiny("NETGAMES", NULL,IPX_MAX_NETGAMES+2, m, net_ipx_join_poll, menu_text); + newmenu_dotiny("NETGAMES", NULL,IPX_MAX_NETGAMES+2, m, 1, net_ipx_join_poll, menu_text); } void net_ipx_leave_game() diff --git a/main/net_udp.c b/main/net_udp.c index 94ca1d947..494c7ecb4 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -98,7 +98,6 @@ static int UDP_Socket[2] = { -1, -1 }; static char UDP_MyPort[6] = ""; struct _sockaddr GBcast; // global Broadcast address clients and hosts will use for lite_info exchange over LAN extern obj_position Player_init[MAX_PLAYERS]; -extern ubyte SurfingNet; /* General UDP functions - START */ // Resolve address @@ -564,7 +563,6 @@ int net_udp_list_join_poll( newmenu *menu, d_event *event, void *menu_text ) break; } case EVENT_WINDOW_CLOSE: - SurfingNet=0; d_free(menu_text); d_free(menus); @@ -719,8 +717,7 @@ void net_udp_list_join_game() } num_active_udp_changed = 1; - SurfingNet=1; - newmenu_dotiny("NETGAMES", NULL,(UDP_NETGAMES_PPAGE+2), m, net_udp_list_join_poll, menu_text); + newmenu_dotiny("NETGAMES", NULL,(UDP_NETGAMES_PPAGE+2), m, 1, net_udp_list_join_poll, menu_text); } void net_udp_send_sequence_packet(UDP_sequence_packet seq, struct _sockaddr recv_addr) diff --git a/main/newmenu.c b/main/newmenu.c index 8f5443a19..24e085a41 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -84,6 +84,8 @@ struct newmenu int citem; char *filename; int tiny_mode; + int tabs_flag; + int reorderitems; int scroll_offset, last_scroll_check, max_displayable; int all_text; //set true if all text items int is_scroll_box; // Is this a scrolling box? Set to false at init @@ -95,10 +97,8 @@ struct newmenu grs_bitmap nm_background, nm_background1; grs_bitmap *nm_background_sub = NULL; -ubyte MenuReordering=0; -ubyte SurfingNet=0; -newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode ); +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode, int TabsFlag ); void newmenu_close() { if (nm_background.bm_data) @@ -197,7 +197,7 @@ void nm_draw_background(int x1, int y1, int x2, int y2 ) } // Draw a left justfied string -void nm_string( int w1,int x, int y, char * s) +void nm_string( int w1,int x, int y, char * s, int tabs_flag) { int w,h,aw,tx=0,t=0,i; char *p,*s1,*s2,measure[2]; @@ -213,7 +213,7 @@ void nm_string( int w1,int x, int y, char * s) measure[1]=0; - if (!SurfingNet) { + if (!tabs_flag) { p = strchr( s2, '\t' ); if (p && (w1>0) ) { *p = '\0'; @@ -226,9 +226,9 @@ void nm_string( int w1,int x, int y, char * s) if (w1 > 0) w = w1; - if (SurfingNet) { + if (tabs_flag) { for (i=0;i0) ) { + if (!tabs_flag && p && (w1>0) ) { gr_get_string_size(s1, &w, &h, &aw ); gr_string( x+w1-w, y, s1 ); @@ -332,7 +332,7 @@ void nm_string_inputbox( int w, int x, int y, char * text, int current ) gr_string( x+w1, y, CURSOR_STRING ); } -void draw_item( newmenu_item *item, int is_current, int tiny ) +void draw_item( newmenu_item *item, int is_current, int tiny, int tabs_flag ) { if (tiny) { @@ -355,7 +355,7 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) switch( item->type ) { case NM_TYPE_TEXT: case NM_TYPE_MENU: - nm_string( item->w, item->x, item->y, item->text ); + nm_string( item->w, item->x, item->y, item->text, tabs_flag ); break; case NM_TYPE_SLIDER: { @@ -376,7 +376,7 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) case NM_TYPE_INPUT_MENU: if ( item->group==0 ) { - nm_string( item->w, item->x, item->y, item->text ); + nm_string( item->w, item->x, item->y, item->text, tabs_flag ); } else { nm_string_inputbox( item->w, item->x, item->y, item->text, is_current ); } @@ -385,14 +385,14 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) nm_string_inputbox( item->w, item->x, item->y, item->text, is_current ); break; case NM_TYPE_CHECK: - nm_string( item->w, item->x, item->y, item->text ); + nm_string( item->w, item->x, item->y, item->text, tabs_flag ); if (item->value) nm_rstring( item->right_offset,item->x, item->y, CHECKED_CHECK_BOX ); else nm_rstring( item->right_offset,item->x, item->y, NORMAL_CHECK_BOX ); break; case NM_TYPE_RADIO: - nm_string( item->w, item->x, item->y, item->text ); + nm_string( item->w, item->x, item->y, item->text, tabs_flag ); if (item->value) nm_rstring( item->right_offset, item->x, item->y, CHECKED_RADIO_BOX ); else @@ -403,7 +403,7 @@ void draw_item( newmenu_item *item, int is_current, int tiny ) char text[10]; if (item->value < item->min_value) item->value=item->min_value; if (item->value > item->max_value) item->value=item->max_value; - nm_string( item->w, item->x, item->y, item->text ); + nm_string( item->w, item->x, item->y, item->text, tabs_flag ); sprintf( text, "%d", item->value ); nm_rstring( item->right_offset,item->x, item->y, text ); } @@ -450,9 +450,9 @@ int newmenu_do( char * title, char * subtitle, int nitems, newmenu_item * item, return newmenu_do2( title, subtitle, nitems, item, subfunction, userdata, 0, NULL ); } -newmenu *newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) +newmenu *newmenu_dotiny( char * title, char * subtitle, int nitems, newmenu_item * item, int TabsFlag, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) { - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, 1 ); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, 0, NULL, 1, TabsFlag ); } @@ -491,15 +491,48 @@ int newmenu_do2( char * title, char * subtitle, int nitems, newmenu_item * item, return rval; } + +// Basically the same as do2 but sets reorderitems flag for weapon priority menu a bit redundant to get lose of a global variable but oh well... +int newmenu_doreorder( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata ) +{ + newmenu *menu; + window *wind; + int rval = -1; + + menu = newmenu_do3( title, subtitle, nitems, item, subfunction, userdata, 0, NULL ); + + if (!menu) + return -1; + menu->reorderitems = 1; + menu->leave = 0; // no leaving this function until we're finished + wind = menu->wind; // avoid dereferencing a freed 'menu' + + // newmenu_do2 and simpler get their own event loop + // This is so the caller doesn't have to provide a callback that responds to EVENT_NEWMENU_SELECTED + while (window_exists(wind)) + { + event_process(); + + if (menu->leave) + { + rval = menu->citem; + if (window_exists(wind) && !window_close(wind)) + menu->leave = 0; // user aborted close + } + } + + return rval; +} + newmenu *newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename ) { set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0 ); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0, 0 ); } newmenu *newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename){ set_screen_mode(SCREEN_MENU);//hafta set the screen mode before calling or fonts might get changed/freed up if screen res changes - return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0); + return newmenu_do4( title, subtitle, nitems, item, subfunction, userdata, citem, filename, 0, 0); } @@ -914,7 +947,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) break; case KEY_SHIFTED+KEY_UP: - if (MenuReordering && menu->citem!=0) + if (menu->reorderitems && menu->citem!=0) { Temp=menu->items[menu->citem].text; TempVal=menu->items[menu->citem].value; @@ -927,7 +960,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) } break; case KEY_SHIFTED+KEY_DOWN: - if (MenuReordering && menu->citem!=(menu->nitems-1)) + if (menu->reorderitems && menu->citem!=(menu->nitems-1)) { Temp=menu->items[menu->citem].text; TempVal=menu->items[menu->citem].value; @@ -1395,7 +1428,7 @@ int newmenu_draw(window *wind, newmenu *menu) for (i=menu->scroll_offset; imax_displayable+menu->scroll_offset; i++ ) { menu->items[i].y-=(((int)LINE_SPACING)*menu->scroll_offset); - draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode ); + draw_item( &menu->items[i], (i==menu->citem && !menu->all_text),menu->tiny_mode, menu->tabs_flag ); menu->items[i].y+=(((int)LINE_SPACING)*menu->scroll_offset); } @@ -1510,7 +1543,7 @@ int newmenu_handler(window *wind, d_event *event, newmenu *menu) return 0; } -newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode ) +newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char * filename, int TinyMode, int TabsFlag ) { window *wind = NULL; newmenu *menu; @@ -1536,6 +1569,8 @@ newmenu *newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * menu->items = item; menu->filename = filename; menu->tiny_mode = TinyMode; + menu->tabs_flag = TabsFlag; + menu->reorderitems = 0; // will be set if needed menu->leave = 1; // Default to leaving newmenu_doX function menu->userdata = userdata; diff --git a/main/newmenu.h b/main/newmenu.h index c8389e760..ddc6297c5 100644 --- a/main/newmenu.h +++ b/main/newmenu.h @@ -72,7 +72,10 @@ extern int newmenu_do2(char *title, char *subtitle, int nitems, newmenu_item *it extern newmenu *newmenu_do3(char *title, char *subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata, int citem, char *filename); // Tiny menu with GAME_FONT -extern newmenu *newmenu_dotiny(char * title, char * subtitle, int nitems, newmenu_item * item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata); +extern newmenu *newmenu_dotiny(char * title, char * subtitle, int nitems, newmenu_item * item, int TabsFlag, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata); + +// Basically the same as do2 but sets reorderitems flag for weapon priority menu a bit redundant to get lose of a global variable but oh well... +extern int newmenu_doreorder(char * title, char * subtitle, int nitems, newmenu_item *item, int (*subfunction)(newmenu *menu, d_event *event, void *userdata), void *userdata); // Sample Code: /* diff --git a/main/weapon.c b/main/weapon.c index f925cf3d0..b491f64eb 100644 --- a/main/weapon.c +++ b/main/weapon.c @@ -437,10 +437,7 @@ void ReorderPrimary () m[i].text=(char *)PRIMARY_WEAPON_NAMES(PlayerCfg.PrimaryOrder[i]); m[i].value=PlayerCfg.PrimaryOrder[i]; } - MenuReordering=1; - i = newmenu_do("Reorder Primary","Shift+Up/Down arrow to move item", i, m, NULL, NULL); - MenuReordering=0; - + i = newmenu_doreorder("Reorder Primary","Shift+Up/Down arrow to move item", i, m, NULL, NULL); for (i=0;i