diff --git a/scripts/deploy-www.sh b/scripts/deploy-www.sh index 0a8859d..8eb73bd 100755 --- a/scripts/deploy-www.sh +++ b/scripts/deploy-www.sh @@ -38,6 +38,11 @@ JUMPER="$DST/Game/public/img/Jumper" mkdir -p "$JUMPER" chown www-data:www-data "$JUMPER" chmod 2775 "$JUMPER" +# Space shooter / Violent Crime — ชื่อโฟลเดอร์ไม่มีช่องว่าง (FTP MKD "Violent Crime" มัก 550) +VIOLENT_CRIME="$DST/Game/public/img/ViolentCrime" +mkdir -p "$VIOLENT_CRIME" +chown www-data:www-data "$VIOLENT_CRIME" +chmod 2775 "$VIOLENT_CRIME" GAME_SRV_HASH_AFTER="$(hash_game_server_js "$GAME_SERVER_JS")" if [[ -n "$GAME_SRV_HASH_AFTER" && "$GAME_SRV_HASH_BEFORE" != "$GAME_SRV_HASH_AFTER" ]]; then diff --git a/www/html/Admin/admin.js b/www/html/Admin/admin.js index b40ae61..115dd5e 100644 --- a/www/html/Admin/admin.js +++ b/www/html/Admin/admin.js @@ -2630,6 +2630,38 @@ }); } + function loadSpaceShooterTimingPanel() { + gameTimingFetch('GET') + .then(function (data) { + var inpT = el('space-shooter-mission-sec'); + if (inpT) { + var ss = Number(data.spaceShooterMissionTimeSec); + inpT.value = String(Number.isFinite(ss) && ss > 0 ? Math.floor(ss) : 0); + } + setMsg('space-shooter-timing-msg', '', ''); + }) + .catch(function (e) { + setMsg('space-shooter-timing-msg', e.message || 'โหลดไม่ได้', 'error'); + }); + } + + function saveSpaceShooterTimingPanel() { + var limSs = el('space-shooter-mission-sec') ? parseInt(String(el('space-shooter-mission-sec').value), 10) : 0; + if (Number.isNaN(limSs) || limSs < 0) limSs = 0; + limSs = limSs <= 0 ? 0 : Math.max(10, Math.min(7200, limSs)); + gameTimingFetch('GET') + .then(function (data) { + data.spaceShooterMissionTimeSec = limSs; + return gameTimingFetch('PUT', data); + }) + .then(function () { + setMsg('space-shooter-timing-msg', 'บันทึกแล้ว — ผู้เล่นยิงยานอวกาศได้ค่าใหม่เมื่อรีเฟรชหน้าเล่นหรือโหลด /api/game-timing', 'ok'); + }) + .catch(function (e) { + setMsg('space-shooter-timing-msg', e.message || 'บันทึกไม่ได้', 'error'); + }); + } + function saveJumpSurviveTimingPanel() { var inp = el('jump-survive-height-mult'); var jumpSurvMult = inp ? parseFloat(String(inp.value)) : 1.5; @@ -2681,7 +2713,7 @@ return gameTimingFetch('PUT', data); }) .then(function () { - setMsg('game-timing-msg', 'บันทึกแล้ว — พรมแดง tick·กระโดด / รูปอุปสรรค์ · มินิเกมกระโดดขึ้นแท่นตั้งที่แท็บ Minigame-5 · ค่า Stack แก้ที่แท็บ Stack เท่านั้น · จำกัดเวลาพรมแดงใช้กับรอบถัดไปที่โฮสต์เริ่มเกม', 'ok'); + setMsg('game-timing-msg', 'บันทึกแล้ว — พรมแดง tick·กระโดด / รูปอุปสรรค์ · Minigame-5 / Minigame-6 ตั้งแท็บของแต่ละเกม · ค่า Stack แก้ที่แท็บ Stack เท่านั้น · จำกัดเวลาพรมแดงใช้กับรอบถัดไปที่โฮสต์เริ่มเกม', 'ok'); }) .catch(function (e) { setMsg('game-timing-msg', e.message || 'บันทึกไม่ได้', 'error'); @@ -2725,6 +2757,7 @@ if (name === 'quiz-carry') loadQuizCarryPanel(); if (name === 'quiz-battle') loadQbBattlePanel(); if (name === 'jump-survive') loadJumpSurviveTimingPanel(); + if (name === 'space-shooter') loadSpaceShooterTimingPanel(); if (name === 'game-timing') loadGameTimingPanel(); if (name === 'stack-game') loadStackGamePanel(); } @@ -2850,6 +2883,10 @@ if (btnJumpSurviveSave) { btnJumpSurviveSave.addEventListener('click', saveJumpSurviveTimingPanel); } + var btnSpaceShooterSave = el('btn-space-shooter-save'); + if (btnSpaceShooterSave) { + btnSpaceShooterSave.addEventListener('click', saveSpaceShooterTimingPanel); + } var btnStackGameSave = el('btn-stack-game-save'); if (btnStackGameSave) { btnStackGameSave.addEventListener('click', saveStackGamePanel); @@ -3160,7 +3197,7 @@ try { want = new URL(window.location.href).searchParams.get('tab'); } catch (e) { /* ignore */ } - var allowed = { 'change-password': true, oauth: true, 'map-editor': true, quiz: true, 'quiz-carry': true, 'quiz-battle': true, 'jump-survive': true, 'game-timing': true, 'stack-game': true, characters: true, accounts: true, admins: true }; + var allowed = { 'change-password': true, oauth: true, 'map-editor': true, quiz: true, 'quiz-carry': true, 'quiz-battle': true, 'jump-survive': true, 'space-shooter': true, 'game-timing': true, 'stack-game': true, characters: true, accounts: true, admins: true }; if (!want || !allowed[want]) return 'oauth'; if (want === 'admins' && (!admin || admin.role !== 'super')) return 'oauth'; return want; diff --git a/www/html/Admin/index.html b/www/html/Admin/index.html index 810f512..f935c15 100644 --- a/www/html/Admin/index.html +++ b/www/html/Admin/index.html @@ -72,6 +72,7 @@ + @@ -464,9 +465,25 @@

+ +