[ { "n": 2, "name": "ตัวละครไม่แสดง", "detail": "หน้าเลือกเกม Quiz battle ภาพตัวละครไม่แสดง", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "Minigame 1" }, { "n": 3, "name": "ระบบ join เกมมีปัญหา", "detail": "เมื่อเข้ามินิเกม : บางคนเล่นเกมกะบอท บางคนเล่นกะเพื่อน แต่ละคนเข้ามินิเกมแล้วเจอกันบ้าง ไม่เจอกันบ้าง", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 5, "name": "ระบบ Host มีปัญหา - 2", "detail": "เมื่อกดออกจากเกม Host เปลี่ยนจากพี่ต้อมเป็นพี่คิวอัติโนมัติ", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 6, "name": "ระบบ Host มีปัญหา - 3", "detail": "เมื่อเข้ามินิเกม ทุกคนเห็นตัวเองเป็น host หมดเลย แต่กดเริ่มเกมไม่ได้", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 7, "name": "ระบบสีตัวละคร ยังใช้ไม่ได้", "detail": "สีตัวละครเปลี่ยนไปเรื่อย ไม่รุ้ว่าเราสีอะไรแน่ งงไปหมด", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 8, "name": "หน้าเข้าร่วมเกมส์", "detail": "ห้องไหนที่เริ่มเกมส์ไปแล้ว เมื่อกดเข้าร่วมแสดง popup alert error ปรับดีไซต์ให้สวยงามกว่านี้", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 9, "name": "เกมวิ่งขึ้นบันได ผิด flow", "detail": "ปรับ flow ให้ถูกต้อง คือ ใครตกจอตาย แต่ถ้าขึ้นไปอยู่บนสุดแล้วจะกระโดดไม่ไปต่อเฉยๆ แต่ไม่ตาย", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "Minigame 5" }, { "n": 10, "name": "เกมวิ่งขึ้นบันได", "detail": "เวลาหมดแล้ว ให้เล่นรอบ 2 auto / รอบ 3 มี popup ให้กดเล่นต่อ", "prio": "", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "Minigame 2" }, { "n": 11, "name": "เกมยิงลูกโป่ง", "detail": "ฉากเกมยิงลูกโป่ง (MG7 Mega Virus) เล็กไป — ต้องการให้ภาพพื้นหลัง (BG) เต็มจอ แต่การเดิน (movement) และพื้นที่เล่น (area) ต่างๆ คงเดิม", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "แก้แล้ว (deploy prod play.js?v=0.006250401): BG ของ MG7 เป็นภาพ 16:9 (1920x1080) แต่โค้ดเดิม map ภาพเข้า world rect 4:3 (640x480) ทำให้ภาพถูกบีบ + เหลือขอบดำซ้าย-ขวา = ฉากดูเล็ก. เปลี่ยนการวาด BG ของ balloon_boss เป็นแบบ cover เต็มจอ (รักษาสัดส่วน 16:9, crop ส่วนเกิน, จัดกึ่งกลาง) วาดแยกจาก world layer → กล้อง/movement/area ของเกมคงเดิมทุกอย่าง เปลี่ยนเฉพาะพื้นหลังให้เต็มจอ. ไฟล์: Game/public/js/play.js (draw loop, สาขา isBalloonBoss cover-fill).", "cat": "Minigame 7" }, { "n": 14, "name": "Room ID", "detail": "เวลาจอยห้องให้กรอกเเค่ ID กับรหัสที่สร้าง", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 16, "name": "grid กับ ฉาก ไม่ตรงกัน", "detail": "เกม Quiz battle เกมที่ 1 ฉากกับกริดไม่ตรงกัน ทำให้เดินทะลุ หรือเดินติดในจุดที่ไม่ควรติด", "prio": "สูง", "status": "เปิด", "updated": "", "note": "", "cat": "Minigame 1" }, { "n": 17, "name": "ตัวละครวิ่งเร็วเกินไป", "detail": "เกม Quiz battle เกมที่ 1 ตัวละครผู้เล่นเร็วเกินไป", "prio": "กลาง", "status": "เปิด", "updated": "2026-06-25", "note": "", "cat": "อื่นๆ" }, { "n": 18, "name": "Oauth Social log-in error", "detail": "ไม่สามารถ log-inด้วย facebook / Google ได้ path: /oauth-public.php", "prio": "ต่ำ", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 19, "name": "หน้า login", "detail": "นโยบายความเป็นส่วนตัวกดไม่ได้", "prio": "กลาง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 20, "name": "แสดงเลข version ตรงมุมจอ", "detail": "แสดงเลข version ตรงมุมจอขวาบนหรือขวาล่างก็ได้", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — badge มุมขวาล่าง อ่าน ?v= อัตโนมัติ", "cat": "อื่นๆ" }, { "n": 21, "name": "ลดขนาดตัวละคร", "detail": "ลดขนาดตัวละครในห้อง lobby ลงอีก 2เท่า", "prio": "สูง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 22, "name": "เปลี่ยน ui popup ตอนพูดบนหัว", "detail": "แก้ png seq บนหัวใหม่ เป็นแบบอื่น", "prio": "กลาง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 23, "name": "ชื่่อตัวละครทับลำโพง/ทับ bubble", "detail": "ใน lobby ขยับชื่อลงมาอย่าให้ทับ", "prio": "กลาง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 25, "name": "เพิ่ม ข้อความแจ้งเตือนอัพเดทกลางจอ", "detail": "ถ้ามีการอัพเดทซีน อัพเดทสีตัวละครให้มีป็อปอัพเด้งมากลางหน้าจอ ว่ามีการอัพเดทและให้รอโหลด", "prio": "สูง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 26, "name": "เอาเงาตัวละครออก 1 อัน", "detail": "ตอนนี้ตัวละครมีเงา 2 ชั้น เอาออกไป 1 ชั้น", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — ปิด default-shadow overlay เหลือเงาในสไปรต์", "cat": "อื่นๆ" }, { "n": 27, "name": "optimize ตัวละครให้เล็กลงอีก มันโหลดช้า", "detail": "", "prio": "สูง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 28, "name": "ปุ่ม start ใน lobby", "detail": "ทำให้ดูโต้ตอบหน่อย เช่นพอเดินเข้าไปใกล้ให้มัน glow ขึ้นมา", "prio": "กลาง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 32, "name": "เอา popup ขออนุญาตใช้ไมค์ออกไปเลย น่ารำคาญ", "detail": "", "prio": "สูง", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 34, "name": "เกม ใช่ หรือไม่ : ตอนจบบั๊ค", "detail": "ตอนสรุปคะแนน ยังนับเวลาอยุ่ และขึ้น gameover ทับหน้าสรุปคะแนน", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG1 ใช่/ไม่: capture mg1AnyScore ก่อนล้าง (gameover) + guard quiz-phase หลังจบ (timer)", "cat": "Minigame 1" }, { "n": 35, "name": "เกมวิ่ง : กดปุ่มไม่กระโดด", "detail": "ปุ่ม jump กดแล้วไม่กระโดด", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": "", "cat": "Minigame 5" }, { "n": 36, "name": "เกมวิ่ง : ตอนจบบั๊ค วิ่งเลยฉาก", "detail": "ตอนจบบั๊ค วิ่งเลยฉาก (ในบางรอบ)", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG2 วิ่งเลยฉาก: walk-to-finish ค่อยๆเดินเข้าเส้น + clamp ไม่เลยเส้น", "cat": "Minigame 2" }, { "n": 40, "name": "จำนวนคน ให้เล่นได้ตั้งแต่ 4-6 คน", "detail": "กรณีเลือกผู้เล่นตั้งแต่ 4 คนขึ้นไปไม่ต้องมี bot", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": "", "cat": "อื่นๆ" }, { "n": 41, "name": "เกม หยิบแผ่นป้าย", "detail": "ต้องเล่นให้ครบ 10 ข้อก่อน ค่อยจบเกม (ตอนนี้เล่นถูก 1 ข้อ จบเกมเลย)", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG4 หยิบป้าย: ใช้ map จริง (currentPlayMapId) เปิด mission flow + default 10 ข้อ", "cat": "Minigame 4" }, { "n": 42, "name": "เกม กระโดด", "detail": "ท่ากระโดดแปลก ยืนซอยเท้าทำไม", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "anim ไม่ sync: ยืนบนแท่นที่เลื่อนลง world Y เปลี่ยนทุกเฟรม → ปลายทางเดา isWalking จาก delta = เห็น ซอยเท้า ตลอด. แก้: ส่ง isWalking จริงใน move (jsWalking) + ปลายทางใช้ค่านั้น (play.js ~19162/20501/24930). v0.006260100", "cat": "Minigame 5" }, { "n": 43, "name": "เกม กระโดด", "detail": "ขั้นบันไดมันถี่ไป บางทีกระโดดแล้วเบิ้ลขั้นเลย ปรับให้ระยะห่างแต่ละขั้นมันเท่ากัน", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "ขั้นถี่/ไม่เท่า → เบิ้ลขั้น+ติดรอแท่ง. แก้ layout mnptfts2: ระยะเท่ากันทุกขั้น (gap 3 แถว, rows 2/5/8/11/14/17, zigzag กว้าง6) ในโซนปลอดภัย (เลี่ยง hazard แถว 0/18/19). reach apex 4.5 > 3 = ถึงทุกขั้น (ไม่ติดรอ #43b) + ขั้นถัดไป-อีกขั้น 6 แถว > reach = กระโดดข้ามไม่ได้ (ไม่เบิ้ล). seam รอยต่อ wrap ห่าง 5 แถว 1 จุด/รอบ (h=20 หาร 3 ไม่ลง). restart service หลังแก้แมป | รอบ2: (ก) แก้ลายแท่นบิด — เดิม width เท่ากัน(6)ทำให้ภาพถูกบีบ → ตั้ง width = ขนาดจริงของรูป (เล็ก=var3 7ช่อง/212px, กลาง=var2 13ช่อง/389px) วาดได้สัดส่วนจริงไม่บิด. (ข) ติดบนสุด = seam รอยต่อ wrap 5แถว >ระยะกระโดด(apex4.5) → bump jumpSurviveJumpHeightMult 1.5→1.7 (apex 5.1) ให้ข้าม seam ได้ แต่ข้าม2ขั้น(6แถว)ยังไม่ได้. var1(ใหญ่ 46ช่อง)ใหญ่เกินแมป35 ใช้ไม่ได้ไม่บิด → ใช้ เล็ก/กลาง", "cat": "Minigame 5" }, { "n": 44, "name": "เกมกระโดด", "detail": "อีเวนท์พิเศษ (ทนาย/เทพความรู้) หายไป", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG5 อีเวนต์พิเศษ: เพิ่ม branch jump_survive วาง icon บน platform", "cat": "Minigame 5" }, { "n": 46, "name": "เกมยิิงอุกาบาด", "detail": "สีตัวละครยังไม่ตรงกับที่เลือกมา", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG6 สี: ยาน Rocket-1..8 ตาม lobby theme ของผู้เล่น", "cat": "Minigame 6" }, { "n": 47, "name": "เกมยิิงอุกาบาด", "detail": "อุกาบาดให้พุ่งเร็วกว่านี้ และลูกเล็กกว่านี้เกมง่ายไป", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG6: อุกาบาตเร็วขึ้น (+~50%) + เล็กลง (48->34/11->8)", "cat": "Minigame 6" }, { "n": 50, "name": "ผู้เล่น 6 คน: บางเกมเล่นได้แค่ 5 (คนที่ 6 หายจากสรุป)", "detail": "สรุปคะแนนฝั่ง client slice(0,5) ตัดคนที่ 6 — แก้เป็น slice(0,6) ทุกมินิเกม (MG1/3/4/5/6/7)", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส)", "cat": "Minigame 1" }, { "n": 51, "name": "ผู้เล่น 6 คน: คะแนนตอนจบไม่ตรงกันแต่ละจอ", "detail": "MG1 merge คะแนน server / MG6,7 merge คะแนน host -> ครบ 6 ตรงกัน (MG3 ยัง local)", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส)", "cat": "Minigame 6" }, { "n": 53, "name": "เพิ่มหน้าโหลด (loading) ตอนเข้าเกม", "detail": "overlay spinner กันเห็นจอเปล่า/asset แว่บ ซ่อนเมื่อ draw เฟรมแรก + safety 8s", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.006242530 (รอเทส)", "cat": "อื่นๆ" }, { "n": 54, "name": "host โหลดนานมากตอนเข้าเกม", "detail": "optimize asset/char (เกี่ยว row 28) — loading overlay ช่วยซ่อน แต่ยังโหลดช้าจริง", "prio": "สูง", "status": "เปิด", "updated": "2026-06-25", "note": "loading overlay บังอาการแล้ว · root = canvas tint ภาพตัวละครใหญ่ (source ไม่อยู่ใน repo) → ต้อง optimize ภาพแยก", "cat": "อื่นๆ" }, { "n": 56, "name": "ตอนกลับ LobbyB โชว์รูปแรกก่อนแล้วค่อยถูก", "detail": "เหมือน #1 การ์ด — ต้องใส่ loading state ตอน return LobbyB ด้วย (มี room-loading-overlay อยู่แต่ซ่อนเร็วไป)", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.0308 — การ์ดมี spinner (#1) + room-loading overlay ใส่ % + รอ char preload เสร็จก่อนซ่อน + safety 12s", "cat": "อื่นๆ" }, { "n": 58, "name": "ปุ่ม \"เล่นเกมต่อ\" ไม่รู้ว่าค้างหรือรอคนอื่น", "detail": "text \"รอผู้เล่นอื่น (X/Y)\" ถูก set อยู่แล้วแต่ CSS font-size:0 ซ่อน → เพิ่ม .is-waiting CSS โชว์ข้อความ+spinner แทนรูปปุ่ม", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.0309/server (รอเทส)", "cat": "อื่นๆ" }, { "n": 60, "name": "ทำหน้า testcase บนเซิร์ฟเวอร์", "detail": "srv1361159.hstgr.cloud/testcase — bug list + filter/search/นับสถานะ generate จาก xlsx", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.0309/server (รอเทส)", "cat": "อื่นๆ" }, { "n": 62, "name": "MG1/MG4 user/bot ติดกัน (เดินไม่ผ่าน)", "detail": "เพิ่ม anti-stuck: ดันชนเพื่อน → เขย่า (shake) + ปลดล็อกเดินผ่านกันชั่วคราว คงกำแพง/area/quiz-lock; ทั้งผู้เล่นและบอท", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.006250100 (รอเทส)", "cat": "Minigame 4" }, { "n": 65, "name": "อีเวนต์พิเศษ (ทนาย/เทพ) = 1 ใน 3 (ตามดีไซน์)", "detail": "ดีไซน์: 3 เกม/LobbyB เล่นได้เกมละ 3 ครั้ง · อีเวนต์พิเศษ 1/3 ต่อครั้ง (1 ใบ) · Test Mode บังคับ. revert การแก้ \">1 ต่อรอบ\" กลับเป็น 1 ใบ/ครั้งที่ติด", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ revert 2026-06-25 — กลับเป็น 1/3 (1 ใบ/ครั้งที่ติด) ตามดีไซน์ · ยืนยันโครงสร้าง 3เกม×3ครั้ง + disruptor toggle (>4คน/Test Mode) ถูกต้อง", "cat": "อื่นๆ" }, { "n": 71, "name": "หน้าผลชนะ (โพเดียม) ตัวละครลอย ไม่ยืนบนพื้น", "detail": "หน้า \"ยินดีด้วย ทีมนักสืบ ชนะ!\" ตัวละครผู้ชนะลอยอยู่กลางอากาศ ไม่ยืนบนพื้นเวที", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "แก้แล้ว (deploy prod room-lobby.js?v=0.0312): พื้นหลัง win-bg เดิม center/cover ทำให้พื้นเวทีถูก crop เลื่อน + podium ตั้ง bottom:9% ตัวละครเลยลอย. แก้เป็น (1) ปักพื้นหลังไว้ขอบล่าง background-position:center bottom -> พื้นเวทีติดขอบล่างจอเสมอทุกสัดส่วน (2) ลด podium bottom 9% -> 2% ให้ตัวละครยืนบนพื้น. ไฟล์: Game/public/js/room-lobby.js (injectFinalResultStyle, #trial-final-podium).", "cat": "อื่นๆ" }, { "n": 74, "name": "แถวหน้าตัวละคร (ready ใต้ปุ่ม HOW TO) ค้างบนจอระหว่างเล่นเกม", "detail": "หลังกด HOW TO/Ready แล้วเริ่มเกม กล่องแถว avatar คนที่กด ready (ใต้ปุ่ม) ไม่ถูกซ่อน ค้างอยู่กลางจอล่างทับฉากเกม (เห็นชัดใน MG3 stack) — กระทบ MG1/3/5/6", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "กล่องลอย #gch-ready-avatars-float ถูกซ่อนเฉพาะ MG2 (dismissGauntletCrownHowtoOverlayPlay) + MG4 (quiz_carry) เท่านั้น. begin*CountdownThenRun ของ MG1/3/5/6 (stack/jump/space/quiz) ตั้ง gauntletCrownHowtoVisible=false แต่ไม่เรียก hideReadyAvatarsFloat() → กล่องค้าง display:flex ทั้งเกม (ไม่มี driver เรียกใหม่ตอน live). แก้: เพิ่ม hideReadyAvatarsFloat() ในทั้ง 4 ฟังก์ชันเริ่มเกม (play.js). v0.006260101", "cat": "อื่นๆ" }, { "name": "block สีไม่ตรงในฝั่ง client", "detail": "", "prio": "กลาง", "status": "เปิด", "note": "", "cat": "Minigame 3", "updated": "2026-06-26", "n": 75 }, { "name": "บางที client บางคนเล่นไม่ได้", "detail": "", "prio": "กลาง", "status": "เปิด", "note": "", "cat": "Minigame 3", "updated": "2026-06-26", "n": 76 }, { "n": 82, "name": "MG1: หน้า How-to ใหม่ (SAFE/SCAM)", "detail": "เปลี่ยน how-to เป็น \"วิเคราะห์ภัยร้าย\" (เดิมเป็นดีไซน์ MG4)", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: เข้า MG1 → หน้า HOW TO PLAY ต้องเป็น \"วิเคราะห์ภัยร้าย ปกป้องระบบให้ปลอดภัย\" มี SAFE/SCAM + การ์ด COMMON/RARE/LEGENDARY", "cat": "Minigame 1" }, { "n": 83, "name": "MG1: ปุ่ม READY 2 สถานะ", "detail": "ยังไม่กด=ฟ้า / กดแล้ว=เขียว+เครื่องหมายถูก", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: หน้า ready MG1 → ปุ่มฟ้า · กด → เขียวมี ✓ · กดอีกที → กลับฟ้า", "cat": "Minigame 1" }, { "n": 84, "name": "MG1: auto-start เมื่อทุกคน ready", "detail": "ครบ ready → server เริ่มเอง ไม่ต้องรอ host กด START", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: ทุกคนกด READY ครบ → เกมเริ่มเอง (นับ 3-2-1) ไม่ต้องมีใครกด START · ลองให้ host ออกก่อนคนสุดท้าย ready → ยังเริ่มได้", "cat": "Minigame 1" }, { "n": 85, "name": "MG1: คน/บอท วิ่งเร็วเท่ากัน", "detail": "movement time-based", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: 2 เครื่องเล่น MG1 พร้อมกัน → คนวิ่งเร็วเท่ากัน · บอทวิ่งเข้าโซน SAFE/SCAM สม่ำเสมอ", "cat": "Minigame 1" }, { "n": 86, "name": "MG1: ผีหาย (avatar ไม่ซ้ำ)", "detail": "server ส่ง play-roster ทุก 1.5s ตัดตัวซ้ำระหว่างเล่น", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: เล่น MG1 แล้วมีคนหลุด/reconnect → ต้องไม่มีตัวซ้ำขยับไม่ได้ค้างในสนาม", "cat": "Minigame 1" }, { "n": 87, "name": "MG1: บอทเดินต่อแม้ host หลุด", "detail": "server เป็นเจ้าของการเดินบอท quiz", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: เล่น MG1 กับบอท · host รีเฟรช/ออกกลางเกม → บอทต้องเดิน+วิ่งเข้าโซนต่อ ไม่หยุดนิ่ง", "cat": "Minigame 1" }, { "n": 88, "name": "MG1: คะแนนบอทตรงกันทุกจอ", "detail": "server คิดคะแนนบอท (เดิม host คิดเอง ไม่ sync)", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-26", "note": "วิธีเทส: 2 เครื่องเล่น MG1 กับบอท → คะแนนบอทบนกระดานต้องตรงกันทั้ง 2 จอทุกข้อ", "cat": "Minigame 1" }, { "n": 89, "name": "MG1: ผีบอทอยู่ในโซนผี ไม่ทับ SAFE/SCAM", "detail": "บอทตอบผิด=ผี ตำแหน่งจริงอยู่ในโซนผี (กลาง-บน) — แก้การวาดภาพผีที่เคยห้อยลงทับสนามคำตอบ", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เล่น MG1 กับบอท ให้มีบอทตอบผิด → ตัวผีต้องลอยอยู่แถบกลาง-บน (เหนือ SAFE/SCAM) ไม่ห้อยลงทับช่อง SAFE/SCAM", "cat": "Minigame 1" }, { "n": 90, "name": "MG1: บอทเดินลื่น ไม่วาป", "detail": "บอท quiz เดินจาก server (time-based) + lerp นุ่ม", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เล่น MG1 กับบอท → บอทเดินเข้าโซน SAFE/SCAM ลื่น ไม่กระตุก ไม่วาปไปมา", "cat": "Minigame 1" }, { "n": 92, "name": "Admin: ตัวเลขผู้ใช้ออนไลน์ + ความจุ", "detail": "widget 👥 N/500 สบาย/เริ่มหนัก/หนัก (เขียว/เหลือง/แดง) บนแถบ Admin", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เปิดหน้า Admin → มุมขวาบนมี 👥 ตัวเลขผู้เล่นออนไลน์ · hover เห็น CPU/RAM/ห้อง/socket · อัปเดตทุก 10 วิ", "cat": "อื่นๆ" }, { "n": 93, "name": "MG1: หลุดกลางเกม → บอท takeover ในที่เดิม", "detail": "บอทแทนทันที สี/ตำแหน่ง/สถานะเดิม (คะแนนต่อ, ตกรอบ→ผีต่อ)", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เล่น MG1 หลายคน → คนนึงปิดแท็บกลางเกม → ตัวละครต้องไม่หาย กลายเป็นบอทสีเดิม ตำแหน่งเดิม เล่นต่อ + มี \"(บอท)\" หลังชื่อ", "cat": "Minigame 1" }, { "n": 94, "name": "MG1: หลุดแล้วกลับมาใน 10วิ → คืนสิทธิ์เล่น", "detail": "reconnect-undo: ถอนบอท takeover คืนตัวจริง (กันตัวซ้ำ)", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เล่น MG1 → refresh กลางเกม (กลับมาใน 10วิ) → ต้องเล่นเองต่อได้ ไม่มีบอทซ้ำกับตัวเรา", "cat": "Minigame 1" }, { "n": 95, "name": "MG1: host หลุดในหน้า how-to → เล่นต่อได้", "detail": "expectedActive ลดตอนคนออกถาวร → host ใหม่กด START ได้ (เดิมค้าง \"รอ x/y\")", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: เข้า MG1 how-to หลายคน → host ปิดแท็บ → รอ ~10วิ → host ใหม่กด START ได้ + บอทสีเดิมเล่นแทน", "cat": "Minigame 1" }, { "n": 98, "name": "MG how-to: เห็น countdown ตอนมีคนหลุด", "detail": "grace banner z-index ขึ้นเหนือ how-to overlay", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "2026-06-27", "note": "วิธีเทส: ในหน้า how-to มีคนหลุด → ต้องเห็นแถบ \"🔌 ... หลุด — รอกลับมา N วิ\" ลอยเหนือ how-to (ไม่ถูกบัง)", "cat": "Minigame 1" }, { "n": 99, "name": "Login + ตั้งชื่อผู้เล่น", "detail": "ล็อกอิน/ตั้งชื่อได้ ชื่อไปแสดงในห้อง/เกม", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เปิดเกม → login → ตั้งชื่อ → เข้า Main Menu → ชื่อตรงทุกหน้า", "cat": "อื่นๆ" }, { "n": 100, "name": "Main Menu นำทางครบ", "detail": "ปุ่มทุกอันใน Main Menu พาไปหน้าถูก (สร้าง/เข้าห้อง, โปรไฟล์, how-to)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: กดทุกปุ่มใน Main Menu → ไปหน้าตรงป้าย + ปุ่มย้อนกลับได้", "cat": "อื่นๆ" }, { "n": 101, "name": "สร้างห้อง Public", "detail": "สร้างห้องสาธารณะได้ เข้า LobbyA", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Create Room → Public → ตั้งชื่อ → ยืนยัน → เข้า LobbyA เป็น host", "cat": "อื่นๆ" }, { "n": 102, "name": "สร้างห้อง Private (PIN 4 หลัก)", "detail": "ห้องส่วนตัวต้องใส่ PIN 4 หลัก ล็อก 🔒", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Create Room → Private → ใส่ PIN 4 หลัก → ยืนยัน → ห้องขึ้น 🔒 · ใส่ PIN ไม่ครบ = ยืนยันไม่ได้", "cat": "อื่นๆ" }, { "n": 103, "name": "สรุปจำนวนบอทถูก (1-3 คน)", "detail": "เลือก 1/2/3 คน → บอท 5/4/3 (รวม 6)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Create Room → เลือกจำนวนผู้เล่น 1,2,3 → summary แสดง '+5/+4/+3 Bot'", "cat": "อื่นๆ" }, { "n": 104, "name": "เลือก ≥ 4 คน = ไม่มีบอท", "detail": "เลือก 4/5/6 คน → 0 Bot ทั้ง summary และในเกมจริง", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Create Room → เลือก 4,5,6 → summary '+0 Bot' → เข้าเกมจริงต้องไม่มีบอทเติม (รอคนจริง)", "cat": "อื่นๆ" }, { "n": 105, "name": "เข้าห้อง Public จากรายการ", "detail": "เห็นรายชื่อห้อง public + กดเข้าได้", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Join Room → เห็นห้อง public → กดเข้า → เข้า LobbyA เป็น client", "cat": "อื่นๆ" }, { "n": 106, "name": "เข้าห้อง Private ด้วยชื่อ+PIN", "detail": "เข้าห้องส่วนตัวได้เมื่อใส่ชื่อ+PIN ถูก · ผิด = เข้าไม่ได้", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Join Room → Private → ใส่ชื่อห้อง+PIN → ถูก=เข้าได้ / ผิด=แจ้ง error", "cat": "อื่นๆ" }, { "n": 107, "name": "ห้องเต็ม", "detail": "ห้องเต็ม (ครบ maxPlayers) เข้าไม่ได้ แจ้งเตือน", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ห้องมีคนครบ → คนใหม่กดเข้า → แจ้ง 'ห้องเต็ม (n/max)'", "cat": "อื่นๆ" }, { "n": 108, "name": "ฉาก LobbyA โหลดเร็ว", "detail": "เข้าฉากภายใน ~2 วิ ไม่ค้างขาว", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เข้า LobbyA → จับเวลา loading-hide < ~3 วิ (เดิมเคยค้าง 15-40 วิ)", "cat": "LobbyA" }, { "n": 109, "name": "กดพร้อม (Ready)", "detail": "toggle พร้อม/ไม่พร้อม ได้ ทุกคนเห็นตรงกัน", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: กด Ready → สถานะเปลี่ยน + คนอื่นเห็น · กดซ้ำ = ยกเลิกพร้อม", "cat": "LobbyA" }, { "n": 110, "name": "ห้องแต่งตัว (กด F)", "detail": "เดินไปจุดเขียว กด F เปิดห้องแต่งตัว เปลี่ยนชุด/ตัวละครได้", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: LobbyA → เดินไปไอคอนห้องแต่งตัว → กด F → popup เปิด → เปลี่ยนได้ทุกคน", "cat": "LobbyA" }, { "n": 111, "name": "Host Console (กด F, เฉพาะ host)", "detail": "host เดินไปไอคอนชมพู กด F เปิด console · client กดไม่ได้", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: host → จุดชมพู → F → console เปิด · client → F → แจ้ง 'เฉพาะ Host'", "cat": "LobbyA" }, { "n": 112, "name": "ปุ่มกลางแมป (START GAME) + glow", "detail": "ทุกคน+host พร้อม → ปุ่มกลางเรือง glow เหลืองกระพริบ → host กด F เริ่มเกม", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ทุกคนกด Ready ครบ → ปุ่ม START กลางแมป glow เหลือง → host เดินเข้าใกล้ กด F → เข้า wizard เลือกระดับ/คดี", "cat": "LobbyA" }, { "n": 113, "name": "บอทเดินในฉาก ไม่หลุดขอบ", "detail": "บอท LobbyA เดินในฉากหลัก ไม่ติดขอบ/นอกฉาก", "prio": "ต่ำ", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอทใน LobbyA → ต้องเดินวนในฉาก ไม่ค้างขอบ/หลุดออกนอก", "cat": "LobbyA" }, { "n": 114, "name": "เสียงพูดใน Lobby (mic)", "detail": "เปิด/ปิดไมค์ได้ ได้ยินเสียงกัน", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: หลายคน → เปิดไมค์ → พูด → คนอื่นได้ยิน · กดปิด = เงียบ", "cat": "LobbyA" }, { "n": 115, "name": "MG1 เข้าเกม + how-to", "detail": "เข้า MG1 เห็น how-to → เริ่มพร้อมกัน", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เริ่มเกม → เข้า MG1 → how-to ขึ้น → ปิด/countdown → เริ่มพร้อมกันทุกคน", "cat": "Minigame 1" }, { "n": 116, "name": "MG1 ตอบถูก/ผิด", "detail": "ตอบถูกได้คะแนน · ตอบผิดกลายเป็นผี/ล็อก", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เดินเข้าโซนจริง/ไม่จริง → ถูก=คะแนน+ / ผิด=ล็อก(ผี) ตรงกันทุกเครื่อง", "cat": "Minigame 1" }, { "n": 117, "name": "MG1 บอทเล่น + คะแนนตรง", "detail": "บอทตอบเอง คะแนน/สถานะบอทตรงทุกเครื่อง", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอท MG1 → ตอบเอง + คะแนน/ล็อก ตรงทุก client", "cat": "Minigame 1" }, { "n": 118, "name": "MG1 จบเกม + สรุปคะแนน", "detail": "หมดเวลา/ทุกคนตอบผิด → จบ + สรุปคะแนนถูก", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจนจบ → ผลจบ (complete/timeup) + คะแนน/coin ตามอันดับ", "cat": "Minigame 1" }, { "n": 119, "name": "MG2 วิ่ง+กระโดดหลบ", "detail": "เดิน/วิ่ง + กระโดดข้ามสิ่งกีดขวางได้ ชน=เสียแต้ม", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG2 → วิ่งหลบ → กระโดดข้าม obstacle · โดนเลเซอร์/สิ่งกีดขวาง = penalty", "cat": "Minigame 2" }, { "n": 120, "name": "MG2 ปรับความสูง/เวลากระโดด (Admin)", "detail": "ปรับ 'ความสูงกระโดด' + 'เวลากระโดดขึ้น-ลง' ใน Admin → มีผลรอบถัดไป", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: Admin → Minigame-2 → ตั้งความสูง/tick → เริ่มเกมใหม่ → กระโดดสูง/เร็วตามตั้ง", "cat": "Minigame 2" }, { "n": 121, "name": "MG2 finish/จบ", "detail": "วิ่งถึงเส้นชัย/หมดเวลา → จบถูก ไม่ค้าง", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG2 → ถึงปลายทาง หรือหมดเวลา → ฉากจบ + คะแนน", "cat": "Minigame 2" }, { "n": 122, "name": "MG3 ต่อบล็อกตรง", "detail": "เล็งตรง support → บล็อกลงตรง ไม่เฉียง ต่อได้", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG3 → กด DROP ตอนบล็อกอยู่เหนือบล็อกก่อน → ลงตรงดิ่ง ทับพอดี (ไม่ไถลเฉียง)", "cat": "Minigame 3" }, { "n": 123, "name": "MG3 หัวใจรวม + จบเกม", "detail": "หัวใจ (System Integrity) เป็นของรวม · ใครพลาดก็ลด · พลาด 3 ครั้ง = จบ", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: หลายคน → ผลัดกันวาง · วางเยื้องมาก = หัวใจลด (ทุกคนเห็นเท่ากัน) · ครบ 3 = จบเกม", "cat": "Minigame 3" }, { "n": 124, "name": "MG3 บอทวางตรง support", "detail": "บอทวางบล็อกลงตรงยอดตึก ไม่เฉียง/หลุด", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอท MG3 → วางลงตรงบล็อกก่อนหน้า (ตึกไม่เป๋)", "cat": "Minigame 3" }, { "n": 125, "name": "MG3 สีบล็อกตรง avatar", "detail": "สีบล็อกที่วาง = สีตัวละครคนวาง ทุกเครื่องตรงกัน", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: วาง → สีบล็อกตรงสี avatar คนวาง (host/client/บอท ตรงกัน)", "cat": "Minigame 3" }, { "n": 126, "name": "MG3 ตัวห้อยแกว่งลื่น", "detail": "บล็อกที่ห้อยแกว่งลื่น ไม่กระตุก", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบล็อกห้อย → แกว่งนุ่ม ไม่กระตุก/วาป", "cat": "Minigame 3" }, { "n": 127, "name": "MG4 หยิบคำ-ส่งคำตอบ", "detail": "หยิบ word option จากโต๊ะข้าง → เดินไปส่งที่โต๊ะกลาง", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG4 → เดินไปโต๊ะ option → หยิบคำ → เดินไปโต๊ะ submit → ส่ง → ถูก=คะแนน", "cat": "Minigame 4" }, { "n": 128, "name": "MG4 บอทไม่ยืนบนโต๊ะกลาง", "detail": "บอทไม่ spawn/ยืนติดบนคอนโซลกลาง เดินหยิบ-ส่งปกติ", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอท MG4 → ไม่มีบอทค้างยืนบนโต๊ะกลาง · บอทหยิบ-ส่งได้", "cat": "Minigame 4" }, { "n": 129, "name": "MG4 จบ + คะแนน", "detail": "หมดเวลา/ครบข้อ → จบ + คะแนนถูก", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจนจบ → ผลจบ + คะแนนตามส่ง", "cat": "Minigame 4" }, { "n": 130, "name": "MG5 กระโดดขึ้นแท่นเอาตัวรอด", "detail": "กระโดดขึ้นแท่นตามสายพานเลื่อน ตก= ตกรอบ", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG5 → กระโดดขึ้นแท่น หนีพื้นเลื่อน · ตกล่าง = eliminated", "cat": "Minigame 5" }, { "n": 131, "name": "MG5 สลับแท็บ (unfocus) ตกเนียน", "detail": "สลับแท็บออก → ตัวละครตกลงต่อ คนอื่นเห็นลื่น (ไม่ลอยค้าง/กระตุก)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG5 กำลังเล่น → สลับไปแท็บอื่น 5 วิ → คนอื่นเห็นตัวเราไหลลงเนียน", "cat": "Minigame 5" }, { "n": 132, "name": "MG5 บอท + จบเกม", "detail": "บอทกระโดดเอง · จบเกม (all-dead/timeup) + เกรด", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอท MG5 กระโดดเอง → เล่นจนจบ → เกรด/คะแนนถูก", "cat": "Minigame 5" }, { "n": 133, "name": "MG6 ยิงอุกาบาต", "detail": "บังคับยาน + ยิง หลบอุกาบาต โดน 3 ครั้ง=ตาย", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG6 → ขยับยาน ยิง · โดนอุกาบาต 3 = eliminated", "cat": "Minigame 6" }, { "n": 134, "name": "MG6 บอทขยับทุก client", "detail": "บอททุกตัวขยับเห็นตรงกันทุกเครื่อง (ไม่มีบอทค้าง)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: หลายคน MG6 → บอททุกตัวต้องขยับบนทุกจอ (ไม่มีตัวค้างนิ่งเฉพาะบางเครื่อง)", "cat": "Minigame 6" }, { "n": 135, "name": "MG6 จบ + คะแนน", "detail": "หมดเวลา/รอด → จบ + คะแนนถูก", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจนจบ → ผล + คะแนน/coin ตามอันดับ", "cat": "Minigame 6" }, { "n": 136, "name": "MG7 ยิงบอส (Mega Virus)", "detail": "เล็ง+ยิงบอส ลด HP บอส · บอสชนเรา=เสียหาย", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: MG7 → หมุนเล็ง ยิงบอส → HP บอสลด · บอสเคลื่อนที่ชน = เด้ง/เสียหาย", "cat": "Minigame 7" }, { "n": 137, "name": "MG7 บอทยิง+หลบบอส", "detail": "บอทยิงบอส + หลบบอส ไม่ค้างนิ่ง", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: สังเกตบอท MG7 → ยิงบอส + ดริฟต์หลบ ไม่ติดนิ่ง", "cat": "Minigame 7" }, { "n": 138, "name": "MG7 จบ + คะแนน", "detail": "บอสตาย/หมดเวลา → จบ + คะแนนถูก", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจนจบ → ผล + คะแนน", "cat": "Minigame 7" }, { "n": 139, "name": "กลับ LobbyB หลังจบมินิเกม", "detail": "จบรอบมินิเกม → กลับเข้า LobbyB (หน้าคดี)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: จบมินิเกม → interstitial → เข้า LobbyB", "cat": "LobbyB" }, { "n": 140, "name": "หน้าเลือกผู้ต้องสงสัยเปิด", "detail": "จบเคส → หน้าเลือกผู้ต้องสงสัยเปิดอัตโนมัติทุกคน", "prio": "วิกฤต", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจบเคส → LobbyB → overlay เลือกผู้ต้องสงสัยขึ้นทุกเครื่อง (ไม่ค้าง/ไม่ขึ้น)", "cat": "LobbyB" }, { "n": 141, "name": "ปุ่มกลาง (F) เปิดผู้ต้องสงสัยซ้ำ", "detail": "ปิด overlay แล้ว → ปุ่มกลางแมป glow → กด F เปิดกลับ (แทนปุ่มลอยเดิม)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ปิดหน้าผู้ต้องสงสัย → ปุ่มกลาง glow → เดินเข้าใกล้ กด F → overlay เปิดกลับ", "cat": "LobbyB" }, { "n": 142, "name": "เสนอบทตัวป่วน", "detail": "≥4 คน (หรือเปิด force) → มีการเสนอบทตัวป่วน กดรับ/ปฏิเสธได้ในเวลาที่ตั้ง", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: จบเคส → ระบบเสนอบทตัวป่วนให้ 1 คน → countdown (ตาม Admin) → กดรับ/ปฏิเสธ", "cat": "LobbyB" }, { "n": 143, "name": "สืบผู้ต้องสงสัย (เก็บหลักฐาน)", "detail": "สืบครบ 3 ผู้ต้องสงสัย (เล่นมินิเกม) → เก็บหลักฐานได้", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เลือกผู้ต้องสงสัย → เล่นมินิเกม → ได้หลักฐาน +1 ต่อคน", "cat": "LobbyB" }, { "n": 144, "name": "โหวตชี้ตัวคนร้าย (พิจารณาคดี)", "detail": "สืบครบ → โหวตชี้คนร้าย → ผลตัดสินถูก", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "🧪 Flow TC · วิธีเทส: สืบครบ 3 → เปิดพิจารณาคดี → โหวต → เฉลยถูก/ผิด · 🔎 gamelog: [TC144] / ev=lobbyb-gate (LobbyB) · deploy 2026-07-01", "cat": "LobbyB" }, { "n": 145, "name": "หน้า Cyber Awareness หลังตัดสิน", "detail": "หลังตัดสินคดี → หน้าให้ความรู้กฎหมายไซเบอร์ ก่อนกลับ Main Lobby", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ตัดสินคดีจบ → interstitial cyber-law → กลับ Main-Lobby", "cat": "LobbyB" }, { "n": 146, "name": "Host หลุด → migration", "detail": "host ปิด/หลุด → เลือก host ใหม่อัตโนมัติ เกมไปต่อได้", "prio": "วิกฤต", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ระหว่างเกม host ปิดแท็บ → ~10วิ → host ใหม่ถูกตั้ง เกมไม่ค้าง", "cat": "ระบบ disconnect" }, { "n": 147, "name": "ผู้เล่นหลุด → บอทแทน", "detail": "คนหลุดกลางมินิเกม → บอทเล่นแทน (สีเดิม) ไม่ค้าง", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ระหว่างมินิเกม ผู้เล่นปิดแท็บ → บอท takeover เล่นแทน (สีตามคนออก)", "cat": "ระบบ disconnect" }, { "n": 148, "name": "แถบ grace ตอนมีคนหลุด", "detail": "มีคนหลุด → แถบ '🔌 ... หลุด รอกลับ N วิ' ขึ้น (เหนือ how-to)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: คนหลุด → แถบ grace countdown ขึ้นทุกเครื่อง (ลอยเหนือ overlay)", "cat": "ระบบ disconnect" }, { "n": 149, "name": "Reconnect กลับเข้าเกม", "detail": "หลุดแล้วต่อกลับ → กลับเข้าห้อง/มินิเกมเดิมได้", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: หลุดเน็ตชั่วคราว → เชื่อมกลับ → auto re-join ห้องเดิม ไม่ต้องเริ่มใหม่", "cat": "ระบบ disconnect" }, { "n": 150, "name": "คะแนน/COINS ตามอันดับ", "detail": "จบมินิเกม → รับ coin ตามอันดับ (ผู้รอด)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: จบมินิเกม → ผู้รอดได้ coin [10,8,6,4,2,0] ตามอันดับ + คะแนนสะสมขึ้น leaderboard", "cat": "อื่นๆ" }, { "n": 151, "name": "กระดานผู้นำ (Leaderboard)", "detail": "คะแนนสะสม/high score แสดงถูกในกระดานผู้นำ", "prio": "ต่ำ", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: เล่นจบ → เช็ค leaderboard → คะแนนอัปเดตถูก", "cat": "อื่นๆ" }, { "n": 152, "name": "เสียงพูดในมินิเกม (MG1-7)", "detail": "เปิดไมค์ในมินิเกม → ได้ยินกัน (WebRTC mesh)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: ระหว่างมินิเกม → กดไมค์ → พูด → คนอื่นได้ยิน", "cat": "อื่นๆ" }, { "n": 153, "name": "ออกจากห้อง (Exit)", "detail": "ออกจาก Lobby → host ไป Create Room / client ไป Join Room", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-01", "note": "🧪 Flow TC · วิธีเทส: LobbyA/B → กด Exit → host→Create, client→Join", "cat": "อื่นๆ" }, { "n": 154, "name": "LobbyA: ล็อก unready ระหว่าง host เลือกคดี", "detail": "ทุกคน ready + host เปิด wizard เลือกระดับ/คดี → client กด unready ไม่ได้ (ปุ่ม disable + ป้าย \"host กำลังเลือกคดี\")", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "📋 PLAN (flow/sound) · วิธีเทส: ทุกคนกด Ready ครบ → host กด F เปิด wizard → อีกเครื่องลองกดยกเลิก Ready → ต้องกดไม่ได้ · 🔎 gamelog: [TC154] / ev=preplay-lock (LobbyA) · deploy 2026-07-01", "cat": "LobbyA" }, { "n": 155, "name": "LobbyB: ต้องรอทุกคนเข้าครบก่อน \"ชี้ตัวคนร้าย\"", "detail": "ปุ่มชี้ตัวคนร้าย (พิจารณาคดี) เปิดได้เฉพาะเมื่อผู้เล่นเข้า LobbyB ครบทุกคน · ยังไม่ครบ = disable + ป้าย \"รอผู้เล่น (n/total)\"", "prio": "สูง", "status": "เปิด", "updated": "2026-07-01", "note": "📋 PLAN (flow/sound) · วิธีเทส: จบเคส → คนบางคนยังไม่เข้า LobbyB → host/ระบบต้องยังชี้ตัวไม่ได้ จนครบทุกคน", "cat": "LobbyB" }, { "n": 156, "name": "LobbyA→B: gate เลือกผู้ต้องสงสัยจนกว่าทุกคนอ่าน story ครบ", "detail": "มีหน้าอ่านเนื้อเรื่อง story 1-2 (cutscene) ก่อน LobbyB · host เลือกผู้ต้องสงสัยไม่ได้จนกว่าทุกคนกด \"ไปต่อ\" อ่านจบครบ", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "📋 PLAN (flow/sound) · วิธีเทส: เข้า LobbyB → หน้า story ขึ้น → บางคนยังไม่กดอ่านจบ → host ต้องเลือกผู้ต้องสงสัยไม่ได้ (ป้าย \"รออ่านเนื้อเรื่อง n/total\") · 🔎 gamelog: [TC156] / ev=story-gate (LobbyB) · deploy 2026-07-01", "cat": "LobbyA" }, { "n": 157, "name": "Vote Ban: เริ่มโหวตเมื่อทุกคนเข้า+โหลดเสร็จ · ยังไม่โหวต=เลือกผู้ต้องสงสัยไม่ได้", "detail": "โหวตแบน/ปิดปากผู้เล่น เริ่มเมื่อทุกคนเข้า LobbyB + โหลดเสร็จเท่านั้น · ถ้ายังไม่โหวตเสร็จ host เลือกผู้ต้องสงสัยไม่ได้ (ตาม flow)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "📋 PLAN (flow/sound) · วิธีเทส: จบเคสที่มีการ์ด ban/silence → ต้องรอทุกคนเข้า+โหลดเสร็จ แล้วค่อยเริ่มโหวต → ระหว่างโหวต host เลือกผู้ต้องสงสัยไม่ได้จนโหวตจบ · 🔎 gamelog: [TC157] / ev=vote-gate (LobbyB) · deploy 2026-07-01", "cat": "LobbyB" }, { "n": 158, "name": "MG4: บอทว๊าป/กระโดดข้ามโต๊ะกลาง", "detail": "บอทต้องเดินอ้อมโต๊ะกลาง ไม่ว๊าป/กระโดดข้าม (ลื่นไม่ teleport)", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "📋 PLAN (flow/sound) · วิธีเทส: MG4 หลายรอบ → สังเกตบอท: ต้องไม่กระโดด/วาปข้ามโต๊ะกลาง · เดินอ้อมเนียน · 🔎 gamelog: [TC158] / ev=mg4-warp (MG4 · pass = ไม่มี event) · deploy 2026-07-01", "cat": "Minigame 4" }, { "n": 159, "name": "เพิ่ม BG Music + Sound Effect", "detail": "มีเพลงพื้นหลังต่อฉาก (เมนู/LobbyA/B/มินิเกม) + SFX เหตุการณ์ (ปุ่ม, ready, drop, ยิง, ถูก/ผิด, ชนะ/แพ้) + ปุ่ม 🔊/🔇 ปรับ/ปิดได้", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-07-02", "note": "✅ Phase 1+2 deploy 2026-07-02 (sound.js?v=1 · play.js?v=0.006301062). BGM 7 เกม+lobby · จบเกม ชนะ/หมดเวลา/แพ้ · toggle Music/SFX จำค่า · BGM หรี่ตอนพูด · per-event SFX ครบ 7 เกม (ถูก/ผิด · drop · jump · laser · bomb · boss-elim · countdown) · Admin endpoint /Game/api/sound-settings พร้อม. เทสย่อย TC160-165. ค้าง: Admin UI slider · remote voice-duck · MG6 crash", "cat": "เสียง (Sound)" }, { "n": 160, "name": "เสียง: BGM ต่อฉาก (lobby + MG1-7)", "detail": "เข้า LobbyA/B และแต่ละมินิเกม → มีเพลงพื้นหลังเล่นวน · เปลี่ยนเกม → เพลงเปลี่ยนตาม", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "lobby ยืม BGM มินิเกม 4 · เริ่มเล่นตอนแตะจอครั้งแรก (นโยบาย autoplay) · idempotent", "cat": "เสียง (Sound)" }, { "n": 161, "name": "เสียง: จบเกม ชนะ/หมดเวลา/แพ้ (ครบ 7 เกม)", "detail": "จบมินิเกมทั้ง 7 → ชนะ = แฟนแฟร์ · หมดเวลา = นกหวีด · แพ้ = game-over · BGM หยุด", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "hook begin*ResultFlash* ทุกเกม (jdEndSfxFromFile) · MG7 ไม่มีไฟล์ timeup", "cat": "เสียง (Sound)" }, { "n": 162, "name": "เสียง: ปุ่มคลิก + MG4 ตอบถูก/ผิด", "detail": "กดปุ่มจริง → เสียงคลิก · MG4 ตอบถูก = เสียง correct / ผิด = เสียง wrong", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "ปุ่มคลิก = delegated (เฉพาะ element ปุ่มจริง)", "cat": "เสียง (Sound)" }, { "n": 163, "name": "เสียง: ปุ่ม Music/SFX (profile) เปิด-ปิด + จำค่า", "detail": "profile → กด toggle Music / SFX → เปิด/ปิดเสียงได้จริง · รีเฟรช/เปลี่ยนหน้า ค่ายังเดิม", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "localStorage jd_music_on / jd_sfx_on มีผลทุกหน้า · Main-Menu ยังไม่ wire (Phase 2)", "cat": "เสียง (Sound)" }, { "n": 164, "name": "เสียง: ไมค์ไม่โดนกลบ (หรี่ BGM ตอนพูด)", "detail": "เปิดไมค์คุย → BGM หรี่ลงอัตโนมัติ เสียงคนชัด ไม่โดนเพลง/เอฟเฟกต์กลบ (caution)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "duck ×0.22 ตอน voice-activity · ตอนนี้ duck เฉพาะตอนเราพูด (remote = Phase 2)", "cat": "เสียง (Sound)" }, { "n": 165, "name": "เสียง: SFX รายเกม (drop/jump/laser/bomb/boss/countdown)", "detail": "MG3 วางบล็อก=drop · MG2/MG5 กระโดด=jump · MG6/MG7 ยิง=laser · MG6 อุกกาบาตระเบิด=bomb · MG7 ฆ่าบอส=boss-elim · นับถอยหลัง 3-2-1=tick", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "per-event SFX Phase 2 · เล่นตอนเหตุการณ์จริง · MG6 crash (ยานชน) ยังไม่ต่อ", "cat": "เสียง (Sound)" }, { "n": 166, "name": "LobbyB: รอทุกคนโหลดเสร็จจริงก่อน host เริ่ม (กันค้างตอนจบ)", "detail": "บางคนยังโหลด LobbyB ไม่เสร็จ (ค้างฉากเกมเก่า) แต่ host กดไปต่อได้ → จบแล้วค้าง · แก้: นับ present จากคน \"โหลด LobbyB เสร็จจริง\" (lobbyb-loaded) ไม่ใช่แค่ peer มี", "prio": "สูง", "status": "เปิด", "updated": "2026-07-02", "note": "🔎 gamelog ev=lobbyb-gate [TC144] \"โหลด LobbyB เสร็จ N/total\" · เทส 2+ คน ให้คนช้า → host เริ่มไม่ได้จนโหลดครบ · deploy 2026-07-02", "cat": "LobbyB" }, { "n": 167, "name": "MG1: label 3 สถานะ ใต้ TIME", "detail": "ใต้ UI TIME โชว์: อ่านคำถาม=\"📖 อ่านคำถาม\"(ทอง) · ตอบ=\"✍️ เริ่มตอบคำถาม\"(เขียว) · พัก=\"รอคำถามข้อต่อไป\"(ฟ้า)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "client-side (ฟัง/ดูเอง) · อยู่ใต้ TIME ไม่ใช่บนกระดานคำถาม · deploy play.js?v=0.006301069", "cat": "Minigame 1" }, { "n": 168, "name": "MG4: ป้ายตัวเลือก/คำที่ถือ ไม่โดนบัง", "detail": "ป้ายตัวเลือกบนโต๊ะ (ยังไม่หยิบ) อยู่หน้าตัวละคร (คน/บอทไม่บัง) · คำที่ถือลอยชิดเหนือหัว (ไม่สูงเกิน)", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "client-side · deploy play.js?v=0.006301066+", "cat": "Minigame 4" }, { "n": 169, "name": "MG4: โชว์ใครตอบถูกก่อนไปข้อต่อไป", "detail": "ตอบถูก → โชว์ \"🎉 X ตอบถูก!\" ~1.6วิ ให้ทุกคนเห็นก่อน → ค่อยเป็น \"รอคำถามข้อต่อไป\" · หมดเวลาไม่มีคนถูก=พักทันที", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "client-side · deploy play.js?v=0.006301065+", "cat": "Minigame 4" }, { "n": 170, "name": "MG2: บอทไม่กระจุกมุมบนก่อนเริ่ม", "detail": "ช่วง pregame (howto/countdown) บอทอยู่ที่จุดเกิด (เรียงตาม lane) ไม่ไปกองมุมบนซ้าย", "prio": "กลาง", "status": "เปิด", "updated": "2026-07-02", "note": "server ส่ง bot spawn ใน crownLobbySyncPayload · client วางที่ spawn ตอน pre-live · deploy 2026-07-02", "cat": "Minigame 2" }, { "n": 171, "name": "MG2: obstacle ไม่จางตอนใกล้เส้นชัย", "detail": "เข้าใกล้เส้นชัย obstacle โชว์เต็ม (ไม่ค่อยๆ จาง) แล้วตัดหายที่จุด stop · (ถ้ายัง \"ขึ้นมาใหม่\" ช่วงท้าย = คนละอาการ)", "prio": "ต่ำ", "status": "เปิด", "updated": "2026-07-02", "note": "client-side · gauntletCrownRunwayObstacleDrawAlphaPlay hard-cutoff · deploy play.js?v=0.006301068", "cat": "Minigame 2" }, { "n": 172, "cat": "Minigame 2", "name": "MG2: ตายหมด → ขึ้น game over + จบทันที", "detail": "MG2 (วิ่งหลบ) ถ้าผู้เล่นจริงตกขอบหมด ต้องขึ้นจอ result-gameover แล้วเข้าสรุป (GCM) → กลับ LobbyB ทันที (grace 3 วิ) ไม่ใช่รอเดินเข้าเส้นชัย/รอหมดเวลา · fix: server ส่ง sync สุดท้าย(ทุกคนตาย)ให้ client ทริกจอ + grace เท่าทางชนะ · verify: gamelog ev=gauntlet-end [TC172]", "prio": "สูง", "status": "รอทดสอบ", "updated": "", "note": "ต้องเทส 2+ คน + มีบอท · log tag [TC172]" }, { "n": 173, "cat": "ระบบ disconnect", "name": "บอทผีเข้าไปเล่นเอง MG3/5/7 (pending takeover ค้าง)", "detail": "ตอน host กดเริ่มเกม ทุก client navigate room-lobby→play.html socket หลุดชั่วขณะช่วง how-to → server จองบอท takeover ไว้ พอ reconnect กลับมา เดิมไม่ล้าง pending → seed เป็นบอทผีเล่นคู่กับคนจริง (เฉพาะ MG3/5/7 ที่สร้าง session ตอน 3-2-1 จบ) · fix: rejoin ล้าง pendingMissionTakeovers ที่ playerKey ตรง · verify: gamelog ev=join [TC173]", "prio": "สูง", "status": "รอทดสอบ", "updated": "", "note": "ต้องเทส 2+ คน · log tag [TC173]" }, { "n": 174, "cat": "LobbyB", "name": "Vote reveal โชว์ผลนานขึ้น (7วิ) + admin ปรับได้", "detail": "โหวตจบ → จอ \"คนร้ายตัวจริงคือ...\" โชว์ ~7วิ ก่อนไปหน้าผลเต็ม (เดิม 2.6วิ) · ปรับที่ admin→Vote timing→โชว์ผลโหวต · verify: gamelog ev=trial-reveal-dur [TC174]", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "เทสด้วยตา+log · admin game-timing.trialResultRevealMs" }, { "n": 175, "cat": "ระบบ disconnect", "name": "เน็ตแย่ → บล็อกกด Ready + safety 15วิ", "detail": "ในหน้า how-to มินิเกม ถ้าเน็ตแย่ (RTT≥700/reconnecting) ปุ่ม Ready เทากดไม่ได้ + toast \"กำลังรอสัญญาณให้เสถียร\" · เน็ตกลับ/ครบ15วิ ปลดล็อกเอง · verify: gamelog ev=net-ready-block [TC175]", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "throttle เน็ต (Slow 3G) เทส · client log" }, { "n": 176, "cat": "LobbyB", "name": "LobbyB ไม่โชว์ ✓ ready เหนือหัว", "detail": "LobbyB ไม่มีเฟสกดพร้อม → ไม่วาด ✓ เหนือหัวตัวละคร (LobbyA ยังมี) · เทสด้วยตา", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "visual only" }, { "n": 177, "cat": "LobbyB", "name": "มือถือ ปุ่มกลาง(รูป) แทนกด F", "detail": "coarse pointer: LobbyA host+พร้อมครบ=ปุ่ม เริ่มเกม กลางล่าง · LobbyB เฟสสืบสวน=ปุ่ม ผู้ต้องสงสัย · กดทำ action เลย ไม่ต้องเดินไปยืน+F · อยู่คู่ปุ่ม F ล่างซ้าย · PC ไม่เห็น · verify: gamelog ev=mobile-center-btn [TC177]", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "เทสมือถือ + client log" }, { "n": 178, "cat": "Minigame 2", "name": "ปุ่ม action ทุกเกม = แบบ MG3 (มุมขวาล่าง)", "detail": "MG2/5/7 ปุ่มกระโดด/ยิง ใช้ position/size เดียวกับ MG3 (#stack-tower-drop-btn มุมขวาล่างวงกลม) · เทสด้วยตา ไม่ทับ art HUD", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "visual only" }, { "n": 179, "cat": "LobbyB", "name": "การ์ดหลักฐาน LobbyB เท่ากันทุกจอ (team progress)", "detail": "ช่องหลักฐานใต้การ์ดผู้ต้องสงสัยใช้ team progress (shared server) ไม่ใช่หลักฐานส่วนตัว → ทุกจอเห็นเท่ากัน (เดิมจริง1 บางคนเห็น3) · verify: gamelog ev=suspect-progress [TC179]", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "เทส 4 คน + log" }, { "n": 180, "cat": "LobbyB", "name": "Vote ยืนยันก่อนส่ง (barrier รอทุกคน)", "detail": "เลือกการ์ด (เปลี่ยนใจได้) → กด ยืนยันโหวต ✓ → ล็อก · รอทุกคนยืนยันครบ (บอท auto/แบนข้าม) ค่อย reveal · verify: gamelog ev=trial-vote [TC180] + trial-confirm", "prio": "กลาง", "status": "รอทดสอบ", "updated": "", "note": "เทส 2+ คน + log" }, { "n": 182, "cat": "ระบบ disconnect", "name": "หลักฐานแจกเกินตอนชื่อซ้ำ (MONE) — 1 การ์ด/คน", "detail": "ชื่อซ้ำหลายจอ → หลักฐานเก็บด้วย nickname ชนกันแจกเกิน · fix: key ด้วย playerKey + dedup 1/key/เกม · verify gamelog [TC182] ใบ/key=[1,1,1,1]", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 183, "cat": "Minigame 3", "name": "MG3 คะแนนต่อคนปกติ (ไม่ inflate)", "detail": "เช็คคะแนน MG3 ไม่สูงผิดปกติ/ไม่ซ้ำจากชื่อซ้ำ · verify gamelog [TC183] team + ต่อคน (เช่น 50/50/40/30 = ปกติ)", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 184, "cat": "Minigame 3", "name": "MG3 เปลี่ยนตาไม่ค้าง (turn-hang)", "detail": "พอไปตาคนต่อไปเดิมค้าง ~1.5วิ (swing แช่แข็ง) · fix: swing เดินต่อระหว่าง busy + ลด 1500→1200", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 185, "cat": "Minigame 3", "name": "MG3 หัวใจ/decrypt% sync ตรงทุกจอ", "detail": "เดิมหัวใจไม่ลดบางจอ (full-sync ไม่ส่ง teamMissesLeft) · fix: full-sync ส่งหัวใจ+% + client self-correct", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 186, "cat": "Minigame 3", "name": "MG3 TIME ตรงทุกจอ (ไม่ 90 vs 8)", "detail": "เดิมจอเข้าช้า TIME เริ่มใหม่ (local clock) · fix: ยึด server anchor (playMissionLiveBeginsAt)", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 187, "cat": "Minigame 3", "name": "MG3 avatar โหลดสำเร็จบนเครื่องช้า", "detail": "avatar ก้อนเขียวตอนเครื่องช้า (preload ยอมแพ้ 3.6วิ) · fix: retry ขยาย 15วิ", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" }, { "n": 189, "cat": "ระบบ disconnect", "name": "refresh กลางเกม → เล่นต่อได้ ไม่ติด how-to", "detail": "F5/reconnect กลางเกม live เดิมค้างหน้า how-to · fix: server missionLive flag + client skip how-to", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": "" } ]