Make more_game_options_menu inherit from newmenu

This commit is contained in:
Kp 2020-12-27 22:03:09 +00:00
parent 9be9f7ae64
commit 17b3812ee3

View file

@ -3524,6 +3524,8 @@ static void net_udp_set_power (void)
class more_game_options_menu_items class more_game_options_menu_items
{ {
protected:
const unsigned game_is_cooperative;
char packstring[sizeof("99")]; char packstring[sizeof("99")];
std::array<char, sizeof("65535")> portstring; std::array<char, sizeof("65535")> portstring;
char srinvul[sizeof("Reactor life: 50 min")]; char srinvul[sizeof("Reactor life: 50 min")];
@ -3624,7 +3626,8 @@ public:
{ {
DXX_UDP_MENU_OPTIONS(ENUM) DXX_UDP_MENU_OPTIONS(ENUM)
}; };
more_game_options_menu_items() more_game_options_menu_items(const unsigned game_is_cooperative) :
game_is_cooperative(game_is_cooperative)
{ {
const auto difficulty = Netgame.difficulty; const auto difficulty = Netgame.difficulty;
update_difficulty_string(difficulty); update_difficulty_string(difficulty);
@ -3699,9 +3702,21 @@ public:
convert_text_portstring(portstring, UDP_MyPort, false, false); convert_text_portstring(portstring, UDP_MyPort, false, false);
parse_human_readable_time(Netgame.MPGameplayOptions.AutosaveInterval, AutosaveInterval); parse_human_readable_time(Netgame.MPGameplayOptions.AutosaveInterval, AutosaveInterval);
} }
static void net_udp_more_game_options();
}; };
struct more_game_options_menu : more_game_options_menu_items, newmenu
{
more_game_options_menu(unsigned game_is_cooperative, grs_canvas &);
static void net_udp_more_game_options(unsigned game_is_cooperative);
virtual int subfunction_handler(const d_event &event) override;
};
more_game_options_menu::more_game_options_menu(const unsigned game_is_cooperative, grs_canvas &canvas) :
more_game_options_menu_items(game_is_cooperative),
newmenu(menu_title{nullptr}, menu_subtitle{"Advanced netgame options"}, menu_filename{nullptr}, tiny_mode_flag::normal, tab_processing_flag::ignore, adjusted_citem::create(m, 0), canvas)
{
}
class grant_powerup_menu_items class grant_powerup_menu_items
{ {
public: public:
@ -3747,8 +3762,6 @@ int grant_powerup_menu::subfunction_handler(const d_event &event)
return 0; return 0;
} }
}
static void net_udp_set_grant_power() static void net_udp_set_grant_power()
{ {
const auto SpawnGrantedItems = Netgame.SpawnGrantedItems; const auto SpawnGrantedItems = Netgame.SpawnGrantedItems;
@ -3756,42 +3769,30 @@ static void net_udp_set_grant_power()
(void)menu; (void)menu;
} }
void more_game_options_menu_items::net_udp_more_game_options() void more_game_options_menu::net_udp_more_game_options(const unsigned game_is_cooperative)
{ {
more_game_options_menu_items menu; auto menu = window_create<more_game_options_menu>(game_is_cooperative, grd_curscreen->sc_canvas);
newmenu_do2(menu_title{nullptr}, menu_subtitle{"Advanced netgame options"}, menu.get_menu_items(), handler, &menu); (void)menu;
menu.read();
if (Netgame.PacketsPerSec>MAX_PPS)
{
Netgame.PacketsPerSec=MAX_PPS;
nm_messagebox(menu_title{TXT_ERROR}, 1, TXT_OK, "Packet value out of range\nSetting value to %i",MAX_PPS);
}
else if (Netgame.PacketsPerSec < MIN_PPS)
{
Netgame.PacketsPerSec=MIN_PPS;
nm_messagebox(menu_title{TXT_ERROR}, 1, TXT_OK, "Packet value out of range\nSetting value to %i", MIN_PPS);
}
GameUniqueState.Difficulty_level = Netgame.difficulty;
} }
int more_game_options_menu_items::handler(newmenu *, const d_event &event, more_game_options_menu_items *items) int more_game_options_menu::subfunction_handler(const d_event &event)
{ {
switch (event.type) switch (event.type)
{ {
case EVENT_NEWMENU_CHANGED: case EVENT_NEWMENU_CHANGED:
{ {
auto &citem = static_cast<const d_change_event &>(event).citem; auto &citem = static_cast<const d_change_event &>(event).citem;
auto &menus = items->get_menu_items(); auto &menus = m;
if (citem == opt_difficulty) if (citem == opt_difficulty)
{ {
Netgame.difficulty = cast_clamp_difficulty(menus[opt_difficulty].value); Netgame.difficulty = cast_clamp_difficulty(menus[opt_difficulty].value);
items->update_difficulty_string(Netgame.difficulty); update_difficulty_string(Netgame.difficulty);
} }
else if (citem == opt_cinvul) else if (citem == opt_cinvul)
items->update_reactor_life_string(menus[opt_cinvul].value * (reactor_invul_time_scale / reactor_invul_time_mini_scale)); update_reactor_life_string(menus[opt_cinvul].value * (reactor_invul_time_scale / reactor_invul_time_mini_scale));
else if (citem == opt_playtime) else if (citem == opt_playtime)
{ {
if (Game_mode & GM_MULTI_COOP) if (game_is_cooperative)
{ {
nm_messagebox_str(menu_title{TXT_SORRY}, nm_messagebox_tie(TXT_OK), menu_subtitle{"You can't change those for coop!"}); nm_messagebox_str(menu_title{TXT_SORRY}, nm_messagebox_tie(TXT_OK), menu_subtitle{"You can't change those for coop!"});
menus[opt_playtime].value=0; menus[opt_playtime].value=0;
@ -3799,11 +3800,11 @@ int more_game_options_menu_items::handler(newmenu *, const d_event &event, more_
} }
Netgame.PlayTimeAllowed = std::chrono::duration<int, netgame_info::play_time_allowed_abi_ratio>(menus[opt_playtime].value); Netgame.PlayTimeAllowed = std::chrono::duration<int, netgame_info::play_time_allowed_abi_ratio>(menus[opt_playtime].value);
items->update_max_play_time_string(); update_max_play_time_string();
} }
else if (citem == opt_killgoal) else if (citem == opt_killgoal)
{ {
if (Game_mode & GM_MULTI_COOP) if (game_is_cooperative)
{ {
nm_messagebox_str(menu_title{TXT_SORRY}, nm_messagebox_tie(TXT_OK), menu_subtitle{"You can't change those for coop!"}); nm_messagebox_str(menu_title{TXT_SORRY}, nm_messagebox_tie(TXT_OK), menu_subtitle{"You can't change those for coop!"});
menus[opt_killgoal].value=0; menus[opt_killgoal].value=0;
@ -3811,34 +3812,34 @@ int more_game_options_menu_items::handler(newmenu *, const d_event &event, more_
} }
Netgame.KillGoal=menus[opt_killgoal].value; Netgame.KillGoal=menus[opt_killgoal].value;
items->update_kill_goal_string(); update_kill_goal_string();
} }
else if(citem == opt_extra_primary) else if(citem == opt_extra_primary)
{ {
auto primary = menus[opt_extra_primary].value; auto primary = menus[opt_extra_primary].value;
items->update_extra_primary_string(primary); update_extra_primary_string(primary);
} }
else if(citem == opt_extra_secondary) else if(citem == opt_extra_secondary)
{ {
auto secondary = menus[opt_extra_secondary].value; auto secondary = menus[opt_extra_secondary].value;
items->update_extra_secondary_string(secondary); update_extra_secondary_string(secondary);
} }
#if defined(DXX_BUILD_DESCENT_II) #if defined(DXX_BUILD_DESCENT_II)
else if(citem == opt_extra_accessory) else if(citem == opt_extra_accessory)
{ {
auto accessory = menus[opt_extra_accessory].value; auto accessory = menus[opt_extra_accessory].value;
items->update_extra_accessory_string(accessory); update_extra_accessory_string(accessory);
} }
#endif #endif
else if (citem == opt_start_invul) else if (citem == opt_start_invul)
{ {
Netgame.InvulAppear = menus[opt_start_invul].value; Netgame.InvulAppear = menus[opt_start_invul].value;
items->update_spawn_invuln_string(); update_spawn_invuln_string();
} }
else if (citem == opt_secluded_spawns) else if (citem == opt_secluded_spawns)
{ {
Netgame.SecludedSpawns = menus[opt_secluded_spawns].value; Netgame.SecludedSpawns = menus[opt_secluded_spawns].value;
items->update_secluded_spawn_string(); update_secluded_spawn_string();
} }
break; break;
} }
@ -3853,14 +3854,26 @@ int more_game_options_menu_items::handler(newmenu *, const d_event &event, more_
break; break;
return 1; return 1;
} }
case EVENT_WINDOW_CLOSE:
read();
if (Netgame.PacketsPerSec > MAX_PPS)
{
Netgame.PacketsPerSec = MAX_PPS;
nm_messagebox(menu_title{TXT_ERROR}, 1, TXT_OK, "Packet value out of range\nSetting value to %i", MAX_PPS);
}
else if (Netgame.PacketsPerSec < MIN_PPS)
{
Netgame.PacketsPerSec = MIN_PPS;
nm_messagebox(menu_title{TXT_ERROR}, 1, TXT_OK, "Packet value out of range\nSetting value to %i", MIN_PPS);
}
GameUniqueState.Difficulty_level = Netgame.difficulty;
break;
default: default:
break; break;
} }
return 0; return 0;
} }
namespace {
struct param_opt struct param_opt
{ {
enum { enum {
@ -3993,10 +4006,7 @@ static int net_udp_game_param_handler( newmenu *menu,const d_event &event, param
if (citem==opt->moreopts) if (citem==opt->moreopts)
{ {
if ( menus[opt->coop].value ) more_game_options_menu::net_udp_more_game_options(menus[opt->coop].value);
Game_mode=GM_MULTI_COOP;
more_game_options_menu_items::net_udp_more_game_options();
Game_mode=0;
return 1; return 1;
} }
if (citem==opt->start_game) if (citem==opt->start_game)