LilyPad: Make D-pad buttons independent of each other (#1412)

Fixes games that require dance pad support (Dance Dance
revolution series).
This commit is contained in:
FlatOutPS2 2016-06-19 13:25:00 +02:00 committed by Jonathan Li
parent 4318b83414
commit ce8b9c153c
1 changed files with 41 additions and 49 deletions

View File

@ -163,11 +163,11 @@ struct Stick {
// Sum of states of all controls for a pad (Not including toggles). // Sum of states of all controls for a pad (Not including toggles).
struct ButtonSum { struct ButtonSum {
int buttons[12]; int buttons[16];
Stick sticks[3]; Stick sticks[2];
}; };
#define PAD_SAVE_STATE_VERSION 3 #define PAD_SAVE_STATE_VERSION 4
// Freeze data, for a single pad. Basically has all pad state that // Freeze data, for a single pad. Basically has all pad state that
// a PS2 can set. // a PS2 can set.
@ -330,18 +330,7 @@ void AddForce(ButtonSum *sum, u8 cmd, int delta = 255) {
} }
// D-pad. Command numbering is based on ordering of digital values. // D-pad. Command numbering is based on ordering of digital values.
else if (cmd < 0x18) { else if (cmd < 0x18) {
if (cmd == 0x14) { sum->buttons[cmd-0x08] += delta;
sum->sticks[0].vert -= delta;
}
else if (cmd == 0x15) {
sum->sticks[0].horiz += delta;
}
else if (cmd == 0x16) {
sum->sticks[0].vert += delta;
}
else if (cmd == 0x17) {
sum->sticks[0].horiz -= delta;
}
} }
else if (cmd < 0x20) { else if (cmd < 0x20) {
sum->buttons[cmd-0x10-4] += delta; sum->buttons[cmd-0x10-4] += delta;
@ -349,31 +338,31 @@ void AddForce(ButtonSum *sum, u8 cmd, int delta = 255) {
// Left stick. // Left stick.
else if (cmd < 0x24) { else if (cmd < 0x24) {
if (cmd == 32) { if (cmd == 32) {
sum->sticks[2].vert -= delta; sum->sticks[1].vert -= delta;
} }
else if (cmd == 33) { else if (cmd == 33) {
sum->sticks[2].horiz += delta; sum->sticks[1].horiz += delta;
} }
else if (cmd == 34) { else if (cmd == 34) {
sum->sticks[2].vert += delta; sum->sticks[1].vert += delta;
} }
else if (cmd == 35) { else if (cmd == 35) {
sum->sticks[2].horiz -= delta; sum->sticks[1].horiz -= delta;
} }
} }
// Right stick. // Right stick.
else if (cmd < 0x28) { else if (cmd < 0x28) {
if (cmd == 36) { if (cmd == 36) {
sum->sticks[1].vert -= delta; sum->sticks[0].vert -= delta;
} }
else if (cmd == 37) { else if (cmd == 37) {
sum->sticks[1].horiz += delta; sum->sticks[0].horiz += delta;
} }
else if (cmd == 38) { else if (cmd == 38) {
sum->sticks[1].vert += delta; sum->sticks[0].vert += delta;
} }
else if (cmd == 39) { else if (cmd == 39) {
sum->sticks[1].horiz -= delta; sum->sticks[0].horiz -= delta;
} }
} }
} }
@ -415,7 +404,7 @@ void ProcessButtonBinding(Binding *b, ButtonSum *sum, int value) {
// which is why I use 9 bits of all sticks. For left and right sticks, I have to remove a bit before sending. // which is why I use 9 bits of all sticks. For left and right sticks, I have to remove a bit before sending.
void CapSum(ButtonSum *sum) { void CapSum(ButtonSum *sum) {
int i; int i;
for (i=0; i<3; i++) { for (i=0; i<2; i++) {
#ifdef __linux__ #ifdef __linux__
int div = std::max(abs(sum->sticks[i].horiz), abs(sum->sticks[i].vert)); int div = std::max(abs(sum->sticks[i].horiz), abs(sum->sticks[i].vert));
#else #else
@ -426,7 +415,7 @@ void CapSum(ButtonSum *sum) {
sum->sticks[i].vert = sum->sticks[i].vert * 255 / div; sum->sticks[i].vert = sum->sticks[i].vert * 255 / div;
} }
} }
for (i=0; i<12; i++) { for (i=0; i<16; i++) {
sum->buttons[i] = Cap(sum->buttons[i]); sum->buttons[i] = Cap(sum->buttons[i]);
} }
} }
@ -586,7 +575,7 @@ void Update(unsigned int port, unsigned int slot) {
if (config.padConfigs[port][slot].type == DisabledPad || !pads[port][slot].initialized) continue; if (config.padConfigs[port][slot].type == DisabledPad || !pads[port][slot].initialized) continue;
if (config.padConfigs[port][slot].type == GuitarPad) { if (config.padConfigs[port][slot].type == GuitarPad) {
if (!config.GH2) { if (!config.GH2) {
s[port][slot].sticks[1].vert = -s[port][slot].sticks[1].vert; s[port][slot].sticks[0].vert = -s[port][slot].sticks[0].vert;
} }
// GH2 hack. // GH2 hack.
else if (config.GH2) { else if (config.GH2) {
@ -604,7 +593,7 @@ void Update(unsigned int port, unsigned int slot) {
int id = idList[i] - 0x1104; int id = idList[i] - 0x1104;
s[port][slot].buttons[id] = values[i]; s[port][slot].buttons[id] = values[i];
} }
if (abs(s[port][slot].sticks[0].vert) <= 48) { if (s[port][slot].buttons[14] <= 48 && s[port][slot].buttons[12] <= 48) {
for (int i=0; i<5; i++) { for (int i=0; i<5; i++) {
unsigned int id = idList[i] - 0x1104; unsigned int id = idList[i] - 0x1104;
if (pads[port][slot].sum.buttons[id] < s[port][slot].buttons[id]) { if (pads[port][slot].sum.buttons[id] < s[port][slot].buttons[id]) {
@ -612,7 +601,7 @@ void Update(unsigned int port, unsigned int slot) {
} }
} }
} }
else if (abs(pads[port][slot].sum.sticks[0].vert) <= 48) { else if (pads[port][slot].sum.buttons[14] <= 48 && pads[port][slot].sum.buttons[12] <= 48) {
for (int i=0; i<5; i++) { for (int i=0; i<5; i++) {
unsigned int id = idList[i] - 0x1104; unsigned int id = idList[i] - 0x1104;
if (pads[port][slot].sum.buttons[id]) { if (pads[port][slot].sum.buttons[id]) {
@ -624,11 +613,15 @@ void Update(unsigned int port, unsigned int slot) {
} }
if (pads[port][slot].mode == 0x41) { if (pads[port][slot].mode == 0x41) {
for (int i=1; i<=2; i++) { for (int i=0; i<=1; i++) {
if (abs(s[port][slot].sticks[i].horiz) >= 100) if (s[port][slot].sticks[i].horiz >= 100)
s[port][slot].sticks[0].horiz += s[port][slot].sticks[i].horiz; s[port][slot].buttons[13] += s[port][slot].sticks[i].horiz;
if (abs(s[port][slot].sticks[i].vert) >= 100) if (s[port][slot].sticks[i].horiz <= -100)
s[port][slot].sticks[0].vert += s[port][slot].sticks[i].vert; s[port][slot].buttons[15] -= s[port][slot].sticks[i].horiz;
if (s[port][slot].sticks[i].vert >= 100)
s[port][slot].buttons[14] += s[port][slot].sticks[i].vert;
if (s[port][slot].sticks[i].vert <= -100)
s[port][slot].buttons[12] -= s[port][slot].sticks[i].vert;
} }
} }
@ -1195,15 +1188,16 @@ u8 CALLBACK PADpoll(u8 value) {
for (i = 0; i<8; i++) { for (i = 0; i<8; i++) {
b2 -= (sum->buttons[i+4] > 0) << i; b2 -= (sum->buttons[i+4] > 0) << i;
} }
if (config.padConfigs[query.port][query.slot].type == GuitarPad && !config.GH2) { if (config.padConfigs[query.port][query.slot].type == GuitarPad && !config.GH2) {
sum->sticks[0].horiz = -255; sum->buttons[15] = 255;
// Not sure about this. Forces wammy to be from 0 to 0x7F. // Not sure about this. Forces wammy to be from 0 to 0x7F.
// if (sum->sticks[2].vert > 0) sum->sticks[2].vert = 0; // if (sum->sticks[2].vert > 0) sum->sticks[2].vert = 0;
} }
b1 -= ((sum->sticks[0].vert < 0) << 4);
b1 -= ((sum->sticks[0].horiz > 0) << 5); for (i = 4; i<8; i++) {
b1 -= ((sum->sticks[0].vert > 0) << 6); b1 -= (sum->buttons[i+8] > 0) << i;
b1 -= ((sum->sticks[0].horiz < 0) << 7); }
//Left, Right and Down are always pressed on Pop'n Music controller. //Left, Right and Down are always pressed on Pop'n Music controller.
if (config.padConfigs[query.port][query.slot].type == PopnPad) if (config.padConfigs[query.port][query.slot].type == PopnPad)
@ -1214,10 +1208,10 @@ u8 CALLBACK PADpoll(u8 value) {
query.numBytes = 5; query.numBytes = 5;
if (pad->mode != MODE_DIGITAL) { if (pad->mode != MODE_DIGITAL) {
query.response[5] = Cap((sum->sticks[1].horiz+255)/2); query.response[5] = Cap((sum->sticks[0].horiz+255)/2);
query.response[6] = Cap((sum->sticks[1].vert+255)/2); query.response[6] = Cap((sum->sticks[0].vert+255)/2);
query.response[7] = Cap((sum->sticks[2].horiz+255)/2); query.response[7] = Cap((sum->sticks[1].horiz+255)/2);
query.response[8] = Cap((sum->sticks[2].vert+255)/2); query.response[8] = Cap((sum->sticks[1].vert+255)/2);
query.numBytes = 9; query.numBytes = 9;
if (pad->mode != MODE_ANALOG) { if (pad->mode != MODE_ANALOG) {
@ -1225,14 +1219,12 @@ u8 CALLBACK PADpoll(u8 value) {
//query.response[3] &= pad->mask[0]; //query.response[3] &= pad->mask[0];
//query.response[4] &= pad->mask[1]; //query.response[4] &= pad->mask[1];
// Each value is from -255 to 255, so have to use cap to convert
// negative values to 0.
query.response[9] = Cap(sum->sticks[0].horiz);
query.response[10] = Cap(-sum->sticks[0].horiz);
query.response[11] = Cap(-sum->sticks[0].vert);
query.response[12] = Cap(sum->sticks[0].vert);
// No need to cap these, already done int CapSum(). // No need to cap these, already done int CapSum().
query.response[9] = (unsigned char)sum->buttons[13]; //D-pad right
query.response[10] = (unsigned char)sum->buttons[15]; //D-pad left
query.response[11] = (unsigned char)sum->buttons[12]; //D-pad up
query.response[12] = (unsigned char)sum->buttons[14]; //D-pad down
query.response[13] = (unsigned char) sum->buttons[8]; query.response[13] = (unsigned char) sum->buttons[8];
query.response[14] = (unsigned char) sum->buttons[9]; query.response[14] = (unsigned char) sum->buttons[9];
query.response[15] = (unsigned char) sum->buttons[10]; query.response[15] = (unsigned char) sum->buttons[10];