diff --git a/CHANGELOG.txt b/CHANGELOG.txt index d50ddd978..aa231b5cc 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ D2X-Rebirth Changelog +20100201 +-------- +arch/carbon/conf.h, d1x-rebirth.xcodeproj/project.pbxproj, main/kconfig.c, main/menu.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c, main/newmenu.h: Leave kconfig_idle early if exiting kconfig to avoid erroneous memory access; initialise menu's citem properly; add EVENT_NEWMENU_CHANGED; activate USE_IPX in Xcode while I'm still changing net_ipx.c + 20100131 -------- main/newmenu.c: Fix memory errors, but still dynamically allocate menu and lb so it doesn't have to stay in newmenu_do4 and newmenu_listbox1 respectively diff --git a/arch/carbon/conf.h b/arch/carbon/conf.h index e7cdbb4c6..9b1640148 100644 --- a/arch/carbon/conf.h +++ b/arch/carbon/conf.h @@ -45,6 +45,7 @@ /* Define if you want a network build */ # define NETWORK # define USE_UDP +# define USE_IPX /* Define to 1 if the system has the type `struct timespec'. */ #define HAVE_STRUCT_TIMESPEC 1 diff --git a/d2x-rebirth.xcodeproj/project.pbxproj b/d2x-rebirth.xcodeproj/project.pbxproj index f52c05ebb..809316978 100755 --- a/d2x-rebirth.xcodeproj/project.pbxproj +++ b/d2x-rebirth.xcodeproj/project.pbxproj @@ -337,6 +337,7 @@ 67F6FED3066B13B400443922 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F6FED1066B13B400443922 /* SDLMain.m */; }; 67F6FED4066B13B400443922 /* SDLMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 67F6FED0066B13B400443922 /* SDLMain.h */; }; 67F6FED5066B13B400443922 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F6FED1066B13B400443922 /* SDLMain.m */; }; + EB0E38BC11169B5700791182 /* net_ipx.c in Sources */ = {isa = PBXBuildFile; fileRef = EBF658A00F936D5300CB5C73 /* net_ipx.c */; }; EB28D9A30ECEAF1C00E68E9B /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = EB28D9A20ECEAF1C00E68E9B /* init.c */; }; EB28D9A40ECEAF1C00E68E9B /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = EB28D9A20ECEAF1C00E68E9B /* init.c */; }; EB2EEB5810C50CE2005256F2 /* net_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 17DFA6B510C1A2D100674D11 /* net_udp.c */; }; @@ -1960,6 +1961,7 @@ 17DFA6C510C1A3BC00674D11 /* multibot.c in Sources */, 17DFA6C610C1A3D400674D11 /* kmatrix.c in Sources */, EB2EEB5810C50CE2005256F2 /* net_udp.c in Sources */, + EB0E38BC11169B5700791182 /* net_ipx.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/main/kconfig.c b/main/kconfig.c index 5068a2ea8..cdb4c8493 100644 --- a/main/kconfig.c +++ b/main/kconfig.c @@ -813,6 +813,7 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu) case -2: case KEY_ESC: window_close(wind); + return 1; break; #ifdef TABLE_CREATION case KEY_F12: { diff --git a/main/menu.c b/main/menu.c index 93fbf93e3..8e86233a7 100644 --- a/main/menu.c +++ b/main/menu.c @@ -719,7 +719,7 @@ int options_menuset(newmenu *menu, d_event *event, void *userdata) { switch (event->type) { - case EVENT_IDLE: // FIXME: Should become EVENT_ITEM_CHANGED later + case EVENT_NEWMENU_CHANGED: if ( newmenu_get_citem(menu)==4) { gr_palette_set_gamma(newmenu_get_items(menu)[4].value); @@ -852,7 +852,6 @@ void change_res() int input_menuset(newmenu *menu, d_event *event, void *userdata) { int i; - int oc_type = PlayerCfg.ControlType; newmenu_item *items = newmenu_get_items(menu); int citem = newmenu_get_citem(menu); @@ -860,23 +859,26 @@ int input_menuset(newmenu *menu, d_event *event, void *userdata) switch (event->type) { - case EVENT_IDLE: // FIXME: Should become EVENT_ITEM_CHANGED later - for (i=0; i<4; i++ ) - if (items[i].value) PlayerCfg.ControlType = i; - - if (PlayerCfg.ControlType == 2) PlayerCfg.ControlType = CONTROL_MOUSE; - if (PlayerCfg.ControlType == 3) PlayerCfg.ControlType = CONTROL_JOYMOUSE; - - if (oc_type != PlayerCfg.ControlType) { - kc_set_controls(); + case EVENT_NEWMENU_CHANGED: + switch (citem) + { + case 0: + case 1: + case 2: + case 3: + PlayerCfg.ControlType = citem; + if (PlayerCfg.ControlType == 2) PlayerCfg.ControlType = CONTROL_MOUSE; + if (PlayerCfg.ControlType == 3) PlayerCfg.ControlType = CONTROL_JOYMOUSE; + kc_set_controls(); + break; + + case 10: PlayerCfg.JoystickSensitivityX = items[citem].value; break; + case 11: PlayerCfg.JoystickSensitivityY = items[citem].value; break; + case 12: PlayerCfg.JoystickDeadzone = items[citem].value; break; + case 15: PlayerCfg.MouseSensitivityX = items[citem].value; break; + case 16: PlayerCfg.MouseSensitivityY = items[citem].value; break; + case 17: PlayerCfg.MouseFilter = items[citem].value; break; } - - PlayerCfg.JoystickSensitivityX = items[10].value; - PlayerCfg.JoystickSensitivityY = items[11].value; - PlayerCfg.JoystickDeadzone = items[12].value; - PlayerCfg.MouseSensitivityX = items[15].value; - PlayerCfg.MouseSensitivityY = items[16].value; - PlayerCfg.MouseFilter = items[17].value; break; case EVENT_NEWMENU_SELECTED: @@ -993,25 +995,33 @@ int sound_menuset(newmenu *menu, d_event *event, void *userdata) { newmenu_item *items = newmenu_get_items(menu); - if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED later - return 0; - + switch (event->type) + { + case EVENT_NEWMENU_CHANGED: + switch (newmenu_get_citem(menu)) + { + case 0: + GameCfg.DigiVolume = items[0].value; + digi_set_digi_volume( (GameCfg.DigiVolume*32768)/8 ); + digi_play_sample_once( SOUND_DROP_BOMB, F1_0 ); + break; + + case 1: + GameCfg.MusicVolume = items[1].value; + if (EXT_MUSIC_ON) + set_extmusic_volume(GameCfg.MusicVolume); + else + digi_set_midi_volume( (GameCfg.MusicVolume*128)/8 ); + break; + } + break; + + default: + break; + } + userdata = userdata; - if ( GameCfg.DigiVolume != items[0].value ) { - GameCfg.DigiVolume = items[0].value; - digi_set_digi_volume( (GameCfg.DigiVolume*32768)/8 ); - digi_play_sample_once( SOUND_DROP_BOMB, F1_0 ); - } - - if (GameCfg.MusicVolume != items[1].value ) { - GameCfg.MusicVolume = items[1].value; - if (EXT_MUSIC_ON) - set_extmusic_volume(GameCfg.MusicVolume); - else - digi_set_midi_volume( (GameCfg.MusicVolume*128)/8 ); - } - return 0; } diff --git a/main/net_ipx.c b/main/net_ipx.c index f70c986e3..efa2fb060 100644 --- a/main/net_ipx.c +++ b/main/net_ipx.c @@ -2987,67 +2987,68 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata ) return 1; } -static fix LastPTA; -static int LastKillGoal; static int opt_cinvul, opt_team_anarchy, opt_coop, opt_show_on_map, opt_closed,opt_maxnet; -static int last_cinvul=0,last_maxnet,opt_team_hoard; +static int opt_team_hoard; static int opt_refuse,opt_capture; static int opt_setpower,opt_playtime,opt_killgoal,opt_marker_view,opt_light; static int opt_difficulty,opt_packets, opt_bright,opt_start_invul, opt_show_names, opt_short_packets, opt_socket; -int net_ipx_game_param_poll( newmenu *menu, d_event *event, void *userdata ) +int net_ipx_game_param_handler( newmenu *menu, d_event *event, void *userdata ) { newmenu_item *menus = newmenu_get_items(menu); + int citem = newmenu_get_citem(menu); static int oldmaxnet=0; - if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED in future - return 0; - - if (((HoardEquipped() && menus[opt_team_hoard].value) || (menus[opt_team_anarchy].value || menus[opt_capture].value)) && !menus[opt_closed].value && !menus[opt_refuse].value) + switch (event->type) { - menus[opt_refuse].value = 1; - menus[opt_refuse-1].value = 0; - menus[opt_refuse-2].value = 0; - } - - if (menus[opt_coop].value) - { - oldmaxnet=1; - - if (menus[opt_maxnet].value>2) - { - menus[opt_maxnet].value=2; - } - - if (menus[opt_maxnet].max_value>2) - { - menus[opt_maxnet].max_value=2; - } - - if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP)) - Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; - - if (Netgame.PlayTimeAllowed || Netgame.KillGoal) - { - Netgame.PlayTimeAllowed=0; - Netgame.KillGoal=0; - } - - } - else // if !Coop game - { - if (oldmaxnet) - { - oldmaxnet=0; - menus[opt_maxnet].value=6; - menus[opt_maxnet].max_value=6; - } - } - - if ( last_maxnet != menus[opt_maxnet].value ) - { - sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 ); - last_maxnet = menus[opt_maxnet].value; + case EVENT_NEWMENU_CHANGED: + if (((HoardEquipped() && (citem == opt_team_hoard)) || ((citem == opt_team_anarchy) || (citem == opt_capture))) && !menus[opt_closed].value && !menus[opt_refuse].value) + { + menus[opt_refuse].value = 1; + menus[opt_refuse-1].value = 0; + menus[opt_refuse-2].value = 0; + } + + if (menus[opt_coop].value) + { + oldmaxnet=1; + + if (menus[opt_maxnet].value>2) + { + menus[opt_maxnet].value=2; + } + + if (menus[opt_maxnet].max_value>2) + { + menus[opt_maxnet].max_value=2; + } + + if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP)) + Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; + + if (Netgame.PlayTimeAllowed || Netgame.KillGoal) + { + Netgame.PlayTimeAllowed=0; + Netgame.KillGoal=0; + } + + } + else // if !Coop game + { + if (oldmaxnet) + { + oldmaxnet=0; + menus[opt_maxnet].value=6; + menus[opt_maxnet].max_value=6; + } + } + + if (citem == opt_maxnet) + sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 ); + break; + + default: + break; } return 0; @@ -3075,7 +3076,6 @@ int net_ipx_get_game_params() Netgame.difficulty=PlayerCfg.DefaultDifficulty; Netgame.max_numplayers=MaxNumNetPlayers; sprintf( Netgame.game_name, "%s%s", Players[Player_num].callsign, TXT_S_GAME ); - last_cinvul = 0; Netgame.BrightPlayers = Netgame.InvulAppear = 1; Netgame.AllowedItems = 0; Netgame.AllowedItems |= NETFLAG_DOPOWERUP; @@ -3129,7 +3129,6 @@ int net_ipx_get_game_params() sprintf( srmaxnet, "Maximum players: %d", MaxNumNetPlayers); m[opt].type = NM_TYPE_SLIDER; m[opt].value=Netgame.max_numplayers-2; m[opt].text= srmaxnet; m[opt].min_value=0; m[opt].max_value=MaxNumNetPlayers-2; opt++; - last_maxnet=MaxNumNetPlayers-2; opt_moreopts=opt; m[opt].type = NM_TYPE_MENU; m[opt].text = "Advanced Options"; opt++; @@ -3137,7 +3136,7 @@ int net_ipx_get_game_params() Assert(opt <= 20); menu: - i = newmenu_do1( NULL, NULL, opt, m, net_ipx_game_param_poll, NULL, 1 ); + i = newmenu_do1( NULL, NULL, opt, m, net_ipx_game_param_handler, NULL, 1 ); if (i==opt_moreopts) { @@ -5032,7 +5031,7 @@ void net_ipx_set_power (void) } } -int net_ipx_more_options_poll( newmenu *menu, d_event *event, void *userdata ); +int net_ipx_more_options_handler( newmenu *menu, d_event *event, void *userdata ); void net_ipx_more_game_options () { @@ -5089,11 +5088,8 @@ void net_ipx_more_game_options () opt_socket = opt; m[opt].type = NM_TYPE_INPUT; m[opt].text = socket_string; m[opt].text_len=4; opt++; - LastKillGoal=Netgame.KillGoal; - LastPTA=Netgame.PlayTimeAllowed; - menu: - i = newmenu_do1( NULL, "Advanced netgame options", opt, m, net_ipx_more_options_poll, NULL, 0 ); + i = newmenu_do1( NULL, "Advanced netgame options", opt, m, net_ipx_more_options_handler, NULL, 0 ); Netgame.control_invul_time = m[opt_cinvul].value*5*F1_0*60; @@ -5137,49 +5133,47 @@ menu: Netgame.game_flags &= ~NETGAME_FLAG_SHOW_MAP; } -int net_ipx_more_options_poll( newmenu *menu, d_event *event, void *userdata ) +int net_ipx_more_options_handler( newmenu *menu, d_event *event, void *userdata ) { newmenu_item *menus = newmenu_get_items(menu); - - if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED in future - return 0; + int citem = newmenu_get_citem(menu); + + switch (event->type) + { + case EVENT_NEWMENU_CHANGED: + if (citem == opt_cinvul) + sprintf( menus[opt_cinvul].text, "%s: %d %s", TXT_REACTOR_LIFE, menus[opt_cinvul].value*5, TXT_MINUTES_ABBREV ); + else if (citem == opt_playtime) + { + if (Game_mode & GM_MULTI_COOP) + { + nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); + menus[opt_playtime].value=0; + return 0; + } + + Netgame.PlayTimeAllowed=menus[opt_playtime].value; + sprintf( menus[opt_playtime].text, "Max Time: %d %s", Netgame.PlayTimeAllowed*5, TXT_MINUTES_ABBREV ); + } + else if (citem == opt_killgoal) + { + if (Game_mode & GM_MULTI_COOP) + { + nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); + menus[opt_killgoal].value=0; + return 0; + } + + Netgame.KillGoal=menus[opt_killgoal].value; + sprintf( menus[opt_killgoal].text, "Kill Goal: %d kills", Netgame.KillGoal*5); + } + break; + + default: + break; + } userdata = userdata; - - if ( last_cinvul != menus[opt_cinvul].value ) { - sprintf( menus[opt_cinvul].text, "%s: %d %s", TXT_REACTOR_LIFE, menus[opt_cinvul].value*5, TXT_MINUTES_ABBREV ); - last_cinvul = menus[opt_cinvul].value; - } - - if (menus[opt_playtime].value!=LastPTA) - { - if (Game_mode & GM_MULTI_COOP) - { - LastPTA=0; - nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); - menus[opt_playtime].value=0; - return 0; - } - - Netgame.PlayTimeAllowed=menus[opt_playtime].value; - sprintf( menus[opt_playtime].text, "Max Time: %d %s", Netgame.PlayTimeAllowed*5, TXT_MINUTES_ABBREV ); - LastPTA=Netgame.PlayTimeAllowed; - } - - if (menus[opt_killgoal].value!=LastKillGoal) - { - if (Game_mode & GM_MULTI_COOP) - { - nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); - menus[opt_killgoal].value=0; - LastKillGoal=0; - return 0; - } - - Netgame.KillGoal=menus[opt_killgoal].value; - sprintf( menus[opt_killgoal].text, "Kill Goal: %d kills", Netgame.KillGoal*5); - LastKillGoal=Netgame.KillGoal; - } return 0; } diff --git a/main/net_udp.c b/main/net_udp.c index c5955d9e8..d858a1492 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -2543,10 +2543,8 @@ int net_udp_start_poll( newmenu *menu, d_event *event, void *userdata ) return 0; } -static fix LastPTA; -static int LastKillGoal; static int opt_cinvul, opt_team_anarchy, opt_coop, opt_show_on_map, opt_closed,opt_maxnet; -static int last_cinvul=0,last_maxnet,opt_team_hoard; +static int opt_team_hoard; static int opt_refuse,opt_capture; static int opt_setpower,opt_playtime,opt_killgoal,opt_port,opt_marker_view,opt_light; static int opt_difficulty,opt_packets, opt_bright,opt_start_invul, opt_show_names, opt_plp; @@ -2572,7 +2570,7 @@ void net_udp_set_power (void) } } -int net_udp_more_options_poll( newmenu *menu, d_event *event, void *userdata ); +int net_udp_more_options_handler( newmenu *menu, d_event *event, void *userdata ); void net_udp_more_game_options () { @@ -2627,11 +2625,8 @@ void net_udp_more_game_options () opt_plp = opt; m[opt].type = NM_TYPE_CHECK; m[opt].text = "Packet Loss Prevention"; m[opt].value = Netgame.PacketLossPrevention; opt++; - LastKillGoal=Netgame.KillGoal; - LastPTA=Netgame.PlayTimeAllowed; - menu: - i = newmenu_do1( NULL, "Advanced netgame options", opt, m, net_udp_more_options_poll, NULL, 0 ); + i = newmenu_do1( NULL, "Advanced netgame options", opt, m, net_udp_more_options_handler, NULL, 0 ); Netgame.control_invul_time = m[opt_cinvul].value*5*F1_0*60; @@ -2675,106 +2670,107 @@ menu: Netgame.PacketLossPrevention = m[opt_plp].value; } -int net_udp_more_options_poll( newmenu *menu, d_event *event, void *userdata ) +int net_udp_more_options_handler( newmenu *menu, d_event *event, void *userdata ) { newmenu_item *menus = newmenu_get_items(menu); - - if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED when available - return 0; + int citem = newmenu_get_citem(menu); + + switch (event->type) + { + case EVENT_NEWMENU_CHANGED: + if (citem == opt_cinvul) + sprintf( menus[opt_cinvul].text, "%s: %d %s", TXT_REACTOR_LIFE, menus[opt_cinvul].value*5, TXT_MINUTES_ABBREV ); + else if (citem == opt_playtime) + { + if (Game_mode & GM_MULTI_COOP) + { + nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); + menus[opt_playtime].value=0; + return 0; + } + + Netgame.PlayTimeAllowed=menus[opt_playtime].value; + sprintf( menus[opt_playtime].text, "Max Time: %d %s", Netgame.PlayTimeAllowed*5, TXT_MINUTES_ABBREV ); + } + else if (citem == opt_killgoal) + { + if (Game_mode & GM_MULTI_COOP) + { + nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); + menus[opt_killgoal].value=0; + return 0; + } + + Netgame.KillGoal=menus[opt_killgoal].value; + sprintf( menus[opt_killgoal].text, "Kill Goal: %d kills", Netgame.KillGoal*5); + } + break; + + default: + break; + } userdata = userdata; - if ( last_cinvul != menus[opt_cinvul].value ) { - sprintf( menus[opt_cinvul].text, "%s: %d %s", TXT_REACTOR_LIFE, menus[opt_cinvul].value*5, TXT_MINUTES_ABBREV ); - last_cinvul = menus[opt_cinvul].value; - } - - if (menus[opt_playtime].value!=LastPTA) - { - if (Game_mode & GM_MULTI_COOP) - { - LastPTA=0; - nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); - menus[opt_playtime].value=0; - return 0; - } - - Netgame.PlayTimeAllowed=menus[opt_playtime].value; - sprintf( menus[opt_playtime].text, "Max Time: %d %s", Netgame.PlayTimeAllowed*5, TXT_MINUTES_ABBREV ); - LastPTA=Netgame.PlayTimeAllowed; - } - - if (menus[opt_killgoal].value!=LastKillGoal) - { - if (Game_mode & GM_MULTI_COOP) - { - nm_messagebox ("Sorry",1,TXT_OK,"You can't change those for coop!"); - menus[opt_killgoal].value=0; - LastKillGoal=0; - return 0; - } - - Netgame.KillGoal=menus[opt_killgoal].value; - sprintf( menus[opt_killgoal].text, "Kill Goal: %d kills", Netgame.KillGoal*5); - LastKillGoal=Netgame.KillGoal; - } - return 0; } -int net_udp_game_param_poll( newmenu *menu, d_event *event, void *userdata ) +int net_udp_game_param_handler( newmenu *menu, d_event *event, void *userdata ) { newmenu_item *menus = newmenu_get_items(menu); + int citem = newmenu_get_citem(menu); static int oldmaxnet=0; - if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED when available - return 0; - - if (((HoardEquipped() && menus[opt_team_hoard].value) || (menus[opt_team_anarchy].value || menus[opt_capture].value)) && !menus[opt_closed].value && !menus[opt_refuse].value) + switch (event->type) { - menus[opt_refuse].value = 1; - menus[opt_refuse-1].value = 0; - menus[opt_refuse-2].value = 0; - } + case EVENT_NEWMENU_CHANGED: + if (((HoardEquipped() && (citem == opt_team_hoard)) || ((citem == opt_team_anarchy) || (citem == opt_capture))) && !menus[opt_closed].value && !menus[opt_refuse].value) + { + menus[opt_refuse].value = 1; + menus[opt_refuse-1].value = 0; + menus[opt_refuse-2].value = 0; + } + + if (menus[opt_coop].value) + { + oldmaxnet=1; + + if (menus[opt_maxnet].value>2) + { + menus[opt_maxnet].value=2; + } + + if (menus[opt_maxnet].max_value>2) + { + menus[opt_maxnet].max_value=2; + } + + if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP)) + Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; - if (menus[opt_coop].value) - { - oldmaxnet=1; + if (Netgame.PlayTimeAllowed || Netgame.KillGoal) + { + Netgame.PlayTimeAllowed=0; + Netgame.KillGoal=0; + } - if (menus[opt_maxnet].value>2) - { - menus[opt_maxnet].value=2; - } - - if (menus[opt_maxnet].max_value>2) - { - menus[opt_maxnet].max_value=2; - } - - if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP)) - Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP; - - if (Netgame.PlayTimeAllowed || Netgame.KillGoal) - { - Netgame.PlayTimeAllowed=0; - Netgame.KillGoal=0; - } - - } - else // if !Coop game - { - if (oldmaxnet) - { - oldmaxnet=0; - menus[opt_maxnet].value=6; - menus[opt_maxnet].max_value=6; - } - } - - if ( last_maxnet != menus[opt_maxnet].value ) - { - sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 ); - last_maxnet = menus[opt_maxnet].value; + } + else // if !Coop game + { + if (oldmaxnet) + { + oldmaxnet=0; + menus[opt_maxnet].value=6; + menus[opt_maxnet].max_value=6; + } + } + + if (citem == opt_maxnet) + sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 ); + break; + + default: + break; } return 0; @@ -2804,7 +2800,6 @@ int net_udp_get_game_params() snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", GameArg.MplUdpMyPort); else snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT); - last_cinvul = 0; Netgame.BrightPlayers = Netgame.InvulAppear = 1; Netgame.AllowedItems = 0; Netgame.AllowedItems |= NETFLAG_DOPOWERUP; @@ -2859,7 +2854,6 @@ int net_udp_get_game_params() sprintf( srmaxnet, "Maximum players: %d", MaxNumNetPlayers); m[opt].type = NM_TYPE_SLIDER; m[opt].value=Netgame.max_numplayers-2; m[opt].text= srmaxnet; m[opt].min_value=0; m[opt].max_value=MaxNumNetPlayers-2; opt++; - last_maxnet=MaxNumNetPlayers-2; opt_moreopts=opt; m[opt].type = NM_TYPE_MENU; m[opt].text = "Advanced Options"; opt++; @@ -2867,7 +2861,7 @@ int net_udp_get_game_params() Assert(opt <= 20); menu: - i = newmenu_do1( NULL, NULL, opt, m, net_udp_game_param_poll, NULL, 1 ); + i = newmenu_do1( NULL, NULL, opt, m, net_udp_game_param_handler, NULL, 1 ); if (i==opt_moreopts) { diff --git a/main/newmenu.c b/main/newmenu.c index f82ce92ad..594cfcb0c 100644 --- a/main/newmenu.c +++ b/main/newmenu.c @@ -561,9 +561,11 @@ int newmenu_get_citem(newmenu *menu) int newmenu_key_command(window *wind, d_event *event, newmenu *menu) { + newmenu_item *item = &menu->items[menu->citem]; int k = ((d_event_keycommand *)event)->keycode; int old_choice, i; char *Temp,TempVal; + int changed = 0; int rval = 1; switch( k ) @@ -662,16 +664,17 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) break; case KEY_SPACEBAR: if ( menu->citem > -1 ) { - switch( menu->items[menu->citem].type ) { + + switch( item->type ) { case NM_TYPE_MENU: case NM_TYPE_INPUT: case NM_TYPE_INPUT_MENU: break; case NM_TYPE_CHECK: - if ( menu->items[menu->citem].value ) - menu->items[menu->citem].value = 0; + if ( item->value ) + item->value = 0; else - menu->items[menu->citem].value = 1; + item->value = 1; if (menu->is_scroll_box) { if (menu->citem==(menu->max_on_menu+menu->scroll_offset-1) || menu->citem==menu->scroll_offset) @@ -679,14 +682,18 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) menu->last_scroll_check=-1; } } + + changed = 1; break; case NM_TYPE_RADIO: for (i=0; initems; i++ ) { - if ((i!=menu->citem) && (menu->items[i].type==NM_TYPE_RADIO) && (menu->items[i].group==menu->items[menu->citem].group) && (menu->items[i].value) ) { + if ((i!=menu->citem) && (menu->items[i].type==NM_TYPE_RADIO) && (menu->items[i].group==item->group) && (menu->items[i].value) ) { menu->items[i].value = 0; + changed = 1; } } - menu->items[menu->citem].value = 1; + item->value = 1; + changed = 1; break; } } @@ -702,6 +709,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) menu->items[menu->citem-1].text=Temp; menu->items[menu->citem-1].value=TempVal; menu->citem--; + changed = 1; } break; case KEY_SHIFTED+KEY_DOWN: @@ -714,17 +722,18 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) menu->items[menu->citem+1].text=Temp; menu->items[menu->citem+1].value=TempVal; menu->citem++; + changed = 1; } break; case KEY_ENTER: case KEY_PADENTER: - if ( (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==0)) { - menu->items[menu->citem].group = 1; - if ( !strnicmp( menu->items[menu->citem].saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { - menu->items[menu->citem].text[0] = 0; - menu->items[menu->citem].value = -1; + if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==0)) { + item->group = 1; + if ( !strnicmp( item->saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { + item->text[0] = 0; + item->value = -1; } else { - strip_end_whitespace(menu->items[menu->citem].text); + strip_end_whitespace(item->text); } } else { @@ -744,10 +753,10 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) break; case KEY_ESC: - if ( (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==1)) { - menu->items[menu->citem].group=0; - strcpy(menu->items[menu->citem].text, menu->items[menu->citem].saved_text ); - menu->items[menu->citem].value = -1; + if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==1)) { + item->group=0; + strcpy(item->text, item->saved_text ); + item->value = -1; } else { menu->done = 1; menu->citem = -1; @@ -764,7 +773,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) #ifndef NDEBUG case KEY_BACKSP: - if ( (menu->citem>-1) && (menu->items[menu->citem].type!=NM_TYPE_INPUT)&&(menu->items[menu->citem].type!=NM_TYPE_INPUT_MENU)) + if ( (menu->citem>-1) && (item->type!=NM_TYPE_INPUT)&&(item->type!=NM_TYPE_INPUT_MENU)) Int3(); break; #endif @@ -777,21 +786,25 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) if ( menu->citem > -1 ) { int ascii; - if ( ((menu->items[menu->citem].type==NM_TYPE_INPUT)||((menu->items[menu->citem].type==NM_TYPE_INPUT_MENU)&&(menu->items[menu->citem].group==1)) )&& (old_choice==menu->citem) ) { + // Alerting callback of every keypress for NM_TYPE_INPUT. Alternatively, just respond to EVENT_NEWMENU_SELECTED + if ( ((item->type==NM_TYPE_INPUT)||((item->type==NM_TYPE_INPUT_MENU)&&(item->group==1)) )&& (old_choice==menu->citem) ) { if ( k==KEY_LEFT || k==KEY_BACKSP || k==KEY_PAD4 ) { - if (menu->items[menu->citem].value==-1) menu->items[menu->citem].value = strlen(menu->items[menu->citem].text); - if (menu->items[menu->citem].value > 0) - menu->items[menu->citem].value--; - menu->items[menu->citem].text[menu->items[menu->citem].value] = 0; + if (item->value==-1) item->value = strlen(item->text); + if (item->value > 0) + item->value--; + item->text[item->value] = 0; + + if (item->type==NM_TYPE_INPUT) + changed = 1; rval = 1; } else { ascii = key_ascii(); - if ((ascii < 255 ) && (menu->items[menu->citem].value < menu->items[menu->citem].text_len )) + if ((ascii < 255 ) && (item->value < item->text_len )) { int allowed; - if (menu->items[menu->citem].value==-1) { - menu->items[menu->citem].value = 0; + if (item->value==-1) { + item->value = 0; } allowed = char_allowed(ascii); @@ -802,13 +815,16 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) } if (allowed) { - menu->items[menu->citem].text[menu->items[menu->citem].value++] = ascii; - menu->items[menu->citem].text[menu->items[menu->citem].value] = 0; + item->text[item->value++] = ascii; + item->text[item->value] = 0; + + if (item->type==NM_TYPE_INPUT) + changed = 1; } } } } - else if ((menu->items[menu->citem].type!=NM_TYPE_INPUT) && (menu->items[menu->citem].type!=NM_TYPE_INPUT_MENU) ) + else if ((item->type!=NM_TYPE_INPUT) && (item->type!=NM_TYPE_INPUT_MENU) ) { ascii = key_ascii(); if (ascii < 255 ) { @@ -846,7 +862,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) } } - if ( (menu->items[menu->citem].type==NM_TYPE_NUMBER) || (menu->items[menu->citem].type==NM_TYPE_SLIDER)) + if ( (item->type==NM_TYPE_NUMBER) || (item->type==NM_TYPE_SLIDER)) { switch( k ) { case KEY_PAD4: @@ -854,7 +870,8 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) case KEY_MINUS: case KEY_MINUS+KEY_SHIFTED: case KEY_PADMINUS: - menu->items[menu->citem].value -= 1; + item->value -= 1; + changed = 1; rval = 1; break; case KEY_RIGHT: @@ -862,26 +879,38 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu) case KEY_EQUAL: case KEY_EQUAL+KEY_SHIFTED: case KEY_PADPLUS: - menu->items[menu->citem].value++; + item->value++; + changed = 1; rval = 1; break; case KEY_PAGEUP: case KEY_PAD9: case KEY_SPACEBAR: - menu->items[menu->citem].value += 10; + item->value += 10; + changed = 1; rval = 1; break; case KEY_PAGEDOWN: case KEY_BACKSP: case KEY_PAD3: - menu->items[menu->citem].value -= 10; + item->value -= 10; + changed = 1; rval = 1; break; } + + if (item->value < item->min_value) item->value=item->min_value; + if (item->value > item->max_value) item->value=item->max_value; } } + if (changed && menu->subfunction) + { + event->type = EVENT_NEWMENU_CHANGED; + (*menu->subfunction)(menu, event, menu->userdata); + } + return rval; } @@ -892,6 +921,7 @@ int newmenu_idle(window *wind, newmenu *menu) #ifdef NEWMENU_MOUSE int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2; #endif + int changed = 0; d_event event = { EVENT_NEWMENU_SELECTED }; timer_delay2(50); @@ -932,11 +962,13 @@ int newmenu_idle(window *wind, newmenu *menu) if (menu->is_scroll_box) menu->last_scroll_check=-1; + changed = 1; break; case NM_TYPE_RADIO: for (i=0; initems; i++ ) { if ((i!=menu->citem) && (menu->items[i].type==NM_TYPE_RADIO) && (menu->items[i].group==menu->items[menu->citem].group) && (menu->items[i].value) ) { menu->items[i].value = 0; + changed = 1; } } menu->items[menu->citem].value = 1; @@ -1036,8 +1068,10 @@ int newmenu_idle(window *wind, newmenu *menu) x2 = x1 + slider_width + sright_width; if ( (mx > x1) && (mx < (x1 + sleft_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].min_value) ) { menu->items[menu->citem].value = menu->items[menu->citem].min_value; + changed = 1; } else if ( (mx < x2) && (mx > (x2 - sright_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].max_value) ) { menu->items[menu->citem].value = menu->items[menu->citem].max_value; + changed = 1; } else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) { int num_values, value_width, new_value; @@ -1046,6 +1080,7 @@ int newmenu_idle(window *wind, newmenu *menu) new_value = (mx - x1 - sleft_width) / value_width; if ( menu->items[menu->citem].value != new_value ) { menu->items[menu->citem].value = new_value; + changed = 1; } } *p = '\t'; @@ -1112,6 +1147,12 @@ int newmenu_idle(window *wind, newmenu *menu) #endif // NEWMENU_MOUSE + if (changed && menu->subfunction) + { + event.type = EVENT_NEWMENU_CHANGED; + (*menu->subfunction)(menu, &event, menu->userdata); + } + gr_set_current_canvas(save_canvas); return 0; @@ -1292,6 +1333,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item, return -1; memset(menu, 0, sizeof(newmenu)); + menu->citem = citem; menu->scroll_offset = 0; menu->last_scroll_check = -1; menu->all_text = 0; diff --git a/main/newmenu.h b/main/newmenu.h index 0890048fc..7bf3bef00 100644 --- a/main/newmenu.h +++ b/main/newmenu.h @@ -41,6 +41,7 @@ typedef struct listbox listbox; enum newmenu_event { EVENT_NEWMENU_DRAW = EVENT_USER, // draw after the newmenu stuff is drawn (e.g. savegame previews) + EVENT_NEWMENU_CHANGED, // an item had its value/text changed EVENT_NEWMENU_SELECTED // user chose something - pressed enter/clicked on it };