update flow design

This commit is contained in:
2026-06-08 06:18:29 +00:00
parent e611c72514
commit 5d4efcc822
5 changed files with 856 additions and 61 deletions
File diff suppressed because one or more lines are too long
+4 -3
View File
@@ -331,8 +331,9 @@
<label class="editor-bg-scroll-check"><input type="checkbox" id="editor-gauntlet-runway-bg-enabled" checked> เปิดเลื่อน / Enable runway BG</label>
<label>ความเร็ว px/s <input type="number" id="editor-gauntlet-runway-bg-speed" min="8" max="400" step="4" value="48" style="width:5rem" title="ความเร็วเลื่อนแนวนอน (จอ)"></label>
<label title="จุดเกิด (คอลัมน์ซ้ายสุด) เทียบตำแหน่งในแถบรูป START — เก็บเป็น runwaySpawnAlignFrac ในแมป">จุดเกิด vs START (0.020.95) <input type="number" id="editor-gauntlet-runway-bg-align-frac" min="0.02" max="0.95" step="0.01" value="0.32" style="width:4.2rem"></label>
<label title="เส้นจบในรูป FINISH (5) — 0=ซ้ายสุด · คลิกที่พรีวิวรูป 5 ได้">จุดจบในรูป 5 (00.92) <input type="number" id="editor-gauntlet-runway-bg-finish-line-frac" min="0" max="0.92" step="0.01" value="0.34" style="width:4.2rem"></label>
<label title="ตำแหน่งเส้นจบบนจอ (0=ซ้าย 0.55≈กลาง) ก่อนหยุดเลื่อน — finishStopViewportFrac">จุดจบบนจอ (0.08–0.85) <input type="number" id="editor-gauntlet-runway-bg-finish-stop-vp" min="0.08" max="0.85" step="0.01" value="0.55" style="width:4.2rem"></label>
<label title="จุดอ้างอิงในรูป FINISH (5) ที่ต้องแนบคอลัมน์จบ — แนะนำคลิกกลางแถบ FINISH สีเหลือง">จุดอ้างอิงในรูป 5 (00.92) <input type="number" id="editor-gauntlet-runway-bg-finish-line-frac" min="0" max="0.92" step="0.01" value="0.34" style="width:4.2rem"></label>
<label title="คอลัมน์กริดที่เส้น FINISH ต้องแนบ (ว่าง = อัตโนมัติตามขอบขวาพรมแดง) · Alt+คลิกบนแผนที่">คอลัมน์จบบนแผนที่ <input type="number" id="editor-gauntlet-runway-bg-finish-align-tile" min="0" max="99" step="1" placeholder="auto" style="width:4.2rem"></label>
<label title="สำรอง: ตำแหน่งเส้นจบบนจอ (ใช้เมื่อไม่ตั้งคอลัมน์แผนที่)">จุดจบบนจอ (0.08–0.85) <input type="number" id="editor-gauntlet-runway-bg-finish-stop-vp" min="0.08" max="0.85" step="0.01" value="0.55" style="width:4.2rem"></label>
</div>
<div class="editor-card__row editor-card__row--wrap" style="margin-top:0.35rem">
<label>รูปเริ่ม (1) <input type="file" id="editor-gauntlet-runway-bg-start-file" accept="image/*"></label>
@@ -424,7 +425,7 @@
</div>
</div>
<script src="js/version.js?v=0.0258"></script>
<script src="js/editor.js?v=0.0340"></script>
<script src="js/editor.js?v=0.0341"></script>
<div class="version-tag">v —</div>
<!-- ===== QB overlay layout: map เต็มจอ + แถบเครื่องมือลอย ดัก/พับ/ปิดเปิดได้ (เพิ่มทับ ไม่แตะ editor.js) ===== -->
+37 -1
View File
@@ -568,6 +568,7 @@
speedPxPerSec: 48,
runwaySpawnAlignFrac: 0.32,
finishLineInFinishArtFrac: EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_LINE_FRAC,
finishAlignMapTileX: null,
finishStopViewportFrac: EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_STOP_VP,
startImage: null,
loopImage2: null,
@@ -809,6 +810,7 @@
speedPxPerSec: 48,
runwaySpawnAlignFrac: 0.32,
finishLineInFinishArtFrac: EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_LINE_FRAC,
finishAlignMapTileX: null,
finishStopViewportFrac: EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_STOP_VP,
startImage: null,
loopImage2: null,
@@ -830,11 +832,14 @@
const fl = Number.isFinite(flRaw) ? Math.max(0, Math.min(0.92, flRaw)) : EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_LINE_FRAC;
const fsvRaw = Number(raw.finishStopViewportFrac);
const fsv = Number.isFinite(fsvRaw) ? Math.max(0.08, Math.min(0.85, fsvRaw)) : EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_STOP_VP;
const fatRaw = Number(raw.finishAlignMapTileX);
const fat = Number.isFinite(fatRaw) ? Math.max(0, Math.min(99, Math.floor(fatRaw))) : null;
editorGauntletRunwayBgConfig = {
enabled: raw.enabled !== false,
speedPxPerSec: sp,
runwaySpawnAlignFrac: af,
finishLineInFinishArtFrac: fl,
finishAlignMapTileX: fat,
finishStopViewportFrac: fsv,
startImage: typeof raw.startImage === 'string' && raw.startImage.length ? raw.startImage : null,
loopImage2: typeof raw.loopImage2 === 'string' && raw.loopImage2.length ? raw.loopImage2 : null,
@@ -874,6 +879,11 @@
const v = editorGauntletRunwayBgConfig.runwaySpawnAlignFrac;
af.value = String(Number.isFinite(v) ? Math.max(0.02, Math.min(0.95, v)) : 0.32);
}
const fatEl = document.getElementById('editor-gauntlet-runway-bg-finish-align-tile');
if (fatEl) {
const tv = editorGauntletRunwayBgConfig.finishAlignMapTileX;
fatEl.value = Number.isFinite(tv) ? String(Math.floor(tv)) : '';
}
const fsvEl = document.getElementById('editor-gauntlet-runway-bg-finish-stop-vp');
if (fsvEl) {
const sv = editorGauntletRunwayBgConfig.finishStopViewportFrac;
@@ -1003,9 +1013,12 @@
const afv = Math.max(0.02, Math.min(0.95, Number(afEl && afEl.value) || 0.32));
const flEl = document.getElementById('editor-gauntlet-runway-bg-finish-line-frac');
const flv = Math.max(0, Math.min(0.92, Number(flEl && flEl.value) || EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_LINE_FRAC));
const fatEl = document.getElementById('editor-gauntlet-runway-bg-finish-align-tile');
const fatRaw = fatEl && fatEl.value !== '' ? Number(fatEl.value) : NaN;
const fatv = Number.isFinite(fatRaw) ? Math.max(0, Math.min(99, Math.floor(fatRaw))) : null;
const fsvEl = document.getElementById('editor-gauntlet-runway-bg-finish-stop-vp');
const fsv = Math.max(0.08, Math.min(0.85, Number(fsvEl && fsvEl.value) || EDITOR_GAUNTLET_RUNWAY_DEFAULT_FINISH_STOP_VP));
return {
const out = {
enabled: !!(en && en.checked),
speedPxPerSec: sp,
runwaySpawnAlignFrac: afv,
@@ -1017,6 +1030,8 @@
loopImage4: s('loopImage4'),
finishImage: s('finishImage'),
};
if (fatv != null) out.finishAlignMapTileX = fatv;
return out;
}
function readEditorBgScrollConfigForSave() {
@@ -3528,6 +3543,13 @@
canvas.addEventListener('mousedown', (e) => {
const { x, y } = getCell(e);
if (mapId === EDITOR_GAUNTLET_RUNWAY_BG_MAP_ID && e.altKey && e.button === 0) {
editorGauntletRunwayBgConfig.finishAlignMapTileX = Math.max(0, Math.min((width || 99) - 1, x));
syncEditorGauntletRunwayBgUiFromConfig();
draw();
if (statusEl) statusEl.textContent = 'คอลัมน์จบ FINISH บนแผนที่: ' + editorGauntletRunwayBgConfig.finishAlignMapTileX + ' (Alt+คลิก)';
return;
}
if (isSpawnMode) {
if (objects[y][x] === 0) { spawn = { x, y }; draw(); statusEl.textContent = 'จุดเกิด: ' + x + ',' + y; }
isSpawnMode = false;
@@ -3679,6 +3701,7 @@
speedPxPerSec: editorGauntletRunwayBgConfig.speedPxPerSec,
runwaySpawnAlignFrac: editorGauntletRunwayBgConfig.runwaySpawnAlignFrac,
finishLineInFinishArtFrac: editorGauntletRunwayBgConfig.finishLineInFinishArtFrac,
finishAlignMapTileX: editorGauntletRunwayBgConfig.finishAlignMapTileX,
finishStopViewportFrac: editorGauntletRunwayBgConfig.finishStopViewportFrac,
startImage: editorGauntletRunwayBgConfig.startImage,
loopImage2: editorGauntletRunwayBgConfig.loopImage2,
@@ -3712,6 +3735,19 @@
syncEditorGauntletRunwayFinishLineUi();
});
}
const fatIn = document.getElementById('editor-gauntlet-runway-bg-finish-align-tile');
if (fatIn) {
fatIn.addEventListener('change', () => {
const v = fatIn.value.trim();
if (!v.length) {
editorGauntletRunwayBgConfig.finishAlignMapTileX = null;
return;
}
const n = Math.floor(Number(v));
editorGauntletRunwayBgConfig.finishAlignMapTileX = Number.isFinite(n) ? Math.max(0, Math.min(99, n)) : null;
draw();
});
}
const fsvIn = document.getElementById('editor-gauntlet-runway-bg-finish-stop-vp');
if (fsvIn) {
fsvIn.addEventListener('change', () => {
+419 -48
View File
@@ -805,6 +805,8 @@
let gauntletCrownRunwayBgFinishLatched = false;
/** >0 = หยุดเลื่อนแล้ว (timestamp ms) รอ POST_STOP ก่อน latch */
let gauntletCrownRunwayBgStripFreezeSinceMs = 0;
/** คอลัมน์แผนที่ที่ล็อกตอน freeze — แนบตัวนำแทนขอบขวาสูงสุดของแมป */
let gauntletCrownRunwayFinishAlignLatchedWorldX = null;
/** พรีวิว embed: แสดง GCM ครั้งเดียวเมื่อรันเวย์ครบแนว (ไม่รอเซิร์ฟเวอร์) */
let gauntletCrownRunwayClientMissionShown = false;
/** พรมแดง mno9kb07 — จำกัดขอบขวาของตัว (ขอบขวา footprint ไม่เกินสัดส่วนนี้ของความกว้างแมปเป็นช่อง) */
@@ -905,17 +907,88 @@
return gauntletCrownRunwayBgImagesReadyPlay();
}
function gauntletCrownRunwayFinishLineInArtFracPlay() {
const raw = mapData && mapData.gauntletCrownRunwayBg && typeof mapData.gauntletCrownRunwayBg === 'object' ? mapData.gauntletCrownRunwayBg : {};
let lineInArt = Number(raw.finishLineInFinishArtFrac);
if (!Number.isFinite(lineInArt)) {
lineInArt = gauntletCrownRunwayBgMapEligiblePlay() ? 0.34 : 0.12;
}
return Math.max(0, Math.min(0.92, lineInArt));
}
function gauntletCrownRunwayFinishLineStripXPlay(g) {
if (!g) return null;
return g.finishStart + g.w4Safe * gauntletCrownRunwayFinishLineInArtFracPlay();
}
/** โลกแมป X ของจุดอ้างอิงในงานศิลป์ FINISH = stripX scrollPx (ไม่ขึ้นกับกล้อง) */
function gauntletCrownRunwayFinishLineMapWorldXPlay() {
const g = gauntletCrownRunwayScrollGeometryPlay();
if (!g) return null;
const stripX = gauntletCrownRunwayFinishLineStripXPlay(g);
if (stripX == null) return null;
return stripX - gauntletCrownRunwayBgScrollPx;
}
function gauntletCrownRunwayStripFrozenPlay() {
return gauntletCrownRunwayBgStripFreezeSinceMs > 0 || gauntletCrownRunwayBgFinishLatched;
}
/** จุดอ้างอิงกลางตัวนำ (map world px) — ใช้หยุด FINISH ตรงตัวละคร ไม่ใช่ขอบขวาแมป */
function gauntletCrownRunwayLeadingEntityAlignWorldXPlay() {
if (!mapData || !isGauntletCrownHeistMapPlay()) return null;
const ts = mapData.tileSize || 32;
const { cw } = getCharacterFootprintWH(mapData);
const mx = getGauntletCrownHeistMaxEntityXPlay(mapData);
let leadTx = -Infinity;
const consider = (ent) => {
if (!ent || ent.gauntletEliminated) return;
let tx = Number.isFinite(ent.tx) ? ent.tx : Number(ent.x);
if (!Number.isFinite(tx)) return;
leadTx = Math.max(leadTx, tx);
};
consider(me);
others.forEach((o, id) => {
if (!playBotsEnabled() && isPreviewBotId(id)) return;
consider(o);
});
if (!Number.isFinite(leadTx) || leadTx === -Infinity) return null;
let alignWorld = (leadTx + cw * 0.5) * ts;
if (mx != null && Number.isFinite(mx)) {
alignWorld = Math.min(alignWorld, (mx + cw * 0.5) * ts);
}
return alignWorld;
}
/**
* คอลมนบนกรดทเส FINISH องแนบ (map world px)
* gauntletCrownRunwayBg.finishAlignMapTileX | finishAlignMapTileFrac าไม ใชตำแหนงตวนำ
*/
function gauntletCrownRunwayFinishAlignMapWorldXPlay() {
if (!mapData) return null;
if (gauntletCrownRunwayFinishAlignLatchedWorldX != null) {
return gauntletCrownRunwayFinishAlignLatchedWorldX;
}
const raw = mapData.gauntletCrownRunwayBg && typeof mapData.gauntletCrownRunwayBg === 'object' ? mapData.gauntletCrownRunwayBg : {};
const ts = mapData.tileSize || 32;
const tileX = Number(raw.finishAlignMapTileX);
if (Number.isFinite(tileX)) return (tileX + 0.5) * ts;
const tileFrac = Number(raw.finishAlignMapTileFrac);
if (Number.isFinite(tileFrac)) {
const w = mapData.width || 20;
return (Math.max(0, Math.min(1, tileFrac)) * w + 0.5) * ts;
}
if (gauntletCrownRunwayBgMapEligiblePlay()) {
return gauntletCrownRunwayLeadingEntityAlignWorldXPlay();
}
return null;
}
/** ตำแหน่งเส้น FINISH บนจอ (0=ซ้าย 1=ขวา) จากขอบซ้าย viewport — ใช้หยุดเลื่อน + fade สิ่งกีดขวาง */
function gauntletCrownRunwayFinishLineScreenFracPlay(g) {
if (!g) return null;
const raw = mapData.gauntletCrownRunwayBg && typeof mapData.gauntletCrownRunwayBg === 'object' ? mapData.gauntletCrownRunwayBg : {};
let lineInArt = Number(raw.finishLineInFinishArtFrac);
if (!Number.isFinite(lineInArt)) {
/* mno9kb07: จบที่ "แถบ FINISH" สีเหลือง — หยุดทันทีหลังผ่านแถบ (ขอบขวาของแถบ FINISH) */
lineInArt = gauntletCrownRunwayBgMapEligiblePlay() ? 0.34 : 0.12;
}
lineInArt = Math.max(0, Math.min(0.92, lineInArt));
const finishLineWorldX = g.finishStart + g.w4Safe * lineInArt;
const finishLineWorldX = gauntletCrownRunwayFinishLineStripXPlay(g);
if (finishLineWorldX == null) return null;
return (finishLineWorldX - g.scrollView) / Math.max(1e-6, g.cwWorld);
}
@@ -1069,6 +1142,7 @@
* @param {null|{ worldMinX:number, worldMaxX:number, camX:number, camY:number, zDraw:number, mapWpx:number, mapHpx:number }} worldAlign าม จะคล+สเกลใหตรงกรดแมป (/งกดขวางตรงพนท)
*/
function drawGauntletCrownRunwayBgFullCanvasPlay(canvasW, canvasH, worldAlign) {
gauntletCrownRunwayMaintainFinishScrollPlay();
const finish = gauntletCrownRunwayBgImgs[4];
const align = worldAlign && typeof worldAlign === 'object'
&& Number.isFinite(worldAlign.worldMinX)
@@ -1148,30 +1222,36 @@
};
}
/** True when เส้น FINISH ถึงตำแหน่งบนจอที่กำหนด (ขวาเส้น FINISH ตามงานศิลป์ — ไม่เลื่อนเกินไป) */
/** True when เส้น FINISH ถึงตำแหน่งหยุด (แนบคอลัมน์แผนที่ หรือสัดส่วนจอแบบเดิม) */
function gauntletCrownRunwayScrollStripStopZoneReachedPlay() {
const g = gauntletCrownRunwayScrollGeometryPlay();
if (!g) return false;
if (g.scrollView < g.minScrollForFinishPass - 0.01) return false;
const alignWorldX = gauntletCrownRunwayFinishAlignMapWorldXPlay();
if (alignWorldX != null) {
const finishMapX = gauntletCrownRunwayFinishLineMapWorldXPlay();
if (finishMapX == null) return false;
return finishMapX <= alignWorldX + 1.5;
}
const screenFrac = gauntletCrownRunwayFinishLineScreenFracPlay(g);
if (screenFrac == null) return false;
return screenFrac <= gauntletCrownRunwayFinishStopViewportFracPlay() + 0.008;
}
/** จัด scroll ให้เส้น FINISH ตรง finishStopViewportFrac บนจอ (เรียกตอนเริ่ม freeze) */
/** จัด scroll ให้จุดอ้างอิงใน FINISH ตรงคอลัมน์แผนที่ (หรือ finishStopViewportFrac บนจอ) */
function gauntletCrownRunwaySnapScrollToFinishStopPlay() {
if (!mapData || !canvas || !gauntletCrownRunwayBgDrawActivePlay()) return;
const g = gauntletCrownRunwayScrollGeometryPlay();
if (!g) return;
const raw = mapData.gauntletCrownRunwayBg && typeof mapData.gauntletCrownRunwayBg === 'object' ? mapData.gauntletCrownRunwayBg : {};
let lineInArt = Number(raw.finishLineInFinishArtFrac);
if (!Number.isFinite(lineInArt)) {
lineInArt = gauntletCrownRunwayBgMapEligiblePlay() ? 0.34 : 0.12;
const finishLineStripX = gauntletCrownRunwayFinishLineStripXPlay(g);
if (finishLineStripX == null) return;
const alignWorldX = gauntletCrownRunwayFinishAlignMapWorldXPlay();
if (alignWorldX != null) {
gauntletCrownRunwayBgScrollPx = finishLineStripX - alignWorldX;
return;
}
lineInArt = Math.max(0, Math.min(0.92, lineInArt));
const finishLineWorldX = g.finishStart + g.w4Safe * lineInArt;
const stopVp = gauntletCrownRunwayFinishStopViewportFracPlay();
const targetScrollView = finishLineWorldX - stopVp * g.cwWorld;
const targetScrollView = finishLineStripX - stopVp * g.cwWorld;
const zGaRaw = computePlayCameraZDrawPlay();
const gCam = getGauntletCrownHeistGroupCameraCenterPxPlay(tileSize, canvas.width, canvas.height, zGaRaw);
if (!gCam) return;
@@ -1179,6 +1259,14 @@
gauntletCrownRunwayBgScrollPx = targetScrollView - worldMinX;
}
/** โหมดจอเท่านั้น: กล้องเลื่อนหลัง freeze ทำให้ FINISH หลุด — รีสแนปทุกเฟรม */
function gauntletCrownRunwayMaintainFinishScrollPlay() {
if (!gauntletCrownRunwayBgStripFreezeSinceMs && !gauntletCrownRunwayBgFinishLatched) return;
if (!gauntletCrownRunwayBgDrawActivePlay()) return;
if (gauntletCrownRunwayFinishAlignMapWorldXPlay() != null) return;
gauntletCrownRunwaySnapScrollToFinishStopPlay();
}
function resetGauntletCrownRunwaySpawnScrollSnap() {
gauntletCrownRunwaySpawnScrollSnapped = false;
}
@@ -1219,6 +1307,7 @@
gauntletCrownRunwayBgScrollPx = 0;
gauntletCrownRunwayBgFinishLatched = false;
gauntletCrownRunwayBgStripFreezeSinceMs = 0;
gauntletCrownRunwayFinishAlignLatchedWorldX = null;
gauntletCrownRunwayClientMissionShown = false;
lastGauntletCrownRunwayBgTickMs = 0;
resetGauntletCrownRunwaySpawnScrollSnap();
@@ -1261,6 +1350,7 @@
if (gauntletCrownRunwayBgFinishLatched) return;
if (gauntletCrownRunwayBgStripFreezeSinceMs > 0) {
gauntletCrownRunwayMaintainFinishScrollPlay();
if (Date.now() - gauntletCrownRunwayBgStripFreezeSinceMs >= GAUNTLET_CROWN_RUNWAY_POST_STOP_MS) {
gauntletCrownRunwayBgFinishLatched = true;
gauntletCrownRunwayBgStripFreezeSinceMs = 0;
@@ -1290,6 +1380,10 @@
}
if (gauntletCrownRunwayBgMapEligiblePlay() && gauntletCrownRunwayScrollStripStopZoneReachedPlay()) {
if (gauntletCrownRunwayFinishAlignLatchedWorldX == null) {
const leadAlign = gauntletCrownRunwayLeadingEntityAlignWorldXPlay();
if (leadAlign != null) gauntletCrownRunwayFinishAlignLatchedWorldX = leadAlign;
}
gauntletCrownRunwaySnapScrollToFinishStopPlay();
gauntletCrownRunwayBgStripFreezeSinceMs = Date.now();
try {
@@ -6836,6 +6930,37 @@
return BASE + '/img/MegaVirus/' + String(file || '').replace(/^\//, '');
}
function applyGauntletCrownHeistMissionPanelImages() {
const howtoOv = document.getElementById('gauntlet-crown-howto-overlay');
if (howtoOv) {
const tfHowto = isGauntletCrownHeistMapPlay();
howtoOv.classList.toggle('gch-quiz-tf-mock', tfHowto);
howtoOv.classList.toggle('gch-mg2-mock', tfHowto);
if (tfHowto) {
ensureQuizTfScaleResizeListener();
updateGchTfMockScale(howtoOv);
} else {
howtoOv.style.removeProperty('--gch-tf-scale');
}
}
const howtoBg = document.querySelector('#gauntlet-crown-howto-overlay .gch-bg');
if (howtoBg) {
howtoBg.src = missionMockHudAssetUrl('popup-Howto.png');
howtoBg.onerror = function () {
this.onerror = null;
this.src = BASE + '/img/gauntlet-assets/popup-Howto.png';
};
}
const resBg = document.querySelector('#gauntlet-crown-mission-overlay .gcm-bg');
if (resBg && isGauntletCrownHeistMapPlay()) {
resBg.src = missionMockHudAssetUrl('popup-result.png');
resBg.onerror = function () {
this.onerror = null;
this.src = BASE + '/img/gauntlet-assets/popup-result.png';
};
}
}
function applyMegaVirusMissionPanelImages() {
const howtoBg = document.querySelector('#gauntlet-crown-howto-overlay .gch-bg');
if (howtoBg) {
@@ -7298,6 +7423,7 @@
if (isSpaceShooterMissionUiMapPlay()) return 'violent_crime';
if (isMegaVirusMissionShellMapPlay()) return 'mega_virus';
if (isQuizCarry() && quizCarryEmbedMissionFlowActive()) return 'quiz_carry';
if (isGauntletCrownHeistMapPlay()) return 'gauntlet_crown';
return '';
}
@@ -7313,6 +7439,7 @@
if (skin === 'mega_virus') return megaVirusAssetUrl(f);
if (skin === 'stack_tower') return stackTowerAssetUrl(f);
if (skin === 'quiz_carry') return BASE + '/img/quiz-carry/' + f;
if (skin === 'gauntlet_crown') return BASE + '/img/gauntlet-assets/' + f;
return questionMissionAssetUrl(f);
}
@@ -7320,16 +7447,37 @@
if (!root) return;
if (!isMissionMockHudPlay()) {
root.style.removeProperty('--mmh-score-bar');
root.style.removeProperty('--mmh-score-label');
root.style.removeProperty('--mmh-score-avatar');
root.style.removeProperty('--mmh-mic-on');
root.style.removeProperty('--mmh-btn-ready');
root.style.removeProperty('--mmh-btn-start');
delete root.dataset.missionMockSkin;
return;
}
const skin = getMissionMockHudSkinPlay();
root.dataset.missionMockSkin = skin;
root.style.setProperty('--mmh-score-bar', "url('" + missionMockHudAssetUrl('score-bar.png') + "')");
if (skin === 'gauntlet_crown') {
root.style.removeProperty('--mmh-score-bar');
root.style.setProperty('--mmh-score-label', "url('" + missionMockHudAssetUrl('score.png') + "')");
const crownHead = document.getElementById('play-cyber-crown-score-head');
const crownImg = document.getElementById('play-cyber-crown-score-img');
if (crownHead && crownImg) {
const scoreSrc = missionMockHudAssetUrl('score.png');
crownHead.classList.remove('is-hidden');
crownHead.setAttribute('aria-hidden', 'false');
if (crownImg.getAttribute('src') !== scoreSrc) crownImg.setAttribute('src', scoreSrc);
crownImg.alt = 'SCORE :';
crownImg.classList.add('mg2-score-label');
}
} else {
root.style.removeProperty('--mmh-score-label');
root.style.setProperty('--mmh-score-bar', "url('" + missionMockHudAssetUrl('score-bar.png') + "')");
}
root.style.setProperty('--mmh-score-avatar', "url('" + missionMockHudAssetUrl('score-avartar.png') + "')");
root.style.setProperty('--mmh-mic-on', "url('" + missionMockHudAssetUrl('btn-mic_on.png') + "')");
root.style.setProperty('--mmh-btn-ready', "url('" + missionMockHudAssetUrl('btn-ready.png') + "')");
root.style.setProperty('--mmh-btn-start', "url('" + missionMockHudAssetUrl('btn-start.png') + "')");
const micImg = document.getElementById('play-cyber-mic-img');
if (micImg) {
micImg.classList.remove('is-hidden');
@@ -9422,16 +9570,29 @@
function syncGauntletCrownJumpButton() {
const btn = document.getElementById('gauntlet-crown-jump-btn');
if (!btn) return;
const show = !!(mapData && isGauntletCrownHeistMapPlay() && gauntletCrownPregamePhase === 'live' && !me.gauntletEliminated && gauntletCrownRunwayAvatarRunAllowedPlay());
const pregameUi = gauntletCrownPregamePhase === 'howto' || gauntletCrownPregamePhase === 'countdown';
const liveUi = gauntletCrownPregamePhase === 'live' && gauntletCrownRunwayAvatarRunAllowedPlay();
const show = !!(mapData && isGauntletCrownHeistMapPlay() && !me.gauntletEliminated && (pregameUi || liveUi));
if (!show) {
btn.classList.add('is-hidden');
btn.classList.remove('mg2-jump');
btn.setAttribute('aria-hidden', 'true');
btn.style.pointerEvents = 'none';
syncMg2MockJumpButtonBoundsPlay(null, 0);
return;
}
btn.classList.remove('is-hidden');
btn.setAttribute('aria-hidden', 'false');
btn.style.pointerEvents = '';
const mg2Jump = isMissionMockHudPlay() && getMissionMockHudSkinPlay() === 'gauntlet_crown';
btn.classList.toggle('mg2-jump', !!mg2Jump);
if (mg2Jump) {
const hud = document.getElementById('play-cyber-hud');
if (hud && hud.classList.contains('play-cyber-hud--quiz-tf-mock')) updateQuizTfMockScale(hud);
else syncMg2MockJumpButtonBoundsPlay();
} else {
btn.classList.remove('mg2-jump');
}
}
function syncStackTowerDropButtonPlay() {
@@ -11146,6 +11307,7 @@
function applyGauntletPreviewBotsAfterSync() {
if (!playBotsEnabled() || !mapData || mapData.gameType !== 'gauntlet') return;
if (isGauntletCrownHeistMapPlay() && isGauntletCrownPregameBlockingPlay()) return;
if (isGauntletCrownHeistMapPlay() && gauntletCrownRunwayStripFrozenPlay()) return;
const w = mapData.width || 20;
const h = mapData.height || 15;
others.forEach((o, id) => {
@@ -11207,9 +11369,12 @@
return BASE + '/img/gauntlet-assets/result-txt-2.png';
}
/** สรุปภารกิจแบบ mockup 08-summary — ต่อมินิเกม mission map (Minigame 1/47) */
/** สรุปภารกิจแบบ mockup — ต่อมินิเกม mission map (Minigame 1/47 + Last Light mno9kb07) */
function isGcmMissionMockSummaryPlay(mission) {
if (!mission || !mission.uiSkin) return false;
if (!mission || !mission.uiSkin) {
return isGauntletCrownHeistMapPlay();
}
if (mission.uiSkin === 'gauntlet_crown') return isGauntletCrownHeistMapPlay();
if (mission.uiSkin === 'question_mission') return isQuizQuestionMissionUiMapPlay();
if (mission.uiSkin === 'jumper') return isJumpSurviveMissionUiMapPlay();
if (mission.uiSkin === 'violent_crime') return isSpaceShooterMissionUiMapPlay();
@@ -11219,8 +11384,13 @@
}
function gcmMissionMockAssetUrl(mission, file) {
if (!mission) return questionMissionAssetUrl(file);
if (!mission) {
return isGauntletCrownHeistMapPlay()
? (BASE + '/img/gauntlet-assets/' + String(file || '').replace(/^\//, ''))
: questionMissionAssetUrl(file);
}
const skin = mission.uiSkin;
if (skin === 'gauntlet_crown') return BASE + '/img/gauntlet-assets/' + String(file || '').replace(/^\//, '');
if (skin === 'jumper') return jumperAssetUrl(file);
if (skin === 'violent_crime') return violentCrimeAssetUrl(file);
if (skin === 'mega_virus') return megaVirusAssetUrl(file);
@@ -11228,6 +11398,41 @@
return questionMissionAssetUrl(file);
}
function resolveGauntletCrownMissionUiSkinPlay(mission) {
if (mission && mission.uiSkin) return mission.uiSkin;
if (isGauntletCrownHeistMapPlay()) return 'gauntlet_crown';
return mission && mission.uiSkin;
}
function setGauntletCrownMg2CountdownGraphic(numEl, textEl, n) {
const d = Math.max(1, Math.min(3, n));
if (textEl) {
textEl.textContent = String(d);
textEl.setAttribute('aria-label', String(d));
}
if (numEl) {
numEl.removeAttribute('src');
numEl.alt = '';
}
}
function syncGauntletCrownCountdownMg2ModePlay(cd) {
if (!cd) return;
const mg2 = isGauntletCrownHeistMapPlay();
cd.classList.toggle('gcc-mg2-mock', mg2);
const numEl = document.getElementById('gauntlet-crown-countdown-num');
const textEl = document.getElementById('gauntlet-crown-countdown-text');
if (numEl) {
numEl.classList.toggle('gcc-num--img', !mg2);
numEl.classList.toggle('is-hidden', !!mg2);
numEl.setAttribute('aria-hidden', mg2 ? 'true' : 'false');
}
if (textEl) {
textEl.classList.toggle('is-hidden', !mg2);
textEl.setAttribute('aria-hidden', mg2 ? 'false' : 'true');
}
}
function gauntletCrownPregameReadyNumerator() {
let n = quizCarryPregameBotCount();
quizCarryPregameHumanIds().forEach((id) => {
@@ -11352,13 +11557,18 @@
runFinish();
return;
}
syncGauntletCrownCountdownMg2ModePlay(cd);
const textEl = document.getElementById('gauntlet-crown-countdown-text');
const mg2Cd = isGauntletCrownHeistMapPlay();
cd.classList.remove('is-hidden');
let n = 3;
setCountdown321QuestionAssetGraphic(numEl, n);
if (mg2Cd) setGauntletCrownMg2CountdownGraphic(numEl, textEl, n);
else setCountdown321QuestionAssetGraphic(numEl, n);
const step = () => {
n--;
if (n > 0) {
setCountdown321QuestionAssetGraphic(numEl, n);
if (mg2Cd) setGauntletCrownMg2CountdownGraphic(numEl, textEl, n);
else setCountdown321QuestionAssetGraphic(numEl, n);
gauntletCrownCountdownTimer = setTimeout(step, 1000);
} else {
gauntletCrownCountdownTimer = null;
@@ -11366,14 +11576,20 @@
}
};
gauntletCrownCountdownTimer = setTimeout(step, 1000);
try { syncGauntletCrownJumpButton(); } catch (_sj) { /* ignore */ }
try { syncPlayCyberHud(); } catch (_sh) { /* ignore */ }
}
function showGauntletCrownHowtoOverlay() {
if (!usesCrownLobbyShellPlay()) return;
hideConflictingOverlaysForGauntletCrown();
if (isMegaVirusMissionShellMapPlay()) applyMegaVirusMissionPanelImages();
if (isGauntletCrownHeistMapPlay()) applyGauntletCrownHeistMissionPanelImages();
else if (isMegaVirusMissionShellMapPlay()) applyMegaVirusMissionPanelImages();
const cd = document.getElementById('gauntlet-crown-countdown');
if (cd) cd.classList.add('is-hidden');
if (cd) {
cd.classList.add('is-hidden');
syncGauntletCrownCountdownMg2ModePlay(cd);
}
if (gauntletCrownCountdownTimer) {
clearTimeout(gauntletCrownCountdownTimer);
gauntletCrownCountdownTimer = null;
@@ -11387,6 +11603,8 @@
if (socket && socket.connected) socket.emit('gauntlet-crown-lobby-sync-request');
gauntletCrownSyncGuestReadyIfNeeded();
updateGauntletCrownHowtoHud();
try { syncGauntletCrownJumpButton(); } catch (_sj) { /* ignore */ }
try { syncPlayCyberHud(); } catch (_sh) { /* ignore */ }
}
/** Editor embed: quiz_carry / crown ใช้เกรด F = gameover — Jumper: ภาพจบใช้เฉพาะเมื่อไม่มีผู้รอด (0 คน) */
@@ -11490,6 +11708,7 @@
if (survivorCount <= 0) grade = 'F';
const rewardCard = grade === 'F' ? null : gauntletCrownRollRewardCardLocal(grade);
return {
uiSkin: 'gauntlet_crown',
ranked,
totalSum,
averageScore,
@@ -11650,6 +11869,15 @@
? '/Game/img/special-cards/card-' + card.cardId + '.png' : '');
if (!imgUrl) return;
const isPresetAsset = imgUrl.indexOf('/img/special-cards/') >= 0 || imgUrl.indexOf('/trycss/10-Game-1-result/') >= 0;
if (bonusEl.classList && bonusEl.classList.contains('gcm-bonus-mg2-right')) {
const img = document.createElement('img');
img.className = isPresetAsset ? 'bail-card gcm-special-card-img' : 'gcm-special-card-img';
img.src = imgUrl;
img.alt = card.th || card.en || '';
img.decoding = 'async';
bonusEl.appendChild(img);
return;
}
const wrap = document.createElement('div');
wrap.className = isPresetAsset
? 'sm-bonus-right gcm-special-card-preset'
@@ -12195,6 +12423,8 @@
const bonusEl = document.getElementById('gcm-bonus');
const btn = document.getElementById('btn-gcm-done');
if (!ov || !rowEl || !mission || !Array.isArray(mission.ranked)) return;
if (!mission.uiSkin && isGauntletCrownHeistMapPlay()) mission.uiSkin = 'gauntlet_crown';
const missionSkin = resolveGauntletCrownMissionUiSkinPlay(mission);
if (!mission.specialCardAwarded && specialQuizAwardedCard) mission.specialCardAwarded = specialQuizAwardedCard;
let disp = gauntletCrownBuildDisplayMission(mission);
if (mission.uiSkin === 'jumper') {
@@ -12209,9 +12439,16 @@
disp = balloonBossMergePreviewBotsMission(disp) || disp;
}
if (!disp || !Array.isArray(disp.ranked)) return;
/* mission map — สรุปผลภารกิจตาม mockup 08-summary (Minigame 1/47) */
/* mission map — สรุปผลภารกิจตาม mockup (Minigame 1/47 + Last Light 07-summary) */
const tfMockSummary = isGcmMissionMockSummaryPlay(mission);
const mg2Summary = tfMockSummary && missionSkin === 'gauntlet_crown';
ov.classList.toggle('gcm-quiz-tf-mock', tfMockSummary);
ov.classList.toggle('gcm-mg2-mock', mg2Summary);
const gcmVrule = document.getElementById('gcm-vrule');
if (gcmVrule) {
gcmVrule.classList.toggle('is-hidden', !mg2Summary);
gcmVrule.setAttribute('aria-hidden', mg2Summary ? 'true' : 'true');
}
const gcmBgImg = ov.querySelector('.gcm-bg');
if (gcmBgImg) {
const gcmBgSrc = tfMockSummary
@@ -12333,13 +12570,26 @@
const sc = document.createElement('div');
sc.className = 'gcm-sc';
const jumpPlain = mission && (mission.uiSkin === 'jumper' || mission.uiSkin === 'violent_crime' || mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus');
const botScorePlain = (playBotsEnabled() && isGauntletCrownHeistMapPlay() && isPreviewBotId(r.id))
const botScorePlain = (playBotsEnabled() && isGauntletCrownHeistMapPlay() && isPreviewBotId(r.id) && !mg2Summary)
|| (playBotsEnabled() && mission && mission.uiSkin === 'question_mission' && isPreviewBotId(r.id))
|| (playBotsEnabled() && mission && mission.uiSkin === 'stack_tower' && isPreviewBotId(r.id))
|| (playBotsEnabled() && mission && mission.uiSkin === 'mega_virus' && isPreviewBotId(r.id));
sc.textContent = (jumpPlain || botScorePlain)
? String(Math.max(0, Number(r.baseScore) || 0))
: String(r.baseScore || 0) + '(+' + String(r.rankBonus || 0) + ')';
if (mg2Summary) {
const bs = Math.max(0, Number(r.baseScore) || 0);
const rb = Math.max(0, Number(r.rankBonus) || 0);
sc.textContent = '';
sc.appendChild(document.createTextNode(String(bs)));
if (rb > 0) {
const bon = document.createElement('span');
bon.className = 'gcm-sc-bonus';
bon.textContent = '(+' + String(rb) + ')';
sc.appendChild(bon);
}
} else {
sc.textContent = (jumpPlain || botScorePlain)
? String(Math.max(0, Number(r.baseScore) || 0))
: String(r.baseScore || 0) + '(+' + String(r.rankBonus || 0) + ')';
}
cell.appendChild(tag);
cell.appendChild(frame);
cell.appendChild(nick);
@@ -12385,7 +12635,33 @@
bonusEl.innerHTML = '';
const gLetter = String(disp.grade || 'C').toUpperCase().charAt(0);
const missionOk = gLetter !== 'F';
if (missionOk) {
let bonusCardHost = bonusEl;
if (mg2Summary && missionOk) {
const bonusWrap = document.createElement('div');
bonusWrap.className = 'gcm-bonus-mg2 sm-bonus';
const bonusLeft = document.createElement('div');
bonusLeft.className = 'gcm-bonus-mg2-left sm-bonus-left';
const bonusHead = document.createElement('h3');
bonusHead.className = 'gcm-h gcm-bonus-mg2-head head';
bonusHead.textContent = 'โบนัสพิเศษ';
const completeImg = document.createElement('img');
completeImg.className = 'gcm-bonus-mg2-complete complete';
completeImg.src = gcmMissionMockAssetUrl(mission, 'mission-complete-select.png');
completeImg.alt = 'ภารกิจสำเร็จ';
completeImg.decoding = 'async';
completeImg.onerror = function () {
this.onerror = null;
this.src = BASE + '/img/gauntlet-assets/result-check.png';
};
bonusLeft.appendChild(bonusHead);
bonusLeft.appendChild(completeImg);
const bonusRight = document.createElement('div');
bonusRight.className = 'gcm-bonus-mg2-right sm-bonus-right';
bonusWrap.appendChild(bonusLeft);
bonusWrap.appendChild(bonusRight);
bonusEl.appendChild(bonusWrap);
bonusCardHost = bonusRight;
} else if (missionOk) {
const row = document.createElement('div');
row.className = 'gcm-bonus-okrow';
row.style.display = 'flex';
@@ -12403,7 +12679,6 @@
};
}
if (tfMockSummary) {
/* mockup: ใช้ป้าย "ภารกิจสำเร็จ" สำเร็จรูป mission-complete-select.png เท่านั้น */
chk.src = gcmMissionMockAssetUrl(mission, 'mission-complete-select.png');
chk.alt = 'ภารกิจสำเร็จ';
chk.onerror = function () {
@@ -12424,12 +12699,12 @@
bonusEl.appendChild(row);
}
const rc = disp.rewardCard;
if (missionOk && rc && rc.th) {
if (!mg2Summary && missionOk && rc && rc.th) {
const pl = document.createElement('div');
pl.className = 'gcm-plaque';
pl.innerHTML = '<strong>' + String(rc.th) + '</strong><span>' + String(rc.en || '') + '</span>';
bonusEl.appendChild(pl);
} else if (!missionOk) {
} else if (!mg2Summary && !missionOk) {
const pl = document.createElement('div');
pl.className = 'gcm-plaque';
pl.style.borderColor = 'rgba(148, 153, 168, 0.45)';
@@ -12437,16 +12712,29 @@
pl.innerHTML = '<strong>ไม่ได้รับการ์ด</strong><span>เกรด ' + gLetter + ' · ภารกิจไม่ผ่านเกณฑ์</span>';
bonusEl.appendChild(pl);
}
/* การ์ดพิเศษจากชุดคำถาม (ถ้ารอบนี้ได้รับ) — wire จุด trigger ภายหลัง */
if (mission && mission.specialCardAwarded) {
renderSpecialCardInBonus(bonusEl, mission.specialCardAwarded);
renderSpecialCardInBonus(bonusCardHost, mission.specialCardAwarded);
} else if (mg2Summary && missionOk && rc && rc.th) {
const cardId = rc.kind === 'culprit' ? 1 : (rc.kind === 'rare' ? 5 : 3);
renderSpecialCardInBonus(bonusCardHost, {
th: rc.th,
en: rc.en || '',
imageUrl: '/Game/img/special-cards/card-' + cardId + '.png',
cardId: cardId,
rarity: rc.kind === 'rare' ? 'rare' : (rc.kind === 'culprit' ? 'legendary' : 'common'),
});
}
}
const gcmHead = document.getElementById('gcm-heading');
if (gcmHead) {
if (mission && (mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus' || mission.uiSkin === 'jumper' || mission.uiSkin === 'violent_crime')) gcmHead.classList.add('sr-only');
if (mission && (mission.uiSkin === 'gauntlet_crown' || mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus' || mission.uiSkin === 'jumper' || mission.uiSkin === 'violent_crime')) gcmHead.classList.add('sr-only');
else gcmHead.classList.remove('sr-only');
}
if (btn && mg2Summary) {
btn.style.backgroundImage = "url('" + gcmMissionMockAssetUrl(mission, 'btn-done.png') + "')";
} else if (btn) {
btn.style.removeProperty('background-image');
}
ov.classList.remove('is-hidden');
if (tfMockSummary) {
requestAnimationFrame(function () {
@@ -17036,6 +17324,7 @@
gauntletEndsAtMs = null;
gauntletCrownRunwayBgFinishLatched = false;
gauntletCrownRunwayBgStripFreezeSinceMs = 0;
gauntletCrownRunwayFinishAlignLatchedWorldX = null;
gauntletCrownRunwayClientMissionShown = false;
gauntletCrownRunHeldRemote = false;
gauntletCrownPregamePhase = null;
@@ -19053,6 +19342,38 @@
root.dataset.qtfStackW = String(Math.round(cw));
root.dataset.qtfStackH = String(Math.round(ch));
root.style.setProperty('--qtf-scale', String(s));
syncMg2MockJumpButtonBoundsPlay(r, s);
}
function syncMg2MockJumpButtonBoundsPlay(stackRect, scale) {
const jumpBtn = document.getElementById('gauntlet-crown-jump-btn');
const hud = document.getElementById('play-cyber-hud');
if (!jumpBtn || !hud || hud.dataset.missionMockSkin !== 'gauntlet_crown') {
if (jumpBtn) {
jumpBtn.style.removeProperty('left');
jumpBtn.style.removeProperty('top');
jumpBtn.style.removeProperty('width');
jumpBtn.style.removeProperty('height');
jumpBtn.style.removeProperty('right');
jumpBtn.style.removeProperty('bottom');
jumpBtn.style.removeProperty('transform');
jumpBtn.style.removeProperty('filter');
}
return;
}
if (jumpBtn.classList.contains('is-hidden')) return;
const r = stackRect || (document.getElementById('play-canvas-stack') || {}).getBoundingClientRect?.();
const s = Number.isFinite(scale) ? scale : _quizTfScaleLast;
if (!r || !(s > 0)) return;
jumpBtn.style.position = 'fixed';
jumpBtn.style.left = Math.round(r.left + 1648 * s) + 'px';
jumpBtn.style.top = Math.round(r.top + 818 * s) + 'px';
jumpBtn.style.width = Math.round(231 * s) + 'px';
jumpBtn.style.height = Math.round(231 * s) + 'px';
jumpBtn.style.right = 'auto';
jumpBtn.style.bottom = 'auto';
jumpBtn.style.transform = 'none';
jumpBtn.style.filter = 'drop-shadow(0 0 ' + Math.max(8, Math.round(18 * s)) + 'px rgba(255, 110, 220, 0.45))';
}
function clearQuizTfMockHudBoundsPlay(root) {
@@ -19069,19 +19390,27 @@
root.style.removeProperty('transform');
delete root.dataset.qtfStackW;
delete root.dataset.qtfStackH;
syncMg2MockJumpButtonBoundsPlay(null, 0);
}
/* mng8a80o: สรุปผลภารกิจ (06-summary) — scale popup 1451×851 ตามสูตรเดียวกับ HUD (min vw/1920, vh/1080) */
function missionMockOverlayScalePlay() {
const stack = document.getElementById('play-canvas-stack');
const r = stack && stack.getBoundingClientRect ? stack.getBoundingClientRect() : null;
const cw = Math.max(1, r && r.width ? r.width : window.innerWidth);
const ch = Math.max(1, r && r.height ? r.height : window.innerHeight);
return Math.min(cw / 1920, ch / 1080);
}
function updateGcmTfMockScale(ov) {
ov = ov || document.getElementById('gauntlet-crown-mission-overlay');
if (!ov) return;
const s = Math.min(window.innerWidth / 1920, window.innerHeight / 1080);
const s = missionMockOverlayScalePlay();
if (s > 0 && isFinite(s)) ov.style.setProperty('--gcm-tf-scale', String(s));
}
/* mng8a80o: popup HOW TO PLAY (01-howto) — scale stage 1920×1080 ตามสูตรเดียวกัน */
/* popup HOW TO PLAY (01-howto) — scale stage 1920×1080 ตามสูตรเดียวกัน */
function updateGchTfMockScale(ov) {
ov = ov || document.getElementById('gauntlet-crown-howto-overlay');
if (!ov) return;
const s = Math.min(window.innerWidth / 1920, window.innerHeight / 1080);
const s = missionMockOverlayScalePlay();
if (s > 0 && isFinite(s)) ov.style.setProperty('--gch-tf-scale', String(s));
}
let _quizTfScaleObserversBound = false;
@@ -19129,6 +19458,7 @@
_quizTfScaleLast = 0;
_quizTfMockActivePrev = false;
document.documentElement.classList.remove('play-mission-mock-hud');
document.documentElement.classList.remove('play-mg2-mock-hud');
}
}
if (stackEl) stackEl.classList.toggle('play-cyber-vignette', !!on);
@@ -19145,6 +19475,7 @@
const missionMockOn = !!isMissionMockHudPlay();
root.classList.toggle('play-cyber-hud--quiz-tf-mock', missionMockOn);
document.documentElement.classList.toggle('play-mission-mock-hud', missionMockOn && on);
document.documentElement.classList.toggle('play-mg2-mock-hud', missionMockOn && on && getMissionMockHudSkinPlay() === 'gauntlet_crown');
applyMissionMockHudCssVarsPlay(root);
const tfMockOn = root.classList.contains('play-cyber-hud--quiz-tf-mock');
if (tfMockOn) {
@@ -19161,6 +19492,7 @@
root.style.removeProperty('--qtf-scale');
_quizTfScaleLast = 0;
document.documentElement.classList.remove('play-mission-mock-hud');
document.documentElement.classList.remove('play-mg2-mock-hud');
}
_quizTfMockActivePrev = tfMockOn;
root.classList.toggle(
@@ -19444,14 +19776,27 @@
return;
}
const stripScoreHud = isGauntletCrownHeistMapPlay() || isQuizCarry();
const mg2MockHud = isMissionMockHudPlay() && getMissionMockHudSkinPlay() === 'gauntlet_crown';
const board = ul.closest('.play-cyber-scoreboard');
if (board) board.classList.toggle('play-cyber-scoreboard--crown-strip', !!stripScoreHud);
ul.classList.toggle('play-cyber-score-list--crown-strip', !!stripScoreHud);
if (board) {
board.classList.toggle('play-cyber-scoreboard--crown-strip', !!stripScoreHud && !mg2MockHud);
board.classList.toggle('play-cyber-scoreboard--mg2-mock', !!mg2MockHud);
board.classList.toggle('mg2-score-bar', !!mg2MockHud);
}
ul.classList.toggle('play-cyber-score-list--crown-strip', !!stripScoreHud && !mg2MockHud);
ul.classList.toggle('play-cyber-score-list--mg2-mock', !!mg2MockHud);
const panelTitle = root.querySelector('.play-cyber-panel-title');
const crownHead = document.getElementById('play-cyber-crown-score-head');
const crownImg = document.getElementById('play-cyber-crown-score-img');
if (panelTitle && crownHead && crownImg) {
if (stripScoreHud) {
if (mg2MockHud) {
const scoreSrc = missionMockHudAssetUrl('score.png');
crownHead.classList.remove('is-hidden');
crownHead.setAttribute('aria-hidden', 'false');
if (crownImg.getAttribute('src') !== scoreSrc) crownImg.setAttribute('src', scoreSrc);
crownImg.alt = 'SCORE :';
panelTitle.classList.add('is-hidden');
} else if (stripScoreHud) {
crownHead.classList.add('is-hidden');
crownHead.setAttribute('aria-hidden', 'true');
crownImg.removeAttribute('src');
@@ -19561,7 +19906,7 @@
}
/* กันกระตุก: rebuild DOM เฉพาะตอนเนื้อหา (id/score/order/สี/ตกรอบ) เปลี่ยน — ไม่ลบ-สร้างทุกเฟรม */
const listSig = [
cyberQmMockHud ? 'qm' : '', stripScoreHud ? 'strip' : '', leaderId == null ? '' : String(leaderId),
cyberQmMockHud ? 'qm' : '', mg2MockHud ? 'mg2' : '', stripScoreHud ? 'strip' : '', leaderId == null ? '' : String(leaderId),
hudRows.map(function (rw) {
const t = rw.playTint || {};
return String(rw.id) + ':' + String(rw.score) + ':' + (rw.eliminated ? 1 : 0)
@@ -19584,16 +19929,19 @@
const li = document.createElement('li');
li.className = 'play-cyber-score-row' + (row.isMe ? ' is-me' : '') + (row.eliminated ? ' is-out' : '')
+ (cyberQmMockHud ? ' play-cyber-score-row--qm-mock' : '')
+ (stripScoreHud ? ' play-cyber-score-row--crown-strip' : '');
+ (mg2MockHud ? ' play-cyber-score-row--mg2-mock' : '')
+ (stripScoreHud && !mg2MockHud ? ' play-cyber-score-row--crown-strip' : '');
if (row.id != null) li.setAttribute('data-peer-id', String(row.id));
const av = document.createElement('img');
av.className = 'play-cyber-score-av' + (cyberQmMockHud ? ' play-cyber-score-av--qm' : '')
+ (stripScoreHud ? ' play-cyber-score-av--crown-strip' : '');
+ (mg2MockHud ? ' play-cyber-score-av--mg2' : '')
+ (stripScoreHud && !mg2MockHud ? ' play-cyber-score-av--crown-strip' : '');
av.alt = '';
setCyberHudScoreAvatarImg(av, row);
const sc = document.createElement('span');
sc.className = 'play-cyber-score-val' + (cyberQmMockHud ? ' play-cyber-qm-score' : '')
+ (stripScoreHud ? ' play-cyber-crown-strip-val' : '');
+ (mg2MockHud ? ' play-cyber-mg2-score' : '')
+ (stripScoreHud && !mg2MockHud ? ' play-cyber-crown-strip-val' : '');
if (isGauntlet() || isSpaceShooter() || isBalloonBoss() || isQuizCarry() || jumpMissionHud || quizMissionHud || stackMissionHud) {
sc.textContent = String(row.score);
} else {
@@ -19637,6 +19985,29 @@
li.appendChild(qmLeft);
li.appendChild(sc);
}
} else if (mg2MockHud) {
const cell = document.createElement('div');
cell.className = 'play-cyber-mg2-player';
const name = document.createElement('div');
name.className = 'play-cyber-mg2-name';
if (row.id === leaderId && leaderId != null) {
const crown = document.createElement('span');
crown.className = 'play-cyber-lead-crown';
crown.textContent = '♔';
crown.title = 'Leader';
name.appendChild(crown);
}
name.appendChild(document.createTextNode(String(row.nickname || '').trim().slice(0, 12)));
const avWrap = document.createElement('div');
avWrap.className = 'play-cyber-mg2-av-wrap';
const avClip = document.createElement('span');
avClip.className = 'play-cyber-mg2-av-clip';
avClip.appendChild(av);
avWrap.appendChild(avClip);
cell.appendChild(name);
cell.appendChild(avWrap);
cell.appendChild(sc);
li.appendChild(cell);
} else if (stripScoreHud) {
const cell = document.createElement('div');
cell.className = 'play-cyber-crown-strip-cell';
+395 -8
View File
@@ -1278,6 +1278,67 @@
background: rgba(6, 8, 18, 0.55);
backdrop-filter: blur(3px);
}
/* Minigame-2 mno9kb07 — countdown 02: เลขใหญ่กลางจอ ไม่บัง HUD (mockup .rn-countdown) */
#gauntlet-crown-countdown.gcc-mg2-mock {
background: transparent;
backdrop-filter: none;
pointer-events: none;
z-index: 56;
}
/* MG2: ใช้แค่เลขข้อความใหญ่ — ซ่อนรูป 3.png (is-hidden ไม่มี global rule) */
#gauntlet-crown-countdown.gcc-mg2-mock .gcc-num--img,
#gauntlet-crown-countdown.gcc-mg2-mock #gauntlet-crown-countdown-num {
display: none !important;
visibility: hidden !important;
width: 0 !important;
height: 0 !important;
overflow: hidden !important;
position: absolute !important;
pointer-events: none !important;
}
html.play-mg2-mock-hud #gauntlet-crown-countdown.gcc-mg2-mock {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
width: auto;
height: auto;
transform: none;
display: block;
padding: 0;
}
html.play-mg2-mock-hud #gauntlet-crown-countdown.gcc-mg2-mock .gcc-panel {
position: fixed;
left: 50%;
top: 50%;
width: 1920px;
height: 1080px;
transform: translate(-50%, -50%) scale(var(--qtf-scale, 1));
transform-origin: center center;
pointer-events: none;
}
html.play-mg2-mock-hud #gauntlet-crown-countdown.gcc-mg2-mock .gcc-num--text {
position: absolute;
left: 50%;
top: 420px;
transform: translate(-50%, -50%);
font-size: 220px;
margin: 0;
}
#gauntlet-crown-countdown.gcc-mg2-mock .gcc-num--text {
display: block;
font-family: 'NotoSansThai', sans-serif;
font-weight: 900;
font-size: clamp(120px, 22vw, 220px);
line-height: 1;
color: #ffd93d;
-webkit-text-stroke: 6px #1a1208;
text-shadow:
0 0 24px rgba(255, 210, 60, 0.85),
0 6px 0 #c89400;
pointer-events: none;
}
#gauntlet-crown-mission-overlay { z-index: 10150; }
/* Stack Tower (mnn93hpi) — แฟลชผลจบ 5 วิ ก่อน GCM */
#stack-tower-result-flash {
@@ -3383,6 +3444,183 @@
#gauntlet-crown-howto-overlay.gch-quiz-tf-mock .gch-inner.gch-inner--art .btn-gch-ready:active {
transform: translateY(2px);
}
/* Minigame-2 mno9kb07 — HOW TO PLAY ใช้ปุ่ม/ฉากจาก gauntlet-assets */
#gauntlet-crown-howto-overlay.gch-mg2-mock .gch-backdrop {
background: rgba(4, 6, 18, 0.45);
backdrop-filter: none;
}
#gauntlet-crown-howto-overlay.gch-mg2-mock .gch-inner.gch-inner--art .btn-gch-ready {
background-image: var(--mmh-btn-ready, url('/Game/img/gauntlet-assets/btn-ready.png'));
}
#gauntlet-crown-howto-overlay.gch-mg2-mock .gch-inner.gch-inner--art .btn-gch-ready.is-start-phase {
background-image: var(--mmh-btn-start, url('/Game/img/gauntlet-assets/btn-start.png'));
}
/* ====== Minigame-2 mno9kb07 — HUD แนวนอน (mg2-score-bar) fix 1920×1080 ====== */
/* selector ต้องชนะ .play-cyber-hud--quiz-tf-mock ทั่วไป (score-bar แนวตั้ง 156×433 + overflow:hidden) */
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] {
display: block;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"].play-cyber-hud--gauntlet-crown-strip {
display: block;
grid-template: none;
padding: 0;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-corruption,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-center-stack,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-hint,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-preview-line {
display: none !important;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-hud-mock-stage .play-cyber-scoreboard,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-scoreboard.play-cyber-scoreboard--mg2-mock {
position: absolute !important;
left: 50px !important;
top: 30px !important;
width: auto !important;
height: auto !important;
max-height: none !important;
aspect-ratio: auto !important;
display: flex !important;
flex-direction: row !important;
align-items: flex-start !important;
gap: 0 !important;
padding: 0 !important;
background: transparent !important;
border: none !important;
box-shadow: none !important;
overflow: visible !important;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] #play-cyber-crown-score-head,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-crown-score-head {
display: block !important;
flex: 0 0 144px !important;
width: 144px !important;
height: 71px !important;
min-height: 71px !important;
margin: 0 1px 0 0 !important;
padding: 0 !important;
line-height: 0;
overflow: visible !important;
border: none !important;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] #play-cyber-crown-score-head.is-hidden {
display: block !important;
height: 71px !important;
min-height: 71px !important;
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-crown-score-head img,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .mg2-score-label {
display: block !important;
width: 144px !important;
height: 71px !important;
max-width: none !important;
object-fit: contain;
transform: translateY(11px);
}
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-hud-mock-stage .play-cyber-score-list,
html #play-cyber-hud.play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-score-list.play-cyber-score-list--mg2-mock {
position: static !important;
left: auto !important;
top: auto !important;
width: auto !important;
height: auto !important;
max-height: none !important;
display: flex !important;
flex-direction: row !important;
align-items: flex-start !important;
gap: 85px !important;
padding: 0 !important;
overflow: visible !important;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-score-row--mg2-mock {
display: block;
width: 70px;
flex: 0 0 70px;
padding: 0;
min-height: 0;
max-height: none;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-player {
width: 70px;
text-align: center;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-name {
font-family: 'NotoSansThai', sans-serif;
font-weight: 700;
font-size: 11px;
color: #e8f4ff;
letter-spacing: 0.2px;
text-transform: uppercase;
white-space: nowrap;
margin-bottom: 4px;
line-height: 1;
overflow: hidden;
text-overflow: ellipsis;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-av-wrap {
position: relative;
width: 70px;
height: 70px;
margin: 0 auto 4px;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-av-wrap::after {
content: '';
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
background: var(--mmh-score-avatar, url('/Game/img/gauntlet-assets/score-avartar.png')) no-repeat center / contain;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-av-clip {
position: absolute;
inset: 4px;
z-index: 3;
overflow: hidden;
border-radius: 6px;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-score-av--mg2 {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center 30%;
border-radius: 6px;
transform: scale(0.86) translateY(-5px);
transform-origin: center center;
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-mg2-score {
display: block;
font-family: 'NotoSansThai', sans-serif;
font-weight: 900;
font-size: 22px;
color: #ffffff;
line-height: 1;
text-shadow: 0 0 8px rgba(120, 220, 255, 0.6);
}
#play-cyber-hud.play-cyber-hud--quiz-tf-mock[data-mission-mock-skin="gauntlet_crown"] .play-cyber-score-row--mg2-mock.is-out .play-cyber-mg2-score {
color: #ff8a8a;
text-shadow: 0 0 8px rgba(255, 90, 90, 0.55);
}
html.play-mg2-mock-hud #gauntlet-crown-jump-btn.mg2-jump:not(.is-hidden) {
position: fixed !important;
right: auto !important;
bottom: auto !important;
z-index: 56;
border-radius: 0;
padding: 0;
margin: 0;
filter: drop-shadow(0 0 18px rgba(255, 110, 220, 0.45));
}
html.play-mg2-mock-hud #gauntlet-crown-jump-btn.mg2-jump:not(.is-hidden):active {
transform: translateY(1px);
}
html.play-mg2-mock-hud #gauntlet-crown-jump-btn.mg2-jump:not(.is-hidden) img {
width: 100%;
height: 100%;
object-fit: contain;
}
/* ====== หน้าสรุปผลภารกิจ (mng8a80o) — fix popup 1451×851 แล้ว scale ทั้งก้อนตาม mockup 06-summary ======
scope: #gauntlet-crown-mission-overlay.gcm-quiz-tf-mock
@@ -3688,6 +3926,151 @@
background-size: contain;
}
/* Minigame-2 mno9kb07 — สรุปผล 07-summary (gauntlet-assets + layout sm-*) */
#gauntlet-crown-mission-overlay.gcm-mg2-mock .gcm-backdrop {
background: rgba(4, 6, 18, 0.45);
backdrop-filter: none;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-total {
border-image: url('/Game/img/gauntlet-assets/popup-result-Line1.png') 3 stretch;
}
/* MG2 summary — sm-bottom 3 คอลัมน์: เกรด | เส้น Line2 | โบนัส */
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bottom {
grid-template-columns: 1fr 4px 1fr !important;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-col-grade {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
margin: 41px 14px 0 173px;
height: 174px;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-vrule {
display: flex;
justify-content: center;
align-self: stretch;
height: 270px;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-vrule .gcm-line-2 {
width: 4px;
height: 270px;
display: block;
object-fit: fill;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-col-bonus {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
width: 486px;
max-width: 100%;
padding: 0 !important;
border: none !important;
border-image: none !important;
}
/* MG2: หัวข้อโบนัสอยู่ใน .sm-bonus-left .head แล้ว — ซ่อน .gcm-h ซ้ำใน HTML */
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-col-bonus > .gcm-h {
display: none !important;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-frame img.gcm-av {
object-fit: cover;
object-position: center 32%;
transform: scale(0.9) translateY(-3px);
image-rendering: auto;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-sc-bonus {
font-size: 18px;
color: #ffd047;
margin-left: 2px;
text-shadow: 0 0 8px rgba(255, 200, 80, 0.45);
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-col-bonus .gcm-bonus,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock #gcm-bonus {
display: block;
width: auto;
max-width: 486px;
padding: 0 !important;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus {
display: flex;
flex-direction: row;
align-items: stretch;
justify-content: center;
gap: 14px;
width: auto;
max-width: 486px;
margin: 0;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-left,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus-left {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: flex-start;
gap: 8px;
width: 271px;
height: 272px;
flex-shrink: 0;
padding: 42px 0;
box-sizing: border-box;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-head,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus-left .head {
width: 100%;
height: 53px;
margin: 0;
padding: 0 23px;
text-align: left;
font-family: 'NotoSansThai', sans-serif;
font-weight: 700;
font-size: 40px;
line-height: 1.2;
color: #fff;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-complete,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus .complete {
display: block;
width: 271px !important;
height: 90px !important;
max-width: none !important;
max-height: none !important;
flex-shrink: 0;
object-fit: contain;
filter: drop-shadow(0 0 10px rgba(91, 255, 141, 0.45));
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-right,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus-right {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
height: 258px;
min-height: 258px;
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-right .bail-card,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .gcm-bonus-mg2-right .gcm-special-card-img,
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .sm-bonus-right .bail-card {
display: block;
width: auto !important;
height: 258px !important;
max-width: 152px !important;
max-height: none !important;
object-fit: contain;
object-position: center center;
filter: drop-shadow(0 0 14px rgba(120, 220, 255, 0.55));
}
#gauntlet-crown-mission-overlay.gcm-mg2-mock.gcm-quiz-tf-mock .btn-gcm-done {
left: 784px !important;
top: 818px !important;
width: 351px;
height: 141px;
background-image: url('/Game/img/gauntlet-assets/btn-done.png');
filter: drop-shadow(0 0 14px rgba(120, 220, 255, 0.45));
}
/* Quiz Battle — MCQ โดม (กด E) */
#quiz-battle-mcq-overlay {
position: fixed;
@@ -3814,7 +4197,7 @@
<div class="play-cyber-hud-mock-stage" aria-hidden="true">
<aside class="play-cyber-scoreboard" aria-label="SCORE">
<div id="play-cyber-crown-score-head" class="play-cyber-crown-score-head is-hidden" aria-hidden="true">
<img id="play-cyber-crown-score-img" alt="" width="120" height="32" decoding="async" />
<img id="play-cyber-crown-score-img" class="mg2-score-label" src="/Game/img/gauntlet-assets/score.png" alt="SCORE :" width="144" height="71" decoding="async" />
</div>
<div class="play-cyber-panel-title">SCORE</div>
<ul id="play-cyber-score-list" class="play-cyber-score-list"></ul>
@@ -3937,7 +4320,8 @@
</div>
<div id="gauntlet-crown-countdown" class="is-hidden" role="alert" aria-live="assertive" aria-atomic="true">
<div class="gcc-panel">
<img id="gauntlet-crown-countdown-num" class="gcc-num" src="/Game/img/QUESTION/3.png" width="240" height="240" alt="" decoding="async" />
<img id="gauntlet-crown-countdown-num" class="gcc-num gcc-num--img" src="/Game/img/gauntlet-assets/3.png" width="240" height="240" alt="" decoding="async" />
<span id="gauntlet-crown-countdown-text" class="gcc-num gcc-num--text is-hidden" aria-hidden="true">3</span>
</div>
</div>
<div id="stack-tower-result-flash" class="is-hidden" role="dialog" aria-modal="true" aria-hidden="true" aria-label="ผลภารกิจ Tower">
@@ -3953,12 +4337,15 @@
<div id="gcm-rank-row" class="gcm-rank-row"></div>
<p id="gcm-total" class="gcm-total"></p>
<div class="gcm-bottom">
<div>
<div class="gcm-h">ระดับความสำเร็จ</div>
<div id="gcm-grade" class="gcm-grade" aria-live="polite">A</div>
<div class="gcm-col-grade">
<div class="gcm-h head">ระดับความสำเร็จ</div>
<div id="gcm-grade" class="gcm-grade sm-grade" aria-live="polite">A</div>
</div>
<div>
<div class="gcm-h">โบนัสพิเศษ</div>
<div id="gcm-vrule" class="gcm-vrule sm-vrule is-hidden" aria-hidden="true">
<img class="gcm-line-2 sm-line-2" src="/Game/img/gauntlet-assets/popup-result-Line2.png" alt="" decoding="async" />
</div>
<div class="gcm-col-bonus">
<div class="gcm-h head">โบนัสพิเศษ</div>
<div id="gcm-bonus" class="gcm-bonus"></div>
</div>
</div>
@@ -4107,7 +4494,7 @@
<script src="/app-base.js?v=2"></script>
<script src="/Game/socket.io/socket.io.js"></script>
<script src="js/version.js?v=0.0306"></script>
<script src="js/play.js?v=0.00607144429"></script>
<script src="js/play.js?v=0.00610144433"></script>
<div class="version-tag">v —</div>
</body>
</html>