psx: fix non-multitap input

This commit is contained in:
zeromus 2017-04-30 13:36:18 -05:00
parent 26d8166c0e
commit 10dc2abdef
2 changed files with 86 additions and 62 deletions

View File

@ -473,69 +473,79 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
{
var fioCfg = _SyncSettings.FIOConfig.ToLogical();
for(int port=0;port<2;port++)
for(int multiport=0;multiport<4;multiport++)
for (int port = 0; port < 2; port++)
{
int portNum = (port+1) + ((multiport+1) << 4);
int slot = port * 4 + multiport;
//no input to set
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.None)
continue;
uint buttons = 0;
string pstring = "P" + fioCfg.PlayerAssignments[slot] + " ";
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.NegCon)
for (int multiport = 0; multiport < 4; multiport++)
{
//1,2,4 skipped (would be Select, L3, R3 on other pads)
if (Controller.IsPressed(pstring + "Start")) buttons |= 8;
if (Controller.IsPressed(pstring + "Up")) buttons |= 16;
if (Controller.IsPressed(pstring + "Right")) buttons |= 32;
if (Controller.IsPressed(pstring + "Down")) buttons |= 64;
if (Controller.IsPressed(pstring + "Left")) buttons |= 128;
//256,512,1024 skipped (would be L2, R2, L1 on other pads)
if (Controller.IsPressed(pstring + "R")) buttons |= 2048;
if (Controller.IsPressed(pstring + "B")) buttons |= 4096;
if (Controller.IsPressed(pstring + "A")) buttons |= 8192;
//note: I would not say this port addressing scheme has been completely successful
//however, it may be because i was constantly constrained by having to adapt it to mednafen.. i dont know.
byte twist = (byte)Controller.GetFloat(pstring + "Twist");
byte analog1 = (byte)Controller.GetFloat(pstring + "1");
byte analog2 = (byte)Controller.GetFloat(pstring + "2");
byte analogL = (byte)Controller.GetFloat(pstring + "L");
int portNum = (port + 1) + ((multiport + 1) << 4);
int slot = port * 4 + multiport;
//no input to set
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.None)
continue;
OctoshockDll.shock_Peripheral_SetPadInput(psx, portNum, buttons, twist, analog1, analog2, analogL);
}
else
{
if (Controller.IsPressed(pstring + "Select")) buttons |= 1;
if (Controller.IsPressed(pstring + "Start")) buttons |= 8;
if (Controller.IsPressed(pstring + "Up")) buttons |= 16;
if (Controller.IsPressed(pstring + "Right")) buttons |= 32;
if (Controller.IsPressed(pstring + "Down")) buttons |= 64;
if (Controller.IsPressed(pstring + "Left")) buttons |= 128;
if (Controller.IsPressed(pstring + "L2")) buttons |= 256;
if (Controller.IsPressed(pstring + "R2")) buttons |= 512;
if (Controller.IsPressed(pstring + "L1")) buttons |= 1024;
if (Controller.IsPressed(pstring + "R1")) buttons |= 2048;
if (Controller.IsPressed(pstring + "Triangle")) buttons |= 4096;
if (Controller.IsPressed(pstring + "Circle")) buttons |= 8192;
if (Controller.IsPressed(pstring + "Cross")) buttons |= 16384;
if (Controller.IsPressed(pstring + "Square")) buttons |= 32768;
//address differently if it isn't multitap
if (!fioCfg.Multitaps[port])
portNum = port + 1;
byte left_x = 0, left_y = 0, right_x = 0, right_y = 0;
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.DualShock || fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.DualAnalog)
uint buttons = 0;
string pstring = "P" + fioCfg.PlayerAssignments[slot] + " ";
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.NegCon)
{
if (Controller.IsPressed(pstring + "L3")) buttons |= 2;
if (Controller.IsPressed(pstring + "R3")) buttons |= 4;
if (Controller.IsPressed(pstring + "MODE")) buttons |= 65536;
//1,2,4 skipped (would be Select, L3, R3 on other pads)
if (Controller.IsPressed(pstring + "Start")) buttons |= 8;
if (Controller.IsPressed(pstring + "Up")) buttons |= 16;
if (Controller.IsPressed(pstring + "Right")) buttons |= 32;
if (Controller.IsPressed(pstring + "Down")) buttons |= 64;
if (Controller.IsPressed(pstring + "Left")) buttons |= 128;
//256,512,1024 skipped (would be L2, R2, L1 on other pads)
if (Controller.IsPressed(pstring + "R")) buttons |= 2048;
if (Controller.IsPressed(pstring + "B")) buttons |= 4096;
if (Controller.IsPressed(pstring + "A")) buttons |= 8192;
left_x = (byte)Controller.GetFloat(pstring + "LStick X");
left_y = (byte)Controller.GetFloat(pstring + "LStick Y");
right_x = (byte)Controller.GetFloat(pstring + "RStick X");
right_y = (byte)Controller.GetFloat(pstring + "RStick Y");
byte twist = (byte)Controller.GetFloat(pstring + "Twist");
byte analog1 = (byte)Controller.GetFloat(pstring + "1");
byte analog2 = (byte)Controller.GetFloat(pstring + "2");
byte analogL = (byte)Controller.GetFloat(pstring + "L");
OctoshockDll.shock_Peripheral_SetPadInput(psx, portNum, buttons, twist, analog1, analog2, analogL);
}
else
{
if (Controller.IsPressed(pstring + "Select")) buttons |= 1;
if (Controller.IsPressed(pstring + "Start")) buttons |= 8;
if (Controller.IsPressed(pstring + "Up")) buttons |= 16;
if (Controller.IsPressed(pstring + "Right")) buttons |= 32;
if (Controller.IsPressed(pstring + "Down")) buttons |= 64;
if (Controller.IsPressed(pstring + "Left")) buttons |= 128;
if (Controller.IsPressed(pstring + "L2")) buttons |= 256;
if (Controller.IsPressed(pstring + "R2")) buttons |= 512;
if (Controller.IsPressed(pstring + "L1")) buttons |= 1024;
if (Controller.IsPressed(pstring + "R1")) buttons |= 2048;
if (Controller.IsPressed(pstring + "Triangle")) buttons |= 4096;
if (Controller.IsPressed(pstring + "Circle")) buttons |= 8192;
if (Controller.IsPressed(pstring + "Cross")) buttons |= 16384;
if (Controller.IsPressed(pstring + "Square")) buttons |= 32768;
OctoshockDll.shock_Peripheral_SetPadInput(psx, portNum, buttons, left_x, left_y, right_x, right_y);
byte left_x = 0, left_y = 0, right_x = 0, right_y = 0;
if (fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.DualShock || fioCfg.Devices8[slot] == OctoshockDll.ePeripheralType.DualAnalog)
{
if (Controller.IsPressed(pstring + "L3")) buttons |= 2;
if (Controller.IsPressed(pstring + "R3")) buttons |= 4;
if (Controller.IsPressed(pstring + "MODE")) buttons |= 65536;
left_x = (byte)Controller.GetFloat(pstring + "LStick X");
left_y = (byte)Controller.GetFloat(pstring + "LStick Y");
right_x = (byte)Controller.GetFloat(pstring + "RStick X");
right_y = (byte)Controller.GetFloat(pstring + "RStick Y");
}
OctoshockDll.shock_Peripheral_SetPadInput(psx, portNum, buttons, left_x, left_y, right_x, right_y);
}
}
}
}

View File

@ -58,15 +58,29 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
int id = 1;
if (userConfig.Devices8[0] == OctoshockDll.ePeripheralType.None) PlayerAssignments[0] = -1; else PlayerAssignments[0] = id++;
if (userConfig.Devices8[1] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[1] = -1; else PlayerAssignments[1] = id++;
if (userConfig.Devices8[2] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[2] = -1; else PlayerAssignments[2] = id++;
if (userConfig.Devices8[3] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[3] = -1; else PlayerAssignments[3] = id++;
//TODO: separate sense of connect/disconnect. If we do that, then we need to make the assignments stable, here
//and put logic in the core's SetInput instead
if (!userConfig.Multitaps[0]) Devices8[1] = Devices8[2] = Devices8[3] = OctoshockDll.ePeripheralType.None;
if (!userConfig.Multitaps[1]) Devices8[5] = Devices8[6] = Devices8[7] = OctoshockDll.ePeripheralType.None;
if (userConfig.Devices8[4] == OctoshockDll.ePeripheralType.None) PlayerAssignments[4] = -1; else PlayerAssignments[4] = id++;
if (userConfig.Devices8[5] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[5] = -1; else PlayerAssignments[5] = id++;
if (userConfig.Devices8[6] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[6] = -1; else PlayerAssignments[6] = id++;
if (userConfig.Devices8[7] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[7] = -1; else PlayerAssignments[7] = id++;
//OLD LOGIC
//if (userConfig.Devices8[0] == OctoshockDll.ePeripheralType.None) PlayerAssignments[0] = -1; else PlayerAssignments[0] = id++;
//if (userConfig.Devices8[1] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[1] = -1; else PlayerAssignments[1] = id++;
//if (userConfig.Devices8[2] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[2] = -1; else PlayerAssignments[2] = id++;
//if (userConfig.Devices8[3] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[0]) PlayerAssignments[3] = -1; else PlayerAssignments[3] = id++;
//if (userConfig.Devices8[4] == OctoshockDll.ePeripheralType.None) PlayerAssignments[4] = -1; else PlayerAssignments[4] = id++;
//if (userConfig.Devices8[5] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[5] = -1; else PlayerAssignments[5] = id++;
//if (userConfig.Devices8[6] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[6] = -1; else PlayerAssignments[6] = id++;
//if (userConfig.Devices8[7] == OctoshockDll.ePeripheralType.None || !userConfig.Multitaps[1]) PlayerAssignments[7] = -1; else PlayerAssignments[7] = id++;
if (Devices8[0] == OctoshockDll.ePeripheralType.None) PlayerAssignments[0] = -1; else PlayerAssignments[0] = id++;
if (Devices8[1] == OctoshockDll.ePeripheralType.None) PlayerAssignments[1] = -1; else PlayerAssignments[1] = id++;
if (Devices8[2] == OctoshockDll.ePeripheralType.None) PlayerAssignments[2] = -1; else PlayerAssignments[2] = id++;
if (Devices8[3] == OctoshockDll.ePeripheralType.None) PlayerAssignments[3] = -1; else PlayerAssignments[3] = id++;
if (Devices8[4] == OctoshockDll.ePeripheralType.None) PlayerAssignments[4] = -1; else PlayerAssignments[4] = id++;
if (Devices8[5] == OctoshockDll.ePeripheralType.None) PlayerAssignments[5] = -1; else PlayerAssignments[5] = id++;
if (Devices8[6] == OctoshockDll.ePeripheralType.None) PlayerAssignments[6] = -1; else PlayerAssignments[6] = id++;
if (Devices8[7] == OctoshockDll.ePeripheralType.None) PlayerAssignments[7] = -1; else PlayerAssignments[7] = id++;
NumPlayers = id - 1;