Skip to content

Commit ca6c404

Browse files
author
Semphris
committed
Moved some code to GameControllerManager
1 parent c73a6c7 commit ca6c404

File tree

4 files changed

+89
-42
lines changed

4 files changed

+89
-42
lines changed

src/control/game_controller_manager.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,65 @@ GameControllerManager::on_controller_removed(int instance_id)
301301
}
302302
}
303303

304+
void
305+
GameControllerManager::on_player_removed(int player_id)
306+
{
307+
auto it2 = std::find_if(m_game_controllers.begin(), m_game_controllers.end(), [player_id](decltype(m_game_controllers)::const_reference pair) {
308+
return pair.second == player_id;
309+
});
310+
if (it2 != m_game_controllers.end())
311+
{
312+
it2->second = -1;
313+
// Try again, in case multiple controllers were bount to a player
314+
// Recursive call shouldn't go too deep except in hardcore scenarios
315+
on_player_removed(player_id);
316+
}
317+
}
318+
319+
bool
320+
GameControllerManager::has_corresponding_game_controller(int player_id) const
321+
{
322+
return std::find_if(m_game_controllers.begin(), m_game_controllers.end(), [player_id](decltype(m_game_controllers)::const_reference pair) {
323+
return pair.second == player_id;
324+
}) != m_game_controllers.end();
325+
}
326+
327+
int
328+
GameControllerManager::rumble(SDL_GameController* controller) const
329+
{
330+
#if SDL_VERSION_ATLEAST(2, 0, 9)
331+
if (g_config->multiplayer_buzz_controllers)
332+
{
333+
#if SDL_VERSION_ATLEAST(2, 0, 18)
334+
if (SDL_GameControllerHasRumble(controller))
335+
{
336+
#endif
337+
// TODO: Rumble intensity setting (like volume)
338+
SDL_GameControllerRumble(controller, 0xFFFF, 0xFFFF, 300);
339+
#if SDL_VERSION_ATLEAST(2, 0, 18)
340+
}
341+
else
342+
{
343+
return 1;
344+
}
345+
#endif
346+
}
347+
348+
return 0;
349+
#else
350+
return 2;
351+
#endif
352+
}
353+
354+
void
355+
GameControllerManager::bind_controller(SDL_GameController* controller, int player_id)
356+
{
357+
m_game_controllers[controller] = player_id;
358+
359+
if (!g_config->multiplayer_multibind)
360+
for (auto& pair2 : m_game_controllers)
361+
if (pair2.second == player_id && pair2.first != controller)
362+
pair2.second = -1;
363+
}
364+
304365
/* EOF */

src/control/game_controller_manager.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ class GameControllerManager final
4646
void on_controller_added(int joystick_index);
4747
void on_controller_removed(int instance_id);
4848

49+
void on_player_removed(int player_id);
50+
bool has_corresponding_game_controller(int player_id) const;
51+
52+
/** @returns 0 if success, 1 if controller doesn't support rumbling, 2 if game doesn't support rumbling */
53+
int rumble(SDL_GameController* controller) const;
54+
55+
void bind_controller(SDL_GameController* controller, int player_id);
56+
4957
std::unordered_map<SDL_GameController*, int>& get_controller_mapping() { return m_game_controllers; }
5058

5159
private:

src/control/input_manager.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -159,26 +159,15 @@ InputManager::on_player_removed(int player_id)
159159
if (it != map.end())
160160
it->second = -1;
161161

162-
auto& map2 = game_controller_manager->get_controller_mapping();
163-
auto it2 = std::find_if(map2.begin(), map2.end(), [player_id](std::remove_reference<decltype(map2)>::type::const_reference pair) { return pair.second == player_id; });
164-
if (it2 != map2.end())
165-
it2->second = -1;
162+
game_controller_manager->on_player_removed(player_id);
166163
}
167164

168165
bool
169166
InputManager::has_corresponsing_controller(int player_id) const
170167
{
171-
/*
172-
// Player 0 should always be considered to have a controller
173-
if (!player_id)
174-
return true;
175-
*/
176168
if (m_use_game_controller)
177169
{
178-
auto& map = game_controller_manager->get_controller_mapping();
179-
return std::find_if(map.begin(), map.end(), [player_id](std::remove_reference<decltype(map)>::type::const_reference pair) {
180-
return pair.second == player_id;
181-
}) != map.end();
170+
return game_controller_manager->has_corresponding_game_controller(player_id);
182171
}
183172
else
184173
{

src/supertux/menu/multiplayer_player_menu.cpp

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -143,38 +143,27 @@ MultiplayerPlayerMenu::MultiplayerPlayerMenu(int player_id)
143143
std::string prefix = (pair.second == -1) ? "" : (pair.second == player_id) ? "-> " : ("[" + std::to_string(pair.second + 1) + "] ");
144144

145145
add_entry(prefix + std::string(SDL_GameControllerName(pair.first)), [controller, player_id] {
146-
InputManager::current()->game_controller_manager->get_controller_mapping()[controller] = player_id;
146+
InputManager::current()->game_controller_manager->bind_controller(controller, player_id);
147147

148-
if (!g_config->multiplayer_multibind)
149-
for (auto& pair2 : InputManager::current()->game_controller_manager->get_controller_mapping())
150-
if (pair2.second == player_id && pair2.first != controller)
151-
pair2.second = -1;
152-
153-
MenuManager::instance().set_menu(std::make_unique<MultiplayerPlayerMenu>(player_id));
154-
155-
#if SDL_VERSION_ATLEAST(2, 0, 9)
156-
if (g_config->multiplayer_buzz_controllers)
148+
auto err = InputManager::current()->game_controller_manager->rumble(controller);
149+
switch (err)
157150
{
158-
#if SDL_VERSION_ATLEAST(2, 0, 18)
159-
if (SDL_GameControllerHasRumble(controller))
160-
{
161-
#endif
162-
// TODO: Rumble intensity setting (like volume)
163-
SDL_GameControllerRumble(controller, 0xFFFF, 0xFFFF, 300);
164-
#if SDL_VERSION_ATLEAST(2, 0, 18)
165-
}
166-
else
167-
{
168-
Dialog::show_message(_("This controller does not support rumbling;\n"
169-
"please check the controllers manually."));
170-
}
171-
#endif
151+
case 1:
152+
Dialog::show_message(_("This controller does not support rumbling;"
153+
"\nplease check the controllers manually."));
154+
break;
155+
156+
case 2:
157+
Dialog::show_message(_("This SuperTux build does not support "
158+
"rumbling\ncontrollers; please check the "
159+
"controllers manually."));
160+
break;
161+
162+
default:
163+
break;
172164
}
173-
#else
174-
Dialog::show_message(_("This SuperTux build does not support rumbling\n"
175-
"controllers; please check the controllers manually.\n"
176-
"\nYou may disable this message in the Options menu."));
177-
#endif
165+
166+
MenuManager::instance().set_menu(std::make_unique<MultiplayerPlayerMenu>(player_id));
178167
});
179168
}
180169
}

0 commit comments

Comments
 (0)