[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:550px;margin:10px auto;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Разведка территории</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Пикачу</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">70%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:70%;"></div></div><p>✅ При успехе: +55 XP</p><p>❌ При провале: -18 HP</p><p id="timer-1785752521574" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p><div id="result-1785752521574" style="margin-top:10px;font-weight:bold;display:none;"></div><button id="btn-1785752521574" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button></div></div><script>(function() {var endTime = new Date(Date.now() + 180000);var timerEl = document.getElementById("timer-1785752521574");var btnEl = document.getElementById("btn-1785752521574");var resultEl = document.getElementById("result-1785752521574");var missionName = "Разведка территории";var pokemonId = "2";var userId = "2";var damage = 18;var xpGain = 55;var chance = 70;var apiBase = "https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec";if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";timerEl.style.color = "#2b6f2b";btnEl.style.display = "block";return;}var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;}, 1000);function checkMissionResult() {if (btnEl.textContent === "⏳ Обработка...") return;btnEl.textContent = "⏳ Обработка...";btnEl.style.background = "#848a87";btnEl.disabled = true;var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= chance;var xp = success ? xpGain : 0;var dmg = success ? 0 : damage;var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;fetch(url).then(function(r) { return r.json(); }).then(function(data) {if (data.success) {resultEl.style.display = "block";if (success) {resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";resultEl.style.color = "#2b6f2b";timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";} else {resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! Потеряно 18 HP";resultEl.style.color = "#c03028";timerEl.innerHTML = "❌ Миссия провалена! Потеряно 18 HP";}btnEl.textContent = "✅ Готово";btnEl.style.background = "#848a87";btnEl.disabled = true;} else {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;}}).catch(function(e) {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;console.error(e);});}btnEl.onclick = checkMissionResult;})();</script>[/html]
Оформление локаций
Сообщений 21 страница 28 из 28
Поделиться222026-08-03 13:41:00
[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:550px;margin:10px auto;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Освещение тоннелей</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Пикачу</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">82%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:82%;"></div></div><p>✅ При успехе: +24 XP</p><p>❌ При провале: без последствий</p><p id="timer-1785753655069" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p><div id="result-1785753655069" style="margin-top:10px;font-weight:bold;display:none;"></div><button id="btn-1785753655069" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button></div></div><script>(function() {var endTime = new Date(Date.now() + 120000);var timerEl = document.getElementById("timer-1785753655069");var btnEl = document.getElementById("btn-1785753655069");var resultEl = document.getElementById("result-1785753655069");var missionName = "Освещение тоннелей";var pokemonId = "2";var userId = "2";var damage = 0;var xpGain = 24;var chance = 82;var apiBase = "https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec";if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";timerEl.style.color = "#2b6f2b";btnEl.style.display = "block";return;}var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;}, 1000);function checkMissionResult() {if (btnEl.textContent === "⏳ Обработка...") return;btnEl.textContent = "⏳ Обработка...";btnEl.style.background = "#848a87";btnEl.disabled = true;var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= chance;var xp = success ? xpGain : 0;var dmg = success ? 0 : damage;var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;fetch(url).then(function(r) { return r.json(); }).then(function(data) {if (data.success) {resultEl.style.display = "block";if (success) {resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";resultEl.style.color = "#2b6f2b";timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";} else {resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! Без последствий";resultEl.style.color = "#c03028";timerEl.innerHTML = "❌ Миссия провалена! Без последствий";}btnEl.textContent = "✅ Готово";btnEl.style.background = "#848a87";btnEl.disabled = true;} else {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;}}).catch(function(e) {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;console.error(e);});}btnEl.onclick = checkMissionResult;})();</script>[/html]
Поделиться232026-08-03 13:52:39
[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:550px;margin:10px auto;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Защита сада фей</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">71%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:71%;"></div></div><p>✅ При успехе: +54 XP</p><p>❌ При провале: -15 HP</p><p id="timer-mission-1785754353681-259718" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p><div id="result-mission-1785754353681-259718" style="margin-top:10px;font-weight:bold;display:none;"></div><button id="btn-mission-1785754353681-259718" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button></div></div><script>(function() {var missionData = localStorage.getItem("mission-1785754353681-259718");if (missionData) { try { var saved = JSON.parse(missionData); document.getElementById("timer-mission-1785754353681-259718").innerHTML = saved.timerText; document.getElementById("timer-mission-1785754353681-259718").style.color = saved.timerColor; if (saved.showBtn) { document.getElementById("btn-mission-1785754353681-259718").style.display = "block"; } if (saved.showResult) { document.getElementById("result-mission-1785754353681-259718").style.display = "block"; document.getElementById("result-mission-1785754353681-259718").innerHTML = saved.resultText; document.getElementById("result-mission-1785754353681-259718").style.color = saved.resultColor; } } catch(e) {}}var endTime = 1785754533681;var timerEl = document.getElementById("timer-mission-1785754353681-259718");var btnEl = document.getElementById("btn-mission-1785754353681-259718");var resultEl = document.getElementById("result-mission-1785754353681-259718");var missionName = "Защита сада фей";var pokemonId = "1";var userId = "2";var damage = 15;var xpGain = 54;var chance = 71;var apiBase = "https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec";var uniqueId = "mission-1785754353681-259718";if (!timerEl) return;function saveState() { var state = { timerText: timerEl.innerHTML, timerColor: timerEl.style.color, showBtn: btnEl.style.display === "block", showResult: resultEl.style.display === "block", resultText: resultEl.innerHTML, resultColor: resultEl.style.color }; localStorage.setItem(uniqueId, JSON.stringify(state));}var missionCompleted = localStorage.getItem(uniqueId + "_completed");if (missionCompleted === "true") { return;}var interval = setInterval(function() {var now = Date.now();var diff = Math.max(0, endTime - now);if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";timerEl.style.color = "#2b6f2b";btnEl.style.display = "block";saveState();return;}var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;saveState();}, 1000);function checkMissionResult() {if (btnEl.textContent === "⏳ Обработка...") return;btnEl.textContent = "⏳ Обработка...";btnEl.style.background = "#848a87";btnEl.disabled = true;var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= chance;var xp = success ? xpGain : 0;var dmg = success ? 0 : damage;var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;fetch(url).then(function(r) { return r.json(); }).then(function(data) {if (data.success) {resultEl.style.display = "block";if (success) {resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";resultEl.style.color = "#2b6f2b";timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";} else {resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! Потеряно 15 HP";resultEl.style.color = "#c03028";timerEl.innerHTML = "❌ Миссия провалена! Потеряно 15 HP";}btnEl.textContent = "✅ Готово";btnEl.style.background = "#848a87";btnEl.disabled = true;localStorage.setItem(uniqueId + "_completed", "true");saveState();} else {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;}}).catch(function(e) {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;console.error(e);});}btnEl.onclick = checkMissionResult;})();</script>[/html]
Поделиться242026-08-03 14:06:25
[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:550px;margin:10px auto;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Оборона лагеря</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">93%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:93%;"></div></div><p>✅ При успехе: +60 XP</p><p>❌ При провале: -25 HP</p><p id="timer-mission-1785755180060-389350" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p><div id="result-mission-1785755180060-389350" style="margin-top:10px;font-weight:bold;display:none;"></div><button id="btn-mission-1785755180060-389350" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button></div></div><script>(function() {var missionData = localStorage.getItem("mission-1785755180060-389350");if (missionData) { try { var saved = JSON.parse(missionData); document.getElementById("timer-mission-1785755180060-389350").innerHTML = saved.timerText; document.getElementById("timer-mission-1785755180060-389350").style.color = saved.timerColor; if (saved.showBtn) { document.getElementById("btn-mission-1785755180060-389350").style.display = "block"; } if (saved.showResult) { document.getElementById("result-mission-1785755180060-389350").style.display = "block"; document.getElementById("result-mission-1785755180060-389350").innerHTML = saved.resultText; document.getElementById("result-mission-1785755180060-389350").style.color = saved.resultColor; } } catch(e) {}}var endTime = 1785755360060;var timerEl = document.getElementById("timer-mission-1785755180060-389350");var btnEl = document.getElementById("btn-mission-1785755180060-389350");var resultEl = document.getElementById("result-mission-1785755180060-389350");var missionName = "Оборона лагеря";var pokemonId = "1";var userId = "2";var damage = 25;var xpGain = 60;var chance = 93;var apiBase = "https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec";var uniqueId = "mission-1785755180060-389350";if (!timerEl) return;function saveState() { var state = { timerText: timerEl.innerHTML, timerColor: timerEl.style.color, showBtn: btnEl.style.display === "block", showResult: resultEl.style.display === "block", resultText: resultEl.innerHTML, resultColor: resultEl.style.color }; localStorage.setItem(uniqueId, JSON.stringify(state));}var missionCompleted = localStorage.getItem(uniqueId + "_completed");if (missionCompleted === "true") { return;}var interval = setInterval(function() {var now = Date.now();var diff = Math.max(0, endTime - now);if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";timerEl.style.color = "#2b6f2b";btnEl.style.display = "block";saveState();return;}var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;saveState();}, 1000);function checkMissionResult() {if (btnEl.textContent === "⏳ Обработка...") return;btnEl.textContent = "⏳ Обработка...";btnEl.style.background = "#848a87";btnEl.disabled = true;var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= chance;var xp = success ? xpGain : 0;var dmg = success ? 0 : damage;var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;fetch(url).then(function(r) { return r.json(); }).then(function(data) {if (data.success) {resultEl.style.display = "block";if (success) {resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";resultEl.style.color = "#2b6f2b";timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";} else {resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! Потеряно 25 HP";resultEl.style.color = "#c03028";timerEl.innerHTML = "❌ Миссия провалена! Потеряно 25 HP";}btnEl.textContent = "✅ Готово";btnEl.style.background = "#848a87";btnEl.disabled = true;localStorage.setItem(uniqueId + "_completed", "true");saveState();} else {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;}}).catch(function(e) {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;console.error(e);});}btnEl.onclick = checkMissionResult;})();</script>[/html]
Поделиться252026-08-03 14:10:21
[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:550px;margin:10px auto;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Оборона лагеря</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">93%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:93%;"></div></div><p>✅ При успехе: +60 XP</p><p>❌ При провале: -25 HP</p><p id="timer-mission-1785755415126-533171" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p><div id="result-mission-1785755415126-533171" style="margin-top:10px;font-weight:bold;display:none;"></div><button id="btn-mission-1785755415126-533171" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button></div></div><script>(function() {var missionData = localStorage.getItem("mission-1785755415126-533171");if (missionData) { try { var saved = JSON.parse(missionData); document.getElementById("timer-mission-1785755415126-533171").innerHTML = saved.timerText; document.getElementById("timer-mission-1785755415126-533171").style.color = saved.timerColor; if (saved.showBtn) { document.getElementById("btn-mission-1785755415126-533171").style.display = "block"; } if (saved.showResult) { document.getElementById("result-mission-1785755415126-533171").style.display = "block"; document.getElementById("result-mission-1785755415126-533171").innerHTML = saved.resultText; document.getElementById("result-mission-1785755415126-533171").style.color = saved.resultColor; } } catch(e) {}}var endTime = 1785755595126;var timerEl = document.getElementById("timer-mission-1785755415126-533171");var btnEl = document.getElementById("btn-mission-1785755415126-533171");var resultEl = document.getElementById("result-mission-1785755415126-533171");var missionName = "Оборона лагеря";var pokemonId = "1";var userId = "2";var damage = 25;var xpGain = 60;var chance = 93;var apiBase = "https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec";var uniqueId = "mission-1785755415126-533171";if (!timerEl) return;function saveState() { var state = { timerText: timerEl.innerHTML, timerColor: timerEl.style.color, showBtn: btnEl.style.display === "block", showResult: resultEl.style.display === "block", resultText: resultEl.innerHTML, resultColor: resultEl.style.color }; localStorage.setItem(uniqueId, JSON.stringify(state));}var missionCompleted = localStorage.getItem(uniqueId + "_completed");if (missionCompleted === "true") { return;}var interval = setInterval(function() {var now = Date.now();var diff = Math.max(0, endTime - now);if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";timerEl.style.color = "#2b6f2b";btnEl.style.display = "block";saveState();return;}var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;saveState();}, 1000);function checkMissionResult() {if (btnEl.textContent === "⏳ Обработка...") return;btnEl.textContent = "⏳ Обработка...";btnEl.style.background = "#848a87";btnEl.disabled = true;var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= chance;var xp = success ? xpGain : 0;var dmg = success ? 0 : damage;var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;fetch(url).then(function(r) { return r.json(); }).then(function(data) {if (data.success) {resultEl.style.display = "block";if (success) {resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";resultEl.style.color = "#2b6f2b";timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";} else {resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! Потеряно 25 HP";resultEl.style.color = "#c03028";timerEl.innerHTML = "❌ Миссия провалена! Потеряно 25 HP";}btnEl.textContent = "✅ Готово";btnEl.style.background = "#848a87";btnEl.disabled = true;localStorage.setItem(uniqueId + "_completed", "true");saveState();} else {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;}}).catch(function(e) {resultEl.style.display = "block";resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";resultEl.style.color = "#c03028";btnEl.textContent = "🔍 Попробовать снова";btnEl.style.background = "#4CAF50";btnEl.disabled = false;console.error(e);});}btnEl.onclick = checkMissionResult;})();</script>[/html]
Поделиться262026-08-03 14:34:10
[html]<div class="mission-container">
<div class="mission-list" id="missionList">
<!-- Заполняется JS -->
</div>
<div class="mission-detail" id="missionDetail">
<p>Выберите миссию слева, чтобы увидеть детали.</p>
</div>
</div>
<style>
.mission-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
background: #e3e2de;
border: 2px solid #676a52;
border-radius: 12px;
padding: 20px;
font-family: 'Book Antiqua', serif;
color: #39423c;
max-width: 900px;
margin: 20px auto;
}
.mission-list {
flex: 1;
min-width: 250px;
background: #dcdbd6;
border-radius: 8px;
padding: 10px;
max-height: 500px;
overflow-y: auto;
}
.mission-item {
padding: 12px 15px;
margin-bottom: 5px;
background: #cfcfca;
border: 1px solid #aeafa8;
border-radius: 5px;
cursor: pointer;
transition: all 0.2s;
display: flex;
flex-direction: column;
}
.mission-item:hover, .mission-item.active {
background: #c0c0b8;
border-color: #676a52;
}
.mission-item-name {
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 8px;
}
.mission-bonus-types {
display: flex;
gap: 4px;
flex-wrap: wrap;
}
.bonus-type-badge {
padding: 2px 8px;
border-radius: 10px;
color: white;
font-size: 10px;
font-weight: bold;
white-space: nowrap;
}
.mission-detail {
flex: 2;
min-width: 300px;
background: #cfcfca;
border-radius: 8px;
padding: 20px;
border: 1px solid #aeafa8;
}
.mission-difficulty {
font-size: 12px;
padding: 3px 10px;
border-radius: 12px;
color: white;
font-weight: bold;
display: inline-block;
margin-left: 10px;
}
.diff-easy { background: #78C850; }
.diff-medium { background: #F08030; }
.diff-hard { background: #C03028; }
.mission-bonus-section {
margin: 20px 0;
padding: 10px 0;
}
.mission-bonus-section strong {
display: block;
margin-bottom: 10px;
}
.mission-bonus-section .bonus-type-badge {
font-size: 11px;
padding: 3px 10px;
margin-right: 5px;
}
.pokemon-select {
width: 100%;
padding: 10px;
margin: 15px 0;
background: #e3e2de;
border: 1px solid #676a52;
border-radius: 5px;
font-family: inherit;
color: #39423c;
}
.pokemon-stats {
background: #e3e2de;
border: 1px solid #aeafa8;
border-radius: 8px;
padding: 15px;
margin: 15px 0;
}
.pokemon-stats h4 {
margin: 0 0 10px 0;
color: #39423c;
border-bottom: 1px solid #aeafa8;
padding-bottom: 5px;
}
.stat-row {
display: flex;
justify-content: space-between;
margin: 5px 0;
font-size: 14px;
}
.stat-label {
color: #5a635e;
}
.stat-value {
font-weight: bold;
color: #39423c;
}
.stat-types {
display: flex;
gap: 5px;
margin-top: 5px;
}
.type-badge {
padding: 2px 10px;
border-radius: 12px;
color: white;
font-size: 12px;
font-weight: bold;
}
/* Цвета для всех типов покемонов */
.type-Нормальный, .bonus-type-badge[data-type="Нормальный"] { background: #A8A878; }
.type-Огонь, .bonus-type-badge[data-type="Огонь"] { background: #F08030; }
.type-Вода, .bonus-type-badge[data-type="Вода"] { background: #6890F0; }
.type-Электро, .bonus-type-badge[data-type="Электро"] { background: #F8D030; }
.type-Трава, .bonus-type-badge[data-type="Трава"] { background: #78C850; }
.type-Лёд, .bonus-type-badge[data-type="Лёд"] { background: #98D8D8; }
.type-Боевой, .bonus-type-badge[data-type="Боевой"] { background: #C03028; }
.type-Яд, .bonus-type-badge[data-type="Яд"] { background: #A040A0; }
.type-Земля, .bonus-type-badge[data-type="Земля"] { background: #E0C068; }
.type-Летающий, .bonus-type-badge[data-type="Летающий"] { background: #A890F0; }
.type-Психо, .bonus-type-badge[data-type="Психо"] { background: #F85888; }
.type-Насекомое, .bonus-type-badge[data-type="Насекомое"] { background: #A8B820; }
.type-Камень, .bonus-type-badge[data-type="Камень"] { background: #B8A038; }
.type-Призрак, .bonus-type-badge[data-type="Призрак"] { background: #705898; }
.type-Дракон, .bonus-type-badge[data-type="Дракон"] { background: #7038F8; }
.type-Сталь, .bonus-type-badge[data-type="Сталь"] { background: #B8B8D0; }
.type-Фея, .bonus-type-badge[data-type="Фея"] { background: #EE99AC; }
.type-Темный, .bonus-type-badge[data-type="Темный"] { background: #705848; }
.calculation-details {
background: #f0f0eb;
border: 1px solid #aeafa8;
border-radius: 8px;
padding: 12px;
margin: 10px 0;
font-size: 13px;
}
.calc-row {
display: flex;
justify-content: space-between;
margin: 4px 0;
padding: 3px 0;
border-bottom: 1px dotted #aeafa8;
}
.calc-row.bonus {
color: #2b6f2b;
font-weight: bold;
}
.calc-row.total {
font-weight: bold;
font-size: 15px;
color: #39423c;
border-top: 1px solid #676a52;
margin-top: 8px;
padding-top: 8px;
}
.btn-send {
background: #4CAF50;
color: white;
border: none;
padding: 12px 25px;
border-radius: 25px;
font-weight: bold;
cursor: pointer;
width: 100%;
font-size: 16px;
margin-top: 10px;
transition: background 0.2s;
}
.btn-send:hover { background: #45a049; }
.btn-send:disabled { background: #848a87; cursor: not-allowed; }
.chance-bar {
background: #848a87;
height: 20px;
border-radius: 10px;
overflow: hidden;
margin: 10px 0;
border: 1px solid #676a52;
}
.chance-fill {
height: 100%;
background: linear-gradient(90deg, #fc8181, #f6e05e, #48bb78);
transition: width 0.5s;
}
.bonus-info {
color: #2b6f2b;
font-weight: bold;
font-size: 14px;
}
</style>
<script>
// ===== КОНФИГУРАЦИЯ =====
var API_BASE = 'https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec';
var CACHE_DURATION = 10000;
var trainerCache = {
data: null,
timestamp: 0,
userId: null
};
// ===== МАССИВ МИССИЙ =====
var MISSIONS = [
{id:1, name:"Поиск целебных трав", diff:"Лёгкая", type:"Гуманитарная", desc:"Поиск редких целебных трав в густом лесу.", bonus:["Трава","Насекомое","Фея"], xp:25, time:120, dmg:0},
{id:2, name:"Помощь в наводнении", diff:"Лёгкая", type:"Гуманитарная", desc:"Эвакуация животных и перенос грузов через затопленные территории.", bonus:["Вода","Земля"], xp:28, time:120, dmg:0},
{id:3, name:"Доставка сообщения", diff:"Лёгкая", type:"Гуманитарная", desc:"Доставка срочного сообщения через опасную территорию.", bonus:["Летающий","Нормальный"], xp:22, time:120, dmg:0},
{id:4, name:"Расшифровка древних письмён", diff:"Лёгкая", type:"Гуманитарная", desc:"Расшифровка древних письмён с помощью интеллекта покемона.", bonus:["Психо","Призрак"], xp:26, time:120, dmg:0},
{id:5, name:"Очистка токсичных отходов", diff:"Лёгкая", type:"Гуманитарная", desc:"Очистка леса от токсичных отходов.", bonus:["Яд","Трава"], xp:28, time:120, dmg:0},
{id:6, name:"Освещение тоннелей", diff:"Лёгкая", type:"Гуманитарная", desc:"Помощь в освещении тёмных пещер.", bonus:["Огонь","Камень"], xp:24, time:120, dmg:0},
{id:7, name:"Починка генератора", diff:"Лёгкая", type:"Гуманитарная", desc:"Восстановление электроснабжения деревни.", bonus:["Электро","Сталь"], xp:23, time:120, dmg:0},
{id:8, name:"Тренировка ополченцев", diff:"Лёгкая", type:"Гуманитарная", desc:"Тренировка деревенского ополчения.", bonus:["Боевой","Нормальный"], xp:24, time:120, dmg:0},
{id:9, name:"Разведка территории", diff:"Средняя", type:"Военная", desc:"Скрытное проникновение для сбора разведданных.", bonus:["Электро","Призрак"], xp:55, time:180, dmg:18},
{id:10, name:"Оборона лагеря", diff:"Средняя", type:"Военная", desc:"Защита лагеря от атаки диких покемонов.", bonus:["Огонь","Боевой"], xp:60, time:180, dmg:25},
{id:11, name:"Спасение из-под завала", diff:"Средняя", type:"Военная", desc:"Расчистка снежных завалов.", bonus:["Лёд","Боевой"], xp:58, time:180, dmg:22},
{id:12, name:"Охрана музея", diff:"Средняя", type:"Военная", desc:"Ночная охрана музея от грабителей.", bonus:["Призрак","Психо"], xp:52, time:180, dmg:16},
{id:13, name:"Патруль у вулкана", diff:"Средняя", type:"Военная", desc:"Разведка вулканической активности.", bonus:["Земля","Огонь"], xp:56, time:180, dmg:20},
{id:14, name:"Поиск пропавшей экспедиции", diff:"Средняя", type:"Военная", desc:"Поиск экспедиции в Драконьих горах.", bonus:["Дракон","Летающий"], xp:62, time:180, dmg:28},
{id:15, name:"Защита сада фей", diff:"Средняя", type:"Военная", desc:"Защита волшебного сада от вредителей.", bonus:["Фея","Трава","Насекомое"], xp:54, time:180, dmg:15},
{id:16, name:"Укрощение дракона", diff:"Сложная", type:"Военная", desc:"Дикий дракон терроризирует окрестности.", bonus:["Дракон"], xp:110, time:300, dmg:50},
{id:17, name:"Изгнание полтергейста", diff:"Сложная", type:"Военная", desc:"Злобный полтергейст в доме.", bonus:["Призрак"], xp:105, time:300, dmg:45},
{id:18, name:"Остановка землетрясения", diff:"Сложная", type:"Военная", desc:"Стабилизация тектонических плит.", bonus:["Земля","Камень"], xp:115, time:300, dmg:48},
{id:19, name:"Усмирение водоворота", diff:"Сложная", type:"Военная", desc:"Гигантский водоворот угрожает городу.", bonus:["Вода","Лёд"], xp:108, time:300, dmg:42},
{id:20, name:"Битва с лесным гигантом", diff:"Сложная", type:"Военная", desc:"Гигантское хищное растение атакует!", bonus:["Трава","Яд"], xp:112, time:300, dmg:46}
];
var currentMission = null;
// ===== ФУНКЦИЯ ПОЛУЧЕНИЯ БАЗОВОГО ШАНСА =====
function getBaseChance(difficulty) {
if (difficulty === 'Лёгкая') return 70;
if (difficulty === 'Средняя') return 50;
if (difficulty === 'Сложная') return 30;
return 40;
}
// ===== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ =====
function getCurrentUserId() {
if (typeof UserID !== 'undefined' && UserID) {
return parseInt(UserID);
}
var profileLinks = document.querySelectorAll('a[href*="profile.php?id="]');
for (var i = 0; i < profileLinks.length; i++) {
var link = profileLinks[i];
var text = link.innerText || link.textContent || '';
if (text.trim() === 'Мой профиль' || text.trim() === 'Личный раздел' ||
(link.title && (link.title.indexOf('Профиль') !== -1 || link.title.indexOf('Личный раздел') !== -1))) {
var uidMatch = link.href.match(/id=(\d+)/);
if (uidMatch) {
return parseInt(uidMatch[1]);
}
}
}
return null;
}
function apiGet(params) {
var queryString = Object.keys(params).map(function(k) {
return k + '=' + encodeURIComponent(params[k]);
}).join('&');
return fetch(API_BASE + '?' + queryString)
.then(function(r) { return r.json(); })
.catch(function(e) {
console.error('API Error:', e);
throw e;
});
}
function loadAllTrainerData(userId) {
var now = Date.now();
if (trainerCache.userId === userId && trainerCache.data && (now - trainerCache.timestamp) < CACHE_DURATION) {
return Promise.resolve(trainerCache.data);
}
return apiGet({action: 'getAllData', id: userId}).then(function(data) {
trainerCache.data = data;
trainerCache.timestamp = Date.now();
trainerCache.userId = userId;
return data;
});
}
function copyToClipboard(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(function() {
showNotification('Код скопирован в буфер обмена!');
}).catch(function() {
fallbackCopy(text);
});
} else {
fallbackCopy(text);
}
}
function fallbackCopy(text) {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.top = '-9999px';
ta.style.left = '-9999px';
document.body.appendChild(ta);
ta.select();
try {
document.execCommand('copy');
showNotification('Код скопирован в буфер обмена!');
} catch(e) {
alert('Не удалось скопировать код. Попробуйте скопировать вручную.');
}
document.body.removeChild(ta);
}
function showNotification(message) {
var notif = document.createElement('div');
notif.style.cssText = 'position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#4CAF50;color:white;padding:12px 25px;border-radius:25px;font-weight:bold;z-index:99999;box-shadow:0 3px 10px rgba(0,0,0,0.3);font-family:Arial,sans-serif;font-size:14px;transition:opacity 0.5s;';
notif.textContent = message;
document.body.appendChild(notif);
setTimeout(function() {
notif.style.opacity = '0';
setTimeout(function() {
if (notif.parentNode) document.body.removeChild(notif);
}, 500);
}, 3000);
}
// ===== ОСНОВНЫЕ ФУНКЦИИ МИССИЙ =====
function initMissions() {
var listEl = document.getElementById('missionList');
if (!listEl) return;
listEl.innerHTML = '';
for (var i = 0; i < MISSIONS.length; i++) {
var m = MISSIONS[i];
var div = document.createElement('div');
div.className = 'mission-item';
var bonusBadges = '';
for (var j = 0; j < m.bonus.length; j++) {
bonusBadges += '<span class="bonus-type-badge" data-type="' + m.bonus[j] + '">' + m.bonus[j] + '</span>';
}
div.innerHTML = '<div class="mission-item-name">' + m.name + '</div><div class="mission-bonus-types">' + bonusBadges + '</div>';
div.onclick = (function(mission) {
return function() { selectMission(mission, this); };
})(m);
listEl.appendChild(div);
}
}
function selectMission(mission, element) {
currentMission = mission;
var items = document.querySelectorAll('.mission-item');
for (var i = 0; i < items.length; i++) {
items[i].classList.remove('active');
}
element.classList.add('active');
renderMissionDetail();
}
function loadTrainerPokemons() {
var userId = getCurrentUserId();
if (!userId) {
console.warn('Не удалось определить ID пользователя');
return;
}
loadAllTrainerData(userId).then(function(data) {
trainerCache.data = data;
if (currentMission) renderMissionDetail();
}).catch(function(e) {
console.error("Ошибка загрузки покемонов", e);
});
}
function renderMissionDetail() {
var detailEl = document.getElementById('missionDetail');
if (!currentMission) {
detailEl.innerHTML = '<p>Выберите миссию слева, чтобы увидеть детали.</p>';
return;
}
var pokeOptions = '<option value="">-- Выберите покемона --</option>';
if (trainerCache.data && trainerCache.data.pokemons) {
var pokemons = trainerCache.data.pokemons;
for (var i = 0; i < pokemons.length; i++) {
var p = pokemons[i];
var isRaned = p.status === 'Ранен';
var style = isRaned ? ' style="color:#c03028;"' : '';
var label = p.name + ' (Ур.' + p.level + ')' + (isRaned ? ' ⚠️Ранен' : '');
pokeOptions += '<option value="' + p.id + '" data-types="' + (p.type1 || '') + ',' + (p.type2 || '') + '" data-level="' + p.level + '" data-power="' + p.power + '" data-hp="' + p.hp + '" data-xp="' + p.xp + '" data-status="' + p.status + '" data-name="' + p.name + '"' + style + '>' + label + '</option>';
}
}
var diffClass = currentMission.diff === 'Лёгкая' ? 'diff-easy' : (currentMission.diff === 'Средняя' ? 'diff-medium' : 'diff-hard');
var baseChance = getBaseChance(currentMission.diff);
var html = '<h3>' + currentMission.name + ' <span class="mission-difficulty ' + diffClass + '">' + currentMission.diff + '</span></h3>';
html += '<p><strong>Тип:</strong> ' + currentMission.type + '</p>';
html += '<p>' + currentMission.desc + '</p>';
html += '<div class="mission-bonus-section">';
html += '<strong>⭐ Бонусные стихии:</strong>';
for (var i = 0; i < currentMission.bonus.length; i++) {
html += '<span class="bonus-type-badge" data-type="' + currentMission.bonus[i] + '">' + currentMission.bonus[i] + '</span>';
}
html += '</div>';
html += '<p><strong>📊 Базовая вероятность:</strong> ' + baseChance + '%</p>';
html += '<p>✅ Успех: +' + currentMission.xp + ' XP | ❌ Провал: ' + (currentMission.dmg > 0 ? '-' + currentMission.dmg + ' HP' : 'без последствий') + '</p>';
html += '<p>⏳ Время: ' + Math.floor(currentMission.time / 60) + ' мин.</p>';
html += '<select class="pokemon-select" id="pokemonSelect" onchange="onPokemonChange()">' + pokeOptions + '</select>';
html += '<div id="pokemonStatsDisplay" style="display:none;"></div>';
html += '<div id="chanceDisplay"></div>';
html += '<button class="btn-send" id="sendBtn" disabled onclick="startMission()">Отправить на миссию</button>';
detailEl.innerHTML = html;
}
function onPokemonChange() {
var select = document.getElementById('pokemonSelect');
var statsDiv = document.getElementById('pokemonStatsDisplay');
var chanceDiv = document.getElementById('chanceDisplay');
var sendBtn = document.getElementById('sendBtn');
if (!select || !select.value) {
if (sendBtn) sendBtn.disabled = true;
if (chanceDiv) chanceDiv.innerHTML = '';
if (statsDiv) statsDiv.style.display = 'none';
return;
}
var option = select.options[select.selectedIndex];
var status = option.getAttribute('data-status') || '';
var pokemonName = option.getAttribute('data-name') || '';
var types = (option.getAttribute('data-types') || '').split(',');
var level = parseInt(option.getAttribute('data-level')) || 1;
var power = parseInt(option.getAttribute('data-power')) || 10;
var hp = parseInt(option.getAttribute('data-hp')) || 20;
if (statsDiv) {
var typesHtml = '';
for (var i = 0; i < types.length; i++) {
if (types[i] && types[i].trim() !== '') {
typesHtml += '<span class="type-badge type-' + types[i].trim() + '">' + types[i].trim() + '</span>';
}
}
statsDiv.style.display = 'block';
statsDiv.innerHTML = '<div class="pokemon-stats">' +
'<h4>📊 Характеристики покемона</h4>' +
'<div class="stat-row"><span class="stat-label">Имя:</span><span class="stat-value">' + pokemonName + '</span></div>' +
'<div class="stat-row"><span class="stat-label">Уровень:</span><span class="stat-value">' + level + '</span></div>' +
'<div class="stat-row"><span class="stat-label">Сила:</span><span class="stat-value">' + power + '</span></div>' +
'<div class="stat-row"><span class="stat-label">Здоровье:</span><span class="stat-value">' + hp + ' HP</span></div>' +
'<div class="stat-row"><span class="stat-label">Стихии:</span><div class="stat-types">' + typesHtml + '</div></div>' +
'</div>';
}
if (status === 'Ранен') {
chanceDiv.innerHTML = '<p style="color:#c03028;">⚠️ Этот покемон ранен и не может отправиться на миссию!</p>';
if (sendBtn) sendBtn.disabled = true;
return;
}
var baseChance = getBaseChance(currentMission.diff);
var levelBonus = level * 2;
var statBonus = 0;
var statName = '';
if (currentMission.type === 'Военная') {
statBonus = Math.floor(power / 5);
statName = 'Сила';
} else {
statBonus = Math.floor(hp / 5);
statName = 'Здоровье';
}
var bonusTypes = [];
var hasBonus = false;
for (var i = 0; i < types.length; i++) {
if (types[i] && currentMission.bonus.indexOf(types[i].trim()) !== -1) {
bonusTypes.push(types[i].trim());
hasBonus = true;
}
}
var bonusChance = hasBonus ? 20 : 0;
var totalChance = baseChance + levelBonus + statBonus + bonusChance;
totalChance = Math.min(95, Math.max(5, totalChance));
var html = '<div class="calculation-details">';
html += '<div class="calc-row"><span>Базовая вероятность (' + currentMission.diff + ' миссия):</span><span>' + baseChance + '%</span></div>';
html += '<div class="calc-row"><span>Уровень покемона (' + level + ' × 2):</span><span>+' + levelBonus + '%</span></div>';
html += '<div class="calc-row"><span>' + statName + ' (' + (currentMission.type === 'Военная' ? power : hp) + ' ÷ 5):</span><span>+' + statBonus + '%</span></div>';
if (hasBonus) {
html += '<div class="calc-row bonus"><span>⭐ Бонус стихии (' + bonusTypes.join(', ') + '):</span><span>+' + bonusChance + '%</span></div>';
} else {
html += '<div class="calc-row"><span>Бонус стихии (нет совпадений):</span><span>+0%</span></div>';
}
html += '<div class="calc-row total"><span>🎯 Итоговый шанс успеха:</span><span>' + totalChance + '%</span></div>';
html += '</div>';
html += '<div class="chance-bar"><div class="chance-fill" style="width:' + totalChance + '%"></div></div>';
if (hasBonus) {
html += '<p class="bonus-info">⭐ Бонусная стихия! Шанс успеха увеличен на 20%!</p>';
}
if (chanceDiv) chanceDiv.innerHTML = html;
if (sendBtn) sendBtn.disabled = false;
}
function startMission() {
var select = document.getElementById('pokemonSelect');
if (!select || !select.value) {
alert('Выберите покемона!');
return;
}
var pokemonId = select.value;
var option = select.options[select.selectedIndex];
var pokemonName = option.getAttribute('data-name') || option.text.split('(')[0].trim();
var pokemonLevel = parseInt(option.getAttribute('data-level')) || 1;
var pokemonPower = parseInt(option.getAttribute('data-power')) || 10;
var pokemonHp = parseInt(option.getAttribute('data-hp')) || 20;
var pokemonTypes = (option.getAttribute('data-types') || '').split(',');
var baseChance = getBaseChance(currentMission.diff);
var levelBonus = pokemonLevel * 2;
var statBonus = 0;
if (currentMission.type === 'Военная') {
statBonus = Math.floor(pokemonPower / 5);
} else {
statBonus = Math.floor(pokemonHp / 5);
}
var bonusChance = 0;
for (var i = 0; i < pokemonTypes.length; i++) {
if (pokemonTypes[i] && currentMission.bonus.indexOf(pokemonTypes[i].trim()) !== -1) {
bonusChance = 20;
break;
}
}
var chance = Math.min(95, Math.max(5, baseChance + levelBonus + statBonus + bonusChance));
var userId = getCurrentUserId();
if (!userId) {
alert('Не удалось определить ID пользователя');
return;
}
apiGet({
action: 'startMission',
tid: userId,
pid: pokemonId,
mission: currentMission.name,
time: currentMission.time,
chance: chance
}).then(function(startRes) {
if (!startRes.success) {
alert('Ошибка: ' + (startRes.error || 'Не удалось начать миссию'));
return;
}
var bbcode = generateMissionBBCode(
pokemonName,
pokemonId,
chance,
currentMission,
userId
);
copyToClipboard(bbcode);
alert('Миссия начата! Код скопирован в буфер обмена. Вставьте его в сообщение.');
}).catch(function(e) {
console.error(e);
alert('Ошибка соединения: ' + e.message);
});
}
function generateMissionBBCode(pokemonName, pokemonId, chance, mission, userId) {
var uniqueId = 'mission-' + Date.now() + '-' + Math.floor(Math.random() * 1000000);
var timerId = 'timer-' + uniqueId;
var btnId = 'btn-' + uniqueId;
var resultId = 'result-' + uniqueId;
var endTime = Date.now() + (mission.time * 1000);
var html = '<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:\'Book Antiqua\',serif;max-width:550px;margin:10px auto;">';
html += '<div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: ' + mission.name + '</div>';
html += '<div style="margin-top:10px;color:#4d5a55;">';
html += '<p>🐾 <strong>' + pokemonName + '</strong> отправляется на задание!</p>';
html += '<p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">' + chance + '%</span></p>';
html += '<div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;">';
html += '<div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:' + chance + '%;"></div>';
html += '</div>';
html += '<p>✅ При успехе: +' + mission.xp + ' XP</p>';
html += '<p>❌ При провале: ' + (mission.dmg > 0 ? '-' + mission.dmg + ' HP' : 'без последствий') + '</p>';
html += '<p id="' + timerId + '" style="font-weight:bold;color:#c03028;font-size:16px;">⏳ Ожидание...</p>';
html += '<div id="' + resultId + '" style="margin-top:10px;font-weight:bold;display:none;"></div>';
html += '<button id="' + btnId + '" style="display:none;margin-top:15px;padding:10px 25px;background:#4CAF50;color:white;border:none;border-radius:25px;font-weight:bold;cursor:pointer;font-size:14px;width:100%;">🔍 Проверить результат миссии</button>';
html += '</div>';
html += '</div>';
html += '<scr' + 'ipt>';
html += '(function() {';
html += 'var missionData = localStorage.getItem("' + uniqueId + '");';
html += 'if (missionData) {';
html += ' try {';
html += ' var saved = JSON.parse(missionData);';
html += ' document.getElementById("' + timerId + '").innerHTML = saved.timerText;';
html += ' document.getElementById("' + timerId + '").style.color = saved.timerColor;';
html += ' if (saved.showBtn) {';
html += ' document.getElementById("' + btnId + '").style.display = "block";';
html += ' }';
html += ' if (saved.showResult) {';
html += ' document.getElementById("' + resultId + '").style.display = "block";';
html += ' document.getElementById("' + resultId + '").innerHTML = saved.resultText;';
html += ' document.getElementById("' + resultId + '").style.color = saved.resultColor;';
html += ' }';
html += ' } catch(e) {}';
html += '}';
html += '';
html += 'var endTime = ' + endTime + ';';
html += 'var timerEl = document.getElementById("' + timerId + '");';
html += 'var btnEl = document.getElementById("' + btnId + '");';
html += 'var resultEl = document.getElementById("' + resultId + '");';
html += 'var missionName = "' + mission.name + '";';
html += 'var pokemonId = "' + pokemonId + '";';
html += 'var userId = "' + userId + '";';
html += 'var damage = ' + mission.dmg + ';';
html += 'var xpGain = ' + mission.xp + ';';
html += 'var chance = ' + chance + ';';
html += 'var apiBase = "' + API_BASE + '";';
html += 'var uniqueId = "' + uniqueId + '";';
html += '';
html += 'if (!timerEl) return;';
html += '';
html += 'function saveState() {';
html += ' var state = {';
html += ' timerText: timerEl.innerHTML,';
html += ' timerColor: timerEl.style.color,';
html += ' showBtn: btnEl.style.display === "block",';
html += ' showResult: resultEl.style.display === "block",';
html += ' resultText: resultEl.innerHTML,';
html += ' resultColor: resultEl.style.color';
html += ' };';
html += ' localStorage.setItem(uniqueId, JSON.stringify(state));';
html += '}';
html += '';
html += 'var missionCompleted = localStorage.getItem(uniqueId + "_completed");';
html += 'if (missionCompleted === "true") {';
html += ' return;';
html += '}';
html += '';
html += 'var interval = setInterval(function() {';
html += 'var now = Date.now();';
html += 'var diff = Math.max(0, endTime - now);';
html += 'if (diff <= 0) {';
html += 'clearInterval(interval);';
html += 'timerEl.innerHTML = "⏳ Время вышло! Нажмите кнопку для проверки результата.";';
html += 'timerEl.style.color = "#2b6f2b";';
html += 'btnEl.style.display = "block";';
html += 'saveState();';
html += 'return;';
html += '}';
html += 'var mins = Math.floor(diff / 60000);';
html += 'var secs = Math.floor((diff % 60000) / 1000);';
html += 'timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;';
html += 'saveState();';
html += '}, 1000);';
html += '';
html += 'function checkMissionResult() {';
html += 'if (btnEl.textContent === "⏳ Обработка...") return;';
html += 'btnEl.textContent = "⏳ Обработка...";';
html += 'btnEl.style.background = "#848a87";';
html += 'btnEl.disabled = true;';
html += '';
html += 'var roll = Math.floor(Math.random() * 100) + 1;';
html += 'var success = roll <= chance;';
html += '';
html += 'var xp = success ? xpGain : 0;';
html += 'var dmg = success ? 0 : damage;';
html += '';
html += 'var url = apiBase + "?action=completeMission&tid=" + userId + "&pid=" + pokemonId + "&mission=" + encodeURIComponent(missionName) + "&result=" + (success ? "success" : "fail") + "&damage=" + dmg + "&xp=" + xp;';
html += '';
html += 'fetch(url)';
html += '.then(function(r) { return r.json(); })';
html += '.then(function(data) {';
html += 'if (data.success) {';
html += 'resultEl.style.display = "block";';
html += 'if (success) {';
html += 'resultEl.innerHTML = "🎉 <strong>УСПЕХ!</strong> Миссия выполнена! Получено +" + xpGain + " XP!";';
html += 'resultEl.style.color = "#2b6f2b";';
html += 'timerEl.innerHTML = "✅ Миссия успешно завершена! +" + xpGain + " XP";';
html += '} else {';
html += 'resultEl.innerHTML = "💔 <strong>ПРОВАЛ!</strong> Миссия не выполнена! ' + (mission.dmg > 0 ? 'Потеряно ' + mission.dmg + ' HP' : 'Без последствий') + '";';
html += 'resultEl.style.color = "#c03028";';
html += 'timerEl.innerHTML = "❌ Миссия провалена! ' + (mission.dmg > 0 ? 'Потеряно ' + mission.dmg + ' HP' : 'Без последствий') + '";';
html += '}';
html += 'btnEl.textContent = "✅ Готово";';
html += 'btnEl.style.background = "#848a87";';
html += 'btnEl.disabled = true;';
html += 'localStorage.setItem(uniqueId + "_completed", "true");';
html += 'saveState();';
html += '} else {';
html += 'resultEl.style.display = "block";';
html += 'resultEl.innerHTML = "❌ Ошибка при завершении миссии. Попробуйте позже.";';
html += 'resultEl.style.color = "#c03028";';
html += 'btnEl.textContent = "🔍 Попробовать снова";';
html += 'btnEl.style.background = "#4CAF50";';
html += 'btnEl.disabled = false;';
html += '}';
html += '})';
html += '.catch(function(e) {';
html += 'resultEl.style.display = "block";';
html += 'resultEl.innerHTML = "❌ Ошибка соединения. Попробуйте позже.";';
html += 'resultEl.style.color = "#c03028";';
html += 'btnEl.textContent = "🔍 Попробовать снова";';
html += 'btnEl.style.background = "#4CAF50";';
html += 'btnEl.disabled = false;';
html += 'console.error(e);';
html += '});';
html += '}';
html += '';
html += 'btnEl.onclick = checkMissionResult;';
html += '})();';
html += '</scr' + 'ipt>';
return '[html]' + html + '[' + '/html]';
}
// ===== ИНИЦИАЛИЗАЦИЯ =====
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
initMissions();
setTimeout(loadTrainerPokemons, 300);
});
} else {
initMissions();
setTimeout(loadTrainerPokemons, 300);
}
</script>
[/html]
Поделиться272026-08-09 12:37:07
[html]<div class="ms-result-card" id="ms-rc-ms_1786268216628_yuytw59g"><div class="ms-rc-title">🗺️ Покемон на миссии</div><div class="ms-rc-poke">Пикачу (Ур.2)</div><div class="ms-rc-mission">Миссия: Починка генератора [Лёгкая]</div><div class="ms-rc-chance">Шанс успеха: 95%</div><div class="ms-rc-timer" id="ms-timer-ms_1786268216628_yuytw59g">02:00</div><div id="ms-result-ms_1786268216628_yuytw59g"></div></div><script>(function() {
var missionRecordId = arguments[0];
var endTimeMs = arguments[1];
var isSuccess = arguments[2];
var totalSeconds = arguments[3];
var pokemonName = arguments[4];
var xpReward = arguments[5];
var failHp = arguments[6];
var newXp = arguments[7];
var newLevel = arguments[8];
var levelUp = arguments[9];
var newHp = arguments[10];
function updateTimer() {
var now = Date.now();
var remaining = Math.max(0, Math.floor((endTimeMs - now) / 1000));
var timerEl = document.getElementById('ms-timer-' + missionRecordId);
if (timerEl) {
if (remaining > 0) {
timerEl.textContent = (function(s){var m=Math.floor(s/60);var sec=s%60;return (m<10?'0':'')+m+':'+(sec<10?'0':'')+sec;})(remaining);
setTimeout(updateTimer, 1000);
} else {
timerEl.textContent = '00:00';
var resultEl = document.getElementById('ms-result-' + missionRecordId);
if (resultEl) {
if (isSuccess) {
var successHtml = '<div class="ms-rc-result ms-result-success">\u2705 \u0423\u0441\u043F\u0435\u0445! +' + xpReward + ' XP</div>';
if (levelUp) successHtml += '<div class="ms-rc-levelup">\u2B06\uFE0F \u0423\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u043E\u0432\u044B\u0448\u0435\u043D \u0434\u043E ' + newLevel + '!</div>';
successHtml += '<div class="ms-rc-effects">' + pokemonName + ': XP ' + (isSuccess ? newXp : '') + '/100, \u0423\u0440.' + newLevel + '</div>';
resultEl.innerHTML = successHtml;
} else if (failHp > 0) {
resultEl.innerHTML = '<div class="ms-rc-result ms-result-fail">\u274C \u041F\u0440\u043E\u0432\u0430\u043B: -' + failHp + ' HP</div><div class="ms-rc-effects">' + pokemonName + ': HP ' + newHp + ', \u0423\u0440.' + newLevel + '</div>';
} else {
resultEl.innerHTML = '<div class="ms-rc-result ms-result-fail">\u274C \u041F\u0440\u043E\u0432\u0430\u043B: \u0431\u0435\u0437 \u043F\u043E\u0441\u043B\u0435\u0434\u0441\u0442\u0432\u0438\u0439</div>';
}
}
}
}
}
updateTimer();
})("ms_1786268216628_yuytw59g",1786268336628,true,120,"Пикачу",23,0,103,3,true,40);</script>[/html]
Поделиться282026-08-09 19:52:35
[html]<div class="ms-result-card" id="ms-rc-ms_1786294349584_teeaj0j8"><div class="ms-rc-title">Покемон на миссии</div><div class="ms-rc-poke">Понита (Ур.4)</div><div class="ms-rc-mission">Миссия: Освещение тоннелей [Лёгкая]</div><div class="ms-rc-chance">Шанс успеха: 95%</div><div class="ms-rc-timer" id="ms-timer-ms_1786294349584_teeaj0j8">02:00</div><div id="ms-result-ms_1786294349584_teeaj0j8"></div><button id="ms-accept-ms_1786294349584_teeaj0j8" class="ms-btn-send" style="margin-top:8px;background:#4a6741;border-color:#2d4a2d;display:none;" onclick="(function(){var b=document.getElementById('ms-accept-ms_1786294349584_teeaj0j8');if(b){b.disabled=true;b.textContent='Загрузка отчёта...';}var x=new XMLHttpRequest();x.open('GET','https://script.google.com/macros/s/AKfycbyL15prVk03_5eAJMHRiA8RvGDYJYQ2Q4qj_l61cmqMtknceKHcz9XVEocTTlhkfZyl/exec?action=completeMissionAction&tid=2&missionRecordId=ms_1786294349584_teeaj0j8',true);x.onload=function(){var r=JSON.parse(x.responseText);var re=document.getElementById('ms-result-ms_1786294349584_teeaj0j8');var ac=document.getElementById('ms-accept-ms_1786294349584_teeaj0j8');var ti=document.getElementById('ms-timer-ms_1786294349584_teeaj0j8');if(ti)ti.textContent='00:00';if(ac)ac.style.display='none';if(re&&r.success){if(r.isSuccess){re.innerHTML='<div class=ms-rc-result ms-result-success>Успех! +24 XP</div>'+(r.levelUp?'<div class=ms-rc-levelup>Уровень повышен до '+r.newLevel+'!</div>':'')+'<div class=ms-rc-effects>Понита: XP '+r.newXp+'/100, Ур.'+r.newLevel+'</div>';}else if(r.failHp>0){re.innerHTML='<div class=ms-rc-result ms-result-fail>Провал: -'+r.failHp+' HP</div><div class=ms-rc-effects>Понита: HP '+r.newHp+', Ур.'+r.newLevel+'</div>';}else{re.innerHTML='<div class=ms-rc-result ms-result-fail>Провал: без последствий</div>';}}else{if(ac){ac.disabled=false;ac.textContent='Принять отчёт';}alert('Ошибка: '+(r.error||'неизвестна'));}};x.onerror=function(){var ac2=document.getElementById('ms-accept-ms_1786294349584_teeaj0j8');if(ac2){ac2.disabled=false;ac2.textContent='Принять отчёт';}alert('Ошибка соединения');};x.send();})()">Принять отчёт</button></div><script>(function(missionRecordId, endTimeMs, totalSeconds) {
function updateTimer() {
var now = Date.now();
var remaining = Math.max(0, Math.floor((endTimeMs - now) / 1000));
var timerEl = document.getElementById('ms-timer-' + missionRecordId);
var acceptBtn = document.getElementById('ms-accept-' + missionRecordId);
if (timerEl) {
if (remaining > 0) {
var m = Math.floor(remaining / 60);
var s = remaining % 60;
timerEl.textContent = (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;
if (acceptBtn) acceptBtn.style.display = 'none';
setTimeout(updateTimer, 1000);
} else {
timerEl.textContent = '00:00';
if (acceptBtn) acceptBtn.style.display = 'block';
}
}
}
updateTimer();
})("ms_1786294349584_teeaj0j8",1786294469584,120);</script>[/html]
