Нет описания правки |
Нет описания правки |
||
Строка 73: | Строка 73: | ||
} | } | ||
const laws = { | |||
'100': { name: 'Оскорбительное поведение', category: 1, minTime: 5, maxTime: 10 }, | |||
'101': { name: 'Лёгкий ущерб здоровью', category: 1, minTime: 5, maxTime: 10 }, | |||
'102': { name: 'Порча имущества', category: 1, minTime: 5, maxTime: 10 }, | |||
'103': { name: 'Мелкая кража', category: 1, minTime: 5, maxTime: 10 }, | |||
'104': { name: 'Владение регулируемыми веществами', category: 1, minTime: 5, maxTime: 10 }, | |||
'105': { name: 'Злоупотребление экипировкой', category: 1, minTime: 5, maxTime: 10 }, | |||
'106': { name: 'Помеха работе сотрудников', category: 1, minTime: 5, maxTime: 10 }, | |||
'107': { name: 'Проникновение', category: 1, minTime: 5, maxTime: 10 }, | |||
'108': { name: 'Жестокое обращение с животными', category: 1, minTime: 5, maxTime: 10 }, | |||
'109': { name: 'Клевета', category: 1, minTime: 5, maxTime: 10 }, | |||
'200': { name: 'Оскорбление власти', category: 2, minTime: 10, maxTime: 15 }, | |||
'201': { name: 'Средний ущерб здоровью', category: 2, minTime: 10, maxTime: 15 }, | |||
'202': { name: 'Вандализм', category: 2, minTime: 10, maxTime: 15 }, | |||
'204': { name: 'Распространение регулируемых веществ', category: 2, minTime: 10, maxTime: 15 }, | |||
'205': { name: 'Владение боевым приспособлением', category: 2, minTime: 10, maxTime: 15 }, | |||
'206': { name: 'Помеха правосудию', category: 2, minTime: 10, maxTime: 15 }, | |||
'207': { name: 'Проникновение со взломом', category: 2, minTime: 10, maxTime: 15 }, | |||
'208': { name: 'Убийство животного', category: 2, minTime: 10, maxTime: 15 }, | |||
'209': { name: 'Халатность', category: 2, minTime: 10, maxTime: 15 }, | |||
'210': { name: 'Ограничение свободы', category: 2, minTime: 10, maxTime: 15 }, | |||
'211': { name: 'Шпионаж', category: 2, minTime: 10, maxTime: 15 }, | |||
'300': { name: 'Забастовка', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'301': { name: 'Тяжкий ущерб здоровью', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'302': { name: 'Саботаж', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'303': { name: 'Кража', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'304': { name: 'Оборот контрабанды', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'305': { name: 'Владение нелетальным оружием', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'306': { name: 'Мошенничество', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'307': { name: 'Проникновение в стратегическую точку', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'308': { name: 'Распространение опасной флоры и фауны', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'309': { name: 'Серьёзная халатность', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'310': { name: 'Похищение', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'311': { name: 'Проникновение в защищённый канал', category: 3, minTime: 15, maxTime: 20, dismissal: true }, | |||
'400': { name: 'Бунт', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'401': { name: 'Убийство', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'403': { name: 'Крупная кража', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'404': { name: 'Производство регулируемых веществ', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'405': { name: 'Владение летальным оружием', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'406': { name: 'Растрата активов корпорации', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'408': { name: 'Убийство особого животного', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'409': { name: 'Грубая халатность', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'410': { name: 'Похищение должностного лица', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'411': { name: 'Антикорпоративный шпионаж', category: 4, minTime: 20, maxTime: 25, dismissal: true }, | |||
'500': { name: 'Мятеж', category: 5, dClass: true, dismissal: true }, | |||
'501': { name: 'Уничтожение тела', category: 5, dClass: true, dismissal: true }, | |||
'502': { name: 'Крупный саботаж', category: 5, dClass: true, dismissal: true }, | |||
'503': { name: 'Особая кража', category: 5, dClass: true, dismissal: true }, | |||
'504': { name: 'Владение вражеским снаряжением', category: 5, dClass: true, dismissal: true }, | |||
'505': { name: 'Распространение оружия', category: 5, dClass: true, dismissal: true }, | |||
'507': { name: 'Проникновение в защищённую стратегическую точку', category: 5, dClass: true, dismissal: true }, | |||
'510': { name: 'Похищение высокопоставленных лиц', category: 5, dClass: true, dismissal: true }, | |||
'511': { name: 'Разглашение секретной информации', category: 5, dClass: true, dismissal: true } | |||
}; | |||
let currentLawCode = null; | |||
function toggleCalculator(lawCode) { | |||
const calculator = document.getElementById('ss14-calculator'); | |||
currentLawCode = lawCode; | |||
if (calculator.style.display === 'none' || !calculator.classList.contains('active')) { | |||
calculator.classList.add('active'); | |||
generateLawCheckboxes(); | |||
// Автоматически выбираем нажатый закон | |||
const checkbox = document.getElementById('law-' + lawCode); | |||
if (checkbox) { | |||
checkbox.checked = true; | |||
} | |||
calculateSentence(); | |||
} else { | |||
calculator.classList.remove('active'); | |||
} | |||
} | |||
function generateLawCheckboxes() { | |||
const container = document.getElementById('law-checkboxes'); | |||
container.innerHTML = ''; | |||
// Группируем законы по категориям | |||
const categories = { | |||
1: { name: 'Лёгкие нарушения (1XX)', color: '#0F4F27' }, | |||
2: { name: 'Средние нарушения (2XX)', color: '#414700' }, | |||
3: { name: 'Тяжкие нарушения (3XX)', color: '#611300' }, | |||
4: { name: 'Особо тяжкие нарушения (4XX)', color: '#57000C' }, | |||
5: { name: 'Критические нарушения (5XX)', color: '#121212' } | |||
}; | |||
for (let cat = 1; cat <= 5; cat++) { | |||
const categoryDiv = document.createElement('div'); | |||
categoryDiv.style.marginBottom = '15px'; | |||
categoryDiv.innerHTML = `<h5 style="color: ${categories[cat].color}; margin-bottom: 8px;">${categories[cat].name}</h5>`; | |||
const lawsInCategory = Object.entries(laws).filter(([code, law]) => law.category === cat); | |||
lawsInCategory.forEach(([code, law]) => { | |||
const label = document.createElement('label'); | |||
label.className = 'law-checkbox'; | |||
label.innerHTML = `<input type="checkbox" id="law-${code}" onchange="calculateSentence()"> ${code} - ${law.name}`; | |||
categoryDiv.appendChild(label); | |||
}); | |||
container.appendChild(categoryDiv); | |||
} | |||
} | |||
function calculateSentence() { | |||
const selectedLaws = []; | |||
const checkboxes = document.querySelectorAll('[id^="law-"]:checked'); | |||
checkboxes.forEach(checkbox => { | |||
const lawCode = checkbox.id.replace('law-', ''); | |||
selectedLaws.push(lawCode); | |||
}); | |||
if (selectedLaws.length === 0) { | |||
document.getElementById('calculation-result').style.display = 'none'; | |||
return; | |||
} | |||
const modifier = document.getElementById('modifier-select').value; | |||
const isRepeat = document.getElementById('repeat-offense').checked; | |||
const hasCooperation = document.getElementById('cooperation').checked; | |||
const isDClass = document.getElementById('d-class').checked; | |||
let result = calculatePunishment(selectedLaws, modifier, isRepeat, hasCooperation, isDClass); | |||
displayResult(result, selectedLaws); | |||
} | |||
function calculatePunishment(selectedLaws, modifier, isRepeat, hasCooperation, isDClass) { | |||
let totalTime = 0; | |||
let punishmentType = 'Заключение под стражу'; | |||
let hasDismissal = false; | |||
let hasDClass = false; | |||
let categoryGroups = {}; | |||
// Группируем по категориям (одинаковые категории не складываются) | |||
selectedLaws.forEach(lawCode => { | |||
const law = laws[lawCode]; | |||
const categoryCode = lawCode.substring(1); // получаем последние 2 цифры (тип нарушения) | |||
if (!categoryGroups[categoryCode] || law.category > laws[categoryGroups[categoryCode]].category) { | |||
categoryGroups[categoryCode] = lawCode; | |||
} | |||
}); | |||
// Рассчитываем время для каждой группы | |||
Object.values(categoryGroups).forEach(lawCode => { | |||
const law = laws[lawCode]; | |||
if (law.dClass) { | |||
hasDClass = true; | |||
totalTime += 70; // для расчёта модификаторов | |||
} else { | |||
totalTime += law.maxTime; // берём максимальное время | |||
} | |||
if (law.dismissal) { | |||
hasDismissal = true; | |||
} | |||
}); | |||
// Применяем модификаторы | |||
switch (modifier) { | |||
case 'M-CLEM': | |||
// Помилование - только для категорий 3 и 4 | |||
const hasEligibleLaws = Object.values(categoryGroups).some(lawCode => { | |||
const law = laws[lawCode]; | |||
return law.category === 3 || law.category === 4; | |||
}); | |||
if (hasEligibleLaws) { | |||
totalTime = Math.max(0, totalTime - 10); | |||
} | |||
break; | |||
case 'M-SURR': | |||
// Немедленная капитуляция | |||
totalTime = Math.max(0, totalTime - 5); | |||
break; | |||
case 'M-DEFENSE': | |||
case 'M-HELP': | |||
// Самооборона или спасение - снимает все обвинения | |||
totalTime = 0; | |||
hasDClass = false; | |||
punishmentType = 'Обвинения сняты (требуется обыск)'; | |||
break; | |||
} | |||
// Повторное нарушение | |||
if (isRepeat && totalTime > 0) { | |||
totalTime = Math.min(totalTime + 10, 50); | |||
} | |||
// Сотрудничество со следствием | |||
if (hasCooperation && totalTime > 0) { | |||
totalTime = Math.max(0, totalTime - 3); | |||
} | |||
// Определяем тип наказания | |||
if (hasDClass) { | |||
punishmentType = 'Перевод в Д-класс'; | |||
if (modifier === 'M-LOW' && isDClass) { | |||
punishmentType = 'Условная ликвидация (M-LOW)'; | |||
} else if (modifier === 'M-VITAL' && isDClass) { | |||
punishmentType = 'Взаимодействие с SCP (M-VITAL)'; | |||
} | |||
} else if (totalTime >= 50) { | |||
punishmentType = 'Перевод в Д-класс (срок ≥50 мин)'; | |||
if (totalTime >= 35 && isDClass) { | |||
punishmentType += ' или добровольный перевод'; | |||
} | |||
} else if (totalTime >= 35 && isDClass) { | |||
punishmentType = 'Возможен добровольный перевод в Д-класс'; | |||
} | |||
return { | |||
totalTime: totalTime, | |||
punishmentType: punishmentType, | |||
hasDismissal: hasDismissal, | |||
hasDClass: hasDClass, | |||
categoryGroups: categoryGroups | |||
}; | |||
} | |||
function displayResult(result, selectedLaws) { | |||
const resultDiv = document.getElementById('calculation-result'); | |||
let html = '<h4>📋 Результат расчёта:</h4>'; | |||
html += '<div><strong>Выбранные статьи:</strong><br>'; | |||
selectedLaws.forEach(lawCode => { | |||
const law = laws[lawCode]; | |||
html += `• ${lawCode} - ${law.name}<br>`; | |||
}); | |||
html += '</div><br>'; | |||
html += `<div class="punishment-type">Тип наказания: ${result.punishmentType}</div>`; | |||
if (result.totalTime > 0 && !result.hasDClass) { | |||
html += `<div class="time-result">Время заключения: ${result.totalTime} минут</div>`; | |||
} | |||
if (result.hasDismissal) { | |||
html += '<div style="color: #f44336; margin-top: 10px;">⚠️ <strong>Обязательное увольнение с текущей должности</strong></div>'; | |||
} | |||
// Дополнительная информация | |||
html += '<div style="margin-top: 15px; font-size: 12px; color: #666;">'; | |||
html += '<strong>Примечания:</strong><br>'; | |||
html += '• Статьи одной категории (одинаковые последние 2 цифры) не складываются<br>'; | |||
html += '• Статьи разных категорий складываются<br>'; | |||
html += '• При сроке 50+ минут - обязательный перевод в Д-класс<br>'; | |||
html += '• При сроке 35+ минут класс Д может добровольно перейти в Д-класс'; | |||
html += '</div>'; | |||
resultDiv.innerHTML = html; | |||
resultDiv.style.display = 'block'; | |||
} | |||
// Инициализация при загрузке страницы | |||
document.addEventListener('DOMContentLoaded', function() { | |||
generateLawCheckboxes(); | |||
}); | |||
}); | }); |
Версия от 14:20, 9 сентября 2025
$(document).ready(function() {
// Инициализация боковой панели
$('.боковая-панель-кнопка').on('click', function() {
var targetId = $(this).data('target');
// Удаляем активный класс у всех кнопок
$('.боковая-панель-кнопка').removeClass('active');
// Добавляем активный класс текущей кнопке
$(this).addClass('active');
// Скрываем все разделы
$('.боковая-панель-раздел').removeClass('default');
// Показываем выбранный раздел
$('#' + targetId).addClass('default');
});
// Активируем первую кнопку по умолчанию
$('.боковая-панель-кнопка:first').click();
// Подключаем Tippy.js через CDN динамически
if (!window.tippy) {
var tippyScript = document.createElement('script');
tippyScript.src = "https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js";
tippyScript.onload = function() {
var tippyCoreScript = document.createElement('script');
tippyCoreScript.src = "https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js";
tippyCoreScript.onload = initTippy;
document.head.appendChild(tippyCoreScript);
};
document.head.appendChild(tippyScript);
// Подключаем CSS
var tippyCSS = document.createElement('link');
tippyCSS.rel = "stylesheet";
tippyCSS.href = "https://unpkg.com/tippy.js@6/dist/tippy.css";
document.head.appendChild(tippyCSS);
} else {
initTippy();
}
// Инициализация Tippy после загрузки скриптов
function initTippy() {
$('.допуск-контейнер').each(function() {
var content = $(this).find('.допуск-подсказка').html(); // берем содержимое подсказки
tippy(this, {
content: content,
allowHTML: true,
interactive: true,
placement: 'auto', // автоматический выбор позиции
maxWidth: '500px',
minHeight: 'auto',
theme: 'dark', // темная тема
arrow: true, // без стрелки
duration: [200, 200], // плавное появление/исчезание
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
padding: 8, // отступ от краев экрана
},
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'bottom', 'right', 'left'],
},
},
],
},
});
});
}
const laws = {
'100': { name: 'Оскорбительное поведение', category: 1, minTime: 5, maxTime: 10 },
'101': { name: 'Лёгкий ущерб здоровью', category: 1, minTime: 5, maxTime: 10 },
'102': { name: 'Порча имущества', category: 1, minTime: 5, maxTime: 10 },
'103': { name: 'Мелкая кража', category: 1, minTime: 5, maxTime: 10 },
'104': { name: 'Владение регулируемыми веществами', category: 1, minTime: 5, maxTime: 10 },
'105': { name: 'Злоупотребление экипировкой', category: 1, minTime: 5, maxTime: 10 },
'106': { name: 'Помеха работе сотрудников', category: 1, minTime: 5, maxTime: 10 },
'107': { name: 'Проникновение', category: 1, minTime: 5, maxTime: 10 },
'108': { name: 'Жестокое обращение с животными', category: 1, minTime: 5, maxTime: 10 },
'109': { name: 'Клевета', category: 1, minTime: 5, maxTime: 10 },
'200': { name: 'Оскорбление власти', category: 2, minTime: 10, maxTime: 15 },
'201': { name: 'Средний ущерб здоровью', category: 2, minTime: 10, maxTime: 15 },
'202': { name: 'Вандализм', category: 2, minTime: 10, maxTime: 15 },
'204': { name: 'Распространение регулируемых веществ', category: 2, minTime: 10, maxTime: 15 },
'205': { name: 'Владение боевым приспособлением', category: 2, minTime: 10, maxTime: 15 },
'206': { name: 'Помеха правосудию', category: 2, minTime: 10, maxTime: 15 },
'207': { name: 'Проникновение со взломом', category: 2, minTime: 10, maxTime: 15 },
'208': { name: 'Убийство животного', category: 2, minTime: 10, maxTime: 15 },
'209': { name: 'Халатность', category: 2, minTime: 10, maxTime: 15 },
'210': { name: 'Ограничение свободы', category: 2, minTime: 10, maxTime: 15 },
'211': { name: 'Шпионаж', category: 2, minTime: 10, maxTime: 15 },
'300': { name: 'Забастовка', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'301': { name: 'Тяжкий ущерб здоровью', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'302': { name: 'Саботаж', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'303': { name: 'Кража', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'304': { name: 'Оборот контрабанды', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'305': { name: 'Владение нелетальным оружием', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'306': { name: 'Мошенничество', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'307': { name: 'Проникновение в стратегическую точку', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'308': { name: 'Распространение опасной флоры и фауны', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'309': { name: 'Серьёзная халатность', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'310': { name: 'Похищение', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'311': { name: 'Проникновение в защищённый канал', category: 3, minTime: 15, maxTime: 20, dismissal: true },
'400': { name: 'Бунт', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'401': { name: 'Убийство', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'403': { name: 'Крупная кража', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'404': { name: 'Производство регулируемых веществ', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'405': { name: 'Владение летальным оружием', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'406': { name: 'Растрата активов корпорации', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'408': { name: 'Убийство особого животного', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'409': { name: 'Грубая халатность', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'410': { name: 'Похищение должностного лица', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'411': { name: 'Антикорпоративный шпионаж', category: 4, minTime: 20, maxTime: 25, dismissal: true },
'500': { name: 'Мятеж', category: 5, dClass: true, dismissal: true },
'501': { name: 'Уничтожение тела', category: 5, dClass: true, dismissal: true },
'502': { name: 'Крупный саботаж', category: 5, dClass: true, dismissal: true },
'503': { name: 'Особая кража', category: 5, dClass: true, dismissal: true },
'504': { name: 'Владение вражеским снаряжением', category: 5, dClass: true, dismissal: true },
'505': { name: 'Распространение оружия', category: 5, dClass: true, dismissal: true },
'507': { name: 'Проникновение в защищённую стратегическую точку', category: 5, dClass: true, dismissal: true },
'510': { name: 'Похищение высокопоставленных лиц', category: 5, dClass: true, dismissal: true },
'511': { name: 'Разглашение секретной информации', category: 5, dClass: true, dismissal: true }
};
let currentLawCode = null;
function toggleCalculator(lawCode) {
const calculator = document.getElementById('ss14-calculator');
currentLawCode = lawCode;
if (calculator.style.display === 'none' || !calculator.classList.contains('active')) {
calculator.classList.add('active');
generateLawCheckboxes();
// Автоматически выбираем нажатый закон
const checkbox = document.getElementById('law-' + lawCode);
if (checkbox) {
checkbox.checked = true;
}
calculateSentence();
} else {
calculator.classList.remove('active');
}
}
function generateLawCheckboxes() {
const container = document.getElementById('law-checkboxes');
container.innerHTML = '';
// Группируем законы по категориям
const categories = {
1: { name: 'Лёгкие нарушения (1XX)', color: '#0F4F27' },
2: { name: 'Средние нарушения (2XX)', color: '#414700' },
3: { name: 'Тяжкие нарушения (3XX)', color: '#611300' },
4: { name: 'Особо тяжкие нарушения (4XX)', color: '#57000C' },
5: { name: 'Критические нарушения (5XX)', color: '#121212' }
};
for (let cat = 1; cat <= 5; cat++) {
const categoryDiv = document.createElement('div');
categoryDiv.style.marginBottom = '15px';
categoryDiv.innerHTML = `<h5 style="color: ${categories[cat].color}; margin-bottom: 8px;">${categories[cat].name}</h5>`;
const lawsInCategory = Object.entries(laws).filter(([code, law]) => law.category === cat);
lawsInCategory.forEach(([code, law]) => {
const label = document.createElement('label');
label.className = 'law-checkbox';
label.innerHTML = `<input type="checkbox" id="law-${code}" onchange="calculateSentence()"> ${code} - ${law.name}`;
categoryDiv.appendChild(label);
});
container.appendChild(categoryDiv);
}
}
function calculateSentence() {
const selectedLaws = [];
const checkboxes = document.querySelectorAll('[id^="law-"]:checked');
checkboxes.forEach(checkbox => {
const lawCode = checkbox.id.replace('law-', '');
selectedLaws.push(lawCode);
});
if (selectedLaws.length === 0) {
document.getElementById('calculation-result').style.display = 'none';
return;
}
const modifier = document.getElementById('modifier-select').value;
const isRepeat = document.getElementById('repeat-offense').checked;
const hasCooperation = document.getElementById('cooperation').checked;
const isDClass = document.getElementById('d-class').checked;
let result = calculatePunishment(selectedLaws, modifier, isRepeat, hasCooperation, isDClass);
displayResult(result, selectedLaws);
}
function calculatePunishment(selectedLaws, modifier, isRepeat, hasCooperation, isDClass) {
let totalTime = 0;
let punishmentType = 'Заключение под стражу';
let hasDismissal = false;
let hasDClass = false;
let categoryGroups = {};
// Группируем по категориям (одинаковые категории не складываются)
selectedLaws.forEach(lawCode => {
const law = laws[lawCode];
const categoryCode = lawCode.substring(1); // получаем последние 2 цифры (тип нарушения)
if (!categoryGroups[categoryCode] || law.category > laws[categoryGroups[categoryCode]].category) {
categoryGroups[categoryCode] = lawCode;
}
});
// Рассчитываем время для каждой группы
Object.values(categoryGroups).forEach(lawCode => {
const law = laws[lawCode];
if (law.dClass) {
hasDClass = true;
totalTime += 70; // для расчёта модификаторов
} else {
totalTime += law.maxTime; // берём максимальное время
}
if (law.dismissal) {
hasDismissal = true;
}
});
// Применяем модификаторы
switch (modifier) {
case 'M-CLEM':
// Помилование - только для категорий 3 и 4
const hasEligibleLaws = Object.values(categoryGroups).some(lawCode => {
const law = laws[lawCode];
return law.category === 3 || law.category === 4;
});
if (hasEligibleLaws) {
totalTime = Math.max(0, totalTime - 10);
}
break;
case 'M-SURR':
// Немедленная капитуляция
totalTime = Math.max(0, totalTime - 5);
break;
case 'M-DEFENSE':
case 'M-HELP':
// Самооборона или спасение - снимает все обвинения
totalTime = 0;
hasDClass = false;
punishmentType = 'Обвинения сняты (требуется обыск)';
break;
}
// Повторное нарушение
if (isRepeat && totalTime > 0) {
totalTime = Math.min(totalTime + 10, 50);
}
// Сотрудничество со следствием
if (hasCooperation && totalTime > 0) {
totalTime = Math.max(0, totalTime - 3);
}
// Определяем тип наказания
if (hasDClass) {
punishmentType = 'Перевод в Д-класс';
if (modifier === 'M-LOW' && isDClass) {
punishmentType = 'Условная ликвидация (M-LOW)';
} else if (modifier === 'M-VITAL' && isDClass) {
punishmentType = 'Взаимодействие с SCP (M-VITAL)';
}
} else if (totalTime >= 50) {
punishmentType = 'Перевод в Д-класс (срок ≥50 мин)';
if (totalTime >= 35 && isDClass) {
punishmentType += ' или добровольный перевод';
}
} else if (totalTime >= 35 && isDClass) {
punishmentType = 'Возможен добровольный перевод в Д-класс';
}
return {
totalTime: totalTime,
punishmentType: punishmentType,
hasDismissal: hasDismissal,
hasDClass: hasDClass,
categoryGroups: categoryGroups
};
}
function displayResult(result, selectedLaws) {
const resultDiv = document.getElementById('calculation-result');
let html = '<h4>📋 Результат расчёта:</h4>';
html += '<div><strong>Выбранные статьи:</strong><br>';
selectedLaws.forEach(lawCode => {
const law = laws[lawCode];
html += `• ${lawCode} - ${law.name}<br>`;
});
html += '</div><br>';
html += `<div class="punishment-type">Тип наказания: ${result.punishmentType}</div>`;
if (result.totalTime > 0 && !result.hasDClass) {
html += `<div class="time-result">Время заключения: ${result.totalTime} минут</div>`;
}
if (result.hasDismissal) {
html += '<div style="color: #f44336; margin-top: 10px;">⚠️ <strong>Обязательное увольнение с текущей должности</strong></div>';
}
// Дополнительная информация
html += '<div style="margin-top: 15px; font-size: 12px; color: #666;">';
html += '<strong>Примечания:</strong><br>';
html += '• Статьи одной категории (одинаковые последние 2 цифры) не складываются<br>';
html += '• Статьи разных категорий складываются<br>';
html += '• При сроке 50+ минут - обязательный перевод в Д-класс<br>';
html += '• При сроке 35+ минут класс Д может добровольно перейти в Д-класс';
html += '</div>';
resultDiv.innerHTML = html;
resultDiv.style.display = 'block';
}
// Инициализация при загрузке страницы
document.addEventListener('DOMContentLoaded', function() {
generateLawCheckboxes();
});
});