WIP on supporting splitscreen from launcher (Dreamcast and PS3 only ATM)

This commit is contained in:
UnknownShadow200 2024-04-25 21:49:10 +10:00
parent 3b0e842ede
commit b478c486a0
4 changed files with 99 additions and 24 deletions

View File

@ -306,6 +306,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_LOWMEM
#define CC_BUILD_HTTPCLIENT
#define CC_BUILD_BEARSSL
#define CC_BUILD_SPLITSCREEN
#undef CC_BUILD_RESOURCES
#elif defined PLAT_PS3
#define CC_BUILD_PS3
@ -314,6 +315,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_OPENAL
#define CC_BUILD_HTTPCLIENT
#define CC_BUILD_BEARSSL
#define CC_BUILD_SPLITSCREEN
#elif defined N64
#define CC_BIG_ENDIAN
#define CC_BUILD_N64

View File

@ -727,7 +727,7 @@ static void LocalPlayer_RenderModel(struct Entity* e, double deltaTime, float t)
AnimatedComp_GetCurrent(e, t);
TiltComp_GetCurrent(p, &p->Tilt, t);
if (!Camera.Active->isThirdPerson) return;
if (!Camera.Active->isThirdPerson && p == Entities.CurPlayer) return;
Model_Render(e->Model, e);
}
@ -769,7 +769,7 @@ static void LocalPlayer_Init(struct LocalPlayer* p) {
/* p->Base.Health = 20; TODO: survival mode stuff */
if (Game_ClassicMode) return;
hacks->SpeedMultiplier = Options_GetFloat(OPT_SPEED_FACTOR, 0.1f, 50.0f, 10.0f);
hacks->SpeedMultiplier = Options_GetFloat(OPT_SPEED_FACTOR, 0.1f, 50.0f, 10.0f);
hacks->PushbackPlacing = Options_GetBool(OPT_PUSHBACK_PLACING, false);
hacks->NoclipSlide = Options_GetBool(OPT_NOCLIP_SLIDE, false);
hacks->WOMStyleHacks = Options_GetBool(OPT_WOM_STYLE_HACKS, false);

View File

@ -421,10 +421,6 @@ static void KeyBind_Init(void) {
int Gamepad_AxisBehaviour[2] = { AXIS_BEHAVIOUR_MOVEMENT, AXIS_BEHAVIOUR_CAMERA };
int Gamepad_AxisSensitivity[2] = { AXIS_SENSI_NORMAL, AXIS_SENSI_NORMAL };
static const float axis_sensiFactor[] = { 0.25f, 0.5f, 1.0f, 2.0f, 4.0f };
/* Whether a gamepad joystick is being used to control player movement */
static cc_bool joystick_movement;
/* Angle of the gamepad joystick being used to control player movement */
static float joystick_angle;
struct GamepadState {
float axisX[2], axisY[2];
@ -457,36 +453,46 @@ void Gamepad_SetButton(int port, int btn, int pressed) {
}
void Gamepad_SetAxis(int port, int axis, float x, float y, double delta) {
gamepads[port].axisX[axis] = x;
gamepads[port].axisY[axis] = y;
if (x == 0 && y == 0) return;
int sensi = Gamepad_AxisSensitivity[axis];
float scale = delta * 60.0 * axis_sensiFactor[sensi];
Event_RaisePadAxis(&ControllerEvents.AxisUpdate, port, axis, x * scale, y * scale);
if (Gamepad_AxisBehaviour[axis] == AXIS_BEHAVIOUR_MOVEMENT) {
if (!Input.RawMode) return;
joystick_movement = true;
joystick_angle = Math_Atan2(x, y);
}
}
void Gamepad_Tick(double delta) {
int i;
joystick_movement = false;
int port;
Window_ProcessGamepads(delta);
for (i = 0; i < INPUT_MAX_GAMEPADS; i++)
for (port = 0; port < INPUT_MAX_GAMEPADS; port++)
{
Gamepad_Update(&gamepads[i], delta);
Gamepad_Update(&gamepads[port], delta);
}
}
static void PlayerInputPad(int port, int axis, struct LocalPlayer* p, float* xMoving, float* zMoving) {
float x, y, angle;
if (Gamepad_AxisBehaviour[axis] != AXIS_BEHAVIOUR_MOVEMENT) return;
x = gamepads[port].axisX[axis];
y = gamepads[port].axisY[axis];
if (x != 0 || y != 0) {
float angle = Math_Atan2(x, y);
*xMoving = Math_CosF(angle);
*zMoving = Math_SinF(angle);
}
}
static void PlayerInputGamepad(struct LocalPlayer* p, float* xMoving, float* zMoving) {
if (!joystick_movement) return;
*xMoving = Math_CosF(joystick_angle);
*zMoving = Math_SinF(joystick_angle);
int port;
for (port = 0; port < INPUT_MAX_GAMEPADS; port++)
{
PlayerInputPad(port, PAD_AXIS_LEFT, p, xMoving, zMoving);
PlayerInputPad(port, PAD_AXIS_RIGHT, p, xMoving, zMoving);
}
}
static struct LocalPlayerInput gamepadInput = { PlayerInputGamepad };

View File

@ -18,6 +18,7 @@
#include "Utils.h"
#include "LBackend.h"
#include "Http.h"
#include "Game.h"
#define LAYOUTS static const struct LLayout
#define IsEnterButton(btn) (btn == CCKEY_ENTER || btn == CCPAD_START || btn == CCPAD_A || btn == CCKEY_KP_ENTER)
@ -652,18 +653,79 @@ void MFAScreen_SetActive(void) {
}
/*########################################################################################################################*
*----------------------------------------------------------SplitScreen----------------------------------------------------*
*#########################################################################################################################*/
#ifdef CC_BUILD_SPLITSCREEN
static struct SplitScreen {
LScreen_Layout
struct LButton btnPlayers[3], btnBack;
cc_bool signingIn;
} SplitScreen;
#define SPLITSCREEN_MAX_WIDGETS 4
static struct LWidget* split_widgets[SPLITSCREEN_MAX_WIDGETS];
LAYOUTS sps_btnPlayers2[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -120 } };
LAYOUTS sps_btnPlayers3[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -70 } };
LAYOUTS sps_btnPlayers4[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -20 } };
LAYOUTS sps_btnBack[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 170 } };
static void SplitScreen_Start(int players) {
static const cc_string user = String_FromConst(DEFAULT_USERNAME);
Game_NumLocalPlayers = players;
Launcher_StartGame(&user, &String_Empty, &String_Empty, &String_Empty, &String_Empty);
}
static void SplitScreen_Players2(void* w) { SplitScreen_Start(2); }
static void SplitScreen_Players3(void* w) { SplitScreen_Start(3); }
static void SplitScreen_Players4(void* w) { SplitScreen_Start(4); }
static void SplitScreen_Activated(struct LScreen* s_) {
struct SplitScreen* s = (struct SplitScreen*)s_;
LButton_Add(s, &s->btnPlayers[0], 300, 35, "2 player splitscreen",
SplitScreen_Players2, sps_btnPlayers2);
LButton_Add(s, &s->btnPlayers[1], 300, 35, "3 player splitscreen",
SplitScreen_Players3, sps_btnPlayers3);
LButton_Add(s, &s->btnPlayers[2], 300, 35, "4 player splitscreen",
SplitScreen_Players4, sps_btnPlayers4);
LButton_Add(s, &s->btnBack, 100, 35, "Back",
SwitchToMain, sps_btnBack);
}
void SplitScreen_SetActive(void) {
struct SplitScreen* s = &SplitScreen;
LScreen_Reset((struct LScreen*)s);
s->widgets = split_widgets;
s->maxWidgets = Array_Elems(split_widgets);
s->Activated = SplitScreen_Activated;
s->title = "Splitscreen mode";
Launcher_SetScreen((struct LScreen*)s);
}
static void SwitchToSplitScreen(void* w) { SplitScreen_SetActive(); }
#endif
/*########################################################################################################################*
*----------------------------------------------------------MainScreen-----------------------------------------------------*
*#########################################################################################################################*/
static struct MainScreen {
LScreen_Layout
struct LButton btnLogin, btnResume, btnDirect, btnSPlayer, btnRegister, btnOptions, btnUpdates;
struct LButton btnLogin, btnResume, btnDirect, btnSPlayer, btnSplit;
struct LButton btnRegister, btnOptions, btnUpdates;
struct LInput iptUsername, iptPassword;
struct LLabel lblStatus, lblUpdate;
cc_bool signingIn;
} MainScreen;
#define MAINSCREEN_MAX_WIDGETS 11
#define MAINSCREEN_MAX_WIDGETS 12
static struct LWidget* main_widgets[MAINSCREEN_MAX_WIDGETS];
LAYOUTS main_iptUsername[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -120 } };
@ -675,6 +737,7 @@ LAYOUTS main_lblStatus[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 20 } };
LAYOUTS main_btnResume[] = { { ANCHOR_CENTRE, 90 }, { ANCHOR_CENTRE, -25 } };
LAYOUTS main_btnDirect[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 60 } };
LAYOUTS main_btnSPlayer[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 110 } };
LAYOUTS main_btnSplit[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 160 } };
LAYOUTS main_btnRegister[] = { { ANCHOR_MIN, 6 }, { ANCHOR_MAX, 6 } };
LAYOUTS main_btnOptions[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_MAX, 6 } };
@ -839,8 +902,12 @@ static void MainScreen_Activated(struct LScreen* s_) {
LLabel_Add(s, &s->lblStatus, "", main_lblStatus);
LButton_Add(s, &s->btnDirect, 200, 35, "Direct connect",
SwitchToDirectConnect, main_btnDirect);
LButton_Add(s, &s->btnSPlayer, 200, 35, "Singleplayer",
LButton_Add(s, &s->btnSPlayer, 200, 35, "Singleplayer",
MainScreen_Singleplayer, main_btnSPlayer);
#ifdef CC_BUILD_SPLITSCREEN
LButton_Add(s, &s->btnSplit, 200, 35, "Splitscreen (WIP)",
SwitchToSplitScreen, main_btnSplit);
#endif
LLabel_Add(s, &s->lblUpdate, "&eChecking..",
Updater_Supported ? main_lblUpdate_N : main_lblUpdate_H);