diff --git a/www/html/Game/public/css/game-hud.css b/www/html/Game/public/css/game-hud.css new file mode 100644 index 0000000..5f81488 --- /dev/null +++ b/www/html/Game/public/css/game-hud.css @@ -0,0 +1,938 @@ +/* game HUD + summary — built from design (variant A + mg2 of B + summary) */ +/* ========================================================= + + game-hud.css – Shared HUD สำหรับทุกหน้า in-game + + • Top-left : SCORE panel (score-bar.png + 5 players) + + • Top-center: TIME counter + + • Top-right : Host avatar frame + mic button + + • Background: BG.png (1920x1080) + + ========================================================= */ + + + +.mg-stage { + + background: #04050d; + +} + + + +/* ---------------- พื้นหลัง BG เต็มจอ ---------------- */ + +.mg-bg { + + left: 0; + + top: 0; + + width: 1920px; + + height: 1080px; + + z-index: 1; + +} + +.mg-bg img { + + width: 100%; + + height: 100%; + + object-fit: cover; + +} + + + +/* ========================================================= + + มุมซ้ายบน : SCORE Panel (score-bar.png + 5 players) + + ========================================================= */ + +.mg-score-panel { + + left: 2px; + + top: 16px; + + width: 156px; + + height: 433px; + + padding: 0; + + overflow: hidden; + + background: url("/Game/img/mg-hud/score-bar.png") no-repeat left top / 156px 433px; + + border: none; + + border-radius: 0; + + box-shadow: none; + + z-index: 8; + +} + +.mg-score-title { + + /* ข้อความ SCORE อยู่ใน score-bar.png แล้ว */ + + position: absolute; + + width: 1px; + + height: 1px; + + padding: 0; + + margin: -1px; + + overflow: hidden; + + clip: rect(0, 0, 0, 0); + + white-space: nowrap; + + border: 0; + +} + + + +.mg-score-list { + + position: absolute; + + left: 16px; + + top: 60px; + + width: 136px; + + display: flex; + + flex-direction: column; + + gap: 5px; + +} + +.mg-score-row { + + display: flex; + + align-items: center; + + gap: 10px; + + height: 70px; + +} + +.mg-score-row .av { + + position: relative; + + width: 70px; + + height: 70px; + + flex: 0 0 70px; + + border-radius: 0; + + overflow: visible; + + background: transparent; + +} + +.mg-score-row .av::after { + + content: ""; + + position: absolute; + + inset: 0; + + background: url("/Game/img/mg-hud/score-avartar.png") no-repeat center / contain; + + pointer-events: none; + + z-index: 2; + +} + +.mg-score-row .av img { + + position: absolute; + + inset: 4px; + + width: calc(100% - 8px); + + height: calc(100% - 8px); + + object-fit: cover; + + border-radius: 6px; + + z-index: 1; + +} + +/* ไม่ใช้ placeholder สี — แสดงเฉพาะกรอบ score-avartar.png (หรือรูปใน ) */ +.mg-score-row .av .ph { + + display: none; + +} + +.mg-score-row .meta { + + display: flex; + + flex-direction: column; + + gap: 1px; + + line-height: 1.05; + + flex: 1; + + min-width: 0; + +} + +.mg-score-row .nm { + + font-family: "NotoSansThai", sans-serif; + + font-weight: 700; + + font-size: 11px; + + color: #e8f4ff; + + letter-spacing: 0.2px; + + text-transform: uppercase; + + white-space: nowrap; + +} + +.mg-score-row .sc { + + 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); + +} + + + +/* ========================================================= + + ตรงกลางบน : TIME : XX + + ========================================================= */ + +.mg-time { + + left: 50%; + + top: 23px; + + transform: translateX(-50%); + + display: flex; + + align-items: center; + + gap: 10px; + + z-index: 8; + +} + +.mg-time-label { + + width: 131px; + + height: 71px; + + flex: 0 0 131px; + +} + +.mg-time .num { + + font-family: "NotoSansThai", sans-serif; + + font-weight: 900; + + font-size: 42px; + + height: 71px; + + line-height: 71px; + + color: #e6f6ff; + + letter-spacing: 1px; + + font-variant-numeric: tabular-nums; + + text-shadow: + + 0 0 10px rgba(120, 220, 255, 0.85), + + 0 0 22px rgba(80, 180, 240, 0.55); + +} + +.mg-time.is-warning .num { + + color: #ff7a7a; + + text-shadow: + + 0 0 12px rgba(255, 90, 90, 0.85), + + 0 0 24px rgba(255, 60, 60, 0.5); + +} + +.mg-time.is-warning { + + animation: mg-pulse 0.9s ease-in-out infinite; + +} + +@keyframes mg-pulse { + + 0%, 100% { transform: translateX(-50%) scale(1); } + + 50% { transform: translateX(-50%) scale(1.08); } + +} + + + +/* ========================================================= + + มุมขวาบน : Host avatar (Avartar.png) + mic + + ========================================================= */ + +.mg-host { + + left: 1729px; + + top: 21px; + + width: 201px; + + height: 201px; + + z-index: 8; + +} + +.mg-host-frame { + + position: absolute; + + inset: 0; + + width: 100%; + + height: 100%; + + z-index: 2; + + pointer-events: none; + +} + +.mg-host-face { + + position: absolute; + + left: 49px; + + top: 49px; + + width: 104px; + + height: 104px; + + border-radius: 8px; + + object-fit: cover; + + z-index: 1; + +} + +.mg-host-face:not([src]), + +.mg-host-face[src=""] { + + display: none; + +} + +.mg-host .host-ph { + + display: none; + +} + + + +.mg-mic { + + left: 1796px; + + top: 205px; + + width: 121px; + + height: 121px; + + z-index: 8; + +} + +.mg-mic img { + + width: 100%; + + height: 100%; + +} + + + +/* ===== variant B (M2/4/7) mg2-* additions ===== */ +/* ---------- SCORE bar แนวนอน (Mockup/02–07) ---------- */ +/* อ้างอิง Mockup/02: SCORE เริ่ม x≈50 · ผู้เล่น 5 คนห่าง center-to-center ≈155px */ +.mg2-score-bar{left: 50px; + top: 30px; + display: flex; + align-items: flex-start; + gap: 0; + z-index: 8;} +.mg2-score-label{width: 144px; + height: 71px; + flex: 0 0 144px; + margin: 0 1px 0 0; + transform: translateY(11px);} +.mg2-players{display: flex; + align-items: flex-start; + gap: 85px;} +.mg2-player{width: 70px; + text-align: center; + flex: 0 0 70px;} +.mg2-player .nm{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;} +.mg2-player .av{position: relative; + width: 70px; + height: 70px; + margin: 0 auto 4px;} +.mg2-player .av::after{content: ""; + position: absolute; + inset: 0; + background: url("/Game/img/mg-hud/score-avartar.png") no-repeat center / contain; + pointer-events: none; + z-index: 2;} +.mg2-player .av img{position: absolute; + inset: 4px; + width: calc(100% - 8px); + height: calc(100% - 8px); + object-fit: cover; + border-radius: 6px; + z-index: 1;} +.mg2-player .sc{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);} +.mg2-player.is-zero .sc{color: #ff8a8a; + text-shadow: 0 0 8px rgba(255, 90, 90, 0.55);} +/* ---------- JUMP button (มุมขวาล่าง) ---------- */ +.mg2-jump{left: 1648px; + top: 818px; + width: 231px; + height: 231px; + z-index: 8;} +.mg2-jump img{width: 100%; + height: 100%; + filter: drop-shadow(0 0 18px rgba(255, 110, 220, 0.45));} +.mg2-jump.btn:hover{transform: translateY(-3px);} +.mg2-jump.btn:hover img{filter: drop-shadow(0 0 28px rgba(255, 110, 220, 0.75));} +.mg2-jump.btn:active{transform: translateY(1px);} + +/* ===== summary (ผลสรุป) ===== */ +/* ========================================================= + summary.css – หน้า 06 สรุปผลภารกิจ + อ้างอิง Mockup/06.png + ขนาด asset จริง (1920×1080) + popup-result.png 1451×851 @ 234,114 + popup-result-Line1 938×3 + popup-result-Line2 4×270 + player-frame.png 137×137 + mission-complete-select 271×90 + btn-done.png 351×141 + card-5 (Bail Coin) 287×383 + ========================================================= */ + +.sm-overlay { + left: 0; + top: 0; + width: 1920px; + height: 1080px; + background: rgba(4, 6, 18, 0.45); + z-index: 9; +} + +/* ---------- popup-result.png ---------- */ +.sm-popup { + left: 234px; + top: 114px; + width: 1451px; + height: 851px; + z-index: 10; +} + +.sm-popup img { + width: 100%; + height: 100%; + display: block; +} + +/* ---------- content layer (พิกัดเดียวกับ popup) ---------- */ +.sm-content { + left: 234px; + top: 114px; + width: 1451px; + height: 851px; + z-index: 11; + overflow: hidden; +} + +/* ========================================================= + แถวอันดับ 5 คน + mockup: 5 ช่อง × 137px + gap 30px กึ่งกลาง (ไม่ space-between) + รวมความกว้าง = 5×137 + 4×30 = 805px + ========================================================= */ +.sm-ranks { + position: absolute; + left: 323px; + top: 168px; + display: flex; + align-items: flex-start; + gap: 30px; + width: 805px; +} + +.sm-rank { + flex: 0 0 137px; + width: 137px; + min-width: 137px; + text-align: center; + position: relative; +} + +.sm-rank .pos { + display: block; + width: 41px; + height: 21px; + margin: 0 auto 6px; + object-fit: contain; +} + +/* กรอบ avatar = player-frame.png เท่านั้น (สีตัวละครอยู่ใน portrait) */ +.sm-rank .av { + position: relative; + width: 137px; + height: 137px; + margin: 0 auto 8px; + background: transparent; + overflow: visible; +} + +.sm-rank .portrait { + position: absolute; + inset: 10px; + z-index: 2; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + background: transparent; +} + +/* ตัวละคร placeholder — จัดกึ่งกลางในกรอบ 117×117 */ +.sm-rank .chibi { + position: relative; + width: 86px; + height: 92px; + flex-shrink: 0; +} + +.sm-rank .ch-body { + position: absolute; + left: 50%; + bottom: 0; + width: 86px; + height: 52px; + transform: translateX(-50%); + border-radius: 50%; + background: var(--body, #6a6f96); + box-shadow: inset 0 6px 8px rgba(255, 255, 255, 0.2); +} + +.sm-rank .ch-head { + position: absolute; + left: 50%; + bottom: 34px; + width: 54px; + height: 54px; + transform: translateX(-50%); + border-radius: 50%; + background: var(--skin, #f5d6b3); + z-index: 2; +} + +.sm-rank .ch-hair { + position: absolute; + left: 50%; + bottom: 52px; + width: 62px; + height: 36px; + transform: translateX(-50%); + border-radius: 50% 50% 16px 16px / 80% 80% 28% 28%; + background: var(--hair, #2a2a2a); + z-index: 3; +} + +/* ทุกอันดับใช้ player-frame.png ตรง asset — ไม่ hue-rotate */ +.sm-rank .av .frame { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + z-index: 3; + pointer-events: none; + object-fit: contain; +} + +/* ผู้เสียสละ — จางลง + stamp */ +.sm-rank.is-out .av, +.sm-rank.is-out .portrait, +.sm-rank.is-out .chibi, +.sm-rank.is-out .ch-body, +.sm-rank.is-out .ch-head, +.sm-rank.is-out .ch-hair, +.sm-rank.is-out .av .frame { + filter: opacity(0.5); +} + +.sm-rank .nm { + font-family: "NotoSansThai", sans-serif; + font-weight: 900; + font-size: 17px; + color: #ffffff; + letter-spacing: 0.6px; + line-height: 1.1; + margin-bottom: 2px; +} + +.sm-rank .sc { + font-family: "NotoSansThai", sans-serif; + font-weight: 900; + font-size: 30px; + color: #ffffff; + text-shadow: 0 0 10px rgba(120, 220, 255, 0.4); + line-height: 1; +} + +.sm-rank .sc .bonus { + font-size: 18px; + color: #ffd047; + margin-left: 2px; + text-shadow: 0 0 8px rgba(255, 200, 80, 0.45); +} + +.sm-rank .av .stamp { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) rotate(-8deg); + width: 114px; + height: auto; + z-index: 5; + pointer-events: none; +} + +/* ========================================================= + คะแนนรวม + ========================================================= */ +.sm-total { + position: absolute; + left: 5px; + right: 0; + top: 398px; + z-index: 4; + text-align: center; + font-family: "NotoSansThai", sans-serif; + font-weight: 700; + font-size: 24px; + color: #ffd047; + text-shadow: + 0 0 10px rgba(255, 200, 80, 0.45), + 0 2px 4px rgba(0, 0, 0, 0.6); + letter-spacing: 0.3px; + line-height: 1.2; +} + +.sm-total .num { + font-weight: 900; + font-size: 40px; + color: #ffffff; + text-shadow: 0 0 14px rgba(120, 220, 255, 0.55); + margin-left: 6px; +} + +/* เส้นแนวนอน บน + ล่าง "คะแนนรวม" (popup-result-Line1.png 938×3) */ +.sm-line-1 { + position: absolute; + left: 50%; + transform: translateX(-50%); + width: 938px; + height: 3px; + display: block; + object-fit: fill; + z-index: 4; + pointer-events: none; +} + +.sm-line-above { + top: 394px; +} + +.sm-line-below { + top: 452px; +} + +/* ========================================================= + โซนล่าง — ระดับความสำเร็จ | โบนัสพิเศษ (Mockup/06) + grid 3 คอลัมน์: 1fr | เส้น 4px | 1fr ภายใน padding 72px + ========================================================= */ +.sm-bottom { + position: absolute; + left: 72px; + right: 72px; + top: 460px; + height: 270px; + display: grid; + grid-template-columns: 1fr 4px 1fr; + align-items: start; + column-gap: 0; + pointer-events: none; +} + +.sm-bottom > * { + pointer-events: auto; +} + +.sm-col { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + text-align: center; + min-width: 0; +} + +.sm-col-grade { + margin-left: 173px; + margin-right: 14px; + margin-top: 41px; + height: 174px; + vertical-align: top; +} + +.sm-col .head { + font-family: "NotoSansThai", sans-serif; + font-weight: 700; + font-size: 24px; + line-height: 1.2; + color: #ffffff; + margin: 0 0 12px; + padding: 0; + letter-spacing: 0.3px; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); +} + +.sm-col-grade .head { + height: 40px; + font-size: 40px; +} + +.sm-grade { + margin: 0; + padding: 7px 6px; + font-family: "NotoSansThai", sans-serif; + font-weight: 900; + font-size: 96px; + color: #ffffff; + text-shadow: + 0 0 16px rgba(120, 220, 255, 0.65), + 0 0 32px rgba(80, 180, 240, 0.4); + line-height: 0.95; +} + +/* เส้นแบ่งแนวตั้ง (popup-result-Line2.png 4×270) */ +.sm-vrule { + display: flex; + justify-content: center; + align-self: stretch; + height: 270px; +} + +.sm-line-2 { + width: 4px; + height: 270px; + display: block; + object-fit: fill; +} + +/* โบนัส: ซ้าย = หัวข้อ + ภารกิจสำเร็จ | ขวา = Bail Coin สูงเท่ากลุ่มซ้าย */ +.sm-col-bonus { + align-items: center; + width: 486px; +} + +.sm-bonus { + display: flex; + flex-direction: row; + align-items: stretch; + justify-content: center; + gap: 14px; + width: auto; + max-width: 100%; + margin-left: 0; + margin-right: 0; +} + +.sm-bonus-left { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-start; + gap: 8px; + width: 271px; + height: 272px; + flex-shrink: 0; + font-size: 15px; + padding-top: 42px; + padding-bottom: 42px; + vertical-align: middle; +} + +.sm-bonus-left .head { + width: 100%; + height: 53px; + margin: 0; + text-align: left; + font-size: 40px; + line-height: 1.2; + padding-left: 23px; + padding-right: 23px; +} + +.sm-bonus .complete { + display: block; + width: 271px; + height: 90px; + flex-shrink: 0; + object-fit: contain; + filter: drop-shadow(0 0 10px rgba(91, 255, 141, 0.45)); +} + +.sm-bonus-right { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + height: 258px; +} + +.sm-bonus .bail-card { + display: block; + width: auto; + height: 258px; + max-width: 152px; + flex-shrink: 0; + object-fit: contain; + object-position: center center; + filter: drop-shadow(0 0 14px rgba(120, 220, 255, 0.55)); +} + +/* ========================================================= + ปุ่ม "รับหลักฐาน" – กึ่งกลางจอ ทับขอบล่าง popup + ========================================================= */ +.sm-btn-done { + left: 784px; + top: 818px; + width: 351px; + height: 141px; + z-index: 12; +} + +.sm-btn-done img { + width: 100%; + height: 100%; + display: block; + object-fit: contain; + filter: drop-shadow(0 0 14px rgba(120, 220, 255, 0.45)); +} + +.sm-btn-done.btn:hover { + transform: none; + filter: brightness(1.12) drop-shadow(0 0 18px rgba(120, 220, 255, 0.6)); +} + +.sm-btn-done.btn:active { + transform: none; + filter: brightness(0.95); +} diff --git a/www/html/Game/public/css/howto.css b/www/html/Game/public/css/howto.css new file mode 100644 index 0000000..30aa574 --- /dev/null +++ b/www/html/Game/public/css/howto.css @@ -0,0 +1,81 @@ +/* game howto — built from design (shared M1, ครอบคลุม M1/3/4/5/6/7) */ +/* ========================================================= + howto.css – หน้า 01 + 01-2 (HOW TO PLAY popup) + ใช้ popup-Howto.png เป็น content หลัก + + ปุ่ม READY/START และ status text ใต้ popup + ========================================================= */ + +/* ---------- dark overlay ทับ BG ---------- */ +.mg-overlay { + left: 0; + top: 0; + width: 1920px; + height: 1080px; + background: rgba(4, 6, 18, 0.45); + z-index: 9; +} + +/* ---------- popup HOW TO PLAY ---------- */ +.howto-popup { + /* popup-Howto.png native 1451x851 (aspect 1.706) + ใน mockup กินพื้นที่เกือบทั้งจอ → ขยายให้ใหญ่ขึ้น แต่ยังคง aspect ratio */ + left: 50%; + top: 50px; + transform: translateX(-50%); + width: 1500px; + height: 880px; + z-index: 10; +} +.howto-popup img { + width: 100%; + height: 100%; +} + +/* ---------- ปุ่ม READY/START + status text ---------- */ +.howto-status { + /* "Ready Status : 4/5" อยู่เหนือปุ่ม READY (ตาม mockup 01.png) */ + left: 50%; + top: 808px; + transform: translateX(-50%); + font-family: "NotoSansThai", sans-serif; + font-weight: 700; + font-size: 22px; + color: #f067e8; + text-shadow: 0 0 10px rgba(240, 103, 232, 0.6), + 0 0 22px rgba(237, 86, 224, 0.35); + letter-spacing: 0.5px; + text-align: center; + z-index: 13; + white-space: nowrap; + pointer-events: none; +} +.howto-status #hwRatio { + color: #f067e8; +} + +.howto-btn { + /* btn-ready.png / btn-start.png native 351x141 (aspect 2.49) + ใน mockup ปุ่มอยู่ตรงเส้นกรอบล่าง popup (กึ่งกลาง) */ + left: 957px; + top: 885px; + transform: translate(-50%, -50%); + height: 120px; + width: auto; + z-index: 12; +} +.howto-btn img { + height: 100%; + width: auto; + filter: drop-shadow(0 0 18px rgba(120, 220, 255, 0.65)); +} + +/* ---------- hover effect บนปุ่ม ---------- */ +.howto-btn.btn:hover { + transform: translate(-50%, calc(-50% - 3px)); +} +.howto-btn.btn:hover img { + filter: drop-shadow(0 0 28px rgba(120, 220, 255, 0.95)); +} +.howto-btn.btn:active { + transform: translate(-50%, calc(-50% + 2px)); +} diff --git a/www/html/Game/public/img/mg-hud/score-avartar.png b/www/html/Game/public/img/mg-hud/score-avartar.png new file mode 100644 index 0000000..a4ffad9 Binary files /dev/null and b/www/html/Game/public/img/mg-hud/score-avartar.png differ diff --git a/www/html/Game/public/img/mg-hud/score-bar.png b/www/html/Game/public/img/mg-hud/score-bar.png new file mode 100644 index 0000000..4eca97d Binary files /dev/null and b/www/html/Game/public/img/mg-hud/score-bar.png differ diff --git a/www/html/Game/public/play.html b/www/html/Game/public/play.html index df98d78..351b165 100644 --- a/www/html/Game/public/play.html +++ b/www/html/Game/public/play.html @@ -22,8 +22,8 @@ - - + + + diff --git a/www/html/Game/public/play.html.bak-css b/www/html/Game/public/play.html.bak-css new file mode 100644 index 0000000..df98d78 --- /dev/null +++ b/www/html/Game/public/play.html.bak-css @@ -0,0 +1,5158 @@ + + + + + + + เล่น — Game + + + + + + + + + + + + +
+
+ + +
+
+
+ + + +
+ + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v —
+ + diff --git a/www/html/Game/public/play.html.bak-gch-howto-size-fix-184730 b/www/html/Game/public/play.html.bak-gch-howto-size-fix-184730 new file mode 100644 index 0000000..f5f690d --- /dev/null +++ b/www/html/Game/public/play.html.bak-gch-howto-size-fix-184730 @@ -0,0 +1,5239 @@ + + + + + + + เล่น — Game + + + + + + + + + + + + +
+
+ + +
+
+
+ + + +
+ + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v —
+ + + diff --git a/www/html/Game/public/play.html.bak-qcfix-183405 b/www/html/Game/public/play.html.bak-qcfix-183405 new file mode 100644 index 0000000..11eaab0 --- /dev/null +++ b/www/html/Game/public/play.html.bak-qcfix-183405 @@ -0,0 +1,5158 @@ + + + + + + + เล่น — Game + + + + + + + + + + + + +
+
+ + +
+
+
+ + + +
+ + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v —
+ +