mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-21 19:45:10 +00:00
Add gamepad number, background options (#122)
Added two options, one which lets user choose which gamepad to use, and one which allows game to be played with gamepad while in the background. These two features together allow for "splitscreen" (sort of) multiplayer by starting up instances and joining them together and selecting different gamepads for each one. Gamepad choices are 0-7. If a number is chosen that does not correspond to a gamepad, the previous gamepad (last number you were on this session that had a working gamepad) is used.
This commit is contained in:
parent
e0e1d2e1a8
commit
de60a0ae44
5 changed files with 55 additions and 13 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -52,6 +52,7 @@
|
||||||
*.swp
|
*.swp
|
||||||
.vscode/*
|
.vscode/*
|
||||||
.idea/*
|
.idea/*
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
# General project-specific ignores
|
# General project-specific ignores
|
||||||
doxygen/doxygen/*
|
doxygen/doxygen/*
|
||||||
|
|
|
@ -140,6 +140,8 @@ unsigned int configDrawDistance = 5;
|
||||||
bool configDisablePopups = 0;
|
bool configDisablePopups = 0;
|
||||||
bool configDisableDownloadedModels = 0;
|
bool configDisableDownloadedModels = 0;
|
||||||
unsigned int configInterpolationMode = 1;
|
unsigned int configInterpolationMode = 1;
|
||||||
|
unsigned int configGamepadNumber = 0;
|
||||||
|
bool configBackgroundGamepad = 1;
|
||||||
|
|
||||||
static const struct ConfigOption options[] = {
|
static const struct ConfigOption options[] = {
|
||||||
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen},
|
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen},
|
||||||
|
@ -221,7 +223,9 @@ static const struct ConfigOption options[] = {
|
||||||
{.name = "share_lives", .type = CONFIG_TYPE_BOOL , .boolValue = &configShareLives},
|
{.name = "share_lives", .type = CONFIG_TYPE_BOOL , .boolValue = &configShareLives},
|
||||||
{.name = "disable_popups", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisablePopups},
|
{.name = "disable_popups", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisablePopups},
|
||||||
{.name = "disable_downloaded_models", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisableDownloadedModels},
|
{.name = "disable_downloaded_models", .type = CONFIG_TYPE_BOOL , .boolValue = &configDisableDownloadedModels},
|
||||||
{.name = "interpolation_mode", .type = CONFIG_TYPE_UINT , .uintValue = &configInterpolationMode}
|
{.name = "interpolation_mode", .type = CONFIG_TYPE_UINT , .uintValue = &configInterpolationMode},
|
||||||
|
{.name = "gamepad_number", .type = CONFIG_TYPE_UINT , .uintValue = &configGamepadNumber},
|
||||||
|
{.name = "background_gamepad", .type = CONFIG_TYPE_UINT , .boolValue = &configBackgroundGamepad}
|
||||||
};
|
};
|
||||||
|
|
||||||
// FunctionConfigOption functions
|
// FunctionConfigOption functions
|
||||||
|
|
|
@ -52,6 +52,8 @@ extern unsigned int configKeyDLeft[];
|
||||||
extern unsigned int configKeyDRight[];
|
extern unsigned int configKeyDRight[];
|
||||||
extern unsigned int configStickDeadzone;
|
extern unsigned int configStickDeadzone;
|
||||||
extern unsigned int configRumbleStrength;
|
extern unsigned int configRumbleStrength;
|
||||||
|
extern unsigned int configGamepadNumber;
|
||||||
|
extern bool configBackgroundGamepad;
|
||||||
#ifdef EXTERNAL_DATA
|
#ifdef EXTERNAL_DATA
|
||||||
extern bool configPrecacheRes;
|
extern bool configPrecacheRes;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -52,6 +52,7 @@ static bool joy_buttons[MAX_JOYBUTTONS] = { false };
|
||||||
static u32 mouse_buttons = 0;
|
static u32 mouse_buttons = 0;
|
||||||
static u32 last_mouse = VK_INVALID;
|
static u32 last_mouse = VK_INVALID;
|
||||||
static u32 last_joybutton = VK_INVALID;
|
static u32 last_joybutton = VK_INVALID;
|
||||||
|
static u32 last_gamepad = 0;
|
||||||
|
|
||||||
static inline void controller_add_binds(const u32 mask, const u32 *btns) {
|
static inline void controller_add_binds(const u32 mask, const u32 *btns) {
|
||||||
for (u32 i = 0; i < MAX_BINDS; ++i) {
|
for (u32 i = 0; i < MAX_BINDS; ++i) {
|
||||||
|
@ -98,6 +99,11 @@ static void controller_sdl_bind(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void controller_sdl_init(void) {
|
static void controller_sdl_init(void) {
|
||||||
|
// Allows game to be controlled by gamepad when not in focus
|
||||||
|
if (configBackgroundGamepad) {
|
||||||
|
SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1");
|
||||||
|
}
|
||||||
|
|
||||||
if (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_EVENTS) != 0) {
|
if (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_EVENTS) != 0) {
|
||||||
fprintf(stderr, "SDL init error: %s\n", SDL_GetError());
|
fprintf(stderr, "SDL init error: %s\n", SDL_GetError());
|
||||||
return;
|
return;
|
||||||
|
@ -216,21 +222,22 @@ static void controller_sdl_read(OSContPad *pad) {
|
||||||
sdl_haptic = NULL;
|
sdl_haptic = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdl_cntrl == NULL) {
|
if (sdl_cntrl == NULL || last_gamepad != configGamepadNumber) {
|
||||||
for (int i = 0; i < SDL_NumJoysticks(); i++) {
|
if (SDL_IsGameController(configGamepadNumber)) {
|
||||||
if (SDL_IsGameController(i)) {
|
sdl_cntrl = SDL_GameControllerOpen(configGamepadNumber);
|
||||||
sdl_cntrl = SDL_GameControllerOpen(i);
|
if (sdl_cntrl != NULL) {
|
||||||
if (sdl_cntrl != NULL) {
|
sdl_haptic = controller_sdl_init_haptics(configGamepadNumber);
|
||||||
sdl_haptic = controller_sdl_init_haptics(i);
|
last_gamepad = configGamepadNumber;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
if (sdl_cntrl == NULL) {
|
||||||
if (sdl_cntrl == NULL) {
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sdl_cntrl = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t leftx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTX);
|
int16_t leftx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTX);
|
||||||
int16_t lefty = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTY);
|
int16_t lefty = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_LEFTY);
|
||||||
int16_t rightx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_RIGHTX);
|
int16_t rightx = SDL_GameControllerGetAxis(sdl_cntrl, SDL_CONTROLLER_AXIS_RIGHTX);
|
||||||
|
|
|
@ -2,13 +2,14 @@
|
||||||
#include "src/pc/utils/misc.h"
|
#include "src/pc/utils/misc.h"
|
||||||
#include "src/pc/configfile.h"
|
#include "src/pc/configfile.h"
|
||||||
#include "src/pc/controller/controller_api.h"
|
#include "src/pc/controller/controller_api.h"
|
||||||
|
#include "src/pc/controller/controller_sdl.h"
|
||||||
|
|
||||||
void djui_panel_controls_value_change(UNUSED struct DjuiBase* caller) {
|
void djui_panel_controls_value_change(UNUSED struct DjuiBase* caller) {
|
||||||
controller_reconfigure();
|
controller_reconfigure();
|
||||||
}
|
}
|
||||||
|
|
||||||
void djui_panel_controls_create(struct DjuiBase* caller) {
|
void djui_panel_controls_create(struct DjuiBase* caller) {
|
||||||
f32 bodyHeight = 16 * 5 + 32 * 2 + 64 * 3;
|
f32 bodyHeight = 16 * 6 + 32 * 2 + 64 * 4;
|
||||||
|
|
||||||
struct DjuiBase* defaultBase = NULL;
|
struct DjuiBase* defaultBase = NULL;
|
||||||
struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\C\\#1be700\\O\\#00b3ff\\N\\#ffef00\\T\\#ff0800\\R\\#1be700\\O\\#00b3ff\\L\\#ffef00\\S");
|
struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\C\\#1be700\\O\\#00b3ff\\N\\#ffef00\\T\\#ff0800\\R\\#1be700\\O\\#00b3ff\\L\\#ffef00\\S");
|
||||||
|
@ -25,6 +26,33 @@ void djui_panel_controls_create(struct DjuiBase* caller) {
|
||||||
djui_base_set_size(&button2->base, 1.0f, 64);
|
djui_base_set_size(&button2->base, 1.0f, 64);
|
||||||
djui_interactable_hook_click(&button2->base, djui_panel_controls_extra_create);
|
djui_interactable_hook_click(&button2->base, djui_panel_controls_extra_create);
|
||||||
|
|
||||||
|
struct DjuiCheckbox* checkboxGB = djui_checkbox_create(&body->base, "Background Gamepad (must restart)", &configBackgroundGamepad);
|
||||||
|
djui_base_set_size_type(&checkboxGB->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
||||||
|
djui_base_set_size(&checkboxGB->base, 1.0f, 32);
|
||||||
|
// djui_interactable_hook_value_change(&checkboxGB->base, djui_panel_display_uncapped_change);
|
||||||
|
|
||||||
|
int numJoys = SDL_NumJoysticks();
|
||||||
|
if (numJoys == 0) { numJoys = 1; }
|
||||||
|
if (numJoys > 100) { numJoys = 100; }
|
||||||
|
int strSize = numJoys * 2;
|
||||||
|
if (numJoys > 10) {
|
||||||
|
strSize += (numJoys - 10);
|
||||||
|
}
|
||||||
|
char* gamepadChoices[numJoys];
|
||||||
|
char gamepadChoicesLong[strSize];
|
||||||
|
for (int i = 0; i < numJoys; i++) {
|
||||||
|
int index = i * 2;
|
||||||
|
if (i > 9) {
|
||||||
|
index += (i - 9);
|
||||||
|
}
|
||||||
|
sprintf(&gamepadChoicesLong[index], "%d\0", i);
|
||||||
|
gamepadChoices[i] = &gamepadChoicesLong[index];
|
||||||
|
}
|
||||||
|
// char* gamepadChoices[16] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"};
|
||||||
|
struct DjuiSelectionbox* selectionboxGamepad = djui_selectionbox_create(&body->base, "Gamepad", gamepadChoices, numJoys, &configGamepadNumber);
|
||||||
|
djui_base_set_size_type(&selectionboxGamepad->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
||||||
|
djui_base_set_size(&selectionboxGamepad->base, 1.0f, 32);
|
||||||
|
|
||||||
struct DjuiSlider* slider1 = djui_slider_create(&body->base, "Deadzone", &configStickDeadzone, 0, 100);
|
struct DjuiSlider* slider1 = djui_slider_create(&body->base, "Deadzone", &configStickDeadzone, 0, 100);
|
||||||
djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
djui_base_set_size_type(&slider1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
||||||
djui_base_set_size(&slider1->base, 1.0f, 32);
|
djui_base_set_size(&slider1->base, 1.0f, 32);
|
||||||
|
|
Loading…
Reference in a new issue