From a58ede8911dd8ddbbeb8e93633a265ecf981ad3b Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 26 Apr 2024 13:39:27 +1000 Subject: [PATCH] In splitscreen mode, tie controller joystick input to a specific player --- src/Entity.c | 5 +++-- src/Entity.h | 1 + src/Gui.c | 1 - src/Input.c | 3 +++ src/Menus.c | 26 +++++--------------------- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/Entity.c b/src/Entity.c index 793a23f42..30484c735 100644 --- a/src/Entity.c +++ b/src/Entity.c @@ -746,7 +746,7 @@ static const struct EntityVTABLE localPlayer_VTABLE = { LocalPlayer_Tick, Player_Despawn, LocalPlayer_SetLocation, Entity_GetColor, LocalPlayer_RenderModel, LocalPlayer_ShouldRenderName }; -static void LocalPlayer_Init(struct LocalPlayer* p) { +static void LocalPlayer_Init(struct LocalPlayer* p, int index) { struct HacksComp* hacks = &p->Hacks; Entity_Init(&p->Base); @@ -764,6 +764,7 @@ static void LocalPlayer_Init(struct LocalPlayer* p) { p->Physics.Hacks = &p->Hacks; p->Physics.Collisions = &p->Collisions; p->Base.VTABLE = &localPlayer_VTABLE; + p->index = index; hacks->Enabled = !Game_PureClassic && Options_GetBool(OPT_HACKS_ENABLED, true); /* p->Base.Health = 20; TODO: survival mode stuff */ @@ -1045,7 +1046,7 @@ static void Entities_Init(void) { for (i = 0; i < Game_NumLocalPlayers; i++) { - LocalPlayer_Init(&LocalPlayer_Instances[i]); + LocalPlayer_Init(&LocalPlayer_Instances[i], i); Entities.List[MAX_NET_PLAYERS + i] = &LocalPlayer_Instances[i].Base; } Entities.CurPlayer = &LocalPlayer_Instances[0]; diff --git a/src/Entity.h b/src/Entity.h index 80ad067da..6a7124e78 100644 --- a/src/Entity.h +++ b/src/Entity.h @@ -243,6 +243,7 @@ struct LocalPlayer { struct CollisionsComp Collisions; struct PhysicsComp Physics; cc_bool _warnedRespawn, _warnedFly, _warnedNoclip, _warnedZoom; + cc_uint8 index; }; extern struct LocalPlayer LocalPlayer_Instances[MAX_LOCAL_PLAYERS]; diff --git a/src/Gui.c b/src/Gui.c index eb0f995ef..4cf50a09b 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -606,7 +606,6 @@ static void OnAxisUpdate(void* obj, int port, int axis, float x, float y) { } - /*########################################################################################################################* *------------------------------------------------------Gui component------------------------------------------------------* *#########################################################################################################################*/ diff --git a/src/Input.c b/src/Input.c index 252acc8ad..896f4f864 100644 --- a/src/Input.c +++ b/src/Input.c @@ -490,6 +490,9 @@ static void PlayerInputGamepad(struct LocalPlayer* p, float* xMoving, float* zMo int port; for (port = 0; port < INPUT_MAX_GAMEPADS; port++) { + /* In splitscreen mode, tie a controller to a specific player*/ + if (Game_NumLocalPlayers > 1 && p->index != port) continue; + PlayerInputPad(port, PAD_AXIS_LEFT, p, xMoving, zMoving); PlayerInputPad(port, PAD_AXIS_RIGHT, p, xMoving, zMoving); } diff --git a/src/Menus.c b/src/Menus.c index af9141697..a8a724ddc 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -2306,10 +2306,6 @@ static void MenuInputOverlay_Render(void* screen, double delta) { } static void MenuInputOverlay_Free(void* screen) { - struct MenuInputOverlay* s = (struct MenuInputOverlay*)screen; - Elem_Free(&s->input.base); - Elem_Free(&s->ok); - Elem_Free(&s->Default); OnscreenKeyboard_Close(); } @@ -2583,10 +2579,9 @@ static void MenuOptionsScreen_Init(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; int i; - s->widgets = menuOpts_widgets; - s->numWidgets = 0; - s->maxWidgets = MENUOPTS_MAX_OPTS + 1; /* always have back button */ - s->maxVertices = BUTTONWIDGET_MAX; + s->widgets = menuOpts_widgets; + s->numWidgets = 0; + s->maxWidgets = MENUOPTS_MAX_OPTS + 1; /* always have back button */ /* The various menu options screens might have different number of widgets */ for (i = 0; i < MENUOPTS_MAX_OPTS; i++) { @@ -2601,6 +2596,8 @@ static void MenuOptionsScreen_Init(void* screen) { TextGroupWidget_Create(&s->extHelp, 5, s->extHelpTextures, MenuOptionsScreen_GetDesc); s->extHelp.lines = 0; Event_Register_(&UserEvents.HackPermsChanged, screen, MenuOptionsScreen_OnHacksChanged); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } #define EXTHELP_PAD 5 /* padding around extended help box */ @@ -2759,7 +2756,6 @@ static void ClassicOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 0, 60, "Hacks enabled", MenuOptionsScreen_Bool, ClassicOptionsScreen_GetHacks, ClassicOptionsScreen_SetHacks } }; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX + BUTTONWIDGET_MAX; s->DoRecreateExtra = ClassicOptionsScreen_RecreateExtra; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchPause); @@ -2839,8 +2835,6 @@ static void EnvSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Water level", MenuOptionsScreen_Input, EnvSettingsScreen_GetEdgeHeight, EnvSettingsScreen_SetEdgeHeight } }; - - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } @@ -2928,8 +2922,6 @@ static void GraphicsOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Anaglyph 3D", MenuOptionsScreen_Bool, ClassicOptionsScreen_GetAnaglyph, ClassicOptionsScreen_SetAnaglyph } }; - - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); s->descriptions[0] = "&eChange the smoothness of the smooth camera."; @@ -3012,8 +3004,6 @@ static void ChatOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { { -1,-50, "Scale with window", MenuOptionsScreen_Bool, ChatOptionsScreen_GetAutoScaleChat, ChatOptionsScreen_SetAutoScaleChat } }; - - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } @@ -3076,8 +3066,6 @@ static void GuiOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Select system font", Menu_SwitchFont, NULL, NULL } }; - - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } @@ -3198,7 +3186,6 @@ static void HacksSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Field of view", MenuOptionsScreen_Input, HacksSettingsScreen_GetFOV, HacksSettingsScreen_SetFOV }, }; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; s->OnHacksChanged = HacksSettingsScreen_CheckHacksAllowed; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); @@ -3275,7 +3262,6 @@ static void MiscSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Mouse sensitivity", MenuOptionsScreen_Input, MiscOptionsScreen_GetSensitivity, MiscOptionsScreen_SetSensitivity } }; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); /* Disable certain options */ @@ -3412,7 +3398,6 @@ static void NostalgiaAppearanceScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Classic options", MenuOptionsScreen_Bool, NostalgiaScreen_GetOpts, NostalgiaScreen_SetOpts }, }; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia); } @@ -3473,7 +3458,6 @@ static void NostalgiaFunctionalityScreen_InitWidgets(struct MenuOptionsScreen* s { 1, 0, "Game version", NostalgiaScreen_Version, NostalgiaScreen_GetVersion, NostalgiaScreen_SetVersion } }; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX + TEXTWIDGET_MAX; s->DoRecreateExtra = NostalgiaScreen_RecreateExtra; MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia);