update flow design
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -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.02–0.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 (0–0.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 (0–0.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) ===== -->
|
||||
|
||||
@@ -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
@@ -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/4–7) */
|
||||
/** สรุปภารกิจแบบ mockup — ต่อมินิเกม mission map (Minigame 1/4–7 + 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/4–7) */
|
||||
/* mission map — สรุปผลภารกิจตาม mockup (Minigame 1/4–7 + 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';
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user