diff --git a/Makefile b/Makefile index 77804bc..437b97f 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,7 @@ endif $(TWEAK_NAME)_CFLAGS := -fobjc-arc -Wno-unused-function \ -D$(BUILD_COMMIT_DEFINE)=\"$(BUILD_COMMIT)\" \ -DBUILD_VERSION=\"$(PACKAGE_VERSION)\" \ + -I$(TWEAK_SOURCES_DIR) \ -ISources/Chinlan ifdef FINAL_RELEASE $(TWEAK_NAME)_CFLAGS += -DFINAL_RELEASE=1 diff --git a/Sources/KiouEngineBridge/ChinlanDispatcher.m b/Sources/KiouEngineBridge/Chinlan/Dispatcher.m similarity index 100% rename from Sources/KiouEngineBridge/ChinlanDispatcher.m rename to Sources/KiouEngineBridge/Chinlan/Dispatcher.m diff --git a/Sources/KiouEngineBridge/Csa_Convert.h b/Sources/KiouEngineBridge/Csa/Convert.h similarity index 100% rename from Sources/KiouEngineBridge/Csa_Convert.h rename to Sources/KiouEngineBridge/Csa/Convert.h diff --git a/Sources/KiouEngineBridge/Csa_Convert.m b/Sources/KiouEngineBridge/Csa/Convert.m similarity index 99% rename from Sources/KiouEngineBridge/Csa_Convert.m rename to Sources/KiouEngineBridge/Csa/Convert.m index 2540d2a..4bfac21 100644 --- a/Sources/KiouEngineBridge/Csa_Convert.m +++ b/Sources/KiouEngineBridge/Csa/Convert.m @@ -1,4 +1,4 @@ -#import "Csa_Convert.h" +#import "Csa/Convert.h" // =========================================================================== // Csa_Convert — implementation. diff --git a/Sources/KiouEngineBridge/Csa_Engine.h b/Sources/KiouEngineBridge/Csa/Engine.h similarity index 99% rename from Sources/KiouEngineBridge/Csa_Engine.h rename to Sources/KiouEngineBridge/Csa/Engine.h index e51421a..9bb2000 100644 --- a/Sources/KiouEngineBridge/Csa_Engine.h +++ b/Sources/KiouEngineBridge/Csa/Engine.h @@ -4,7 +4,7 @@ #import #import -#import "Csa_Convert.h" +#import "Csa/Convert.h" // =========================================================================== // Csa_Engine — CSA server-side state machine for the TCP transport. diff --git a/Sources/KiouEngineBridge/Csa_Engine.m b/Sources/KiouEngineBridge/Csa/Engine.m similarity index 99% rename from Sources/KiouEngineBridge/Csa_Engine.m rename to Sources/KiouEngineBridge/Csa/Engine.m index c6420dd..6a63fa9 100644 --- a/Sources/KiouEngineBridge/Csa_Engine.m +++ b/Sources/KiouEngineBridge/Csa/Engine.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Csa_Engine.h" +#import "Csa/Engine.h" #import #import diff --git a/Sources/KiouEngineBridge/Csa_GameInfo.m b/Sources/KiouEngineBridge/Csa/GameInfo.m similarity index 99% rename from Sources/KiouEngineBridge/Csa_GameInfo.m rename to Sources/KiouEngineBridge/Csa/GameInfo.m index c536e98..d76a4a5 100644 --- a/Sources/KiouEngineBridge/Csa_GameInfo.m +++ b/Sources/KiouEngineBridge/Csa/GameInfo.m @@ -1,6 +1,6 @@ #import "Internal.h" -#import "Csa_Convert.h" -#import "Csa_Engine.h" +#import "Csa/Convert.h" +#import "Csa/Engine.h" #import #import diff --git a/Sources/KiouEngineBridge/Server_CSA.m b/Sources/KiouEngineBridge/Csa/Server.m similarity index 100% rename from Sources/KiouEngineBridge/Server_CSA.m rename to Sources/KiouEngineBridge/Csa/Server.m diff --git a/Sources/KiouEngineBridge/Hook_AccountObserve.m b/Sources/KiouEngineBridge/Hooks/AccountObserve.m similarity index 99% rename from Sources/KiouEngineBridge/Hook_AccountObserve.m rename to Sources/KiouEngineBridge/Hooks/AccountObserve.m index 861f085..facb3f1 100644 --- a/Sources/KiouEngineBridge/Hook_AccountObserve.m +++ b/Sources/KiouEngineBridge/Hooks/AccountObserve.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import // =========================================================================== diff --git a/Sources/KiouEngineBridge/Hook_AfkSuppress.m b/Sources/KiouEngineBridge/Hooks/AfkSuppress.m similarity index 100% rename from Sources/KiouEngineBridge/Hook_AfkSuppress.m rename to Sources/KiouEngineBridge/Hooks/AfkSuppress.m diff --git a/Sources/KiouEngineBridge/Hook_BackToTitleSuppress.m b/Sources/KiouEngineBridge/Hooks/BackToTitleSuppress.m similarity index 100% rename from Sources/KiouEngineBridge/Hook_BackToTitleSuppress.m rename to Sources/KiouEngineBridge/Hooks/BackToTitleSuppress.m diff --git a/Sources/KiouEngineBridge/Hook_GameOrchestratorObserve.m b/Sources/KiouEngineBridge/Hooks/GameOrchestratorObserve.m similarity index 99% rename from Sources/KiouEngineBridge/Hook_GameOrchestratorObserve.m rename to Sources/KiouEngineBridge/Hooks/GameOrchestratorObserve.m index 9c170a9..931178c 100644 --- a/Sources/KiouEngineBridge/Hook_GameOrchestratorObserve.m +++ b/Sources/KiouEngineBridge/Hooks/GameOrchestratorObserve.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" // =========================================================================== // Hook_GameOrchestratorObserve — capture the live GameOrchestrator instance. diff --git a/Sources/KiouEngineBridge/Hook_GameStateStoreObserve.m b/Sources/KiouEngineBridge/Hooks/GameStateStoreObserve.m similarity index 100% rename from Sources/KiouEngineBridge/Hook_GameStateStoreObserve.m rename to Sources/KiouEngineBridge/Hooks/GameStateStoreObserve.m diff --git a/Sources/KiouEngineBridge/Hook_GrpcLogging.m b/Sources/KiouEngineBridge/Hooks/GrpcLogging.m similarity index 99% rename from Sources/KiouEngineBridge/Hook_GrpcLogging.m rename to Sources/KiouEngineBridge/Hooks/GrpcLogging.m index e43271c..f69d441 100644 --- a/Sources/KiouEngineBridge/Hook_GrpcLogging.m +++ b/Sources/KiouEngineBridge/Hooks/GrpcLogging.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import // =========================================================================== diff --git a/Sources/KiouEngineBridge/Hook_LowLevelObserve.m b/Sources/KiouEngineBridge/Hooks/LowLevelObserve.m similarity index 100% rename from Sources/KiouEngineBridge/Hook_LowLevelObserve.m rename to Sources/KiouEngineBridge/Hooks/LowLevelObserve.m diff --git a/Sources/KiouEngineBridge/Hook_MatchModeObserve.m b/Sources/KiouEngineBridge/Hooks/MatchModeObserve.m similarity index 99% rename from Sources/KiouEngineBridge/Hook_MatchModeObserve.m rename to Sources/KiouEngineBridge/Hooks/MatchModeObserve.m index ade3887..8dc82ec 100644 --- a/Sources/KiouEngineBridge/Hook_MatchModeObserve.m +++ b/Sources/KiouEngineBridge/Hooks/MatchModeObserve.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import #import diff --git a/Sources/KiouEngineBridge/Hook_MatchingFilterObserve.m b/Sources/KiouEngineBridge/Hooks/MatchingFilterObserve.m similarity index 99% rename from Sources/KiouEngineBridge/Hook_MatchingFilterObserve.m rename to Sources/KiouEngineBridge/Hooks/MatchingFilterObserve.m index 668c5b9..12077d5 100644 --- a/Sources/KiouEngineBridge/Hook_MatchingFilterObserve.m +++ b/Sources/KiouEngineBridge/Hooks/MatchingFilterObserve.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" // =========================================================================== // Hook_MatchingFilterObserve — apply user-configured matching filters. diff --git a/Sources/KiouEngineBridge/Hook_OnlineObserve.m b/Sources/KiouEngineBridge/Hooks/OnlineObserve.m similarity index 100% rename from Sources/KiouEngineBridge/Hook_OnlineObserve.m rename to Sources/KiouEngineBridge/Hooks/OnlineObserve.m diff --git a/Sources/KiouEngineBridge/Inject_Move.m b/Sources/KiouEngineBridge/Inject/Move.m similarity index 100% rename from Sources/KiouEngineBridge/Inject_Move.m rename to Sources/KiouEngineBridge/Inject/Move.m diff --git a/Sources/KiouEngineBridge/Inject_Resign.m b/Sources/KiouEngineBridge/Inject/Resign.m similarity index 99% rename from Sources/KiouEngineBridge/Inject_Resign.m rename to Sources/KiouEngineBridge/Inject/Resign.m index 5e32070..a885de4 100644 --- a/Sources/KiouEngineBridge/Inject_Resign.m +++ b/Sources/KiouEngineBridge/Inject/Resign.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" // =========================================================================== // Inject_Resign — bridge CSA's %TORYO / %KACHI submissions back to KIOU. diff --git a/Sources/KiouEngineBridge/Meta_Emitter.m b/Sources/KiouEngineBridge/Meta/Emitter.m similarity index 100% rename from Sources/KiouEngineBridge/Meta_Emitter.m rename to Sources/KiouEngineBridge/Meta/Emitter.m diff --git a/Sources/KiouEngineBridge/Settings_Persistence.h b/Sources/KiouEngineBridge/Settings/Persistence.h similarity index 100% rename from Sources/KiouEngineBridge/Settings_Persistence.h rename to Sources/KiouEngineBridge/Settings/Persistence.h diff --git a/Sources/KiouEngineBridge/Settings_Persistence.m b/Sources/KiouEngineBridge/Settings/Persistence.m similarity index 99% rename from Sources/KiouEngineBridge/Settings_Persistence.m rename to Sources/KiouEngineBridge/Settings/Persistence.m index 466371c..ccd6fcf 100644 --- a/Sources/KiouEngineBridge/Settings_Persistence.m +++ b/Sources/KiouEngineBridge/Settings/Persistence.m @@ -1,4 +1,4 @@ -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import "logging.h" // =========================================================================== diff --git a/Sources/KiouEngineBridge/Settings_UI.m b/Sources/KiouEngineBridge/Settings/UI.m similarity index 99% rename from Sources/KiouEngineBridge/Settings_UI.m rename to Sources/KiouEngineBridge/Settings/UI.m index ff74418..bb193d4 100644 --- a/Sources/KiouEngineBridge/Settings_UI.m +++ b/Sources/KiouEngineBridge/Settings/UI.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import // =========================================================================== diff --git a/Sources/KiouEngineBridge/Tweak.m b/Sources/KiouEngineBridge/Tweak.m index 6805c2f..05eec40 100644 --- a/Sources/KiouEngineBridge/Tweak.m +++ b/Sources/KiouEngineBridge/Tweak.m @@ -1,5 +1,5 @@ #import "Internal.h" -#import "Settings_Persistence.h" +#import "Settings/Persistence.h" #import #import #import diff --git a/docs/csa_compatibility.md b/docs/csa_compatibility.md index b881f02..0b84967 100644 --- a/docs/csa_compatibility.md +++ b/docs/csa_compatibility.md @@ -63,7 +63,7 @@ surfaces. KEB writes only the fields it can faithfully fill. ## Initial position KEB always writes the `BEGIN Position` block in CSA's standard form, -derived from KIOU's live SFEN via `Csa_Convert::CsaPositionFromSfen`. +derived from KIOU's live SFEN via `Csa/Convert::CsaPositionFromSfen`. | Concept | KEB behaviour | Status | |---|---|---| @@ -81,7 +81,7 @@ arrives. KEB follows the same pattern from both directions. | CSA concept | Wire | KEB behaviour | Status | |---|---|---|---| -| Notify move | `,T` | Emitted from `Hook_GameStateStoreObserve::HookNotifyPieceMoved` for every KIOU move (both sides). `,T` derived from the snapshot-delta on Online/CPUStream; omitted in modes without authoritative clocks. | ✅ | +| Notify move | `,T` | Emitted from `Hooks/GameStateStoreObserve::HookNotifyPieceMoved` for every KIOU move (both sides). `,T` derived from the snapshot-delta on Online/CPUStream; omitted in modes without authoritative clocks. | ✅ | | Engine submits move | `` | Parsed via `MoveBitsFromCsaText`, translated to USI, fed into `inject_apply`. The `,T` suffix is accepted but ignored (KIOU keeps its own clock). | ✅ | | Engine resigns | `%TORYO` | Sends `#RESIGN` + `#LOSE`, calls `GameOrchestrator.RequestSurrender` for the local seat. The engine controls the local player, so `%TORYO` means the local seat surrenders. | ⚠️ surrenders the local seat | | Engine nyugyoku win | `%KACHI` | Sends `#JISHOGI` + `#WIN`, advances to GAME_OVER. KIOU side is not signalled. | ⚠️ engine learns; KIOU stays | diff --git a/docs/csa_protocol.md b/docs/csa_protocol.md index aa9227c..af2181b 100644 --- a/docs/csa_protocol.md +++ b/docs/csa_protocol.md @@ -29,10 +29,10 @@ server protocol v1.2.1: ` | inbound `AGREE` after Game_Summary | | | `REJECT: by engine` | inbound `REJECT` | Session stays open; engine may issue another LOGIN. | | `,T` | KIOU NotifyPieceMoved fires | Both colors are echoed (sign + black, − white). `T` is computed from the snapshot delta and is omitted in modes without authoritative clocks. | -| `#RESIGN`, `#TIME_UP`, `#ILLEGAL_MOVE`, `#SENNICHITE`, `#OUTE_SENNICHITE`, `#JISHOGI`, `#MAX_MOVES`, `#CHUDAN` | match end | KEB picks the reason marker that best matches the inferred outcome (currently `#RESIGN` for win/lose and `#SENNICHITE` for draw — see `CsaBuildMatchResult` in Csa_GameInfo.m). | +| `#RESIGN`, `#TIME_UP`, `#ILLEGAL_MOVE`, `#SENNICHITE`, `#OUTE_SENNICHITE`, `#JISHOGI`, `#MAX_MOVES`, `#CHUDAN` | match end | KEB picks the reason marker that best matches the inferred outcome (currently `#RESIGN` for win/lose and `#SENNICHITE` for draw — see `CsaBuildMatchResult` in Csa/GameInfo.m). | | `#WIN` / `#LOSE` / `#DRAW` / `#CENSORED` | match end | Outcome from the engine's seat perspective. | ### engine → KEB (inbound) @@ -113,8 +113,8 @@ directly. | `LOGOUT` | Reply with `LOGOUT:completed`, close socket, return to BOOT. | | `AGREE []` | While in AGREE_WAIT: send `START:` and advance to PLAYING. Otherwise log + drop. | | `REJECT []` | Log; reply with `REJECT: by engine`; return to LOGIN. KIOU side is not affected. | -| `[,T]` | Parse via `Csa_Convert::MoveBitsFromCsaText` → translate to USI → call `inject_apply`. The `,T` suffix is logged but otherwise unused (KIOU runs its own clock). | -| `%TORYO` | Send `#RESIGN` + `#WIN`, advance to GAME_OVER, schedule `GameOrchestrator.RequestSurrender` on the main thread (see `Inject_Resign.m`). | +| `[,T]` | Parse via `Csa/Convert::MoveBitsFromCsaText` → translate to USI → call `inject_apply`. The `,T` suffix is logged but otherwise unused (KIOU runs its own clock). | +| `%TORYO` | Send `#RESIGN` + `#WIN`, advance to GAME_OVER, schedule `GameOrchestrator.RequestSurrender` on the main thread (see `Inject/Resign.m`). | | `%KACHI` | Send `#JISHOGI` + `#WIN`, advance to GAME_OVER. No corresponding KIOU declaration API has been surfaced yet — see Task 7 of the migration plan. | | `%CHUDAN` | Send `#CHUDAN`, advance to GAME_OVER. KIOU is not notified. | | bare `\n` (CSA liveness ping) | No-op; TCP keepalive handles dead-peer detection separately. | @@ -191,7 +191,7 @@ CSA's `BEGIN Time` block carries only the fields KIOU actually exposes `Time_Unit:1msec` either — KIOU works in seconds and that's what we ship. The `,T` field on move lines is computed from the difference between -consecutive authoritative snapshots (`Hook_OnlineObserve::g_latestBlackTimeSec` / +consecutive authoritative snapshots (`Hooks/OnlineObserve::g_latestBlackTimeSec` / `g_latestWhiteTimeSec`). VsAI and LocalPvP modes do not surface authoritative clocks, so the suffix is omitted in those modes. diff --git a/docs/research/cave_kinds.md b/docs/research/cave_kinds.md index 4d24b3c..48fee2f 100644 --- a/docs/research/cave_kinds.md +++ b/docs/research/cave_kinds.md @@ -44,7 +44,7 @@ logging — stays on `CAVE_OBSERVER`. Both caves are 21 instructions = 84 bytes, allocated contiguously from `KIOU_BR_CAVE_REGION_START` in `_BRIDGE_SITES` order. The last two instructions are identical (`displaced_insn` + `B orig+4`) so the -cave-bypass entry at `cave_va + 0x4C` works for both kinds — `Inject_Move` +cave-bypass entry at `cave_va + 0x4C` works for both kinds — `Inject/Move` and the entry hooks use that to run orig without re-entering the cave. ### `CAVE_OBSERVER` (observer.cave) @@ -198,7 +198,7 @@ void HookNewSiteObserve(SomeArg1, ...); // for observer ### 5. Hook implementation -`Hook_.m`. For an entry hook, call orig via the bypass entry: +`Hooks/.m`. For an entry hook, call orig via the bypass entry: ```c #if KIOU_CHINLAN @@ -223,7 +223,7 @@ void HookNewSiteObserve(void *self) { } ``` -### 6. `Sources/KiouEngineBridge/ChinlanDispatcher.m` +### 6. `Sources/KiouEngineBridge/Chinlan/Dispatcher.m` Observer hooks: add a `case` to `dispatch_one`. diff --git a/tests/test_csa_convert_expectations.py b/tests/test_csa_convert_expectations.py index f4d9211..a2088da 100644 --- a/tests/test_csa_convert_expectations.py +++ b/tests/test_csa_convert_expectations.py @@ -1,6 +1,6 @@ -"""Pinned expectations for the CSA conversion library (Csa_Convert.{h,m}). +"""Pinned expectations for the CSA conversion library (Csa/Convert.{h,m}). -The C/ObjC implementation lives in ``Sources/KiouEngineBridge/Csa_Convert.m`` +The C/ObjC implementation lives in ``Sources/KiouEngineBridge/Csa/Convert.m`` and is exercised on-device against KIOU. We can't link Foundation against a Linux CI runner, so this test module ports the algorithms to pure Python and pins the expected outputs against the same inputs the ObjC code receives. @@ -24,7 +24,7 @@ # --------------------------------------------------------------------------- -# Python reference implementation. Mirrors Csa_Convert.m verbatim. +# Python reference implementation. Mirrors Csa/Convert.m verbatim. # --------------------------------------------------------------------------- CSA_PIECE_NAMES = [