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

This commit is contained in:
kreatordxx 2010-02-01 06:55:38 +00:00
parent 90e4b4ed95
commit 35584d725b
9 changed files with 311 additions and 262 deletions

View file

@ -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

View file

@ -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

View file

@ -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;
};

View file

@ -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: {

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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)
{

View file

@ -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; i<menu->nitems; 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; i<menu->nitems; 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;

View file

@ -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
};