From 2007257064349ae3af8b66b635bda96423d7cb77 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 20 Dec 2020 20:39:07 +0000 Subject: [PATCH] Convert get_multi_endlevel_poll2 to dispatch through a vtable --- common/main/multi.h | 4 ++-- common/main/net_udp.h | 1 + similar/main/kmatrix.cpp | 2 +- similar/main/multi.cpp | 17 ----------------- similar/main/net_udp.cpp | 5 +++++ 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/common/main/multi.h b/common/main/multi.h index e2d991aa9..0fa9547d7 100644 --- a/common/main/multi.h +++ b/common/main/multi.h @@ -237,6 +237,7 @@ constexpr std::integral_constant MULTI_ALLOW_POWERUP_TEXT_LENGTH{} #endif namespace multi { +using endlevel_poll_function_type = int(newmenu *menu,const d_event &event, const unused_newmenu_userdata_t *); struct dispatch_table { constexpr const dispatch_table *operator->() const @@ -247,6 +248,7 @@ struct dispatch_table virtual void do_protocol_frame(int force, int listen) const = 0; virtual window_event_result level_sync() const = 0; virtual void send_endlevel_packet() const = 0; + virtual endlevel_poll_function_type *get_endlevel_poll2() const = 0; }; } } @@ -485,9 +487,7 @@ void multi_consistency_error(int reset); window_event_result multi_level_sync(); int multi_endlevel(int *secret); #ifdef dsx -using multi_endlevel_poll = int(newmenu *menu,const d_event &event, const unused_newmenu_userdata_t *); namespace dsx { -multi_endlevel_poll *get_multi_endlevel_poll2(); void multi_send_hostage_door_status(vcwallptridx_t wallnum); void multi_prep_level_objects(const d_vclip_array &Vclip); void multi_prep_level_player(); diff --git a/common/main/net_udp.h b/common/main/net_udp.h index b2f95111e..6fff5da80 100644 --- a/common/main/net_udp.h +++ b/common/main/net_udp.h @@ -30,6 +30,7 @@ struct dispatch_table final : multi::dispatch_table virtual void do_protocol_frame(int force, int listen) const override; virtual window_event_result level_sync() const override; virtual void send_endlevel_packet() const override; + virtual endlevel_poll_function_type *get_endlevel_poll2() const override; }; extern const dispatch_table dispatch; diff --git a/similar/main/kmatrix.cpp b/similar/main/kmatrix.cpp index a44607652..7f60d68a1 100644 --- a/similar/main/kmatrix.cpp +++ b/similar/main/kmatrix.cpp @@ -312,7 +312,7 @@ window_event_result kmatrix_window::event_handler(const d_event &event) nm_item_menu(TXT_YES), nm_item_menu(TXT_NO), }}; - choice = newmenu_do2(menu_title{nullptr}, menu_subtitle{TXT_ABORT_GAME}, nm_message_items, network != kmatrix_network::offline ? get_multi_endlevel_poll2() : unused_newmenu_subfunction, unused_newmenu_userdata); + choice = newmenu_do2(menu_title{nullptr}, menu_subtitle{TXT_ABORT_GAME}, nm_message_items, network != kmatrix_network::offline ? multi::dispatch->get_endlevel_poll2() : unused_newmenu_subfunction, unused_newmenu_userdata); } if (choice==0) diff --git a/similar/main/multi.cpp b/similar/main/multi.cpp index 76956fc65..9ed170f75 100644 --- a/similar/main/multi.cpp +++ b/similar/main/multi.cpp @@ -1126,23 +1126,6 @@ int multi_endlevel(int *const secret) return(result); } -namespace dsx { - -multi_endlevel_poll *get_multi_endlevel_poll2() -{ - switch (multi_protocol) - { -#if DXX_USE_UDP - case MULTI_PROTO_UDP: - return multi::udp::kmatrix_poll2; -#endif - default: - throw std::logic_error("Protocol handling missing in multi_endlevel_poll2"); - } -} - -} - // // Part 2 : functions that act on network messages and change the // the state of the game in some way. diff --git a/similar/main/net_udp.cpp b/similar/main/net_udp.cpp index 1f7794b84..e175aea50 100644 --- a/similar/main/net_udp.cpp +++ b/similar/main/net_udp.cpp @@ -2521,6 +2521,11 @@ void dispatch_table::send_endlevel_packet() const dxx_sendto(Netgame.players[0].protocol.udp.addr, UDP_Socket[0], buf, 0); } } + +endlevel_poll_function_type *dispatch_table::get_endlevel_poll2() const +{ + return kmatrix_poll2; +} } } }