docs: translate Aha's Help and Stella Jump to Thai and update English README

This commit is contained in:
CAtlas0784 committed 2026-11-01 00:32:23 +07:00
1 parent 72f310a68d
commit 499fcecee5
2 files changed
+80 -36

No files matched your search

+28 -28
View File
@@ -26,7 +26,7 @@
เริ่มพอร์ต CW จาก [Currency-War-SR ของ xaodev](https://gaytea.cod-algieba.ts.net/xaodev/Currency-War-SR) แล้ว: เพิ่ม factory ของ Encounter หลัง Supply, ตารางตัวเลือก/ความยากที่ revision ตรงกัน และ EXP ตามโหมด/บท/Boss โดยยังรักษาเส้นทาง Battle ที่จับไว้เดิม งานนี้ยังเป็นการพอร์ตบางส่วนและยังไม่ได้ยืนยันเส้นทางใหม่ใน Client อ่านสถานะ ผลทดสอบ และงานส่งต่อใน [CW xaodev handoff](docs/CW-XAODEV-CLAUDE-HANDOFF.md)
คำสั่งเวลาใน GaC-Srtool: `/faketime status` ดูเวลาเกม, `/faketime <Unix seconds>` หรือ `/faketime <วันที่ RFC3339 พร้อม timezone>` ตั้งเวลาจำลอง และ `/faketime off` คืนเวลาจริง เวลาจำลองเดินต่อและบันทึกใน `game_clock.state_file` จาก config (override ด้วย `GAC_GAME_CLOCK_STATE_FILE`) ใช้กับ Login/heartbeat; ไม่เปลี่ยนนาฬิกา Windows, network timeout หรือเวลา log หลังเปลี่ยนให้เปิดสมุดใหม่ หรือเข้าเกมใหม่หากหน้าจอเก็บตารางเวลาไว้
คำสั่งเวลาใน GaCy-Srtool: `/faketime status` ดูเวลาเกม, `/faketime <Unix seconds>` หรือ `/faketime <วันที่ RFC3339 พร้อม timezone>` ตั้งเวลาจำลอง และ `/faketime off` คืนเวลาจริง เวลาจำลองเดินต่อและบันทึกใน `game_clock.state_file` จาก config (override ด้วย `GAC_GAME_CLOCK_STATE_FILE`) ใช้กับ Login/heartbeat; ไม่เปลี่ยนนาฬิกา Windows, network timeout หรือเวลา log หลังเปลี่ยนให้เปิดสมุดใหม่ หรือเข้าเกมใหม่หากหน้าจอเก็บตารางเวลาไว้
ฉาก Login รถไฟ Cyrene ใช้งานได้แล้ว โดยใช้ `LoginShow_UP` เปิด manifest ชุดเต็มตั้งแต่เริ่มเกม และผูก event จบกับคลิปแอนิเมชัน UP ผู้ใช้ยืนยันทั้งภาพรถไฟสีขาว ฉากชมพูม่วง กลีบดอกไม้ และการ Logout แล้วกลับเข้าใหม่แล้ว เครื่องมือสร้างชุดสำเนาและคืนค่าต้นฉบับ รวมถึงผลตรวจในเกมอยู่ใน [บันทึกฉาก Login](docs/login-cyrene-investigation.md)
@@ -131,7 +131,7 @@ SDK และ game server เปิดหน้าต่างคอนโซล
- เมื่อไม่ได้เชื่อมต่อ GaCy-Srtool เซิร์ฟเวอร์จับคู่ EventID ของมอนในฉากกับ PlaneEvent ของ Client แล้วใช้ StageConfig ของด่านนั้น ทั้งตอนโจมตีมอนและตอนมอนโจมตีผู้เล่น ไม่มีการใช้รายการมอน Custom จากไฟล์เก่าเป็น fallback หากไม่มีข้อมูลตรงรุ่นจะคืน error พร้อม log
- `resources/WorldBattleConfig.json` เก็บ PlaneEvent/Cocoon ที่อ่านจาก Client พร้อมเวอร์ชันและ hash ของ assembly; `world_level` เป็นระดับบัญชีที่ใช้งานร่วมกันใน login/ฉาก/Battle ตารางนี้ต้องส่งออกใหม่เมื่อเปลี่ยน Client หรือชุด resource
- GaC-Srtool ส่ง `POST /api/tool-session` พร้อม `client: "GaC-Srtool"` และ `connected: true` แล้วต่ออายุตาม `srtool.lease_seconds` จึงเปิดใช้ Custom monsters ได้ การปิดเว็บ/ขาดการเชื่อมต่อทำให้ lease หมดอายุ โดยเก็บไฟล์ชั่วคราวตาม `srtool.lease_file` ต้องใช้เว็บฉบับที่รองรับการต่ออายุนี้และ reload เว็บหลังอัปเดต
- GaCy-Srtool ส่ง `POST /api/tool-session` พร้อม `client: "GaCy-Srtool"` และ `connected: true` แล้วต่ออายุตาม `srtool.lease_seconds` จึงเปิดใช้ Custom monsters ได้ การปิดเว็บ/ขาดการเชื่อมต่อทำให้ lease หมดอายุ โดยเก็บไฟล์ชั่วคราวตาม `srtool.lease_file` ต้องใช้เว็บฉบับที่รองรับการต่ออายุนี้และ reload เว็บหลังอัปเดต
- หน้า Monster Setting แสดงชื่อกลุ่ม/มอนสเตอร์และรูปจาก Nanoka โดยดึงข้อมูลตาม `client_version` ใน runtime config พร้อม stage และ wave จาก `challenge_data.json`/`resources/StageConfig.json`; metadata จะรีเฟรชเป็นระยะและไม่สลับไปใช้ข้อมูล Client เวอร์ชันอื่นเมื่อแหล่งข้อมูลไม่พร้อม
- รายการ Monster Setting เป็นแบบอ่านอย่างเดียวสำหรับ Memory of Chaos, Pure Fiction, Apocalyptic Shadow และ Anomaly Arbitration; Aha's Help ตั้งค่าผ่าน API แยกในแท็บของตัวเอง ไม่ใช้ custom monster waves
- ตัวเลือกรอบ AA เก็บกลุ่มที่เลือกไว้ใน `persistent.aa_round_selection` จนกว่าจะเลือกกลุ่มอื่นหรือล้างค่า; heartbeat ขอข้อมูล Anomaly Arbitration ใหม่ผ่าน `ChallengePeakModule.SendGetChallengePeakDataRequest()` ของ Client เมื่ออยู่นอก Battle/รอบที่เล่นค้างไว้ และรอให้ `CurrentPeakGroupID` ตรงก่อนถือว่าซิงก์แล้ว ห้อง/บอสภายในรอบยังเลือกจาก UI ในเกม โดยไม่เปลี่ยน PeakID ของคำขอเก่าไปเป็นห้องอื่น
@@ -222,7 +222,7 @@ go test ./...
**FreeSR custom battle ใช้ได้เฉพาะ Golden/Crimson Calyx** ตาม `CocoonType` จาก Client resource; Stagnant Shadow และ Cavern of Corrosion จะใช้ Stage/monster จาก Client ตามเวอร์ชันเสมอ ส่วน Echo of War ใช้ `StartRaid` ซึ่งยังไม่มี handler สร้างฉากและ BattleInfo ใน server ปัจจุบัน จึงยังต้องเติม Raid resource/handler แยก โดยห้ามอ่าน `battle_config` ของ FreeSR
## REST API / GaC-Srtool
## REST API / GaCy-Srtool
เมื่อ SDK server ทำงาน เปิด URL ที่ตั้งใน `public_sdk_url` เพื่อดูรายการ endpoint หน้า root และ `/dashboard` ตอบข้อมูล JSON ของ API gateway
@@ -322,11 +322,11 @@ HideUI และ FaceCam เขียนข้อมูลวินิจฉั
- `GetBag` โหลด catalog จาก `resources/InventoryItemConfig.json`: Material/Usable/Mission 2,612 รายการ, Light Cone 170 ใบ และ Relic BASIC ที่ Client มองเห็นตาม ItemConfigRelic โดย join กับ RelicConfig และกลุ่ม affix ของแต่ละชิ้น ของ catalog ที่ไม่มีใน save จะเพิ่มเป็นชิ้นยังไม่สวมและบันทึกลง `freesr-data.json`; อุปกรณ์เดิมไม่ถูกลบ
- RankUpAvatar เซฟ rank ลง freesr-data.json โดยแก้เฉพาะค่า rank และเก็บฟิลด์นำเข้าอื่นไว้ E1–E6 ไม่เปิด EX ให้เอง
- EX ทั้งสามคนเริ่มปิดไว้ตามคำขอ `false` เก็บชัดเจนใน persistent; การเปิดจากในเกมบันทึกและส่ง AvatarSync/MaterialList เฉพาะส่วน
- เกมอ่าน EX จาก persistent ทุกประมาณ 1 วินาที แล้วส่งข้อมูลตัวละครที่เปลี่ยน ใช้เส้นทางนี้ร่วมกับ API เดิมโดยไม่แก้ source เว็บ GaC srtool
- เกมอ่าน EX จาก persistent ทุกประมาณ 1 วินาที แล้วส่งข้อมูลตัวละครที่เปลี่ยน ใช้เส้นทางนี้ร่วมกับ API เดิมโดยไม่แก้ source เว็บ GaCy srtool
- ระหว่าง Battle เลื่อนการนำเข้า EX และ freesr-data ไปหลัง PVEBattleResult เพื่อไม่เปลี่ยนอุปกรณ์หรือข้อมูล actor กลางการต่อสู้
- โหลดข้อมูลไม่เซฟกลับอัตโนมัติอีกแล้ว SavePersistent รวมเฉพาะค่าที่เปลี่ยนจาก snapshot ของผู้เขียน รักษาฟิลด์อื่นที่ API แก้ พร้อม lock ข้าม process และเขียนไฟล์แบบ atomic ต้องใช้ SDK/Game server build ใหม่ทั้งคู่
สถานะรอบ progression: build ทั้งสองตัวผ่าน ผู้ใช้ยืนยันว่าก้อนขึ้น ปลด E1/EX ได้ และยังเข้า Calyx ได้ ตรวจไฟล์ระหว่างลองพบ Dan Heng IL rank=1 และ EX=true ต่อมาผู้ใช้เปิด EX ทั้งสามคนแล้ว จึงเก็บค่า true ตามการกดปลดจริง ผลนี้ไม่ได้รับรองว่าเว็บ GaC srtool ที่แก้แยกอยู่ได้ทดสอบ integration แล้ว
สถานะรอบ progression: build ทั้งสองตัวผ่าน ผู้ใช้ยืนยันว่าก้อนขึ้น ปลด E1/EX ได้ และยังเข้า Calyx ได้ ตรวจไฟล์ระหว่างลองพบ Dan Heng IL rank=1 และ EX=true ต่อมาผู้ใช้เปิด EX ทั้งสามคนแล้ว จึงเก็บค่า true ตามการกดปลดจริง ผลนี้ไม่ได้รับรองว่าเว็บ GaCy srtool ที่แก้แยกอยู่ได้ทดสอบ integration แล้ว
รอบโหลดกระเป๋าเดิม 12:18 ก่อนเพิ่ม item catalog ส่ง GetBagScRsp ขนาด 56663 ไบต์ ไม่พบ TryCreateItemData/Inventory error ใน log ณ เวลาตรวจ หลังจากนั้นรับ RankUpAvatar เวลา 12:18:23 และคำขอ EX เวลา 12:18:28 สำเร็จ พร้อม PlayerSyncScNotify ขนาด 234/237 ไบต์; ขนาดและผล Client ของ catalog ใหม่ยังต้องตรวจในเกม
@@ -362,11 +362,11 @@ python tools/audit_protocol_handlers.py "<path-to-pearl-sr-checkout>"
พอร์ตจาก `GaC-hkrpg-ps` ภาษา Rust โดยใช้แนวทางและข้อมูลประกอบจาก [HonkaiSlopRail/pearl-sr](https://git.xeondev.com/HonkaiSlopRail/pearl-sr) ภาษา Zig การแก้ใน Go ต้องตรวจเทียบทั้ง handler, payload และเวอร์ชัน Client ที่ใช้งานจริง
### Traces: หน้าตัวละครและ GaC-Srtool
### Traces: หน้าตัวละครและ GaCy-Srtool
- `AvatarPathData.avatar_path_skill_tree.point_id` สำหรับหน้า Traces ใช้เลข `AnchorType` จาก `AvatarSkillTreeConfig.json` ส่วน `BattleAvatar.skilltree_list.point_id` ใช้ `PointID` เต็ม อ้างอิง PearlSR commit `005d2c12db4781071f4b5b68e8f364587886a710` ใน `avatar_mgr.createSkillTree` และ `battle_mgr.createBattleAvatar`
- แปลง `data.skills` ในเซฟเป็นเลข Anchor เฉพาะตอนส่งข้อมูลหน้าตัวละคร ไม่เปลี่ยน ID ในเซฟหรือ Battle และไม่บังคับอัป Traces ให้เต็ม
- GaC-Srtool บันทึก Traces ผ่านการส่ง `freesr-data` ทั้งชุด ไม่ใช่ `/api/freesr/avatars` ซึ่งรับเฉพาะข้อมูลทั่วไปของตัวละคร โค้ดเว็บที่แก้ในโปรเจกต์ GaC-srtool เพิ่มพารามิเตอร์ `closeModal = true` ให้ `saveAvatarDetails` เพื่อแก้ ReferenceError ก่อนถึงขั้นส่งเซฟ ต้องใช้เว็บฉบับที่มีการแก้นี้ด้วย
- GaCy-Srtool บันทึก Traces ผ่านการส่ง `freesr-data` ทั้งชุด ไม่ใช่ `/api/freesr/avatars` ซึ่งรับเฉพาะข้อมูลทั่วไปของตัวละคร โค้ดเว็บที่แก้ในโปรเจกต์ GaCy-srtool เพิ่มพารามิเตอร์ `closeModal = true` ให้ `saveAvatarDetails` เพื่อแก้ ReferenceError ก่อนถึงขั้นส่งเซฟ ต้องใช้เว็บฉบับที่มีการแก้นี้ด้วย
- การแก้เซฟจากเว็บถูกนำเข้าเกมโดย watcher; ระหว่าง Battle จะรอจนจบก่อนส่ง sync การยืนยันผลหน้า Traces และการบันทึกจากเว็บยังต้องตรวจใน Client
### Technique points และอาหาร
@@ -434,7 +434,7 @@ Hide UI ซ่อนเมนู รายละเอียด รายชื
หากแก้ catalog ให้ใช้ตารางทั้งสี่ไฟล์จาก revision เดียวกันตาม `source` ใน JSON แล้วรัน `python tools/generate_inventory_item_config.py --source-dir "<directory-containing-the-ExcelOutput-files>" --inventory-config resources/InventoryItemConfig.json` เพื่อสร้าง Relic templates ใหม่
GaC-Srtool แก้จำนวน Material/Usable/Mission ผ่าน `POST /api/inventory/materials`; จำนวนที่บันทึกใช้กับเกมหลังสร้าง session ใหม่ เพราะ game server เก็บ snapshot ผู้เล่นแยกจาก SDK API process.
GaCy-Srtool แก้จำนวน Material/Usable/Mission ผ่าน `POST /api/inventory/materials`; จำนวนที่บันทึกใช้กับเกมหลังสร้าง session ใหม่ เพราะ game server เก็บ snapshot ผู้เล่นแยกจาก SDK API process.
### ห้องรถไฟค้างโหลด
@@ -454,40 +454,40 @@ AA round sync (2026-10-30): การเลือกรอบจาก Srtool
Client ยืนยันแล้วว่าเริ่มรอบ เปิดร้าน และลากตัวเริ่มลงสนามได้ เพิ่ม handler ซื้อ/รีเฟรช/ล็อกร้านและห้ามลง avatar ซ้ำในสนามแล้ว รุ่นแก้ชุดหลังยังรอตรวจจาก Client การซื้อเก็บตัวเพิ่มใน bench; การรวมดาวอัตโนมัติและเอฟเฟกต์เฉพาะตัวละครยังไม่ครบ
พิมพ์ใน GM Console ของ GaC srtool เมื่อเชื่อมต่อเซิร์ฟเวอร์:
พิมพ์ใน GM Console ของ GaCy srtool เมื่อเชื่อมต่อเซิร์ฟเวอร์:
- `/cw status` อ่านรอบ เงิน HP และเลเวลที่เซฟอยู่
- `/cw gold <จำนวนรวม>` ตั้งเงิน CW เช่น `/cw gold 1000`
- `/cw hp <จำนวนรวม>` ตั้ง HP ภายในค่าสูงสุดของรอบ
- `/cw exp <gain>` adds EXP and applies captured level/capacity/shop-weight rules.
- `/cw list role` lists captured RoleID, AvatarID and supported stars.
- `/cw role <RoleID> <star> [count]` adds bench roles with existing star merges; a full bench cancels the whole transaction.
- `/cw list equip` lists captured equipment IDs.
- `/cw equip <ItemID> [count]` adds equipment to the CW bag.
- `/cw help` shows command syntax.
- `/cw exp <gain>` เพิ่ม EXP และคำนวณเลเวล/ความจุ/น้ำหนักร้านค้าตามกฎที่ดึงมา
- `/cw list role` แสดงรายการ RoleID, AvatarID และจำนวนดาวที่รองรับ
- `/cw role <RoleID> <star> [count]` เพิ่มตัวละครลงม้านั่งสำรอง พร้อมรวมดาวหากมีตัวซ้ำ; หากม้านั่งเต็มจะยกเลิกคำสั่งทั้งหมด
- `/cw list equip` แสดงรายการรหัสอุปกรณ์ที่ดึงมา
- `/cw equip <ItemID> [count]` เพิ่มอุปกรณ์ลงในกระเป๋า CW
- `/cw help` แสดงรูปแบบคำสั่งทั้งหมด
Grant and queue acknowledgement commit together with the snapshot CAS and atomic file replacement, preventing duplicate grants after a disconnect. Rejected commands log `CW_GM rejected` without saving partial grants. These lists cover captured data, not every item in the Client.
การมอบของและการตอบรับคิวคำสั่งจะคอมมิตพร้อมกับการทำ snapshot CAS และการแทนที่ไฟล์แบบ atomic เพื่อป้องกันการมอบของซ้ำซ้อนหลังหลุดการเชื่อมต่อ หากคำสั่งถูกปฏิเสธจะบันทึก log `CW_GM rejected` โดยไม่บันทึกการมอบของบางส่วน รายการเหล่านี้ครอบคลุมเฉพาะข้อมูลที่ดึงมา ไม่ใช่ไอเทมทุกชิ้นใน Client
- `/cw list orb|consumable|forge` lists captured reward IDs.
- `/cw orb|consumable|forge <ItemID> [count]` grants those items during Preparation.
- Forge currently supports equipment offers only. Role/Expert forges are rejected until their pending actions are implemented.
- Orb opening, automatic combat Orb drops and consumable effects are still incomplete. Granting an item does not establish that its use works in the Client.
- `/cw list orb|consumable|forge` แสดงรหัสรางวัลที่ดึงมา
- `/cw orb|consumable|forge <ItemID> [count]` มอบไอเทมเหล่านั้นในระหว่างช่วง Preparation
- ขณะนี้ Forge รองรับเฉพาะข้อเสนออุปกรณ์ ส่วน Role/Expert forge จะถูกปฏิเสธจนกว่าจะทำ pending action ที่เกี่ยวข้อง
- การเปิด Orb, การดรอป Orb อัตโนมัติในการต่อสู้ และผลของไอเทมกดใช้ (consumable) ยังไม่สมบูรณ์ การมอบไอเทมไม่ได้แปลว่าการใช้งานใน Client จะทำงานได้จริง
### Aha's Help
### ระบบช่วยเหลือของ Aha (Aha's Help)
GaC-Srtool's Persistent settings include an independent Aha's Help selector. Levels come from `resources/AhaHelpConfig.json`, based on the supplied buff table. `GET /api/aha-help` returns available levels; `POST /api/aha-help` accepts `{"level":1}`, zero to disable, or null to use the existing FreeSR invasion-support setting. The setting is stored atomically in `persistent.aha_help_level`, preserving CW and EX state.
การตั้งค่า Persistent ใน GaCy-Srtool มีตัวเลือกเลเวลช่วยเหลือของ Aha แยกอิสระ โดยอ่านระดับเลเวลจาก `resources/AhaHelpConfig.json` ตามตารางบัฟที่กำหนดไว้ API `GET /api/aha-help` จะส่งรายการเลเวลที่เลือกได้ และ `POST /api/aha-help` รองรับรูปแบบ `{"level":1}`, ค่า 0 เพื่อปิดการใช้งาน หรือ `null` เพื่อใช้ค่าการสนับสนุน Invasion ของ FreeSR เดิม การตั้งค่านี้ถูกบันทึกแบบ atomic ลงใน `persistent.aha_help_level` โดยไม่กระทบต่อสถานะของ CW และ EX
The selected buff applies at the start of the next battle containing an actual Corruption buff from `BattleRules.json`'s invasion mapping. This includes srtool custom battles with imported Corruption buffs. Official challenges continue to resolve their Corruption from `StageInvasionConfig.json`; reusing a stage ID alone does not inject Corruption into a custom battle. The selected level replaces other Aha support levels; explicit zero removes support for that Corruption battle. Null follows FreeSR's `enable_invasion_support`; the web selector shows whether that legacy switch is enabled. This setting is separate from Aha Global and does not change an ongoing battle. `AHA_HELP` in `server_debug.log` records the corruption and support IDs sent. The table's `BuffLevel` selects the distinct buff ID; the existing protocol buff-level encoding is retained. Progress thresholds are metadata, not an invented dynamic key. Client behavior and animations still require gameplay verification.
บัฟที่เลือกจะเริ่มทำงานเมื่อเข้าสู่การต่อสู้ถัดไปที่มีบัฟ Corruption จริงตามการแมป invasion ใน `BattleRules.json` ซึ่งครอบคลุมการต่อสู้แบบกำหนดเอง (custom battle) ใน srtool ที่นำเข้าบัฟ Corruption ด้วย ส่วนความท้าทายทางการยังคงอ่าน Corruption จาก `StageInvasionConfig.json` เช่นเดิม การนำ Stage ID มาใช้ซ้ำเพียงอย่างเดียวจะไม่ใส่ Corruption เข้าไปในการต่อสู้แบบกำหนดเอง เลเวลที่เลือกจะเข้ามาแทนที่ระดับช่วยเหลืออื่น ๆ ของ Aha และหากตั้งเป็น 0 อย่างชัดเจนจะปิดการช่วยเหลือในการต่อสู้ Corruption นั้นทันที ค่า `null` จะอ้างอิงตาม `enable_invasion_support` ของ FreeSR ซึ่งหน้าเว็บจะแสดงให้เห็นว่าสวิตช์เดิมนี้เปิดอยู่หรือไม่ การตั้งค่านี้แยกจากการตั้งค่า Aha Global และไม่มีผลกับการต่อสู้ที่กำลังดำเนินอยู่ บันทึก `AHA_HELP` ใน `server_debug.log` จะแสดง ID ของ corruption และ support ที่ถูกส่ง ค่า `BuffLevel` จากตารางใช้ระบุ Buff ID เฉพาะ โดยคงการเข้ารหัส buff-level ตามโปรโตคอลเดิมไว้ ข้อมูลเกณฑ์ความคืบหน้า (Progress thresholds) เป็นเพียง metadata ไม่ใช่ dynamic key ที่สร้างขึ้นเอง พฤติกรรมและแอนิเมชันใน Client ยังต้องรอการยืนยันจากการเล่นจริง
### Stella Jump, event previews and featured gacha
### Stella Jump, พรีวิวอีเวนต์ และตู้กาชาพิเศษ (Event Previews & Featured Gacha)
`resources/StellaJumpConfig.json` contains the 16 ChenLing GameBoy cases captured from the current Client. The sandbox exposes each case's challenge packs and saves actual best times/completions under `persistent.stella_jump`. Opening a menu is read-only. Cheats have separate saved flags; their obfuscated request/response names remain tied to the checked-in command revision and require Client verification.
ไฟล์ `resources/StellaJumpConfig.json` บรรจุข้อมูลด่าน ChenLing GameBoy ทั้ง 16 ด่านที่ดึงมาจาก Client ปัจจุบัน โดยระบบ Sandbox จะแสดง Challenge Pack ของแต่ละด่าน พร้อมทั้งบันทึกเวลาที่ดีที่สุด/สถานะการผ่านด่านจริงลงใน `persistent.stella_jump` การเปิดดูเมนูเป็นแบบอ่านอย่างเดียว (read-only) คำสั่งช่วยเล่น (cheat) มีแฟล็กบันทึกแยกต่างหาก โดยชื่อคำขอ/การตอบกลับที่ถูก obfuscate ยังคงยึดตาม revision ของคำสั่งในคลังโค้ดและยังต้องรอการตรวจสอบกับ Client
`resources/ActivityPreviewPolicy.json` selects event-panel prefabs from `PreviewGameplayCatalog.json`. Additional previews are currently withheld: Client logs showed missing reward assets and invalid item lookups in ActiveActivity. Re-enable individual panels only after validating their installed assets, module identity and reward dependencies. Event-specific battles and reward claims remain incomplete.
ไฟล์ `resources/ActivityPreviewPolicy.json` ใช้เลือกพรีแฟบหน้าต่างอีเวนต์จาก `PreviewGameplayCatalog.json` สำหรับพรีวิวอื่น ๆ ขณะนี้ถูกระงับไว้ก่อน เนื่องจากบันทึกจาก Client พบปัญหา asset รางวัลสูญหายและการค้นหาไอเทมผิดพลาดใน ActiveActivity จึงควรเปิดใช้งานแต่ละหน้าต่างใหม่เมื่อตรวจสอบ asset ที่ติดตั้ง, identity ของโมดูล และความเกี่ยวโยงของรางวัลเรียบร้อยแล้วเท่านั้น ส่วนการต่อสู้เฉพาะอีเวนต์และการกดรับรางวัลยังทำไม่เสร็จสมบูรณ์
Featured gacha candidates come from captured character-banner prefab rows. The current capture has two candidates, but the installed Client could not load the Seele prefab and left the UI transition incomplete. Runtime `AssetMgr.Exists` checks confirmed Standard and Beginner assets, but none of the four captured limited assets. `GachaSandboxPolicy.json` currently exposes only the verified Standard panel for browsing; draws return `RET_GACHA_NOT_SUPPORT` until usable featured assets are verified. An empty verified list rejects entry as well. A table row alone is insufficient evidence of an installed asset; verify the Client bundle before adding a path to that list. The grant implementation returns the pictured character and configured duplicate Eidolon material, preserving rank/EX/Traces; it is not yet verified in the Client. An avatar absent from the imported roster is rejected. The sandbox policy uses free draws and does not reproduce official rates or conversion rules.
รายชื่อตู้กาชาพิเศษอ้างอิงจากแถวพรีแฟบแบนเนอร์ตัวละครที่ดึงมา ปัจจุบันมี 2 ตู้ แต่ Client ที่ติดตั้งไม่สามารถโหลดพรีแฟบของ Seele ได้ ทำให้การเปลี่ยนหน้า UI ค้าง การตรวจสอบ `AssetMgr.Exists` ขณะรันพบเฉพาะ asset ของตู้ถาวร (Standard) และตู้เริ่มต้น (Beginner) แต่ไม่พบ asset ตู้ลิมิเต็ดทั้ง 4 ตู้ที่ดึงมา ปัจจุบัน `GachaSandboxPolicy.json` จึงเปิดให้เรียกดูได้เฉพาะหน้าต่าง Standard ที่ยืนยันแล้วเท่านั้น โดยการสุ่มจะตอบกลับเป็น `RET_GACHA_NOT_SUPPORT` จนกว่าจะยืนยัน asset ตู้พิเศษที่ใช้งานได้จริง และหากรายการที่ยืนยันว่างเปล่าจะปฏิเสธการเข้าหน้านี้ด้วย แถวในตารางเพียงอย่างเดียวไม่ถือเป็นหลักฐานว่ามี asset ติดตั้งอยู่จริง ต้องตรวจสอบ bundle ใน Client ก่อนเพิ่ม path ลงในรายการ สำหรับการแจกตัวละครจะให้ตัวละครตามภาพพร้อมไอเทม Eidolon ซ้ำตามที่ตั้งค่าไว้ โดยคงสถานะ Rank/EX/Traces เดิม และยังไม่ได้ยืนยันผลใน Client หากตัวละครไม่มีใน roster ที่นำเข้าจะถูกปฏิเสธ นโยบาย Sandbox นี้ใช้การสุ่มฟรีและไม่ได้จำลองเรทหรือกฎการแปลงไอเทมอย่างเป็นทางการ
Runtime table captures and current verification limits are recorded in `docs/offline-gameplay-continuation.md`. Compiling these handlers does not confirm the corresponding Client screens or gameplay.
ข้อมูลตารางที่ดึงมาระหว่างรันและข้อจำกัดการตรวจสอบในปัจจุบันถูกบันทึกไว้ใน [docs/offline-gameplay-continuation.md](docs/offline-gameplay-continuation.md) การคอมไพล์ handler เหล่านี้ผ่านไม่ได้ยืนยันว่าหน้าจอหรือระบบการเล่นใน Client จะทำงานได้สมบูรณ์
คำสั่งเปลี่ยนค่าถูกคิวไว้ตาม UID/รอบ และนำเข้าใน heartbeat ตอนอยู่หน้า Preparation ไม่แก้เงิน/กระเป๋า Adventure และไม่แทรกตอน Battle ข้อความ queued ยังไม่แปลว่าเกมใช้ค่าแล้ว; ตรวจ log `CW_GM applied` หรือ `/cw status` อีกครั้ง
+52 -8
View File
@@ -1,9 +1,9 @@
# 🚂 GaC hkrpg GO
# 🚂 GaCy GO
<div align="center">
**Modern, High-Performance Honkai: Star Rail Game Server Emulator in Go**
Ported from `GaC-hkrpg-ps` with protocol references from `PearlSR` & `Currency-War-SR`.
Ported from [`GaC-hkrpg-ps`](https://github.com/CAtlas0784/GaC-hkrpg-rust) with protocol references from `PearlSR` & `Currency-War-SR`.
[English](README_EN.md) | [ภาษาไทย](../README.md)
@@ -15,22 +15,64 @@ Ported from `GaC-hkrpg-ps` with protocol references from `PearlSR` & `Currency-W
<div align="center">
[Documentation](./) • [Getting Started](#-getting-started-on-windows) • [Configuration](#-configuration--anti-hardcoding-policy-agentsmd) • [Credits & Acknowledgments](#-credits--acknowledgments)
[Documentation](./) • [Getting Started](#-getting-started-on-windows) • [Features & In-Game Systems](#-features--in-game-systems) • [Configuration](#-configuration--anti-hardcoding-policy-agentsmd) • [Credits & Acknowledgments](#-credits--acknowledgments)
</div>
Honkai: Star Rail game server emulator implemented in Go, ported from `GaC-hkrpg-ps` and referencing [PearlSR](https://git.xeondev.com/HonkaiSlopRail/pearl-sr). It includes the Game Server, SDK/Dispatch Server, and REST API for GaC-Srtool.
Honkai: Star Rail game server emulator implemented in Go, ported from [`GaC-hkrpg-ps`](https://github.com/CAtlas0784/GaC-hkrpg-rust) and referencing [PearlSR](https://git.xeondev.com/HonkaiSlopRail/pearl-sr). It includes the Game Server, SDK/Dispatch Server, and REST API for GaCy-Srtool.
The project is currently under active development, targeting Client **4.6.53 OS**. Command tables and recent handlers reference PearlSR commit `005d2c12db4781071f4b5b68e8f364587886a710` (see [protocol update documentation](protocol-update.md)). Schema parity does not imply that every in-game feature is fully operational.
### 🎮 Currency Wars (CW) — In Development
- **Autochess Simulation Engine**: Ported from [Currency-War-SR by xaodev](https://gaytea.cod-algieba.ts.net/xaodev/Currency-War-SR), implementing encounter generation following supply nodes, difficulty/selection matrix, and mode/chapter/boss EXP progression while maintaining verified battle paths. Full audit details in [CW xaodev handoff](CW-XAODEV-CLAUDE-HANDOFF.md) and [CW route continuation audit](cw-route-continuation-audit.md).
- **Time Simulation (FakeTime)**: In GaC-Srtool, use `/faketime status` to view current game time, `/faketime <Unix seconds>` or `/faketime <RFC3339 datetime>` to set simulated time, and `/faketime off` to restore real-time clock. Persisted in `game_clock.state_file` (override with `GAC_GAME_CLOCK_STATE_FILE`). Affects login and heartbeats without altering OS system clocks or network timeouts.
- **Time Simulation (FakeTime)**: In GaCy-Srtool, use `/faketime status` to view current game time, `/faketime <Unix seconds>` or `/faketime <RFC3339 datetime>` to set simulated time, and `/faketime off` to restore real-time clock. Persisted in `game_clock.state_file` (override with `GAC_GAME_CLOCK_STATE_FILE`). Affects login and heartbeats without altering OS system clocks or network timeouts.
- **Cyrene Train Login Scene**: Operational via `LoginShow_UP` manifest and bound to animation finish events, rendering the white train, pink-purple sky, petals, and clean logout/re-login transitions. Details in [Login scene notes](login-cyrene-investigation.md).
- **Emergency Unstuck via GaC-Srtool**: The **Unstuck** button in the GM Command Console issues `POST /api/client/unstuck`, executing `UIManager.ClearWaitNetPacketFullScreenBlock()` on the next client heartbeat. Safely unfreezes UI blocks without clearing CW saves or fabricating gameplay states.
- **Emergency Unstuck via GaCy-Srtool**: The **Unstuck** button in the GM Command Console issues `POST /api/client/unstuck`, executing `UIManager.ClearWaitNetPacketFullScreenBlock()` on the next client heartbeat. Safely unfreezes UI blocks without clearing CW saves or fabricating gameplay states.
- **Roster & Star Merging**: Automatic 3-copy star promotion for duplicate avatars, equipment binding and tracking from Preparation screen, and protagonist spotlight selection policies.
#### CW Preparation Commands
- `/cw status`: Display saved round, gold, HP, and player level.
- `/cw gold <amount>`: Set CW currency (e.g. `/cw gold 1000`).
- `/cw hp <amount>`: Set current HP within maximum stage allowance.
- `/cw exp <gain>`: Add EXP and apply captured level/capacity/shop-weight rules.
- `/cw list role`: List captured RoleID, AvatarID, and supported star ratings.
- `/cw role <RoleID> <star> [count]`: Add bench roles with automatic star merges; a full bench cancels the entire transaction.
- `/cw list equip`: List captured equipment IDs.
- `/cw equip <ItemID> [count]`: Add equipment into the CW inventory bag.
- `/cw list orb|consumable|forge`: List captured reward and forge IDs.
- `/cw orb|consumable|forge <ItemID> [count]`: Grant those items during Preparation.
- `/cw help`: Display full command syntax.
---
### ✨ Features & In-Game Systems
#### Aha's Help
GaCy-Srtool's Persistent settings include an independent Aha's Help selector. Levels come from `resources/AhaHelpConfig.json`, based on the supplied buff table. `GET /api/aha-help` returns available levels; `POST /api/aha-help` accepts `{"level":1}`, zero to disable, or null to use the existing FreeSR invasion-support setting. The setting is stored atomically in `persistent.aha_help_level`, preserving CW and EX state.
The selected buff applies at the start of the next battle containing an actual Corruption buff from `BattleRules.json`'s invasion mapping. This includes srtool custom battles with imported Corruption buffs. Official challenges continue to resolve their Corruption from `StageInvasionConfig.json`; reusing a stage ID alone does not inject Corruption into a custom battle. The selected level replaces other Aha support levels; explicit zero removes support for that Corruption battle. Null follows FreeSR's `enable_invasion_support`; the web selector shows whether that legacy switch is enabled. This setting is separate from Aha Global and does not change an ongoing battle. `AHA_HELP` in `server_debug.log` records the corruption and support IDs sent. The table's `BuffLevel` selects the distinct buff ID; the existing protocol buff-level encoding is retained. Progress thresholds are metadata, not an invented dynamic key. Client behavior and animations still require gameplay verification.
#### Stella Jump, Event Previews & Featured Gacha
`resources/StellaJumpConfig.json` contains the 16 ChenLing GameBoy cases captured from the current Client. The sandbox exposes each case's challenge packs and saves actual best times/completions under `persistent.stella_jump`. Opening a menu is read-only. Cheats have separate saved flags; their obfuscated request/response names remain tied to the checked-in command revision and require Client verification.
`resources/ActivityPreviewPolicy.json` selects event-panel prefabs from `PreviewGameplayCatalog.json`. Additional previews are currently withheld: Client logs showed missing reward assets and invalid item lookups in ActiveActivity. Re-enable individual panels only after validating their installed assets, module identity and reward dependencies. Event-specific battles and reward claims remain incomplete.
Featured gacha candidates come from captured character-banner prefab rows. The current capture has two candidates, but the installed Client could not load the Seele prefab and left the UI transition incomplete. Runtime `AssetMgr.Exists` checks confirmed Standard and Beginner assets, but none of the four captured limited assets. `GachaSandboxPolicy.json` currently exposes only the verified Standard panel for browsing; draws return `RET_GACHA_NOT_SUPPORT` until usable featured assets are verified. An empty verified list rejects entry as well. A table row alone is insufficient evidence of an installed asset; verify the Client bundle before adding a path to that list. The grant implementation returns the pictured character and configured duplicate Eidolon material, preserving rank/EX/Traces; it is not yet verified in the Client. An avatar absent from the imported roster is rejected. The sandbox policy uses free draws and does not reproduce official rates or conversion rules.
Runtime table captures and current verification limits are recorded in [docs/offline-gameplay-continuation.md](offline-gameplay-continuation.md). Compiling these handlers does not confirm the corresponding Client screens or gameplay.
#### Freecam & FaceCam Controls
- `Tab`: Toggle Freecam / FaceCam; Arrow keys: Move camera; Hold Right Mouse Button and move mouse to rotate orientation.
- `Page Up` / `Page Down`: Raise / lower elevation; `+` / `-`: Increase / decrease camera speed.
- FaceCam aligns the viewport with the active character's animated head direction and follows transformed battle characters (e.g., Khaslana). Scroll wheel adjusts zoom distance.
- While Freecam is active in battle, UI click interception is safely suspended via `InControlInputModule.allowMouseInput` and temporary mouse bindings in memory, while keyboard skill activation remains functional.
---
### 🚀 Getting Started on Windows
#### Requirements
@@ -53,6 +95,8 @@ The project is currently under active development, targeting Client **4.6.53 OS*
SDK and Game servers launch in separate visible console windows displaying live logs. The interactive launcher menu closes automatically after 5 seconds while server processes remain running. Use `run.bat stop` or close console windows to terminate.
---
### ⚙️ Configuration & Anti-Hardcoding Policy (`AGENTS.md`)
`AGENTS.md` strictly prohibits hardcoding machine-specific paths, usernames, IP addresses, ports, or game deployment URLs directly into source code or startup scripts.
@@ -80,7 +124,7 @@ Priority Order: **Environment Variables > `server.local.json` > `server.json`**
### 💖 Credits & Acknowledgments
`GaC-hkrpg-go` is built upon the collective research, tools, and pioneering reverse-engineering efforts of the open-source and Star Rail research communities. We extend our sincere gratitude and recognition to the following projects and authors:
`GaCy GO` is built upon the collective research, tools, and pioneering reverse-engineering efforts of the open-source and Star Rail research communities. We extend our sincere gratitude and recognition to the following projects and authors:
<details open>
<summary><b>🏛️ Server Architecture & Protocol</b></summary>
@@ -111,7 +155,7 @@ Priority Order: **Environment Variables > `server.local.json` > `server.json`**
- Core simulation engine for Currency Wars (Grid Fight autochess) 4.6.53.
- Role/traits matrix, post-supply encounter generation logic, difficulty scaling, and EXP progression rules (`internal/common/currency_wars_xaodev.go`, `internal/gameserver/currency_wars_xaodev.go`, `resources/CurrencyWarsXaodev.json`).
- **minatoSR**:
- **minatoSR ([haltinggoalies/minatoSR](https://github.com/haltinggoalies/minatoSR))**:
- NPC placement coordinates and stage overrides for all 40 nodes of Challenge Peak / Anomaly Arbitration (AA) in `resources/ChallengePeakSceneOverrides.json`.
</details>