From bb47e4f1b59a2d7e281ed46b065b3d3670ef21ef Mon Sep 17 00:00:00 2001 From: kyoubate-haruka <46010460+kyoubate-haruka@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:27:15 +0200 Subject: [PATCH] ekt: add button i/o --- common/board/config.c | 2 +- dist/ekt/config_hook.json | 8 ++++ dist/ekt/launch_satellite.bat | 11 ++--- dist/ekt/launch_terminal.bat | 9 +--- dist/ekt/segatools_satellite.ini | 10 +++- games/ekthook/dllmain.c | 17 +++---- games/ekthook/ekthook.def | 8 ++++ games/ekthook/io4.c | 80 +++++++++++++++++++------------- games/ekthook/io4.h | 17 +++++++ games/ektio/config.c | 5 +- games/ektio/config.h | 1 + games/ektio/ektio.h | 1 + games/ektio/keyboard.c | 10 ++-- 13 files changed, 115 insertions(+), 64 deletions(-) diff --git a/common/board/config.c b/common/board/config.c index 96c4146..d43e769 100644 --- a/common/board/config.c +++ b/common/board/config.c @@ -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( diff --git a/dist/ekt/config_hook.json b/dist/ekt/config_hook.json index 1e0d221..6319f45 100644 --- a/dist/ekt/config_hook.json +++ b/dist/ekt/config_hook.json @@ -1,5 +1,13 @@ { "common": { "language": "english" + }, + "network": { + "property": { + "dhcp": true + } + }, + "allnet_auth": { + "type": "1.0" } } \ No newline at end of file diff --git a/dist/ekt/launch_satellite.bat b/dist/ekt/launch_satellite.bat index 5ae973f..3fd68fc 100644 --- a/dist/ekt/launch_satellite.bat +++ b/dist/ekt/launch_satellite.bat @@ -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 diff --git a/dist/ekt/launch_terminal.bat b/dist/ekt/launch_terminal.bat index f1ab059..1c93efb 100644 --- a/dist/ekt/launch_terminal.bat +++ b/dist/ekt/launch_terminal.bat @@ -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 diff --git a/dist/ekt/segatools_satellite.ini b/dist/ekt/segatools_satellite.ini index 55908f4..b179ceb 100644 --- a/dist/ekt/segatools_satellite.ini +++ b/dist/ekt/segatools_satellite.ini @@ -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 diff --git a/games/ekthook/dllmain.c b/games/ekthook/dllmain.c index e1d2d3a..f677545 100644 --- a/games/ekthook/dllmain.c +++ b/games/ekthook/dllmain.c @@ -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); diff --git a/games/ekthook/ekthook.def b/games/ekthook/ekthook.def index 2132811..c6ac4ec 100644 --- a/games/ekthook/ekthook.def +++ b/games/ekthook/ekthook.def @@ -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 diff --git a/games/ekthook/io4.c b/games/ekthook/io4.c index eea05bc..2c1a80d 100644 --- a/games/ekthook/io4.c +++ b/games/ekthook/io4.c @@ -1,3 +1,5 @@ +#include "io4.h" + #include #include @@ -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; } diff --git a/games/ekthook/io4.h b/games/ekthook/io4.h index 5610a8a..4fff5f3 100644 --- a/games/ekthook/io4.h +++ b/games/ekthook/io4.h @@ -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); diff --git a/games/ektio/config.c b/games/ektio/config.c index 236271b..8c4d72f 100644 --- a/games/ektio/config.c +++ b/games/ektio/config.c @@ -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); diff --git a/games/ektio/config.h b/games/ektio/config.h index 0764a8b..0f828e7 100644 --- a/games/ektio/config.h +++ b/games/ektio/config.h @@ -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; diff --git a/games/ektio/ektio.h b/games/ektio/ektio.h index 45ca73e..f926031 100644 --- a/games/ektio/ektio.h +++ b/games/ektio/ektio.h @@ -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, diff --git a/games/ektio/keyboard.c b/games/ektio/keyboard.c index 2b8bebe..3c190c8 100644 --- a/games/ektio/keyboard.c +++ b/games/ektio/keyboard.c @@ -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;