ekt: add button i/o

This commit is contained in:
2025-09-01 16:27:15 +02:00
parent d9210b52e1
commit bb47e4f1b5
13 changed files with 115 additions and 64 deletions

View File

@ -74,7 +74,7 @@ void aime_config_load(struct aime_config *cfg, const wchar_t *filename)
cfg->enable = GetPrivateProfileIntW(L"aime", L"enable", 1, filename);
cfg->port_no = GetPrivateProfileIntW(L"aime", L"portNo", 0, filename);
cfg->high_baudrate = GetPrivateProfileIntW(L"aime", L"highBaud", 1, filename);
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 0, filename);
cfg->gen = GetPrivateProfileIntW(L"aime", L"gen", 3, filename);
cfg->proxy_flag = GetPrivateProfileIntW(L"aime", L"proxyFlag", 2, filename);
GetPrivateProfileStringW(

View File

@ -1,5 +1,13 @@
{
"common": {
"language": "english"
},
"network": {
"property": {
"dhcp": true
}
},
"allnet_auth": {
"type": "1.0"
}
}

View File

@ -1,15 +1,10 @@
@echo off
set SEGATOOLS_CONFIG_PATH=..\segatools_satellite.ini
set SEGATOOLS_CONFIG_PATH=.\segatools_satellite.ini
pushd %~dp0
pushd PackageBase
start /min "AM Daemon" ..\inject -d -k ..\ekthook.dll amdaemon.exe -c config_sate.json ..\config_hook.json
popd
pushd exe
..\inject -d -k ..\ekthook.dll ekt.exe -logfile game.log -screen-fullscreen 0 -screen-width 1920 -screen-height 1080 -screen-quality Ultra -silent-crashes
popd
exit /b 0
start /min "AM Daemon" inject -d -k ekthook.dll PackageBase\amdaemon.exe -c PackageBase\config_sate.json config_hook.json
inject -d -k ekthook.dll exe\ekt.exe -logfile game.log -screen-fullscreen 0 -screen-width 1920 -screen-height 1080 -screen-quality Ultra -silent-crashes
taskkill /f /im amdaemon.exe > nul 2>&1

View File

@ -3,13 +3,8 @@ set SEGATOOLS_CONFIG_PATH=..\segatools_terminal.ini
pushd %~dp0
pushd PackageBase
start /min "AM Daemon" ..\inject -d -k ..\ekthook.dll amdaemon.exe -c config_sate.json ..\config_hook.json
popd
pushd exe
..\inject -d -k ..\ekthook.dll ekt.exe -logfile game.log -screen-fullscreen 0 -screen-width 1920 -screen-height 1080 -screen-quality Ultra -silent-crashes
popd
exit /b 0
start /min "AM Daemon" inject -d -k ekthook.dll PackageBase\amdaemon.exe -c PackageBase\config_terminal.json config_hook.json
inject -d -k ekthook.dll exe\ekt.exe -logfile game.log -screen-fullscreen 0 -screen-width 1920 -screen-height 1080 -screen-quality Ultra -silent-crashes
taskkill /f /im amdaemon.exe > nul 2>&1

View File

@ -151,6 +151,7 @@ start=0x42
stratagem=0x43
stratagem_lock=0x44
hougu=0x45
ryuuha=0x46
tenkey_0=0x60
tenkey_1=0x61
@ -165,6 +166,11 @@ tenkey_9=0x69
tenkey_clear=0x6E
tenkey_enter=0x0D
vol_down=0x6D
vol_up=0x6B
vol_up=0x21
vol_down=0x22
trackball_up=0x26
trackball_right=0x27
trackball_down=0x28
trackball_left=0x25
speed=1

View File

@ -24,13 +24,10 @@
/*
* Eiketsu Taisen
*
* IP: 192.168.189.0
*
* SATELLITE: Model Type 1
*
* COM2: LED
* COM3: AIME
* COM3: "TM LED"
* COM4: FPR / Y3
*
* TERMINAL: Model Type 2
@ -45,7 +42,7 @@ static process_entry_t ekt_startup;
static struct ekt_hook_config ekt_hook_cfg;
static const wchar_t *target_modules[] = {
L"Y3CodeReaderNE.dll",
L"Y3CodeReaderNE.dll"
};
static const size_t target_modules_len = _countof(target_modules);
@ -111,12 +108,14 @@ static DWORD CALLBACK ekt_pre_startup(void)
}
/* Initialize Terminal/Satellite hooks */
if (strncmp(ekt_hook_cfg.platform.nusec.platform_id, "AAV1", 4) == 0) {
if (strncmp(ekt_hook_cfg.platform.nusec.platform_id, "ACA1", 4) == 0) {
// Terminal
is_terminal = true;
} else if (strncmp(ekt_hook_cfg.platform.nusec.platform_id, "AAV2", 4) == 0) {
// Satellite
is_terminal = false;
dprintf("Mode: Satellite\n");
} else if (strncmp(ekt_hook_cfg.platform.nusec.platform_id, "ACA2", 4) == 0) {
// Satellite
is_terminal = true;
dprintf("Mode: Terminal\n");
} else {
// Unknown
dprintf("Unknown platform ID: %s\n", ekt_hook_cfg.platform.nusec.platform_id);
@ -154,6 +153,8 @@ static DWORD CALLBACK ekt_pre_startup(void)
goto fail;
}
dvd_hook_init(&ekt_hook_cfg.dvd, ekt_hook_mod);
unity_hook_init(&ekt_hook_cfg.unity, ekt_hook_mod, unity_hook_callback);
y3_hook_init(&ekt_hook_cfg.y3, ekt_hook_mod);

View File

@ -7,6 +7,14 @@ EXPORTS
aime_io_nfc_get_aime_id
aime_io_nfc_get_felica_id
aime_io_nfc_poll
ekt_io_get_api_version
ekt_io_get_gamebtns
ekt_io_get_opbtns
ekt_io_get_trackball_position
ekt_io_init
ekt_io_poll
ekt_io_led_init
ekt_io_led_set_colors
API_DLLVersion @1
API_GetLastError @2
API_GetErrorMessage @3

View File

@ -1,3 +1,5 @@
#include "io4.h"
#include <windows.h>
#include <assert.h>
@ -73,11 +75,11 @@ static HRESULT ekt_io4_poll(void *ctx, struct io4_state *state)
}
if (opbtn & EKT_IO_OPBTN_SW1) {
state->buttons[0] |= 1 << 0; // TODO
state->buttons[0] |= 1 << 2;
}
if (opbtn & EKT_IO_OPBTN_SW2) {
state->buttons[0] |= 1 << 0; // TODO
state->buttons[0] |= 1 << 3;
}
if (opbtn & EKT_IO_OPBTN_COIN) {
@ -85,105 +87,119 @@ static HRESULT ekt_io4_poll(void *ctx, struct io4_state *state)
}
state->chutes[0] = coins << 8;
// TODO: indexes
if (!io_is_terminal) {
if (gamebtn & EKT_IO_GAMEBTN_HOUGU) {
state->buttons[1] |= 1 << 14;
}
if (gamebtn & EKT_IO_GAMEBTN_RYUUHA) {
state->buttons[1] |= 1 << 12;
}
if (gamebtn & EKT_IO_GAMEBTN_MENU) {
state->buttons[0] |= 1 << 7;
state->buttons[0] |= 1 << 13;
}
if (gamebtn & EKT_IO_GAMEBTN_START) {
state->buttons[0] |= 1 << 5;
state->buttons[0] |= 1 << 7;
}
if (gamebtn & EKT_IO_GAMEBTN_STRATAGEM) {
state->buttons[0] |= 1 << 2;
state->buttons[1] |= 1 << 15;
}
if (gamebtn & EKT_IO_GAMEBTN_STRATAGEM_LOCK) {
state->buttons[0] |= 1 << 2;
state->buttons[1] |= 1 << 13;
}
if (gamebtn & EKT_IO_GAMEBTN_VOL_DOWN) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 10;
}
if (gamebtn & EKT_IO_GAMEBTN_VOL_UP) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 11;
}
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_0) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C2 : EKT_NUMPAD_TERM_C2;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R4 : EKT_NUMPAD_TERM_R4;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_1) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C1 : EKT_NUMPAD_TERM_C1;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R1 : EKT_NUMPAD_TERM_R1;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_2) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C2 : EKT_NUMPAD_TERM_C2;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R1 : EKT_NUMPAD_TERM_R1;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_3) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C3 : EKT_NUMPAD_TERM_C3;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R1 : EKT_NUMPAD_TERM_R1;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_4) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C1 : EKT_NUMPAD_TERM_C1;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R2 : EKT_NUMPAD_TERM_R2;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_5) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C2 : EKT_NUMPAD_TERM_C2;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R2 : EKT_NUMPAD_TERM_R2;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_6) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C3 : EKT_NUMPAD_TERM_C3;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R2 : EKT_NUMPAD_TERM_R2;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_7) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C1 : EKT_NUMPAD_TERM_C1;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R3 : EKT_NUMPAD_TERM_R3;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_8) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C2 : EKT_NUMPAD_TERM_C2;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R3 : EKT_NUMPAD_TERM_R3;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_9) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C3 : EKT_NUMPAD_TERM_C3;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R3 : EKT_NUMPAD_TERM_R3;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_CLEAR) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C1 : EKT_NUMPAD_TERM_C1;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R4 : EKT_NUMPAD_TERM_R4;
}
if (gamebtn & EKT_IO_GAMEBTN_NUMPAD_ENTER) {
state->buttons[0] |= 1 << (io_is_terminal ? 4 : 4);
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_C3 : EKT_NUMPAD_TERM_C3;
state->buttons[0] |= !io_is_terminal ? EKT_NUMPAD_SATE_R4 : EKT_NUMPAD_TERM_R4;
}
if (io_is_terminal) {
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_CANCEL) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 0;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_DECIDE) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 1;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_LEFT) {
state->buttons[0] |= 1 << 4;
state->buttons[0] |= 1 << 3;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_UP) {
state->buttons[0] |= 1 << 4;
state->buttons[0] |= 1 << 5;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_RIGHT) {
state->buttons[0] |= 1 << 4;
state->buttons[0] |= 1 << 2;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_DOWN) {
@ -191,18 +207,16 @@ static HRESULT ekt_io4_poll(void *ctx, struct io4_state *state)
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_LEFT_2) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 3;
}
if (gamebtn & EKT_IO_GAMEBTN_TERMINAL_RIGHT_2) {
state->buttons[0] |= 1 << 4;
state->buttons[1] |= 1 << 2;
}
}
state->adcs[0] = 1;
state->adcs[1] = 1;
state->adcs[2] = x;
state->adcs[3] = y;
state->spinners[2] = x;
state->spinners[3] = y;
return S_OK;
}

View File

@ -4,4 +4,21 @@
#include "board/io4.h"
enum {
EKT_NUMPAD_SATE_R1 = 1 << 1,
EKT_NUMPAD_SATE_R2 = 1 << 0,
EKT_NUMPAD_SATE_R3 = 1 << 15,
EKT_NUMPAD_SATE_R4 = 1 << 14,
EKT_NUMPAD_SATE_C1 = 1 << 12,
EKT_NUMPAD_SATE_C2 = 1 << 11,
EKT_NUMPAD_SATE_C3 = 1 << 10,
EKT_NUMPAD_TERM_R1 = 1 << 1,
EKT_NUMPAD_TERM_R2 = 1 << 0,
EKT_NUMPAD_TERM_R3 = 1 << 15,
EKT_NUMPAD_TERM_R4 = 1 << 14,
EKT_NUMPAD_TERM_C1 = 1 << 13,
EKT_NUMPAD_TERM_C2 = 1 << 12,
EKT_NUMPAD_TERM_C3 = 1 << 11,
};
HRESULT ekt_io4_hook_init(const struct io4_config *cfg, bool is_terminal);

View File

@ -18,6 +18,7 @@ void ekt_kb_config_load(
cfg->vk_stratagem = GetPrivateProfileIntW(L"io4", L"stratagem", 'D', filename);
cfg->vk_stratagem_lock = GetPrivateProfileIntW(L"io4", L"stratagem_lock", 'F', filename);
cfg->vk_hougu = GetPrivateProfileIntW(L"io4", L"hougu", 'G', filename);
cfg->vk_ryuuha = GetPrivateProfileIntW(L"io4", L"ryuuha", 'H', filename);
cfg->vk_tenkey_0 = GetPrivateProfileIntW(L"io4", L"tenkey_0", VK_NUMPAD0, filename);
cfg->vk_tenkey_1 = GetPrivateProfileIntW(L"io4", L"tenkey_1", VK_NUMPAD1, filename);
@ -32,8 +33,8 @@ void ekt_kb_config_load(
cfg->vk_tenkey_clear = GetPrivateProfileIntW(L"io4", L"tenkey_clear", VK_DECIMAL, filename);
cfg->vk_tenkey_enter = GetPrivateProfileIntW(L"io4", L"tenkey_enter", VK_RETURN, filename);
cfg->vk_vol_down = GetPrivateProfileIntW(L"io4", L"vol_down", VK_SUBTRACT, filename);
cfg->vk_vol_up = GetPrivateProfileIntW(L"io4", L"vol_up", VK_ADD, filename);
cfg->vk_vol_down = GetPrivateProfileIntW(L"io4", L"vol_down", VK_NEXT, filename);
cfg->vk_vol_up = GetPrivateProfileIntW(L"io4", L"vol_up", VK_PRIOR, filename);
cfg->vk_terminal_decide = GetPrivateProfileIntW(L"io4", L"decide", 'A', filename);
cfg->vk_terminal_cancel = GetPrivateProfileIntW(L"io4", L"cancel", 'S', filename);

View File

@ -11,6 +11,7 @@ struct ekt_kb_config {
uint8_t vk_stratagem;
uint8_t vk_stratagem_lock;
uint8_t vk_hougu;
uint8_t vk_ryuuha;
uint8_t vk_tenkey_0;
uint8_t vk_tenkey_1;

View File

@ -18,6 +18,7 @@ enum {
EKT_IO_GAMEBTN_STRATAGEM = 0x04,
EKT_IO_GAMEBTN_STRATAGEM_LOCK = 0x08,
EKT_IO_GAMEBTN_HOUGU = 0x10,
EKT_IO_GAMEBTN_RYUUHA = 0x20,
EKT_IO_GAMEBTN_NUMPAD_0 = 0x100,
EKT_IO_GAMEBTN_NUMPAD_1 = 0x200,
EKT_IO_GAMEBTN_NUMPAD_2 = 0x400,

View File

@ -39,7 +39,7 @@ HRESULT ekt_kb_init(const struct ekt_kb_config* cfg, const struct ekt_io_backend
static void ekt_kb_get_gamebtns(uint32_t* gamebtn_out) {
assert(gamebtn_out != NULL);
uint8_t gamebtn = 0;
uint32_t gamebtn = 0;
if (GetAsyncKeyState(config.vk_hougu) & 0x8000) {
gamebtn |= EKT_IO_GAMEBTN_HOUGU;
@ -61,6 +61,10 @@ static void ekt_kb_get_gamebtns(uint32_t* gamebtn_out) {
gamebtn |= EKT_IO_GAMEBTN_STRATAGEM_LOCK;
}
if (GetAsyncKeyState(config.vk_ryuuha) & 0x8000) {
gamebtn |= EKT_IO_GAMEBTN_RYUUHA;
}
if (GetAsyncKeyState(config.vk_tenkey_0) & 0x8000) {
gamebtn |= EKT_IO_GAMEBTN_NUMPAD_0;
}
@ -162,9 +166,9 @@ static void ekt_kb_get_trackball(uint8_t* x, uint8_t* y) {
current_x += config.speed;
}
if (GetAsyncKeyState(config.y_down) & 0x8000) {
current_y -= config.speed;
} else if (GetAsyncKeyState(config.y_up) & 0x8000) {
current_y += config.speed;
} else if (GetAsyncKeyState(config.y_up) & 0x8000) {
current_y -= config.speed;
}
*x = current_x;