minigame 6 add more design 1.1

This commit is contained in:
2026-05-06 06:15:53 +00:00
parent f6c24af772
commit 14ce8543a1
6 changed files with 493 additions and 30 deletions
+12 -12
View File
@@ -20,20 +20,20 @@
"stackTeamMissesMax": 3,
"stackTowerProgressBlocks": 50,
"stackBlockNormalImageUrls": [
"",
"",
"",
"",
"",
""
"/Game/img/TowerBlock/Block-Code-1-red.png",
"/Game/img/TowerBlock/Block-Code-2-orange.png",
"/Game/img/TowerBlock/Block-Code-3-Yellow.png",
"/Game/img/TowerBlock/Block-Code-4-Green.png",
"/Game/img/TowerBlock/Block-Code-5-Blue.png",
"/Game/img/TowerBlock/Block-Code-6-Navy.png"
],
"stackBlockHeavyImageUrls": [
"",
"",
"",
"",
"",
""
"/Game/img/TowerBlock/Block-Code-1-red-2.png",
"/Game/img/TowerBlock/Block-Code-2-orange-2.png",
"/Game/img/TowerBlock/Block-Code-3-Yellow-2.png",
"/Game/img/TowerBlock/Block-Code-4-Green-2.png",
"/Game/img/TowerBlock/Block-Code-5-Blue-2.png",
"/Game/img/TowerBlock/Block-Code-6-Navy-2.png"
],
"stackHeavyBlockPercent": 35,
"jumpSurviveJumpHeightMult": 1.5,
@@ -0,0 +1,301 @@
/**
* Editor embed — Stack mode HUD mock (visual match play.html cyber HUD / mnn93hpi preview).
* Shown only when body.editor-embed-admin + #editor-stack-hud-mock:not(.is-hidden)
*/
body.editor-embed-admin .canvas-wrap {
position: relative;
}
body.editor-embed-admin #editor-stack-hud-mock {
position: absolute;
inset: 0;
z-index: 3;
pointer-events: none;
font-family: 'Share Tech Mono', ui-monospace, monospace;
}
body.editor-embed-admin #editor-stack-hud-mock.is-hidden {
display: none !important;
}
/* —— SCORE (left) — same tokens as #play-cyber-hud.play-cyber-hud--question-mission .play-cyber-scoreboard —— */
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score {
position: absolute;
top: max(10px, env(safe-area-inset-top, 0px));
left: max(8px, env(safe-area-inset-left, 0px));
width: min(252px, 64vw);
max-width: min(252px, 64vw);
box-sizing: border-box;
padding: 0.48rem 0.62rem 0.52rem;
background: linear-gradient(
165deg,
rgba(10, 26, 48, 0.92) 0%,
rgba(5, 14, 32, 0.94) 42%,
rgba(8, 20, 40, 0.9) 100%
);
border: 1px solid rgba(0, 255, 240, 0.38);
border-radius: 2px;
box-shadow:
0 0 0 1px rgba(0, 0, 0, 0.45),
0 0 24px rgba(0, 200, 255, 0.16),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score-title {
display: block;
font-family: 'Orbitron', sans-serif;
font-weight: 800;
font-size: clamp(0.82rem, 2.4vmin, 0.95rem);
letter-spacing: 0.22em;
text-transform: uppercase;
color: #8afeff;
text-shadow:
0 0 16px rgba(0, 240, 255, 0.62),
0 0 32px rgba(0, 160, 255, 0.32);
margin: 0 0 0.34rem;
padding: 0 0 0.38rem;
border-bottom: 1px solid rgba(0, 255, 240, 0.48);
text-align: left;
line-height: 1.15;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score-list {
list-style: none;
margin: 0;
padding: 0;
max-height: 40vh;
overflow: auto;
box-sizing: border-box;
width: 100%;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score-row {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 0.42rem;
width: 100%;
min-width: 0;
box-sizing: border-box;
padding: 0.3rem 0;
border-bottom: 1px solid rgba(0, 255, 240, 0.32);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score-row:last-child {
border-bottom: none;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__score-left {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
gap: 0.4rem;
flex: 1 1 auto;
min-width: 0;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__av-wrap {
display: block;
width: 34px;
height: 34px;
flex-shrink: 0;
overflow: hidden;
border-radius: 2px;
border: 1px solid rgba(0, 255, 240, 0.4);
background: rgba(0, 16, 28, 0.95);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__av {
display: block;
width: 34px;
height: 34px;
border: none;
object-fit: cover;
object-position: center 4%;
transform: scale(1.38);
transform-origin: center 8%;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__name {
font-size: 0.58rem;
font-weight: 600;
letter-spacing: 0.04em;
color: rgba(248, 252, 255, 0.95);
text-shadow: 0 1px 5px rgba(0, 0, 0, 0.92);
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__points {
flex: 0 0 auto;
font-family: 'Orbitron', sans-serif;
font-size: clamp(1.02rem, 3.5vmin, 1.38rem);
font-weight: 800;
color: #7af8ff;
text-align: right;
line-height: 1;
text-shadow:
0 0 14px rgba(0, 255, 240, 0.48),
0 0 26px rgba(0, 160, 255, 0.22);
white-space: nowrap;
}
/* —— TIME (center) —— */
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__center {
position: absolute;
top: max(10px, env(safe-area-inset-top, 0px));
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
z-index: 2;
max-width: min(92vw, 520px);
pointer-events: none;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__time-label {
font-family: 'Orbitron', sans-serif;
font-size: 0.62rem;
font-weight: 700;
letter-spacing: 0.28em;
color: rgba(0, 255, 200, 0.55);
margin-bottom: 0.15rem;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__time-val {
font-family: 'Orbitron', sans-serif;
font-weight: 800;
font-size: clamp(1.35rem, 4vmin, 1.85rem);
line-height: 1;
color: #7fffab;
text-shadow:
0 0 20px rgba(100, 255, 180, 0.55),
0 0 40px rgba(0, 255, 140, 0.25);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__time-sub {
margin-top: 0.28rem;
font-size: 0.52rem;
letter-spacing: 0.1em;
color: rgba(122, 248, 255, 0.52);
max-width: min(88vw, 420px);
line-height: 1.35;
}
/* —— SYSTEM INTEGRITY + avatar (right) —— */
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__right {
position: absolute;
top: max(10px, env(safe-area-inset-top, 0px));
right: max(8px, env(safe-area-inset-right, 0px));
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 0.45rem;
max-width: min(96vw, 340px);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__avatar-col {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.35rem;
flex: 0 0 auto;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__integrity {
flex: 1 1 auto;
min-width: 0;
padding: 0.42rem 0.55rem 0.48rem;
background: linear-gradient(
155deg,
rgba(8, 22, 42, 0.94) 0%,
rgba(4, 12, 28, 0.96) 100%
);
border: 1px solid rgba(0, 255, 240, 0.38);
border-radius: 4px;
box-shadow:
0 0 0 1px rgba(0, 0, 0, 0.45),
0 0 22px rgba(0, 200, 255, 0.14),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__integrity-title {
font-family: 'Orbitron', sans-serif;
font-weight: 800;
font-size: 0.58rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: #5cf0ff;
text-shadow: 0 0 10px rgba(92, 240, 255, 0.45);
margin-bottom: 0.22rem;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__hearts {
font-size: 0.72rem;
letter-spacing: 0.18em;
color: rgba(255, 255, 255, 0.95);
text-shadow: 0 0 8px rgba(255, 255, 255, 0.25);
margin-bottom: 0.28rem;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__bracket {
color: rgba(200, 240, 255, 0.75);
font-weight: 700;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__heart {
margin: 0 0.12em;
color: #fff;
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__meta {
font-size: 0.52rem;
letter-spacing: 0.08em;
color: rgba(232, 248, 255, 0.88);
line-height: 1.45;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.85);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__avatar-frame {
flex: 0 0 auto;
padding: 4px;
background: linear-gradient(145deg, rgba(0, 60, 70, 0.9), rgba(0, 20, 35, 0.95));
border: 1px solid rgba(0, 255, 240, 0.45);
border-radius: 6px;
box-shadow:
0 0 24px rgba(0, 200, 255, 0.2),
inset 0 0 20px rgba(0, 255, 240, 0.06);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__avatar-img {
display: block;
width: 64px;
height: 64px;
object-fit: cover;
object-position: center 6%;
transform: scale(1.15);
transform-origin: center 10%;
image-rendering: pixelated;
background: rgba(0, 8, 16, 0.9);
}
body.editor-embed-admin #editor-stack-hud-mock .editor-stack-hud-mock__link-chip {
min-width: 1.65rem;
padding: 0.12rem 0.28rem;
font-family: 'Orbitron', sans-serif;
font-size: 0.62rem;
font-weight: 800;
color: #7af8ff;
border: 1px solid rgba(0, 255, 240, 0.4);
border-radius: 3px;
background: rgba(0, 24, 36, 0.92);
text-align: center;
box-shadow: 0 0 12px rgba(0, 200, 255, 0.2);
}
+40 -2
View File
@@ -6,7 +6,11 @@
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<title>Editor ฉาก — Game</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;800&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/style.css?v=20260427-canvas-pixel">
<link rel="stylesheet" href="css/editor-stack-hud-mock.css?v=0.0001">
</head>
<body>
<div class="container editor-page">
@@ -357,12 +361,46 @@
</section>
</div>
<div class="editor-workspace">
<div class="canvas-wrap"><canvas id="editor-canvas"></canvas></div>
<div class="canvas-wrap">
<canvas id="editor-canvas"></canvas>
<div id="editor-stack-hud-mock" class="is-hidden" aria-hidden="true">
<aside class="editor-stack-hud-mock__score" aria-label="SCORE">
<div class="editor-stack-hud-mock__score-title">SCORE</div>
<ul class="editor-stack-hud-mock__score-list">
<li class="editor-stack-hud-mock__score-row">
<div class="editor-stack-hud-mock__score-left">
<span class="editor-stack-hud-mock__av-wrap"><img class="editor-stack-hud-mock__av" src="/Game/img/characters/1_down.png" alt=""></span>
<span class="editor-stack-hud-mock__name">ผู้เล่นทดสอบ</span>
</div>
<span class="editor-stack-hud-mock__points">0</span>
</li>
</ul>
</aside>
<div class="editor-stack-hud-mock__center">
<div class="editor-stack-hud-mock__time-label">TIME</div>
<div class="editor-stack-hud-mock__time-val">0</div>
<div class="editor-stack-hud-mock__time-sub">TOWER STACK · DECRYPT — TIME (sec) · เหลือเวลาถอดรหัส</div>
</div>
<div class="editor-stack-hud-mock__right">
<div class="editor-stack-hud-mock__integrity">
<div class="editor-stack-hud-mock__integrity-title">SYSTEM INTEGRITY:</div>
<div class="editor-stack-hud-mock__hearts" aria-hidden="true"><span class="editor-stack-hud-mock__bracket">[</span><span class="editor-stack-hud-mock__heart"></span><span class="editor-stack-hud-mock__heart"></span><span class="editor-stack-hud-mock__heart"></span><span class="editor-stack-hud-mock__bracket">]</span></div>
<div class="editor-stack-hud-mock__meta">P1 • ผู้เล่นทดสอบ • TEAM 0 • COMBO x0</div>
</div>
<div class="editor-stack-hud-mock__avatar-col">
<div class="editor-stack-hud-mock__avatar-frame">
<img class="editor-stack-hud-mock__avatar-img" src="/Game/img/characters/1_down.png" alt="">
</div>
<div class="editor-stack-hud-mock__link-chip" title="LINK">O</div>
</div>
</div>
</div>
</div>
<p class="legend" id="editor-status">บันทึกแล้วจะได้รหัสฉาก ใช้รหัสนี้ตอนสร้างห้องในล็อบบี้</p>
</div>
</div>
<script src="js/version.js?v=0.0258"></script>
<script src="js/editor.js?v=0.0319"></script>
<script src="js/editor.js?v=0.0320"></script>
<div class="version-tag">v —</div>
</body>
</html>
+14 -1
View File
@@ -600,6 +600,16 @@
block.hidden = !show;
}
/** Admin embed: แสดง HUD จำลองแบบ play (mnn93hpi / cyber SCORE + TIME + SYSTEM INTEGRITY) เมื่อโหมด Stack */
function syncEditorStackHudMock() {
const el = document.getElementById('editor-stack-hud-mock');
if (!el || !editorEmbed) return;
const gt = gameTypeEl ? gameTypeEl.value : gameType;
const show = gt === 'stack';
el.classList.toggle('is-hidden', !show);
el.setAttribute('aria-hidden', show ? 'false' : 'true');
}
function editorGauntletRunwayBgEligibleFromMap(m) {
const gt = (m && m.gameType != null && m.gameType !== '') ? m.gameType : (gameTypeEl ? gameTypeEl.value : gameType);
return mapId === EDITOR_GAUNTLET_RUNWAY_BG_MAP_ID && gt === 'gauntlet';
@@ -3284,6 +3294,7 @@
})();
syncEditorGauntletRunwayBgBlockVisibility();
syncEditorStackHudMock();
if (isEditorScrollBgMap()) applyEditorBgScrollFromMap({});
if (isEditorGauntletRunwayBgMap()) applyGauntletCrownRunwayBgFromMap({});
if (isEditorStackTowerMissionMap()) applyStackTowerCameraFollowFromMap({});
@@ -3398,6 +3409,7 @@
if (drawModeEl && (drawModeEl.value === 'quizBattleDome' || drawModeEl.value === 'quizBattlePath') && gameType !== 'quiz_battle') drawModeEl.value = 'wall';
if (drawModeEl && drawModeEl.value === 'lobbyPlayerSpawn' && !supportsLobbySpawnPaint(gameType)) drawModeEl.value = 'wall';
toggleFroggerUI();
syncEditorStackHudMock();
syncGridImageBrushInputCaps();
syncDrawModeAuxUi();
});
@@ -3958,6 +3970,7 @@
gameType = m.gameType || 'zep';
if (gameTypeEl) gameTypeEl.value = gameType;
syncEditorGauntletRunwayBgBlockVisibility();
syncEditorStackHudMock();
applyGauntletCrownRunwayBgFromMap(m);
applyStackTowerCameraFollowFromMap(m);
lanes = (m.lanes && m.lanes.length) ? m.lanes.map(l => ({ ...l })) : [];
@@ -3972,5 +3985,5 @@
toggleFroggerUI();
})
.catch(() => initGrid());
} else { initGrid(); toggleFroggerUI(); }
} else { initGrid(); toggleFroggerUI(); syncEditorStackHudMock(); }
})();
+76 -14
View File
@@ -4138,6 +4138,11 @@
return isJumpSurviveMissionUiMapPlay() && jumpSurviveMissionPhase === 'live';
}
/** Space Shooter mnpz6rkp — ช่วงเล่นจริง: HUD เดียวกับ Stack mission (คลาส question-mission + TIME plaque) */
function isSpaceShooterMissionHudActivePlay() {
return isSpaceShooterMissionUiMapPlay() && spaceShooterMissionPhase === 'live';
}
function stackTowerAssetUrl(file) {
return BASE + '/img/TowerBlock/' + String(file || '').replace(/^\/+/, '');
}
@@ -15163,7 +15168,8 @@
const qText = document.getElementById('play-cyber-quiz-mission-q-text');
const qPlaque = document.getElementById('play-cyber-quiz-mission-q-plaque');
const tb = root ? root.querySelector('.play-cyber-time-block') : null;
const on = isQuizQuestionMissionHudActivePlay() || isStackTowerMissionHudActivePlay() || isJumpSurviveMissionHudActivePlay();
const on = isQuizQuestionMissionHudActivePlay() || isStackTowerMissionHudActivePlay() || isJumpSurviveMissionHudActivePlay()
|| isSpaceShooterMissionHudActivePlay();
if (isQuizQuestionMissionUiMapPlay()) {
if (qBand) {
qBand.classList.add('is-hidden');
@@ -15232,6 +15238,14 @@
}
}
function playCyberHudEsc(t) {
return String(t == null ? '' : t)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
/** แถบ Cyber SCORE — ใช้ tint เดียวกับในเกม (ไม่ใช้ PNG รวมซิลูเอตขาวจาก getCharacterImg อย่างเดียว) */
function setCyberHudScoreAvatarImg(avImg, row) {
const cid = row.characterId ? String(row.characterId) : '';
@@ -15297,6 +15311,7 @@
root.classList.remove('play-cyber-hud--question-mission');
root.classList.remove('play-cyber-hud--score-flush-left');
root.classList.remove('play-cyber-hud--jump-mission-hide-score');
root.classList.remove('play-cyber-hud--ss-self-integrity-left');
}
}
if (stackEl) stackEl.classList.toggle('play-cyber-vignette', !!on);
@@ -15305,12 +15320,14 @@
if (!on || !root) return;
root.classList.toggle(
'play-cyber-hud--question-mission',
!!(isQuizQuestionMissionHudActivePlay() || isStackTowerMissionHudActivePlay() || isJumpSurviveMissionHudActivePlay()),
!!(isQuizQuestionMissionHudActivePlay() || isStackTowerMissionHudActivePlay() || isJumpSurviveMissionHudActivePlay()
|| isSpaceShooterMissionHudActivePlay()),
);
root.classList.toggle(
'play-cyber-hud--stack-tower-canvas-hud',
!!(previewFillBots && stackMini && isStack() && isStackTowerMissionUiMapPlay()),
);
root.classList.toggle('play-cyber-hud--ss-self-integrity-left', !!isSpaceShooterMissionHudActivePlay());
/** แถบ SCORE แนวนอน (mno9kb07) — ใช้รูปแบบเดียวกับ quiz_carry / พรีวิว editor */
root.classList.toggle(
'play-cyber-hud--gauntlet-crown-strip',
@@ -15332,14 +15349,16 @@
? (playQuizPhaseLocal === 'read' ? 'READ · อ่านคำถาม'
: (playQuizPhaseLocal === 'answer' ? 'ANSWER · เดินไปโซน จริง / เท็จ'
: 'QUIZ MISSION · ประลองความรู้'))
: (isStackTowerMissionHudActivePlay()
? 'TOWER STACK · DECRYPT — TIME (sec) · เหลือเวลาถอดรหัส'
: (isQuizCarry()
? 'QUIZ CARRY · COURT — หยิบป้ายถูกแล้วส่งที่ฮับ (F / Grab)'
: (isGauntlet() ? 'GAUNTLET · SURVIVAL RUN'
: (isSpaceShooter() ? 'SPACE SHOOTER · ARCADE'
: (isBalloonBoss() ? 'BALLOON BOSS · MEGA VIRUS'
: (isJumpSurviveMissionUiMapPlay() ? 'JUMPER · SURVIVE — เหลือเวลา (วินาที) · TIME (sec)' : 'JUMP SURVIVE · NODE UPLINK'))))));
: (isSpaceShooterMissionHudActivePlay()
? 'SPACE SHOOTER · ARCADE — TIME (sec) · ภารกิจยิงยาน'
: (isStackTowerMissionHudActivePlay()
? 'TOWER STACK · DECRYPT — TIME (sec) · เหลือเวลาถอดรหัส'
: (isQuizCarry()
? 'QUIZ CARRY · COURT — หยิบป้ายถูกแล้วส่งที่ฮับ (F / Grab)'
: (isGauntlet() ? 'GAUNTLET · SURVIVAL RUN'
: (isSpaceShooter() ? 'SPACE SHOOTER · ARCADE'
: (isBalloonBoss() ? 'BALLOON BOSS · MEGA VIRUS'
: (isJumpSurviveMissionUiMapPlay() ? 'JUMPER · SURVIVE — เหลือเวลา (วินาที) · TIME (sec)' : 'JUMP SURVIVE · NODE UPLINK')))))));
}
if (timeVal) {
if (isQuiz() && isQuizQuestionMissionUiMapPlay()) {
@@ -15437,7 +15456,9 @@
if (portrait) {
const cid = me.characterId || getPlayCharacterId();
const dir = (isGauntletFaceRightMapMno9kb07() ? 'right' : (me.direction || 'down'));
const dir = isSpaceShooter()
? 'down'
: (isGauntletFaceRightMapMno9kb07() ? 'right' : (me.direction || 'down'));
const nowT = Date.now();
const walk = !!me.isWalking;
const rawImg = getAvatarImg(cid, dir, nowT, walk);
@@ -15458,7 +15479,47 @@
}
}
if (statusEl) {
if (isQuizQuestionMissionHudActivePlay()) {
if (isSpaceShooterMissionHudActivePlay()) {
ensureStackTowerLifeHudImagesPlay();
const nn = String((me.nickname || nick || 'PILOT')).trim().slice(0, 24);
const hits = Math.max(0, Math.min(SPACE_SHOOTER_MISSION_MAX_ASTEROID_HITS, Number(me.spaceShooterHits) || 0));
const rem = SPACE_SHOOTER_MISSION_MAX_ASTEROID_HITS - hits;
const esc = playCyberHudEsc(nn);
const W = 220;
const H = 58;
const dpr = Math.min(2, Math.max(1, typeof window !== 'undefined' && window.devicePixelRatio ? window.devicePixelRatio : 1));
let canv = statusEl.querySelector('canvas.play-cyber-ss-integrity-canvas');
let metaEl = statusEl.querySelector('.play-cyber-ss-meta');
if (!canv || !metaEl) {
statusEl.textContent = '';
canv = document.createElement('canvas');
canv.className = 'play-cyber-ss-integrity-canvas';
canv.setAttribute('aria-hidden', 'true');
metaEl = document.createElement('div');
metaEl.className = 'play-cyber-ss-meta';
statusEl.appendChild(canv);
statusEl.appendChild(metaEl);
}
canv.width = Math.max(1, Math.floor(W * dpr));
canv.height = Math.max(1, Math.floor(H * dpr));
canv.style.width = W + 'px';
canv.style.height = H + 'px';
const ctxSs = canv.getContext('2d');
if (ctxSs) {
ctxSs.setTransform(dpr, 0, 0, dpr, 0, 0);
ctxSs.clearRect(0, 0, W + 2, H + 2);
drawStackTowerLifeIntegrityBarPlay(
ctxSs,
2,
2,
W - 4,
H - 4,
SPACE_SHOOTER_MISSION_MAX_ASTEROID_HITS,
rem,
);
}
metaEl.textContent = 'P1 · ' + esc + ' · TEAM 0 · COMBO x0';
} else if (isQuizQuestionMissionHudActivePlay()) {
statusEl.textContent = 'QUIZ LINK · ประลองความรู้';
} else if (isStackTowerMissionHudActivePlay()) {
statusEl.textContent = 'DECRYPT UPLINK · TOWER';
@@ -15574,8 +15635,9 @@
const quizMissionHud = isQuizQuestionMissionHudActivePlay();
const stackMissionHud = isStackTowerMissionHudActivePlay();
const jumpMissionLiveHud = isJumpSurviveMissionHudActivePlay();
/** แถบ SCORE แบบ mock mng8a80o (แนวนอน อวาตาร์+ชื่อ | คะแนน) — ภารกิจคำถาม + Stack Tower + Jumper mnptfts2 */
const cyberQmMockHud = quizMissionHud || stackMissionHud || jumpMissionLiveHud;
const spaceMissionLiveHud = isSpaceShooterMissionHudActivePlay();
/** แถบ SCORE แบบ mock mng8a80o (แนวนอน อวาตาร์+ชื่อ | คะแนน) — ภารกิจคำถาม + Stack Tower + Jumper mnptfts2 + Space mnpz6rkp */
const cyberQmMockHud = quizMissionHud || stackMissionHud || jumpMissionLiveHud || spaceMissionLiveHud;
const stackTeamPts = Math.max(0, Number(stackMini && stackMini.score) || 0);
const rows = [];
rows.push({
+50 -1
View File
@@ -1806,6 +1806,55 @@
#play-cyber-hud.play-cyber-hud--question-mission .play-cyber-preview-line {
display: none !important;
}
/* Space Shooter mnpz6rkp — แผงขวา: life-bar + life-full/hit เหมือน drawStackTowerLifeIntegrityBarPlay */
#play-cyber-hud.play-cyber-hud--question-mission .play-cyber-self-status {
max-width: min(230px, 48vw);
text-align: left;
letter-spacing: 0.05em;
line-height: 1.38;
font-size: 0.52rem;
color: rgba(232, 248, 255, 0.94);
}
/* Space Shooter integrity — canvas วาดด้วย drawStackTowerLifeIntegrityBarPlay (เส้นทางเดียวกับ Stack) */
#play-cyber-hud.play-cyber-hud--question-mission .play-cyber-ss-integrity-canvas {
display: block;
width: 220px;
max-width: 100%;
image-rendering: pixelated;
margin-bottom: 0.28rem;
}
#play-cyber-hud.play-cyber-hud--question-mission .play-cyber-ss-meta {
font-size: 0.5rem;
letter-spacing: 0.06em;
color: rgba(232, 248, 255, 0.88);
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.85);
}
/* Space Shooter live: แถบ integrity + meta อยู่ซ้ายของกรอบอวตาร */
#play-cyber-hud.play-cyber-hud--ss-self-integrity-left .play-cyber-self {
flex-direction: row;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 0.42rem;
max-width: min(96vw, 380px);
}
#play-cyber-hud.play-cyber-hud--ss-self-integrity-left .play-cyber-self-status {
order: 1;
flex: 1 1 auto;
min-width: 0;
}
#play-cyber-hud.play-cyber-hud--ss-self-integrity-left .play-cyber-self-frame {
order: 2;
flex-shrink: 0;
}
#play-cyber-hud.play-cyber-hud--ss-self-integrity-left .play-cyber-op-widgets {
order: 3;
flex-basis: 100%;
align-items: flex-end;
}
#play-cyber-hud.play-cyber-hud--ss-self-integrity-left .play-cyber-ss-integrity-canvas {
width: min(220px, 48vw);
}
/* Stack Tower: แผงโปรไฟล์วาดบน canvas — ซ่อนกล่อง portrait DOM ขวา ไม่ให้ซ้ำกับอวตารในแผง SYSTEM INTEGRITY */
#play-cyber-hud.play-cyber-hud--stack-tower-canvas-hud .play-cyber-self {
display: none !important;
@@ -3026,7 +3075,7 @@
</div>
<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.0323"></script>
<script src="js/play.js?v=0.0327"></script>
<div class="version-tag">v —</div>
</body>
</html>