224 lines
6.9 KiB
C++
224 lines
6.9 KiB
C++
|
#include "pjei.h"
|
||
|
#include "launcher/launcher.h"
|
||
|
#include "rawinput/rawinput.h"
|
||
|
#include "util/utils.h"
|
||
|
#include "misc/eamuse.h"
|
||
|
#include "games/we/io.h"
|
||
|
#include "avs/game.h"
|
||
|
|
||
|
//using namespace GameAPI;
|
||
|
|
||
|
// static stuff
|
||
|
static uint8_t STATUS_BUFFER[40];
|
||
|
static bool STATUS_BUFFER_FREEZE = false;
|
||
|
|
||
|
/*
|
||
|
* Implementations
|
||
|
*/
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_current_coinstock(int a1, uint32_t *coinstock) {
|
||
|
*coinstock = eamuse_coin_get_stock();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_consume_coinstock(int a1, uint32_t amount) {
|
||
|
return eamuse_coin_consume(amount);
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_get_softwareid(char *dst) {
|
||
|
static char DATA[] = "0140FFFFFFFFFFFFFFFF";
|
||
|
memcpy(dst, DATA, sizeof(DATA));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_get_systemid(char *dst) {
|
||
|
static char DATA[] = "0140FFFFFFFFFFFFFFFF";
|
||
|
memcpy(dst, DATA, sizeof(DATA));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_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" })) {
|
||
|
|
||
|
// get buttons
|
||
|
auto &buttons = games::we::get_buttons();
|
||
|
|
||
|
// apply buttons
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Service])) {
|
||
|
STATUS_BUFFER[16] |= 0x10;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Test])) {
|
||
|
STATUS_BUFFER[16] |= 0x20;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::CoinMech])) {
|
||
|
STATUS_BUFFER[16] |= 0x04;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Start])) {
|
||
|
STATUS_BUFFER[4] |= 0x80;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Up])) {
|
||
|
STATUS_BUFFER[4] |= 0x40;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Down])) {
|
||
|
STATUS_BUFFER[4] |= 0x20;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Left])) {
|
||
|
STATUS_BUFFER[4] |= 0x10;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::Right])) {
|
||
|
STATUS_BUFFER[4] |= 0x08;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonA])) {
|
||
|
STATUS_BUFFER[4] |= 0x04;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonB])) {
|
||
|
STATUS_BUFFER[4] |= 0x02;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonC])) {
|
||
|
STATUS_BUFFER[4] |= 0x01;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonD])) {
|
||
|
STATUS_BUFFER[6] |= 0x80;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonE])) {
|
||
|
STATUS_BUFFER[6] |= 0x40;
|
||
|
}
|
||
|
if (GameAPI::Buttons::getState(RI_MGR, buttons[games::we::Buttons::ButtonF])) {
|
||
|
STATUS_BUFFER[6] |= 0x20;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// success
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool ac_io_pjei_get_control_status_buffer(uint8_t *buffer) {
|
||
|
memcpy(buffer, STATUS_BUFFER, sizeof(STATUS_BUFFER));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_req_secplug_check() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_req_secplug_check_isfinished() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_req_secplug_missing_check() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_req_secplug_missing_check_isfinished() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_lock_coincounter(int a1) {
|
||
|
eamuse_coin_set_block(true);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_unlock_coincounter(int a1) {
|
||
|
eamuse_coin_set_block(false);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_coin_blocker_on(bool a1) {
|
||
|
eamuse_coin_set_block(true);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_coin_blocker_off(bool a1) {
|
||
|
eamuse_coin_set_block(false);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Helper method for easily setting the light values
|
||
|
*/
|
||
|
static void ac_io_pjei_control_lamp_set(uint8_t lamp_bits, uint8_t brightness) {
|
||
|
auto &lights = games::we::get_lights();
|
||
|
float value = CLAMP(brightness / 31.f, 0.f, 1.f);
|
||
|
if (lamp_bits & 0x20) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::LeftRed], value);
|
||
|
}
|
||
|
if (lamp_bits & 0x10) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::LeftGreen], value);
|
||
|
}
|
||
|
if (lamp_bits & 0x08) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::LeftBlue], value);
|
||
|
}
|
||
|
if (lamp_bits & 0x04) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::RightRed], value);
|
||
|
}
|
||
|
if (lamp_bits & 0x02) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::RightGreen], value);
|
||
|
}
|
||
|
if (lamp_bits & 0x01) {
|
||
|
GameAPI::Lights::writeLight(RI_MGR, lights[games::we::Lights::RightBlue], value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_lamp_on(uint8_t lamp_bits) {
|
||
|
ac_io_pjei_control_lamp_set(lamp_bits, 31);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_lamp_off(uint8_t lamp_bits) {
|
||
|
ac_io_pjei_control_lamp_set(lamp_bits, 0);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_lamp_bright(uint8_t lamp_bit, uint8_t brightness) {
|
||
|
ac_io_pjei_control_lamp_set(lamp_bit, brightness);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static bool __cdecl ac_io_pjei_control_lamp_mode(int mode) {
|
||
|
// mode -> [0,1] (0 is static, 1 is brightness?)
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Module stuff
|
||
|
*/
|
||
|
acio::PJEIModule::PJEIModule(HMODULE module, acio::HookMode hookMode) : ACIOModule("PJEI", module, hookMode) {
|
||
|
this->status_buffer = STATUS_BUFFER;
|
||
|
this->status_buffer_size = sizeof(STATUS_BUFFER);
|
||
|
this->status_buffer_freeze = &STATUS_BUFFER_FREEZE;
|
||
|
}
|
||
|
|
||
|
void acio::PJEIModule::attach() {
|
||
|
ACIOModule::attach();
|
||
|
|
||
|
// hooks
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_current_coinstock);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_consume_coinstock);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_get_softwareid);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_get_systemid);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_update_control_status_buffer);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_get_control_status_buffer);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_req_secplug_check);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_req_secplug_check_isfinished);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_req_secplug_missing_check);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_req_secplug_missing_check_isfinished);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_lock_coincounter);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_unlock_coincounter);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_coin_blocker_on);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_coin_blocker_off);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_lamp_on);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_lamp_off);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_lamp_bright);
|
||
|
ACIO_MODULE_HOOK(ac_io_pjei_control_lamp_mode);
|
||
|
}
|