157 lines
5.2 KiB
C++
157 lines
5.2 KiB
C++
#include "pjec.h"
|
|
#include "launcher/launcher.h"
|
|
#include "rawinput/rawinput.h"
|
|
#include "util/utils.h"
|
|
#include "avs/game.h"
|
|
#include "games/we/io.h"
|
|
|
|
//using namespace GameAPI;
|
|
|
|
// static stuff
|
|
static uint8_t STATUS_BUFFER[72];
|
|
static bool STATUS_BUFFER_FREEZE = false;
|
|
|
|
/*
|
|
* Implementations
|
|
*/
|
|
|
|
static bool __cdecl ac_io_pjec_get_ps2() {
|
|
return true;
|
|
}
|
|
|
|
static void __cdecl ac_io_pjec_get_control_status_buffer(uint8_t *buffer) {
|
|
memcpy(buffer, STATUS_BUFFER, sizeof(STATUS_BUFFER));
|
|
}
|
|
|
|
static bool __cdecl ac_io_pjec_update_control_status_buffer() {
|
|
|
|
// check freeze
|
|
if (STATUS_BUFFER_FREEZE) {
|
|
return true;
|
|
}
|
|
|
|
// clear buffer
|
|
memset(STATUS_BUFFER, 0, sizeof(STATUS_BUFFER));
|
|
|
|
// Winning Eleven
|
|
if (avs::game::is_model({ "KCK", "NCK" })) {
|
|
auto &buttons = games::we::get_buttons();
|
|
auto &analogs = games::we::get_analogs();
|
|
|
|
/*
|
|
* Device Types
|
|
* 0x00 - Unknown Device
|
|
* 0x01 - Mouse
|
|
* 0x02 - Rotate Controller
|
|
* 0x03 - Gun Controller K
|
|
* 0x04 - Digital Controller <- Accepted
|
|
* 0x05 - Analog Joystick
|
|
* 0x06 - Gun Controller N
|
|
* 0x07 - Analog Controller <- Accepted
|
|
* 0x08 - USB Analog Controller
|
|
*/
|
|
|
|
// set device type
|
|
STATUS_BUFFER[0] = 0x07;
|
|
|
|
// set device present
|
|
STATUS_BUFFER[2] = 0x5A;
|
|
|
|
// reset analogs to center
|
|
STATUS_BUFFER[8] = 0x7F;
|
|
STATUS_BUFFER[9] = 0x7F;
|
|
STATUS_BUFFER[10] = 0x7F;
|
|
STATUS_BUFFER[11] = 0x7F;
|
|
|
|
// apply analogs
|
|
if (analogs[games::we::Analogs::PadStickLeftX].isSet()) {
|
|
STATUS_BUFFER[8] = (uint8_t) (GameAPI::Analogs::getState(RI_MGR,
|
|
analogs[games::we::Analogs::PadStickLeftX]) * 255.9999f);
|
|
}
|
|
if (analogs[games::we::Analogs::PadStickLeftY].isSet()) {
|
|
STATUS_BUFFER[9] = (uint8_t) (GameAPI::Analogs::getState(RI_MGR,
|
|
analogs[games::we::Analogs::PadStickLeftY]) * 255.9999f);
|
|
}
|
|
if (analogs[games::we::Analogs::PadStickRightX].isSet()) {
|
|
STATUS_BUFFER[10] = (uint8_t) (GameAPI::Analogs::getState(RI_MGR,
|
|
analogs[games::we::Analogs::PadStickRightX]) * 255.9999f);
|
|
}
|
|
if (analogs[games::we::Analogs::PadStickRightY].isSet()) {
|
|
STATUS_BUFFER[11] = (uint8_t) (GameAPI::Analogs::getState(RI_MGR,
|
|
analogs[games::we::Analogs::PadStickRightY]) * 255.9999f);
|
|
}
|
|
|
|
// apply buttons
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadStart])) {
|
|
STATUS_BUFFER[4] |= 0x08;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadSelect])) {
|
|
STATUS_BUFFER[4] |= 0x01;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadUp])) {
|
|
STATUS_BUFFER[4] |= 0x10;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadDown])) {
|
|
STATUS_BUFFER[4] |= 0x40;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadLeft])) {
|
|
STATUS_BUFFER[4] |= 0x80;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadRight])) {
|
|
STATUS_BUFFER[4] |= 0x20;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadTriangle])) {
|
|
STATUS_BUFFER[5] |= 0x10;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadCross])) {
|
|
STATUS_BUFFER[5] |= 0x40;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadSquare])) {
|
|
STATUS_BUFFER[5] |= 0x80;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadCircle])) {
|
|
STATUS_BUFFER[5] |= 0x20;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadL1])) {
|
|
STATUS_BUFFER[5] |= 0x04;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadL2])) {
|
|
STATUS_BUFFER[5] |= 0x01;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadL3])) {
|
|
STATUS_BUFFER[4] |= 0x02;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadR1])) {
|
|
STATUS_BUFFER[5] |= 0x08;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadR2])) {
|
|
STATUS_BUFFER[5] |= 0x02;
|
|
}
|
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::PadR3])) {
|
|
STATUS_BUFFER[4] |= 0x04;
|
|
}
|
|
}
|
|
|
|
// success
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Module stuff
|
|
*/
|
|
|
|
acio::PJECModule::PJECModule(HMODULE module, acio::HookMode hookMode) : ACIOModule("PJEC", module, hookMode) {
|
|
this->status_buffer = STATUS_BUFFER;
|
|
this->status_buffer_size = sizeof(STATUS_BUFFER);
|
|
this->status_buffer_freeze = &STATUS_BUFFER_FREEZE;
|
|
}
|
|
|
|
void acio::PJECModule::attach() {
|
|
ACIOModule::attach();
|
|
|
|
// hooks
|
|
ACIO_MODULE_HOOK(ac_io_pjec_get_ps2);
|
|
ACIO_MODULE_HOOK(ac_io_pjec_get_control_status_buffer);
|
|
ACIO_MODULE_HOOK(ac_io_pjec_update_control_status_buffer);
|
|
}
|