fixed3 5 7
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -6726,6 +6726,19 @@
|
||||
return zDraw;
|
||||
}
|
||||
let gauntletCrownHowtoVisible = false;
|
||||
/* rejoin กลางเกมที่ live แล้ว (server ส่ง res.missionLive=true) → ข้าม how-to เข้าเล่นต่อทันที
|
||||
กันเคส refresh กลางเกม แล้วค้างหน้า how-to กดต่อไม่ได้ (handshake ready→countdown ผ่านไปแล้ว) */
|
||||
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();
|
||||
|
||||
@@ -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
@@ -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 (MG3–MG7) ───────────────────────────
|
||||
มินิเกมเหล่านี้สร้าง 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 }); });
|
||||
}
|
||||
/* MG3–MG7 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
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user