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:
parent
90e4b4ed95
commit
35584d725b
|
@ -1,5 +1,9 @@
|
||||||
D2X-Rebirth Changelog
|
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
|
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
|
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
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
/* Define if you want a network build */
|
/* Define if you want a network build */
|
||||||
# define NETWORK
|
# define NETWORK
|
||||||
# define USE_UDP
|
# define USE_UDP
|
||||||
|
# define USE_IPX
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct timespec'. */
|
/* Define to 1 if the system has the type `struct timespec'. */
|
||||||
#define HAVE_STRUCT_TIMESPEC 1
|
#define HAVE_STRUCT_TIMESPEC 1
|
||||||
|
|
|
@ -337,6 +337,7 @@
|
||||||
67F6FED3066B13B400443922 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F6FED1066B13B400443922 /* SDLMain.m */; };
|
67F6FED3066B13B400443922 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F6FED1066B13B400443922 /* SDLMain.m */; };
|
||||||
67F6FED4066B13B400443922 /* SDLMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 67F6FED0066B13B400443922 /* SDLMain.h */; };
|
67F6FED4066B13B400443922 /* SDLMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 67F6FED0066B13B400443922 /* SDLMain.h */; };
|
||||||
67F6FED5066B13B400443922 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F6FED1066B13B400443922 /* SDLMain.m */; };
|
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 */; };
|
EB28D9A30ECEAF1C00E68E9B /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = EB28D9A20ECEAF1C00E68E9B /* init.c */; };
|
||||||
EB28D9A40ECEAF1C00E68E9B /* 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 */; };
|
EB2EEB5810C50CE2005256F2 /* net_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 17DFA6B510C1A2D100674D11 /* net_udp.c */; };
|
||||||
|
@ -1960,6 +1961,7 @@
|
||||||
17DFA6C510C1A3BC00674D11 /* multibot.c in Sources */,
|
17DFA6C510C1A3BC00674D11 /* multibot.c in Sources */,
|
||||||
17DFA6C610C1A3D400674D11 /* kmatrix.c in Sources */,
|
17DFA6C610C1A3D400674D11 /* kmatrix.c in Sources */,
|
||||||
EB2EEB5810C50CE2005256F2 /* net_udp.c in Sources */,
|
EB2EEB5810C50CE2005256F2 /* net_udp.c in Sources */,
|
||||||
|
EB0E38BC11169B5700791182 /* net_ipx.c in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -813,6 +813,7 @@ int kconfig_idle(window *wind, d_event *event, kc_menu *menu)
|
||||||
case -2:
|
case -2:
|
||||||
case KEY_ESC:
|
case KEY_ESC:
|
||||||
window_close(wind);
|
window_close(wind);
|
||||||
|
return 1;
|
||||||
break;
|
break;
|
||||||
#ifdef TABLE_CREATION
|
#ifdef TABLE_CREATION
|
||||||
case KEY_F12: {
|
case KEY_F12: {
|
||||||
|
|
80
main/menu.c
80
main/menu.c
|
@ -719,7 +719,7 @@ int options_menuset(newmenu *menu, d_event *event, void *userdata)
|
||||||
{
|
{
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case EVENT_IDLE: // FIXME: Should become EVENT_ITEM_CHANGED later
|
case EVENT_NEWMENU_CHANGED:
|
||||||
if ( newmenu_get_citem(menu)==4)
|
if ( newmenu_get_citem(menu)==4)
|
||||||
{
|
{
|
||||||
gr_palette_set_gamma(newmenu_get_items(menu)[4].value);
|
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 input_menuset(newmenu *menu, d_event *event, void *userdata)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int oc_type = PlayerCfg.ControlType;
|
|
||||||
newmenu_item *items = newmenu_get_items(menu);
|
newmenu_item *items = newmenu_get_items(menu);
|
||||||
int citem = newmenu_get_citem(menu);
|
int citem = newmenu_get_citem(menu);
|
||||||
|
|
||||||
|
@ -860,23 +859,26 @@ int input_menuset(newmenu *menu, d_event *event, void *userdata)
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case EVENT_IDLE: // FIXME: Should become EVENT_ITEM_CHANGED later
|
case EVENT_NEWMENU_CHANGED:
|
||||||
for (i=0; i<4; i++ )
|
switch (citem)
|
||||||
if (items[i].value) PlayerCfg.ControlType = i;
|
{
|
||||||
|
case 0:
|
||||||
if (PlayerCfg.ControlType == 2) PlayerCfg.ControlType = CONTROL_MOUSE;
|
case 1:
|
||||||
if (PlayerCfg.ControlType == 3) PlayerCfg.ControlType = CONTROL_JOYMOUSE;
|
case 2:
|
||||||
|
case 3:
|
||||||
if (oc_type != PlayerCfg.ControlType) {
|
PlayerCfg.ControlType = citem;
|
||||||
kc_set_controls();
|
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;
|
break;
|
||||||
|
|
||||||
case EVENT_NEWMENU_SELECTED:
|
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);
|
newmenu_item *items = newmenu_get_items(menu);
|
||||||
|
|
||||||
if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED later
|
switch (event->type)
|
||||||
return 0;
|
{
|
||||||
|
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;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
190
main/net_ipx.c
190
main/net_ipx.c
|
@ -2987,67 +2987,68 @@ int net_ipx_start_poll( newmenu *menu, d_event *event, void *userdata )
|
||||||
return 1;
|
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 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_refuse,opt_capture;
|
||||||
static int opt_setpower,opt_playtime,opt_killgoal,opt_marker_view,opt_light;
|
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;
|
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);
|
newmenu_item *menus = newmenu_get_items(menu);
|
||||||
|
int citem = newmenu_get_citem(menu);
|
||||||
static int oldmaxnet=0;
|
static int oldmaxnet=0;
|
||||||
|
|
||||||
if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED in future
|
switch (event->type)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
menus[opt_refuse].value = 1;
|
case EVENT_NEWMENU_CHANGED:
|
||||||
menus[opt_refuse-1].value = 0;
|
if (((HoardEquipped() && (citem == opt_team_hoard)) || ((citem == opt_team_anarchy) || (citem == opt_capture))) && !menus[opt_closed].value && !menus[opt_refuse].value)
|
||||||
menus[opt_refuse-2].value = 0;
|
{
|
||||||
}
|
menus[opt_refuse].value = 1;
|
||||||
|
menus[opt_refuse-1].value = 0;
|
||||||
if (menus[opt_coop].value)
|
menus[opt_refuse-2].value = 0;
|
||||||
{
|
}
|
||||||
oldmaxnet=1;
|
|
||||||
|
if (menus[opt_coop].value)
|
||||||
if (menus[opt_maxnet].value>2)
|
{
|
||||||
{
|
oldmaxnet=1;
|
||||||
menus[opt_maxnet].value=2;
|
|
||||||
}
|
if (menus[opt_maxnet].value>2)
|
||||||
|
{
|
||||||
if (menus[opt_maxnet].max_value>2)
|
menus[opt_maxnet].value=2;
|
||||||
{
|
}
|
||||||
menus[opt_maxnet].max_value=2;
|
|
||||||
}
|
if (menus[opt_maxnet].max_value>2)
|
||||||
|
{
|
||||||
if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP))
|
menus[opt_maxnet].max_value=2;
|
||||||
Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP;
|
}
|
||||||
|
|
||||||
if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
|
if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP))
|
||||||
{
|
Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP;
|
||||||
Netgame.PlayTimeAllowed=0;
|
|
||||||
Netgame.KillGoal=0;
|
if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
|
||||||
}
|
{
|
||||||
|
Netgame.PlayTimeAllowed=0;
|
||||||
}
|
Netgame.KillGoal=0;
|
||||||
else // if !Coop game
|
}
|
||||||
{
|
|
||||||
if (oldmaxnet)
|
}
|
||||||
{
|
else // if !Coop game
|
||||||
oldmaxnet=0;
|
{
|
||||||
menus[opt_maxnet].value=6;
|
if (oldmaxnet)
|
||||||
menus[opt_maxnet].max_value=6;
|
{
|
||||||
}
|
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;
|
if (citem == opt_maxnet)
|
||||||
|
sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3075,7 +3076,6 @@ int net_ipx_get_game_params()
|
||||||
Netgame.difficulty=PlayerCfg.DefaultDifficulty;
|
Netgame.difficulty=PlayerCfg.DefaultDifficulty;
|
||||||
Netgame.max_numplayers=MaxNumNetPlayers;
|
Netgame.max_numplayers=MaxNumNetPlayers;
|
||||||
sprintf( Netgame.game_name, "%s%s", Players[Player_num].callsign, TXT_S_GAME );
|
sprintf( Netgame.game_name, "%s%s", Players[Player_num].callsign, TXT_S_GAME );
|
||||||
last_cinvul = 0;
|
|
||||||
Netgame.BrightPlayers = Netgame.InvulAppear = 1;
|
Netgame.BrightPlayers = Netgame.InvulAppear = 1;
|
||||||
Netgame.AllowedItems = 0;
|
Netgame.AllowedItems = 0;
|
||||||
Netgame.AllowedItems |= NETFLAG_DOPOWERUP;
|
Netgame.AllowedItems |= NETFLAG_DOPOWERUP;
|
||||||
|
@ -3129,7 +3129,6 @@ int net_ipx_get_game_params()
|
||||||
sprintf( srmaxnet, "Maximum players: %d", MaxNumNetPlayers);
|
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].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++;
|
m[opt].max_value=MaxNumNetPlayers-2; opt++;
|
||||||
last_maxnet=MaxNumNetPlayers-2;
|
|
||||||
|
|
||||||
opt_moreopts=opt;
|
opt_moreopts=opt;
|
||||||
m[opt].type = NM_TYPE_MENU; m[opt].text = "Advanced Options"; 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);
|
Assert(opt <= 20);
|
||||||
|
|
||||||
menu:
|
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)
|
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 ()
|
void net_ipx_more_game_options ()
|
||||||
{
|
{
|
||||||
|
@ -5089,11 +5088,8 @@ void net_ipx_more_game_options ()
|
||||||
opt_socket = opt;
|
opt_socket = opt;
|
||||||
m[opt].type = NM_TYPE_INPUT; m[opt].text = socket_string; m[opt].text_len=4; 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:
|
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;
|
Netgame.control_invul_time = m[opt_cinvul].value*5*F1_0*60;
|
||||||
|
|
||||||
|
@ -5137,49 +5133,47 @@ menu:
|
||||||
Netgame.game_flags &= ~NETGAME_FLAG_SHOW_MAP;
|
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);
|
newmenu_item *menus = newmenu_get_items(menu);
|
||||||
|
int citem = newmenu_get_citem(menu);
|
||||||
if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED in future
|
|
||||||
return 0;
|
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;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
186
main/net_udp.c
186
main/net_udp.c
|
@ -2543,10 +2543,8 @@ int net_udp_start_poll( newmenu *menu, d_event *event, void *userdata )
|
||||||
return 0;
|
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 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_refuse,opt_capture;
|
||||||
static int opt_setpower,opt_playtime,opt_killgoal,opt_port,opt_marker_view,opt_light;
|
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;
|
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 ()
|
void net_udp_more_game_options ()
|
||||||
{
|
{
|
||||||
|
@ -2627,11 +2625,8 @@ void net_udp_more_game_options ()
|
||||||
opt_plp = opt;
|
opt_plp = opt;
|
||||||
m[opt].type = NM_TYPE_CHECK; m[opt].text = "Packet Loss Prevention"; m[opt].value = Netgame.PacketLossPrevention; 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:
|
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;
|
Netgame.control_invul_time = m[opt_cinvul].value*5*F1_0*60;
|
||||||
|
|
||||||
|
@ -2675,106 +2670,107 @@ menu:
|
||||||
Netgame.PacketLossPrevention = m[opt_plp].value;
|
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);
|
newmenu_item *menus = newmenu_get_items(menu);
|
||||||
|
int citem = newmenu_get_citem(menu);
|
||||||
if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED when available
|
|
||||||
return 0;
|
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;
|
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;
|
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);
|
newmenu_item *menus = newmenu_get_items(menu);
|
||||||
|
int citem = newmenu_get_citem(menu);
|
||||||
static int oldmaxnet=0;
|
static int oldmaxnet=0;
|
||||||
|
|
||||||
if (event->type != EVENT_IDLE) // FIXME: Should become EVENT_ITEM_CHANGED when available
|
switch (event->type)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
menus[opt_refuse].value = 1;
|
case EVENT_NEWMENU_CHANGED:
|
||||||
menus[opt_refuse-1].value = 0;
|
if (((HoardEquipped() && (citem == opt_team_hoard)) || ((citem == opt_team_anarchy) || (citem == opt_capture))) && !menus[opt_closed].value && !menus[opt_refuse].value)
|
||||||
menus[opt_refuse-2].value = 0;
|
{
|
||||||
}
|
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)
|
if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
|
||||||
{
|
{
|
||||||
oldmaxnet=1;
|
Netgame.PlayTimeAllowed=0;
|
||||||
|
Netgame.KillGoal=0;
|
||||||
|
}
|
||||||
|
|
||||||
if (menus[opt_maxnet].value>2)
|
}
|
||||||
{
|
else // if !Coop game
|
||||||
menus[opt_maxnet].value=2;
|
{
|
||||||
}
|
if (oldmaxnet)
|
||||||
|
{
|
||||||
if (menus[opt_maxnet].max_value>2)
|
oldmaxnet=0;
|
||||||
{
|
menus[opt_maxnet].value=6;
|
||||||
menus[opt_maxnet].max_value=2;
|
menus[opt_maxnet].max_value=6;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!(Netgame.game_flags & NETGAME_FLAG_SHOW_MAP))
|
|
||||||
Netgame.game_flags |= NETGAME_FLAG_SHOW_MAP;
|
if (citem == opt_maxnet)
|
||||||
|
sprintf( menus[opt_maxnet].text, "Maximum players: %d", menus[opt_maxnet].value+2 );
|
||||||
if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
|
break;
|
||||||
{
|
|
||||||
Netgame.PlayTimeAllowed=0;
|
default:
|
||||||
Netgame.KillGoal=0;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2804,7 +2800,6 @@ int net_udp_get_game_params()
|
||||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", GameArg.MplUdpMyPort);
|
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", GameArg.MplUdpMyPort);
|
||||||
else
|
else
|
||||||
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT);
|
snprintf (UDP_MyPort, sizeof(UDP_MyPort), "%d", UDP_PORT_DEFAULT);
|
||||||
last_cinvul = 0;
|
|
||||||
Netgame.BrightPlayers = Netgame.InvulAppear = 1;
|
Netgame.BrightPlayers = Netgame.InvulAppear = 1;
|
||||||
Netgame.AllowedItems = 0;
|
Netgame.AllowedItems = 0;
|
||||||
Netgame.AllowedItems |= NETFLAG_DOPOWERUP;
|
Netgame.AllowedItems |= NETFLAG_DOPOWERUP;
|
||||||
|
@ -2859,7 +2854,6 @@ int net_udp_get_game_params()
|
||||||
sprintf( srmaxnet, "Maximum players: %d", MaxNumNetPlayers);
|
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].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++;
|
m[opt].max_value=MaxNumNetPlayers-2; opt++;
|
||||||
last_maxnet=MaxNumNetPlayers-2;
|
|
||||||
|
|
||||||
opt_moreopts=opt;
|
opt_moreopts=opt;
|
||||||
m[opt].type = NM_TYPE_MENU; m[opt].text = "Advanced Options"; 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);
|
Assert(opt <= 20);
|
||||||
|
|
||||||
menu:
|
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)
|
if (i==opt_moreopts)
|
||||||
{
|
{
|
||||||
|
|
108
main/newmenu.c
108
main/newmenu.c
|
@ -561,9 +561,11 @@ int newmenu_get_citem(newmenu *menu)
|
||||||
|
|
||||||
int newmenu_key_command(window *wind, d_event *event, 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 k = ((d_event_keycommand *)event)->keycode;
|
||||||
int old_choice, i;
|
int old_choice, i;
|
||||||
char *Temp,TempVal;
|
char *Temp,TempVal;
|
||||||
|
int changed = 0;
|
||||||
int rval = 1;
|
int rval = 1;
|
||||||
|
|
||||||
switch( k )
|
switch( k )
|
||||||
|
@ -662,16 +664,17 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
break;
|
break;
|
||||||
case KEY_SPACEBAR:
|
case KEY_SPACEBAR:
|
||||||
if ( menu->citem > -1 ) {
|
if ( menu->citem > -1 ) {
|
||||||
switch( menu->items[menu->citem].type ) {
|
|
||||||
|
switch( item->type ) {
|
||||||
case NM_TYPE_MENU:
|
case NM_TYPE_MENU:
|
||||||
case NM_TYPE_INPUT:
|
case NM_TYPE_INPUT:
|
||||||
case NM_TYPE_INPUT_MENU:
|
case NM_TYPE_INPUT_MENU:
|
||||||
break;
|
break;
|
||||||
case NM_TYPE_CHECK:
|
case NM_TYPE_CHECK:
|
||||||
if ( menu->items[menu->citem].value )
|
if ( item->value )
|
||||||
menu->items[menu->citem].value = 0;
|
item->value = 0;
|
||||||
else
|
else
|
||||||
menu->items[menu->citem].value = 1;
|
item->value = 1;
|
||||||
if (menu->is_scroll_box)
|
if (menu->is_scroll_box)
|
||||||
{
|
{
|
||||||
if (menu->citem==(menu->max_on_menu+menu->scroll_offset-1) || menu->citem==menu->scroll_offset)
|
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;
|
menu->last_scroll_check=-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
changed = 1;
|
||||||
break;
|
break;
|
||||||
case NM_TYPE_RADIO:
|
case NM_TYPE_RADIO:
|
||||||
for (i=0; i<menu->nitems; i++ ) {
|
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;
|
menu->items[i].value = 0;
|
||||||
|
changed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
menu->items[menu->citem].value = 1;
|
item->value = 1;
|
||||||
|
changed = 1;
|
||||||
break;
|
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].text=Temp;
|
||||||
menu->items[menu->citem-1].value=TempVal;
|
menu->items[menu->citem-1].value=TempVal;
|
||||||
menu->citem--;
|
menu->citem--;
|
||||||
|
changed = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_SHIFTED+KEY_DOWN:
|
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].text=Temp;
|
||||||
menu->items[menu->citem+1].value=TempVal;
|
menu->items[menu->citem+1].value=TempVal;
|
||||||
menu->citem++;
|
menu->citem++;
|
||||||
|
changed = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KEY_ENTER:
|
case KEY_ENTER:
|
||||||
case KEY_PADENTER:
|
case KEY_PADENTER:
|
||||||
if ( (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==0)) {
|
if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==0)) {
|
||||||
menu->items[menu->citem].group = 1;
|
item->group = 1;
|
||||||
if ( !strnicmp( menu->items[menu->citem].saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) {
|
if ( !strnicmp( item->saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) {
|
||||||
menu->items[menu->citem].text[0] = 0;
|
item->text[0] = 0;
|
||||||
menu->items[menu->citem].value = -1;
|
item->value = -1;
|
||||||
} else {
|
} else {
|
||||||
strip_end_whitespace(menu->items[menu->citem].text);
|
strip_end_whitespace(item->text);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
@ -744,10 +753,10 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_ESC:
|
case KEY_ESC:
|
||||||
if ( (menu->citem>-1) && (menu->items[menu->citem].type==NM_TYPE_INPUT_MENU) && (menu->items[menu->citem].group==1)) {
|
if ( (menu->citem>-1) && (item->type==NM_TYPE_INPUT_MENU) && (item->group==1)) {
|
||||||
menu->items[menu->citem].group=0;
|
item->group=0;
|
||||||
strcpy(menu->items[menu->citem].text, menu->items[menu->citem].saved_text );
|
strcpy(item->text, item->saved_text );
|
||||||
menu->items[menu->citem].value = -1;
|
item->value = -1;
|
||||||
} else {
|
} else {
|
||||||
menu->done = 1;
|
menu->done = 1;
|
||||||
menu->citem = -1;
|
menu->citem = -1;
|
||||||
|
@ -764,7 +773,7 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
case KEY_BACKSP:
|
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();
|
Int3();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -777,21 +786,25 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
if ( menu->citem > -1 ) {
|
if ( menu->citem > -1 ) {
|
||||||
int ascii;
|
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 ( 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 (item->value==-1) item->value = strlen(item->text);
|
||||||
if (menu->items[menu->citem].value > 0)
|
if (item->value > 0)
|
||||||
menu->items[menu->citem].value--;
|
item->value--;
|
||||||
menu->items[menu->citem].text[menu->items[menu->citem].value] = 0;
|
item->text[item->value] = 0;
|
||||||
|
|
||||||
|
if (item->type==NM_TYPE_INPUT)
|
||||||
|
changed = 1;
|
||||||
rval = 1;
|
rval = 1;
|
||||||
} else {
|
} else {
|
||||||
ascii = key_ascii();
|
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;
|
int allowed;
|
||||||
|
|
||||||
if (menu->items[menu->citem].value==-1) {
|
if (item->value==-1) {
|
||||||
menu->items[menu->citem].value = 0;
|
item->value = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
allowed = char_allowed(ascii);
|
allowed = char_allowed(ascii);
|
||||||
|
@ -802,13 +815,16 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allowed) {
|
if (allowed) {
|
||||||
menu->items[menu->citem].text[menu->items[menu->citem].value++] = ascii;
|
item->text[item->value++] = ascii;
|
||||||
menu->items[menu->citem].text[menu->items[menu->citem].value] = 0;
|
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();
|
ascii = key_ascii();
|
||||||
if (ascii < 255 ) {
|
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 ) {
|
switch( k ) {
|
||||||
case KEY_PAD4:
|
case KEY_PAD4:
|
||||||
|
@ -854,7 +870,8 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
case KEY_MINUS:
|
case KEY_MINUS:
|
||||||
case KEY_MINUS+KEY_SHIFTED:
|
case KEY_MINUS+KEY_SHIFTED:
|
||||||
case KEY_PADMINUS:
|
case KEY_PADMINUS:
|
||||||
menu->items[menu->citem].value -= 1;
|
item->value -= 1;
|
||||||
|
changed = 1;
|
||||||
rval = 1;
|
rval = 1;
|
||||||
break;
|
break;
|
||||||
case KEY_RIGHT:
|
case KEY_RIGHT:
|
||||||
|
@ -862,26 +879,38 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
|
||||||
case KEY_EQUAL:
|
case KEY_EQUAL:
|
||||||
case KEY_EQUAL+KEY_SHIFTED:
|
case KEY_EQUAL+KEY_SHIFTED:
|
||||||
case KEY_PADPLUS:
|
case KEY_PADPLUS:
|
||||||
menu->items[menu->citem].value++;
|
item->value++;
|
||||||
|
changed = 1;
|
||||||
rval = 1;
|
rval = 1;
|
||||||
break;
|
break;
|
||||||
case KEY_PAGEUP:
|
case KEY_PAGEUP:
|
||||||
case KEY_PAD9:
|
case KEY_PAD9:
|
||||||
case KEY_SPACEBAR:
|
case KEY_SPACEBAR:
|
||||||
menu->items[menu->citem].value += 10;
|
item->value += 10;
|
||||||
|
changed = 1;
|
||||||
rval = 1;
|
rval = 1;
|
||||||
break;
|
break;
|
||||||
case KEY_PAGEDOWN:
|
case KEY_PAGEDOWN:
|
||||||
case KEY_BACKSP:
|
case KEY_BACKSP:
|
||||||
case KEY_PAD3:
|
case KEY_PAD3:
|
||||||
menu->items[menu->citem].value -= 10;
|
item->value -= 10;
|
||||||
|
changed = 1;
|
||||||
rval = 1;
|
rval = 1;
|
||||||
break;
|
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;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -892,6 +921,7 @@ int newmenu_idle(window *wind, newmenu *menu)
|
||||||
#ifdef NEWMENU_MOUSE
|
#ifdef NEWMENU_MOUSE
|
||||||
int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2;
|
int mx=0, my=0, mz=0, x1 = 0, x2, y1, y2;
|
||||||
#endif
|
#endif
|
||||||
|
int changed = 0;
|
||||||
d_event event = { EVENT_NEWMENU_SELECTED };
|
d_event event = { EVENT_NEWMENU_SELECTED };
|
||||||
|
|
||||||
timer_delay2(50);
|
timer_delay2(50);
|
||||||
|
@ -932,11 +962,13 @@ int newmenu_idle(window *wind, newmenu *menu)
|
||||||
|
|
||||||
if (menu->is_scroll_box)
|
if (menu->is_scroll_box)
|
||||||
menu->last_scroll_check=-1;
|
menu->last_scroll_check=-1;
|
||||||
|
changed = 1;
|
||||||
break;
|
break;
|
||||||
case NM_TYPE_RADIO:
|
case NM_TYPE_RADIO:
|
||||||
for (i=0; i<menu->nitems; i++ ) {
|
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==menu->items[menu->citem].group) && (menu->items[i].value) ) {
|
||||||
menu->items[i].value = 0;
|
menu->items[i].value = 0;
|
||||||
|
changed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
menu->items[menu->citem].value = 1;
|
menu->items[menu->citem].value = 1;
|
||||||
|
@ -1036,8 +1068,10 @@ int newmenu_idle(window *wind, newmenu *menu)
|
||||||
x2 = x1 + slider_width + sright_width;
|
x2 = x1 + slider_width + sright_width;
|
||||||
if ( (mx > x1) && (mx < (x1 + sleft_width)) && (menu->items[menu->citem].value != menu->items[menu->citem].min_value) ) {
|
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;
|
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) ) {
|
} 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;
|
menu->items[menu->citem].value = menu->items[menu->citem].max_value;
|
||||||
|
changed = 1;
|
||||||
} else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) {
|
} else if ( (mx > (x1 + sleft_width)) && (mx < (x2 - sright_width)) ) {
|
||||||
int num_values, value_width, new_value;
|
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;
|
new_value = (mx - x1 - sleft_width) / value_width;
|
||||||
if ( menu->items[menu->citem].value != new_value ) {
|
if ( menu->items[menu->citem].value != new_value ) {
|
||||||
menu->items[menu->citem].value = new_value;
|
menu->items[menu->citem].value = new_value;
|
||||||
|
changed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*p = '\t';
|
*p = '\t';
|
||||||
|
@ -1112,6 +1147,12 @@ int newmenu_idle(window *wind, newmenu *menu)
|
||||||
|
|
||||||
#endif // NEWMENU_MOUSE
|
#endif // NEWMENU_MOUSE
|
||||||
|
|
||||||
|
if (changed && menu->subfunction)
|
||||||
|
{
|
||||||
|
event.type = EVENT_NEWMENU_CHANGED;
|
||||||
|
(*menu->subfunction)(menu, &event, menu->userdata);
|
||||||
|
}
|
||||||
|
|
||||||
gr_set_current_canvas(save_canvas);
|
gr_set_current_canvas(save_canvas);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1292,6 +1333,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item,
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memset(menu, 0, sizeof(newmenu));
|
memset(menu, 0, sizeof(newmenu));
|
||||||
|
menu->citem = citem;
|
||||||
menu->scroll_offset = 0;
|
menu->scroll_offset = 0;
|
||||||
menu->last_scroll_check = -1;
|
menu->last_scroll_check = -1;
|
||||||
menu->all_text = 0;
|
menu->all_text = 0;
|
||||||
|
|
|
@ -41,6 +41,7 @@ typedef struct listbox listbox;
|
||||||
enum newmenu_event
|
enum newmenu_event
|
||||||
{
|
{
|
||||||
EVENT_NEWMENU_DRAW = EVENT_USER, // draw after the newmenu stuff is drawn (e.g. savegame previews)
|
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
|
EVENT_NEWMENU_SELECTED // user chose something - pressed enter/clicked on it
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue