<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.deadspace14.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACalculators%2FLawCalculator.js</id>
	<title>MediaWiki:Calculators/LawCalculator.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.deadspace14.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACalculators%2FLawCalculator.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=MediaWiki:Calculators/LawCalculator.js&amp;action=history"/>
	<updated>2026-05-01T00:22:54Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=MediaWiki:Calculators/LawCalculator.js&amp;diff=22580&amp;oldid=prev</id>
		<title>PERed: Защитил страницу MediaWiki:Calculators/LawCalculator.js ([Редактирование=Разрешено только редакторам wiki] (бессрочно) [Переименование=Разрешено только редакторам wiki] (бессрочно))</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=MediaWiki:Calculators/LawCalculator.js&amp;diff=22580&amp;oldid=prev"/>
		<updated>2025-11-23T19:55:29Z</updated>

		<summary type="html">&lt;p&gt;Защитил страницу &lt;a href=&quot;/MediaWiki:Calculators/LawCalculator.js&quot; title=&quot;MediaWiki:Calculators/LawCalculator.js&quot;&gt;MediaWiki:Calculators/LawCalculator.js&lt;/a&gt; ([Редактирование=Разрешено только редакторам wiki] (бессрочно) [Переименование=Разрешено только редакторам wiki] (бессрочно))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 19:55, 23 ноября 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>PERed</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=MediaWiki:Calculators/LawCalculator.js&amp;diff=20370&amp;oldid=prev</id>
		<title>PERed: Новая страница: «    // Базовые сроки по статьям     const basePenalties = {       &#039;100&#039;:10,&#039;101&#039;:10,&#039;102&#039;:10,&#039;103&#039;:10,&#039;104&#039;:10,&#039;105&#039;:10,&#039;106&#039;:10,&#039;107&#039;:10,&#039;200&#039;:15,&#039;201&#039;:15,&#039;202&#039;:15,&#039;203&#039;:15,&#039;204&#039;:15, 	  &#039;205&#039;:15,&#039;206&#039;:15,&#039;207&#039;:15,&#039;300&#039;:25,&#039;301&#039;:25,&#039;302&#039;:25,&#039;303&#039;:25,&#039;304&#039;:25,&#039;305&#039;:25,&#039;306&#039;:25,&#039;307&#039;:25,&#039;400&#039;:40,&#039;401&#039;:40, 	  &#039;402&#039;:40,&#039;403&#039;:40,&#039;404&#039;:40,&#039;405&#039;:40,&#039;406&#039;:40,&#039;407&#039;:40,&#039;500&#039;:65,&#039;501&#039;:65,&#039;502&#039;:65,&#039;503&#039;:65,&#039;504&#039;:65,&#039;505&#039;:65,&#039;506&#039;:65, 	  &#039;507&#039;:65...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=MediaWiki:Calculators/LawCalculator.js&amp;diff=20370&amp;oldid=prev"/>
		<updated>2025-09-23T19:13:29Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «    // Базовые сроки по статьям     const basePenalties = {       &amp;#039;100&amp;#039;:10,&amp;#039;101&amp;#039;:10,&amp;#039;102&amp;#039;:10,&amp;#039;103&amp;#039;:10,&amp;#039;104&amp;#039;:10,&amp;#039;105&amp;#039;:10,&amp;#039;106&amp;#039;:10,&amp;#039;107&amp;#039;:10,&amp;#039;200&amp;#039;:15,&amp;#039;201&amp;#039;:15,&amp;#039;202&amp;#039;:15,&amp;#039;203&amp;#039;:15,&amp;#039;204&amp;#039;:15, 	  &amp;#039;205&amp;#039;:15,&amp;#039;206&amp;#039;:15,&amp;#039;207&amp;#039;:15,&amp;#039;300&amp;#039;:25,&amp;#039;301&amp;#039;:25,&amp;#039;302&amp;#039;:25,&amp;#039;303&amp;#039;:25,&amp;#039;304&amp;#039;:25,&amp;#039;305&amp;#039;:25,&amp;#039;306&amp;#039;:25,&amp;#039;307&amp;#039;:25,&amp;#039;400&amp;#039;:40,&amp;#039;401&amp;#039;:40, 	  &amp;#039;402&amp;#039;:40,&amp;#039;403&amp;#039;:40,&amp;#039;404&amp;#039;:40,&amp;#039;405&amp;#039;:40,&amp;#039;406&amp;#039;:40,&amp;#039;407&amp;#039;:40,&amp;#039;500&amp;#039;:65,&amp;#039;501&amp;#039;:65,&amp;#039;502&amp;#039;:65,&amp;#039;503&amp;#039;:65,&amp;#039;504&amp;#039;:65,&amp;#039;505&amp;#039;:65,&amp;#039;506&amp;#039;:65, 	  &amp;#039;507&amp;#039;:65...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;    // Базовые сроки по статьям&lt;br /&gt;
    const basePenalties = {&lt;br /&gt;
      &amp;#039;100&amp;#039;:10,&amp;#039;101&amp;#039;:10,&amp;#039;102&amp;#039;:10,&amp;#039;103&amp;#039;:10,&amp;#039;104&amp;#039;:10,&amp;#039;105&amp;#039;:10,&amp;#039;106&amp;#039;:10,&amp;#039;107&amp;#039;:10,&amp;#039;200&amp;#039;:15,&amp;#039;201&amp;#039;:15,&amp;#039;202&amp;#039;:15,&amp;#039;203&amp;#039;:15,&amp;#039;204&amp;#039;:15,&lt;br /&gt;
	  &amp;#039;205&amp;#039;:15,&amp;#039;206&amp;#039;:15,&amp;#039;207&amp;#039;:15,&amp;#039;300&amp;#039;:25,&amp;#039;301&amp;#039;:25,&amp;#039;302&amp;#039;:25,&amp;#039;303&amp;#039;:25,&amp;#039;304&amp;#039;:25,&amp;#039;305&amp;#039;:25,&amp;#039;306&amp;#039;:25,&amp;#039;307&amp;#039;:25,&amp;#039;400&amp;#039;:40,&amp;#039;401&amp;#039;:40,&lt;br /&gt;
	  &amp;#039;402&amp;#039;:40,&amp;#039;403&amp;#039;:40,&amp;#039;404&amp;#039;:40,&amp;#039;405&amp;#039;:40,&amp;#039;406&amp;#039;:40,&amp;#039;407&amp;#039;:40,&amp;#039;500&amp;#039;:65,&amp;#039;501&amp;#039;:65,&amp;#039;502&amp;#039;:65,&amp;#039;503&amp;#039;:65,&amp;#039;504&amp;#039;:65,&amp;#039;505&amp;#039;:65,&amp;#039;506&amp;#039;:65,&lt;br /&gt;
	  &amp;#039;507&amp;#039;:65&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Модификаторы&lt;br /&gt;
    const modifiers = {&lt;br /&gt;
      &amp;#039;Крайняя необходимость&amp;#039;: 0,&lt;br /&gt;
      &amp;#039;Явка с повинной&amp;#039;: 0.5,&lt;br /&gt;
      &amp;#039;Сделка со следствием&amp;#039;: 0.5,&lt;br /&gt;
      &amp;#039;Отсутствие умысла&amp;#039;: 1,&lt;br /&gt;
      &amp;#039;Помеха следствию&amp;#039;: 1.5,&lt;br /&gt;
      &amp;#039;Должностное преступление&amp;#039;: 1.5,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function calculate() {&lt;br /&gt;
      const selectedArticles = Array.from(&lt;br /&gt;
        document.querySelectorAll(&amp;#039;input[name=&amp;quot;article&amp;quot;]:checked&amp;#039;)&lt;br /&gt;
      ).map(cb =&amp;gt; cb.value);&lt;br /&gt;
&lt;br /&gt;
      const selectedModifiers = Array.from(&lt;br /&gt;
        document.querySelectorAll(&amp;#039;input[name=&amp;quot;modifier&amp;quot;]:checked&amp;#039;)&lt;br /&gt;
      ).map(cb =&amp;gt; cb.value);&lt;br /&gt;
	  &lt;br /&gt;
&lt;br /&gt;
	// Проверка на наличие статей 5xx (пожизненных)&lt;br /&gt;
	const hasLifeSentenceArticles = selectedArticles.some(code =&amp;gt; code.startsWith(&amp;#039;5&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
	// Проверка на наличие модификаторов, отменяющих пожизненное&lt;br /&gt;
	const hasNoIntent = selectedModifiers.includes(&amp;#039;Отсутствие умысла&amp;#039;);&lt;br /&gt;
	const hasExtremeNecessity = selectedModifiers.includes(&amp;#039;Крайняя необходимость&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// Если выбрано &amp;quot;Крайняя необходимость&amp;quot; — сразу отмена наказания, независимо от статей&lt;br /&gt;
	if (hasExtremeNecessity) {&lt;br /&gt;
	  document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &amp;quot;✅ &amp;lt;b&amp;gt;Заключение отменено (обвинения сняты: Крайняя необходимость)&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
	  return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
// Если есть статьи 5xx и НЕТ &amp;quot;Отсутствия умысла&amp;quot; → пожизненное (т.к. &amp;quot;Крайняя необходимость&amp;quot; уже исключена выше)&lt;br /&gt;
if (hasLifeSentenceArticles &amp;amp;&amp;amp; !hasNoIntent) {&lt;br /&gt;
  document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &amp;quot;📌 &amp;lt;b&amp;gt;Пожизненное заключение&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
  return; // Прекращаем дальнейший расчёт&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      if (selectedArticles.length === 0) {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          &amp;quot;⚠️ Выберите хотя бы одну статью.&amp;quot;;&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Группировка по категориям (третья цифра кода)&lt;br /&gt;
      const categories = {};&lt;br /&gt;
      selectedArticles.forEach(code =&amp;gt; {&lt;br /&gt;
        const category = code[2];&lt;br /&gt;
        if (!categories[category]) categories[category] = [];&lt;br /&gt;
        categories[category].push(code);&lt;br /&gt;
      });&lt;br /&gt;
	  console.log(&amp;quot;Категории: &amp;quot;, categories);&lt;br /&gt;
&lt;br /&gt;
      // Из каждой категории выбираем самую тяжкую статью&lt;br /&gt;
      let mainArticles = [];&lt;br /&gt;
      for (const cat in categories) {&lt;br /&gt;
        const heaviest = categories[cat].reduce((a, b) =&amp;gt; &lt;br /&gt;
          basePenalties[a] &amp;gt; basePenalties[b] ? a : b&lt;br /&gt;
        );&lt;br /&gt;
        mainArticles.push(heaviest);&lt;br /&gt;
      }&lt;br /&gt;
	  console.log(&amp;quot;Самые тяжелые статьи в категориях: &amp;quot;, mainArticles);&lt;br /&gt;
&lt;br /&gt;
      // Определяем самую тяжкую из всех&lt;br /&gt;
      const mainArticle = mainArticles.reduce((a, b) =&amp;gt; &lt;br /&gt;
        basePenalties[a] &amp;gt; basePenalties[b] ? a : b&lt;br /&gt;
	  );&lt;br /&gt;
	  console.log(&amp;quot;Самая тежелая статья: &amp;quot;, mainArticle);&lt;br /&gt;
&lt;br /&gt;
	let effectiveMainPenalty = basePenalties[mainArticle];&lt;br /&gt;
&lt;br /&gt;
	if (hasNoIntent) {&lt;br /&gt;
	  // Применяем понижение ко ВСЕМ основным статьям из категорий&lt;br /&gt;
	  const loweredArticles = mainArticles.map(code =&amp;gt; {&lt;br /&gt;
		const category = parseInt(code[0]);&lt;br /&gt;
		if (category &amp;lt;= 1) {&lt;br /&gt;
		  // Статьи 1xx и ниже — снимаются (возвращаем null или флаг снятия)&lt;br /&gt;
		  return null; // обозначаем, что статья аннулирована&lt;br /&gt;
		} else {&lt;br /&gt;
		  // Понижаем категорию на 1: 201 → 101, 305 → 205 и т.д.&lt;br /&gt;
		  const lowerCategory = category - 1;&lt;br /&gt;
		  const loweredCode = lowerCategory + code.slice(1);&lt;br /&gt;
		  return loweredCode;&lt;br /&gt;
		}&lt;br /&gt;
	  }).filter(code =&amp;gt; code !== null); // Убираем аннулированные статьи&lt;br /&gt;
&lt;br /&gt;
	  // Если после понижения не осталось ни одной статьи — наказание снимается&lt;br /&gt;
	  if (loweredArticles.length === 0) {&lt;br /&gt;
		effectiveMainPenalty = 0;&lt;br /&gt;
	  } else {&lt;br /&gt;
		// Находим самую тяжкую из пониженных статей&lt;br /&gt;
		const newMainArticle = loweredArticles.reduce((a, b) =&amp;gt; &lt;br /&gt;
		  basePenalties[a] &amp;gt; basePenalties[b] ? a : b&lt;br /&gt;
		);&lt;br /&gt;
		effectiveMainPenalty = basePenalties[newMainArticle];&lt;br /&gt;
	  }&lt;br /&gt;
	} else {&lt;br /&gt;
	  // Без модификатора — обычный срок&lt;br /&gt;
	  effectiveMainPenalty = basePenalties[mainArticle];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      // Основной штраф — с учётом модификаторов (например, понижения по &amp;quot;отсутствию умысла&amp;quot;)&lt;br /&gt;
      const mainPenalty = effectiveMainPenalty;&lt;br /&gt;
&lt;br /&gt;
      // Максимальная добавка — 50% от ОСНОВНОГО штрафа (уже модифицированного)&lt;br /&gt;
      const maxAdditional = mainPenalty * 0.5;&lt;br /&gt;
      let additional = 0;&lt;br /&gt;
&lt;br /&gt;
      // Определяем, какие статьи использовать для добавки — оригинальные или пониженные&lt;br /&gt;
      let articlesForAdditional = mainArticles.filter(code =&amp;gt; code !== mainArticle);&lt;br /&gt;
&lt;br /&gt;
      // Если применён &amp;quot;Отсутствие умысла&amp;quot;, нужно использовать ПОНИЖЕННЫЕ версии статей&lt;br /&gt;
      if (hasNoIntent) {&lt;br /&gt;
        articlesForAdditional = articlesForAdditional&lt;br /&gt;
          .map(code =&amp;gt; {&lt;br /&gt;
            const category = parseInt(code[0]);&lt;br /&gt;
            if (category &amp;lt;= 1) return null; // снимается&lt;br /&gt;
            return (category - 1) + code.slice(1); // понижаем&lt;br /&gt;
          })&lt;br /&gt;
          .filter(code =&amp;gt; code !== null &amp;amp;&amp;amp; basePenalties[code] !== undefined); // оставляем только валидные&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Рассчитываем добавку&lt;br /&gt;
      articlesForAdditional.forEach(code =&amp;gt; {&lt;br /&gt;
        const penalty = basePenalties[code];&lt;br /&gt;
        if (additional + penalty &amp;lt;= maxAdditional) {&lt;br /&gt;
          additional += penalty;&lt;br /&gt;
        } else if (additional &amp;lt; maxAdditional) {&lt;br /&gt;
          additional = maxAdditional; // Доводим до лимита&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      let total = mainPenalty + additional;&lt;br /&gt;
&lt;br /&gt;
      // Применяем модификаторы: один положительный, один отрицательный&lt;br /&gt;
      let posMod = 1, negMod = 1;&lt;br /&gt;
      selectedModifiers.forEach(mod =&amp;gt; {&lt;br /&gt;
        const value = modifiers[mod];&lt;br /&gt;
		// Послабления — это значения МЕНЬШЕ или РАВНЫ 1 (но не 1.5)&lt;br /&gt;
		  if (value &amp;lt;= 1) {&lt;br /&gt;
			posMod = value; // перезаписываем, т.к. в группе только один выбор&lt;br /&gt;
		  }&lt;br /&gt;
		  &lt;br /&gt;
		  // Ухудшения — это значения БОЛЬШЕ 1&lt;br /&gt;
		  if (value &amp;gt; 1) {&lt;br /&gt;
			negMod = value; // тоже только один может быть выбран&lt;br /&gt;
		  }&lt;br /&gt;
		});&lt;br /&gt;
	  console.log(&amp;quot;Срок и модификаторы: &amp;quot;, total, posMod, negMod);&lt;br /&gt;
      total *= posMod * negMod;&lt;br /&gt;
&lt;br /&gt;
	// Считываем количество рецидивов&lt;br /&gt;
	const recidivismInput = document.getElementById(&amp;#039;recidivismCount&amp;#039;);&lt;br /&gt;
	const recidivismCount = parseInt(recidivismInput.value) || 0; // на случай, если не число&lt;br /&gt;
&lt;br /&gt;
	// Добавляем 5 минут за каждый рецидив&lt;br /&gt;
	total += recidivismCount * 5;&lt;br /&gt;
&lt;br /&gt;
	console.log(&amp;quot;С учётом рецидивов: &amp;quot;, total);&lt;br /&gt;
&lt;br /&gt;
      // Проверка на пожизненное&lt;br /&gt;
      if (total &amp;gt;= 65) {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          &amp;quot;📌 &amp;lt;b&amp;gt;Пожизненное заключение&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
      } else if (total &amp;lt;= 0) {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          &amp;quot;✅ &amp;lt;b&amp;gt;Заключение отменено(обвинения сняты согласно модификаторам)&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
      } else if (total &amp;lt;= 10) {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          `⏱️ &amp;lt;b&amp;gt;Срок: ${total} минут или предупреждение&amp;lt;/b&amp;gt;`;&lt;br /&gt;
	  } else if (total &amp;gt;=40 &amp;amp;&amp;amp; total &amp;lt; 65) {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          `⏱️ &amp;lt;b&amp;gt;Срок: ${total} минут с отбыванием в пермабриге&amp;lt;/b&amp;gt;`;&lt;br /&gt;
	  } else {&lt;br /&gt;
        document.getElementById(&amp;#039;result&amp;#039;).innerHTML = &lt;br /&gt;
          `⏱️ &amp;lt;b&amp;gt;Срок: ${total} минут&amp;lt;/b&amp;gt;`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>PERed</name></author>
	</entry>
</feed>