diff --git a/www/html/Admin/admin.js b/www/html/Admin/admin.js index 4d65bd7..e972a4d 100644 --- a/www/html/Admin/admin.js +++ b/www/html/Admin/admin.js @@ -4607,7 +4607,9 @@ var grid = document.createElement('div'); grid.className = 'cm-grid'; grid.appendChild(caseMediaImagePicker('รูปเลือกคดี (การ์ด)', 'case', c.art, function (v) { c.art = v; })); - grid.appendChild(caseMediaImagePicker('รูปรายละเอียดคดี', 'case', c.detail, function (v) { c.detail = v; })); + grid.appendChild(caseMediaImagePicker('รูปรายละเอียดคดี (แบบรูปเดียวจบ — ใช้เมื่อไม่ได้ตั้ง "รูปคดี" ด้านล่าง)', 'case', c.detail, function (v) { c.detail = v; })); + /* [2026-07-21] ตั้ง "รูปคดี" = สลับหน้ารายละเอียดไปโหมดประกอบเอง (กรอบ + รูป + ข้อความด้านล่าง) */ + grid.appendChild(caseMediaImagePicker('รูปคดี (โหมดใหม่ — ตั้งแล้วหน้าจะประกอบเอง)', 'case', c.pic || '', function (v) { c.pic = v; })); grid.appendChild(caseMediaImagePicker('Cutscene รูปที่ 1', 'cutscene', c.story[0], function (v) { c.story[0] = v; })); grid.appendChild(caseMediaImagePicker('Cutscene รูปที่ 2', 'cutscene', c.story[1], function (v) { c.story[1] = v; })); root.appendChild(grid); @@ -4623,6 +4625,50 @@ }); root.appendChild(susGrid); + /* [2026-07-21] ไอคอนผู้ต้องสงสัย (สี่เหลี่ยมเล็ก) — โชว์เฉพาะหัวหน้าไต่สวน (es3) เท่านั้น + ไม่ตั้ง = ใช้รูปเต็มตัวด้านบน */ + var icoHead = document.createElement('h3'); + icoHead.className = 'cm-section-title'; + icoHead.textContent = 'ไอคอนผู้ต้องสงสัย (3 คน) — หัวหน้าไต่สวน (ไม่ตั้ง = ใช้รูปเต็มตัวด้านบน)'; + root.appendChild(icoHead); + var icoGrid = document.createElement('div'); + icoGrid.className = 'cm-grid'; + if (!Array.isArray(c.icons)) c.icons = (c.suspects || []).slice(); + [0, 1, 2].forEach(function (si) { + icoGrid.appendChild(caseMediaImagePicker('ไอคอน ' + (si + 1), 'suspect-pick', c.icons[si], function (v) { c.icons[si] = v; })); + }); + root.appendChild(icoGrid); + + /* [2026-07-21] ข้อความหน้ารายละเอียดคดี (โหมดใหม่) — แสดงเมื่อตั้ง "รูปคดี" ไว้เท่านั้น + เว้นว่าง = ไม่แสดงบรรทัดนั้นบนหน้าเกม (ค่อยๆ กรอกทีละคดีได้) */ + var txtHead = document.createElement('h3'); + txtHead.className = 'cm-section-title'; + txtHead.textContent = 'ข้อความรายละเอียดคดี (โหมดใหม่ — ใช้เมื่อตั้ง "รูปคดี" แล้ว · เว้นว่าง = ไม่แสดงบรรทัดนั้น)'; + root.appendChild(txtHead); + if (!Array.isArray(c.txtSuspects)) c.txtSuspects = ['', '', '']; + var caseTextField = function (label, get, set, opts) { + opts = opts || {}; + var lb = document.createElement('label'); + lb.className = 'admin-field'; + lb.textContent = label; + var el = document.createElement(opts.multiline ? 'textarea' : 'input'); + if (!opts.multiline) el.type = 'text'; + else el.rows = 4; + el.maxLength = opts.max || 300; + el.value = get() || ''; + el.addEventListener('input', function () { set(el.value); }); + lb.appendChild(el); + return lb; + }; + root.appendChild(caseTextField('ข้อหา', function () { return c.txtCharge; }, function (v) { c.txtCharge = v; })); + root.appendChild(caseTextField('สถานที่เกิดเหตุ', function () { return c.txtPlace; }, function (v) { c.txtPlace = v; })); + root.appendChild(caseTextField('ผู้เสียหาย', function () { return c.txtVictim; }, function (v) { c.txtVictim = v; })); + [0, 1, 2].forEach(function (si) { + root.appendChild(caseTextField('ผู้ต้องสงสัย ' + (si + 1) + ' (ข้อความ)', + function () { return c.txtSuspects[si]; }, function (v) { c.txtSuspects[si] = v; }, { max: 240 })); + }); + root.appendChild(caseTextField('บันทึกเหตุการณ์', function () { return c.txtNote; }, function (v) { c.txtNote = v; }, { multiline: true, max: 1500 })); + var culHead = document.createElement('h3'); culHead.className = 'cm-section-title'; culHead.textContent = 'ส่งผู้ร้ายเข้าคุก (3 คน) — หน้าผลพิจารณาคดี'; @@ -4712,6 +4758,7 @@ if (name === 'highscore') loadHighscore(); if (name === 'achievements') loadAchievementsPanel(); if (name === 'vote-timing') loadVoteTimingPanel(); + if (name === 'postcase') loadPostCasePanel(); if (name === 'troublesome') loadTroublesomePanel(); if (name === 'test-mode') { loadForcedMinigamePanel(); loadSpecialCardByMapPanel(); loadTroublesomeForcePanel(); } if (name === 'sound') loadSoundPanel(); @@ -5268,6 +5315,36 @@ }); })(); + /* ===== จบคดี (post-case destination) — Main-Lobby หรือ LobbyA ===== */ + function loadPostCasePanel() { + gameTimingFetch('GET') + .then(function (data) { + var d = (data && data.postCaseDestination === 'lobbya') ? 'lobbya' : 'mainlobby'; + if (el('postcase-dest')) el('postcase-dest').value = d; + setMsg('postcase-msg', '', ''); + }) + .catch(function (e) { setMsg('postcase-msg', (e.message || 'โหลดไม่ได้') + ' — เช็ค /Game/api/game-timing', 'error'); }); + } + + (function bindPostCase() { + var btn = el('btn-postcase-save'); + if (!btn) return; + btn.addEventListener('click', function () { + var d = ((el('postcase-dest') || {}).value === 'lobbya') ? 'lobbya' : 'mainlobby'; + btn.disabled = true; + gameTimingFetch('GET') + .then(function (data) { data.postCaseDestination = d; return gameTimingFetch('PUT', data); }) + .then(function () { return gameTimingFetch('GET'); }) + .then(function (fresh) { + var v = (fresh && fresh.postCaseDestination === 'lobbya') ? 'lobbya' : 'mainlobby'; + if (el('postcase-dest')) el('postcase-dest').value = v; + setMsg('postcase-msg', 'บันทึกแล้ว — เมื่อจบคดีไป ' + (v === 'lobbya' ? 'LobbyA (ห้องเดิม เริ่มคดีใหม่)' : 'Main-Lobby (เดิม)') + ' · ผู้เล่นต้องรีเฟรช/เข้าห้องใหม่', 'ok'); + }) + .catch(function (e) { setMsg('postcase-msg', (e.message || 'บันทึกไม่ได้') + ' — เช็ค Node + /Game/api/game-timing', 'error'); }) + .then(function () { btn.disabled = false; }); + }); + })(); + /* ===== เสียง (sound settings) — master/music/sfx volume 0..1 ===== */ function soundSettingsFetch(method, body) { var m = method || 'GET'; diff --git a/www/html/Admin/index.html b/www/html/Admin/index.html index 2d8b1b2..1979ab0 100644 --- a/www/html/Admin/index.html +++ b/www/html/Admin/index.html @@ -119,6 +119,7 @@
+ @@ -1184,6 +1185,21 @@ +เลือกว่าเมื่อจบคดี (หลังโชว์ผล + หน้าให้ความรู้ "รู้ทันภัยไซเบอร์") จะพาผู้เล่นไปไหนต่อ · มีผลเมื่อผู้เล่นรีเฟรช/เข้าห้องใหม่
+ + +ตั้งเวลาเกี่ยวกับการเสนอ/รับ "บทตัวป่วน" หลังจบคดี · มีผลเมื่อผู้เล่นรีเฟรช/เข้าห้องใหม่ · ปุ่ม บังคับข้ามเงื่อนไข ≥4 คน อยู่แท็บ Test Mode
@@ -1358,7 +1374,7 @@ - + - - + +