Files
2026-06-25 07:33:35 +00:00

91 lines
30 KiB
Plaintext

<!DOCTYPE html>
<html lang="th"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Justice — Test Case / Bug List</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#0a0f1e;--panel:#121a30;--panel2:#0e1526;--line:#22304f;--txt:#dce6ff;--mut:#8aa0c8;--cyan:#22d3ee;--green:#22c55e;--red:#f87171;--amber:#fbbf24;}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:Kanit,system-ui,sans-serif;background:radial-gradient(circle at 50% -10%,#13213f,#070b16 70%);color:var(--txt);min-height:100vh;padding:24px 16px 60px}
.wrap{max-width:1180px;margin:0 auto}
h1{font-weight:600;font-size:26px;letter-spacing:.5px;margin-bottom:4px}
h1 .sub{color:var(--mut);font-size:14px;font-weight:300;display:block;margin-top:4px}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin:18px 0}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.card .v{font-size:28px;font-weight:600}
.card .l{font-size:12px;color:var(--mut);letter-spacing:.04em;margin-top:2px}
.card.ok .v{color:var(--green)}.card.open .v{color:var(--amber)}
.bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:14px 0}
.bar input{flex:1;min-width:180px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;color:var(--txt);padding:10px 14px;font-family:inherit;font-size:14px}
.bar input:focus{outline:none;border-color:var(--cyan)}
.chip{background:var(--panel2);border:1px solid var(--line);border-radius:20px;color:var(--mut);padding:7px 15px;font-size:13px;cursor:pointer;font-family:inherit;transition:.15s}
.chip:hover{border-color:var(--cyan);color:var(--txt)}
.chip.on{background:var(--cyan);border-color:var(--cyan);color:#04121a;font-weight:600}
table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden}
th{text-align:left;font-size:12px;color:var(--mut);font-weight:500;letter-spacing:.04em;padding:11px 12px;background:var(--panel2);border-bottom:1px solid var(--line);position:sticky;top:0}
td{padding:11px 12px;border-bottom:1px solid var(--line);font-size:13.5px;vertical-align:top;line-height:1.45}
tr:last-child td{border-bottom:none}
tr:hover td{background:rgba(34,211,238,.04)}
.n{color:var(--mut);font-size:12px}
.nm{font-weight:500}
.dt{color:var(--mut);font-size:12.5px;margin-top:3px}
.nt{color:#7fd4a8;font-size:12px;margin-top:4px}
.b{display:inline-block;border-radius:6px;padding:3px 9px;font-size:11.5px;font-weight:500;white-space:nowrap}
.s-open{background:rgba(251,191,36,.16);color:var(--amber)}
.s-fix{background:rgba(34,197,94,.16);color:var(--green)}
.s-prog{background:rgba(34,211,238,.16);color:var(--cyan)}
.s-other{background:rgba(138,160,200,.16);color:var(--mut)}
.p-crit{background:rgba(248,113,113,.16);color:var(--red)}
.p-high{background:rgba(251,146,60,.16);color:#fb923c}
.p-mid{background:rgba(251,191,36,.14);color:var(--amber)}
.p-low{background:rgba(138,160,200,.14);color:var(--mut)}
.foot{color:var(--mut);font-size:12px;margin-top:16px;text-align:center}
@media(max-width:680px){.hide-sm{display:none}td,th{padding:9px 8px}}
</style></head>
<body><div class="wrap">
<h1>Justice — Test Case / Bug List<span class="sub">รายการบัก/เทสเคส · อัปเดตจากการเทสจริง · srv1361159.hstgr.cloud/testcase</span></h1>
<div class="cards" id="cards"></div>
<div class="bar">
<input id="q" placeholder="ค้นหา… (ชื่อ / รายละเอียด / หมายเหตุ)">
<button class="chip on" data-f="all">ทั้งหมด</button>
<button class="chip" data-f="เปิด">เปิด</button>
<button class="chip" data-f="แก้ไขแล้ว">แก้ไขแล้ว</button>
</div>
<table><thead><tr><th style="width:34px">#</th><th>ปัญหา</th><th style="width:90px">สำคัญ</th><th style="width:104px">สถานะ</th><th class="hide-sm" style="width:96px">อัปเดต</th></tr></thead>
<tbody id="tb"></tbody></table>
<div class="foot">Justice bug tracker · generated from xlsx · 62 รายการ</div>
</div>
<script>
var DATA=[{"n": 1, "name": "แต่งตัวไม่ได้", "detail": "แต่งตัวยังไม่ได้ มีพี่คิวทำได้คนเดียว", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 2, "name": "ตัวละครไม่แสดง", "detail": "หน้าเลือกเกม Quiz battle ภาพตัวละครไม่แสดง", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 3, "name": "ระบบ join เกมมีปัญหา", "detail": "เมื่อเข้ามินิเกม : บางคนเล่นเกมกะบอท บางคนเล่นกะเพื่อน แต่ละคนเข้ามินิเกมแล้วเจอกันบ้าง ไม่เจอกันบ้าง", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 4, "name": "ระบบ Host มีปัญหา - 1", "detail": "เป็น host ในเกม ตอนที่เลือกผู้ต้องสงสัย รอบที่ 2 ระบบบอกว่าให้รอ host ไม่สามารถเลือกการ์ดและกดเริ่มสืบสวนได้", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 5, "name": "ระบบ Host มีปัญหา - 2", "detail": "เมื่อกดออกจากเกม Host เปลี่ยนจากพี่ต้อมเป็นพี่คิวอัติโนมัติ", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 6, "name": "ระบบ Host มีปัญหา - 3", "detail": "เมื่อเข้ามินิเกม ทุกคนเห็นตัวเองเป็น host หมดเลย แต่กดเริ่มเกมไม่ได้", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 7, "name": "ระบบสีตัวละคร ยังใช้ไม่ได้", "detail": "สีตัวละครเปลี่ยนไปเรื่อย ไม่รุ้ว่าเราสีอะไรแน่ งงไปหมด", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 8, "name": "หน้าเข้าร่วมเกมส์", "detail": "ห้องไหนที่เริ่มเกมส์ไปแล้ว เมื่อกดเข้าร่วมแสดง popup alert error ปรับดีไซต์ให้สวยงามกว่านี้", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 9, "name": "เกมวิ่งขึ้นบันได ผิด flow", "detail": "ปรับ flow ให้ถูกต้อง คือ ใครตกจอตาย แต่ถ้าขึ้นไปอยู่บนสุดแล้วจะกระโดดไม่ไปต่อเฉยๆ แต่ไม่ตาย", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 10, "name": "เกมวิ่งขึ้นบันได", "detail": "เวลาหมดแล้ว ให้เล่นรอบ 2 auto / รอบ 3 มี popup ให้กดเล่นต่อ", "prio": "", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 11, "name": "เกมยิงลูกโป่ง", "detail": "ฉากเกมยิงลูกโป่งเล็กไป", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 12, "name": "เกมต่อตึก ผิด flow", "detail": "ปรับ flow ให้ถูกต้อง คือ เล่นทีละคน เรียงตามคิวไปเรื่อย โดยที่ blog ตามสีผู้เล่นด้วย", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 13, "name": "เข้าร่วมห้องไม่ได้", "detail": "สร้างห้องส่วนตัวเเล้ว เเต่เพื่อนจอยเข้าไปไม่ได้ ทั้งที่กรอกข้อมูลครบ", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 14, "name": "Room ID", "detail": "เวลาจอยห้องให้กรอกเเค่ ID กับรหัสที่สร้าง", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 15, "name": "จอยห้องคนอื่น", "detail": "ในกรณีที่จอยห้องคนอื่น ไปหน้าเข้าร่วม เเละกดปุ่มเข้าร่วมไปเเล้ว จากนั้นกดปุ่ม exit จะพาไปหน้าสร้างห้อง สิ่งที่ถูกต้อง มันควรมาหน้า ห้องเข้าร่วมเกม", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "", "note": ""}, {"n": 16, "name": "grid กับ ฉาก ไม่ตรงกัน", "detail": "เกม Quiz battle เกมที่ 1 ฉากกับกริดไม่ตรงกัน ทำให้เดินทะลุ หรือเดินติดในจุดที่ไม่ควรติด", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 17, "name": "ตัวละครวิ่งเร็วเกินไป", "detail": "เกม Quiz battle เกมที่ 1 ตัวละครผู้เล่นเร็วเกินไป", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 18, "name": "Oauth Social log-in error", "detail": "ไม่สามารถ log-inด้วย facebook / Google ได้ path: /oauth-public.php", "prio": "ต่ำ", "status": "เปิด", "updated": "", "note": ""}, {"n": 19, "name": "หน้า login", "detail": "นโยบายความเป็นส่วนตัวกดไม่ได้", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 20, "name": "แสดงเลข version ตรงมุมจอ", "detail": "แสดงเลข version ตรงมุมจอขวาบนหรือขวาล่างก็ได้", "prio": "ต่ำ", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — badge มุมขวาล่าง อ่าน ?v= อัตโนมัติ"}, {"n": 21, "name": "ลดขนาดตัวละคร", "detail": "ลดขนาดตัวละครในห้อง lobby ลงอีก 2เท่า", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 22, "name": "เปลี่ยน ui popup ตอนพูดบนหัว", "detail": "แก้ png seq บนหัวใหม่ เป็นแบบอื่น", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 23, "name": "ชื่่อตัวละครทับลำโพง/ทับ bubble", "detail": "ใน lobby ขยับชื่อลงมาอย่าให้ทับ", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 24, "name": "UI แต่งตัว : การแจ้งเตือนสีตัวละครถูกใช้แล้ว", "detail": "ตอนเลือกสีให้มีคำแจ้งเตือน used", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 25, "name": "เพิ่ม ข้อความแจ้งเตือนอัพเดทกลางจอ", "detail": "ถ้ามีการอัพเดทซีน อัพเดทสีตัวละครให้มีป็อปอัพเด้งมากลางหน้าจอ ว่ามีการอัพเดทและให้รอโหลด", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 26, "name": "เอาเงาตัวละครออก 1 อัน", "detail": "ตอนนี้ตัวละครมีเงา 2 ชั้น เอาออกไป 1 ชั้น", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — ปิด default-shadow overlay เหลือเงาในสไปรต์"}, {"n": 27, "name": "optimize ตัวละครให้เล็กลงอีก มันโหลดช้า", "detail": "", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 28, "name": "ปุ่ม start ใน lobby", "detail": "ทำให้ดูโต้ตอบหน่อย เช่นพอเดินเข้าไปใกล้ให้มัน glow ขึ้นมา", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 29, "name": "เกมต่อตึก ผิด flow", "detail": "สี blog กับคนเล่นยังไม่สัมพันกัน ต้องเรียงตามสี และตามคิว", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 30, "name": "เกมต่อตึก บั๊กคนที่ 5", "detail": "คนที่ 5 ไม่สามารถเล่นได้", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 31, "name": "เอา mock การ์ดผู้ต้องหาเก่าออกไป", "detail": "มันแว่บๆมา", "prio": "กลาง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.006242530 (รอเทส) — ซ่อนรูปจนรูปคดีจริงโหลด + spinner"}, {"n": 32, "name": "เอา popup ขออนุญาตใช้ไมค์ออกไปเลย น่ารำคาญ", "detail": "", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 33, "name": "หน้า howto เปลี่ยนสีปุ่ม ready ด้วยตอน กดready แล้ว", "detail": "เปลี่ยนเป้นสีเขียวพร้อมเครื่องหมายถูกตามดีไซน์", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"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)"}, {"n": 35, "name": "เกมวิ่ง : กดปุ่มไม่กระโดด", "detail": "ปุ่ม jump กดแล้วไม่กระโดด", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 36, "name": "เกมวิ่ง : ตอนจบบั๊ค วิ่งเลยฉาก", "detail": "ตอนจบบั๊ค วิ่งเลยฉาก (ในบางรอบ)", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG2 วิ่งเลยฉาก: walk-to-finish ค่อยๆเดินเข้าเส้น + clamp ไม่เลยเส้น"}, {"n": 37, "name": "popup รับหลักฐาน ทับไมค์", "detail": "กดไมค์ไม่ได้ ตอนรับหลักฐาน ไปดูเรื่องเลเยอร์อีกที", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 38, "name": "หน้าส่งหลักฐาน ปุ่มส่งหลักฐานหลุดจอ (เครื่องของเนส)", "detail": "เป้นเครื่องเนสคนเดียว", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 39, "name": "ห้องส่งหลักฐาน : เมื่อมีคนหลุด 1 คน จะไปต่อไม่ได้เลย", "detail": "", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — testimony: disconnect ลบ submit/ready + client ใช้ totalPlayers authoritative"}, {"n": 40, "name": "จำนวนคน ให้เล่นได้ตั้งแต่ 4-6 คน", "detail": "กรณีเลือกผู้เล่นตั้งแต่ 4 คนขึ้นไปไม่ต้องมี bot", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"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 ข้อ"}, {"n": 42, "name": "เกม กระโดด", "detail": "ท่ากระโดดแปลก ยืนซอยเท้าทำไม", "prio": "กลาง", "status": "เปิด", "updated": "", "note": ""}, {"n": 43, "name": "เกม กระโดด", "detail": "ขั้นบันไดมันถี่ไป บางทีกระโดดแล้วเบิ้ลขั้นเลย ปรับให้ระยะห่างแต่ละขั้นมันเท่ากัน", "prio": "สูง", "status": "เปิด", "updated": "", "note": ""}, {"n": 44, "name": "เกมกระโดด", "detail": "อีเวนท์พิเศษ (ทนาย/เทพความรู้) หายไป", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG5 อีเวนต์พิเศษ: เพิ่ม branch jump_survive วาง icon บน platform"}, {"n": 45, "name": "เกมไม่รองรับ 4K", "detail": "หน้ารับหลักฐาน (หลังจากเล่นเกมจบ)", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 46, "name": "เกมยิิงอุกาบาด", "detail": "สีตัวละครยังไม่ตรงกับที่เลือกมา", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG6 สี: ยาน Rocket-1..8 ตาม lobby theme ของผู้เล่น"}, {"n": 47, "name": "เกมยิิงอุกาบาด", "detail": "อุกาบาดให้พุ่งเร็วกว่านี้ และลูกเล็กกว่านี้เกมง่ายไป", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-24", "note": "✅ แก้แล้ว 2026-06-24 v0.006242500 (รอเทส) — MG6: อุกาบาตเร็วขึ้น (+~50%) + เล็กลง (48->34/11->8)"}, {"n": 48, "name": "เพิ่ม popup เมื่อเกมค้าง เล่นต้่อไม่ได้ ให้มีปุ่มกดออกไปหน้าแรกสุด", "detail": "สาเหตุเกิดจากมีคนหลุดระหว่างรอ host กด", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"n": 49, "name": "กรณีผู้เล่นหลุดออกจากเกม", "detail": "ถ้ามีคนหลุด ให้กลายเป้นบอทแทน", "prio": "วิกฤต", "status": "เปิด", "updated": "", "note": ""}, {"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 (รอเทส)"}, {"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 (รอเทส)"}, {"n": 52, "name": "หน้าไต่สวน/สรุปหลักฐาน: กรอบปลิ้นตอน 6 คน", "detail": "member row grid repeat(5)->repeat(6) ใน testimony-overlay.css (คนที่6 ตกแถว2)", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.006242530 (รอเทส)"}, {"n": 53, "name": "เพิ่มหน้าโหลด (loading) ตอนเข้าเกม", "detail": "overlay spinner กันเห็นจอเปล่า/asset แว่บ ซ่อนเมื่อ draw เฟรมแรก + safety 8s", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.006242530 (รอเทส)"}, {"n": 54, "name": "host โหลดนานมากตอนเข้าเกม", "detail": "optimize asset/char (เกี่ยว row 28) — loading overlay ช่วยซ่อน แต่ยังโหลดช้าจริง", "prio": "สูง", "status": "เปิด", "updated": "2026-06-25", "note": ""}, {"n": 55, "name": "หลังออกจาก LobbyA ไม่ให้ใครเข้า join", "detail": "server มี joinLocked (set ตอน LobbyA->case ~8656, check ~7585 whitelist nickname) — ต้อง repro ว่าใครเข้าได้ยังไง (room list ยังโชว์? ชื่อซ้ำ whitelist?)", "prio": "สูง", "status": "เปิด", "updated": "2026-06-25", "note": ""}, {"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"}, {"n": 57, "name": "เล่นมินิเกมเกิน 3 ครั้งต่อผู้ต้องสงสัย (+การ์ดพิเศษโผล่รอบที่4)", "detail": "server cap suspect-pick-start (max หลักฐาน>=3 reject) + award cap 3 + client canInvestigateSuspect<3 (เดิม stub return true). UI messaging มีอยู่แล้ว", "prio": "วิกฤต", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.0309/server (รอเทส)"}, {"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 (รอเทส)"}, {"n": 59, "name": "loading ไม่คลุม scene transition (เห็นฉากเก่าก่อนเปลี่ยน)", "detail": "LobbyA->B (in-page swap) โชว์ room-loading ระหว่าง fetch+swap · LobbyB->เกม โชว์ overlay ก่อน location.href · play.html มี overlay รับช่วง", "prio": "สูง", "status": "แก้ไขแล้ว", "updated": "2026-06-25", "note": "✅ แก้แล้ว 2026-06-25 v0.0309/server (รอเทส)"}, {"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 (รอเทส)"}, {"n": 61, "name": "MG3 สี block ไม่ตรง user (เกม+admin)", "detail": "PNG Block-Code-1..8 deploy ครบแล้ว · ต้อง wire สี block = lobby theme ของผู้วาง (seat=theme refactor, ต้องเทส 2 จอ) + admin 8-slot config", "prio": "วิกฤต", "status": "เปิด", "updated": "2026-06-25", "note": ""}, {"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 (รอเทส)"}];
var filt="all",q="";
function esc(s){return (s||"").replace(/[&<>]/g,function(c){return{"&":"&amp;","<":"&lt;",">":"&gt;"}[c]})}
function sCls(s){return s.indexOf("แก้")>=0?"s-fix":s.indexOf("กำลัง")>=0?"s-prog":s==="เปิด"?"s-open":"s-other"}
function pCls(p){return p.indexOf("วิกฤต")>=0?"p-crit":p.indexOf("สูง")>=0?"p-high":p.indexOf("กลาง")>=0?"p-mid":p?"p-low":""}
function render(){
var open=DATA.filter(function(r){return r.status==="เปิด"}).length;
var fix=DATA.filter(function(r){return r.status.indexOf("แก้")>=0}).length;
document.getElementById("cards").innerHTML=
'<div class="card"><div class="v">'+DATA.length+'</div><div class="l">ทั้งหมด</div></div>'+
'<div class="card open"><div class="v">'+open+'</div><div class="l">เปิด</div></div>'+
'<div class="card ok"><div class="v">'+fix+'</div><div class="l">แก้ไขแล้ว</div></div>';
var rows=DATA.filter(function(r){
if(filt==="เปิด"&&r.status!=="เปิด")return false;
if(filt==="แก้ไขแล้ว"&&r.status.indexOf("แก้")<0)return false;
if(q){var h=(r.name+" "+r.detail+" "+r.note).toLowerCase();if(h.indexOf(q)<0)return false}
return true;});
document.getElementById("tb").innerHTML=rows.map(function(r){
return '<tr><td class="n">'+r.n+'</td><td><div class="nm">'+esc(r.name)+'</div>'+
(r.detail?'<div class="dt">'+esc(r.detail)+'</div>':'')+
(r.note?'<div class="nt">'+esc(r.note)+'</div>':'')+'</td>'+
'<td>'+(r.prio?'<span class="b '+pCls(r.prio)+'">'+esc(r.prio)+'</span>':'')+'</td>'+
'<td><span class="b '+sCls(r.status)+'">'+esc(r.status)+'</span></td>'+
'<td class="hide-sm n">'+esc(r.updated)+'</td></tr>';
}).join("")||'<tr><td colspan="5" style="text-align:center;color:var(--mut);padding:30px">ไม่พบรายการ</td></tr>';
}
document.getElementById("q").addEventListener("input",function(e){q=e.target.value.toLowerCase().trim();render()});
[].forEach.call(document.querySelectorAll(".chip"),function(b){b.addEventListener("click",function(){
[].forEach.call(document.querySelectorAll(".chip"),function(x){x.classList.remove("on")});
b.classList.add("on");filt=b.getAttribute("data-f");render();})});
render();
</script></body></html>