# ส่งต่องาน GaC-hkrpg-go ให้ Zcode > Boss continuation: live logs confirm Tea Break take and preparation now pass, > saved run is 1-6 revision545. Boss request was blocked by requiring nonzero > Level/HardLevelGroup from an envelope that legitimately omits both. Corrected > helper preserves proven wire zeros, validates formation and all saved enemy > identities. See `currency-wars-route-factory.md` current Boss correction. > 2026-10-26 late correction: the current Client's Bonfire selected phase is 2, > not FFGO's 1. Native `_UpdateHasSelected` proves phase>=2. Earlier 22:49 build > still failed because it used phase1. New build includes read-only legacy phase > projection from same-node effect evidence and idempotent matching choice sync. > See `cw-bonfire-phase-contract.md`. No rewards or saves changed by research. > Latest CW deployment — 2026-10-26 22:49 Bangkok: Tea Break take-drop/heal, > generated Boss/CampMonster layers and preparation/settlement integration are > now built and deployed. This supersedes historical “take-drop unsupported”. > Root Game/SDK visible consoles restarted; no Client take/Boss result observed > yet. Existing run remains revision531,1-5,phase1 until user resumes; no save > migration/reward was performed outside an actual request. See > `currency-wars-ffgo-workflow-20261026.md` and `currency-wars-route-factory.md`. > Pending: full augment effects, ordinary Monster/EliteBranch/nonenemy factories, > finalization, companion synthesis, extra difficulty and weighted Orb offers. > Both standard and shipping binaries compiled; no tests run. Maintained Lua > scripts count is five, including ping_rainbow.lua; no probe is staged. > อ่านหัวข้อ **Latest continuation — 2026-10-26** ท้ายไฟล์ก่อน: > สถานะกาชา/AA/CW และ dump FFGO ใหม่ในหัวข้อนั้นแทนสถานะเก่าด้านล่าง อัปเดต: 24 ตุลาคม 2026 (Asia/Bangkok) ## 1. เป้าหมายและคำสั่งล่าสุดจากผู้ใช้ ผู้ใช้ต้องการให้แก้ปัญหาที่แจ้งทั้งหมด งานล่าสุดที่ยังค้างคือ: 1. กาชา: เลือกตู้ตัวละครได้ โดยแต่ละตู้มีตัวเด่นหนึ่งตัว และสุ่มได้ตรงกับตัวที่แสดงบนตู้ 2. กิจกรรม: เพิ่มรายการในหน้ากิจกรรม และเข้าไปดู/เล่นบางส่วนได้ ไม่จำเป็นต้องจำลองครบ 100% 3. Stella Jump: มินิเกมกระโดดด้านข้าง ต้องเข้าเล่นและเลือกด่านที่ยังล็อกได้ 4. CW: แก้ปุ่มหน้าเข้าโหมดที่ทับกัน และออกจากโหมดแล้วโลกจอดำแต่ยังกดควบคุมได้ 5. แต้มเทคนิคก่อนเข้าสู้ Endgame: ต้องเริ่มเต็มตามเพดานของทีม ไม่ติดอยู่ที่ 5 6. เมื่อส่วนข้างบนเรียบร้อย จึงกลับไปต่อ CW ให้เล่นต่อเนื่องได้ทั้งโหมด รวม Tea Break, Orb และคำสั่งเสก ผู้ใช้บอกแล้วว่า **ไม่ต้องเทส/ไม่ต้องให้ลองซ้ำ ให้ทำงานต่อ** อย่ารันหรือเพิ่ม tests และอย่าให้ผู้ใช้ลองใหม่ทีละ handler โดยไม่มีเหตุจำเป็น หากต้องตรวจ gameplay เพิ่มจริง ให้ระบุว่าขาดหลักฐานอะไร การ compile ผ่านไม่ใช่หลักฐานว่าเล่นได้ คำขอปัจจุบันคือทำเอกสารส่งต่อ ยังไม่ได้สั่ง commit/push รอบนี้ และยังไม่ได้ส่งข้อความหาแชต Zcode ## 2. อ่านก่อนเริ่มทำงาน - อ่าน `AGENTS.md` ที่ root; กฎมีผลกับทุกงานด้านล่าง - ใช้ checkout ปัจจุบันต่อ มีงานแก้และไฟล์ใหม่จำนวนมากจากหลายรอบ **ห้าม reset/clean/ทับงานเดิม** - อ่าน `git status --short` และ diff ก่อนแก้ อย่าเหมารวมว่าทุก diff เป็นงานของรอบล่าสุด - เอกสารเก่าบางส่วนเป็นบันทึกตามเวลาและมีสถานะที่ถูกแทนที่แล้ว เอกสารนี้สรุปสถานะล่าสุดเพื่อส่งต่อ โดยเฉพาะ Aha, กาชา, กิจกรรม และ Client revision - งานก่อนหน้าหลายส่วนยังไม่ยืนยันกับ Client ต้องแยกคำว่า “มีโค้ด”, “build แล้ว”, “วางไฟล์แล้ว” และ “ผู้ใช้ยืนยันแล้ว” - อย่ารีสตาร์ต Game server ขณะผู้ใช้สู้ ผู้ใช้เคยอนุญาต rebuild/restart แล้ว แต่ต้องตรวจสถานะรอบปัจจุบันก่อน - อย่าสั่งปิดคอมตามข้อความเก่า ผู้ใช้กลับมาใช้งานต่อแล้ว ### กฎสำคัญจาก repository - ค่าตั้งระบบต้องมาจาก `server.json` + `server.local.json`/environment ห้ามฝัง path/IP/port/เวอร์ชัน Client ของเครื่องนี้ใน source หรือ startup scripts - Game ID, floor, group, buff, level, unlock และกฎต่าง ๆ ต้องมี resource/Client evidence รองรับ ห้ามเดาตัวเลขเพื่อให้ผ่าน - Resolve CmdID ด้วยชื่อจากตาราง protocol ที่ระบุ revision ห้ามส่งหลายเลขเพื่อเดา callback - ถ้า schema obfuscated ให้บันทึก tag/ชนิดข้อมูล/สิ่งที่ยืนยันได้และสิ่งที่ยังไม่ทราบ - ตัวอ่าน persistent ห้ามเขียนกลับ เซฟจาก session เก่าห้ามทับ API update; เก็บ EX false ได้ และ sync เฉพาะ avatar/material ที่เปลี่ยน - ห้ามโหลด/สแกนทั้ง assembly บน main thread ระหว่างเล่น ใช้ named types และจำกัดงานต่อ heartbeat/frame - ทุก `.lua` ใน `scripts/` ถูกส่งเข้า Client อัตโนมัติ Temporary probes ต้องเก็บที่ `tools/` และถอดจาก `scripts/` เมื่อเสร็จ - SDK/Game server ต้องมีคอนโซลกับ log ให้เห็น ## 3. สถานะ build และ Client ณ จุดส่งต่อ ### Executables อัปเดต 24 ต.ค. 2026 ~16:00: **rebuild + deploy + restart รอบสุดท้ายแล้ว** (root + `for ship`) ชุดนี้รวม: CW role compatibility, Endgame technique เริ่มเต็ม (`handlers_challenge_flow.go:287` Mp=MaxMp ยืนยันใน source), activity preview ขยาย 121 schedules, Srtool custom monsters ใน AA, MissionCompatibility 4 IDs, GetCurBattleInfo ไม่ null, และ probe scripts 3 ตัว ผู้ใช้ relogin กลับมาเองหลังแต่ละรอบ (ไม่ใช่การยืนยันระบบอื่น) **ยังไม่มี Client ยืนยันชุดแก้ใหม่นี้** ### กลไก probe ที่ตรวจสอบแล้ว (สำคัญต่องานต่อ) - ไฟล์ใน `scripts/` ถูกแนบไปกับ **PlayerHeartBeat ทุกครั้ง** (`handlers_player.go`) และ Client **re-parse + execute ต่อ heartbeat จริง** (ยืนยัน 24 ต.ค. ~15:40: probe จิ๋วที่เขียนหลัง Client boot ก็รัน) — แต่ blob หนัก (เช่น probe ที่ฝัง ID หลายพันตัว ทำ 500 reflection calls/beat) จะกิน main thread จนโหลดฉากหมุนค้าง ใช้ chunk ไม่เกิน ~50/beat - ตรวจ syntax ทุกสคริปต์ด้วย `pip install luaparser; ast.parse(...)` ก่อนวาง — สคริปต์พังทำ blob ทั้งก้อนเงียบหมด - อ่าน output จาก Player.log ต้องใช้ `grep -a` (log มี byte ผสม binary) - กับดัก xLua: `typeof(CS.RPG.Client[tn])` แบบ string index คืน lazy placeholder ไม่ใช่ type — เช็ค type ต้องใช้ `CS.System.Type.GetType('RPG.Client.Name, Assembly-CSharp')` - ผล probe 24 ต.ค.: `FiveDimModule` มี `EnterChenLingGameBoy(UInt32,KFELGAIGHAP×4,GameEntity,Transform,Transform)`, `RequireChenLingGameBoyData(UInt32)` และ **ไม่มี** `_OnGetChenLingDataScRsp` (ChenLingGetData 9612 ถูกจัดการโดย module อื่น) `GridFightModule` มีแค่ `_ClearBonfireShownEventIds()` + `_OnGridFightHandlePendingActionScRsp` — ไม่มี bonfire page/ส่ง request ในตัว module และ `GlobalVars` ไม่มี field mission/gridfight — MissionModule/GridFightModule singleton ยังหา access path ไม่เจอ (รอบถัดไป: ไล่ static fields ของ MissionModule เอง หรือจับ page class จริงจาก stack trace ตอนผู้ใช้กด Tea Break) - ชื่อ `GridFightBonfirePage`/`GridFightTeaBreakPage`/`GridFightBackstageTeaBreakPage` ฯลฯ **ไม่มีจริง** ใน Assembly-CSharp (ตรวจด้วย Type.GetType แล้ว) — ห้ามใช้ชื่อพวกนี้อ้างอีก - Probe ทั้งหมดถอดจาก `scripts/` แล้วเมื่อจบรอบ สภาพปัจจุบันคือไฟล์ runtime ปกติ 5 ตัว ### ชุดข้อมูล GLM handoff (24 ต.ค. เย็น) ผู้ใช้ส่ง `.runtime/glm-beta-handoff-20261024.zip` พร้อมเอกสาร `docs/GLM-BETA-DATA.md`, `GLM-BETA-EVENTS.md`, `GLM-GACHA-GUIDE.md` — ชุดข้อมูล event (181 panels/361 activities + derived index) และกาชา (6 แถวจริง, group table ว่าง 0 แถว, limited/group prefab ไม่มีใน installation) พร้อมกติกา: ห้ามเดา ID/สร้าง namespace ปลอม แยก provenance ทุกชั้น ผลงานเพิ่มเติมจากชุดนี้ (24 ต.ค. ค่ำ, ยังไม่แก้ production code): - ตรวจ schema ของ 4 event ที่มีชื่อ command ชัด: `PixAirGetData`(9812), `GetChenLingFesData`(9942), `StartFinalityBattleLevel`(10027), `BlindBoxGetData`(10052) — ทุกตัวต้องมี config table ของระบบตัวเองก่อนตอบได้ปลอดภัย (ตอบว่าง = ผิดกฎ) และ ChenLingFes อยู่ใน danger family ปัจจุบัน - โพรบ TextID (ถอดออกแล้ว): `TextID` มี ctor `(String)` ที่**แฮช key เอง** และ `()`; field `hash` เซ็ตตรงผ่าน xLua ได้ (ยืนยัน hash ตรงเป้าครบ 10 panel) แต่ `ToString()` ไม่ resolve ข้อความ `LocalizationManager` เป็นแค่ language config; text-table lookup service ยังไม่พบ (รอบหน้า: enumerate TextID instance methods, หา UiText service ต่อ หรือแกะ DesignData pack) — localized ชื่อ event ใหม่ทั้ง 10 ยังไม่ได้ - กับดัก xLua เพิ่มเติม: string→ตัวเลขใหญ่ถูก coerce ผ่าน double เสียค่า; byte-array SetValue ติด widening; C# property (เช่น `IsStatic`) อ่านแบบ field ไม่ใช่ call; state ของ probe ต้องเปลี่ยนชื่อ variable ทุกครั้งที่แก้เพื่อบังคับรอบใหม่ ### กาชา sandbox draw — ใช้ได้จริงแล้วใน build 24 ต.ค. ~16:4x `GachaSandboxPolicy.json` เปิด `sandbox_draw_pool.source = "imported_roster"` และเพิ่ม `NoviceGacha_4001.prefab` เข้า verified prefabs (ผลตรวจ asset เช้านั้นยืนยัน novice = true อยู่แล้ว) `handlers_gacha.go` เพิ่มเส้นทาง `drawSandboxPool`: DoGacha บน banner ที่มี asset จริง (1001/4001) สุ่ม uniform จาก roster ใน freesr-data.json ณ ตอน draw (ไม่ฝังรายชื่อ) ตัดตัวที่ไม่มี first-rank Eidolon cost ออก แล้ว grant เป็น duplicate material ตาม first Eidolon cost ต่อ avatar (กลไก `GrantGachaDuplicate` เดิม) พร้อม PlayerSync ฝั่ง materials และ GachaItem ต่อครั้งที่สุ่ม **ขอบเขตจริง:** ทุกผลสุ่มเป็นตัวละครที่มีใน roster แล้วเสมอ (duplicate) — การได้ตัวใหม่ที่ยังไม่มี (first acquisition) ยังไม่รองรับและยังถูก reject นี่คือ sandbox pool เพื่อให้ตู้ที่มี asset กดได้จริง ไม่ใช่ official probability/price และไม่ใช่ตู้เลือกตัวละคร (ยังติด custom presentation ตาม GLM-GACHA-GUIDE กรณี B) ยังไม่มี Client ยืนยันการกดสุ่มจริง ### ตู้ต่อตัวละคร — ผล RE รอบถอด handler (24 ต.ค. ดึก) ตามคำสั่ง "ถอด `_CmdGetGachaInfoScRsp`": ยืนยัน binary hash ตรง .54 แล้ว disassemble สอง RVA ที่ dumper ผูกกับ `GetGachaInfoScRsp` (`0xCFDC1C0` 1515 instructions, `0xCFD46B0` 107) ลง `battle_diagnostics/gacha-info-handler-{1,2}.asm` ผลที่ยืนยันเพิ่ม: - **Concrete pool type จริง = `RPG.Client.StandardGachaPoolData`** (subclass ของ BaseGachaPoolData) — อ่านจาก live pool ด้วย `GetType().FullName` (แก้ตามข้อเสนอ: หยุดเดา BaseGachaPoolData ตรง ๆ) ไม่มี constructor ใด ๆ (รวม non-public) - `DefaultGachaPoolData` ที่ bytecode หน้าอ้าง **ไม่ใช่ C# type ที่ xLua เห็น** (lazy placeholder) — อย่าใช้ชื่อนี้อ้างอีก - เขียน `Row` บน derived pool ต้องใช้ reflection บน **BASE type**: `BaseGachaPoolData.GetField('k__BackingField', Instance|NonPublic)` (derived-type lookup เจอ nil) - `_AddGachaPoolDataToGroupDict` โยน `InvalidCastException (BindingFlags)` ทั้งกับ Base และ Standard uninitialized instance — ยังไม่ระบุสาเหตุชั้นใน (การอ่าน asm ต้อง resolve metadata slot → type name ซึ่ง dumper static ไม่มี: slot `0x963af58` อยู่นอกช่วง method RVA ของ cs-type-infos) **ขั้นต่อไปที่เจาะจง (รอบ RE ใหม่):** 1. Resolve metadata slots ใน handler-1 ด้วย runtime symbolication (Frida อ่าน type-info จากโปรเซสจริง ตามแบบ asm capture เดิม) เพื่อชี้จุด: โรงงานสร้าง pool, จุด lookup config, และ branch ที่ข้าม ID ไม่รู้จัก 2. ทางเลือกขนาน: hook ที่ `0xCFDC1C0` ตอน Client ประมวลผล response จริง เพื่อดู arg/return ของ pool construction สด ๆ 3. เมื่อเจอ factory/projection แล้ว ออกแบบตามหลัก "config projection ก่อนประมวลผล response" (ตามข้อเสนอ) — Row ที่เติมทีหลังไม่มีทางช่วยเพราะ Client ข้าม ID ตั้งแต่ก่อนสร้าง pool (พิสูจน์แล้ว) **ตรวจ asset art:** `AvatarCutinImgPath = SpriteOutput/AvatarDrawCard/.png` เป็น path จริงจาก config แต่ **ยังไม่ได้ตรวจ existence รายตัว** — ต้องผ่าน AssetMgr.Exists probe ก่อนใช้เป็นภาพตู้ (ตามข้อเสนอ: path จาก config อย่างเดียวไม่พอ) ผลพิสูจน์สะสมจากเส้นทาง `_gacha_module` upvalue (หลักฐาน `gameplay-lua-upvalues.log`): module method surface ครบ (`GetSortedGachaPoolDatas/GetGachaPoolData(id)/_CmdGetGachaInfoScRsp/_AddGachaPoolDataToGroupDict/GetGachaNormalPoolID=1001`); pools สร้างจาก server response rows join local config (ID ไม่รู้จักถูกข้ามเงียบ — server ส่ง 3 ได้ pool 2 ไม่ crash); `GachaBasicInfoConfigRow()` สร้างใหม่ + เขียน field ได้ครบ; proto response class ไม่ถูก bridge เข้า xLua (baked Lua ส่ง request ผ่าน C# sender ทั้งหมด) ### UI regression 18 ต.ค. ช่วงเย็น — กู้ก่อนต่องานกาชา (24 ต.ค. 18:16) ผู้ใช้รายงาน: เมนูโทรศัพท์เหลือ 4 ปุ่ม (Navigation/Missions/Bookshelf/Account Settings) และแถบด้านบนตอนเดินหาย พร้อมแก้ข้อสรุป: (ก) `DefaultGachaPoolData.PrefabPath` ใน bytecode เป็นการเข้าถึง property ไม่พิสูจน์ชื่อ C# class (ข) InvalidCastException ไม่พิสูจน์ว่าขาด field — ต้องอ่านชนิดจริงกับ stack (ทำแล้วบางส่วน: concrete type จริงคือ `StandardGachaPoolData` จาก GetType() ไม่ใช่การเดาชื่อ) **การย้อนที่ทำแล้ว (bisect step 1):** ถอน ComicDessert (50142) ออกจาก ActivityPreviewPolicy ทั้ง panel entry และ allow_display_item_panels (จาก 163 schedules เหลือตามเดิม) เพราะเป็น delta ก่อนอาการรายงาน การ publish กิจกรรมที่ยังไม่มี handler คือการละเมิดกฎตัวเอง — ต้องมี data path ก่อน publish เสมอ **ตรวจแล้วว่าไม่ใช่:** โปรไฟล์ถูกต้อง (server.json player_uid=52022 ไม่มีการสลับ), mission data ส่งครบตามดีไซน์ (14779 sent / 5 excluded), ไม่มี incomplete object ค้างใน Client (ทุก insertion ของ probe ล้มเหลวก่อนถูกเก็บ — POOL_COUNT ยังเป็น 2 ก่อน/หลัง, SETTEST เขียนค่าเดิมใส่ตัวเอง, relogin หลัง deploy สร้าง module state ใหม่จาก server response แล้ว) **จุดตรวจถัดไป (ถ้าเมนูยังไม่กลับ):** bisect ถัดไปคือถอน mission exclusion 5 IDs (ยอมให้ NRE กลับมาชั่วคราวเพื่อพิสูจน์สาเหตุ) แล้วจึงตรวจ function unlock ที่อ้าง sub-mission เหล่านั้น — ห้ามสรุปแทนการทดสอบแบบมีจุดตรวจ **สถานะงานกาชา (รายงานตรง):** ตู้ใหม่ยังไม่ขึ้นในหน้า Warp, การสุ่มผ่าน UI ยังไม่ผ่าน, การออกหน้าไม่จอดำหลังเพิ่มตู้ยังไม่ยืนยัน — งาน pool creation พักตามลำดับใหม่จนกว่า UI เดิมจะกลับมา ### สรุปสถานะงานกาชา ณ 24 ต.ค. ดึก | รายการ | โค้ด | build+deploy | Client ยืนยัน | | --- | --- | --- | --- | | Standard (1001) / Novice (4001) สุ่ม sandbox roster | ✅ | ✅ | รอผู้ใช้กด | | Mapped per-character banners (mapping 94 → ต้อง regenerate แบบ ID คงที่ด้วย tools/build_gacha_banner_mapping.py ที่แก้ให้ preserve) | ✅ backend | ✅ (GetGachaInfo ปิด preview ไว้) | ❌ ค้างที่ pool creation | | ตู้ limited ดั้งเดิม | ❌ | ❌ | asset ไม่มี 12 path | **หมายเหตุ mapping (ตามข้อเสนอแก้ไข):** `tools/build_gacha_banner_mapping.py` ปัจจุบัน regenerate ตามลำดับ roster แล้ว **ยังไม่ได้แก้ให้ preserve ID เดิม** — ต้องแก้ก่อนใช้จริง: อ่าน mapping เดิม คง (gacha_id → avatar_id) เดิม จัดสรรเฉพาะ avatar ใหม่ด้วย ID สูงสุด+1 และแยกรายงาน limited/standard/ขาด config (ปัจจุบัน 94 = ทุกตัวใน roster ที่มี Eidolon cost ไม่ได้แปลว่า limited ครบ) ### สิ่งที่แก้แล้ว (deployed, มีหลักฐาน log) vs ข้อสันนิษฐาน **แก้แล้ว + หลักฐาน:** - Mission NRE: `GetMissionDataScRsp` มี sub-mission ที่ Client .54 ไม่มี config ทำ `MainMissionData.AddSubMission` NRE ตอน sort — พบ 4 IDs (103380210, 104010267, 104010268, 104020209→216) ใส่ exclusion ครบใน `MissionCompatibility.json` พร้อม provenance หลัง relogin 15:09 ยังเจอตัวใหม่ (104020216) แสดงว่ายังไม่ครบจนกว่า probe จะไล่ครบ — **ยังไม่ประกาศว่าหาย** - GetCurBattleInfo NRE: ตอบ `SceneBattleInfo{}` ว่างแต่ไม่ null ตามแบบ reference (Player.log NRE หายใน login 15:09) **มี source ใน build แต่ยังไม่มี Client ยืนยัน:** - Srtool custom monsters ใน AA: `setChallengeBattleConfigWithLimit` รับมอนจาก tool เมื่อ lease active และ `BattleConfig.Monsters` ถูกแก้จากค่า default เท่านั้น เฉพาะ `BattleTypeAS` โหมดอื่น/เล่นปกติยังใช้มอน resource จริง กฎโหมด/รอบ/คะแนนไม่ถูกแตะ - Activity preview ขยาย: policy เพิ่ม 11 family (RoleTrial 32 panels รวม) → **121 schedules** (จาก 12) ทุกตัวมี prefab+icon จริงและไม่มี DisplayItemList dependency ตรวจ conflict แล้วเป็นศูนย์ กลไก QuestState คือกลไกเดียวกับ 8 family ที่ผู้ใช้เห็นแล้ว - CW role compatibility + projection, Endgame technique เต็มเพดาน, Aha, Stella handlers **ข้อสันนิษฐาน/ยังขาดหลักฐาน — ห้ามรายงานว่าเสร็จ:** - CW Tea Break (EnterBonfire): โครงสร้าง reference (node types: None/Monster/CampMonster/EliteBranch/Boss/Supply) **ไม่มี TeaBreak node และไม่มี EnterBonfire handler เลย** จึงห้ามเดา pending arm ต้องรอ `[GAC_TEA_PROBE]` จาก Client boot ถัดไป - Stella Jump toast: ยังไม่รู้ condition จริง, warning GroupProperty ยังไม่ใช่หลักฐาน — รอ `[GAC_STELLA_PROBE]` - Aha ไม่มีอนิเมชั่น/Cyrene ไม่มีโดม: server รับ cast ถูกต้องแล้ว (log) แต่เป็น config ฝั่ง Client ของ custom avatar — ยังไม่มี probe; ต้องหา avatar ID ของ Aha/Cyrene จาก Client ก่อน (roster ฝั่ง server ไม่มีตัวนี้) - ชุด sub-mission ที่หายยังไม่ครบจนกว่า `[GAC_MISSION_PROBE]` จะรายงาน END - กาชา custom presentation: ยังไม่เริ่มทำรอบนี้ Standard อย่างเดียวยังไม่ใช่เสร็จ; อาการออกแล้วแมพดำยังเป็นเหตุ prefab หาย (index=-1) ### Revision และ provenance Client ที่ตรวจ runtime ล่าสุดเป็น 4.6.54 และ `GameAssembly.dll` SHA-256: ```text 4aa08a0706f27d2cf9951b61920c179140ece9ea94f7e34422c18e46922939b6 ``` CW base capture/เซฟเดิมมาจาก 4.6.53: ```text c5e02e6e984f7e5577c78b995a8efeee2d06ee22e67d484ad5e859c8bf21e144 ``` ห้ามเปลี่ยน label ให้ทั้ง catalog กลายเป็น .54 เพราะ recapture แค่บางตาราง และห้ามใช้ native RVA/MethodHandle ของ .53 กับ .54 หรือใช้ pointer เก่าหลังปิดเปิดเกม `server.local.json` ยังมี launcher client_path ชี้ installation เก่า ขณะที่โปรเซสจริงล่าสุดเป็น installation .54 ให้ตรวจ path ของโปรเซสจริงใหม่ก่อนผูกเครื่องมือ อย่าเดาจากชื่อโฟลเดอร์ และอย่า commit path เครื่องนี้ `battle_diagnostics/` และ `.runtime/` ถูก ignore หลักฐานส่วนมากอยู่เฉพาะเครื่อง ถ้าจะส่งให้ Zcode บนอีกเครื่องต้องแนบไฟล์หลักฐานที่อ้างถึงด้วย ไม่ใช่ส่งแต่ Git diff ### Cleanup ที่ทำแล้ว - ถอด temporary probes จาก `scripts/` แล้ว - Frida session ที่ใช้ดึง GachaMainPage ปิด/detach แล้ว ไม่ได้ kill เกม - รายการ script ณ จุดส่งต่อ: `client_unstuck_request.lua`, `damage_analyst_live.lua`, `freecam.lua`, `hide_ui.lua`, `navigation_profiles.lua` - `client_unstuck_request.lua` เป็นไฟล์ runtime ที่ถูก ignore อย่าสับสนว่าเป็น probe ที่ควรถอดเอง ## 4. งานด่วน A — CW ปุ่มทับและออกแล้วจอดำ ### หลักฐานที่พบ Player.log มี NRE ตามลำดับ: ```text GridFightRoleConfig..ctor(GridFightRoleConfigRow) GridFightModule.GetRoleConfig GridFightRole.set_ID / Team.AddRole / Team.Initialize GridFightGameSession._SyncInternal GridFightModule._OnGridFightGetDataScRsp GridFightGuideBook.get_CompletedChapterCnt GridFightS2EntrancePage._refresh_big_guide_book_btn / _refresh_all_status UITransition GridFightDivisionStartPage -> GridFightS2EntrancePage ``` เซฟเดิมมี role `151102` (avatar 1511) แต่ flat role table ปัจจุบันไม่มี ID นี้ จาก 140 แถวที่อ่านครบ พบ family ใหม่ และ Client handbook default ของ avatar นี้คือ `151112` ไม่ใช่การเลือกจากเลข ID ต่ำสุด การ init ที่ล้มกลางทางเป็นเหตุที่มีหลักฐานรองรับสำหรับหน้า CW ผิดสถานะ ส่วนความสัมพันธ์กับจอดำหลังออก **ยังเป็นข้อสันนิษฐานที่ต้องแยกตรวจ** อย่ารายงานว่าจอดำหายแล้วจากแค่แก้ role ### โค้ดที่ทำแล้ว แต่ยังไม่ได้ deploy ล่าสุด - `internal/common/currency_wars_role_compatibility.go` - เชื่อม loader ใน `currency_wars_catalog.go`, `currency_wars_roles.go`, `currency_wars_variants.go` - `internal/gameserver/currency_wars_role_projection.go` - ใช้ projection ใน `currency_wars_save.go` และส่ง CW response/notify บางกลุ่มใน `session.go` - `resources/CurrencyWarsCurrentRoles.json`: flat role table ปัจจุบัน 140 แถว - `resources/CurrencyWarsRoleCompatibility.json`: overlay มี provenance แยกจาก base catalog - `tools/build_cw_role_compatibility.py`: สร้าง overlay จาก capture Projection แปลงเฉพาะ field ที่ยืนยันว่าเป็น role reference ได้แก่ `role_id`, `CDEAABODKCP.id`, `JJOBHGFOGHP.BGFFICLCKHE` ใน nested messages ไม่เปลี่ยน matching integers ทั้งก้อน และข้าม protobuf maps รักษา UID/star/equipment/position/run progress เดิม ตัวอ่านเซฟเปลี่ยนเฉพาะ detached message ไม่เขียน persistent กลับ การเซฟเกิดในเส้นทาง transaction ปกติ ### ต้องทำต่อ - [x] ตรวจทุกเส้นทาง role reference (audit 24 ต.ค.): ไม่มี map ใดใน proto บรรจุ role-reference message แม้ transitive จึงข้าม maps ได้ปลอดภัย `GridFightEnterBattleStageScRsp`, `GridFightEndBattleStageNotify`, `GridFightGetArchiveScRsp` เข้าถึง role refs ผ่าน SceneBattleInfo/BHBAILHMCOI แต่เดิมไม่อยู่ใน Send switch ของ projection แล้วเพิ่มแล้ว (no-op ตอนนี้เพราะ in-memory run ถูก project ตอนอ่านเซฟแล้ว) `GridFightGetArchiveScRsp` ยังไม่มี handler ส่งจริง เพิ่มไว้เป็นเกราะ ข้อสรุปใน `session.go` Send switch - [ ] ตรวจ scope เปิดใช้ overlay ให้สัมพันธ์กับ target Client/provenance จริง อย่าใช้เพียงเปลี่ยนข้อความเวอร์ชัน - [ ] ปัจจุบัน replacement star variants มี `SaleQuoteKnown:false` โค้ดปัจจุบัน reject การขายถูกต้องแล้ว (`CapturedSalePrice` คืน error ไม่เดาราคา) ต้อง capture ราคาขายจาก Client จึงจะปลดขายตัวนี้ได้ ห้ามเติมราคาเดา - [x] Rebuild Game/SDK แล้ว deploy 14:07 ขณะไม่มีโปรเซสใดรัน (ดู §3) — ยังรอ Client ยืนยัน - [ ] ถ้ายังมี GuideBook NRE หลัง role ถูกต้อง ให้ตรวจ book/chapter config แยก ไม่ซ่อนปุ่มเพื่อกลบ exception - [ ] ตรวจเส้นทาง exit และ UI transition/camera restoration จากต้นเหตุ อย่าเปิด/ปิดกล้องหรือ Canvas ทุกตัวแบบ blanket - [ ] `GridFightQuitLeaveGamePlay` ปัจจุบันเพียงตั้ง `currencyWarsOpen=false` และตอบกลับ โดยรักษา run ให้ Resume; อย่าเพิ่ม abandon run/teleport โดยไม่มี callback evidence หลักฐาน: `cw54-current-defaults.log`, `cw54-role-replacement.log`, `cw54-role-constructor.asm`, `cw54-get-role.asm`, `cw54-role-flat-get.asm`, `cw54-guide-count.asm`, `cw54-guide-sync.asm` ใน `battle_diagnostics/` ### Tea Break ที่จบรอบไม่ได้ — สถานะ 24 ต.ค. บ่าย ผู้ใช้ติดที่ Tea Break (route 2801 chapter 1 section 5) ตั้งแต่ rev 512: ack round-begin 22 → return-prep 23 → preparing แล้ว run ไม่มี pending แต่ยืนอยู่ที่โหนด Tea Break กด Continue แล้ว Client ส่ง `GridFightEnterBonfireCsReq` ×3 (14:19) server ตอบ retcode 0 ตาม schema (retcode-only) แต่ไม่มีอะไรตามมา Client จึง retry แล้วผู้ใช้กดออก สิ่งที่ capture ได้จาก reference (`.runtime/march_cw_teabreak_capture.go`, `march_cw_next_after_teabreak.go`, ไฟล์ `march-cw-teabreak*`/`march-cw-next-*` ใน battle_diagnostics): - Queue ของ pending เป็น cursor ต่อ run ที่เพิ่มทีละ action (16→17, 17→18, 19→20) และ Client รับค่า jump ไม่ต่อเนื่องได้ (เคย 16→20 ผ่าน) - Entry ใน CurrencyWarsNodeTransitions หมายถึง transition FROM section N TO N+1: next_pending_wire = round-begin ของ N+1, round_pending_wire = pending หลัง ack round-begin ที่ N+1 ปัจจุบันมี 1-4 ห้ามตีความว่าครอบคลุม route - section 6 (1-6) มี round-begin 19 → ack → return-prep 20 → preparing แต่ยังไม่มี level wire (IMPNAHBCADN) ของ 6 ใน sync ที่ capture ได้ จึงยังสร้าง entry 5→6 ไม่ได้ **ข้อจำกัดสำคัญ:** โค้ดอ้างอิง March7 (`.runtime/march-source`) **ไม่มี handler ของ GridFightEnterBonfire เลย** และมี state machine เต็มรูป (GridFightSession Phase/PrepareCurrentNode/AdvanceToNextNode/GetNextNode จาก route config) แต่ไม่ implement Tea Break การ capture จาก reference จึงผลิต choice arm ของ Tea Break ไม่ได้ สิ่งที่ขาดคือหลักฐานว่า Client คาดหวัง pending arm ใดหลัง EnterBonfire ต้องโพรบฝั่ง Client (bounded, named types) หรือหา reference ที่ implement ห้องนี้ **ห้ามเดา arm/เติม pending มั่ว** งานต่อไปที่ชัด: โพรบ Client หา expected arm หลัง EnterBonfire; ศึกษา GridFightSession ของ March7 เป็นแบบแผน implement node advance จริง (แทน captured wires) เพื่อจบ route; หรือ reset บัญชีอ้างอิง (admin gameplay/reset) แล้ว replay ทั้ง route เพื่อ capture level wire ของ section ถัด ๆ ไป ## 5. งานด่วน B — กาชาเลือกตัวละครได้จริง ### สถานะจริง - ผู้ใช้เห็นเฉพาะ Stellar Warp/Standard จึงยังไม่ตรงคำขอ - `AssetMgr.Exists` ยืนยัน Standard และ Novice prefab มีจริง แต่ limited character/lightcone ทั้ง 4 path ใน captured table ไม่มีจริง - การส่ง Seele limited prefab เคยทำให้ `UIPrefabLoader` ArgumentNullException ระหว่าง `GachaMainPage._create_pools_panel` แล้วกลับแมพดำ - ปัจจุบัน policy เปิดแค่ Standard สำหรับดูหน้า ส่วน `DoGacha` ของ Standard ตอบ NOT_SUPPORT นี่เป็น mitigation ไม่ใช่ฟีเจอร์เสร็จ - Captured GachaBasicInfo มี 6 แถวและ character candidates 2 แถว ไม่ใช่ตู้ครบทุกตัวละคร - ห้ามนำ limited paths กลับมา enable เพียงเพราะมีแถวในตาราง ### ไฟล์หลัก - `internal/common/gacha_catalog.go` - `internal/gameserver/handlers_gacha.go` - `resources/GachaSandboxPolicy.json` - `resources/PreviewGameplayCatalog.json` - หลักฐาน `battle_diagnostics/gacha-asset-exists-20261024.log` Backend grant ที่เตรียมไว้ให้ตัวเด่นของ banner และ duplicate material ตาม first Eidolon cost จริง โดย merge latest import ใต้ shared lock ไม่เปลี่ยน rank/EX/Traces และยัง reject first acquisition ของ avatar ที่ไม่มีใน imported roster ต้องทำ acquisition ให้ครบถ้าจะรองรับกรณีนั้น ### จุดที่เพิ่งอ่านได้ เพื่อไม่ต้องเริ่มใหม่ Client ใช้ **Luau** (`xluau.dll`) ไม่ใช่ LuaJIT: - `string.dump` ถูกถอด ไม่มี `jit.util` - มี `debug.getupvalue`, `debug.getinfo`, `debug.info` และ `package.loaders` - ใช้ `package.loaders[3]('Ui.Gacha.GachaMainPage')` อ่าน loader closure ได้ **โดยไม่ execute closure และไม่แทน package.loaded** - Passive hook ที่ `xluaL_loadbuffer` ได้ bytecode ของ `@BakedLua/Ui/Gacha/GachaMainPage.bytes` ขนาด 23630 bytes - REA evidence: `ev_57f147cb094af2060be82f5110e378d25ff2179f0390c56348368a855e7658b8` - เก็บ `gacha-main-page.luau`, `gacha-main-page.hex`, `gacha-main-page.json` ใน `battle_diagnostics/` - `tools/inspect_luau_v4.py` อ่าน Luau v4/type1 และ export prototypes/constants/locals โดยไม่ execute bytecode - Layout reference คือ upstream Luau `VM/src/lvmload.cpp` และ `Common/include/Luau/Bytecode.h`; สำเนาอยู่ใน diagnostics การ parse สำเร็จไม่เท่ากับถอดความ behavior ทุก opcode แล้ว `_create_pools_panel` prototype 26 / line 308 อ่าน group data ผ่าน `GetSortedGachaGroupDatas` แล้วใช้ `DefaultGachaPoolData.PrefabPath`, `sync_load_prefab`, `_gachaType2tabItem`, `create_panel`, `set_tab_data` มีแยก single-pool/group path `BaseGachaPoolData.Row` มี getter/setter และ `GachaModule.GetGachaPoolData` / `GetSortedGachaPoolDatas` มีจริง แต่ **ยังไม่มี production patch เปลี่ยน prefab/สร้างตู้เพิ่ม** การใช้ Standard prefab แทน limited ยังไม่ได้พิสูจน์ binder/controller compatibility อย่าเปลี่ยนแบบสุ่ม Loaded presentation modules มี `DefaultGachaAvatarPanel`, `DefaultGachaUpAvatarPanel`, `DefaultGachaPoolTabItem` โดย UpAvatarPanel มี `_init_imgs`, `_setup_up_avatar_img`, `setup_view` อาจเป็นทางต่อ generic presentation ที่ต้องอ่านเพิ่ม ### ต้องทำต่อ - [ ] หาวิธีแสดงตู้ตามตัวละครด้วย asset ที่มีจริง และ bind controller ได้ถูกต้อง - [ ] ถ้าทำ custom presentation ต้องมีตัวละคร/ชื่อ/ภาพตรงกับผล draw และแยกจากการอ้างว่า official prefab ใช้งานได้ - [ ] ให้ catalog ที่ UI แสดงกับ catalog ที่ backend รับ draw เป็นชุดเดียวกัน - [ ] รองรับ 1/10 draws ตาม policy และ duplicate/material persistence โดยไม่ทำลาย progression - [ ] ตรวจ acquisition ถ้า avatar ยังไม่มีใน import - [ ] แก้ entry/exit ให้คืนโลกปกติ ไม่ทิ้ง pending transition - [x] แก้ note ใน GachaSandboxPolicy แล้ว (24 ต.ค.): asset_verification_note ปัจจุบันระบุว่าตรวจครบ 6 path แล้ว ตามหลักฐาน `gacha-asset-exists-20261024.log` ## 6. งานด่วน C — กิจกรรมกลับมาและเข้าไปดูได้ ### สถานะ ผู้ใช้เห็นแค่ CW กับ Anomaly Arbitration กิจกรรมที่เคยเพิ่มหายไป เพราะปิด policy หลังพบ ActiveActivity invalid item และ RaidCollection missing reward icon ล่าสุดอ่าน `AssetMgr.Exists` ครบ 290 panel/icon paths โดยไม่ load asset แล้ว เก็บผลใน `resources/PreviewAssetAvailability.json` ใช้ source/provenance ปัจจุบัน ### ทำแล้วใน source / ยังไม่ deploy - `ActivityPreviewPolicy.json` เพิ่ม 8 prefab families ที่มี asset หน้าและ TabIcon และไม่มี explicit DisplayItemList dependency - `activity_preview.go` ตรวจ availability ก่อนประกาศ schedule - กลุ่ม `QuestState` ใช้ handlers quest/mission เดิม - เพิ่ม `GetMultipleDropInfo` typed response มี panel entries และ zero counters เป็น preview ไม่ใช่สิทธิ์ double/triple drop ที่แต่งขึ้น - ActiveActivity/RaidCollection ที่มี error ยังไม่เปิดกลับ - `GetFiveDimMiniGameData` ยังตอบ empty list ไม่ใช่การทำมินิเกมสำเร็จ ### ต้องทำต่อ - [x] ตรวจ module-ID/panel-ID association และ dedup (24 ต.ค.): พบ conflict จริงตามข้อสันนิษฐานเดิม โมดูล `1002101` ถูกอ้างใน 14 กิจกรรมรีรัน ข้าม panel 10021 และ 10113 แต่ทั้งคู่เป็น prefab เดียวกัน (`QuestFarmMultipleDropPanel`) และ handler เดียวกัน จึงเผยแพร่รายการเดียวถูกต้องอยู่แล้ว `activity_preview.go` ถูกแก้จาก first-match เงียบ ๆ เป็น: รวม candidate panels ต่อโมดูล เรียง deterministic แล้ว error ทันทีถ้า panels ใด handler/prefab ไม่ตรงกัน ผลลัพธ์กับข้อมูลปัจจุบันเหมือนเดิม 12 schedules (10 drop + 2 quest) fallback `PanelID==0 -> ActivityID` มีใช้จริงเฉพาะกิจกรรม 10054 และสอดคล้อง pattern module = panelID*100+1 ของทุกแถว explicit - [ ] เลือกกิจกรรมที่มี dependencies ครบและ handler entry/data จริง เพิ่มเป็นรายระบบ ไม่ publish ทุกแถวพร้อม success ว่าง - [ ] ตรวจเวลาตาม activity schedule config ไม่ hardcode deployment time (ตอนนี้ schedules ใช้ `cfg.ActivitySchedule` ร่วมกับ Endgame แล้ว แต่ยังไม่ได้ตรวจว่าตรง schedule config ของกิจกรรมแต่ละตัว) - [ ] แยก preview/reward/gameplay support ในเอกสารให้ชัด - [x] Rebuild/deploy ทั้งคู่จาก source ล่าสุดแล้ว 14:07 (ดู §3) — README ที่บอก previews withheld ยังต้องอัปเดตเมื่อมี Client ยืนยัน - [ ] ยังไม่มี Client confirmation ว่ากิจกรรม 8 families ชุดนี้แสดง/เข้าได้จริง ## 7. งานด่วน D — Stella Jump ด้านข้าง ### สิ่งที่ผู้ใช้เห็น หน้าเดิน Starfroster ตรง gateway รูปโดนัท/เครื่องเล่น กด F Investigate แล้วขึ้น **There's still more to do…** ยังไม่เข้าเกม การมี GetCase handler จึงยังไม่แก้จุดเข้าที่ถูกปฏิเสธอยู่ก่อน ### ส่วนที่มีแล้ว - `resources/StellaJumpConfig.json`: ChenLingGameBoyCaseRow ปัจจุบันครบ 16 แถว มี group/instance/entity/challenge/cheat quest ตาม capture - `internal/common/stella_jump.go`: separate persistent records; read-only reads และ targeted locked writes - `handlers_stella_jump.go`: GetData, Finish, Ranking, Settings และ cheat requests ที่ยังเป็น obfuscated names - response มี case payload ไม่ null และ expose challenge packs โดยไม่เก็บเวลาปลอมเพื่อปลดล็อก - Handler path และข้อมูล GameBoy ไม่ได้พิสูจน์ว่า gateway ในภาพใช้ GameBoy entry เดียวกัน ต้องตรวจ actual caller ### ต้องทำต่อ - [ ] ระบุ condition/scene task ที่ gateway ตรวจแล้วแสดง toast จากข้อมูลจริง อย่า complete ทุก mission/ตั้งทุก condition เป็น true — **audit จาก gameserver.log/server_debug.log 24 ต.ค.:** การ Investigate ที่ขึ้น toast คือ prop entity 1035 และ 1012 ด้วย interact_id2=1100 (server ตอบ real prop state=1 ถูกต้องแล้ว) มีรอบหนึ่ง Client เปิด UI GameBoy เองโดยไม่ผ่าน InteractProp (SetClientPaused + `GetChenLingGameBoyDataCsReq` case 16) แล้วปิดเอง ไม่มี request เริ่มเกมตามมา toast จึงเป็นเงื่อนไขฝั่ง Client ที่ยังไม่ถูก capture **สิ่งที่ขาด:** โครงสร้าง `ChenLingGetDataScRsp` (CmdID 9612) ที่มีข้อมูลจริง — Client ส่ง `ChenLingGetDataCsReq` ทุกครั้งโหลด floor และ server ปล่อย drop (danger family "ChenLing" + ไม่มี typed handler, log ขึ้น "Unknown command ID: 9612") GameBoy อยู่ในระบบ ChenLing Fes และ `BDOEDOEBFAJ` เป็น Fes board state เต็มรูป (stage/hp/entity_list/pending) การตอบว่างเคยทำ NRE จึงต้องมี capture จากเซิร์ฟเวอร์ทางการหรือ runtime ก่อน ห้ามเดาโครงสร้าง ที่ `.runtime/march-source/.../sc-packet-handlers.json` มีแค่ RVA ของ client callbacks ไม่ใช่ตัวอย่างข้อมูล - [ ] Player.log 24 ต.ค. มี warning `[FiveDim] Group 12 的GroupProperty LG_110001__262_MapIconState_Auto 不存在!` ตอน CartographyFiveDim init จาก GetSceneMapInfoScRsp — เป็น warning ฝั่ง config ของ FiveDim instance 110001 (Stella Jump case 1) ยังไม่พิสูจน์ว่าเกี่ยวกับทางเข้าล็อคโดยตรง ต้องแยกตรวจก่อนอ้าง - [ ] แยก ordinary FiveDim entrance/transfer/minigame กับ ChenLingGameBoy ให้ถูก ไม่เอา Parkour/รถแข่งมาปน - [ ] อ่าน FiveDim enter/transfer/leave/update schema consumers และต่อ state/position callbacks ให้ครบสำหรับทางเข้าเป้าหมาย - [ ] ปลด stage/challenge ตาม case/config ที่ตรง Client และเปิดเข้าเล่นได้จริง - [ ] บันทึกผล/เวลา/challenge จริง รักษาเซฟ CW และส่วนอื่น - [ ] cheat response extra boolean ยังมี label ไม่ยืนยัน ต้องเก็บข้อจำกัดไว้ ### ข้อมูลสำหรับวิเคราะห์ต่อ `FiveDimModule` ปัจจุบันมี `RequestEnterGame`, `RequestTransfer`, `RequestLeaveGame`, `RequireChenLingGameBoyData`, `EnterChenLingGameBoy`, `FinishFiveDimMiniGame`, `_OnGetFiveDimMiniGameDataScRsp` และ `_GameConfig` `GetFiveDimGameDataScRsp` callback ที่อ่าน native ล่าสุด sync jump-energy scalar ไม่ได้ sync nested state ทุก field จึงอย่าเพิ่ม nested payload โดยหวังว่าจะปลดทางเข้าเอง `_GameConfig` มี Scroll/Player/Camera/Physics/Avatar/Level/Audio/MiniGameCollection/Achievement/Misc config การ Serialize PlayerConfig ทั้งก้อนเคยติด self-referencing vector.normalized loop ต้องอ่านเฉพาะ primitive/named fields Starfroster floor 20571001 มี scene entry Town/Story แยกกัน `res.json.scene_config` เป็น list ใช้ key `entryID` ไม่ใช่ map/entry_id มี props 151 ตัวต่อ entry เก็บ Prop ID/JsonPath เดิมไว้ใน `battle_diagnostics/prop-source-rows.json` แต่ capture นี้เป็น revision เก่า ต้องตรวจความตรงรุ่น **ห้ามใช้ broad LoadRtLevelFloorInfo probe เดิมเพื่อไล่ graph ใหม่** เคยทำ Client crash แล้ว ใช้ข้อมูลที่โหลดอยู่หรือ exact named config ที่รู้วิธีอ่านปลอดภัย เครื่องมือที่เตรียม: `tools/preview_minigame_metadata.lua`, `preview_gameboy_metadata.lua`, `fivedim_config_metadata.lua`, `fivedim_minigame_config.lua` และ logs `preview-gameboy-current.log`, `preview-minigame-current.log`, `gameplay-regression-metadata.log` ## 8. แต้มเทคนิค Endgame และ Aha's Help ### แต้มเทคนิค — แก้ source แล้ว ยังไม่ยืนยัน/ยังไม่ deploy ล่าสุด - ผู้ใช้หมายถึง **แต้มเทคนิคปุ่ม E ตอนเดินก่อนสู้** ไม่ใช่ skill points ใน Battle - `lineupInfoFromAvatars` สร้าง Endgame lineup เริ่ม Mp ตาม MaxMp - `Session.techniqueLineup` ใช้ MaxMp เป็นค่าเริ่ม session เมื่อมี ChallengeRun; overworld และหักแต้มต่อ cast ยังคงเดิม - เพดานทีมที่ตรวจจาก resource เป็น 7 ขณะที่ผู้ใช้บอก 8 ไม่ได้เพิ่มเลข 8 ตายตัว ต้องรองรับเพดานที่ rule/team คำนวณได้จริง - ไฟล์หลัก `handlers_challenge.go`, `technique.go` ### Aha — ผู้ใช้ยืนยันแล้วว่าแสดงใน combat - Frontend envelope เคยอ่าน `/api/persistent` ผิด field; แก้เป็น `persistent` และโหลด selector แยกจาก character cache - เลือก LV 1–3, explicit off และ FreeSR fallback ได้ - custom Corruption battle เดิมไม่เข้า branch ที่ผูก ChallengeStageID; เปลี่ยนให้ตรวจ Corruption buffs ใน outgoing battle จริง - บันทึกระดับที่เลือกมีผลตอนสร้าง Battle ถัดไป ไม่แก้ battle ที่กำลังเล่น - ผู้ใช้ยืนยัน “ขึ้นแล้ว” ห้ามรายงานว่ายังรอเลือก LV ตามเอกสารเก่า - หลักฐาน `AHA_HELP ... selected=3 ... support=3034013 level=3` และ `battle_diagnostics/aha-help-web-20261024.png` - ไฟล์ `aha_help.go` ทั้ง common/gameserver, SDK `api_aha_help.go`, `AhaHelpConfig.json` และ GaC-srtool ฝั่ง Save Manager ## 9. หลังแก้ regressions: ทำ CW ต่อให้ครบ ### ผู้ใช้ยืนยันผ่านมาก่อนแล้ว (เฉพาะเส้นทางที่ลอง) - Standard เข้าเกม/ซื้อหนึ่งตัว/จัดตัว/เริ่ม Battle ห้องแรก - ซื้อ EXP และขายตัวที่ไม่ได้ติดอุปกรณ์ - รวมตัว 3 ตัวอัปดาว และติดตามอุปกรณ์ - Plot Armor เลือก Protagonist และ Battle หลังเลือก - Encounter combat/settlement ไปห้อง 1-5 การยืนยันเหล่านี้เกิดก่อนพบ Client revision เปลี่ยน จึงต้องรักษาเส้นทางเดิมและระวัง schema/config ต่างรุ่น ไม่ใช่หลักฐานว่าห้องทุกแบบและ Overclock ครบแล้ว ### ยังต้องทำ - [ ] Backstage Tea Break: choices/effects/queue acknowledgement/next room - [ ] Automatic Orb drops ตาม killed instance/node/talent rule จริง ไม่ให้ Orb ทุก Battle แบบตายตัว - [ ] เปิด Orb และ resolve reward ด้วยตาราง combination/basic bonus ที่ตรงรุ่น - [ ] Consumable effects/stack/use/consume quantity ให้ครบ - [ ] Forge/equipment crafting/dressing และ returned equipment state ให้ตรง Client - [ ] Supply, Encounter alternate branches, Spotlight, Trial, Boss และ transition ต่อห้องสำหรับ Standard/Overclock - [ ] Completion/settlement/rank/weekly/season rewards ตามข้อมูลจริง ไม่แต่งคะแนน - [ ] Pending-action oneof ทุก arm ที่ผู้ใช้เข้าได้ ต้อง mutation + notify + ack ถูกต้อง ไม่ตอบ null success เพื่อดับ spinner - [ ] เติม commands/handlers ที่ยังไม่รองรับจาก inventory โดยดู semantics ไม่ใช่นับ registration ว่าครบแล้ว - [ ] Resume/leave/abandon/unstuck ไม่ทำ run หาย ไม่หัก/แจกซ้ำเมื่อ resend และไม่ทำ stale session ทับ API command ### คำสั่งเสกที่มีแล้ว ```text /cw status /cw list role|equip|orb|consumable|forge /cw gold /cw hp /cw exp /cw equip|orb|consumable|forge [count] /cw role [count] ``` ผ่าน SDK command queue, ผูก UID/run และ apply ใน Preparation เท่านั้น คิวกับ snapshot ใช้ revision/atomic persistence สิ่งที่ยังไม่มีจริงอย่าแสดงว่าคำสั่งรองรับครบแล้ว แยกการ “เสกเข้ากระเป๋า” จาก “กดใช้แล้ว effect สำเร็จ” ### เอกสารและ reference - `docs/currency-wars-coverage.md`: request registration และ pending arms ที่ยัง missing เป็น snapshot ไม่ใช่หลักฐาน gameplay - `docs/currency-wars-6900-audit.md`: 6900 คือ RET_GRID_FIGHT_CONF_MISS ไม่ใช่ CmdID; อ่านส่วน Subsequent recovery ที่แก้ blocker เก่าแล้ว - `docs/currency-wars-investigation.md` - Reference ที่ผู้ใช้ให้คือ March7 PS ใต้ `E:\beta hsr\server` (ตำแหน่งเฉพาะเครื่องสำหรับงานวิเคราะห์ ไม่ใส่ลง source/startup) - มี isolated reference/captures ใต้ `.runtime/` เทียบได้ แต่ห้าม promote ทุกค่าจาก reference เก่าเป็น Client ปัจจุบัน - Orb data: current capture 529 Orb, 18 consumable, 11 Forge, 478 combination; เทียบ reference ได้ตรงแค่บางส่วน (347/478 combination, 276/529 Orb มี direct basic-row match) ## 10. Backlog เก่าที่ต้อง audit สถานะ ห้ามบอกว่าเสร็จหมดจากความทรงจำ รายการนี้เก็บจากคำขอในแชต มีบางส่วนเคยแก้แล้ว แต่ไม่ครบทุกเรื่องที่มีผลยืนยันล่าสุด ให้ตรวจ code/evidence ก่อนเปิดงานซ้ำ: - [ ] ทุก Endgame: เซฟทีม/คะแนน/เลือกห้องต่อโดยไม่เริ่มห้องแรกทุกครั้ง และ PF/Starward/MoC/AA/AS ไม่ค้างเปลี่ยนห้อง - [ ] Traces แสดงระดับใน Client และ GaC-Srtool ตั้ง/เซฟได้ - [ ] บัฟ/แต้มเทคนิคจากตัวละครก่อนสู้, อาหารเติมแต้มและ auto-use - [ ] Acheron E ฆ่ามอนข้างทางได้ตามกฎ, debuff technique ไม่ fail to use ability - [ ] มอนข้างทางใช้ monster/stage/version ตรงตัวที่ตีหรือถูกตี Custom monster เฉพาะเมื่อใช้ Srtool ตามคำขอ - [ ] prop ข้างทางที่ตีแตกให้แต้ม/บัฟตามชนิดจริง - [ ] animation/effect E ของ Aha และโดม Cyrene ผู้ใช้บอกว่าไม่เกี่ยวกับ Freecam - [ ] Freecam หันด้วยเมาส์ได้ แต่ขณะต่อสู้ mouse click ไม่ trigger attack/เปลี่ยนสกิล; Q/E ใน Battle ไม่ขยับกล้องขึ้นลง ใช้ PageUp/PageDown แทน และคืน input เมื่อปิด - [ ] Hide UI: ซ่อน UI ตัวละคร/หลอดอัลติ/action bar ใน Battle และ character/EX Eidolon UI แต่ไม่ซ่อนภาพ EX/ทำพื้นหลังเบลอ; **ต้องรักษาชื่อเซิร์ฟเวอร์ ชื่อ PS และ UID** - [ ] Preset ทีม 20 slots/การนำทีมที่เคยจัดมาใช้ และการเซฟหลังสลับ - [ ] UID 52010, ชื่อ login AFN -> GaCy และบอกผู้ใช้ว่าแก้ตรงไหน; ห้าม hardcode user identity เพิ่มเพื่อกลบ config - [ ] ของแต่งตัวผู้บุกเบิกต้องปลดตามตาราง - [ ] run.bat/startup เช็ค Go/requirements ดาวน์โหลดตาม config, SDK/Game/launcher ใช้ค่าเดียวกัน และ consoles มองเห็น - [ ] ก้อน Eidolon ยังคงอยู่ในกระเป๋าแม้ E6/EX เต็มแล้ว ตามคำยืนยันผู้ใช้ - [ ] Unstuck ใน GaC-Srtool ใช้ได้โดยไม่ต้องออกเข้าเกม ไม่ลบ run/progression - [ ] Story/Town ในหน้า M: ผู้ใช้ยืนยันแล้วว่าแยกปลายทางและภาพฉากได้ รักษา `navigation_profiles.lua` กับ entry override; ยังต้อง audit เสาวาร์ป/ห้องภายใน/รถไฟ Starfroster ตามข้อร้องเรียนเก่า - [ ] มีคำขอ git ในอดีต แต่รอบส่งต่อนี้ยังมีงานค้างจำนวนมากและไม่ได้อนุญาตให้ commit/push งานปัจจุบันโดยอัตโนมัติ ## 11. วิธีรับงานต่อที่แนะนำ 1. อ่าน AGENTS, git diff และเอกสารนี้ ตรวจ process/module/config ที่เป็นปัจจุบันอีกครั้ง 2. แยก source-ready fixes จาก deployed fixes อย่าขอให้ผู้ใช้ลอง build ที่ยังไม่ได้วาง 3. ทำกาชา/กิจกรรม/Stella กับ regressions CW ตาม sections 4–8 โดยใช้หลักฐานที่เก็บแล้ว 4. ถ้าใช้ REA หรือ runtime probe ให้ตรวจ identity ใหม่ ใช้เฉพาะ target ที่ระบุ จำกัดงานต่อ frame และ cleanup เสมอ 5. Rebuild ทั้ง Game และ SDK หลังแก้ source/resource ครั้งสุดท้าย สำรองและ deploy ตอนนอก Battle เมื่อจำเป็น (build/deploy รอบ 14:07 24 ต.ค. ทำแล้ว แต่ถ้าแก้ต่อต้อง rebuild ใหม่) 6. ไม่รัน tests/ไม่วนขอ gameplay retry ตามคำสั่งล่าสุด รายงานสิ่งที่ยังไม่มี Client confirmation ตรง ๆ 7. อัปเดตเอกสารสถานะให้ตามจริง แล้วจึงเดิน CW progression ต่อ ไม่บอก “ครบทุก handler/ทุกกิจกรรม” จากการมี success response หรือ build ผ่าน ### ขอบเขตที่ยังไม่ได้เสร็จ ณ จุดส่งต่อ **ตู้ตัวละครที่เลือกสุ่มได้, Stella Jump gateway, การเล่นกิจกรรมทุกตัวที่ต้องการ, CW exit black-screen confirmation และ CW เต็มโหมด ยังไม่เสร็จ** CW role compatibility, event preview families, Endgame technique initialization และงาน audit รอบ 24 ต.ค. (projection ชื่อเพิ่มเติม, activity loader, policy note) รวมอยู่ใน build/deploy 14:07 แล้ว แต่ **ไม่มี gameplay confirmation สำหรับทั้งชุด** เซิร์ฟเวอร์ยังไม่ได้สตาร์ตหลัง deploy ไม่ควรเริ่มใหม่จากศูนย์หรืออ้างว่าวางครบแล้ว # Latest continuation — 2026-10-26 ### Ping colors and CW Go follow-up Ping colors is now user-confirmed: all bars and real latency digits animate, colors match, and digit changes do not flicker. `scripts/ping_rainbow.lua` uses white-RGB/original-alpha masks for the single-sprite signal icon and colors the native TextGenerator glyph mesh at the canvas boundary. No rich text is written over the native ping value. Current `10ms` capture contains 16 populated vertices, without an extra unused quad. See `docs/ping-colors.md`. CW Go's current captured panel exists (71101) but is PreGuide2. Its actual ActivityPanelConditionRow requires FinishMainMission8047206; the old initial mission response omitted it. Common Go consequently chooses GuideGoto6417 instead of ActivityGoto6418. `resources/CurrencyWarsActivityConditions.json` retains that exact current row/provenance; `LoadCurrencyWarsGuideMissions` validates it and adds only its declared guide missions to the shared mission unlock view. Expected GetMissionData main count:149 instead of148. It does not finish all2205 imported main missions or force Lua state. See `docs/cw-book-entry-recovery.md`. The combined standard/shipping Game+SDK build passed and both root servers were restarted after this fix. All temporary probes were removed from scripts/ and the passive Frida capture session was detached. Fresh GetMissionData logged149 main missions; actual EnterScene resolved CW entry2032202, and the user confirmed teleport works after relogin. This closes the reported silent Go entry failure, not the still-incomplete gameplay inside the CW run. This section supersedes older deployment/feature status below; historical investigation details are retained. - The overworld loading recovery was confirmed by the user. A separate AA entry failure then reported `CreateNPCMonster Invalid ID 4015011`. - The updated FFGO reference was inspected offline, never executed. Complete CmdID/protobuf/function/direct-call/resource dumps are under `battle_diagnostics/ffgo-20261026/`; reproducible tools and interpretation are documented in `docs/FFGO-CW-REFERENCE-20261026.md` and `docs/ffgo-cw-resource-reference.md`. - AA scene correction now uses an explicit provenance-backed 44-row resource. Peak 204 maps to NPC 4015010 / entry 3013701 / group 10. All 44 NPCs also occur in the reference's extracted NPC Excel table. The last eight scene placements still require supplementary data or reject before EnterScene. Actual current Client acceptance remains unverified until the new build is exercised. See `docs/aa-scene-npc-recovery.md`. - Gacha: enabled native registration of 71 eligible five-star banners is confirmed by Client logs. The user confirmed the prototype art/panel fix. Latest 80/10 pity, three four-star portraits and atomic reward persistence were deployed previously but not Client-confirmed after that change. The old OFF gate in historical notes no longer describes current policy. See the current-status section of `docs/GACHA-NATIVE-ADAPTER.md`. - ComicDessert GetData preview now has a real four-cycle/fifteen-level catalog and sends initial cycle 1. Starting/finishing cooking remains unfinished. - CW reference extraction closes the old missing-table gap: 72 tables, including bonus pools, basic bonuses and bonfire options. Reference custom recipes are labelled implementation evidence, not original Client JSON. The current route's Tea Break can be a PetPal override of a static Monster node; never replace the active run with the reference route/player save. - Active source work in this continuation: Tea Break creation/selection and persistent PetPalStarDown effect; scoped real Orb payout and current packet translation. Pending-next-node construction still needs a broader port; existing captured transitions cover only the first four nodes. Do not claim CW complete from menu success or a successful compile. - Still carry forward: Stella Jump portal/condition unlock, missing activity gameplay and previews, CW remaining route/reward/effect progression and exit black-screen confirmation, Aha/Cyrene presentation issues, and earlier UI/ cosmetics/interaction reports where no Client confirmation exists. Deployment: `run.ps1 -Action build` completed for standard and self-contained Game/SDK binaries, then `run.ps1 -Action servers` started both root servers in visible consoles. A private predeployment checkpoint retains saves, local settings and previous root executables. No research probe was staged; scripts/ contains only the four maintained scripts. No tests were run. The new AA scene, Tea Break and Orb paths have not yet been confirmed in the Client. Integrated Tea Break scope: resource-backed menu and option selection, phase-1 sync, atomic saved PetPalStarDown rule and one-time future-layer star reduction. Heal and take-drop/advance remain explicit unsupported operations. Integrated Orb scope: current named handler, atomic removal/rewards, native notification and grouped context for supported fixed/declarative recipes. Ordinary Orb100's weighted bonus pool and general effect hooks remain unfinished. See `docs/currency-wars-ffgo-workflow-20261026.md` and `docs/currency-wars-ffgo-orbs.md` before claiming broader completion.