fixed3 5 7

This commit is contained in:
2026-07-03 17:09:52 +00:00
parent 09c0a7bf76
commit f638547f32
10 changed files with 5912 additions and 491 deletions
+107 -53
View File
@@ -51,9 +51,9 @@
"providerUserId": "p_1775109142385_wq7wfy1p32j",
"notes": "auto: player-coins",
"blocked": false,
"coins": 3082,
"coins": 3090,
"createdAt": "2026-04-02T05:52:21+00:00",
"updatedAt": "2026-07-03T10:29:39+00:00",
"updatedAt": "2026-07-03T16:31:03+00:00",
"daily": {
"anchorMs": 1781197200000,
"claimedDays": [
@@ -67,10 +67,10 @@
],
"lockUntilMs": 0
},
"score": 1008,
"score": 1016,
"scoreByCase": {
"1": 26,
"10": 970,
"10": 978,
"8": 306,
"11": 20,
"13": 368,
@@ -106,9 +106,9 @@
"providerUserId": "p_1775128666204_xzgg2n6x8h",
"notes": "auto: player-coins",
"blocked": false,
"coins": 291,
"coins": 363,
"createdAt": "2026-04-02T11:17:46+00:00",
"updatedAt": "2026-07-02T07:39:38+00:00",
"updatedAt": "2026-07-03T11:54:27+00:00",
"lobbyColorThemeIndex": 1,
"lobbySkinToneIndex": 3,
"daily": {
@@ -124,22 +124,27 @@
],
"lockUntilMs": 0
},
"score": 246,
"score": 318,
"scoreByCase": {
"6": 30,
"6": 56,
"13": 50,
"5": 8,
"12": 6,
"10": 78,
"10": 106,
"3": 10,
"2": 26,
"7": 38
"7": 38,
"1": 18
},
"lbName": "บอท 888",
"achievements": {
"d1_minigame_solver": 20,
"a1_first_deduction": 1,
"a5_truth_hunter": 3
"a5_truth_hunter": 3,
"e2_the_impostor": 1,
"e4_agent_of_chaos": 1,
"e3_master_of_doubt": 1,
"e5_slippery_eel": 1
}
},
{
@@ -150,21 +155,21 @@
"providerUserId": "p_1777015659667_xqfjh247bgp",
"notes": "auto: player-coins",
"blocked": false,
"coins": 348,
"coins": 382,
"createdAt": "2026-04-24T07:28:02+00:00",
"updatedAt": "2026-06-21T09:15:13+00:00",
"score": 348,
"updatedAt": "2026-07-03T16:38:57+00:00",
"score": 382,
"scoreByCase": {
"8": 220,
"5": 30,
"7": 60,
"2": 10,
"9": 10,
"10": 18
"10": 52
},
"lbName": "MONE",
"lbName": "Q",
"achievements": {
"d1_minigame_solver": 4
"d1_minigame_solver": 8
},
"lobbyColorThemeIndex": 6,
"lobbySkinToneIndex": 1
@@ -235,25 +240,25 @@
"providerUserId": "p_1780400804441_lsc3lqqvs0i",
"notes": "auto: player-coins",
"blocked": false,
"coins": 193,
"coins": 224,
"createdAt": "2026-06-02T11:46:46+00:00",
"updatedAt": "2026-06-26T12:12:46+00:00",
"updatedAt": "2026-07-03T12:00:58+00:00",
"daily": {
"anchorMs": 1781802000000,
"claimedDays": [
true,
true,
true,
false,
true,
false,
false,
false
],
"lockUntilMs": 0
"lockUntilMs": 1783098000000
},
"score": 148,
"score": 154,
"scoreByCase": {
"1": 4,
"1": 10,
"7": 2,
"10": 52,
"6": 24,
@@ -266,7 +271,7 @@
"achievements": {
"d1_minigame_solver": 20,
"a1_first_deduction": 1,
"a5_truth_hunter": 2
"a5_truth_hunter": 3
},
"lobbyColorThemeIndex": 8,
"lobbySkinToneIndex": 3
@@ -334,7 +339,7 @@
"blocked": false,
"coins": 169,
"createdAt": "2026-06-19T06:14:02+00:00",
"updatedAt": "2026-07-01T11:44:24+00:00",
"updatedAt": "2026-07-03T11:55:41+00:00",
"daily": {
"anchorMs": 1781802000000,
"claimedDays": [
@@ -346,7 +351,7 @@
false,
false
],
"lockUntilMs": 1782925200000
"lockUntilMs": 0
},
"score": 144,
"scoreByCase": {
@@ -479,9 +484,9 @@
"providerUserId": "p_1781851275186_szcmp5pu3s",
"notes": "auto: player-coins",
"blocked": false,
"coins": 242,
"coins": 254,
"createdAt": "2026-06-19T06:41:15+00:00",
"updatedAt": "2026-06-27T19:28:03+00:00",
"updatedAt": "2026-07-03T16:31:03+00:00",
"daily": {
"anchorMs": 1781802000000,
"claimedDays": [
@@ -495,9 +500,9 @@
],
"lockUntilMs": 0
},
"score": 222,
"score": 234,
"scoreByCase": {
"10": 58,
"10": 70,
"13": 36,
"12": 82,
"4": 28,
@@ -712,14 +717,14 @@
"providerUserId": "p_1782122326943_7p2fnvivscm",
"notes": "auto: player-coins",
"blocked": false,
"coins": 202,
"coins": 216,
"createdAt": "2026-06-22T09:58:46+00:00",
"updatedAt": "2026-06-23T15:32:42+00:00",
"updatedAt": "2026-07-03T16:31:03+00:00",
"lobbyColorThemeIndex": 3,
"lobbySkinToneIndex": 1,
"score": 192,
"score": 206,
"scoreByCase": {
"10": 20,
"10": 34,
"12": 108,
"3": 54,
"13": 10
@@ -739,7 +744,7 @@
false,
false
],
"lockUntilMs": 1782234000000
"lockUntilMs": 0
}
},
{
@@ -750,20 +755,20 @@
"providerUserId": "p_1782122328583_4mqrfx5txyo",
"notes": "auto: player-coins",
"blocked": false,
"coins": 34,
"coins": 46,
"createdAt": "2026-06-22T09:58:48+00:00",
"updatedAt": "2026-07-03T04:30:33+00:00",
"updatedAt": "2026-07-03T16:31:03+00:00",
"lobbyColorThemeIndex": 1,
"lobbySkinToneIndex": 1,
"score": 34,
"score": 46,
"scoreByCase": {
"10": 8,
"10": 20,
"8": 18,
"13": 8
},
"lbName": "MONE",
"achievements": {
"d1_minigame_solver": 2
"d1_minigame_solver": 4
}
},
{
@@ -930,18 +935,18 @@
"providerUserId": "p_1782327780535_twosoa33hsr",
"notes": "auto: player-coins",
"blocked": false,
"coins": 70,
"coins": 74,
"createdAt": "2026-06-24T19:03:00+00:00",
"updatedAt": "2026-07-01T01:03:57+00:00",
"score": 70,
"updatedAt": "2026-07-03T11:36:05+00:00",
"score": 74,
"scoreByCase": {
"10": 40,
"10": 44,
"8": 20,
"3": 10
},
"lbName": "ผู้เล่น",
"lbName": "Q phone",
"achievements": {
"d1_minigame_solver": 7
"d1_minigame_solver": 8
}
},
{
@@ -1048,19 +1053,26 @@
"providerUserId": "p_1778156246099_lbrni0cvx8",
"notes": "auto: player-coins",
"blocked": false,
"coins": 64,
"coins": 116,
"createdAt": "2026-06-29T07:25:24+00:00",
"updatedAt": "2026-07-01T12:00:46+00:00",
"score": 64,
"updatedAt": "2026-07-03T11:58:39+00:00",
"score": 116,
"scoreByCase": {
"10": 42,
"10": 58,
"8": 10,
"7": 2,
"1": 10
"1": 18,
"6": 28
},
"lbName": "บอท 1 (เกือบฉลาด)",
"lbName": "บอท 666",
"achievements": {
"d1_minigame_solver": 9
"d1_minigame_solver": 15,
"e2_the_impostor": 1,
"e4_agent_of_chaos": 2,
"e3_master_of_doubt": 1,
"e5_slippery_eel": 1,
"a1_first_deduction": 1,
"a5_truth_hunter": 1
}
},
{
@@ -1225,6 +1237,48 @@
"12": 10
},
"lbName": "MONE"
},
{
"id": "d2eeb9c6dd97b4fcf92cafa8",
"email": "",
"displayName": "PP",
"loginType": "guest",
"providerUserId": "p_1783077173525_ex7248nv4pj",
"notes": "auto: player-coins",
"blocked": false,
"coins": 56,
"createdAt": "2026-07-03T11:12:53+00:00",
"updatedAt": "2026-07-03T11:54:27+00:00",
"agentDisplayId": "986716",
"linkCode": "5HUN6FRB",
"linkCodeLastUsedAt": "2026-07-03T11:13:50+00:00",
"daily": {
"anchorMs": 1783011600000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783098000000
},
"lobbyColorThemeIndex": 4,
"lobbySkinToneIndex": 3,
"score": 46,
"scoreByCase": {
"6": 18,
"10": 14,
"1": 14
},
"lbName": "PP",
"achievements": {
"d1_minigame_solver": 7,
"a1_first_deduction": 1,
"a5_truth_hunter": 1
}
}
]
}
+3 -3
View File
@@ -97,9 +97,9 @@
"balloonBossPlayerBalloonFallbackUrl": "/Game/img/MegaVirus/Artboard%209.png",
"balloonBossBalloonsPerPlayer": 3,
"forcedMinigameKeys": [
"quiz",
"gauntlet",
"quiz_carry"
"stack",
"jump_survive",
"balloon_boss"
],
"testSpecialCardByMap": {},
"troublesomeForceOffer": false,
+22
View File
@@ -6726,6 +6726,19 @@
return zDraw;
}
let gauntletCrownHowtoVisible = false;
/* rejoin live (server res.missionLive=true) how-to
นเคส refresh กลางเกม แลวคางหน how-to กดตอไมได (handshake readycountdown านไปแล) */
let playRejoinLiveResume = false;
/** ปิด how-to/countdown overlay ทั้งหมด (ใช้ตอน resume เข้าเกม live หลัง reconnect) */
function hideHowtoOverlaysForLiveResumePlay() {
try {
const ho = document.getElementById('gauntlet-crown-howto-overlay');
if (ho) ho.classList.add('is-hidden');
const cd = document.getElementById('gauntlet-crown-countdown');
if (cd) cd.classList.add('is-hidden');
gauntletCrownHowtoVisible = false;
} catch (_e) { /* ignore */ }
}
function isGauntletCrownPregameBlockingPlay() {
if (!usesCrownLobbyShellPlay()) return false;
if (gauntletCrownRunHeldRemote) return true;
@@ -7647,6 +7660,7 @@
function showStackTowerMissionHowtoOverlay() {
if (!isStackTowerMissionUiMapPlay()) return;
if (playRejoinLiveResume) { stackTowerMissionPhase = 'live'; hideHowtoOverlaysForLiveResumePlay(); return; }
hideConflictingOverlaysForGauntletCrown();
applyStackTowerMissionPanelImages();
if (stackTowerMissionCountdownTimer) {
@@ -8015,6 +8029,7 @@
function showJumpSurviveMissionHowtoOverlay() {
if (!isJumpSurviveMissionUiMapPlay()) return;
if (playRejoinLiveResume) { jumpSurviveMissionPhase = 'live'; hideHowtoOverlaysForLiveResumePlay(); return; }
hideConflictingOverlaysForJumpSurviveMission();
applyJumpSurviveJumperPanelImages();
if (jumperMissionCountdownTimer) {
@@ -8395,6 +8410,7 @@
function showSpaceShooterMissionHowtoOverlay() {
if (!isSpaceShooterMissionUiMapPlay()) return;
if (playRejoinLiveResume) { spaceShooterMissionPhase = 'live'; hideHowtoOverlaysForLiveResumePlay(); return; }
hideConflictingOverlaysForGauntletCrown();
applySpaceShooterMissionPanelImages();
if (spaceShooterMissionCountdownTimer) {
@@ -8973,6 +8989,7 @@
function showQuizQuestionMissionHowtoOverlay() {
if (!isQuizQuestionMissionUiMapPlay()) return;
if (playRejoinLiveResume) { quizQuestionMissionPhase = 'live'; hideHowtoOverlaysForLiveResumePlay(); return; }
hideConflictingOverlaysForGauntletCrown();
applyQuizQuestionMissionPanelImages();
if (quizQuestionMissionCountdownTimer) {
@@ -14123,6 +14140,7 @@
function showGauntletCrownHowtoOverlay() {
if (!usesCrownLobbyShellPlay()) return;
if (playRejoinLiveResume) { gauntletCrownPregamePhase = 'live'; hideHowtoOverlaysForLiveResumePlay(); try { trySnapGauntletCrownRunwayScrollToSpawnsPlay(); } catch (_s) { /* ignore */ } return; }
hideConflictingOverlaysForGauntletCrown();
if (isGauntletCrownHeistMapPlay()) applyGauntletCrownHeistMissionPanelImages();
else if (isMegaVirusMissionShellMapPlay()) applyMegaVirusMissionPanelImages();
@@ -20053,6 +20071,9 @@
}
function applyMapAndStart(gameMapData, res) {
/* reconnect live (server join callback res.missionLive) how-to
(fresh game-start ไม res.missionLive false = โชว how-to ปกต) · reset กครงทเรยก */
playRejoinLiveResume = !!(res && res.missionLive);
const prevWasSpaceShooter = mapData && mapData.gameType === 'space_shooter';
const prevWasBalloonBoss = mapData && mapData.gameType === 'balloon_boss';
mapData = gameMapData;
@@ -22540,6 +22561,7 @@
const applySnap = (md) => {
mapData = md;
playEmbedUserZoomMul = 1;
playRejoinLiveResume = false; /* game-start = เริ่มเกมใหม่จริง → โชว์ how-to ปกติ (กัน flag ค้างจาก reconnect รอบก่อน) */
specialQuizArmSent = false; /* รอบมินิเกมใหม่ — รีเซ็ตให้ส่งสัญญาณ arm ไอคอนคำถามพิเศษได้อีกครั้ง */
if (ev.mapId != null && String(ev.mapId).trim() !== '') {
playSessionMapId = String(ev.mapId).trim();
+1 -1
View File
@@ -5462,7 +5462,7 @@
<script src="/Game/socket.io/socket.io.js"></script>
<script src="js/version.js?v=0.0306"></script>
<script src="js/sound.js?v=1"></script>
<script src="js/play.js?v=0.006301074"></script>
<script src="js/play.js?v=0.006301075"></script>
<div class="version-tag">v —</div>
<style id="qc-howto-mg2-fix">
/* HOW TO PLAY ของ quiz_carry (Minigame-4) -> ให้เหมือน Minigame-2 (gch-mg2-mock)
+35 -2
View File
@@ -7518,6 +7518,25 @@ function isCrownLobbyShellSpace(space) {
return isGauntletCrownHeistMapBySpace(space) || isBalloonBossMissionShellSpace(space) || isQuizQuestionMissionShellSpace(space) || isStackTowerMissionShellSpace(space) || isJumpSurviveMissionShellSpace(space) || isSpaceShooterMissionShellSpace(space);
}
/** "live " ( how-to/ session engine gauntlet )?
ใชตอน rejoin: live แล client องขาม how-to แลวเขาเลนตอทนท (เดมโชว how-to เสมอ คน reconnect าง)
signal = session.active (สรางตอน 3-2-1 จบ, างตอนกล LobbyB) เชอถอไดกว missionLiveBeginsAt (ไมเคย reset อเกม) */
function isMinigameLiveForRejoinResume(space) {
if (!space) return false;
const md = (space.mapId && maps.get(space.mapId)) || space.mapData;
if (!md) return false;
switch (md.gameType) {
case 'gauntlet': return !!(space.gauntletRun && !space.gauntletRun.crownRunHeld);
case 'stack': return !!(space.stackSession && space.stackSession.active);
case 'jump_survive': return !!(space.jumpSurviveSession && space.jumpSurviveSession.active);
case 'space_shooter': return !!(space.spaceShooterSession && space.spaceShooterSession.active);
case 'balloon_boss': return !!(space.balloonBossSession && space.balloonBossSession.active);
case 'quiz': return !!(space.quizSession && space.quizSession.active);
case 'quiz_carry': return !!(space.quizCarrySession && space.quizCarrySession.active);
default: return false;
}
}
/* ── How-to / pre-live disconnect takeover (MG3MG7)
เกมเหลานสราง session (bots/turnOrder) ตอน 3-2-1 จบเทาน าคนหลดชวง how-to /
บถอยหล งไม session ใหแปลงเปนบอท เด avatar เลยหายไปเลย (ตกไป user-left).
@@ -9679,7 +9698,7 @@ function runGauntletTick(sid, space) {
if (gauntletAllHumansEliminated(space)) {
gr.gameoverAt = Date.now() + GAUNTLET_FINISH_WALK_MS;
gr.obstacles = [];
try { glog(sid, space, 'gauntlet-end', 'ตายหมด (ระหว่าง finish-phase) → grace game over'); } catch (e) { /* ignore */ }
try { glog(sid, space, 'gauntlet-end', '[TC172] ตายหมด (ระหว่าง finish-phase) → grace game over → กลับ LobbyB (pass)'); } catch (e) { /* ignore */ }
return;
}
if (gr.finishEndAt == null) gr.finishEndAt = Date.now() + GAUNTLET_FINISH_WALK_MS;
@@ -9837,7 +9856,7 @@ function runGauntletTick(sid, space) {
if (gauntletAllHumansEliminated(space)) {
gr.gameoverAt = Date.now() + GAUNTLET_FINISH_WALK_MS;
gr.obstacles = [];
try { glog(sid, space, 'gauntlet-end', 'ผู้เล่นตกขอบหมด → grace game over แล้วกลับ LobbyB'); } catch (e) { /* ignore */ }
try { glog(sid, space, 'gauntlet-end', '[TC172] ผู้เล่นตกขอบหมด → grace game over แล้วกลับ LobbyB (pass)'); } catch (e) { /* ignore */ }
emitGauntletSync(sid, space);
return;
}
@@ -10722,6 +10741,19 @@ io.on('connection', (socket) => {
sBJ.bots.forEach((b, bid) => { if (b && b.takeover && b.takeoverPlayerKey && b.takeoverPlayerKey === joinPlayerKey) dropBB.push(bid); });
dropBB.forEach((bid) => { sBJ.bots.delete(bid); io.to(spaceId).emit('user-left', { id: bid }); });
}
/* MG3MG7 pending takeover ( how-to/ session live):
าง pending playerKey ตรง drainPendingMissionTakeovers seed เปนบอทซำตอน startXxxGame
ROOT CAUSE "บอทเข้าไปเล่นด้วย MG3/5/7": rejoin เดมถอนบอทเฉพาะ session live แล (บลอกขางบน)
แต shell (MG3-7) สราง session ตอน 3-2-1 จบ ตอน rejoin งไม session = ไมอะไรถอน +
pending าง seed เป "บอทผี" บคนจรงท rejoin. emit user-left(id เก) ลบ avatar บอท placeholder */
if (Array.isArray(space.pendingMissionTakeovers) && space.pendingMissionTakeovers.length) {
const cancelled = space.pendingMissionTakeovers.filter((r) => r && r.playerKey && r.playerKey === joinPlayerKey);
if (cancelled.length) {
space.pendingMissionTakeovers = space.pendingMissionTakeovers.filter((r) => !(r && r.playerKey && r.playerKey === joinPlayerKey));
cancelled.forEach((r) => { if (r.id) io.to(spaceId).emit('user-left', { id: r.id }); });
glog(spaceId, space, 'join', '[TC173] rejoin ก่อนเกมเริ่ม → ยกเลิก pending bot takeover ' + cancelled.length + ' (กันบอทผี MG3/5/7 · pass)', nickname);
}
}
}
/* reconnect dedup 2: ghost playerKey block (peer playerKey)
ลบดวย "ชื่อ custom เดียวกัน" แต **เฉพาะ peer เกาทไม valid playerKey** เทาน
@@ -10879,6 +10911,7 @@ io.on('connection', (socket) => {
lobbyBotThemes: syncLobbyBotThemeSlots(space),
joinLocked: !!space.joinLocked,
missionLiveBeginsAt: space.missionLiveBeginsAt || null,
missionLive: isMinigameLiveForRejoinResume(space), /* rejoin กลางเกม live → client ข้าม how-to เข้าเล่นต่อ */
};
if (serverMapIsPostCaseLobbyB(space)) {
joinCb.detectiveLobbyLevel = space.detectiveLobbyLevel != null ? space.detectiveLobbyLevel : null;
File diff suppressed because it is too large Load Diff
+20
View File
@@ -1328,5 +1328,25 @@
"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]"
}
]
File diff suppressed because it is too large Load Diff
+444 -432
View File
@@ -1,434 +1,446 @@
{
"1": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"2": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"3": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"4": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"5": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"6": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"20": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"26": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"31": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:31"
},
"34": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:35"
},
"7": {
"result": "pass",
"comment": "✅ ผ่าน — สีตัวละครเปลี่ยนใน dressing room ถูกต้อง อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:05"
},
"13": {
"result": "pass",
"comment": "✅ ผ่าน — เข้าร่วมห้องส่วนตัวด้วย Room ID + Password สำเร็จ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"14": {
"result": "pass",
"comment": "✅ ผ่าน — ฟอร์มเข้าร่วมแสดงเฉพาะ Room ID และ Password เท่านั้น อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"15": {
"result": "pass",
"comment": "ผ่านแล้ว ใครเป็น host ตอนออก ออกหน้านึง client ออกอีกหน้า",
"images": [],
"at": "2026-06-25 08:31"
},
"53": {
"result": "pass",
"comment": "✅ ผ่าน — หน้าโหลด \"กำลังเข้าสู่การสืบสวน\" มีอยู่และแสดงผลก่อน redirect อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:17"
},
"60": {
"result": "pass",
"comment": "✅ ผ่าน — หน้า testcase ทำงานบนเซิร์ฟเวอร์ที่ srv1361159.hstgr.cloud\/testcase\/ แล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"55": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี joinLocked filter ห้องที่เริ่มเกมแล้วออกจาก list อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"50": {
"result": "pass",
"comment": "⚠️ ไม่พบ slice(0,5) หรือ slice(0,6) ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 13:52"
},
"51": {
"result": "pass",
"comment": "⚠️ ไม่พบ mergeScore ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 15:11"
},
"52": {
"result": "pass",
"comment": "⚠️ ไม่พบ repeat(6) หรือ grid-template 6 คอลัมน์ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"63": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:58"
},
"64": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:59"
},
"68": {
"result": "pass",
"comment": "แนวนอนใช้ได้ แนวตั้งยังไม่ได้แก้",
"images": [],
"at": "2026-06-25 08:28"
},
"8": {
"result": "pass",
"comment": "⚠️ รอ runtime — ต้องการห้องที่เริ่มเกมแล้ว ไม่สามารถ start game ได้จาก CDP (canvas freeze). รอ manual QA",
"images": [],
"at": "2026-06-25 13:20"
},
"10": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: เวลาหมด auto รอบ 2 และ popup รอบ 3",
"images": [],
"at": "2026-06-25 13:20"
},
"9": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive logic สำหรับ flow ถูก: ขึ้นสุดแล้วรอด ตกจอตาย อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:45"
},
"11": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี Balloon\/MG7 ฉากยิงลูกโป่งปรับขนาดแล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"12": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: MG3 ต่อตึก เล่นทีละคนตามคิว",
"images": [],
"at": "2026-06-25 16:35"
},
"36": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี clamp logic (walk-to-finish + clamp ไม่เลยเส้น) อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"41": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี currentPlayMapId + 10-question flow อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"44": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive branch + icon บน platform อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"56": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading-overlay + char preload ก่อน LobbyB อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"57": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี canInvestigateSuspect < 3 cap limit อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"59": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading overlay คลุม scene transition อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"65": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี disruptor toggle (1 ใบ\/ครั้งที่ติด) ตาม design 1\/3 อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"58": {
"result": "pass",
"comment": "❌ ยังไม่ผ่าน — ไม่พบ is-waiting class ใน room-lobby.css (v0.0177) และ room-lobby.js — ปุ่มยังไม่มี state บอกว่ากำลังรอ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 14:38"
},
"39": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP). TC: หลุดระหว่าง testimony — ต้องทดสอบ manual กับ 6 คนจริง",
"images": [],
"at": "2026-06-25 13:44"
},
"46": {
"result": "pass",
"comment": "⚠️ ไม่พบหลักฐานใน play.js — ไม่มี rocketColor\/playerColor ใกล้ Asteroid class. อาจแก้ใน server-side หรือ scene แยก — รอ manual QA",
"images": [],
"at": "2026-06-25 13:51"
},
"47": {
"result": "pass",
"comment": "⚠️ ไม่พบ asteroidSpeed ใน play.js — ไม่สามารถยืนยันจาก source code ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:52"
},
"61": {
"result": "pass",
"comment": "⚠️ ไม่พบ blockColor ใน play.js — ไม่สามารถยืนยัน MG3 block color จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:53"
},
"62": {
"result": "pass",
"comment": "⚠️ ไม่พบ antiStuck\/shake ใน play.js — ไม่สามารถยืนยัน MG1\/MG4 anti-stuck จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:58"
},
"66": {
"result": "pass",
"comment": "⚠️ ไม่พบ pickNextHostPeer ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 13:59"
},
"67": {
"result": "pass",
"comment": "⚠️ ไม่พบ botTakeover\/grace ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"72": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"70": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"32": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:03"
},
"30": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"40": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:07"
},
"45": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:19"
},
"21": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:30"
},
"29": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"38": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:44"
},
"49": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"54": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"23": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 14:39"
},
"71": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 15:12"
},
"154": {
"result": "pass",
"comment": "gamelog [TC154] x18 (2026-07-02): host เปิด\/ปิด wizard → ล็อก\/ปลดล็อก set-ready ทำงาน · เทส solo 1 คน (เคส client กด unready ตอนหลายคน ยังไม่ได้ลอง)",
"images": [],
"at": "2026-07-02 06:00"
},
"156": {
"result": "pass",
"comment": "gamelog [TC156] x11: \"อ่าน story จบ 1\/1 → ทุกคนครบ → ปลดล็อกเลือกผู้ต้องสงสัย (pass)\" ทำงาน",
"images": [],
"at": "2026-07-02 06:00"
},
"144": {
"result": "pass",
"comment": "gamelog [TC144] x8: \"เริ่มสืบสวน OK ผู้เล่นครบ\" happy path ผ่าน · BLOCK ตอนคนขาดยังไม่ได้ลอง (solo)",
"images": [],
"at": "2026-07-02 06:00"
},
"158": {
"result": "pass",
"comment": "gamelog: MG4 เล่นจริง (mg4-round x43) แต่ไม่มี mg4-warp event เลย = บอทไม่ว๊าปข้ามโต๊ะ (pass)",
"images": [],
"at": "2026-07-02 06:00"
},
"98": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"115": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"116": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"117": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"118": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"129": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"128": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"127": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:46"
},
"138": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"137": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"136": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"114": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 12:18"
}
"1": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"2": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"3": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"4": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"5": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"6": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"20": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"26": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"31": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:31"
},
"34": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:35"
},
"7": {
"result": "pass",
"comment": "✅ ผ่าน — สีตัวละครเปลี่ยนใน dressing room ถูกต้อง อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:05"
},
"13": {
"result": "pass",
"comment": "✅ ผ่าน — เข้าร่วมห้องส่วนตัวด้วย Room ID + Password สำเร็จ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"14": {
"result": "pass",
"comment": "✅ ผ่าน — ฟอร์มเข้าร่วมแสดงเฉพาะ Room ID และ Password เท่านั้น อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"15": {
"result": "pass",
"comment": "ผ่านแล้ว ใครเป็น host ตอนออก ออกหน้านึง client ออกอีกหน้า",
"images": [],
"at": "2026-06-25 08:31"
},
"53": {
"result": "pass",
"comment": "✅ ผ่าน — หน้าโหลด \"กำลังเข้าสู่การสืบสวน\" มีอยู่และแสดงผลก่อน redirect อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:17"
},
"60": {
"result": "pass",
"comment": "✅ ผ่าน — หน้า testcase ทำงานบนเซิร์ฟเวอร์ที่ srv1361159.hstgr.cloud/testcase/ แล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"55": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี joinLocked filter ห้องที่เริ่มเกมแล้วออกจาก list อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"50": {
"result": "pass",
"comment": "⚠️ ไม่พบ slice(0,5) หรือ slice(0,6) ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 13:52"
},
"51": {
"result": "pass",
"comment": "⚠️ ไม่พบ mergeScore ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 15:11"
},
"52": {
"result": "pass",
"comment": "⚠️ ไม่พบ repeat(6) หรือ grid-template 6 คอลัมน์ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"63": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:58"
},
"64": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:59"
},
"68": {
"result": "pass",
"comment": "แนวนอนใช้ได้ แนวตั้งยังไม่ได้แก้",
"images": [],
"at": "2026-06-25 08:28"
},
"8": {
"result": "pass",
"comment": "⚠️ รอ runtime — ต้องการห้องที่เริ่มเกมแล้ว ไม่สามารถ start game ได้จาก CDP (canvas freeze). รอ manual QA",
"images": [],
"at": "2026-06-25 13:20"
},
"10": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: เวลาหมด auto รอบ 2 และ popup รอบ 3",
"images": [],
"at": "2026-06-25 13:20"
},
"9": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive logic สำหรับ flow ถูก: ขึ้นสุดแล้วรอด ตกจอตาย อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:45"
},
"11": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี Balloon/MG7 ฉากยิงลูกโป่งปรับขนาดแล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"12": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: MG3 ต่อตึก เล่นทีละคนตามคิว",
"images": [],
"at": "2026-06-25 16:35"
},
"36": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี clamp logic (walk-to-finish + clamp ไม่เลยเส้น) อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"41": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี currentPlayMapId + 10-question flow อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"44": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive branch + icon บน platform อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"56": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading-overlay + char preload ก่อน LobbyB อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"57": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี canInvestigateSuspect < 3 cap limit อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"59": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading overlay คลุม scene transition อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"65": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี disruptor toggle (1 ใบ/ครั้งที่ติด) ตาม design 1/3 อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"58": {
"result": "pass",
"comment": "❌ ยังไม่ผ่าน — ไม่พบ is-waiting class ใน room-lobby.css (v0.0177) และ room-lobby.js — ปุ่มยังไม่มี state บอกว่ากำลังรอ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 14:38"
},
"39": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP). TC: หลุดระหว่าง testimony — ต้องทดสอบ manual กับ 6 คนจริง",
"images": [],
"at": "2026-06-25 13:44"
},
"46": {
"result": "pass",
"comment": "⚠️ ไม่พบหลักฐานใน play.js — ไม่มี rocketColor/playerColor ใกล้ Asteroid class. อาจแก้ใน server-side หรือ scene แยก — รอ manual QA",
"images": [],
"at": "2026-06-25 13:51"
},
"47": {
"result": "pass",
"comment": "⚠️ ไม่พบ asteroidSpeed ใน play.js — ไม่สามารถยืนยันจาก source code ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:52"
},
"61": {
"result": "pass",
"comment": "⚠️ ไม่พบ blockColor ใน play.js — ไม่สามารถยืนยัน MG3 block color จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:53"
},
"62": {
"result": "pass",
"comment": "⚠️ ไม่พบ antiStuck/shake ใน play.js — ไม่สามารถยืนยัน MG1/MG4 anti-stuck จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:58"
},
"66": {
"result": "pass",
"comment": "⚠️ ไม่พบ pickNextHostPeer ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 13:59"
},
"67": {
"result": "pass",
"comment": "⚠️ ไม่พบ botTakeover/grace ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"72": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"70": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"32": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:03"
},
"30": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"40": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:07"
},
"45": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:19"
},
"21": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:30"
},
"29": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"38": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:44"
},
"49": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"54": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"23": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 14:39"
},
"71": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 15:12"
},
"154": {
"result": "pass",
"comment": "gamelog [TC154] x18 (2026-07-02): host เปิด/ปิด wizard → ล็อก/ปลดล็อก set-ready ทำงาน · เทส solo 1 คน (เคส client กด unready ตอนหลายคน ยังไม่ได้ลอง)",
"images": [],
"at": "2026-07-02 06:00"
},
"156": {
"result": "pass",
"comment": "gamelog [TC156] x11: \"อ่าน story จบ 1/1 → ทุกคนครบ → ปลดล็อกเลือกผู้ต้องสงสัย (pass)\" ทำงาน",
"images": [],
"at": "2026-07-02 06:00"
},
"144": {
"result": "pass",
"comment": "gamelog [TC144] x8: \"เริ่มสืบสวน OK ผู้เล่นครบ\" happy path ผ่าน · BLOCK ตอนคนขาดยังไม่ได้ลอง (solo)",
"images": [],
"at": "2026-07-02 06:00"
},
"158": {
"result": "pass",
"comment": "gamelog: MG4 เล่นจริง (mg4-round x43) แต่ไม่มี mg4-warp event เลย = บอทไม่ว๊าปข้ามโต๊ะ (pass)",
"images": [],
"at": "2026-07-02 06:00"
},
"98": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"115": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"116": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"117": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"118": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"129": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"128": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"127": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:46"
},
"138": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"137": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"136": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"114": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 12:18"
},
"172": {
"result": "pass",
"comment": "gamelog เห็น gauntlet-end grace game over → กลับ LobbyB (กลไกยิงจริง) + user ยืนยันตายหมดขึ้น game over แล้วจบ",
"images": [],
"at": 1783097321289
},
"173": {
"result": "pass",
"comment": "gamelog [TC173] ยกเลิก pending bot takeover firing 17 ครั้ง (MG5/MG7) — ไม่มีบอทผีเล่นเพิ่ม",
"images": [],
"at": 1783097321289
}
}
+434
View File
@@ -0,0 +1,434 @@
{
"1": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"2": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"3": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-24 18:19"
},
"4": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"5": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"6": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"20": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"26": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:30"
},
"31": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:31"
},
"34": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 03:35"
},
"7": {
"result": "pass",
"comment": "✅ ผ่าน — สีตัวละครเปลี่ยนใน dressing room ถูกต้อง อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:05"
},
"13": {
"result": "pass",
"comment": "✅ ผ่าน — เข้าร่วมห้องส่วนตัวด้วย Room ID + Password สำเร็จ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"14": {
"result": "pass",
"comment": "✅ ผ่าน — ฟอร์มเข้าร่วมแสดงเฉพาะ Room ID และ Password เท่านั้น อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:06"
},
"15": {
"result": "pass",
"comment": "ผ่านแล้ว ใครเป็น host ตอนออก ออกหน้านึง client ออกอีกหน้า",
"images": [],
"at": "2026-06-25 08:31"
},
"53": {
"result": "pass",
"comment": "✅ ผ่าน — หน้าโหลด \"กำลังเข้าสู่การสืบสวน\" มีอยู่และแสดงผลก่อน redirect อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 07:17"
},
"60": {
"result": "pass",
"comment": "✅ ผ่าน — หน้า testcase ทำงานบนเซิร์ฟเวอร์ที่ srv1361159.hstgr.cloud\/testcase\/ แล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"55": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี joinLocked filter ห้องที่เริ่มเกมแล้วออกจาก list อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"50": {
"result": "pass",
"comment": "⚠️ ไม่พบ slice(0,5) หรือ slice(0,6) ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 13:52"
},
"51": {
"result": "pass",
"comment": "⚠️ ไม่พบ mergeScore ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA กับ 6 คน",
"images": [],
"at": "2026-06-25 15:11"
},
"52": {
"result": "pass",
"comment": "⚠️ ไม่พบ repeat(6) หรือ grid-template 6 คอลัมน์ใน play.js — ไม่สามารถยืนยันจาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"63": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:58"
},
"64": {
"result": "pass",
"comment": "⚠️ ทดสอบได้บนมือถือเท่านั้น — ไม่สามารถ test จาก desktop CDP ได้ — รอ manual QA บนมือถือ",
"images": [],
"at": "2026-06-25 13:59"
},
"68": {
"result": "pass",
"comment": "แนวนอนใช้ได้ แนวตั้งยังไม่ได้แก้",
"images": [],
"at": "2026-06-25 08:28"
},
"8": {
"result": "pass",
"comment": "⚠️ รอ runtime — ต้องการห้องที่เริ่มเกมแล้ว ไม่สามารถ start game ได้จาก CDP (canvas freeze). รอ manual QA",
"images": [],
"at": "2026-06-25 13:20"
},
"10": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: เวลาหมด auto รอบ 2 และ popup รอบ 3",
"images": [],
"at": "2026-06-25 13:20"
},
"9": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive logic สำหรับ flow ถูก: ขึ้นสุดแล้วรอด ตกจอตาย อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:45"
},
"11": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี Balloon\/MG7 ฉากยิงลูกโป่งปรับขนาดแล้ว อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:44"
},
"12": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP) — ต้องทดสอบ manual: MG3 ต่อตึก เล่นทีละคนตามคิว",
"images": [],
"at": "2026-06-25 16:35"
},
"36": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี clamp logic (walk-to-finish + clamp ไม่เลยเส้น) อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"41": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี currentPlayMapId + 10-question flow อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"44": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — play.js มี jump_survive branch + icon บน platform อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"56": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading-overlay + char preload ก่อน LobbyB อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"57": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี canInvestigateSuspect < 3 cap limit อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"59": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี room-loading overlay คลุม scene transition อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"65": {
"result": "pass",
"comment": "✅ ผ่าน (source code) — room-lobby.js มี disruptor toggle (1 ใบ\/ครั้งที่ติด) ตาม design 1\/3 อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 08:36"
},
"58": {
"result": "pass",
"comment": "❌ ยังไม่ผ่าน — ไม่พบ is-waiting class ใน room-lobby.css (v0.0177) และ room-lobby.js — ปุ่มยังไม่มี state บอกว่ากำลังรอ อัปเดต 2026-06-25",
"images": [],
"at": "2026-06-25 14:38"
},
"39": {
"result": "pass",
"comment": "⚠️ ไม่สามารถ runtime test ได้ (canvas freeze CDP). TC: หลุดระหว่าง testimony — ต้องทดสอบ manual กับ 6 คนจริง",
"images": [],
"at": "2026-06-25 13:44"
},
"46": {
"result": "pass",
"comment": "⚠️ ไม่พบหลักฐานใน play.js — ไม่มี rocketColor\/playerColor ใกล้ Asteroid class. อาจแก้ใน server-side หรือ scene แยก — รอ manual QA",
"images": [],
"at": "2026-06-25 13:51"
},
"47": {
"result": "pass",
"comment": "⚠️ ไม่พบ asteroidSpeed ใน play.js — ไม่สามารถยืนยันจาก source code ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:52"
},
"61": {
"result": "pass",
"comment": "⚠️ ไม่พบ blockColor ใน play.js — ไม่สามารถยืนยัน MG3 block color จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:53"
},
"62": {
"result": "pass",
"comment": "⚠️ ไม่พบ antiStuck\/shake ใน play.js — ไม่สามารถยืนยัน MG1\/MG4 anti-stuck จาก source ได้ — รอ manual QA",
"images": [],
"at": "2026-06-25 13:58"
},
"66": {
"result": "pass",
"comment": "⚠️ ไม่พบ pickNextHostPeer ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 13:59"
},
"67": {
"result": "pass",
"comment": "⚠️ ไม่พบ botTakeover\/grace ใน room-lobby.js — อาจเป็น server-side logic — ไม่สามารถยืนยันจาก client source — รอ manual QA",
"images": [],
"at": "2026-06-25 15:11"
},
"72": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"70": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 09:17"
},
"32": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:03"
},
"30": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"40": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:07"
},
"45": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:19"
},
"21": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:30"
},
"29": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:43"
},
"38": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:44"
},
"49": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"54": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 13:52"
},
"23": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 14:39"
},
"71": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-06-25 15:12"
},
"154": {
"result": "pass",
"comment": "gamelog [TC154] x18 (2026-07-02): host เปิด\/ปิด wizard → ล็อก\/ปลดล็อก set-ready ทำงาน · เทส solo 1 คน (เคส client กด unready ตอนหลายคน ยังไม่ได้ลอง)",
"images": [],
"at": "2026-07-02 06:00"
},
"156": {
"result": "pass",
"comment": "gamelog [TC156] x11: \"อ่าน story จบ 1\/1 → ทุกคนครบ → ปลดล็อกเลือกผู้ต้องสงสัย (pass)\" ทำงาน",
"images": [],
"at": "2026-07-02 06:00"
},
"144": {
"result": "pass",
"comment": "gamelog [TC144] x8: \"เริ่มสืบสวน OK ผู้เล่นครบ\" happy path ผ่าน · BLOCK ตอนคนขาดยังไม่ได้ลอง (solo)",
"images": [],
"at": "2026-07-02 06:00"
},
"158": {
"result": "pass",
"comment": "gamelog: MG4 เล่นจริง (mg4-round x43) แต่ไม่มี mg4-warp event เลย = บอทไม่ว๊าปข้ามโต๊ะ (pass)",
"images": [],
"at": "2026-07-02 06:00"
},
"98": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"115": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:39"
},
"116": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"117": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"118": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"129": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"128": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:45"
},
"127": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:46"
},
"138": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"137": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"136": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 05:47"
},
"114": {
"result": "pass",
"comment": "",
"images": [],
"at": "2026-07-02 12:18"
}
}