diff --git a/README.md b/README.md index 770d83d..5fd29af 100644 --- a/README.md +++ b/README.md @@ -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 ` หรือ `/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 ` หรือ `/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 "" พอร์ตจาก `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 "" --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 ` adds EXP and applies captured level/capacity/shop-weight rules. -- `/cw list role` lists captured RoleID, AvatarID and supported stars. -- `/cw role [count]` adds bench roles with existing star merges; a full bench cancels the whole transaction. -- `/cw list equip` lists captured equipment IDs. -- `/cw equip [count]` adds equipment to the CW bag. -- `/cw help` shows command syntax. +- `/cw exp ` เพิ่ม EXP และคำนวณเลเวล/ความจุ/น้ำหนักร้านค้าตามกฎที่ดึงมา +- `/cw list role` แสดงรายการ RoleID, AvatarID และจำนวนดาวที่รองรับ +- `/cw role [count]` เพิ่มตัวละครลงม้านั่งสำรอง พร้อมรวมดาวหากมีตัวซ้ำ; หากม้านั่งเต็มจะยกเลิกคำสั่งทั้งหมด +- `/cw list equip` แสดงรายการรหัสอุปกรณ์ที่ดึงมา +- `/cw equip [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 [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 [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` อีกครั้ง diff --git a/docs/README_EN.md b/docs/README_EN.md index 2e7f994..923f305 100644 --- a/docs/README_EN.md +++ b/docs/README_EN.md @@ -1,9 +1,9 @@ -# 🚂 GaC hkrpg GO +# 🚂 GaCy GO
**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
-[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)
-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 ` or `/faketime ` 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 ` or `/faketime ` 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 `: Set CW currency (e.g. `/cw gold 1000`). +- `/cw hp `: Set current HP within maximum stage allowance. +- `/cw exp `: Add EXP and apply captured level/capacity/shop-weight rules. +- `/cw list role`: List captured RoleID, AvatarID, and supported star ratings. +- `/cw role [count]`: Add bench roles with automatic star merges; a full bench cancels the entire transaction. +- `/cw list equip`: List captured equipment IDs. +- `/cw equip [count]`: Add equipment into the CW inventory bag. +- `/cw list orb|consumable|forge`: List captured reward and forge IDs. +- `/cw orb|consumable|forge [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:
🏛️ Server Architecture & Protocol @@ -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`.