diff --git a/www/html/Game/public/js/play.js b/www/html/Game/public/js/play.js index c742bbe..e24bb21 100644 --- a/www/html/Game/public/js/play.js +++ b/www/html/Game/public/js/play.js @@ -43,15 +43,15 @@ const STACK_TOWER_ROPE_DRAW_T1 = 1.0; /** ปลายบนเชือก (จอ): ยืดเหนือขอบบนแคนวาสเป็นเศษส่วนของความสูง (เช่น 0.25 = 25% นอกจอด้านบน) */ const STACK_TOWER_ROPE_TOP_ABOVE_CANVAS_FRAC = 0.25; - /** progress ≥ นี้: แอนิเมตซูม + เลื่อนแมป (ครั้งเดียวต่อรอบ stack) */ - const STACK_TOWER_POST50_PROGRESS_THRESH = 50; + /** progress ≥ นี้ (ฉาก Tower mnn93hpi): รูป heavy + ความกว้าง heavy = เท่าเดียวกับปกติ × ค่าด้านล่าง + แอนิเมตซูม/เลื่อน */ + const STACK_TOWER_POST50_PROGRESS_THRESH = 60; const STACK_TOWER_POST50_ZOOM_MUL = 1.1; /** เลื่อน BG แนวตั้งเท่าเศษส่วนของความสูงแคนวาส (จอ) */ const STACK_TOWER_POST50_MAP_SHIFT_SCREEN_FRAC = 0.1; const STACK_TOWER_POST50_ANIM_MS = 680; /** แมป mnn93hpi: สเกลความกว้าง/ความสูงชั้นของบล็อกในโลก (1 = ขนาดเดิม) */ const STACK_TOWER_BLOCK_WORLD_SCALE = 1.5; - /** หลัง 50%: เลื่อนกล้องลงในมุมมองจอเท่าเศษส่วนของความสูงแคนวาส (เช่น 0.25 = 25% ของความสูงจอ) */ + /** หลังเกณฑ์ progress (Tower): เลื่อนกล้องลงในมุมมองจอเท่าเศษส่วนของความสูงแคนวาส (เช่น 0.25 = 25% ของความสูงจอ) */ const STACK_TOWER_POST50_VIEW_SHIFT_SCREEN_FRAC = 0.25; /** Mega Virus — balloon_boss ฉากภารกิจ (flow เดียวกับ crown / mno9kb07) รูปใน `/Game/img/MegaVirus` */ const BALLOON_BOSS_MISSION_MAP_ID = 'mnq1eml7'; @@ -70,20 +70,20 @@ const STACK_STABLE_SUPPORT_RATIO_MIN = 0.62; /** Stack ทั่วไป (ไม่ใช่ Tower post-50%): บล็อก heavy กว้างกว่าปกติ (~382×72 vs 314×103) */ const STACK_BLOCK_HEAVY_WIDTH_MULT = 382 / 314; - /** Tower live + progress ≥50%: ลดความกว้างบล็อก 40% (เหลือ 60%) — ความสูงชั้น `layerWorldH` เท่าเดิม */ + /** Tower live + progress ≥เกณฑ์ + heavy: ความกว้างบล็อก = ปกติ × ค่านี้ (เช่น 0.6 = 60% ของช่องปกติ — รูปใหญ่วาดในกรอบเดียวกัน) */ const STACK_TOWER_POST50_WIDTH_MULT = 0.6; function stackBlockWidthTilesForPlay(baseTiles, heavy) { const b = Number(baseTiles); const base = Number.isFinite(b) ? Math.max(0.85, Math.min(3.2, b)) : 2; - const towerPost50 = + const towerHeavyNarrow = + !!heavy && isStackTowerMissionUiMapPlay() && - getStackTowerCameraFollowPlayConfig().enabled && stackTowerMissionPhase === 'live' && stackMini && Number.isFinite(Number(stackMini.progressPct)) && - Number(stackMini.progressPct) >= 50; - if (towerPost50) { + Number(stackMini.progressPct) >= STACK_TOWER_POST50_PROGRESS_THRESH; + if (towerHeavyNarrow) { const w = base * STACK_TOWER_POST50_WIDTH_MULT; return Math.max(0.85, Math.min(3.2, Math.round(w * 200) / 200)); } @@ -282,11 +282,11 @@ function pickStackBlockHeavyVisual(seat) { const slot = Math.max(0, Math.min(5, (Math.floor(Number(seat)) || 1) - 1)); const hU = normalizeGauntletAssetUrlForPlay(playStackBlockHeavyUrls[slot] || ''); - /** Tower mnn93hpi: ตั้งแต่ 50% ของ Progress 100% (ตาม stackTowerProgressBlocks) → ใช้รูป heavy จาก admin — นอก live ไม่สุ่ม heavy */ + /** Tower mnn93hpi: ตั้งแต่เกณฑ์ progress (ตาม stackTowerProgressBlocks) → ใช้รูป heavy จาก admin — นอก live ไม่สุ่ม heavy */ if (isStackTowerMissionUiMapPlay()) { if (!(stackTowerMissionPhase === 'live' && stackMini)) return false; const p = Number(stackMini.progressPct); - if (!Number.isFinite(p) || p < 50) return false; + if (!Number.isFinite(p) || p < STACK_TOWER_POST50_PROGRESS_THRESH) return false; return !!hU; } const pct = Math.max(0, Math.min(100, Math.floor(Number(playStackHeavyBlockPercent) || 0))); @@ -2270,7 +2270,7 @@ let stackTowerMissionDeferredPhase = null; let stackTowerSessionStartAt = 0; let stackTowerMissionEndedOnce = false; - /** progress ข้าม 50%: เริ่มแอนิเมตซูม+เลื่อนแมป — null ยังไม่ข้าม, ตัวเลข = performance.now() ตอนเริ่ม */ + /** progress ข้ามเกณฑ์ Tower: เริ่มแอนิเมตซูม+เลื่อนแมป — null ยังไม่ข้าม, ตัวเลข = performance.now() ตอนเริ่ม */ let stackTowerPost50AnimStartMs = null; /** แฟลชรูปผล Tower (timeup / gameover / complete) ก่อน GCM 5 วิ */ let stackTowerResultFlashTimer = null; @@ -4380,7 +4380,7 @@ return x * x * (3 - 2 * x); } - /** Tower live + progress ≥50%: 0→1 ระหว่าง STACK_TOWER_POST50_ANIM_MS — ใช้เฉพาะเมื่อเปิดกล้องตามหอ (ไม่งั้นฉากธรรมดาไม่เลื่อน/ซูมหลัง 50%) */ + /** Tower live + progress ≥เกณฑ์: 0→1 ระหว่าง STACK_TOWER_POST50_ANIM_MS — ใช้เฉพาะเมื่อเปิดกล้องตามหอ (ไม่งั้นฉากธรรมดาไม่เลื่อน/ซูมหลังเกณฑ์) */ function getStackTowerPost50AnimEasePlay() { if (!getStackTowerCameraFollowPlayConfig().enabled) { stackTowerPost50AnimStartMs = null; @@ -8813,7 +8813,7 @@ } /** - * progress ≥50% + ชั้นพอ: ไม่วาดชั้นล่าง (ข้าม draw) — ตำแหน่ง Y ยังใช้ชั้นจริง (floorY-(i+1)*h) + * progress ≥เกณฑ์ Tower + ชั้นพอ: ไม่วาดชั้นล่าง (ข้าม draw) — ตำแหน่ง Y ยังใช้ชั้นจริง (floorY-(i+1)*h) * เพื่อไม่ให้กองลอยหลุดจากฐานแมปเมื่อเทียบกริด */ function getStackTowerVisualHiddenLayerCountPlay() { diff --git a/www/html/Game/public/play.html b/www/html/Game/public/play.html index 9eec051..cea2d8f 100644 --- a/www/html/Game/public/play.html +++ b/www/html/Game/public/play.html @@ -3203,7 +3203,7 @@ - +