update various

This commit is contained in:
2026-07-11 11:26:27 +00:00
parent 36f3ea2d7a
commit e2e3cf7f16
11 changed files with 1404 additions and 94 deletions
+309 -26
View File
@@ -1293,16 +1293,30 @@
"providerUserId": "p_1782921490642_wkx6gl2hwtn",
"notes": "auto: game-award",
"blocked": false,
"coins": 32,
"score": 32,
"coins": 42,
"score": 42,
"scoreByCase": {
"1": 32
"1": 42
},
"lbName": "Guest",
"createdAt": "2026-07-01T16:01:03+00:00",
"updatedAt": "2026-07-08T10:34:54+00:00",
"updatedAt": "2026-07-09T09:48:40+00:00",
"achievements": {
"d1_minigame_solver": 4
"d1_minigame_solver": 4,
"b4_data_miner": 1,
"d3_the_backbone": 3,
"c2_high_stakes": 1,
"a1_first_deduction": 1,
"a4_logic_over_luck": 1,
"a5_truth_hunter": 1,
"d2_silent_guardian": 1,
"e4_agent_of_chaos": 1,
"e3_master_of_doubt": 1,
"e2_the_impostor": 1,
"e1_the_observer": 1
},
"achvStreak": {
"e1_the_observer": 1
}
},
{
@@ -1439,22 +1453,22 @@
"providerUserId": "p_1783423451842_11irmcfil84",
"notes": "auto: player-coins",
"blocked": false,
"coins": 84,
"coins": 124,
"createdAt": "2026-07-07T11:24:11+00:00",
"updatedAt": "2026-07-08T17:17:36+00:00",
"score": 84,
"updatedAt": "2026-07-10T07:02:31+00:00",
"score": 124,
"scoreByCase": {
"2": 20,
"2": 60,
"12": 24,
"13": 20,
"10": 20
},
"lbName": "กัน จอมพลัง",
"achievements": {
"d1_minigame_solver": 11,
"b4_data_miner": 19,
"b1_evidence_collector": 11,
"a2_sharp_eye": 7,
"d1_minigame_solver": 15,
"b4_data_miner": 23,
"b1_evidence_collector": 14,
"a2_sharp_eye": 8,
"d3_the_backbone": 6,
"d4_flawless_diver": 0,
"b2_relentless_investigator": 1,
@@ -1487,29 +1501,53 @@
{
"id": "c102247fb56343cb7c07d383",
"email": "",
"displayName": "Guest",
"displayName": "ผู้เล่น",
"loginType": "guest",
"providerUserId": "p_1783488401360_la99satzc7m",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"coins": 65,
"createdAt": "2026-07-08T05:26:41+00:00",
"updatedAt": "2026-07-09T04:02:24+00:00",
"updatedAt": "2026-07-10T01:19:29+00:00",
"daily": {
"anchorMs": 1783530000000,
"claimedDays": [
true,
false,
true,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783616400000
"lockUntilMs": 1783702800000
},
"lobbyColorThemeIndex": 5,
"lobbySkinToneIndex": 1
"lobbySkinToneIndex": 1,
"score": 40,
"scoreByCase": {
"1": 40
},
"lbName": "ผู้เล่น",
"achievements": {
"d1_minigame_solver": 3,
"b4_data_miner": 3,
"b3_hidden_fragment": 1,
"b1_evidence_collector": 2,
"b5_deep_scanner": 1,
"d3_the_backbone": 4,
"a5_truth_hunter": 1,
"c4_clutch_mind": 1,
"a1_first_deduction": 1,
"c3_quick_draw": 1,
"a3_mind_architect": 1,
"d4_flawless_diver": 1,
"e1_the_observer": 0
},
"achvStreak": {
"d4_flawless_diver": 1,
"e1_the_observer": 0
}
},
{
"id": "99ceaaa5bba7f30ccaacf955",
@@ -1588,18 +1626,26 @@
"providerUserId": "p_1783498064493_7q7w9qal0bc",
"notes": "auto: achievements",
"blocked": false,
"coins": 44,
"coins": 98,
"achievements": {
"b5_deep_scanner": 2,
"d1_minigame_solver": 5
"b5_deep_scanner": 3,
"d1_minigame_solver": 10,
"b4_data_miner": 3,
"b1_evidence_collector": 5,
"d3_the_backbone": 3,
"d2_silent_guardian": 1,
"e1_the_observer": 1
},
"createdAt": "2026-07-08T08:24:23+00:00",
"updatedAt": "2026-07-08T10:34:54+00:00",
"score": 44,
"updatedAt": "2026-07-09T09:48:40+00:00",
"score": 98,
"scoreByCase": {
"1": 44
"1": 98
},
"lbName": "Guest"
"lbName": "Guest",
"achvStreak": {
"e1_the_observer": 1
}
},
{
"id": "c32c748d2c799560ac6817d6",
@@ -1779,6 +1825,243 @@
],
"lockUntilMs": 1783530000000
}
},
{
"id": "aac50130bcb2ec4c8be0a215",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783589633253_i1m43vblyxm",
"notes": "auto: achievements",
"blocked": false,
"coins": 8,
"achievements": {
"d1_minigame_solver": 1,
"b1_evidence_collector": 1,
"b4_data_miner": 1,
"d3_the_backbone": 3,
"b2_relentless_investigator": 1,
"d2_silent_guardian": 1,
"e1_the_observer": 1
},
"createdAt": "2026-07-09T09:39:34+00:00",
"updatedAt": "2026-07-09T09:48:36+00:00",
"score": 8,
"scoreByCase": {
"1": 8
},
"lbName": "Guest",
"achvStreak": {
"e1_the_observer": 1
}
},
{
"id": "55c1e46e87ba75e47e48b35b",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783589640761_clzakwixjof",
"notes": "auto: game-award",
"blocked": false,
"coins": 6,
"score": 6,
"scoreByCase": {
"1": 6
},
"lbName": "Guest",
"createdAt": "2026-07-09T09:39:34+00:00",
"updatedAt": "2026-07-09T09:48:40+00:00",
"achievements": {
"d1_minigame_solver": 1,
"b4_data_miner": 1,
"d3_the_backbone": 3,
"b2_relentless_investigator": 1
}
},
{
"id": "ecaeb09f5949067439c6506e",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_clustertest2_1782967025513",
"notes": "auto: achievements",
"blocked": false,
"coins": 20,
"achievements": {
"b4_data_miner": 2,
"d1_minigame_solver": 2,
"b1_evidence_collector": 2
},
"createdAt": "2026-07-09T11:15:27+00:00",
"updatedAt": "2026-07-09T12:11:05+00:00",
"score": 20,
"scoreByCase": {
"1": 20
},
"lbName": "Guest"
},
{
"id": "b170890471d3c2b123ae2283",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783647124248_ezhgmtzn0v5",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"createdAt": "2026-07-10T01:31:36+00:00",
"updatedAt": "2026-07-10T07:53:49+00:00",
"daily": {
"anchorMs": 1783616400000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783702800000
}
},
{
"id": "dd9797847d294993e18052db",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783664321058_93tru4qj20l",
"notes": "auto: player-coins",
"blocked": false,
"coins": 0,
"createdAt": "2026-07-10T06:18:11+00:00",
"updatedAt": "2026-07-10T06:18:11+00:00"
},
{
"id": "1773d48f698d144883a71544",
"email": "",
"displayName": "ผู้เล่น",
"loginType": "guest",
"providerUserId": "p_1783670267896_5hh7b6pltai",
"notes": "auto: player-coins",
"blocked": false,
"coins": 20,
"createdAt": "2026-07-10T07:57:48+00:00",
"updatedAt": "2026-07-10T08:12:28+00:00",
"lobbyColorThemeIndex": 4,
"lobbySkinToneIndex": 2,
"score": 20,
"scoreByCase": {
"7": 20
},
"lbName": "ผู้เล่น",
"achievements": {
"d1_minigame_solver": 2,
"b4_data_miner": 1,
"b1_evidence_collector": 1
}
},
{
"id": "81e3774c0aa0c85fc22a6f1b",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783763025928_qs8m1bh0gn",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"createdAt": "2026-07-11T09:43:47+00:00",
"updatedAt": "2026-07-11T09:44:44+00:00",
"daily": {
"anchorMs": 1783702800000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783789200000
}
},
{
"id": "7dfe46e8149e022fd423d0c8",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783763092186_6vtp9gyev1e",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"createdAt": "2026-07-11T09:44:57+00:00",
"updatedAt": "2026-07-11T09:45:03+00:00",
"daily": {
"anchorMs": 1783702800000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783789200000
}
},
{
"id": "1f770d06cf7608540c6a46de",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783767593025_y4sn1vgulug",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"createdAt": "2026-07-11T10:59:53+00:00",
"updatedAt": "2026-07-11T11:00:03+00:00",
"daily": {
"anchorMs": 1783702800000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783789200000
}
},
{
"id": "2c66d8a6e5f43b0d89193ac5",
"email": "",
"displayName": "Guest",
"loginType": "guest",
"providerUserId": "p_1783767748924_vj3jsxzsst8",
"notes": "auto: player-coins",
"blocked": false,
"coins": 10,
"createdAt": "2026-07-11T11:02:28+00:00",
"updatedAt": "2026-07-11T11:03:08+00:00",
"daily": {
"anchorMs": 1783702800000,
"claimedDays": [
true,
false,
false,
false,
false,
false,
false
],
"lockUntilMs": 1783789200000
},
"lobbyColorThemeIndex": 5,
"lobbySkinToneIndex": 2
}
]
}
+3 -3
View File
@@ -98,9 +98,9 @@
"balloonBossBalloonsPerPlayer": 3,
"balloonBossDamagePerHit": 10,
"forcedMinigameKeys": [
"",
"",
""
"space_shooter",
"quiz_carry",
"balloon_boss"
],
"testSpecialCardByMap": {},
"troublesomeForceOffer": false,
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"qbroom1":[{"name":"Nam","score":18,"characterId":"char-1777017632279","ts":1782909257585},{"name":"ผู้เล่น9514","score":17,"characterId":"char-1777017632279","ts":1781850667717},{"name":"MONE","score":10,"characterId":"char-1777017632279","ts":1781850749437},{"name":"tomato","score":9,"characterId":"char-1777017632279","ts":1781850748552},{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781171902962},{"name":"ผู้เล่น1991","score":5,"characterId":"char-1777017632279","ts":1781850950078},{"name":"ผู้เล่น8916","score":4,"characterId":"char-1777017632279","ts":1781074083031},{"name":"ผู้เล่น2821","score":4,"characterId":"char-1777017632279","ts":1781079179108},{"name":"Weenwild","score":4,"characterId":"char-1777017632279","ts":1781849863580}],"qbroom2":[{"name":"ผู้เล่น4472","score":13,"characterId":"char-1777017632279","ts":1781851033914},{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781175468983},{"name":"ผู้เล่น2612","score":1,"characterId":"char-1777017632279","ts":1781079252376}],"qbroom3":[{"name":"Q","score":9,"characterId":"char-1777017632279","ts":1781175654893},{"name":"Weenwild","score":2,"characterId":"char-1777017632279","ts":1781849898452}],"qbroom5":[{"name":"Q","score":6,"characterId":"char-1777017632279","ts":1781675299850}],"qbroom6":[{"name":"Q","score":3,"characterId":"char-1777017632279","ts":1781675383175}],"qbroom9":[{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781696345322}]}
{"qbroom1":[{"name":"Nam","score":18,"characterId":"char-1777017632279","ts":1782909257585},{"name":"ผู้เล่น9514","score":17,"characterId":"char-1777017632279","ts":1781850667717},{"name":"MONE","score":10,"characterId":"char-1777017632279","ts":1781850749437},{"name":"tomato","score":9,"characterId":"char-1777017632279","ts":1781850748552},{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781171902962},{"name":"ผู้เล่น1991","score":5,"characterId":"char-1777017632279","ts":1781850950078},{"name":"ผู้เล่น8916","score":4,"characterId":"char-1777017632279","ts":1781074083031},{"name":"ผู้เล่น2821","score":4,"characterId":"char-1777017632279","ts":1781079179108},{"name":"Weenwild","score":4,"characterId":"char-1777017632279","ts":1781849863580},{"name":"ผู้เล่น2359","score":0,"characterId":"char-1777017632279","ts":1783664802662}],"qbroom2":[{"name":"ผู้เล่น4472","score":13,"characterId":"char-1777017632279","ts":1781851033914},{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781175468983},{"name":"ผู้เล่น2612","score":1,"characterId":"char-1777017632279","ts":1781079252376},{"name":"ผู้เล่น1948","score":0,"characterId":"char-1777017632279","ts":1783664954451}],"qbroom3":[{"name":"Q","score":9,"characterId":"char-1777017632279","ts":1781175654893},{"name":"Weenwild","score":2,"characterId":"char-1777017632279","ts":1781849898452}],"qbroom5":[{"name":"Q","score":6,"characterId":"char-1777017632279","ts":1781675299850}],"qbroom6":[{"name":"Q","score":3,"characterId":"char-1777017632279","ts":1781675383175}],"qbroom9":[{"name":"Q","score":7,"characterId":"char-1777017632279","ts":1781696345322}]}
File diff suppressed because one or more lines are too long
+64 -19
View File
@@ -308,7 +308,7 @@
spaceShooterPopups.push({ x: cx, y: cy - 28, text: 'HIT', until: Date.now() + 650 });
if (ent.spaceShooterHits >= SPACE_SHOOTER_MISSION_MAX_ASTEROID_HITS) {
ent.spaceShooterEliminated = true;
if (ent === me && window.jdSound) { try { window.jdSound.playSfx('crash', 'mg6'); } catch (e) { /* ignore */ } }
if (window.jdSound) { try { window.jdSound.playSfx('crash', 'mg6'); } catch (e) { /* ignore */ } } /* ตัวเอง + บอท (host) ตกรอบ = ได้ยินเสียง · peer-human ตกรอบ = เล่นตอนรับ spaceShooterEliminated ใน user-move */
spaceShooterPopups.push({ x: cx, y: cy - 50, text: 'OUT', until: Date.now() + 1400 });
}
break;
@@ -1611,6 +1611,8 @@
/* G3: เข้าเฟสเดินเข้าเส้นชัย → เคลียร์ท่ากระโดด (กันค้างลอยกลางอากาศ — ต้องเดินเข้าเส้น ไม่ใช่กระโดดค้าง) */
meGauntletJumpTicks = 0; meGauntletJumpVis = 0;
others.forEach((o) => { if (o) { o.gauntletJumpTicks = 0; o.gauntletJumpVis = 0; } });
/* : "" event 'gauntlet-finish-clear' server
(= งหวะเดยวก server หย collision) "หายแล้วยังชน" ไมเคลยร (เรวไป half-RTT) */
/* แจ้ง server ครั้งเดียว: เข้าโซนเส้นชัย → หยุด obstacle + collision (กันโดนชน/-10 ตอนกำลงเดนเขาเส)
server จะรอ grace (GAUNTLET_FINISH_WALK_MS) ใหเดนครบกอนคอยจบ */
if (!gauntletFinishPhaseSignaled) {
@@ -1677,15 +1679,11 @@
/** 1 = สิ่งกีดขวางเต็ม · 0 = หาย — ค่อยๆ จางเมื่อเส้น FINISH เข้าใกล้จุดหยุดบนจอ */
function gauntletCrownRunwayObstacleDrawAlphaPlay() {
if (!gauntletCrownRunwayBgDrawActivePlay()) return 1;
if (gauntletCrownRunwayBgFinishLatched) return 0;
const g = gauntletCrownRunwayScrollGeometryPlay();
if (!g) return 1;
const screenFrac = gauntletCrownRunwayFinishLineScreenFracPlay(g);
if (screenFrac == null) return 1;
const stopAt = gauntletCrownRunwayFinishStopViewportFracPlay();
/* ตอนใกล้เส้นชัย: ไม่ค่อยๆ จาง (เดิม gradient) — โชว์เต็มจนถึงจุด stop แล้วตัดหายเลย (ไม่จาง/ไม่มีเงาลอย) */
return screenFrac > stopAt ? 1 : 0;
/* เดิม: ซ่อนอุปสรรค (alpha 0) ตาม "ตำแหน่งเส้นชัยบนจอ" (screenFrac<=stopAt / finishLatched) เก
"ก่อน" server หย collision (finishPhase) อาการ "อุปสรรคหายแล้วแต่ยังชน".
ใหม: โชวปสรรคเตมเสมอ ให "หาย" ตอน server เคลยรจรงเทาน (finishPhase = คนแรกถงเสนช
+ หย collision พรอมก าน event 'gauntlet-finish-clear' าง render buffer) = หาย+ไมชน พรอมก */
return 1;
}
function gauntletCrownRunwayBgHideObstaclesPlay() {
@@ -1819,9 +1817,11 @@
const chR = align
? Math.max(1, Math.round(worldAlign.mapHpx))
: Math.max(1, Math.round(canvasH));
const scrollView = align
/* clamp S>=0 START segment (strip-x<0)
(แก "เริ่มไม่ชิดซ้ายสุด" display-only ไมแตะ base scroll งไมเลอน alignment บอปสรรค) */
const scrollView = Math.max(0, align
? (gauntletCrownRunwayBgScrollPx + worldAlign.worldMinX)
: gauntletCrownRunwayBgScrollPx;
: gauntletCrownRunwayBgScrollPx);
if (align) {
const { camX, camY, zDraw, mapWpx, mapHpx, worldMinX } = worldAlign;
ctx.fillStyle = '#1a1b26';
@@ -3657,6 +3657,7 @@
o.gauntletJumpSeq = seq;
o.gauntletJumpAnimStart = Date.now();
o.gauntletJumpAnimDur = Math.max(360, (gauntletRuntimeJumpTicks || 6) * (gauntletRuntimeTickMs || 220));
if (window.jdSound) { try { window.jdSound.playSfx('jump', 'mg2'); } catch (e) { /* ignore */ } } /* peer/bot กระโดด = ทุกคนได้ยินเสียง (seq เพิ่ม = กระโดดใหม่จริง ไม่ยิงซ้ำ) */
}
}
function isPeerGauntletJumpAnimActive(o) {
@@ -4358,6 +4359,18 @@
}
if (!mine) return;
if (window.jdSound) { try { window.jdSound.playSfx(mine.right ? 'correct' : 'wrong', 'mg1'); } catch (e) { /* ignore */ } }
/* item 4 — ทุกคนได้ยินผลของเพื่อนด้วย (คาสเคดสั้น ๆ หลังผลตัวเอง) เดิม MG1 เงียบสำหรับผลคนอื่น */
if (window.jdSound && Array.isArray(r.results)) {
let _pk = 0;
for (let i = 0; i < r.results.length && _pk < 6; i++) {
const row = r.results[i];
if (!row || row.id === myId) continue;
_pk++;
(function (right, order) {
setTimeout(function () { try { window.jdSound.playSfx(right ? 'correct' : 'wrong', 'mg1'); } catch (e) { /* ignore */ } }, 150 * order);
})(!!row.right, _pk);
}
}
el.classList.remove('is-hidden');
const botExtra = playBotsEnabled() && (botRight + botWrong > 0)
? ' · บอท ถูก ' + botRight + ' / ผิด ' + botWrong + ' (Bots: ' + botRight + ' right / ' + botWrong + ' wrong)'
@@ -6830,7 +6843,10 @@
* ามมมองกวาง/งกวาแมป: อยาใช clamp แบบ minCamX (= กลองชดซายโลก) จะดเหมอนแมปตดมมซายบน (เดนใน embed / มออก)
* ใหดกลางแมปแทน ภารกจคำถาม mng8a80o วง live ใชกลองกลางแมปเหมอนก ( isQuizQuestionMissionHudActivePlay + draw)
*/
if (viewW >= mapWpx) px = mapWpx * 0.5;
/* runner : "" (px=mapWpx*0.5) = = "".
เปลยนเป "ชิดซ้าย" (ขอบซาย grid = ขอบซายจอ, worldMinX=0) ไมดำซาย + strip scroll (S) เลอนข
ทำใหนดำกอนแถบหลดออกนอกจอซาย + ปสรรคหายทขอบซายจอพอด. (เลนเลอก: คงสเกล+ดซาย) */
if (viewW >= mapWpx) px = minCamX;
else px = Math.max(minCamX, Math.min(maxCamX, px));
if (viewH >= mapHpx) py = mapHpx * 0.5;
else py = Math.max(minCamY, Math.min(maxCamY, py));
@@ -14657,6 +14673,8 @@
try { if (typeof jumpSurviveLiveAnchorServerMs === 'number' && jumpSurviveLiveAnchorServerMs > 0) jumpSurviveLiveAnchorServerMs += deltaMs; } catch (e) {}
try { if (typeof spaceShooterLiveAnchorServerMs === 'number' && spaceShooterLiveAnchorServerMs > 0) spaceShooterLiveAnchorServerMs += deltaMs; } catch (e) {}
try { if (typeof balloonBossLiveAnchorServerMs === 'number' && balloonBossLiveAnchorServerMs > 0) balloonBossLiveAnchorServerMs += deltaMs; } catch (e) {}
/* [mg3] MG3 stack swing phase anchor (serverNow-based) ก็ต้องเลื่อนด้วย — ไม่งั้น clock re-sync ทุก 12วิ → serverNow กระโดด → targetPhase กระโดด → ตัวห้อยกระตุก */
try { if (typeof stackSrvPhaseAnchorAt === 'number' && stackSrvPhaseAnchorAt > 0) stackSrvPhaseAnchorAt += deltaMs; } catch (e) {}
}
/** เรียกทุกเฟรมระหว่าง freeze — ดันเวลาไปข้างหน้าเท่าที่ผ่านไปจริง ทำให้ countdown หยุดนิ่ง */
@@ -19447,15 +19465,16 @@
vy = 0;
onGround = true;
}
} else if (vy < 0 && jumpSurviveOverlapsObjectSolids(md, pxc - bw, headTop, pxc + bw, feetY)) {
/* กระโดดขึ้น: แพลตฟอร์มทะลุได้ (one-way) — หยุดเฉพาะกำแพง/ขอบ/เพดานจริง (objects) ไม่ให้หัวติดแท่นบน */
} else if (vy < 0 && jumpSurviveOverlapsSolid(md, pxc - bw, headTop, pxc + bw, feetY)) {
/* : "/" = (item 3 one-way ).
นหวใหนใตแทนแลวหยดพงข (vy=0) ไมตาย (แคบลอก) แลวปลอยตกกลบตาม gravity */
const stepUp = ts * 0.035;
const penetrationEstUp = Math.abs(vy) * dt + ts * 0.55;
const maxStepsUp = Math.min(160, Math.max(28, Math.ceil(penetrationEstUp / stepUp) + 6));
for (let s = 0; s < maxStepsUp; s++) {
feetY += stepUp;
headTop = feetY - bh;
if (!jumpSurviveOverlapsObjectSolids(md, pxc - bw, headTop, pxc + bw, feetY)) { vy = 0; break; }
if (!jumpSurviveOverlapsSolid(md, pxc - bw, headTop, pxc + bw, feetY)) { vy = 0; break; }
}
} else {
onGround = false;
@@ -19920,6 +19939,7 @@
const jq = jumpSurviveJumpQueued;
jumpSurviveJumpQueued = false;
if (jq && jumpSurviveOnGround && window.jdSound) { try { window.jdSound.playSfx('jump', 'mg5'); } catch (e) { /* ignore */ } }
if (jq && jumpSurviveOnGround) { try { if (socket && myId != null) socket.emit('js-jump'); } catch (e) { /* ignore */ } } /* broadcast กระโดด → peer ได้ยินเสียง (mg5 ไม่มีสัญญาณ jump แยกใน sync) */
/* virtual joystick (touch) — แกน x ป้อนซ้าย/ขวาเหมือนคีย์ A/D (deadzone จัดการในตัว update แล้ว) */
const joyX = isJumpSurviveMissionHudActivePlay() ? (Number(quizQuestionMissionJoyVecX) || 0) : 0;
@@ -21033,9 +21053,12 @@
const ok = !!d.correct;
/* ทุกคน (คนจริง+บอท) → ลอยไอคอน ✓/✗ เหนือหัว ให้ทุกจอเห็นว่าใครตอบถูก/ผิด */
quizCarryEntityFeedbackFx[String(d.id)] = { ok, until: Date.now() + QUIZ_CARRY_FEEDBACK_FX_MS };
/* ตัวเองเพิ่มแผง feedback กลางจอ (ตอบถูก/ผิดของเรา) เหมือนเดิม */
if (String(d.id) === String(myId)) {
/* ตัวเอง: แผง feedback กลางจอ (มีเสียง correct/wrong ในตัว) */
try { showQuizMapQuestionCarryFeedback(ok); } catch (e) { /* ignore */ }
} else if (window.jdSound) {
/* คนอื่นตอบ (ถูก/ผิด) → ทุกคนได้ยินเสียงด้วย (user request) — เล่นเฉพาะเสียง ไม่โชว์แผงกลางจอของคนอื่น */
try { window.jdSound.playSfx(ok ? 'correct' : 'wrong', 'mg4'); } catch (e) { /* ignore */ }
}
});
/* บอท carry: server เป็นเจ้าของการเดิน/หยิบ (BFS) → รับตำแหน่ง+held แล้ว lerp ใน tick (o.tx/o.ty) */
@@ -21099,6 +21122,8 @@
if (d.winnerId != null && String(d.winnerId) === String(myId)) {
try { showQuizMapQuestionCarryFeedback(true); } catch (e) { /* ignore */ }
}
/* : / "" handler quiz-carry-answer-feedback
(ครอบคลมทงถกและผ กครงทคนตอบ) เดมตรงน 'correct' งเอาออก */
/* หมดเวลา (ไม่มีใครตอบถูก) → โชว์รูป TIME'S UP บนโต๊ะ ~จนข้อถัดไปมา (applyQuizCarryPhaseFrom... ซ่อนให้) */
if (d.winnerId == null) {
try { showQuizCarrySrvTimeupOnDesk(); } catch (e) { /* ignore */ }
@@ -21455,6 +21480,7 @@
const t0 = Number(d.t0);
const fwd = Number.isFinite(t0) ? Math.max(0, Math.min(2.5, (serverNow() - t0) / 1000)) : 0;
balloonBossPlayerBullets.push({ x: sx + vx * fwd, y: sy + vy * fwd, vx, vy, ownerId: d.ownerId });
if (window.jdSound) { try { window.jdSound.playSfx('laser', 'mg7'); } catch (e) { /* ignore */ } } /* peer/bot ยิง = ทุกคนได้ยินเสียง (ยิงของตัวเอง return ไปข้างบนแล้ว) */
});
/* MG7 — รับสัญญาณจบเกมจาก host → จบพร้อมกันทุกเครื่อง + ใช้คะแนนสุดท้ายของ host (อันดับตรงกัน) */
@@ -21508,6 +21534,13 @@
const t0 = Number(d.t0);
const fwd = Number.isFinite(t0) ? Math.max(0, Math.min(2, (serverNow() - t0) / 1000)) : 0;
spaceShooterBullets.push({ x, y: y + vy * fwd, vy, ownerId: d.ownerId });
if (window.jdSound) { try { window.jdSound.playSfx('laser', 'mg6'); } catch (e) { /* ignore */ } } /* peer/bot ยิง = ทุกคนได้ยินเสียง (ยิงของตัวเอง return ไปข้างบนแล้ว) */
});
/* MG5 jump_survive — เพื่อนกระโดด (คนจริง) → เล่นเสียงบนทุกเครื่อง (relay ผ่าน server; ตัวเองเล่นตอนกระโดดไปแล้ว) */
socket.on('js-jump', () => {
if (!mapData || mapData.gameType !== 'jump_survive') return;
if (window.jdSound) { try { window.jdSound.playSfx('jump', 'mg5'); } catch (e) { /* ignore */ } }
});
/* MG6 — รับสัญญาณจบเกมจาก host → ใช้คะแนนสุดท้ายของ host แล้วจบพร้อมกัน (อันดับตรงกัน) */
@@ -21647,7 +21680,11 @@
if (Number.isFinite(hh)) o.spaceShooterHits = Math.max(0, hh);
}
/* ตาย/รอด มาจากเจ้าของยานเท่านั้น → ทุกเครื่องเห็นตรงกัน */
if (data.spaceShooterEliminated != null) o.spaceShooterEliminated = !!data.spaceShooterEliminated;
if (data.spaceShooterEliminated != null) {
const wasElim = !!o.spaceShooterEliminated;
o.spaceShooterEliminated = !!data.spaceShooterEliminated;
if (!wasElim && o.spaceShooterEliminated && window.jdSound) { try { window.jdSound.playSfx('crash', 'mg6'); } catch (e) { /* ignore */ } } /* peer-human ตกรอบ = ทุกคนได้ยินเสียง (ขอบ false→true ยิงครั้งเดียว) */
}
}
/* MG5: การตายของผู้เล่นมนุษย์มาจากเจ้าตัว (broadcast ผ่าน move) → ทุกเครื่องเห็นตรงกัน (เดิมไม่ส่ง = เพื่อน "ไม่ยอมตาย") */
if (mapData && mapData.gameType === 'jump_survive') {
@@ -21771,6 +21808,7 @@
}
const o = ensureServerAuthBotEntityPlay(rb.id, rb.dir); /* สร้าง entity ถ้า client นี้ยังไม่มี (กันบอทค้าง) */
if (!o) return; /* takeover id (socket-id) ที่ entity ยังไม่มา — รอ join/snapshot */
if (rb.jmp && window.jdSound) { try { window.jdSound.playSfx('jump', 'mg5'); } catch (e) { /* ignore */ } } /* [mg5] บอท/ผู้เล่นที่ server ขับ กระโดด → ทุกคนได้ยินเสียง */
/* lerp ปกติ; แต่ delta ใหญ่ (>3 tile = spawn เริ่ม/หลุด sync) → snap ทันที กันบอทไถลข้ามจอ */
if (Number.isFinite(rb.x)) { const big = !Number.isFinite(o.x) || Math.abs(rb.x - o.x) > 3; o.tx = rb.x; if (big) o.x = rb.x; }
if (Number.isFinite(rb.y)) { const big = !Number.isFinite(o.y) || Math.abs(rb.y - o.y) > 3; o.ty = rb.y; if (big) o.y = rb.y; }
@@ -22392,6 +22430,11 @@
if (previewMode) return;
endSpecialQuiz(data);
});
/* MG2: คนแรกเข้าเส้นชัย → server สั่งเคลียร์อุปสรรคจากจอ "จังหวะเดียวกับหยุด collision" (กัน "หายแล้วยังชน") */
socket.on('gauntlet-finish-clear', () => {
gauntletObstacles = [];
try { pushGauntletObsRenderFrame([]); } catch (_e) { /* ignore */ }
});
/* server แจ้งว่าทุกคนกด «เล่นต่อ» ครบแล้ว (หรือ safety timeout) → ทุกคนเล่นต่อพร้อมกัน */
socket.on('special-quiz-resume-all', () => {
if (previewMode) return;
@@ -26394,9 +26437,11 @@
const drawRows = [];
others.forEach((o, id) => {
if (!o) return;
if (o.bannedSpectator) return; /* Card 3 Ban — ผู้ถูกแบนรอบนี้เข้ามาดูเฉยๆ ตัวละครไม่โชว์ในเกมเลย (item 2) */
drawRows.push({ isMe: false, id, o });
});
drawRows.push({ isMe: true, id: '__me', o: me });
/* เราเองที่ถูกแบน = spectator ล้วน ไม่วาดตัวเราในโลกเกม (มี shield overlay อยู่แล้ว) */
if (!playBannedSpectator) drawRows.push({ isMe: true, id: '__me', o: me });
drawRows.sort((a, b) => {
const da = avatarDrawDepth(a.o);
const db = avatarDrawDepth(b.o);
+43 -4
View File
@@ -5491,7 +5491,8 @@
});
ov.appendChild(btn);
}
if (btn) btn.style.display = (trialMode === 'voting' && hostId === socket.id) ? 'block' : 'none';
/* ปุ่ม "เปิดเผยผล" เอาออกตามคำขอ — reveal อัตโนมัติเมื่อโหวตครบ/หมดเวลาอยู่แล้ว (TC180) ไม่ต้องให้ host กด */
if (btn) btn.style.display = 'none';
}
/** หัวข้อ "พิจารณาคดี" (แทนรูป title เลือกผู้ต้องสงสัยตอนอยู่โหมดโหวต) */
@@ -7294,10 +7295,15 @@
socket.on('player-pick-vote-open', (data) => {
var ov = ensurePickVoteOverlay();
var meta = pickVoteMeta(data && data.purpose);
/* (purpose ) = candidate list ( reconnect )
เก selection/confirmed เดมไว ไมเซตของผเลนทโหวตไปแล */
var _isPickVoteUpdate = pickVoteState.open && pickVoteState.purpose === meta.purpose && ov && !ov.classList.contains('is-result');
var _keepPick = _isPickVoteUpdate ? pickVoteState.picked : null;
var _keepConfirmed = _isPickVoteUpdate ? pickVoteState.confirmed : false;
pickVoteState.open = true;
pickVoteState.purpose = meta.purpose;
pickVoteState.picked = null;
pickVoteState.confirmed = false;
pickVoteState.picked = _keepPick;
pickVoteState.confirmed = _keepConfirmed;
pickVoteState.meta = meta;
clearTimeout(pickVoteState.closeTimer);
/* ปิดฉากคดี (suspect-pick) ระหว่างโหวต → โชว์โหวตบน LobbyB สะอาด (จำไว้เพื่อ restore ตอนปิด) */
@@ -7323,22 +7329,55 @@
var cands = (data && Array.isArray(data.candidates)) ? data.candidates : [];
cands.forEach(function (c) {
var info = (typeof resolveOccupantCharInfo === 'function') ? resolveOccupantCharInfo(c.id) : { name: c.nickname };
/* server-authoritative fallback: candidate peers cache client
(race หลงกล LobbyB) resolveOccupantCharInfo characterId=null = avatar เขยว-blob.
เตมจาก payload server แนบมา แล resolve tint จาก index เด */
if ((info.characterId == null) && c && c.characterId != null) info.characterId = c.characterId;
if (!info.name) info.name = c.nickname;
var cThemeIdx = (typeof parseLobbyThemeIndex === 'function') ? parseLobbyThemeIndex(c && c.lobbyColorThemeIndex) : null;
var cSkinIdx = (typeof parseLobbySkinIndex === 'function') ? parseLobbySkinIndex(c && c.lobbySkinToneIndex) : null;
var cell = document.createElement('div');
cell.className = 'pvx-pl';
cell.setAttribute('data-id', c.id);
var ava = document.createElement('div'); ava.className = 'pvx-ava';
var bg = document.createElement('img'); bg.className = 'pvx-bg'; bg.src = pvAsset(meta.dir, 'player-icon-bg.png');
var ch = (typeof buildPodiumCharImg === 'function') ? buildPodiumCharImg(info.characterId, info.colorTheme, info.colorSkin) : document.createElement('img');
/* ถ้ามีตัวละครแต่ยังไม่มีสี (tint) และ server ส่ง color index มา → resolve rgb แล้ว swap เป็นตัวทาสี */
if (info.characterId && !info.colorTheme && cThemeIdx && typeof applyThemeIndexToOccupant === 'function' && typeof preloadLobbyTintedCharacter === 'function') {
(function (chImg, charId) {
var tmp = { characterId: charId };
applyThemeIndexToOccupant(tmp, cThemeIdx, cSkinIdx, function () {
if (!tmp.colorTheme && !tmp.colorSkin) return;
preloadLobbyTintedCharacter(charId, tmp.colorTheme, tmp.colorSkin, function () {
var ckey = charId + '|' + (tmp.colorTheme || '') + '|' + (tmp.colorSkin || '') + '|down';
var anim = tintedCharCache[ckey]; var tinted = anim && anim.fallback;
if (tinted && tinted.complete && tinted.naturalWidth) { chImg.onerror = null; chImg.src = tinted.src; }
});
});
})(ch, info.characterId);
}
ch.className = 'pvx-char'; ch.style.filter = '';
var frN = document.createElement('img'); frN.className = 'pvx-frame norm'; frN.src = pvAsset(meta.dir, 'player-icon-frame.png');
var frS = document.createElement('img'); frS.className = 'pvx-frame sel'; frS.src = pvAsset(meta.dir, 'player-icon-frame-select.png');
ava.appendChild(bg); ava.appendChild(ch); ava.appendChild(frN); ava.appendChild(frS);
var nm = document.createElement('div'); nm.className = 'pvx-name'; nm.textContent = (info.name || c.nickname || '?');
/* : server (c.nickname) resolveOccupantCharInfo id ( y4FC-K)
เปนชอเม peer งไมเข cache ของ client เดมโชว id วแทนชอจร (fix อเพยนตอนโหวต ban) */
var nm = document.createElement('div'); nm.className = 'pvx-name'; nm.textContent = ((c && c.nickname) || info.name || '?');
var cn = document.createElement('div'); cn.className = 'pvx-count';
cell.appendChild(ava); cell.appendChild(nm); cell.appendChild(cn);
cell.addEventListener('click', function () { selectPickVote(c.id); });
pl.appendChild(cell);
});
/* update mid-vote: คืน selection/confirmed ที่เก็บไว้ (candidate เพิ่ง rebuild → cells ถูกสร้างใหม่หมด) */
if (_keepPick) {
Array.prototype.forEach.call(pl.querySelectorAll('.pvx-pl'), function (c) {
c.classList.toggle('sel', c.getAttribute('data-id') === _keepPick);
});
}
if (_keepConfirmed) {
var ctaK = document.getElementById('pvx-cta'); if (ctaK) ctaK.style.opacity = '0.5';
var footK = document.getElementById('pvx-foot'); if (footK) footK.textContent = 'ส่งโหวตแล้ว — รอผู้เล่นอื่น...';
}
ov.classList.add('is-open');
startPickVoteCountdown(data && data.endsAt, data && data.durationMs);
});
+1 -1
View File
@@ -5458,7 +5458,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.006301121"></script>
<script src="js/play.js?v=0.006301159"></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)
+1 -1
View File
@@ -1648,7 +1648,7 @@
<script src="js/customize-popup.js?v=40" data-customize-triggers="" data-customize-asset-base="img/03-5-Customize"></script>
<script src="js/achievements.js?v=0.002" data-asset-base="img/03-6-Profile"></script>
<script src="js/sound.js?v=1"></script>
<script src="js/room-lobby.js?v=0.0352"></script>
<script src="js/room-lobby.js?v=0.0357"></script>
<div class="version-tag">v —</div>
</body>
</html>
+148 -37
View File
@@ -984,9 +984,22 @@ function maybeSpawnSpecialQuizForRun(space) {
const hasCard = !!(card && (card.cardId || card.imageUrl));
if (!questions.length || !hasCard) { console.log('[special-quiz] skip:no-questions-or-card', mapId, 'L' + level + '_C' + caseId, 'q=' + questions.length, 'card=' + hasCard); return; }
const forced = !!space.forceSpecialQuiz || testForcedCard;
const roll = Math.random();
if (!forced && roll > SPECIAL_QUIZ_SPAWN_CHANCE) { console.log('[special-quiz] skip:roll', mapId, roll.toFixed(3), '>', SPECIAL_QUIZ_SPAWN_CHANCE.toFixed(3)); return; }
if (forced) console.log('[special-quiz] FORCE-spawn (debug)', mapId);
if (forced) {
console.log('[special-quiz] FORCE-spawn (debug)', mapId);
} else {
/* PRE-SCHEDULE ( 1/3 ): (0-2)
การดพเศษจะออก "play ครั้งที่เท่าไหร่" (1-3, เลนได 3 คร/คน). eligible-play suspect
แลวออกการดเฉพาะครงทตรงกบทมไว ไดการดคนละ 1 ใบแนนอน ตรงเวลาทกำหนด ไม variance */
const si = (typeof space.suspectPickIndex === 'number' && space.suspectPickIndex >= 0 && space.suspectPickIndex <= 2) ? space.suspectPickIndex : 0;
if (!space.suspectPlayCount || typeof space.suspectPlayCount !== 'object') space.suspectPlayCount = {};
space.suspectPlayCount[si] = (space.suspectPlayCount[si] || 0) + 1;
const sched = space.specialQuizPlayBySuspect && space.specialQuizPlayBySuspect[si];
if (!sched || space.suspectPlayCount[si] !== sched) {
console.log('[special-quiz] skip:schedule', mapId, 'suspect=' + si, 'play=' + space.suspectPlayCount[si], 'target=' + (sched || '?'));
return;
}
console.log('[special-quiz] SPAWN-scheduled', mapId, 'suspect=' + si, '@play=' + sched);
}
const md = (space.mapId && maps.get(space.mapId)) || space.mapData;
if (!md) { console.log('[special-quiz] skip:no-map', mapId); return; }
/* จำนวน "เลนที่มีผู้เล่นจริง" (คนจริง + บอท) — gauntlet เกิดไอคอนเฉพาะเลนที่ใช้จริง ไม่ใช่ทุกเลนที่ config */
@@ -3597,8 +3610,16 @@ function crownLobbyAllReadyToStart(space) {
const humanIds = [...space.peers.keys()].filter((id) => !isBannedPeerForRun(space, id));
if (humanIds.length === 0) return false;
const expectedActive = space.minigameExpectedActiveCount || 0;
if (expectedActive > 0 && humanIds.length < expectedActive) return false;
return humanIds.every((id) => rm[id]);
const enough = !(expectedActive > 0 && humanIds.length < expectedActive);
const allReady = humanIds.every((id) => rm[id]);
/* [ban-gate-dbg] "" log gate + (throttle 1.5s).
เผยว: banned ไม flag? playerKey (duplicate-MONE)? expectedActive ? หรอมคนยงไม ready */
if (!(enough && allReady) && space.bannedThisRunPlayerId && (Date.now() - (space._banGateLogAt || 0) > 1500)) {
space._banGateLogAt = Date.now();
const rows = [...space.peers.entries()].map(([id, p]) => String(id).slice(0, 6) + (isBannedPeerForRun(space, id) ? '=BAN' : '') + (rm[id] ? '=R' : '=-') + (p.bannedSpectator ? 'sp' : '') + '#' + String(p.playerKey || '').slice(0, 6));
console.log('[ban-gate-dbg] enough=' + enough + ' allReady=' + allReady + ' expected=' + expectedActive + ' humans=' + humanIds.length + ' bannedRun=' + String(space.bannedThisRunPlayerId).slice(0, 10) + ' peers=[' + rows.join(' ') + ']');
}
return enough && allReady;
}
/* crown-lobby (server ) idempotent gr.lobbyStarted ( gr )
@@ -3724,6 +3745,44 @@ function emitDetectiveLobbyBPresence(sid, space) {
total: info.total,
allHere: info.missing === 0,
});
/* มีการ์ด Ban ค้าง → เปิดโหวตเมื่อ "ทุกคนกลับเข้า LobbyB ครบ" เท่านั้น (เช็คทุกครั้งที่ presence เปลี่ยน) */
try { maybeOpenPendingBanVote(sid, space); } catch (e) { /* ignore */ }
}
/** Ban " LobbyB " candidate + timer
* อนคนเขาครบ ("เล่น 4 คนแต่โหวตได้ 3"). safety: รอเก BAN_VOTE_MAX_WAIT_MS (บางคนไมกล) เปดเลย deadlock */
const BAN_VOTE_MAX_WAIT_MS = 30000;
function maybeOpenPendingBanVote(sid, space) {
if (!space || !space.pendingBanVoteCard || space.pickVote) return;
if (!serverMapIsPostCaseLobbyB(space)) return;
const info = detectiveLobbyBMissingParticipants(space);
const allHere = info.total > 0 && info.missing === 0;
/* socket "" rejoin 2s . LobbyB transition reconnect :
าเปดตอน socket งเปลยน candidate/vote socket id เก + จอโหวตเดงซ (re-broadcast) "คนค้างขยับไม่ได้" */
const socketsStable = (Date.now() - (space._lastLobbyBRejoinAt || 0)) > 2000;
if (!space._banVoteWaitSince) space._banVoteWaitSince = Date.now();
const waited = Date.now() - space._banVoteWaitSince;
if ((!allHere || !socketsStable) && waited < BAN_VOTE_MAX_WAIT_MS) {
/* ยังไม่ครบ/ยังไม่นิ่ง + ยังไม่หมดเวลารอ → รอ แล้ว re-check อีก 1s */
if (!space._banVoteWaitTimer) {
space._banVoteWaitTimer = setTimeout(() => {
const sp = spaces.get(sid);
if (sp) { sp._banVoteWaitTimer = null; maybeOpenPendingBanVote(sid, sp); }
}, 1000);
}
return;
}
if (space._banVoteWaitTimer) { clearTimeout(space._banVoteWaitTimer); space._banVoteWaitTimer = null; }
space._banVoteWaitSince = 0;
const banCard = space.pendingBanVoteCard;
space.pendingBanVoteCard = null;
console.log('[ban-debug] OPEN ban vote (peers=', space.peers.size, 'present=' + info.present + '/' + info.total + (allHere ? '' : ' TIMEOUT') + ')');
io.to(sid).emit('special-card-applied', { card: specialCardClientPayload(banCard), context: 'ban' });
startPlayerPickVote(sid, space, 'ban', (targetId) => {
const sp2 = spaces.get(sid);
console.log('[ban-debug] ban vote RESOLVED target=', targetId);
if (sp2) sp2.bannedPlayerId = targetId || null;
});
}
/* TC166 safety: กัน lobbyb-loaded gate deadlock — ถ้า 25s แล้วยังไม่ครบ ให้ force นับ present จาก peer ที่อยู่จริงใน LobbyB */
@@ -3800,6 +3859,11 @@ function assignDetectiveSuspectCardMinigames(space) {
space.evidenceByNick = {};
space.caseMinigameSuspects = {}; /* [achv b2] มินิเกมที่รันในคดีนี้ (suspectIndex) — เช็ค "เล่นครบทุกรอบ" */
space.caseCardTargetedKeys = {}; /* [achv d2] playerKey ที่โดนโหวตการ์ด Silence/Ban ในคดีนี้ */
/* PRE-SCHEDULE : (0-2) play
(1-3; องสงส 1 คนเลนได 3 คร) ไดการดคนละ 1 ใบแนนอน แทนส 1/3 กเกม ( variance) */
space.specialQuizPlayBySuspect = { 0: 1 + Math.floor(Math.random() * 3), 1: 1 + Math.floor(Math.random() * 3), 2: 1 + Math.floor(Math.random() * 3) };
space.suspectPlayCount = { 0: 0, 1: 0, 2: 0 };
console.log('[special-quiz] schedule set (per-case):', JSON.stringify(space.specialQuizPlayBySuspect));
/* #6: (shared ) = (0-3)
ใชโชวองหลกฐานใตการ suspect แทนหลกฐานสวนต (เดมแตละคนเหนไมเทาก) */
space.suspectTeamProgress = [0, 0, 0];
@@ -4624,11 +4688,32 @@ function clearPickVoteTimer(space) {
function pickVoteCandidates(space) {
const arr = [];
space.peers.forEach((p, id) => arr.push({ id, nickname: (p && p.nickname) ? p.nickname : String(id).slice(0, 6), isBot: false }));
testimonyBotIds(space).forEach((bid, i) => arr.push({ id: bid, nickname: 'บอท ' + (i + 1), isBot: true }));
/* characterId + color index client avatar peer cache
องถ (race หลงกล LobbyB) avatar เขยว-blob บนจอโหวต Silence/Ban */
space.peers.forEach((p, id) => arr.push({
id,
nickname: (p && p.nickname) ? p.nickname : String(id).slice(0, 6),
isBot: false,
characterId: (p && p.characterId != null) ? p.characterId : null,
lobbyColorThemeIndex: (p && p.lobbyColorThemeIndex) || null,
lobbySkinToneIndex: (p && p.lobbySkinToneIndex) || null,
}));
testimonyBotIds(space).forEach((bid, i) => arr.push({ id: bid, nickname: 'บอท ' + (i + 1), isBot: true, characterId: null, lobbyColorThemeIndex: null, lobbySkinToneIndex: null }));
return arr;
}
/* map candidate → payload (รวม char info สำหรับเรนเดอร์ avatar ฝั่ง client) */
function pickVoteCandidatePayload(c) {
return {
id: c.id,
nickname: c.nickname,
isBot: c.isBot,
characterId: c.characterId != null ? c.characterId : null,
lobbyColorThemeIndex: c.lobbyColorThemeIndex || null,
lobbySkinToneIndex: c.lobbySkinToneIndex || null,
};
}
function autoVotePickBots(space) {
const pv = space.pickVote;
if (!pv) return;
@@ -4663,7 +4748,7 @@ function startPlayerPickVote(sid, space, purpose, onResolve) {
if (!sock) return;
sock.emit('player-pick-vote-open', {
purpose,
candidates: candidates.map((c) => ({ id: c.id, nickname: c.nickname, isBot: c.isBot })),
candidates: candidates.map(pickVoteCandidatePayload),
endsAt: space.pickVote.endsAt,
durationMs: PV_MS,
});
@@ -8349,7 +8434,7 @@ function stackComputeDropServer(s, md, phaseOverride) {
const pts = miss ? 0 : (10 * mult);
const progressDelta = miss ? 0 : (progPerLayer * mult);
const supportRatio = fallWEff > 0 ? overlap / fallWEff : 0;
return { miss, perfect, pts, progressDelta, landOffsetTiles: raw, placedW: fallW, placedCx, overlap, supportRatio, delta };
return { miss, perfect, pts, progressDelta, landOffsetTiles: raw, placedW: fallW, placedCx, overlap, supportRatio, delta, missThreshold };
}
/* port applyStackHitFromDrop (state-only, no FX) */
function stackApplyHitServer(s, hit, actor) {
@@ -8552,6 +8637,16 @@ function stackSessionEnd(sid, space, outcome) {
io.to(sid).emit('stack-over', overPayload);
space.lastMinigameOver = { event: 'stack-over', payload: overPayload, atMs: Date.now() };
}
/* [mg3] "" ( STACK_TICK_MS tick )
s.phase ตรงก t:now emit เสมอ client extrapolate (serverNow-t)*speed แลวตรงพอด =
ไม re-anchor กระโดดท packet = วหอยแกวงล ไมกระต. clamp tick หายนาน (วาป) */
function advanceStackSwingPhase(s, now) {
const last = s.lastPhaseAdvanceAt;
const dtSec = (last && now > last) ? Math.min(0.2, (now - last) / 1000) : (STACK_TICK_MS / 1000);
s.lastPhaseAdvanceAt = now;
s.phase += s.phaseSpeed * dtSec * Math.PI * 2;
}
function runStackTick(sid, space) {
const s = space.stackSession;
if (!s || !s.active || s.ended) return;
@@ -8566,7 +8661,7 @@ function runStackTick(sid, space) {
/* (busy) (drop handler busyUntil) ""
(advance phase + emit swing) ตาถดไปไมเหนบลอกหอยน = ไมาง · client guard (!stackFall) ไมใหกระตกตอนยงรวง */
if (now < s.busyUntil) {
s.phase += s.phaseSpeed * (STACK_TICK_MS / 1000) * Math.PI * 2;
advanceStackSwingPhase(s, now);
if (now - s.lastSwingEmit > 50) {
s.lastSwingEmit = now;
io.to(sid).emit('stack-swing', { phase: s.phase, speed: s.phaseSpeed, swingAmp: s.swingAmp, topCenterX: s.topCenterX, t: now });
@@ -8582,7 +8677,7 @@ function runStackTick(sid, space) {
s.botThinkUntil = now + STACK_BOT_THINK_MIN_MS + Math.floor(Math.random() * (STACK_BOT_THINK_MAX_MS - STACK_BOT_THINK_MIN_MS));
} else {
/* เลื่อนเฟสตามเวลา (ให้ client เห็นแกว่ง) */
s.phase += s.phaseSpeed * (STACK_TICK_MS / 1000) * Math.PI * 2;
advanceStackSwingPhase(s, now);
/* ส่ง swingAmp+topCenterX ด้วย → client วาดบล็อกที่ห้อยตรงกับโมเดล server เป๊ะ (drop landOffset = swingAmp*sin(phase)) ไม่วาปตอนปล่อย */
if (now - s.lastSwingEmit > 50) { s.lastSwingEmit = now; io.to(sid).emit('stack-swing', { phase: s.phase, speed: s.phaseSpeed, swingAmp: s.swingAmp, topCenterX: s.topCenterX, t: now }); }
if (now >= s.botThinkUntil) {
@@ -8620,7 +8715,7 @@ function runStackTick(sid, space) {
}
} else {
/* ตาคนจริง — server แกว่งให้ + emit ให้ทุกเครื่อง (รวมเจ้าของตา) เห็นเฟสเดียวกัน รอ stack-drop-req */
s.phase += s.phaseSpeed * (STACK_TICK_MS / 1000) * Math.PI * 2;
advanceStackSwingPhase(s, now);
if (now - s.lastSwingEmit > 50) { s.lastSwingEmit = now; io.to(sid).emit('stack-swing', { phase: s.phase, speed: s.phaseSpeed, swingAmp: s.swingAmp, topCenterX: s.topCenterX, t: now }); }
}
/* broadcast stack-state เป็นระยะ (กัน late-join / desync) */
@@ -9014,6 +9109,7 @@ function stepJumpSurviveBots(sid, space, dt, now) {
jp = Math.min(0.9, jp);
if (hazardJump || Math.random() < jp) jumpQ = true;
}
if (jumpQ) b.justJumped = true; /* [mg5] บอทกระโดดรอบนี้ → ส่ง flag ให้ client เล่นเสียง (เคลียร์ตอน emit) */
const r = jsPhysicsIntegrate(md, ts, sc, {
dt, ch, pxc0: pxc, feetY0: feetY, vy0: b.vy, wasOnGround: b.onGround, jumpQueued: jumpQ, moveLeft, moveRight,
});
@@ -9027,7 +9123,7 @@ function stepJumpSurviveBots(sid, space, dt, now) {
b.vy = r.vy; b.onGround = r.onGround;
if (moveRight) b.dir = 'right'; else if (moveLeft) b.dir = 'left';
b.walking = (!r.onGround && Math.abs(r.vy) > 40) || moveLeft || moveRight;
outBots.push({ id, x: b.x, y: b.y, dir: b.dir, walking: b.walking, elim: false });
outBots.push({ id, x: b.x, y: b.y, dir: b.dir, walking: b.walking, elim: false, jmp: !!b.justJumped });
});
/* (hidden) timer client throttle full-rate ().
ไม input (ตก/ไหลตามแทนเฉย ) เหมอนคนปลอยจอ. ตาย mark eliminated + p.jumpSurviveEliminated (เขาเช all_dead/เกรด) */
@@ -9057,6 +9153,7 @@ function stepJumpSurviveBots(sid, space, dt, now) {
if (now - s.lastEmit >= JS_BOT_EMIT_MS) {
s.lastEmit = now;
if (outBots.length) io.to(sid).emit('jump-survive-bot-move', { bots: outBots });
s.bots.forEach((b) => { b.justJumped = false; }); /* [mg5] เคลียร์ flag หลัง emit แล้ว (กันเล่นเสียงซ้ำ/พลาดถ้าอยู่ระหว่าง emit) */
}
/* ทุก entity ตายหมด → จบรอบ (all_dead) */
let anyAlive = false;
@@ -9778,6 +9875,10 @@ setInterval(() => {
function endGauntletGame(sid, space, reason) {
const md = (space.mapId && maps.get(space.mapId)) || space.mapData;
if (!md || md.gameType !== 'gauntlet') return;
try {
const sq = space.specialQuiz; const gr = space.gauntletRun;
console.log('[mg2-end-dbg] reason=' + reason + ' sq={trig:' + (sq && sq.triggered) + ',done:' + (sq && sq.done) + ',sess:' + !!(sq && sq.session) + '} awaitCont=' + !!space.specialQuizAwaitContinue + ' endsAtIn=' + (gr && gr.endsAt != null ? (gr.endsAt - Date.now()) : 'n/a') + 'ms gameoverAt=' + (gr && gr.gameoverAt != null ? (gr.gameoverAt - Date.now()) + 'ms' : 'null'));
} catch (eDbg) { /* ignore */ }
if (space.detectiveMinigameActive) {
const msg = reason === 'time' ? 'หมดเวลา — จบมินิเกม'
: (reason === 'all_dead' ? 'ตกขอบหมดแล้ว — จบมินิเกม' : 'จบมินิเกม');
@@ -11200,35 +11301,25 @@ io.on('connection', (socket) => {
/* Card 3 Ban: LobbyB + Ban
(คน rejoin คนแรกเปนคนเปดโหวต; คนท rejoin หลงขณะโหวตเปดอย งสถานะใหเหนดวย) */
if (serverMapIsPostCaseLobbyB(space)) {
/* จับเวลา rejoin ล่าสุด → maybeOpenPendingBanVote รอ socket "นิ่ง" 2s ก่อนเปิดโหวต (กันเปิดกลาง transition) */
space._lastLobbyBRejoinAt = Date.now();
/* ผู้เล่นกลับเข้า LobbyB แล้ว → อัปเดตจำนวนคนที่พร้อมให้ทุกคน (host ใช้เปิดปุ่มเริ่มเมื่อครบ) */
emitDetectiveLobbyBPresence(spaceId, space);
console.log('[ban-debug] join-space rejoin: postLobbyB=true pendingBan=', !!space.pendingBanVoteCard, 'pickVote=', !!space.pickVote, 'by', socket.id);
if (space.pendingBanVoteCard && !space.pickVote) {
const banCard = space.pendingBanVoteCard;
space.pendingBanVoteCard = null;
/* หน่วงให้ room-lobby ฝั่ง client โหลด/เซ็ตอัป UI เสร็จก่อน แล้วค่อยเปิดโหวต (ไม่งั้น overlay โดน reset/ทับตอนหน้ายังไม่พร้อม) */
setTimeout(() => {
const sp = spaces.get(spaceId);
if (!sp || sp.pickVote || !serverMapIsPostCaseLobbyB(sp)) {
console.log('[ban-debug] setTimeout BAIL: sp=', !!sp, 'pickVote=', !!(sp && sp.pickVote), 'postLobbyB=', !!(sp && serverMapIsPostCaseLobbyB(sp)));
return;
}
console.log('[ban-debug] OPEN ban vote (peers=', sp.peers.size, ')');
io.to(spaceId).emit('special-card-applied', { card: specialCardClientPayload(banCard), context: 'ban' });
startPlayerPickVote(spaceId, sp, 'ban', (targetId) => {
const sp2 = spaces.get(spaceId);
console.log('[ban-debug] ban vote RESOLVED target=', targetId);
if (sp2) sp2.bannedPlayerId = targetId || null;
});
}, 2000);
/* Ban LobbyB ()
maybeOpenPendingBanVote เช present/total + safety timeout เอง */
maybeOpenPendingBanVote(spaceId, space);
} else if (space.pickVote && !space.pickVote.resolved) {
const pv = space.pickVote;
socket.emit('player-pick-vote-open', {
purpose: pv.purpose,
candidates: pv.candidates.map((c) => ({ id: c.id, nickname: c.nickname, isBot: c.isBot })),
endsAt: pv.endsAt,
durationMs: pickVoteMs(),
});
/* reconnect (LobbyB transition )
candidate snapshot = "เล่น 4 คนแต่โหวตได้ 3". rebuild candidates จาก peers จจ แล
broadcast ใหกคนเหนครบ (client เก selection เดมไวเม purpose เด) */
pv.candidates = pickVoteCandidates(space);
autoVotePickBots(space);
const pvPayload = { purpose: pv.purpose, candidates: pv.candidates.map(pickVoteCandidatePayload), endsAt: pv.endsAt, durationMs: pickVoteMs() };
space.peers.forEach((_p, pid) => { const sk = io.sockets.sockets.get(pid); if (sk) sk.emit('player-pick-vote-open', pvPayload); });
emitPickVoteUpdate(spaceId, space);
}
}
});
@@ -11494,8 +11585,10 @@ io.on('connection', (socket) => {
sanity bound กวาง (STACK_DROP_PHASE_TOL = 2π) เหลอไวนค garbage เทาน ( const) */
let dropPhase = s.phase;
const cph = data && Number(data.phase);
if (Number.isFinite(cph) && Math.abs(cph - s.phase) <= STACK_DROP_PHASE_TOL) dropPhase = cph;
const usedClient = Number.isFinite(cph) && Math.abs(cph - s.phase) <= STACK_DROP_PHASE_TOL;
if (usedClient) dropPhase = cph;
const hit = stackComputeDropServer(s, md, dropPhase);
try { console.log('[mg3-drop-dbg] cph=' + (Number.isFinite(cph) ? cph.toFixed(3) : '-') + ' sphase=' + s.phase.toFixed(3) + ' diff=' + (Number.isFinite(cph) ? Math.abs(cph - s.phase).toFixed(3) : '-') + ' used=' + (usedClient ? 'CLIENT' : 'server') + ' raw=' + (s.swingAmp * Math.sin(dropPhase)).toFixed(3) + ' overlap=' + hit.overlap.toFixed(3) + ' thresh=' + (hit.missThreshold != null ? hit.missThreshold.toFixed(3) : '?') + ' miss=' + hit.miss + ' perfect=' + hit.perfect + ' layers=' + s.layers.length + ' amp=' + s.swingAmp.toFixed(2)); } catch (eDbg) { /* ignore */ }
stackApplyHitServer(s, hit, { id: entry.id });
const peer = space.peers.get(socket.id);
const theme = stackHumanThemeServer(peer) || (entry.theme || null);
@@ -11739,6 +11832,11 @@ io.on('connection', (socket) => {
error: 'รอผู้เล่นกลับเข้าห้องให้ครบก่อน (' + waitInfo.present + '/' + waitInfo.total + ')',
});
}
/* ต้องโหวต Ban ให้เสร็จก่อนถึงเริ่มมินิเกมรอบถัดไปได้ (มีการ์ด Ban ค้าง = ยังไม่ได้เลือก/โหวตยังไม่จบ) */
if (space.pendingBanVoteCard || (space.pickVote && space.pickVote.purpose === 'ban' && !space.pickVote.resolved)) {
try { const hp = space.peers.get(socket.id); glog(sid, space, 'lobbyb-gate', '[TC-BAN] BLOCK เริ่มสืบสวน — ต้องโหวตแบนให้เสร็จก่อน (gate ทำงาน)', (hp && hp.nickname) || 'host'); } catch (e) { /* ignore */ }
return reply({ ok: false, waitingBanVote: true, error: 'ต้องโหวตแบนผู้เล่นให้เสร็จก่อนเริ่มมินิเกมถัดไป' });
}
/* TC156: gate จนกว่าทุกคนอ่าน story (cutscene) ครบ — เฉพาะรอบแรก (storyReadComplete เป็น true หลังครบ/รอบถัดไป) */
if (!space.storyReadComplete) {
const stRead = detectiveStoryReadStatus(space);
@@ -12802,6 +12900,9 @@ io.on('connection', (socket) => {
if (gr.finishPhase) return;
gr.finishPhase = true;
gr.obstacles = [];
/* collision (obstacles ) + client ""
นอาการ "หายแล้วยังชน" (visual เคลยรตรงกบตอน collision หย ไมเรวไป) */
io.to(sid).emit('gauntlet-finish-clear');
emitGauntletSync(sid, space);
});
@@ -12818,6 +12919,16 @@ io.on('connection', (socket) => {
p.gauntletJumpPending = true;
});
/* MG5 jump_survive — relay การกระโดดของคนจริงให้เพื่อนในห้อง (เสียงเท่านั้น ไม่แตะ physics; mg5 ไม่มี jump-seq ใน move sync) */
socket.on('js-jump', () => {
const sid = socket.data.spaceId;
const space = sid ? spaces.get(sid) : null;
if (!space || !space.peers.has(socket.id)) return;
const md = (space.mapId && maps.get(space.mapId)) || space.mapData;
if (!md || md.gameType !== 'jump_survive') return;
socket.to(sid).emit('js-jump', { id: socket.id });
});
socket.on('gauntlet-crown-begin-run', (cb) => {
const reply = typeof cb === 'function' ? cb : () => {};
const sid = socket.data.spaceId;
+832
View File
@@ -7127,3 +7127,835 @@
{"t":1783569799635,"cat":"LobbyA","room":"บางบอน-1783569666374","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:28.1,10.7->28.4,9.8 b1:19.6,13.3->19.6,13.3 b2:27.0,13.9->27.0,13.9] [+129115ms]","src":"client"}
{"t":1783569803619,"cat":"LobbyA","room":"บางบอน-1783569666374","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:9.3,4.6->8.5,4.1 b1:6.4,17.0->6.4,17.1 b2:20.5,17.0->19.5,17.1] [+133156ms]","src":"client"}
{"t":1783569807638,"cat":"LobbyA","room":"บางบอน-1783569666374","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:27.6,6.4->27.6,6.4 b1:6.4,17.4->6.4,17.4 b2:29.6,7.2->29.6,7.1] [+137183ms]","src":"client"}
{"t":1783592955543,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783592952210 [+0ms]","src":"client"}
{"t":1783592955589,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+14ms]","src":"client"}
{"t":1783592955614,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+15ms]","src":"client"}
{"t":1783592955618,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+15ms]","src":"client"}
{"t":1783592955628,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+16ms]","src":"client"}
{"t":1783592955628,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+16ms]","src":"client"}
{"t":1783592955628,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+16ms]","src":"client"}
{"t":1783592955634,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+16ms]","src":"client"}
{"t":1783592955788,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+304ms]","src":"client"}
{"t":1783592955804,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783592957826,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+2343ms]","src":"client"}
{"t":1783592957829,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2343ms]","src":"client"}
{"t":1783592957846,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783592952210 mapName=LobbyA [+2374ms]","src":"client"}
{"t":1783592958296,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->10.6,12.3 b1:16.0,14.0->17.8,13.9 b2:22.0,13.0->20.8,11.7 b3:23.0,8.0->21.3,8.6 b4:15.0,5.0->14.0,6.5] [+2822ms]","src":"client"}
{"t":1783592962442,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783592967308,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,5.3->14.8,5.3 b1:10.4,16.9->10.2,16.4 b2:9.1,9.6->9.1,9.6 b3:15.1,9.9->15.1,9.9 b4:6.1,5.6->6.0,5.0] [+11832ms]","src":"client"}
{"t":1783592969286,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783592969745,"cat":"LobbyA","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+14274ms]","src":"client"}
{"t":1783592971067,"cat":"LobbyB","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+15575ms]","src":"client"}
{"t":1783592971360,"cat":"LobbyB","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:12.3,12.8->11.7,12.5 b1:17.2,15.3->17.8,15.5 b2:17.9,16.8->17.9,16.8 b3:5.3,15.0->5.3,15.0 b4:14.7,12.6->14.7,12.6] [+15886ms]","src":"client"}
{"t":1783592971525,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783592971525,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783592971903,"cat":"LobbyB","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+16430ms]","src":"client"}
{"t":1783592972056,"cat":"LobbyB","room":"a-1783592952210","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+16504ms]","src":"client"}
{"t":1783592974068,"cat":"MG4","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-4 คำศัพท์ในกระบวนการยุติธรรม (การ์ด 1)","src":"server"}
{"t":1783592974077,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783592974298,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783592975364,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783592987955,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=1 deck=29 rounds=0/10","src":"server"}
{"t":1783639451303,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783639442866 [+1ms]","src":"client"}
{"t":1783639451874,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+21ms]","src":"client"}
{"t":1783639451906,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+22ms]","src":"client"}
{"t":1783639452061,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+23ms]","src":"client"}
{"t":1783639452072,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+23ms]","src":"client"}
{"t":1783639452073,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+23ms]","src":"client"}
{"t":1783639452198,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+23ms]","src":"client"}
{"t":1783639452271,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+23ms]","src":"client"}
{"t":1783639454131,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+2418ms]","src":"client"}
{"t":1783639454141,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783639459948,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+8030ms]","src":"client"}
{"t":1783639461119,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+9034ms]","src":"client"}
{"t":1783639461120,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783639442866 mapName=LobbyA [+9063ms]","src":"client"}
{"t":1783639461682,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->8.6,12.8 b1:16.0,14.0->15.7,14.0 b2:22.0,13.0->23.5,14.0 b3:23.0,8.0->21.4,8.9 b4:15.0,5.0->16.3,6.3] [+9129ms]","src":"client"}
{"t":1783639465128,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.9,5.4->10.9,5.4 b1:6.3,13.9->6.3,14.0 b2:17.5,14.7->18.1,14.8 b3:17.3,4.2->17.3,4.2 b4:24.3,5.2->24.3,5.2] [+13843ms]","src":"client"}
{"t":1783639469462,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.5,12.8->28.5,12.8 b1:6.0,10.3->6.0,10.3 b2:21.5,15.5->20.9,15.3 b3:28.9,8.4->29.0,8.4 b4:20.4,17.7->20.4,17.7] [+18162ms]","src":"client"}
{"t":1783639473509,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.5,12.8->28.5,12.8 b1:8.4,11.0->9.2,11.1 b2:12.9,5.1->13.6,5.1 b3:24.0,8.0->24.7,7.8 b4:26.1,10.9->25.6,11.3] [+22212ms]","src":"client"}
{"t":1783639477941,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.3,5.1->28.4,5.1 b1:25.1,16.5->25.1,16.2 b2:11.6,9.1->11.1,9.2 b3:13.0,10.2->12.5,10.4 b4:25.0,16.5->25.0,16.5] [+26680ms]","src":"client"}
{"t":1783639482628,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.7,6.9->20.7,6.9 b1:9.5,7.7->9.5,7.7 b2:25.5,16.9->25.5,16.9 b3:16.9,14.1->16.3,14.0 b4:30.0,11.2->30.0,11.2] [+31162ms]","src":"client"}
{"t":1783639486605,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.4,15.7->17.1,15.4 b1:29.8,5.9->30.0,5.3 b2:16.9,7.5->16.3,7.9 b3:11.4,5.8->12.2,6.0 b4:26.4,10.4->25.7,10.3] [+35264ms]","src":"client"}
{"t":1783639490555,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.9,8.0->19.1,7.8 b1:12.0,17.6->12.0,17.6 b2:6.1,7.4->6.1,7.2 b3:29.7,11.3->29.7,11.3 b4:27.8,5.3->28.3,5.2] [+39303ms]","src":"client"}
{"t":1783639494589,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:24.8,6.5->25.5,6.2 b1:23.2,10.0->23.8,9.5 b2:6.1,6.3->6.1,6.3 b3:29.7,11.3->29.7,11.3 b4:20.4,12.3->20.3,12.8] [+43340ms]","src":"client"}
{"t":1783639498614,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:11.9,4.1->11.9,4.0 b1:11.4,5.9->10.7,5.6 b2:6.7,17.6->6.7,17.6 b3:17.7,13.2->17.7,13.2 b4:6.3,9.6->6.2,10.2] [+47368ms]","src":"client"}
{"t":1783639502682,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.0,12.9->14.5,12.6 b1:26.1,9.4->25.8,8.8 b2:6.7,17.6->6.7,17.6 b3:17.7,13.2->17.7,13.2 b4:6.5,15.2->6.9,14.7] [+51433ms]","src":"client"}
{"t":1783639504840,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783639506760,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.2,13.2->18.9,13.3 b1:26.6,12.1->27.2,12.4 b2:9.6,4.3->9.6,4.3 b3:15.1,8.4->15.7,8.2 b4:17.2,4.1->17.2,4.1] [+55510ms]","src":"client"}
{"t":1783639507833,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783639508307,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+57044ms]","src":"client"}
{"t":1783639510719,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783639510719,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783639510878,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.5,16.9->10.5,16.9 b1:24.6,15.9->25.2,15.4 b2:23.2,11.1->23.2,11.0 b3:24.4,5.2->24.4,5.2 b4:20.2,7.9->19.4,8.1] [+59629ms]","src":"client"}
{"t":1783639511123,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+59874ms]","src":"client"}
{"t":1783639514248,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783639514997,"cat":"LobbyA","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.7,16.5->25.7,16.5 b1:19.2,11.8->19.2,11.8 b2:10.9,11.2->10.6,11.9 b3:8.2,7.2->8.2,7.1 b4:12.3,12.2->11.5,11.9] [+63727ms]","src":"client"}
{"t":1783639515699,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783639517938,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783639517985,"cat":"LobbyB","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+66732ms]","src":"client"}
{"t":1783639519015,"cat":"LobbyB","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.3,11.1->7.3,11.0 b1:25.5,13.9->26.4,14.2 b2:7.2,16.8->7.2,16.8 b3:11.2,9.1->11.9,9.7 b4:12.3,11.1->12.5,11.0] [+67745ms]","src":"client"}
{"t":1783639519570,"cat":"LobbyB","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+67888ms]","src":"client"}
{"t":1783639522474,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783639523240,"cat":"LobbyB","room":"a-1783639442866","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.2,6.1->23.2,6.1 b1:28.0,15.3->28.0,15.3 b2:8.3,4.2->8.2,4.2 b3:10.3,16.3->9.1,16.7 b4:27.9,16.1->27.9,16.2] [+71793ms]","src":"client"}
{"t":1783639526077,"cat":"MG6","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-6 ยิงอุกาบาต Violent Crime (การ์ด 1)","src":"server"}
{"t":1783639526089,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783639526536,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783639531743,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783645290033,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645285884 [+1ms]","src":"client"}
{"t":1783645290107,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+12ms]","src":"client"}
{"t":1783645290117,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-start","detail":" [+14ms]","src":"client"}
{"t":1783645290118,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"manifest-done","detail":" [+14ms]","src":"client"}
{"t":1783645290149,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+15ms]","src":"client"}
{"t":1783645290167,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+15ms]","src":"client"}
{"t":1783645290197,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+15ms]","src":"client"}
{"t":1783645290208,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+15ms]","src":"client"}
{"t":1783645290348,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"socket-connect","detail":" [+300ms]","src":"client"}
{"t":1783645290366,"cat":"LobbyA","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645291804,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1794ms]","src":"client"}
{"t":1783645291808,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1795ms]","src":"client"}
{"t":1783645291898,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=บางบอน-1783645285884 mapName=LobbyA [+1863ms]","src":"client"}
{"t":1783645291903,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->10.4,13.5 b1:16.0,14.0->15.5,13.6 b2:22.0,13.0->22.0,12.4 b3:23.0,8.0->23.6,8.2 b4:15.0,5.0->15.6,5.2] [+1866ms]","src":"client"}
{"t":1783645300924,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645285884 [+0ms]","src":"client"}
{"t":1783645301014,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"manifest-done","detail":" [+20ms]","src":"client"}
{"t":1783645301015,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+18ms]","src":"client"}
{"t":1783645301016,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-start","detail":" [+20ms]","src":"client"}
{"t":1783645301028,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+21ms]","src":"client"}
{"t":1783645301028,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+21ms]","src":"client"}
{"t":1783645301098,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+22ms]","src":"client"}
{"t":1783645301099,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+22ms]","src":"client"}
{"t":1783645301178,"cat":"LobbyA","room":"บางบอน-1783645285884","who":"ผู้เล่น","ev":"socket-connect","detail":" [+297ms]","src":"client"}
{"t":1783645385283,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+1ms]","src":"client"}
{"t":1783645385367,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+17ms]","src":"client"}
{"t":1783645385427,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+20ms]","src":"client"}
{"t":1783645385427,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+21ms]","src":"client"}
{"t":1783645385442,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+21ms]","src":"client"}
{"t":1783645385442,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+22ms]","src":"client"}
{"t":1783645385442,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+22ms]","src":"client"}
{"t":1783645385457,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+22ms]","src":"client"}
{"t":1783645385582,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+292ms]","src":"client"}
{"t":1783645385589,"cat":"LobbyA","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645386682,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1398ms]","src":"client"}
{"t":1783645386687,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1399ms]","src":"client"}
{"t":1783645386763,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=บางบอน-1783645381284 mapName=LobbyA [+1438ms]","src":"client"}
{"t":1783645386797,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->11.0,14.1 b1:16.0,14.0->16.6,13.2 b2:22.0,13.0->21.4,13.7 b3:23.0,8.0->23.7,7.4 b4:15.0,5.0->14.1,5.4] [+1441ms]","src":"client"}
{"t":1783645394097,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.8,15.1->25.6,15.5 b1:18.4,13.3->18.7,13.2 b2:21.9,15.6->24.7,15.5 b3:27.5,5.6->28.2,5.3 b4:7.6,10.3->6.4,11.6] [+8664ms]","src":"client"}
{"t":1783645398094,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.0,9.6->14.8,10.0 b1:15.4,13.2->15.0,12.7 b2:13.0,12.4->12.2,12.1 b3:11.0,12.6->11.0,12.6 b4:12.9,5.0->12.3,5.0] [+12671ms]","src":"client"}
{"t":1783645402158,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.6,12.4->28.6,12.1 b1:27.7,5.2->27.7,5.2 b2:6.3,10.8->6.3,10.9 b3:28.9,5.1->28.9,5.1 b4:9.6,4.2->9.6,4.2] [+16720ms]","src":"client"}
{"t":1783645406189,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.1,11.0->22.2,10.6 b1:21.4,10.7->22.3,11.0 b2:17.6,5.7->16.8,6.2 b3:20.0,12.4->20.0,12.7 b4:18.3,9.8->18.3,9.8] [+20731ms]","src":"client"}
{"t":1783645410187,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.2,14.2->18.1,14.7 b1:26.0,5.4->26.0,5.4 b2:6.0,9.4->6.0,8.4 b3:12.9,14.3->13.8,13.7 b4:6.9,4.3->6.8,4.2] [+24759ms]","src":"client"}
{"t":1783645414182,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.4,11.1->9.8,10.4 b1:19.2,7.1->18.5,7.5 b2:20.2,8.0->20.9,8.2 b3:19.9,6.9->19.3,6.5 b4:6.2,11.4->6.2,11.4] [+28761ms]","src":"client"}
{"t":1783645418222,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.0,17.6->20.0,17.6 b1:6.1,17.5->6.1,17.5 b2:16.6,7.0->15.8,6.8 b3:16.8,4.2->17.4,4.5 b4:13.4,7.1->14.1,7.5] [+32800ms]","src":"client"}
{"t":1783645422292,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.2,8.3->6.2,8.3 b1:25.1,16.1->25.6,16.0 b2:11.4,7.9->11.3,9.0 b3:11.2,6.4->10.2,6.1 b4:8.7,9.8->8.7,9.8] [+36804ms]","src":"client"}
{"t":1783645426264,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.2,15.8->6.2,15.8 b1:25.6,16.0->25.6,16.0 b2:6.5,8.0->7.2,8.0 b3:23.0,17.7->23.0,17.8 b4:26.3,11.9->25.9,12.7] [+40839ms]","src":"client"}
{"t":1783645427962,"cat":"LobbyA","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783645428117,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+42681ms]","src":"client"}
{"t":1783645430147,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.2,15.8->6.2,15.8 b1:7.6,12.6->6.8,13.4 b2:25.4,16.7->25.5,16.7 b3:23.0,17.9->23.0,17.9 b4:20.2,10.7->19.9,9.8] [+44875ms]","src":"client"}
{"t":1783645434188,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.3,6.4->22.1,6.0 b1:6.4,15.1->6.4,14.1 b2:25.5,16.6->25.5,16.6 b3:6.8,17.0->6.8,17.0 b4:29.7,5.6->29.7,5.6] [+48906ms]","src":"client"}
{"t":1783645438404,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.9,6.5->15.0,6.6 b1:6.5,4.4->6.5,4.4 b2:6.3,4.1->6.0,4.1 b3:15.5,5.0->15.5,5.0 b4:25.1,7.7->24.2,8.1] [+52960ms]","src":"client"}
{"t":1783645442483,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.4,7.9->6.4,7.9 b1:16.3,8.0->17.2,8.3 b2:24.4,13.0->23.4,13.0 b3:29.5,10.4->29.7,10.6 b4:6.2,11.4->6.2,11.4] [+56999ms]","src":"client"}
{"t":1783645446442,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.4,4.5->6.4,4.5 b1:6.4,17.8->6.4,17.8 b2:19.7,13.0->19.7,13.0 b3:29.7,10.6->29.7,10.6 b4:6.2,11.4->6.2,11.4] [+61000ms]","src":"client"}
{"t":1783645448522,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783645448962,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+63683ms]","src":"client"}
{"t":1783645450457,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.5,10.3->14.5,10.3 b1:10.5,6.5->10.9,6.9 b2:19.8,7.6->19.8,7.6 b3:19.5,12.7->19.5,12.7 b4:17.6,13.5->17.4,13.5] [+65166ms]","src":"client"}
{"t":1783645452167,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+66613ms]","src":"client"}
{"t":1783645452547,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+67210ms]","src":"client"}
{"t":1783645454494,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.6,16.7->14.6,16.7 b1:19.8,12.2->19.4,12.3 b2:12.4,11.2->11.5,10.5 b3:10.7,10.4->9.7,10.8 b4:19.8,15.3->20.8,15.7] [+69208ms]","src":"client"}
{"t":1783645458640,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:5.4,15.8->5.3,15.9 b1:10.8,14.1->12.7,14.6 b2:15.3,13.1->17.4,13.6 b3:22.2,14.2->23.7,13.6 b4:24.5,16.9->24.5,16.9] [+73342ms]","src":"client"}
{"t":1783645458692,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783645458692,"cat":"LobbyB","room":"บางบอน","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783645459163,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+73866ms]","src":"client"}
{"t":1783645462823,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.1,16.1->9.0,16.1 b1:24.4,15.7->23.6,15.2 b2:28.0,10.6->28.0,10.2 b3:22.6,11.7->21.7,12.1 b4:9.6,6.4->10.1,7.2] [+77401ms]","src":"client"}
{"t":1783645466902,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.4,11.6->13.1,11.3 b1:10.2,5.9->11.0,6.1 b2:28.5,8.8->28.5,8.8 b3:20.0,6.6->20.1,6.7 b4:27.5,11.4->27.5,11.4] [+81438ms]","src":"client"}
{"t":1783645470922,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.7,9.0->14.7,9.0 b1:21.7,15.0->21.0,15.7 b2:19.2,13.0->19.2,13.0 b3:28.6,12.0->28.7,12.0 b4:27.5,11.4->27.5,11.4] [+85480ms]","src":"client"}
{"t":1783645474952,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.5,15.3->12.5,15.6 b1:18.0,16.9->18.0,16.9 b2:25.2,6.6->24.1,6.7 b3:28.8,12.0->28.8,12.0 b4:8.1,6.8->8.0,6.7] [+89513ms]","src":"client"}
{"t":1783645477764,"cat":"MG6","room":"บางบอน","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-6 ยิงอุกาบาต Violent Crime (การ์ด 2)","src":"server"}
{"t":1783645477768,"cat":"MG6","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #2","src":"server"}
{"t":1783645477852,"cat":"MG6","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783645479264,"cat":"MG6","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645575660,"cat":"MG6","room":"บางบอน","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #2 → team progress 0/1/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783645575666,"cat":"MG6","room":"บางบอน","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#2 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783645583447,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+1ms]","src":"client"}
{"t":1783645583536,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+11ms]","src":"client"}
{"t":1783645583588,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+15ms]","src":"client"}
{"t":1783645583589,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+14ms]","src":"client"}
{"t":1783645583608,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+16ms]","src":"client"}
{"t":1783645583608,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+16ms]","src":"client"}
{"t":1783645583608,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+16ms]","src":"client"}
{"t":1783645583611,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+16ms]","src":"client"}
{"t":1783645583656,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+22ms]","src":"client"}
{"t":1783645583796,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+368ms]","src":"client"}
{"t":1783645583972,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645586229,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783645586233,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+2793ms]","src":"client"}
{"t":1783645586246,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2793ms]","src":"client"}
{"t":1783645586307,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=1 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+2825ms]","src":"client"}
{"t":1783645586508,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.8,15.1 b1:15.0,15.0->15.7,15.5 b2:21.0,15.0->20.3,14.6 b3:23.0,12.0->23.5,11.3 b4:24.0,9.0->24.4,8.2] [+3000ms]","src":"client"}
{"t":1783645595548,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+2ms]","src":"client"}
{"t":1783645595630,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+13ms]","src":"client"}
{"t":1783645595633,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+15ms]","src":"client"}
{"t":1783645595633,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+15ms]","src":"client"}
{"t":1783645595634,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+15ms]","src":"client"}
{"t":1783645595638,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+16ms]","src":"client"}
{"t":1783645595718,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+16ms]","src":"client"}
{"t":1783645595718,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+16ms]","src":"client"}
{"t":1783645595817,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+283ms]","src":"client"}
{"t":1783645595917,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645597543,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+2012ms]","src":"client"}
{"t":1783645597563,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2013ms]","src":"client"}
{"t":1783645597633,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=1 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+2052ms]","src":"client"}
{"t":1783645597646,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->9.7,14.5 b1:15.0,15.0->15.5,14.7 b2:21.0,15.0->20.9,14.5 b3:23.0,12.0->23.2,11.5 b4:24.0,9.0->23.5,9.2] [+2065ms]","src":"client"}
{"t":1783645601631,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.0,8.7->17.8,8.8 b1:18.7,13.2->18.7,13.2 b2:19.6,6.4->19.6,6.4 b3:29.0,6.6->29.0,6.6 b4:22.9,10.3->25.9,12.5] [+6082ms]","src":"client"}
{"t":1783645606967,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.8,8.8->17.6,8.8 b1:18.7,13.2->11.3,14.6 b2:19.6,6.4->21.7,8.4 b3:29.0,6.6->22.3,10.3 b4:23.5,10.6->11.7,13.7] [+11265ms]","src":"client"}
{"t":1783645610588,"cat":"MG3","room":"บางบอน","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-3 Tower block (การ์ด 1)","src":"server"}
{"t":1783645610593,"cat":"MG3","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783645610666,"cat":"MG3","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783645612100,"cat":"MG3","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645729223,"cat":"MG3","room":"บางบอน","who":"","ev":"stack-score","detail":"[TC183] จบ MG3 outcome=time_up team=210 layers=16 progress=35% · ต่อคน: ผู้เล่=20 bot=30 bot=50 bot=60 bot=30 bot=20","src":"server"}
{"t":1783645740178,"cat":"MG3","room":"บางบอน","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #1 → team progress 1/1/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783645740183,"cat":"MG3","room":"บางบอน","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#1 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783645753186,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+0ms]","src":"client"}
{"t":1783645753266,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+10ms]","src":"client"}
{"t":1783645753277,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+12ms]","src":"client"}
{"t":1783645753281,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+12ms]","src":"client"}
{"t":1783645753291,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+12ms]","src":"client"}
{"t":1783645753326,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+13ms]","src":"client"}
{"t":1783645753327,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+13ms]","src":"client"}
{"t":1783645753331,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+13ms]","src":"client"}
{"t":1783645753351,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+18ms]","src":"client"}
{"t":1783645753481,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+305ms]","src":"client"}
{"t":1783645753559,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645755453,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783645755454,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+2269ms]","src":"client"}
{"t":1783645755455,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2270ms]","src":"client"}
{"t":1783645755516,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=0 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+2305ms]","src":"client"}
{"t":1783645755583,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.5,15.2 b1:15.0,15.0->15.1,14.5 b2:21.0,15.0->20.5,14.7 b3:23.0,12.0->22.5,11.8 b4:24.0,9.0->23.7,9.5] [+2311ms]","src":"client"}
{"t":1783645760171,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.6,15.9->26.1,14.9 b1:16.5,13.3->16.5,13.3 b2:20.5,5.9->20.5,5.9 b3:19.6,9.2->23.1,10.5 b4:7.4,13.8->7.4,13.8] [+6960ms]","src":"client"}
{"t":1783645765226,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.7,11.2->8.9,12.2 b1:22.6,10.6->29.0,7.8 b2:18.6,7.2->21.8,6.2 b3:21.2,14.1->19.7,16.9 b4:13.7,11.9->19.9,9.8] [+11889ms]","src":"client"}
{"t":1783645766957,"cat":"MG1","room":"บางบอน","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-1 จริงหรือไม่ (การ์ด 3)","src":"server"}
{"t":1783645766971,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783645767046,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783645768515,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645966068,"cat":"MG1","room":"บางบอน","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #3 → team progress 1/1/1 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783645966071,"cat":"MG1","room":"บางบอน","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#3 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783645979111,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+0ms]","src":"client"}
{"t":1783645979191,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+9ms]","src":"client"}
{"t":1783645979226,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+11ms]","src":"client"}
{"t":1783645979245,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+12ms]","src":"client"}
{"t":1783645979246,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+12ms]","src":"client"}
{"t":1783645979246,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+12ms]","src":"client"}
{"t":1783645979250,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+13ms]","src":"client"}
{"t":1783645979256,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+13ms]","src":"client"}
{"t":1783645979315,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+19ms]","src":"client"}
{"t":1783645979470,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+317ms]","src":"client"}
{"t":1783645979547,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645980975,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783645980981,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+1900ms]","src":"client"}
{"t":1783645981036,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1900ms]","src":"client"}
{"t":1783645981051,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+1934ms]","src":"client"}
{"t":1783645981086,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->9.5,15.2 b1:15.0,15.0->15.4,14.7 b2:21.0,15.0->20.5,15.1 b3:23.0,12.0->23.5,11.9 b4:24.0,9.0->24.0,9.5] [+1941ms]","src":"client"}
{"t":1783645986786,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.6,6.4->19.4,6.4 b1:19.4,12.3->19.4,12.4 b2:14.8,12.6->15.1,13.3 b3:6.6,16.9->6.6,16.9 b4:9.3,15.3->5.4,15.0] [+7527ms]","src":"client"}
{"t":1783645992050,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+0ms]","src":"client"}
{"t":1783645992180,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+17ms]","src":"client"}
{"t":1783645992181,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+20ms]","src":"client"}
{"t":1783645992195,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+21ms]","src":"client"}
{"t":1783645992242,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+21ms]","src":"client"}
{"t":1783645992281,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+22ms]","src":"client"}
{"t":1783645992296,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+22ms]","src":"client"}
{"t":1783645992370,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+22ms]","src":"client"}
{"t":1783645992515,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+475ms]","src":"client"}
{"t":1783645992657,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783645994890,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+2801ms]","src":"client"}
{"t":1783645994910,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2801ms]","src":"client"}
{"t":1783645994990,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+2841ms]","src":"client"}
{"t":1783645995015,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.8,14.7 b1:15.0,15.0->14.7,14.2 b2:21.0,15.0->21.6,14.4 b3:23.0,12.0->22.1,11.9 b4:24.0,9.0->24.8,8.6] [+2853ms]","src":"client"}
{"t":1783645999206,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.2,5.6->24.3,5.4 b1:27.2,11.8->27.2,11.8 b2:13.8,6.2->14.4,6.3 b3:9.7,8.6->8.1,8.5 b4:28.7,6.3->28.7,6.3] [+7166ms]","src":"client"}
{"t":1783646003471,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.0,4.9->25.9,4.6 b1:19.7,12.4->12.0,10.7 b2:22.2,8.1->24.1,10.2 b3:12.1,8.7->15.0,8.9 b4:27.8,5.9->27.0,5.4] [+11274ms]","src":"client"}
{"t":1783646007500,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.7,14.1->11.5,14.0 b1:25.4,7.7->25.2,6.9 b2:17.4,13.4->17.9,13.4 b3:27.8,14.3->27.8,14.3 b4:26.5,16.6->26.8,16.6] [+15338ms]","src":"client"}
{"t":1783646008273,"cat":"MG1","room":"บางบอน","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-1 จริงหรือไม่ (การ์ด 3)","src":"server"}
{"t":1783646008279,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783646008610,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783646009984,"cat":"MG1","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783646082701,"cat":"MG1","room":"บางบอน","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #3 → team progress 1/1/2 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783646082704,"cat":"MG1","room":"บางบอน","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#3 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783646092963,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+0ms]","src":"client"}
{"t":1783646093040,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+10ms]","src":"client"}
{"t":1783646093060,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+13ms]","src":"client"}
{"t":1783646093060,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+13ms]","src":"client"}
{"t":1783646093072,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+14ms]","src":"client"}
{"t":1783646093081,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+14ms]","src":"client"}
{"t":1783646093121,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+14ms]","src":"client"}
{"t":1783646093121,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+14ms]","src":"client"}
{"t":1783646093130,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+24ms]","src":"client"}
{"t":1783646093277,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+283ms]","src":"client"}
{"t":1783646093463,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783646095231,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783646095300,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+2308ms]","src":"client"}
{"t":1783646095371,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+2308ms]","src":"client"}
{"t":1783646095461,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+2344ms]","src":"client"}
{"t":1783646095602,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.8,14.4 b1:15.0,15.0->15.7,14.4 b2:21.0,15.0->20.3,14.3 b3:23.0,12.0->22.0,12.2 b4:24.0,9.0->23.3,9.7] [+2351ms]","src":"client"}
{"t":1783646100532,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.8,12.8->25.8,12.8 b1:27.6,5.2->27.6,5.2 b2:8.6,4.3->8.6,4.3 b3:26.0,13.2->27.5,13.0 b4:8.5,17.0->8.5,17.0] [+7542ms]","src":"client"}
{"t":1783646106005,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางบอน-1783645381284 [+0ms]","src":"client"}
{"t":1783646106096,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+16ms]","src":"client"}
{"t":1783646106105,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-start","detail":" [+19ms]","src":"client"}
{"t":1783646106130,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"manifest-done","detail":" [+20ms]","src":"client"}
{"t":1783646106140,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+20ms]","src":"client"}
{"t":1783646106311,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+20ms]","src":"client"}
{"t":1783646106330,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+21ms]","src":"client"}
{"t":1783646106330,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+21ms]","src":"client"}
{"t":1783646106460,"cat":"LobbyA","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"socket-connect","detail":" [+428ms]","src":"client"}
{"t":1783646106580,"cat":"LobbyB","room":"บางบอน","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783646109073,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+3061ms]","src":"client"}
{"t":1783646109074,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+3061ms]","src":"client"}
{"t":1783646109100,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=บางบอน-1783645381284 mapName=LobbyB [+3100ms]","src":"client"}
{"t":1783646109169,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.6,14.8 b1:15.0,15.0->15.7,15.1 b2:21.0,15.0->20.5,15.5 b3:23.0,12.0->23.2,11.3 b4:24.0,9.0->24.7,9.0] [+3105ms]","src":"client"}
{"t":1783646117504,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:27.8,8.1->27.8,8.1 b1:11.9,8.9->15.5,8.3 b2:17.4,16.6->17.4,16.6 b3:20.5,12.7->18.6,16.0 b4:28.5,8.6->28.5,8.6] [+11514ms]","src":"client"}
{"t":1783646121683,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:12.2,10.5->11.4,9.9 b1:27.7,9.3->27.7,9.3 b2:26.5,16.8->26.6,16.8 b3:24.2,5.8->24.2,5.8 b4:21.7,9.1->22.7,9.1] [+15552ms]","src":"client"}
{"t":1783646125743,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.8,13.8->22.8,13.8 b1:13.2,14.8->12.2,14.7 b2:21.2,16.2->20.2,16.1 b3:27.5,5.9->27.5,5.9 b4:20.9,9.6->21.9,10.1] [+19586ms]","src":"client"}
{"t":1783646129844,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.2,7.0->28.2,7.0 b1:21.6,5.4->21.9,6.2 b2:7.5,14.6->8.3,14.7 b3:21.5,12.4->20.8,11.6 b4:9.0,12.2->8.1,12.7] [+23626ms]","src":"client"}
{"t":1783646133798,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.6,15.2->5.7,15.5 b1:16.0,13.6->15.0,13.8 b2:24.1,5.1->24.1,5.0 b3:12.6,5.2->12.6,5.2 b4:19.1,14.8->19.8,14.3] [+27658ms]","src":"client"}
{"t":1783646137813,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.6,7.9->28.6,7.7 b1:14.5,12.0->14.5,11.8 b2:25.9,3.6->25.9,3.2 b3:18.2,5.8->17.7,5.1 b4:28.6,6.7->28.6,6.7] [+31686ms]","src":"client"}
{"t":1783646141891,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.7,9.6->22.8,10.1 b1:5.5,9.1->5.4,9.1 b2:7.1,14.0->7.1,14.0 b3:27.4,16.8->26.7,16.4 b4:15.3,15.8->15.3,15.8] [+35731ms]","src":"client"}
{"t":1783646145916,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.9,12.6->28.9,12.5 b1:5.4,9.1->5.4,9.1 b2:23.4,16.9->23.4,16.9 b3:25.5,9.8->26.4,9.9 b4:13.2,5.7->13.2,5.7] [+39759ms]","src":"client"}
{"t":1783646149958,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.9,12.5->28.9,12.5 b1:8.2,6.4->8.2,6.4 b2:18.0,15.8->17.1,15.6 b3:27.5,10.2->27.5,10.2 b4:25.0,10.8->25.0,10.8] [+43789ms]","src":"client"}
{"t":1783646153975,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.3,14.3->7.3,14.3 b1:8.2,6.4->8.2,6.4 b2:13.9,5.1->13.9,5.1 b3:19.5,12.3->19.5,12.4 b4:26.0,7.6->25.1,7.8] [+47823ms]","src":"client"}
{"t":1783646158093,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.9,16.7->17.8,16.9 b1:14.9,10.0->14.9,10.0 b2:13.1,13.4->13.0,14.3 b3:19.1,7.4->20.0,7.1 b4:19.3,12.3->19.3,12.4] [+51873ms]","src":"client"}
{"t":1783646162090,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.9,16.9->22.9,16.9 b1:14.9,12.0->14.9,12.1 b2:12.7,17.0->12.7,17.0 b3:7.4,13.9->7.4,14.1 b4:20.5,13.1->21.0,12.3] [+55906ms]","src":"client"}
{"t":1783646166135,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.7,13.1->15.7,13.1 b1:20.6,5.8->21.4,5.3 b2:23.0,13.9->22.0,14.2 b3:19.2,11.5->19.2,11.5 b4:22.2,11.1->23.1,11.1] [+59940ms]","src":"client"}
{"t":1783646170138,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.7,13.1->15.7,13.1 b1:11.9,16.8->11.9,16.8 b2:5.5,16.5->5.5,16.5 b3:17.2,14.8->16.3,15.3 b4:28.0,11.3->28.0,11.3] [+63980ms]","src":"client"}
{"t":1783646174183,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.6,7.8->13.7,7.9 b1:7.4,14.2->7.4,14.2 b2:14.2,7.8->14.1,7.7 b3:27.4,11.8->27.8,11.5 b4:19.3,11.6->19.3,11.6] [+68014ms]","src":"client"}
{"t":1783646178204,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.7,7.9->13.7,7.9 b1:7.1,12.9->7.1,12.2 b2:14.1,7.4->14.1,7.4 b3:24.0,10.8->23.0,11.0 b4:19.3,12.8->19.3,12.8] [+72044ms]","src":"client"}
{"t":1783646182218,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.8,12.5->28.8,12.5 b1:5.0,9.9->5.0,9.9 b2:8.2,5.5->8.2,5.5 b3:13.5,9.5->14.2,8.8 b4:27.8,10.0->27.8,10.0] [+76070ms]","src":"client"}
{"t":1783646186287,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.6,10.6->21.6,10.3 b1:14.7,12.8->14.7,12.8 b2:26.7,5.5->26.8,5.5 b3:23.2,9.2->22.4,9.7 b4:20.0,6.7->19.7,7.6] [+80118ms]","src":"client"}
{"t":1783646190310,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.0,9.9->9.2,10.8 b1:14.7,9.4->14.7,9.3 b2:26.8,5.5->26.8,5.5 b3:24.5,8.4->24.6,7.4 b4:13.9,5.3->13.9,5.4] [+84145ms]","src":"client"}
{"t":1783646194359,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:24.5,5.3->24.5,5.3 b1:18.5,7.3->19.3,8.0 b2:28.8,7.7->28.8,7.7 b3:25.6,3.6->25.6,3.6 b4:19.3,11.8->19.3,12.0] [+88169ms]","src":"client"}
{"t":1783646198401,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:24.5,5.3->24.5,5.3 b1:28.2,12.0->28.2,12.0 b2:20.6,10.8->19.7,11.2 b3:20.2,15.1->20.5,14.7 b4:8.1,12.2->7.8,11.3] [+92205ms]","src":"client"}
{"t":1783646202426,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.6,11.4->25.9,10.8 b1:26.9,12.2->26.0,12.2 b2:19.9,17.0->20.8,17.0 b3:27.4,5.1->27.4,5.1 b4:5.2,9.3->5.2,9.3] [+96251ms]","src":"client"}
{"t":1783646206454,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.6,7.3->28.6,7.3 b1:19.5,12.6->19.5,12.6 b2:28.2,6.1->28.2,6.1 b3:23.6,8.1->23.2,9.0 b4:15.8,15.8->15.8,15.8] [+100281ms]","src":"client"}
{"t":1783646210479,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:11.8,17.0->11.8,17.0 b1:28.9,8.9->28.9,8.9 b2:28.2,6.1->28.2,6.1 b3:13.4,5.8->14.1,6.1 b4:11.5,6.2->11.2,6.2] [+104316ms]","src":"client"}
{"t":1783646214518,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:5.6,9.6->5.4,9.1 b1:17.9,6.4->18.4,6.2 b2:12.8,13.6->12.1,13.3 b3:22.0,15.1->22.1,16.0 b4:25.2,11.0->26.1,11.3] [+108354ms]","src":"client"}
{"t":1783646218627,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.5,6.4->17.5,6.4 b1:18.6,6.2->18.6,6.2 b2:5.2,9.4->5.1,9.4 b3:24.4,12.7->24.8,13.7 b4:27.8,11.1->27.8,11.1] [+112374ms]","src":"client"}
{"t":1783646222589,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.3,10.4->24.5,9.9 b1:7.2,13.3->7.2,13.3 b2:17.1,9.0->16.7,9.0 b3:8.4,7.9->8.3,7.9 b4:13.4,8.2->12.5,8.7] [+116404ms]","src":"client"}
{"t":1783646226603,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.5,8.8->18.5,8.8 b1:17.3,13.6->18.0,13.6 b2:11.8,9.0->11.7,9.0 b3:8.3,6.8->8.3,6.8 b4:7.2,12.2->7.2,12.2] [+120454ms]","src":"client"}
{"t":1783646230624,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.4,12.0->8.4,12.4 b1:23.9,14.5->24.9,14.8 b2:14.4,11.1->14.5,10.6 b3:16.5,14.0->16.5,14.0 b4:14.7,10.1->14.7,10.1] [+124477ms]","src":"client"}
{"t":1783646234690,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.6,16.5->15.6,16.7 b1:8.4,6.1->8.2,5.9 b2:5.8,15.6->5.4,16.0 b3:19.5,6.5->19.5,6.5 b4:10.8,13.1->10.0,13.8] [+128508ms]","src":"client"}
{"t":1783646238563,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.4,8.9->17.6,8.6 b1:15.0,11.4->15.0,11.4 b2:14.1,17.0->15.0,17.0 b3:20.3,10.2->19.4,10.5 b4:8.1,5.4->8.1,5.3] [+132550ms]","src":"client"}
{"t":1783646242562,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.4,4.6->8.4,4.6 b1:10.4,6.2->10.3,6.2 b2:15.2,13.2->16.1,13.2 b3:19.4,12.3->19.4,12.3 b4:8.1,8.0->8.1,8.1] [+136587ms]","src":"client"}
{"t":1783646246767,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.8,14.6->16.8,14.7 b1:13.1,7.7->14.0,8.3 b2:19.8,10.1->19.3,9.8 b3:10.4,7.6->10.3,7.6 b4:12.5,12.1->13.4,12.7] [+140627ms]","src":"client"}
{"t":1783646250789,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:27.5,13.4->27.5,13.4 b1:18.9,9.2->18.2,8.7 b2:8.1,6.9->8.1,6.9 b3:7.7,10.7->7.7,10.7 b4:21.0,16.9->21.0,16.9] [+144678ms]","src":"client"}
{"t":1783646254866,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:24.1,5.9->23.3,6.4 b1:21.8,10.3->20.9,9.9 b2:8.2,9.6->8.2,9.6 b3:7.7,9.2->8.3,8.9 b4:28.0,15.6->28.0,15.6] [+148699ms]","src":"client"}
{"t":1783646258863,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.2,12.3->14.1,11.8 b1:17.1,7.4->16.2,7.3 b2:17.8,5.1->17.9,5.2 b3:8.0,5.9->8.0,5.5 b4:20.3,11.1->19.3,10.9] [+152732ms]","src":"client"}
{"t":1783646262996,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,8.8->14.7,8.8 b1:15.4,8.8->16.2,8.9 b2:22.6,11.3->21.9,11.9 b3:27.7,8.4->27.9,8.4 b4:16.8,9.0->16.8,9.0] [+156780ms]","src":"client"}
{"t":1783646266931,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.1,10.6->6.1,10.6 b1:20.1,5.3->20.1,5.3 b2:27.7,14.6->27.7,14.6 b3:14.9,14.3->14.9,14.3 b4:16.4,9.0->16.4,9.0] [+160799ms]","src":"client"}
{"t":1783646271025,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.1,7.8->20.2,8.2 b1:7.0,9.2->7.0,9.1 b2:26.5,13.5->26.5,13.5 b3:17.6,13.9->17.3,14.8 b4:7.2,9.6->7.2,9.6] [+164843ms]","src":"client"}
{"t":1783646275055,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.1,13.3->10.5,13.4 b1:14.5,11.8->14.5,11.9 b2:11.3,13.2->11.3,13.2 b3:19.8,8.4->20.7,8.2 b4:6.7,9.6->6.6,9.1] [+168867ms]","src":"client"}
{"t":1783646279096,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.9,8.2->10.5,9.0 b1:14.7,7.7->13.7,7.7 b2:14.8,9.5->14.8,9.4 b3:10.0,16.7->9.2,16.8 b4:13.2,10.9->13.2,10.0] [+172908ms]","src":"client"}
{"t":1783646283131,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.6,10.7->14.6,10.7 b1:17.7,6.6->18.7,6.8 b2:24.1,9.5->23.2,10.1 b3:7.5,16.1->8.3,15.5 b4:11.9,6.2->11.2,6.8] [+176939ms]","src":"client"}
{"t":1783646287160,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:12.8,9.4->11.9,8.8 b1:26.0,5.4->26.3,5.2 b2:10.0,16.8->10.0,16.8 b3:16.2,8.6->16.2,8.7 b4:27.7,14.0->27.9,14.1] [+180979ms]","src":"client"}
{"t":1783646291191,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.5,4.4->8.5,4.4 b1:17.5,8.3->16.6,8.6 b2:7.7,11.3->8.5,12.0 b3:16.2,8.7->16.3,8.7 b4:24.0,5.8->24.0,5.8] [+185021ms]","src":"client"}
{"t":1783646295206,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.9,10.9->7.9,10.9 b1:14.6,9.1->14.6,9.1 b2:16.8,16.8->16.8,16.8 b3:16.6,8.7->16.6,8.7 b4:26.4,7.9->27.2,7.5] [+189053ms]","src":"client"}
{"t":1783646299337,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.9,12.9->10.7,13.5 b1:14.6,9.1->14.6,9.1 b2:24.9,4.8->25.4,4.1 b3:28.5,7.8->28.5,7.8 b4:11.7,15.9->11.0,15.3] [+193085ms]","src":"client"}
{"t":1783646303275,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.9,14.0->19.5,13.3 b1:12.8,14.9->12.5,15.8 b2:25.4,3.4->25.4,3.4 b3:23.4,16.5->23.0,16.7 b4:6.4,10.0->6.3,10.0] [+197117ms]","src":"client"}
{"t":1783646307330,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.2,8.2->8.2,8.2 b1:11.9,6.5->11.9,6.5 b2:27.7,5.7->27.9,5.9 b3:22.7,15.9->22.7,15.1 b4:19.6,16.6->20.5,16.8] [+201151ms]","src":"client"}
{"t":1783646311337,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.0,9.7->7.2,9.3 b1:17.5,5.9->17.9,5.8 b2:28.9,7.4->28.9,7.4 b3:23.3,6.4->23.3,6.4 b4:24.7,16.8->24.7,16.8] [+205186ms]","src":"client"}
{"t":1783646315375,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:27.6,16.7->27.6,16.7 b1:25.9,16.9->25.9,16.9 b2:9.2,10.4->9.2,10.5 b3:27.9,13.9->27.9,13.9 b4:17.7,5.2->17.7,5.2] [+209220ms]","src":"client"}
{"t":1783646319426,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.6,16.1->9.1,16.3 b1:11.9,14.4->11.0,14.2 b2:6.6,15.4->6.6,15.4 b3:19.3,12.1->19.3,12.0 b4:19.3,10.2->19.3,10.1] [+213246ms]","src":"client"}
{"t":1783646323426,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.2,11.2->26.7,11.9 b1:8.9,11.0->8.9,11.0 b2:6.6,15.4->6.6,15.4 b3:25.3,5.0->25.5,5.7 b4:27.9,15.3->27.9,15.4] [+217288ms]","src":"client"}
{"t":1783646327326,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.1,9.2->19.1,9.2 b1:7.1,10.0->6.3,9.3 b2:19.1,8.8->19.2,8.8 b3:27.9,14.7->27.9,14.7 b4:27.9,15.4->27.9,15.4] [+221316ms]","src":"client"}
{"t":1783646332681,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.1,10.1->20.6,10.3 b1:18.0,5.4->18.0,5.4 b2:9.3,11.4->8.8,11.2 b3:18.7,7.3->19.3,7.1 b4:18.0,8.8->18.5,8.8] [+225505ms]","src":"client"}
{"t":1783646335495,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.3,14.2->7.1,14.0 b1:19.5,6.8->20.4,7.2 b2:14.5,9.4->14.5,9.4 b3:17.4,8.9->17.4,8.9 b4:28.6,12.0->28.6,12.0] [+229509ms]","src":"client"}
{"t":1783646339726,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.1,10.3->6.1,10.3 b1:28.6,12.0->28.6,12.0 b2:14.5,9.8->14.5,9.8 b3:17.6,7.2->18.6,6.9 b4:16.1,6.8->16.1,6.8] [+233544ms]","src":"client"}
{"t":1783646343595,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.1,10.2->6.1,10.2 b1:13.9,16.0->13.0,16.3 b2:8.7,11.2->7.7,11.4 b3:12.2,5.5->12.2,5.5 b4:15.6,16.9->15.6,16.3] [+237582ms]","src":"client"}
{"t":1783646347641,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.7,9.0->14.7,9.0 b1:14.5,9.3->14.5,9.2 b2:7.1,11.7->7.1,11.7 b3:17.6,6.7->18.6,6.9 b4:27.5,9.6->27.5,9.4] [+241649ms]","src":"client"}
{"t":1783646351877,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.7,9.0->14.7,9.0 b1:28.5,6.9->28.5,6.9 b2:15.3,7.3->16.3,7.6 b3:20.5,14.6->19.5,14.5 b4:28.6,8.7->28.6,8.7] [+245711ms]","src":"client"}
{"t":1783646355910,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.1,14.7->7.1,14.7 b1:28.8,8.5->28.8,8.5 b2:9.7,16.8->9.7,16.8 b3:26.4,7.9->27.3,7.3 b4:26.0,16.8->26.0,16.8] [+249745ms]","src":"client"}
{"t":1783646359975,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.5,11.1->14.5,11.1 b1:19.2,12.3->19.2,12.3 b2:19.2,6.3->19.7,6.3 b3:24.0,5.8->24.0,5.8 b4:12.8,8.3->11.9,8.5] [+253787ms]","src":"client"}
{"t":1783646363980,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.6,6.6->17.6,6.9 b1:19.2,9.2->18.7,8.9 b2:20.4,5.8->20.4,5.8 b3:23.7,6.0->23.0,6.3 b4:19.2,11.8->19.2,12.2] [+257819ms]","src":"client"}
{"t":1783646367867,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.9,16.7->20.8,16.7 b1:8.2,4.6->8.2,4.5 b2:9.4,11.2->9.4,11.2 b3:14.8,12.9->14.8,12.9 b4:27.7,9.1->27.8,9.1] [+261860ms]","src":"client"}
{"t":1783646369331,"cat":"LobbyB","room":"บางบอน","who":"","ev":"trial-vote","detail":"[TC180] ยืนยันโหวต 6/6 — ครบ → reveal (pass)","src":"server"}
{"t":1783646369490,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"trial-confirm","detail":"[TC180] กดยืนยันโหวต (แยก select\/confirm) → ส่งจริง [+263315ms]","src":"client"}
{"t":1783646369689,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"trial-reveal-dur","detail":"[TC174] โชว์ผลโหวต 7000ms (admin ปรับได้) ก่อนไปหน้าผลเต็ม [+263465ms]","src":"client"}
{"t":1783646372090,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.9,15.8->7.5,15.9 b1:14.8,11.2->14.9,11.7 b2:12.6,9.2->11.6,8.9 b3:6.9,14.9->7.8,14.7 b4:7.8,16.8->7.8,16.8] [+265910ms]","src":"client"}
{"t":1783646376086,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.7,16.1->9.7,15.9 b1:15.5,8.8->16.3,8.3 b2:8.5,6.5->8.5,6.6 b3:26.9,7.4->27.9,7.3 b4:18.7,13.0->18.7,13.0] [+269943ms]","src":"client"}
{"t":1783646380280,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:27.8,15.6->27.8,15.6 b1:18.5,13.0->18.6,13.0 b2:8.5,7.2->8.5,7.3 b3:10.9,15.5->10.1,15.6 b4:19.5,9.0->19.6,8.2] [+274100ms]","src":"client"}
{"t":1783646384371,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.6,6.9->18.4,6.8 b1:24.9,16.4->25.1,16.6 b2:15.3,7.5->21.9,5.7 b3:21.3,7.8->27.6,5.2 b4:20.2,5.5->20.9,5.1] [+278364ms]","src":"client"}
{"t":1783646388567,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:27.7,14.6->27.7,14.6 b1:26.6,7.6->26.6,7.6 b2:21.6,16.9->21.6,16.9 b3:25.7,3.4->25.7,3.4 b4:18.8,13.6->19.8,13.3] [+282407ms]","src":"client"}
{"t":1783646392627,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.2,14.7->18.3,14.3 b1:5.7,9.8->5.7,9.8 b2:24.1,16.9->24.1,16.9 b3:7.1,9.4->7.1,9.4 b4:22.5,12.9->22.5,12.9] [+286444ms]","src":"client"}
{"t":1783646396645,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.1,10.2->9.1,10.2 b1:5.3,9.3->5.1,9.3 b2:24.1,16.9->24.1,16.9 b3:15.9,16.9->15.9,16.9 b4:27.9,13.1->27.9,13.1] [+290474ms]","src":"client"}
{"t":1783646400645,"cat":"LobbyB","room":"บางบอน-1783645381284","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.0,15.8->15.9,16.4 b1:28.9,7.2->28.9,7.2 b2:7.5,14.7->7.5,14.7 b3:27.6,9.8->27.6,9.8 b4:22.5,6.4->22.5,6.4] [+294501ms]","src":"client"}
{"t":1783657070904,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783657067908 [+0ms]","src":"client"}
{"t":1783657070950,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+11ms]","src":"client"}
{"t":1783657070953,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+12ms]","src":"client"}
{"t":1783657070958,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+12ms]","src":"client"}
{"t":1783657070958,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+13ms]","src":"client"}
{"t":1783657070987,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+13ms]","src":"client"}
{"t":1783657070990,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+13ms]","src":"client"}
{"t":1783657070990,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+13ms]","src":"client"}
{"t":1783657071078,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+137ms]","src":"client"}
{"t":1783657071081,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783657072053,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1109ms]","src":"client"}
{"t":1783657072054,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->9.4,14.7 b1:16.0,14.0->15.1,14.3 b2:22.0,13.0->21.3,12.5 b3:23.0,8.0->23.7,8.6 b4:15.0,5.0->15.3,5.9] [+1146ms]","src":"client"}
{"t":1783657072055,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1110ms]","src":"client"}
{"t":1783657072057,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783657067908 mapName=LobbyA [+1141ms]","src":"client"}
{"t":1783657076269,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783657076433,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:12.7,17.8->12.8,17.9 b1:6.3,17.2->6.3,17.2 b2:12.8,5.8->13.3,5.8 b3:15.2,8.2->14.3,8.5 b4:6.2,7.3->6.0,7.3] [+5523ms]","src":"client"}
{"t":1783657078865,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783657079322,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+8377ms]","src":"client"}
{"t":1783657079854,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+8940ms]","src":"client"}
{"t":1783657080403,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+9494ms]","src":"client"}
{"t":1783657080683,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.3,8.2->22.3,8.2 b1:21.7,12.2->21.5,13.0 b2:19.4,9.4->19.4,9.4 b3:24.9,12.8->24.9,12.8 b4:28.9,6.8->28.9,6.8] [+9532ms]","src":"client"}
{"t":1783657084847,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.9,8.9->16.0,8.9 b1:23.9,8.6->23.9,8.6 b2:19.4,11.3->19.4,11.3 b3:25.7,3.1->25.7,3.1 b4:28.9,6.8->28.9,6.8] [+13936ms]","src":"client"}
{"t":1783657087871,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783657087871,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783657088321,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+17411ms]","src":"client"}
{"t":1783657088876,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.7,8.9->13.9,8.9 b1:12.6,6.8->12.3,7.7 b2:19.4,10.7->19.4,10.6 b3:23.3,11.9->24.3,12.1 b4:12.8,5.9->13.4,6.5] [+17969ms]","src":"client"}
{"t":1783657091642,"cat":"MG1","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-1 จริงหรือไม่ (การ์ด 1)","src":"server"}
{"t":1783657091649,"cat":"MG1","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783657091692,"cat":"MG1","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783657092056,"cat":"MG1","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783657149872,"cat":"MG1","room":"a","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #1 → team progress 1/0/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783657149876,"cat":"MG1","room":"a","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#1 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783657151446,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783657067908 [+0ms]","src":"client"}
{"t":1783657151488,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+18ms]","src":"client"}
{"t":1783657151489,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+18ms]","src":"client"}
{"t":1783657151489,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+18ms]","src":"client"}
{"t":1783657151490,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+19ms]","src":"client"}
{"t":1783657151494,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+19ms]","src":"client"}
{"t":1783657151497,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+19ms]","src":"client"}
{"t":1783657151530,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+19ms]","src":"client"}
{"t":1783657151531,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+21ms]","src":"client"}
{"t":1783657151613,"cat":"LobbyA","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+173ms]","src":"client"}
{"t":1783657151653,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783657152550,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783657152583,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+1142ms]","src":"client"}
{"t":1783657152583,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1143ms]","src":"client"}
{"t":1783657152586,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=true pickIdx=0 postCase=true clientMapId=mn8nx46h spaceId=a-1783657067908 mapName=LobbyB [+1168ms]","src":"client"}
{"t":1783657153021,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.9,15.1 b1:15.0,15.0->15.9,15.0 b2:21.0,15.0->20.1,15.1 b3:23.0,12.0->23.5,12.7 b4:24.0,9.0->23.4,9.6] [+1590ms]","src":"client"}
{"t":1783657157388,"cat":"MG2","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-2 วิ่งหลบสิ่งกีดขวาง (การ์ด 2)","src":"server"}
{"t":1783657157398,"cat":"MG2","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #2","src":"server"}
{"t":1783657158307,"cat":"LobbyB","room":"a-1783657067908","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.1,16.9->26.1,16.9 b1:27.8,14.3->27.8,14.3 b2:5.1,16.5->5.1,16.5 b3:26.2,12.6->26.5,12.1 b4:15.0,16.8->15.0,16.8] [+6896ms]","src":"client"}
{"t":1783657159395,"cat":"MG2","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783657159813,"cat":"MG2","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783664301270,"cat":"LobbyA","room":"Quiz Battle ห้อง 1","who":"ผู้เล่น2359","ev":"join","detail":"สี#1 · คน 1 + บอท 0","src":"server"}
{"t":1783664827071,"cat":"LobbyA","room":"Quiz Battle ห้อง 2","who":"ผู้เล่น1948","ev":"join","detail":"สี#1 · คน 1 + บอท 0","src":"server"}
{"t":1783666358222,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666352804 [+0ms]","src":"client"}
{"t":1783666358259,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+35ms]","src":"client"}
{"t":1783666358269,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+36ms]","src":"client"}
{"t":1783666358292,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+37ms]","src":"client"}
{"t":1783666358293,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+38ms]","src":"client"}
{"t":1783666358293,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+37ms]","src":"client"}
{"t":1783666358294,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+37ms]","src":"client"}
{"t":1783666358294,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+37ms]","src":"client"}
{"t":1783666358387,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+176ms]","src":"client"}
{"t":1783666358410,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666359274,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1032ms]","src":"client"}
{"t":1783666359275,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783666352804 mapName=LobbyA [+1062ms]","src":"client"}
{"t":1783666359275,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1032ms]","src":"client"}
{"t":1783666359276,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->9.4,14.3 b1:16.0,14.0->16.4,13.5 b2:22.0,13.0->21.4,12.9 b3:23.0,8.0->23.1,8.7 b4:15.0,5.0->14.5,5.4] [+1066ms]","src":"client"}
{"t":1783666362173,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783666363448,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.5,16.6->6.5,16.6 b1:19.2,13.1->19.2,13.1 b2:20.3,11.6->20.3,11.6 b3:23.7,15.1->23.7,15.1 b4:12.0,10.6->12.5,10.5] [+5242ms]","src":"client"}
{"t":1783666367403,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666367599,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.5,14.2->23.1,14.0 b1:6.2,10.3->6.0,10.4 b2:14.6,11.0->15.0,10.9 b3:8.7,5.2->9.4,5.2 b4:28.7,7.8->28.6,7.7] [+9377ms]","src":"client"}
{"t":1783666367878,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+9667ms]","src":"client"}
{"t":1783666368139,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+9927ms]","src":"client"}
{"t":1783666368635,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+10425ms]","src":"client"}
{"t":1783666370668,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783666370668,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783666371139,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+12929ms]","src":"client"}
{"t":1783666371587,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.0,16.9->28.0,16.9 b1:7.7,10.4->7.7,10.4 b2:19.2,6.3->20.0,6.3 b3:27.1,7.6->26.2,7.5 b4:28.3,8.8->28.3,8.8] [+13378ms]","src":"client"}
{"t":1783666375602,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.5,17.0->22.5,17.0 b1:7.7,10.4->7.7,10.4 b2:17.1,16.7->17.8,16.3 b3:21.6,8.8->22.5,9.2 b4:20.9,16.3->21.2,15.8] [+17391ms]","src":"client"}
{"t":1783666379652,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.5,17.0->22.5,17.0 b1:6.3,16.7->5.4,16.4 b2:28.9,8.3->28.9,8.3 b3:28.6,12.2->28.6,12.2 b4:16.8,5.5->17.4,6.2] [+21428ms]","src":"client"}
{"t":1783666381323,"cat":"MG3","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-3 Tower block (การ์ด 1)","src":"server"}
{"t":1783666381330,"cat":"MG3","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783666381372,"cat":"MG3","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666381781,"cat":"MG3","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666409822,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666352804 [+0ms]","src":"client"}
{"t":1783666409868,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+16ms]","src":"client"}
{"t":1783666409868,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+16ms]","src":"client"}
{"t":1783666409869,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+16ms]","src":"client"}
{"t":1783666409869,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+17ms]","src":"client"}
{"t":1783666409910,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+17ms]","src":"client"}
{"t":1783666409912,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+19ms]","src":"client"}
{"t":1783666409913,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+17ms]","src":"client"}
{"t":1783666409916,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+17ms]","src":"client"}
{"t":1783666410031,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+172ms]","src":"client"}
{"t":1783666410200,"cat":"MG3","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666410254,"cat":"MG3","room":"a","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #1 → team progress 1/0/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783666417483,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666352804 [+0ms]","src":"client"}
{"t":1783666417529,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+6ms]","src":"client"}
{"t":1783666417530,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+6ms]","src":"client"}
{"t":1783666417530,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+6ms]","src":"client"}
{"t":1783666417532,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+6ms]","src":"client"}
{"t":1783666417569,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+7ms]","src":"client"}
{"t":1783666417571,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+9ms]","src":"client"}
{"t":1783666417572,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+7ms]","src":"client"}
{"t":1783666417572,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+7ms]","src":"client"}
{"t":1783666417691,"cat":"LobbyA","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+200ms]","src":"client"}
{"t":1783666417840,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666418619,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783666418647,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+1138ms]","src":"client"}
{"t":1783666418649,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1138ms]","src":"client"}
{"t":1783666418653,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=true pickIdx=0 postCase=true clientMapId=mn8nx46h spaceId=a-1783666352804 mapName=LobbyB [+1161ms]","src":"client"}
{"t":1783666419222,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->9.5,14.2 b1:15.0,15.0->14.1,15.1 b2:21.0,15.0->20.3,14.4 b3:23.0,12.0->22.2,11.7 b4:24.0,9.0->23.1,8.7] [+1732ms]","src":"client"}
{"t":1783666420929,"cat":"MG4","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-4 คำศัพท์ในกระบวนการยุติธรรม (การ์ด 2)","src":"server"}
{"t":1783666420935,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #2","src":"server"}
{"t":1783666424483,"cat":"LobbyB","room":"a-1783666352804","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:5.6,9.2->5.6,9.2 b1:5.5,16.3->5.5,16.4 b2:16.8,13.3->16.8,13.3 b3:15.0,7.8->14.5,7.6 b4:12.3,5.3->12.3,5.2] [+6994ms]","src":"client"}
{"t":1783666424483,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666425019,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666432343,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=1 deck=29 rounds=0/10","src":"server"}
{"t":1783666441447,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 1/10 q=1 winner=[TC169] BOT __pv_bot_1 correctIdx=4 willEnd=false","src":"server"}
{"t":1783666443947,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=2 deck=28 rounds=1/10","src":"server"}
{"t":1783666476772,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666473644 [+0ms]","src":"client"}
{"t":1783666476811,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+12ms]","src":"client"}
{"t":1783666476814,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+16ms]","src":"client"}
{"t":1783666476814,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+16ms]","src":"client"}
{"t":1783666476819,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+17ms]","src":"client"}
{"t":1783666476831,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+17ms]","src":"client"}
{"t":1783666476848,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+17ms]","src":"client"}
{"t":1783666476853,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+17ms]","src":"client"}
{"t":1783666476903,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+137ms]","src":"client"}
{"t":1783666476936,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666477621,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+830ms]","src":"client"}
{"t":1783666477637,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+831ms]","src":"client"}
{"t":1783666477639,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783666473644 mapName=LobbyA [+860ms]","src":"client"}
{"t":1783666477639,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->9.5,13.8 b1:16.0,14.0->15.5,13.7 b2:22.0,13.0->22.0,12.5 b3:23.0,8.0->23.1,8.5 b4:15.0,5.0->15.5,5.3] [+865ms]","src":"client"}
{"t":1783666480239,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783666481812,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.0,13.6->8.5,13.4 b1:15.0,13.5->14.5,13.2 b2:22.0,11.9->21.9,11.3 b3:23.2,9.1->23.2,9.7 b4:16.0,5.6->16.4,5.8] [+5047ms]","src":"client"}
{"t":1783666482859,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666486919,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.5,9.9->14.5,9.8 b1:12.7,13.9->13.1,13.6 b2:17.2,16.1->17.7,16.1 b3:13.0,5.0->12.9,5.0 b4:20.8,12.1->20.3,12.0] [+10148ms]","src":"client"}
{"t":1783666486920,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+10153ms]","src":"client"}
{"t":1783666487058,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+10291ms]","src":"client"}
{"t":1783666487561,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+10792ms]","src":"client"}
{"t":1783666488729,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783666488729,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783666489555,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+12785ms]","src":"client"}
{"t":1783666490947,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.2,11.2->19.1,11.9 b1:21.2,15.6->21.5,14.8 b2:25.9,15.2->25.9,15.2 b3:9.5,10.8->8.8,11.1 b4:8.5,4.2->8.7,4.3] [+14177ms]","src":"client"}
{"t":1783666491134,"cat":"MG5","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-5 กระโดดขึ้นแท่น (การ์ด 3)","src":"server"}
{"t":1783666491138,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783666491181,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666491576,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666520830,"cat":"MG5","room":"a","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #3 → team progress 0/0/1 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783666520841,"cat":"MG5","room":"a","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#3 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783666522320,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666473644 [+0ms]","src":"client"}
{"t":1783666522357,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+8ms]","src":"client"}
{"t":1783666522362,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+8ms]","src":"client"}
{"t":1783666522364,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+9ms]","src":"client"}
{"t":1783666522368,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+9ms]","src":"client"}
{"t":1783666522376,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+9ms]","src":"client"}
{"t":1783666522379,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+9ms]","src":"client"}
{"t":1783666522396,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+9ms]","src":"client"}
{"t":1783666522410,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+11ms]","src":"client"}
{"t":1783666522505,"cat":"LobbyA","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+163ms]","src":"client"}
{"t":1783666522507,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666523275,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783666523283,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+949ms]","src":"client"}
{"t":1783666523284,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+948ms]","src":"client"}
{"t":1783666523292,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=a-1783666473644 mapName=LobbyB [+970ms]","src":"client"}
{"t":1783666523322,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->10.5,14.7 b1:15.0,15.0->14.4,15.1 b2:21.0,15.0->21.6,15.2 b3:23.0,12.0->23.6,11.9 b4:24.0,9.0->23.7,9.5] [+976ms]","src":"client"}
{"t":1783666528379,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.9,7.2->19.4,7.0 b1:8.1,5.7->8.1,5.4 b2:22.8,11.9->22.4,11.5 b3:27.9,10.9->27.9,10.9 b4:22.9,10.9->22.4,10.9] [+6075ms]","src":"client"}
{"t":1783666532411,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.2,5.5->20.2,5.5 b1:17.1,5.4->17.1,5.4 b2:14.1,14.7->13.1,14.5 b3:19.3,9.3->19.3,9.3 b4:5.2,15.5->5.2,15.5] [+10109ms]","src":"client"}
{"t":1783666536447,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.8,11.2->26.3,12.0 b1:23.8,15.3->24.7,15.6 b2:8.0,12.2->8.7,12.7 b3:19.3,9.3->19.3,9.3 b4:19.4,10.1->19.5,10.1] [+14141ms]","src":"client"}
{"t":1783666540482,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.0,16.8->23.0,16.8 b1:21.5,11.1->21.1,10.2 b2:5.4,9.4->5.4,9.4 b3:19.1,11.7->19.1,11.7 b4:16.5,6.3->15.5,6.3] [+18178ms]","src":"client"}
{"t":1783666544514,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.0,16.8->19.1,12.0 b1:20.0,9.3->8.2,7.5 b2:5.4,9.4->27.8,14.8 b3:19.1,11.7->19.5,10.1 b4:13.9,6.3->8.5,6.2] [+22214ms]","src":"client"}
{"t":1783666548547,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.0,16.8->19.1,12.0 b1:20.0,9.3->21.7,5.5 b2:5.4,9.4->21.6,11.0 b3:19.1,11.7->19.2,9.4 b4:13.9,6.3->9.9,10.5] [+26245ms]","src":"client"}
{"t":1783666552581,"cat":"LobbyB","room":"a-1783666473644","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:9.7,5.8->8.9,5.4 b1:23.5,8.7->22.5,8.5 b2:7.4,13.8->7.4,13.8 b3:8.4,8.0->8.4,8.0 b4:21.8,9.4->20.9,9.6] [+30279ms]","src":"client"}
{"t":1783666555601,"cat":"MG5","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-5 กระโดดขึ้นแท่น (การ์ด 3)","src":"server"}
{"t":1783666555605,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783666555652,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666556026,"cat":"MG5","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666628901,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666625935 [+1ms]","src":"client"}
{"t":1783666628940,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+10ms]","src":"client"}
{"t":1783666628961,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+14ms]","src":"client"}
{"t":1783666628967,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+14ms]","src":"client"}
{"t":1783666628969,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+15ms]","src":"client"}
{"t":1783666628971,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+15ms]","src":"client"}
{"t":1783666628973,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+15ms]","src":"client"}
{"t":1783666628976,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+15ms]","src":"client"}
{"t":1783666629088,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+171ms]","src":"client"}
{"t":1783666629092,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666629833,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+906ms]","src":"client"}
{"t":1783666629834,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+907ms]","src":"client"}
{"t":1783666629839,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783666625935 mapName=LobbyA [+937ms]","src":"client"}
{"t":1783666630278,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->10.6,13.9 b1:16.0,14.0->16.5,13.7 b2:22.0,13.0->22.0,12.4 b3:23.0,8.0->22.7,8.5 b4:15.0,5.0->15.4,5.4] [+1389ms]","src":"client"}
{"t":1783666632212,"cat":"LobbyA","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783666639236,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,10.8->14.8,10.8 b1:25.5,7.2->25.1,7.5 b2:21.2,5.4->21.2,5.4 b3:17.2,13.3->17.2,13.3 b4:23.8,11.2->24.2,10.9] [+10341ms]","src":"client"}
{"t":1783666639233,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666639686,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+10793ms]","src":"client"}
{"t":1783666639777,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+10881ms]","src":"client"}
{"t":1783666640376,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+11488ms]","src":"client"}
{"t":1783666643103,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783666643103,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783666643275,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.0,5.0->16.0,5.0 b1:25.4,3.2->25.4,3.2 b2:13.1,10.7->14.0,10.9 b3:20.0,10.6->20.3,9.7 b4:22.8,6.3->21.9,6.3] [+14383ms]","src":"client"}
{"t":1783666643562,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+14670ms]","src":"client"}
{"t":1783666644593,"cat":"MG6","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-6 ยิงอุกาบาต Violent Crime (การ์ด 1)","src":"server"}
{"t":1783666644597,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #1","src":"server"}
{"t":1783666644636,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666645026,"cat":"MG6","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666735334,"cat":"MG6","room":"a","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #1 → team progress 1/0/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783666735337,"cat":"MG6","room":"a","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#1 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783666737044,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666625935 [+0ms]","src":"client"}
{"t":1783666737083,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+8ms]","src":"client"}
{"t":1783666737084,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+9ms]","src":"client"}
{"t":1783666737103,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+9ms]","src":"client"}
{"t":1783666737106,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+9ms]","src":"client"}
{"t":1783666737106,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+9ms]","src":"client"}
{"t":1783666737115,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+9ms]","src":"client"}
{"t":1783666737119,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+9ms]","src":"client"}
{"t":1783666737127,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+11ms]","src":"client"}
{"t":1783666737238,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+174ms]","src":"client"}
{"t":1783666737283,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666738004,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783666738032,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+975ms]","src":"client"}
{"t":1783666738039,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+975ms]","src":"client"}
{"t":1783666738043,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=true pickIdx=0 postCase=true clientMapId=mn8nx46h spaceId=a-1783666625935 mapName=LobbyB [+996ms]","src":"client"}
{"t":1783666738477,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->11.0,15.0 b1:15.0,15.0->14.3,14.4 b2:21.0,15.0->21.7,14.4 b3:23.0,12.0->23.8,11.5 b4:24.0,9.0->24.6,8.2] [+1438ms]","src":"client"}
{"t":1783666741418,"cat":"MG4","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-4 คำศัพท์ในกระบวนการยุติธรรม (การ์ด 2)","src":"server"}
{"t":1783666741423,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #2","src":"server"}
{"t":1783666746137,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.0,15.4->25.0,15.4 b1:6.9,9.2->6.9,9.2 b2:27.4,14.0->27.5,14.5 b3:26.6,5.9->26.1,5.8 b4:24.1,5.0->24.1,5.2] [+9101ms]","src":"client"}
{"t":1783666748031,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666748397,"cat":"MG4","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666761079,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=1 deck=29 rounds=0/10","src":"server"}
{"t":1783666770739,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 1/10 q=1 winner=[TC169] BOT __pv_bot_1 correctIdx=4 willEnd=false","src":"server"}
{"t":1783666773240,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=2 deck=28 rounds=1/10","src":"server"}
{"t":1783666791242,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 2/10 q=2 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=8 willEnd=false","src":"server"}
{"t":1783666793742,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=3 deck=27 rounds=2/10","src":"server"}
{"t":1783666807438,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 3/10 q=3 winner=[TC169] BOT __pv_bot_4 correctIdx=10 willEnd=false","src":"server"}
{"t":1783666809939,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=4 deck=26 rounds=3/10","src":"server"}
{"t":1783666827939,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 4/10 q=4 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=13 willEnd=false","src":"server"}
{"t":1783666830439,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=5 deck=25 rounds=4/10","src":"server"}
{"t":1783666848440,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 5/10 q=5 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=12 willEnd=false","src":"server"}
{"t":1783666850940,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=6 deck=24 rounds=5/10","src":"server"}
{"t":1783666868940,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 6/10 q=6 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=7 willEnd=false","src":"server"}
{"t":1783666871440,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=7 deck=23 rounds=6/10","src":"server"}
{"t":1783666889440,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 7/10 q=7 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=1 willEnd=false","src":"server"}
{"t":1783666891939,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=8 deck=22 rounds=7/10","src":"server"}
{"t":1783666909941,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 8/10 q=8 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=5 willEnd=false","src":"server"}
{"t":1783666912442,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=9 deck=21 rounds=8/10","src":"server"}
{"t":1783666930442,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 9/10 q=9 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=5 willEnd=false","src":"server"}
{"t":1783666932942,"cat":"MG4","room":"a","who":"","ev":"mg4-read","detail":"q=10 deck=20 rounds=9/10","src":"server"}
{"t":1783666950942,"cat":"MG4","room":"a","who":"","ev":"mg4-round","detail":"resolve 10/10 q=10 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=12 willEnd=true","src":"server"}
{"t":1783666951843,"cat":"MG4","room":"a","who":"","ev":"mg4-end","detail":"END rounds=10/10","src":"server"}
{"t":1783666951853,"cat":"MG4","room":"a","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #2 → team progress 1/1/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783666951856,"cat":"MG4","room":"a","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#2 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783666958604,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"lobby-open","detail":"space=a-1783666625935 [+0ms]","src":"client"}
{"t":1783666958639,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+14ms]","src":"client"}
{"t":1783666958645,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-start","detail":" [+15ms]","src":"client"}
{"t":1783666958649,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"manifest-done","detail":" [+15ms]","src":"client"}
{"t":1783666958656,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"colors-resolved","detail":" [+15ms]","src":"client"}
{"t":1783666958657,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"mychar-tinted","detail":"roomJoinReady=false [+16ms]","src":"client"}
{"t":1783666958667,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-occupants-done","detail":" [+16ms]","src":"client"}
{"t":1783666958677,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"preload-ready(occupants)","detail":" [+16ms]","src":"client"}
{"t":1783666958692,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=true [+18ms]","src":"client"}
{"t":1783666958779,"cat":"LobbyA","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"socket-connect","detail":" [+168ms]","src":"client"}
{"t":1783666958826,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783666959624,"cat":"LobbyB","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783666959651,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=5 [+1052ms]","src":"client"}
{"t":1783666959656,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1052ms]","src":"client"}
{"t":1783666959663,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"suspect-join","detail":"phaseActive=true pickIdx=1 postCase=true clientMapId=mn8nx46h spaceId=a-1783666625935 mapName=LobbyB [+1073ms]","src":"client"}
{"t":1783666960107,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,15.0->9.7,15.5 b1:15.0,15.0->14.6,15.4 b2:21.0,15.0->20.6,14.6 b3:23.0,12.0->22.5,11.7 b4:24.0,9.0->23.4,9.0] [+1525ms]","src":"client"}
{"t":1783666962026,"cat":"MG7","room":"a","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-7 ยิง Mega Virus (การ์ด 3)","src":"server"}
{"t":1783666962029,"cat":"MG7","room":"a","who":"กัน จอมพลัง","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783666965936,"cat":"LobbyB","room":"a-1783666625935","who":"กัน จอมพลัง","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.4,13.2->18.8,13.2 b1:11.9,16.6->11.9,16.6 b2:9.1,5.4->9.0,4.9 b3:19.5,11.6->19.5,11.6 b4:19.1,9.7->19.1,9.7] [+7356ms]","src":"client"}
{"t":1783666965934,"cat":"MG7","room":"a","who":"กัน จอมพลัง","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783666966438,"cat":"MG7","room":"a","who":"กัน จอมพลัง","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
{"t":1783670382642,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"manifest-done","detail":" [+42ms]","src":"client"}
{"t":1783670382642,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-start","detail":" [+41ms]","src":"client"}
{"t":1783670382643,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"lobby-open","detail":"space=1-1783670378986 [+1ms]","src":"client"}
{"t":1783670382664,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+43ms]","src":"client"}
{"t":1783670382689,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+44ms]","src":"client"}
{"t":1783670382700,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+45ms]","src":"client"}
{"t":1783670382700,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+45ms]","src":"client"}
{"t":1783670382808,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"socket-connect","detail":" [+268ms]","src":"client"}
{"t":1783670382805,"cat":"LobbyA","room":"1","who":"ผู้เล่น","ev":"join","detail":"สี#4 · คน 1 + บอท 3","src":"server"}
{"t":1783670383422,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=3 [+901ms]","src":"client"}
{"t":1783670383476,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+902ms]","src":"client"}
{"t":1783670383534,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=1-1783670378986 mapName=LobbyA [+977ms]","src":"client"}
{"t":1783670383557,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:10.0,14.0->10.9,13.8 b1:16.0,14.0->15.4,14.7 b2:22.0,13.0->22.8,13.3] [+991ms]","src":"client"}
{"t":1783670388474,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:19.9,13.1->20.3,12.7 b1:24.7,13.6->25.3,13.5 b2:22.7,14.8->22.1,14.8] [+5972ms]","src":"client"}
{"t":1783670404569,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+22065ms]","src":"client"}
{"t":1783670417718,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:18.2,5.1->18.2,5.1 b1:27.9,13.0->27.9,13.0 b2:10.8,14.9->10.2,14.9] [+35206ms]","src":"client"}
{"t":1783670421727,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:17.0,13.2->17.8,13.1 b1:20.8,17.0->20.8,17.0 b2:16.5,9.5->16.5,9.5] [+39213ms]","src":"client"}
{"t":1783670425746,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:29.6,11.6->29.6,11.6 b1:29.7,10.8->29.7,10.8 b2:9.5,5.0->8.8,4.4] [+43243ms]","src":"client"}
{"t":1783670429777,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:9.5,4.7->8.6,4.4 b1:6.0,7.5->6.0,7.5 b2:11.7,4.1->11.7,4.1] [+47274ms]","src":"client"}
{"t":1783670433827,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:9.4,4.1->9.4,4.1 b1:14.9,12.4->14.9,12.4 b2:29.2,8.3->28.3,8.1] [+51315ms]","src":"client"}
{"t":1783670435755,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+53233ms]","src":"client"}
{"t":1783670437386,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+54870ms]","src":"client"}
{"t":1783670437858,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:23.9,11.8->22.9,11.8 b1:25.4,15.9->25.9,16.2 b2:7.7,16.1->6.9,16.7] [+55356ms]","src":"client"}
{"t":1783670438971,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+56460ms]","src":"client"}
{"t":1783670440508,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+57999ms]","src":"client"}
{"t":1783670440954,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+58449ms]","src":"client"}
{"t":1783670441158,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+58654ms]","src":"client"}
{"t":1783670441366,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+58856ms]","src":"client"}
{"t":1783670441604,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+59100ms]","src":"client"}
{"t":1783670441773,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+59258ms]","src":"client"}
{"t":1783670441906,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:20.2,11.7->20.2,11.7 b1:17.8,4.3->17.8,4.3 b2:27.9,13.0->28.6,12.5] [+59408ms]","src":"client"}
{"t":1783670441951,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+59444ms]","src":"client"}
{"t":1783670442110,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+59610ms]","src":"client"}
{"t":1783670442660,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+60158ms]","src":"client"}
{"t":1783670443012,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+60510ms]","src":"client"}
{"t":1783670443250,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+60747ms]","src":"client"}
{"t":1783670443497,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+60991ms]","src":"client"}
{"t":1783670443719,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+61213ms]","src":"client"}
{"t":1783670445927,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:16.0,15.3->16.0,15.3 b1:15.5,6.8->14.8,7.5 b2:29.6,11.1->29.6,11.1] [+63425ms]","src":"client"}
{"t":1783670449976,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:10.0,13.3->10.8,12.9 b1:6.3,12.8->6.3,12.8 b2:29.7,7.5->29.7,7.5] [+67473ms]","src":"client"}
{"t":1783670453977,"cat":"LobbyA","room":"1","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
{"t":1783670453983,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mobile-center-btn","detail":"[TC177] แตะปุ่ม START\/center โดยตรง (มือถือ ไม่ใช้ F) [+71476ms]","src":"client"}
{"t":1783670454166,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:15.4,9.9->15.3,9.9 b1:22.9,17.3->22.9,17.3 b2:12.5,9.1->12.4,9.1] [+71527ms]","src":"client"}
{"t":1783670458052,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:15.1,9.9->15.1,9.9 b1:8.3,8.7->8.3,8.2 b2:22.1,9.1->21.3,8.6] [+75537ms]","src":"client"}
{"t":1783670461947,"cat":"LobbyB","room":"1","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783670462180,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:27.8,13.3->27.4,15.0 b1:11.8,13.9->12.6,15.6 b2:16.7,15.5->17.3,14.5] [+79647ms]","src":"client"}
{"t":1783670462396,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+79893ms]","src":"client"}
{"t":1783670463993,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+81480ms]","src":"client"}
{"t":1783670465093,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+82590ms]","src":"client"}
{"t":1783670466223,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:20.3,13.9->18.1,13.2 b1:27.9,16.8->27.9,16.8 b2:10.5,5.9->8.4,5.0] [+83693ms]","src":"client"}
{"t":1783670470296,"cat":"LobbyB","room":"1","who":"ผู้เล่น","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
{"t":1783670470296,"cat":"LobbyB","room":"1","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
{"t":1783670472970,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:11.5,11.8->10.9,11.6 b1:27.9,16.8->27.9,16.8 b2:11.2,7.0->11.7,7.2] [+90441ms]","src":"client"}
{"t":1783670472971,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+90451ms]","src":"client"}
{"t":1783670477009,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:25.5,17.0->25.5,17.0 b1:19.1,9.2->19.1,9.2 b2:28.7,8.8->28.7,8.7] [+94498ms]","src":"client"}
{"t":1783670481046,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:19.3,12.4->19.2,11.9 b1:18.8,9.0->18.1,8.7 b2:27.7,11.3->27.7,11.4] [+98530ms]","src":"client"}
{"t":1783670485088,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:19.2,9.7->19.2,9.7 b1:8.5,6.7->8.5,6.7 b2:27.7,11.5->27.7,11.5] [+102569ms]","src":"client"}
{"t":1783670489111,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:19.2,9.2->19.2,9.2 b1:20.7,14.5->21.6,14.7 b2:26.2,9.8->27.0,10.4] [+106601ms]","src":"client"}
{"t":1783670493143,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:19.5,11.6->19.5,11.8 b1:19.4,12.4->19.4,12.5 b2:28.9,12.6->28.9,12.6] [+110637ms]","src":"client"}
{"t":1783670494410,"cat":"MG4","room":"1","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-4 คำศัพท์ในกระบวนการยุติธรรม (การ์ด 2)","src":"server"}
{"t":1783670494415,"cat":"MG4","room":"1","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #2","src":"server"}
{"t":1783670494458,"cat":"MG4","room":"1","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783670495157,"cat":"MG4","room":"1","who":"ผู้เล่น","ev":"join","detail":"สี#4 · คน 1 + บอท 3","src":"server"}
{"t":1783670520183,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=1 deck=29 rounds=0/10","src":"server"}
{"t":1783670529613,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 1/10 q=1 winner=[TC169] BOT __pv_bot_0 correctIdx=2 willEnd=false","src":"server"}
{"t":1783670532113,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=2 deck=28 rounds=1/10","src":"server"}
{"t":1783670550113,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 2/10 q=2 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=0 willEnd=false","src":"server"}
{"t":1783670552614,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=3 deck=27 rounds=2/10","src":"server"}
{"t":1783670561555,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 3/10 q=3 winner=[TC169] BOT __pv_bot_1 correctIdx=9 willEnd=false","src":"server"}
{"t":1783670564055,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=4 deck=26 rounds=3/10","src":"server"}
{"t":1783670582055,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 4/10 q=4 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=1 willEnd=false","src":"server"}
{"t":1783670584555,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=5 deck=25 rounds=4/10","src":"server"}
{"t":1783670602555,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 5/10 q=5 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=13 willEnd=false","src":"server"}
{"t":1783670605054,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=6 deck=24 rounds=5/10","src":"server"}
{"t":1783670623054,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 6/10 q=6 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=13 willEnd=false","src":"server"}
{"t":1783670625555,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=7 deck=23 rounds=6/10","src":"server"}
{"t":1783670643557,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 7/10 q=7 winner=-(หมดเวลา ไม่มีคนถูก) correctIdx=10 willEnd=false","src":"server"}
{"t":1783670646057,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=8 deck=22 rounds=7/10","src":"server"}
{"t":1783670654552,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 8/10 q=8 winner=[TC169] BOT __pv_bot_1 correctIdx=11 willEnd=false","src":"server"}
{"t":1783670657052,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=9 deck=21 rounds=8/10","src":"server"}
{"t":1783670673222,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 9/10 q=9 winner=[TC169] BOT __pv_bot_0 correctIdx=2 willEnd=false","src":"server"}
{"t":1783670675722,"cat":"MG4","room":"1","who":"","ev":"mg4-read","detail":"q=10 deck=20 rounds=9/10","src":"server"}
{"t":1783670689538,"cat":"MG4","room":"1","who":"","ev":"mg4-round","detail":"resolve 10/10 q=10 winner=[TC169] BOT __pv_bot_0 correctIdx=3 willEnd=true","src":"server"}
{"t":1783670690440,"cat":"MG4","room":"1","who":"","ev":"mg4-end","detail":"END rounds=10/10","src":"server"}
{"t":1783670690448,"cat":"MG4","room":"1","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #2 → team progress 0/1/0 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783670690451,"cat":"MG4","room":"1","who":"","ev":"evidence-grant","detail":"[TC182] แจกหลักฐาน suspect#2 → 1 key · ใบ/key=[1] (1/key · pass)","src":"server"}
{"t":1783670718184,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"lobby-open","detail":"space=1-1783670378986 [+1ms]","src":"client"}
{"t":1783670718232,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+37ms]","src":"client"}
{"t":1783670718236,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-start","detail":" [+46ms]","src":"client"}
{"t":1783670718276,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"manifest-done","detail":" [+47ms]","src":"client"}
{"t":1783670718278,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+50ms]","src":"client"}
{"t":1783670718278,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+49ms]","src":"client"}
{"t":1783670718287,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+56ms]","src":"client"}
{"t":1783670718287,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+54ms]","src":"client"}
{"t":1783670718408,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"socket-connect","detail":" [+216ms]","src":"client"}
{"t":1783670718463,"cat":"LobbyB","room":"1","who":"ผู้เล่น","ev":"join","detail":"สี#4 · คน 1 + บอท 3","src":"server"}
{"t":1783670720101,"cat":"LobbyB","room":"1","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783670720116,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=3 [+1907ms]","src":"client"}
{"t":1783670720153,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1908ms]","src":"client"}
{"t":1783670720199,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=1 postCase=true clientMapId=mn8nx46h spaceId=1-1783670378986 mapName=LobbyB [+1996ms]","src":"client"}
{"t":1783670720255,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:10.0,15.0->10.2,13.9 b1:15.0,15.0->14.2,14.3 b2:21.0,15.0->20.2,14.3] [+2066ms]","src":"client"}
{"t":1783670743314,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:12.0,6.5->12.0,6.5 b1:6.0,9.2->6.4,9.2 b2:10.2,6.7->10.2,6.7] [+25119ms]","src":"client"}
{"t":1783670753499,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:29.0,8.3->29.0,8.3 b1:16.1,5.3->16.1,5.2 b2:10.9,6.4->10.9,6.4] [+35301ms]","src":"client"}
{"t":1783670760149,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:25.6,10.9->25.1,11.2 b1:12.7,14.1->12.2,14.2 b2:10.4,14.8->10.4,15.3] [+41957ms]","src":"client"}
{"t":1783670764200,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:5.5,15.9->5.5,15.9 b1:28.5,12.9->28.5,12.9 b2:8.4,6.1->8.4,6.1] [+46000ms]","src":"client"}
{"t":1783670768229,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:5.6,17.0->5.6,17.0 b1:17.6,8.8->16.7,8.7 b2:16.4,13.7->17.2,14.1] [+50039ms]","src":"client"}
{"t":1783670772252,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:5.6,17.0->6.2,17.0 b1:11.2,14.5->11.6,15.4 b2:19.0,17.0->18.0,17.0] [+54062ms]","src":"client"}
{"t":1783670776302,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.4,16.2->8.4,16.2 b1:27.6,12.9->28.5,12.7 b2:7.4,14.4->7.4,14.4] [+58096ms]","src":"client"}
{"t":1783670780329,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:5.2,16.6->5.2,16.6 b1:19.2,11.5->19.2,11.5 b2:5.1,9.1->5.0,9.1] [+62143ms]","src":"client"}
{"t":1783670784356,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:12.7,10.5->12.7,10.5 b1:27.7,16.7->27.7,16.7 b2:24.4,9.1->23.6,8.5] [+66160ms]","src":"client"}
{"t":1783670788400,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:15.4,13.3->14.8,12.8 b1:19.3,10.2->19.3,9.9 b2:23.8,13.6->24.3,13.6] [+70197ms]","src":"client"}
{"t":1783670792416,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.5,4.4->8.5,4.4 b1:11.3,8.2->12.1,8.9 b2:18.4,16.4->17.4,16.6] [+74227ms]","src":"client"}
{"t":1783670796473,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.5,4.4->8.5,4.4 b1:27.8,15.4->27.8,15.4 b2:11.9,15.0->12.9,14.8] [+78258ms]","src":"client"}
{"t":1783670800306,"cat":"MG7","room":"1","who":"","ev":"game-start","detail":"เริ่มมินิเกม: Minigame-7 ยิง Mega Virus (การ์ด 3)","src":"server"}
{"t":1783670800310,"cat":"MG7","room":"1","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] เริ่มสืบสวน OK — ผู้เล่นครบ 1 คน · ผู้ต้องสงสัย #3","src":"server"}
{"t":1783670800360,"cat":"MG7","room":"1","who":"ผู้เล่น","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
{"t":1783670800933,"cat":"MG7","room":"1","who":"ผู้เล่น","ev":"join","detail":"สี#4 · คน 1 + บอท 3","src":"server"}
{"t":1783671147164,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"lobby-open","detail":"space=1-1783670378986 [+1ms]","src":"client"}
{"t":1783671147240,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+88ms]","src":"client"}
{"t":1783671147273,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-start","detail":" [+102ms]","src":"client"}
{"t":1783671147311,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"manifest-done","detail":" [+111ms]","src":"client"}
{"t":1783671147313,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+122ms]","src":"client"}
{"t":1783671147313,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+113ms]","src":"client"}
{"t":1783671147384,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+134ms]","src":"client"}
{"t":1783671147416,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+144ms]","src":"client"}
{"t":1783671147653,"cat":"LobbyA","room":"1-1783670378986","who":"ผู้เล่น","ev":"socket-connect","detail":" [+505ms]","src":"client"}
{"t":1783671148465,"cat":"MG7","room":"1","who":"ผู้เล่น","ev":"join","detail":"สี#4 · คน 1 + บอท 3","src":"server"}
{"t":1783671148475,"cat":"MG7","room":"1","who":"","ev":"suspect-progress","detail":"[TC179] สืบผู้ต้องสงสัย #3 → team progress 0/1/1 (shared เท่ากันทุกจอ · pass)","src":"server"}
{"t":1783671151847,"cat":"LobbyB","room":"1","who":"ผู้เล่น","ev":"lobbyb-gate","detail":"[TC144] โหลด LobbyB เสร็จ 1/1","src":"server"}
{"t":1783671151872,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+4750ms]","src":"client"}
{"t":1783671156091,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mn8nx46h bots=3 [+8991ms]","src":"client"}
{"t":1783671156135,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=true pickIdx=2 postCase=true clientMapId=mn8nx46h spaceId=1-1783670378986 mapName=LobbyB [+9036ms]","src":"client"}
{"t":1783671156499,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.0,10.0->8.9,14.5 b1:10.0,15.0->14.2,15.8 b2:15.0,15.0->20.6,13.9] [+9401ms]","src":"client"}
{"t":1783671160687,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.0,10.0->27.6,14.1 b1:10.0,15.0->23.0,8.2 b2:15.0,15.0->16.0,8.8] [+13585ms]","src":"client"}
{"t":1783671164735,"cat":"LobbyB","room":"1-1783670378986","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=3 [b0:8.0,10.0->28.2,12.6 b1:10.0,15.0->28.9,8.5 b2:15.0,15.0->5.1,15.1] [+17586ms]","src":"client"}
{"t":1783673105555,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"lobby-open","detail":"space=บางที-1783673101584 [+1ms]","src":"client"}
{"t":1783673105630,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+15ms]","src":"client"}
{"t":1783673105634,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"preload-start","detail":" [+19ms]","src":"client"}
{"t":1783673105699,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"manifest-done","detail":" [+20ms]","src":"client"}
{"t":1783673105705,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"colors-resolved","detail":" [+20ms]","src":"client"}
{"t":1783673105709,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"mychar-tinted","detail":"roomJoinReady=false [+21ms]","src":"client"}
{"t":1783673105709,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"preload-ready(occupants)","detail":" [+21ms]","src":"client"}
{"t":1783673105709,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"preload-occupants-done","detail":" [+21ms]","src":"client"}
{"t":1783673105861,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"socket-connect","detail":" [+290ms]","src":"client"}
{"t":1783673105867,"cat":"LobbyA","room":"บางที","who":"ผู้เล่น","ev":"join","detail":"สี#5 · คน 1 + บอท 5","src":"server"}
{"t":1783673107335,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1788ms]","src":"client"}
{"t":1783673107335,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"loading-hide","detail":"เริ่มเล่นได้ [+1788ms]","src":"client"}
{"t":1783673107405,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=บางที-1783673101584 mapName=LobbyA [+1826ms]","src":"client"}
{"t":1783673107444,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->9.9,13.4 b1:16.0,14.0->16.6,13.9 b2:22.0,13.0->22.6,13.0 b3:23.0,8.0->23.6,7.7 b4:15.0,5.0->14.4,5.0] [+1829ms]","src":"client"}
{"t":1783673112404,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,13.9->18.8,13.3 b1:22.7,10.9->25.0,8.2 b2:26.2,13.4->27.7,13.6 b3:27.0,10.7->28.0,12.5 b4:11.2,4.9->9.2,5.7] [+6280ms]","src":"client"}
{"t":1783673117870,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.5,9.6->20.4,5.1 b1:19.1,10.3->14.7,10.1 b2:23.0,14.2->19.2,15.1 b3:26.4,10.4->25.5,9.7 b4:8.7,8.9->6.1,13.1] [+12222ms]","src":"client"}
{"t":1783673122145,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.1,15.0->13.0,13.1 b1:29.8,9.3->29.8,9.3 b2:6.4,11.3->6.4,12.4 b3:26.8,9.3->25.9,6.0 b4:13.4,11.1->11.2,8.4] [+16585ms]","src":"client"}
{"t":1783673126409,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.0,17.7->21.8,17.7 b1:18.4,6.7->17.7,6.5 b2:6.4,13.5->6.4,13.5 b3:25.3,5.5->25.3,5.5 b4:13.4,7.0->14.1,7.1] [+20847ms]","src":"client"}
{"t":1783673130620,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.9,12.7->28.9,12.7 b1:16.5,4.7->16.5,4.7 b2:6.0,6.6->6.0,6.6 b3:20.4,13.9->20.4,13.9 b4:15.7,17.9->15.7,17.9] [+24903ms]","src":"client"}
{"t":1783673134640,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.7,9.0->18.9,8.7 b1:16.5,4.7->16.5,4.7 b2:12.7,5.9->13.6,5.9 b3:6.6,7.5->6.6,7.5 b4:8.2,17.5->8.1,17.5] [+28936ms]","src":"client"}
{"t":1783673138660,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.2,11.1->21.8,11.7 b1:29.7,10.1->29.7,10.1 b2:16.5,4.6->16.3,4.5 b3:6.0,6.3->6.0,7.2 b4:23.6,9.5->22.7,9.3] [+32971ms]","src":"client"}
{"t":1783673142709,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.5,15.2->6.5,15.2 b1:29.7,10.1->29.7,10.1 b2:15.0,11.5->15.0,11.5 b3:9.8,16.1->10.7,15.8 b4:13.9,6.7->14.9,6.9] [+37006ms]","src":"client"}
{"t":1783673146560,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.5,15.1->6.5,15.1 b1:22.4,10.9->21.8,10.2 b2:7.5,9.2->6.7,9.0 b3:22.9,5.3->22.9,5.3 b4:20.4,12.7->20.4,12.8] [+41007ms]","src":"client"}
{"t":1783673150730,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.6,11.0->14.6,11.0 b1:6.3,8.7->6.3,8.7 b2:6.2,7.4->6.2,7.4 b3:19.0,7.4->19.4,8.0 b4:16.9,4.3->16.9,4.3] [+45023ms]","src":"client"}
{"t":1783673154760,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.6,10.8->14.6,11.0 b1:7.4,8.3->8.3,8.0 b2:18.9,9.9->19.9,10.0 b3:12.6,12.4->12.6,12.4 b4:21.7,8.7->22.5,9.4] [+49058ms]","src":"client"}
{"t":1783673158825,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.6,11.9->22.1,11.5 b1:26.9,14.7->26.9,14.7 b2:27.2,5.1->27.2,5.1 b3:21.9,11.8->21.8,10.9 b4:28.8,12.8->28.8,12.8] [+53095ms]","src":"client"}
{"t":1783673162880,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.4,6.0->16.5,6.2 b1:15.3,7.3->14.4,6.8 b2:27.3,5.1->27.3,5.1 b3:20.6,5.0->20.6,5.0 b4:20.1,12.9->20.1,12.9] [+57131ms]","src":"client"}
{"t":1783673166880,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.5,4.4->18.2,4.4 b1:18.7,9.5->18.7,9.5 b2:20.5,17.7->20.5,17.7 b3:19.5,4.7->19.5,4.7 b4:29.4,5.4->29.5,5.4] [+61162ms]","src":"client"}
{"t":1783673170921,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.4,8.3->15.5,8.7 b1:13.7,5.2->13.6,5.2 b2:14.9,7.8->15.4,7.0 b3:8.9,13.6->8.1,14.2 b4:16.4,6.1->17.3,5.9] [+65203ms]","src":"client"}
{"t":1783673174950,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.8,5.1->22.6,5.2 b1:15.2,5.4->16.1,5.5 b2:13.4,5.5->14.0,5.6 b3:6.4,7.6->6.4,7.7 b4:13.3,7.8->13.2,8.0] [+69244ms]","src":"client"}
{"t":1783673178970,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:29.7,5.8->29.7,5.8 b1:7.8,6.5->7.8,6.5 b2:18.6,4.5->18.6,4.5 b3:6.4,7.8->6.4,7.8 b4:20.9,11.5->20.5,11.6] [+73261ms]","src":"client"}
{"t":1783673183030,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.0,17.8->8.8,17.8 b1:7.8,6.8->7.8,6.8 b2:26.2,10.1->26.9,10.6 b3:12.6,9.8->12.6,9.8 b4:19.9,13.0->19.9,13.0] [+77330ms]","src":"client"}
{"t":1783673187100,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.7,15.5->20.1,14.9 b1:15.2,10.0->16.0,9.7 b2:6.3,4.9->6.3,4.8 b3:25.1,6.6->25.7,6.0 b4:29.9,11.6->29.9,11.6] [+81364ms]","src":"client"}
{"t":1783673191130,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.3,13.1->16.3,13.1 b1:14.1,7.3->14.8,7.7 b2:13.3,6.0->14.0,6.4 b3:30.0,8.5->30.0,8.1 b4:22.7,5.5->22.0,5.3] [+85402ms]","src":"client"}
{"t":1783673195100,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.0,13.6->20.9,14.6 b1:13.9,9.0->12.9,8.9 b2:8.9,4.3->10.0,4.4 b3:30.0,6.6->30.0,6.5 b4:19.4,4.2->19.4,4.2] [+89406ms]","src":"client"}
{"t":1783673199140,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:11.1,13.1->11.9,12.4 b1:12.7,5.2->12.4,5.2 b2:29.4,6.4->29.4,6.4 b3:20.2,12.2->20.2,12.2 b4:20.0,4.6->20.0,4.6] [+93442ms]","src":"client"}
{"t":1783673203205,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.4,5.4->13.4,5.4 b1:14.6,7.4->14.4,8.3 b2:14.2,10.7->14.7,10.3 b3:26.6,14.3->26.6,13.3 b4:29.8,10.4->29.9,9.6] [+97472ms]","src":"client"}
{"t":1783673207199,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.5,12.0->22.1,12.8 b1:25.6,16.8->25.6,16.8 b2:29.6,9.5->29.6,9.5 b3:25.7,5.3->25.7,5.3 b4:25.8,6.3->25.5,7.2] [+101505ms]","src":"client"}
{"t":1783673211290,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.3,4.0->19.3,4.0 b1:26.7,14.7->26.7,14.7 b2:18.3,16.8->17.3,16.7 b3:29.2,8.3->28.4,8.1 b4:13.5,15.0->14.5,14.7] [+105534ms]","src":"client"}
{"t":1783673215266,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.9,9.8->16.8,9.8 b1:18.5,13.4->18.5,13.4 b2:19.6,4.0->19.6,4.0 b3:24.0,9.9->24.7,10.4 b4:22.5,17.8->22.5,17.8] [+109569ms]","src":"client"}
{"t":1783673219350,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.6,9.8->16.6,9.8 b1:18.9,13.4->18.9,13.4 b2:15.0,6.8->14.9,6.8 b3:26.0,17.0->26.0,17.0 b4:18.4,14.1->17.7,13.4] [+113607ms]","src":"client"}
{"t":1783673223359,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.5,5.4->22.5,5.4 b1:14.0,5.8->14.0,5.8 b2:29.3,6.7->29.3,6.7 b3:26.0,17.0->26.0,17.0 b4:14.7,12.1->14.7,12.1] [+117625ms]","src":"client"}
{"t":1783673227360,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.5,5.4->22.5,5.4 b1:22.4,17.9->22.8,17.9 b2:23.2,11.2->23.2,11.2 b3:11.0,14.7->11.9,15.0 b4:14.1,11.6->13.4,11.0] [+121657ms]","src":"client"}
{"t":1783673231435,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.5,5.8->17.5,5.7 b1:11.0,10.7->11.1,11.7 b2:29.3,11.5->29.3,11.5 b3:18.0,13.5->17.9,13.5 b4:10.9,13.9->11.0,13.9] [+125692ms]","src":"client"}
{"t":1783673235420,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:6.2,10.6->6.2,10.6 b1:17.8,4.6->17.8,4.6 b2:29.2,11.5->29.2,11.5 b3:19.8,13.1->18.8,13.1 b4:25.2,9.5->25.8,8.6] [+129725ms]","src":"client"}
{"t":1783673239490,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:13.3,10.7->14.3,10.7 b1:19.9,4.3->19.9,4.3 b2:11.3,13.6->10.3,13.6 b3:16.2,4.5->16.2,4.5 b4:9.5,17.7->8.8,17.8] [+133760ms]","src":"client"}
{"t":1783673243531,"cat":"LobbyA","room":"บางที-1783673101584","who":"ผู้เล่น","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,10.7->14.8,10.7 b1:18.2,13.6->19.2,13.8 b2:6.1,9.7->6.1,9.7 b3:16.2,4.5->16.2,4.5 b4:27.6,13.4->27.6,13.3] [+137795ms]","src":"client"}
{"t":1783695515986,"cat":"LobbyA","room":"A-1782867641433","who":"ผู้เล่น","ev":"lobby-open","detail":"space=A-1782867641433 [+1ms]","src":"client"}
{"t":1783695516030,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+21ms]","src":"client"}
{"t":1783695516033,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"preload-start","detail":" [+23ms]","src":"client"}
{"t":1783695516064,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"manifest-done","detail":" [+23ms]","src":"client"}
{"t":1783695516072,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"colors-resolved","detail":" [+23ms]","src":"client"}
{"t":1783695516074,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"preload-occupants-done","detail":" [+23ms]","src":"client"}
{"t":1783695516075,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"mychar-tinted","detail":"roomJoinReady=false [+23ms]","src":"client"}
{"t":1783695516079,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"preload-ready(occupants)","detail":" [+23ms]","src":"client"}
{"t":1783695517232,"cat":"LobbyA","room":"A-1782867641433","who":"Q phone","ev":"socket-connect","detail":" [+1274ms]","src":"client"}
{"t":1783767626000,"cat":"LobbyA","room":"Quiz Battle ห้อง 8","who":"ผู้เล่น5205","ev":"join","detail":"สี#1 · คน 1 + บอท 0","src":"server"}
{"t":1783767687323,"cat":"LobbyA","room":"Quiz Battle ห้อง 8","who":"ผู้เล่น5205","ev":"join","detail":"สี#1 · คน 1 + บอท 0","src":"server"}
{"t":1783767833166,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"lobby-open","detail":"space=บร้า [+0ms]","src":"client"}
{"t":1783767833288,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"preload-start","detail":" [+64ms]","src":"client"}
{"t":1783767833339,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"manifest-done","detail":" [+66ms]","src":"client"}
{"t":1783767833358,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"colors-resolved","detail":" [+68ms]","src":"client"}
{"t":1783767833364,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"mychar-tinted","detail":"roomJoinReady=false [+69ms]","src":"client"}
{"t":1783767833390,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"preload-occupants-done","detail":" [+70ms]","src":"client"}
{"t":1783767833393,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"preload-ready(occupants)","detail":" [+70ms]","src":"client"}
{"t":1783767833606,"cat":"LobbyA","room":"บร้า","who":"MONE","ev":"socket-connect","detail":" [+459ms]","src":"client"}
{"t":1783767859227,"cat":"LobbyA","room":"Quiz Battle ห้อง 6","who":"ผู้เล่น1008","ev":"join","detail":"สี#5 · คน 1 + บอท 0","src":"server"}