Добро пожаловать на форумную ролевую игру по мотивам книг Фрэнка Герберта "Дюна"! События нашего сюжета происходят в альтернативной вселенной, где Пол Атрейдес так и не родился — вместо этого, повинуясь приказам Бене Гессерит, леди Джессика родила дочь, и это событие запустило цепочку событий, изменивших всё.

пост от Piter de Vries: Instead of answering, Piter gave the young man a long, empty look, then smirked.
“This is why I did not want to concern you with the details, Na-Baron. There are certain things in life that only come with time and personal experience. If you had ever…”
Piter stopped himself, then looked down at the oozing piece of meat on his table. An interesting thought came to him. He took a moment more to ponder it.

Отключить мобильный стиль
Шрифт в постах
    Черновики
    Трекер эпизодов

    DUNE: GREAT CONVENTION

    Информация о пользователе

    Привет, Гость! Войдите или зарегистрируйтесь.


    Вы здесь » DUNE: GREAT CONVENTION » Assassin’s Handbook » Хронология


    Хронология

    Сообщений 1 страница 2 из 2

    1

    [hideprofile]

    Код:
    <!--HTML-->
    <div class="chronicle-app-events">
      <div class="chronicle-header-events">
        <div class="chronicle-main-title-events">ХРОНОЛОГИЯ СОБЫТИЙ</div>
        <div class="chronicle-subtitle-events">Ключевые события , косвенно и прямо относящиеся к сюжету. Важно учитывать, что хронология содержит не только "официальные версии", но и истинные причины некоторых событий, которые могут быть не известны широкой общественности. Если сомневаетесь в степени осведомлённости вашего персонажа, обращайтесь к администрации.</div>
      </div>
      <div class="chronicle-controls-events">
        <div class="chronicle-filter-events">
          <label for="yearFilterEvents">Год:</label>
          <select id="yearFilterEvents" class="chronicle-select-events">
            <option value="all">Не выбрано</option>
          </select>
        </div>
        <button id="sortBtnEvents" class="chronicle-btn-events">↓ Сначала новые</button>
        <button id="resetFiltersEvents" class="chronicle-btn-events">Сбросить</button>
      </div>
      <div id="chronicleContainerEvents"></div>
    </div>
    
    <style>
      .chronicle-app-events {
        background-image: url('https://upforme.ru/uploads/001c/9f/bb/7/306630.jpg');
        background-size: cover;
        background-position: center;
        width: 100%;
        max-height: 830px;
        margin: -15px auto;
        padding: 100px 50px 35px 50px;
        box-sizing: border-box;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        color: var(--text1);
      }
      .chronicle-header-events {
        flex-shrink: 0;
        margin-bottom: 20px;
        text-align: center;
      }
      .chronicle-main-title-events {
        font-size: 22px;
        font-weight: bold;
        color: var(--text4);
        text-transform: uppercase;
        letter-spacing: 3px;
        text-shadow: 0px 0px 6px rgba(0, 0, 0, 1);
        margin-bottom: 8px;
      }
      .chronicle-subtitle-events {
        font-size: 12px;
        color: var(--text3, #bbb);
        max-width: 80%;
        margin: 0 auto;
        line-height: 1.5;
        font-style: italic;
        text-shadow: 0px 0px 6px rgba(0, 0, 0, 1);
      }
      .chronicle-controls-events {
        display: flex;
        flex-wrap: wrap;
        gap: 15px;
        margin-bottom: 20px;
        align-items: flex-end;
        background: transparent;
        padding: 0;
      }
      .chronicle-filter-events {
        display: flex;
        flex-direction: column;
        gap: 5px;
      }
      .chronicle-controls-events label {
        font-size: 11px;
        font-weight: bold;
        color: var(--text4);
        text-transform: uppercase;
      }
      .chronicle-select-events {
        padding: 6px 10px !important;
        color: #aba8a6 !important;
        background: #211c18 !important;
        border: none !important;
        border-radius: 10px;
        font: 400 11px var(--font), arial !important;
        box-sizing: border-box;
        max-width: 100%;
      }
      .chronicle-select-events option {
        background: #1a1612;
        color: #b9ae95;
      }
      .chronicle-btn-events {
        background: rgba(18, 16, 14, .85);
        backdrop-filter: blur(30px);
        -webkit-backdrop-filter: blur(30px);
        border: 1px solid var(--accent);
        border-radius: 20px;
        color: #aba8a6;
        padding: 8px 20px;
        cursor: pointer;
        font-weight: bold;
        text-transform: uppercase;
        font-size: 11px;
        transition: transform 0.2s, box-shadow 0.2s;
        margin-left: auto;
      }
      .chronicle-btn-events:hover {
        transform: translateY(-2px);
      }
      #chronicleContainerEvents {
        flex: 1;
        overflow-y: auto;
        padding-right: 5px;
        min-height: 0;
      }
      .chronicle-timeline-events {
        max-width: 100%;
        font-family: inherit;
        font-size: 10px;
      }
      .chronicle-year-divider-events {
        display: flex;
        align-items: center;
        justify-content: center;
        margin: 12px 0 8px;
        color: var(--text4, #d4c9a8);
        font-weight: bold;
        font-size: 14px;
        text-transform: uppercase;
        letter-spacing: 2px;
        text-shadow: 0 1px 3px rgba(0,0,0,0.3);
      }
      .chronicle-year-divider-events::before,
      .chronicle-year-divider-events::after {
        content: "";
        flex: 1;
        height: 1px;
        background: linear-gradient(to right, transparent, var(--text2), transparent);
        margin: 0 15px;
      }
      .chronicle-year-divider-events::before {
        background: linear-gradient(to left, transparent, var(--text2), transparent);
      }
      .chronicle-event-events {
        display: flex;
        flex-wrap: wrap;
        margin-top: 3px;
        padding: 8px 12px;
        border: 0px solid #393028;
        border-radius: 8px;
        background: rgba(18, 16, 14, 0.4);
        backdrop-filter: blur(20px);
        -webkit-backdrop-filter: blur(20px);
      }
      .chronicle-event-events .chronicle-date-events {
        flex: 0 0 120px;
        font-weight: bold;
        font-size: 12px;
        color: var(--accent);
      }
      .chronicle-event-events .chronicle-event-desc-events {
        flex: 1;
        font-size: 12px;
        color: #aba8a6;
        line-height: 1.5;
      }
    
      .chronicle-event-events .chronicle-event-desc-events a {
        color: var(--accent) !important;
        text-decoration: none !important;
        font-size: 16px;
    }
    
      .chronicle-loading-events {
        text-align: center;
        padding: 40px;
        color: var(--text3);
      }
    
      @media (max-width: 720px) {
        .chronicle-app-events {
          padding: 50px 20px;
        }
        .chronicle-controls-events {
          flex-direction: column;
          align-items: stretch;
        }
        .chronicle-btn-events {
          margin-left: 0;
        }
        .chronicle-year-divider-events {
          font-size: 12px;
        }
        .chronicle-year-divider-events::before,
        .chronicle-year-divider-events::after {
          margin: 0 8px;
        }
        .chronicle-main-title-events {
          font-size: 18px;
        }
        .chronicle-subtitle-events {
          font-size: 11px;
          max-width: 100%;
        }
        .chronicle-select-events {
          min-width: 100%;
        }
        .chronicle-stats-events {
          margin-left: 0;
          justify-content: center;
        }
        .chronicle-event-events .chronicle-date-events {
          flex: 0 0 80px;
        }
      }
    </style>
    
    <script>
    (function() {
      function init() {
        var container = document.getElementById('chronicleContainerEvents');
        if (!container) return setTimeout(init, 50);
    
        var rawData = [
          {
            date: "ХХ.ХХ.10111",
            description: "После дома Ричез управление Арракисом получает дом Харконнен.",
            year: "10111"
          },
          {
            date: "ХХ.ХХ.10146",
            description: "Смерть барона Дмитрия Харконнена. Новым бароном становится его сын, Владимир Харконнен. Управление Арракисом переходит к Абулурду Харконнену.",
            year: "10146"
          },
          {
            date: "ХХ.ХХ.10153",
            description: "Управление Арракисом переходит к Владимиру Харконнену.",
            year: "10153"
          },
          {
            date: "ХХ.ХХ.10154",
            description: "При содействии императора Элруда IX Бене Тлейлакс берут под контроль Икс. Старт проекта Амал.",
            year: "10154"
          },
          {
            date: "ХХ.ХХ.10154",
            description: "Старый Герцог Пауль Атрейдес погибает во время боя с салусским быком. Герцогом становится Лето Атрейдес.",
            year: "10154"
          },
          {
            date: "ХХ.ХХ.10156",
            description: "Смерть Элруда IX. Его сын, Шаддам IV Коррино, восходит на Престол Золотого льва.",
            year: "10156"
          },
          {
            date: "ХХ.ХХ.10166",
            description: "Война Ассасинов между домами Эказ и Моритани.<a title='Оба дома пережили войну Ассасинов, дом Моритани не был истреблён'>*</a>",
            year: "10166"
          },
          {
            date: "ХХ.ХХ.10175",
            description: "Неудачная попытка испытаний прототипа синтетического спайса на Короне и Зановаре, которая обернулась эпидемией среди местного населения. Чтобы скрыть следы, и планета, принадлежавшая Талигари, и спутник Ричез, были сначала изолированы, а позже — уничтожены. Официальная версия скрывает факт испытаний на людях и настоящей причине эпидемии, и говорит только о том, что болезнь распространялась слишком быстро, и лекарство было невозможно изобрести. <a title='События Великой Спайсовой Войны не учитываются; больше подробностей в теме «Политика и Общество → Великие Дома»'>*</a>",
            year: "10175"
          },
          {
            date: "ХХ.ХХ.10175",
            description: "Дом Атрейдес освобождает Икс из-под контроля Тлейлаксу. Дом Верниус номинально восстановлен в правах. Фактически — власть сохраняется за Альянсом технократов.",
            year: "10175"
          },
          {
            date: "ХХ.ХХ.10175",
            description: "Группой ассасинов, замаскированных под жонглёров, организовывается покушение на Падишах-Императора Шаддама IV. Заговорщики, в числе которых Тирос Реффа — бастард покойного Императора Элруда Коррино, — схвачены и казнены.",
            year: "10175"
          },
          {
            date: "ХХ.ХХ.10178",
            description: "Бене Тлейлакс обнаруживают скрытый потенциал в генах Тироса Реффы и запускают проект по созданию гхолы из его останков.",
            year: "10178"
          },
          {
            date: "ХХ.ХХ.10178",
            description: "Управление Арракисом переходит к Глоссу Раббану.",
            year: "10178"
          },
          {
            date: "ХХ.ХХ.10187",
            description: "Основание подпольной лаборатории Тлейлаксу на Арракисе — в Карфаге.",
            year: "10187"
          },
          {
            date: "ХХ.ХХ.10190",
            description: "Индустрия лунной рыбы на Каладане несёт большие убытки вследствие биологической атаки: в пруды были запущены паразиты, повлекшие за собой массовую гибель рыбы. Расследование Атрейдесов установило, что заказчиком атаки был Глоссу Раббан.",
            year: "10190"
          },
          {
            date: "ХХ.02.10191",
            description: "Управление Арракисом получает дом Атрейдес (с сохранением Каладана в качестве сиридар-феода) <a title='В нашей версии событий, Арракис не предлагался Атрейдесам как постоянное владение, герцог Лето получал его как квази-феод, с сохранением Каладана'>*</a>.",
            year: "10191"
          },
          {
            date: "ХХ.04.10191",
            description: "<b>Битва за Арракин</b>: благодаря вмешательству леди Джессики, личность предателя в рядах Атрейдесов удаётся раскрыть. Атрейдесы отражают атаку Харконненов и сардаукаров на Арракин. Начинается война между домами Атрейдес и Харконнен",
            year: "10191"
          },
          {
            date: "ХХ.10.10191",
            description: "Уничтожение <b>«Виндсак»</b> — крупнейшего перерабатывающего завода, где производилась приблизительно треть от всего экспорта меланжа. Несколько месяцев стратегически важный объект, располагавшийся на территории селения пейонов, переходил из рук в руки, и когда Харконнены в очередной раз попытались отбить завод, Атрейдесы приняли решение его уничтожить, обставив всё так, будто ответственность за это несут войска Харконненов.",
            year: "10191"
          },
          {
            date: "ХХ.11.10192",
            description: "На заседании Ландсраада поднимается вопрос о том, что военные действия на Арракисе зашли слишком далеко, и угрожают поставкам меланжа для всего Империума. Решением Императора объявляется <b>Война Ассасинов</b> между домами Харконнен и Атрейдес, подразумевающая наемные убийства, саботаж и локальные стычки вместо полномасштабной войны.",
            year: "10192"
          },
          {
            date: "ХХ.07.10193",
            description: "Граф Фенринг узнаёт о деятельности Тлейлаксу на Арракисе и их подземном лабораторном комплексе под Карфагом. Император приказывает уничтожить город.",
            year: "10193"
          },
          {
            date: "ХХ.04.10194",
            description: "Агенты Фенринга выходят на связь и подкупают титулами талантливого инженера Остена Лайета, который подсказывает, куда стоит заложить взрывчатку, чтобы сравнять с землёй Карфаг и всё, что находится под ним.",
            year: "10194"
          },
          {
            date: "ХХ.06.10194",
            description: "<b>Уничтожение Карфага</b> — столицы и основной базы операций Харконненов на Арракисе. Точные причины катастрофы общественности неизвестны, объявляется расследование. Третье поколение и почти всё четвёртое поколение гхол Тироса Реффы уничтожено, единственный уцелевший подопытный сбегает.",
            year: "10194"
          },
          {
            date: "ХХ.07.10194",
            description: "Харконнены строят космопорт близ деревни Харко и, решив не останавливаться на этом, начинают строительство <b>Нео-Карфага</b>.",
            year: "10194"
          },
          {
            date: "ХХ.02.10195",
            description: "Завершение расследования катастрофы, произошедшей в Карфаге. Официальной версией признаётся трагическая случайность: контакт щита Хольцмана с лазером.",
            year: "10195"
          },
          {
            date: "ХХ.06.10195",
            description: "Сбежавший из Карфага гхола четвёртого поколения выходит на контакт с фременами и берёт имя Алнаим",
            year: "10195"
          },
          {
            date: "ХХ.08.10195",
            description: "Используя вызванные войной перебои в поставках меланжа как предлог, Император принимает решение уничтожить фременов и объявляет <b>Сардаукарский погром</b>. Огромные силы сардаукаров переброшены на Арракис и квартируют в Арсунте.",
            year: "10195"
          },
          {
            date: "ХХ.09.10195",
            description: "Первые атаки против фременов оборачиваются тяжёлыми потерями для имперских войск, и сардаукары меняют тактику: они распыляют нервно-паралитический газ через системы жизнеобеспечения ситчей и зачищают выживших после того, как ядовитый туман рассеется. Постепенно ситчи на севере Арракиса начинают пустеть: большинство выживших фременов покидают свои убежища, спасаясь от геноцида на юге планеты. Император объявляет о полном истреблении фременов.",
            year: "10195"
          },
          {
            date: "ХХ.11.10195",
            description: "Небольшая группа Федайкинов остаётся в части опустевших ситчей и организовывает подпольное сопротивление Императору, включающее «раззии» (внезапные атаки/рейды) с кражами, диверсиями и убийствами. Лидером этого сопротивления становится <b>Зантара</b>, также известный по прозвищу «Лев Пустыни».",
            year: "10195"
          },
          {
            date: "ХХ.01.10196",
            description: "Рейды Зантары растут в масштабе и интенсивности. Завладев атомным оружием одного из изгнанных Домов, Зантара наносит <b>удар по Барьерной стене</b> — горному перевалу, защищающему север Арракиса от доступа песчаных червей. Шаи-Хулуды проникают в Имперскую котловину и котловину Хагга, ещё сильнее затрудняя добычу спайса в этих регионах. За голову «последнего фремена» назначается награда в миллион солари.",
            year: "10196"
          },
          {
            date: "ХХ.02.10196",
            description: "Среди мигрировавших на юг фременов крепнут слухи, что чужеземец Алнаим — Махди, мессия, чьего прихода они так давно ждали.",
            year: "10196"
          },
          {
            date: "ХХ.06.10198",
            description: "Попытка завершить Войну Ассасинов дипломатическим путём. При посредничестве Бене Гессерит, объявляется помолвка наследников домов Атрейдес и Харконнен. Подписывается соглашение о временном перемирии. Знакомство жениха и невесты заканчивается скандалом, помолвка оказывается сорвана, война возобновляется.",
            year: "10198"
          },
          {
            date: "ХХ.08.10198",
            description: "Алнаим пропадает на севере планеты. Стилгар и наибы племён отправляют Зантару на его поиски.",
            year: "10198"
          },
          {
            date: "ХХ.02.10199",
            description: "Крушение кораблей Атрейдесов «Китерия», «Дельфы» и «Эйфория» в котловине Хагга, перевозивших, в числе прочего, контрабандный груз с Икса. В Арракине происходит серия смертей, вызванных «плохим спайсом». Обе стороны конфликта начинают собственные независимые расследования.",
            year: "10199"
          },
          {
            date: "ХХ.03.10199",
            description: "Близ недостроенного Нео-Карфага открывается подпольная арена для гладиаторских боёв.",
            year: "10199"
          },
          {
            date: "ХХ.06.10199",
            description: "На Арракисе происходит серия убийств агентов Хасимира Фенринга.",
            year: "10199"
          },
          {
            date: "ХХ.07.10199",
            description: "В заброшенном лабораторном комплексе Бене Тлейлакс под Старым Карфагом убит Зантара.",
            year: "10199"
          },
          {
            date: "ХХ.07.10199",
            description: "Среди бойцов гладиаторской арены Нео-Карфага появляется анонимный гладиатор, быстро завоёвывающий славу непобедимого противника. Через некоторое время становится известно, что под прозвищем «Танцора Вуалей» скрывался на-барон Фейд-Раута Харконнен.",
            year: "10199"
          }
        ];
    
        var allEvents = rawData;
        var filteredEvents = [];
        var sortOrder = 'desc';
    
        var yearFilter = document.getElementById('yearFilterEvents');
        var sortBtn = document.getElementById('sortBtnEvents');
        var resetBtn = document.getElementById('resetFiltersEvents');
    
        var yearsSet = new Set();
        allEvents.forEach(function(ev) {
          yearsSet.add(ev.year);
        });
    
        while (yearFilter.options.length > 1) yearFilter.remove(1);
        Array.from(yearsSet).sort(function(a, b) { return b - a; }).forEach(function(year) {
          var option = document.createElement('option');
          option.value = year;
          option.textContent = year;
          yearFilter.appendChild(option);
        });
    
        function parseDateForSort(dateStr) {
          var parts = dateStr.split('.');
          if (parts.length !== 3) return 0;
          var day = parts[0] === 'ХХ' ? 0 : parseInt(parts[0], 10);
          var month = parseInt(parts[1], 10);
          var year = parseInt(parts[2], 10);
          return year * 10000 + month * 100 + (isNaN(day) ? 0 : day);
        }
    
        function updateSortButton() {
          if (sortBtn) {
            if (sortOrder === 'desc') {
              sortBtn.textContent = '↑ Сначала старые';
            } else {
              sortBtn.textContent = '↓ Сначала новые';
            }
          }
        }
    
        function applyFilters() {
          var selectedYear = yearFilter.value;
    
          filteredEvents = allEvents.filter(function(ev) {
            if (selectedYear !== 'all' && ev.year !== selectedYear) return false;
            return true;
          });
    
          filteredEvents.sort(function(a, b) {
            return parseDateForSort(a.date) - parseDateForSort(b.date);
          });
    
          renderTimeline();
        }
    
        function renderTimeline() {
          var $innerContent = $(container).find('.chronicle-timeline-events');
    
          if (filteredEvents.length === 0) {
            if ($innerContent.length) {
              $innerContent.fadeOut(200, function() {
                container.innerHTML = '<div class="chronicle-loading-events">Нет событий, соответствующих фильтрам.</div>';
                $(container).find('.chronicle-loading-events').hide().fadeIn(200);
              });
            } else {
              container.innerHTML = '<div class="chronicle-loading-events">Нет событий, соответствующих фильтрам.</div>';
              $(container).find('.chronicle-loading-events').hide().fadeIn(200);
            }
            return;
          }
    
          var grouped = {};
          filteredEvents.forEach(function(ev) {
            if (!grouped[ev.year]) grouped[ev.year] = [];
            grouped[ev.year].push(ev);
          });
    
          var years = Object.keys(grouped).sort(function(a, b) {
            if (sortOrder === 'desc') return b - a;
            return a - b;
          });
    
          var html = '<div class="chronicle-timeline-events">';
    
          years.forEach(function(year) {
            html += '<div class="chronicle-year-divider-events">' + year + ' AG</div>';
            grouped[year].forEach(function(ev) {
              html += '<div class="chronicle-event-events">';
              html += '<div class="chronicle-date-events">' + ev.date + '</div>';
              html += '<div class="chronicle-event-desc-events">' + (ev.description || '') + '</div>';
              html += '</div>';
            });
          });
    
          html += '</div>';
    
          if ($innerContent.length) {
            $innerContent.fadeOut(200, function() {
              $innerContent.remove();
              $(html).hide().appendTo(container).fadeIn(200);
            });
          } else {
            $(html).hide().appendTo(container).fadeIn(200);
          }
        }
    
        yearFilter.addEventListener('change', applyFilters);
    
        if (sortBtn) {
          sortBtn.addEventListener('click', function() {
            sortOrder = (sortOrder === 'desc') ? 'asc' : 'desc';
            updateSortButton();
            applyFilters();
          });
          updateSortButton();
        }
    
        resetBtn.addEventListener('click', function() {
          yearFilter.value = 'all';
          sortOrder = 'desc';
          if (sortBtn) updateSortButton();
          applyFilters();
        });
    
        applyFilters();
      }
    
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
      } else {
        init();
      }
      setTimeout(init, 200);
    })();
    </script>

    +2

    2

    [hideprofile]

    Код:
    <!--HTML-->
    <div class="chronicle-app-episodes">
      <div class="chronicle-header-episodes">
        <div class="chronicle-main-title-episodes">ХРОНОЛОГИЯ ЭПИЗОДОВ</div>
        <div class="chronicle-subtitle-episodes">Здесь перечислены эпизоды, которые играются на форуме.<br>Хронология ведётся администрацией и регулярно обновляется.</div>
      </div>
      <div class="chronicle-controls-episodes">
        <div class="chronicle-filter-episodes">
          <label for="yearFilterEpisodes">Год:</label>
          <select id="yearFilterEpisodes" class="chronicle-select-episodes">
            <option value="all">Не выбрано</option>
          </select>
        </div>
        <div class="chronicle-filter-episodes">
          <label for="participantFilterEpisodes">Участник:</label>
          <select id="participantFilterEpisodes" class="chronicle-select-episodes">
            <option value="all">Не выбрано</option>
          </select>
        </div>
        <div class="chronicle-filter-episodes">
          <label for="statusFilterEpisodes">Статус:</label>
          <select id="statusFilterEpisodes" class="chronicle-select-episodes">
            <option value="all">Не выбрано</option>
            <option value="активный">Активный</option>
            <option value="завершённый">Завершённый</option>
            <option value="незаконченный">Незаконченный</option>
          </select>
        </div>
        <button id="resetFiltersEpisodes" class="chronicle-btn-episodes">Сбросить</button>
        <div class="chronicle-stats-episodes">
          <span class="stats-badge-episodes">эпизодов: <b id="episodeCountEpisodes">0</b></span>
        </div>
      </div>
      <div id="chronicleContainerEpisodes"></div>
    </div>
    
    <style>
      .chronicle-app-episodes {
        background-image: url('https://i.ibb.co/WRzrLDB/image.jpg');
        background-size: cover;
        background-position: center;
        width: 100%;
        margin: -15px auto;
        padding: 100px 50px 35px 50px;
        box-sizing: border-box;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        color: var(--text1);
        max-height: none; 
        overflow-y: visible;
      }
      .chronicle-header-episodes {
        flex-shrink: 0;
        margin-bottom: 20px;
        text-align: center;
      }
      .chronicle-main-title-episodes {
        font-size: 22px;
        font-weight: bold;
        color: var(--text4);
        text-transform: uppercase;
        letter-spacing: 3px;
        text-shadow: 0px 0px 6px rgba(0, 0, 0, 1);
        margin-bottom: 8px;
      }
      .chronicle-subtitle-episodes {
        font-size: 12px;
        color: var(--text3, #bbb);
        max-width: 80%;
        margin: 0 auto;
        line-height: 1.5;
        font-style: italic;
        text-shadow: 0px 0px 6px rgba(0, 0, 0, 1);
      }
      .chronicle-controls-episodes {
        display: flex;
        flex-wrap: wrap;
        gap: 15px;
        margin-bottom: 20px;
        align-items: flex-end;
        background: transparent;
        padding: 0;
      }
      .chronicle-filter-episodes {
        display: flex;
        flex-direction: column;
        gap: 5px;
      }
      .chronicle-controls-episodes label {
        font-size: 11px;
        font-weight: bold;
        color: var(--text4);
        text-transform: uppercase;
      }
      .chronicle-select-episodes {
        padding: 6px 10px !important;
        color: #aba8a6 !important;
        background: #211c18 !important;
        border: none !important;
        border-radius: 10px;
        font: 400 11px var(--font), arial !important;
        box-sizing: border-box;
        max-width: 100%;
      }
      .chronicle-select-episodes option {
        background: #1a1612;
        color: #b9ae95;
      }
      .chronicle-btn-episodes {
        background: rgba(18, 16, 14, .85);
        backdrop-filter: blur(30px);
        -webkit-backdrop-filter: blur(30px);
        border: 1px solid #aba8a6;
        border-radius: 20px;
        color: #aba8a6;
        padding: 8px 20px;
        cursor: pointer;
        font-weight: bold;
        text-transform: uppercase;
        font-size: 11px;
        transition: transform 0.2s, box-shadow 0.2s;
        margin-left: auto;
        font-family: Montserrat;
      }
      .chronicle-btn-episodes:hover {
        transform: translateY(-3px) scale(1.1);
      }
      .chronicle-stats-episodes {
        font-size: 12px;
        color: #b9ae95;
        margin-left: 10px;
        display: flex;
        align-items: center;
        height: 100%;
        font-family: Montserrat;
      }
      .stats-badge-episodes {
        background: rgba(18, 16, 14, 0.7);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        border: 1px solid #756a5e;
        border-radius: 20px;
        padding: 7px 15px;
        font-size: 11px;
        color: #756a5e;
        font-weight: 500;
        letter-spacing: 0.5px;
        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
      }
      #chronicleContainerEpisodes {
        flex: 1;
        overflow-y: auto;
        padding-right: 5px;
        min-height: 0;
        max-height: 500px; 
      }
    
      .chronicle-timeline-episodes {
        max-width: 100%;
        font-family: inherit;
        font-size: 10px;
      }
      .chronicle-year-divider-episodes {
        display: flex;
        align-items: center;
        justify-content: center;
        margin: 12px 0 8px;
        color: var(--text4, #d4c9a8);
        font-weight: bold;
        font-size: 14px;
        text-transform: uppercase;
        letter-spacing: 2px;
        text-shadow: 0 1px 3px rgba(0,0,0,0.3);
      }
      .chronicle-year-divider-episodes::before,
      .chronicle-year-divider-episodes::after {
        content: "";
        flex: 1;
        height: 1px;
        background: linear-gradient(to right, transparent, var(--text2), transparent);
        margin: 0 15px;
      }
      .chronicle-year-divider-episodes::before {
        background: linear-gradient(to left, transparent, var(--text2), transparent);
      }
      .chronicle-item-episodes {
        display: flex;
        flex-wrap: wrap;
        margin-top: 3px;
        padding: 8px 8px;
        border-bottom: 0px solid rgba(189, 185, 184, 0.1);
        transition: background 0.2s;
        background: rgba(18, 16, 14, 0.6);
        backdrop-filter: blur(30px);
        -webkit-backdrop-filter: blur(30px);
        border: 1px solid #393028;
        border-radius: 10px;
      }
      .chronicle-item-episodes.status-active-episodes {
        background: var(--beg100);
        border-left: 4px solid var(--accent);
        padding-left: 8px;
      }
      .chronicle-item-episodes.status-active-episodes .chronicle-title-episodes a {
        color: var(--links) !important;
      }
      .chronicle-item-episodes.status-active-episodes .chronicle-title-episodes a:hover {
        color: var(--links2) !important;
      }
      .chronicle-item-episodes.status-closed-episodes {
        opacity: 1;
        border-left: 4px solid var(--accent2);
        padding-left: 8px;
        background: var(--beg100);
      }
      .chronicle-item-episodes.status-unfinished-episodes {
        border: 1px solid #393028;
        padding-left: 8px;
        opacity: 0.8;
        background: var(--beg100);
      }
      .chronicle-left-episodes {
        flex: 0 0 35%;
        padding-right: 15px;
        box-sizing: border-box;
      }
      .chronicle-right-episodes {
        flex: 0 0 65%;
        box-sizing: border-box;
      }
      .chronicle-date-episodes {
        font-weight: bold;
        color: var(--text1);
        margin-bottom: 3px;
        font-size: 10px;
      }
      .chronicle-title-episodes {
        text-align: left;
        font-weight: bold;
        margin-bottom: 3px;
        font-size: 13px;
      }
      .chronicle-title-episodes a {
        color: var(--links);
        text-decoration: none;
      }
      .chronicle-title-episodes a:hover {
        color: var(--accent) !important;
      }
      .chronicle-participants-episodes {
        font-size: 9px;
        color: var(--text1);
        margin-top: 3px;
        display: inline;
      }
      .chronicle-location-episodes {
        font-weight: bold;
        color: var(--text1);
        margin-bottom: 3px;
        font-size: 10px;
      }
      .chronicle-desc-episodes {
        font-size: 11px;
        color: var(--text1);
        line-height: 1.4;
      }
      .participant-tag-episodes {
        display: inline-block;
        background: var(--beg300);
        padding: 2px 6px;
        border-radius: 12px;
        margin-right: 4px;
        margin-top: 4px;
        font-size: 10px;
        cursor: pointer;
        transition: background 0.2s;
        align-self: flex-start;
      }
      .participant-tag-episodes:hover {
        background: var(--beg100);
      }
      .chronicle-loading-episodes {
        text-align: center;
        padding: 40px;
        color: var(--text3);
      }
    
      @media (max-width: 720px) {
        .chronicle-app-episodes {
          padding: 50px 20px;
        }
        .chronicle-left-episodes,
        .chronicle-right-episodes {
          flex: 0 0 100%;
          padding-right: 0;
          margin-bottom: 5px;
        }
        .chronicle-controls-episodes {
          flex-direction: column;
          align-items: stretch;
        }
        .chronicle-btn-episodes {
          margin-left: 0;
        }
        .chronicle-year-divider-episodes {
          font-size: 12px;
        }
        .chronicle-year-divider-episodes::before,
        .chronicle-year-divider-episodes::after {
          margin: 0 8px;
        }
        .chronicle-main-title-episodes {
          font-size: 18px;
        }
        .chronicle-subtitle-episodes {
          font-size: 11px;
          max-width: 100%;
        }
        .chronicle-select-episodes {
          min-width: 100%;
        }
        .chronicle-stats-episodes {
          margin-left: 0;
          justify-content: center;
        }
      }
    </style>
    
    <script>
    (function() {
      function init() {
        var container = document.getElementById('chronicleContainerEpisodes');
        if (!container) return setTimeout(init, 50);
    
        var rawData = [
          {
            date: "27.06.10199",
            title: "Рыба ещё эта",
            participants: ["Ariste Atreides", "Feyd-Rautha Harkonnen"],
            status: "завершённый",
            link: "https://dune.rusff.me/viewtopic.php?id=43#p121",
            year: "10199", location: "Арракис, Арракин",
            description: "Фейд-Раута узнаёт, что после разорванной помолвки Аристе Атрейдес не улетала на Валлах, как ему сказали, а осталась на Арракисе и всё ещё находится там. На-барон решает объясниться с суженой лично."
          },
          {
            date: "01.03.10191",
            title: "Revenge Is a Dish Best Served Poisoned",
            participants: ["Feyd-Rautha Harkonnen", "Piter de Vries"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=51#p339",
            year: "10191",
            location: "Гиеди Прайм",
            description: "Питер де Врис завершает незаконченные дела. Фейд-Раута получает урок семейных ценностей."
          },
          {
            date: "30.06.10198",
            title: "How to Charm a Princess",
            participants: ["Feyd-Rautha Harkonnen", "Ariste Atreides", "Piter de Vries"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=52#p346",
            year: "10198",
            location: "Арракис, Арракин/Арсунт",
            description: "Званый ужин в честь помолвки Аристе Атрейдес и Фейда-Рауты Харконнена"
          },
          {
            date: "27.06.10199",
            title: "You did what now?",
            participants: ["Feyd-Rautha Harkonnen", "Piter de Vries"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=57#p625",
            year: "10199",
            location: "Арракис, деревня Харко",
            description: "Питер и Фейд обсуждают вылазку на-барона в Арракин."
          },
          {
            date: "18.07.10199",
            title: "A Whole New World",
            participants: ["Feyd-Rautha Harkonnen", "Ariste Atreides"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=56#p585",
            year: "10199",
            location: "Арракис, руины Старого Карфага",
            description: "Пытаясь выяснить настоящие причины смерти Бронсо Верниуса, Аристе связывается с неожиданным союзником"
          },
          {
            date: "13.08.10199",
            title: "Я не договорил",
            participants: ["Ariste Atreides", "Marcus Havok"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=68#p1852",
            year: "10199",
            location: "Арракис, Арракин",
            description: "Марк и Аристе наконец-то получают возможность объясниться после инцидента в Архивах и истинных причин смерти Зантары"
          },
          {
            date: "12.01.10145",
            title: "Los Miserables",
            participants: ["Piter de Vries", "Thufir Hawat"],
            status: "незаконченный",
            link: "https://dune.rusff.me/viewtopic.php?id=79#p4033",
            year: "10145",
            location: "Новебрун",
            description: "Во времена правления дьюка Лето и барона Дмитрия дома Атрейдас и Харконнен вынуждены спонсировать нищую, агонизирующую, насквозь коррумпированную планету. Спустив впустую немыслимое количество денег, два дома отправляют своих ментатов, чтобы проинспектировать, куда идет их помощь."
          },
          {
            date: "02.08.10199",
            title: "Keep your friends close",
            participants: ["Tanidia Nerus", "Esmar Tuek"],
            status: "активный",
            link: "https://dune.rusff.me/viewtopic.php?id=89#p7804",
            year: "10199",
            location: "Арракис, «Павший свет»",
            description: "Эсмар обращается к Танидии с просьбой вычислить лицеделов в рядах Вольных Торговцев"
          }
        ];
    
        var allEpisodes = rawData;
        var filteredEpisodes = [];
    
        var yearFilter = document.getElementById('yearFilterEpisodes');
        var participantFilter = document.getElementById('participantFilterEpisodes');
        var statusFilter = document.getElementById('statusFilterEpisodes');
        var resetBtn = document.getElementById('resetFiltersEpisodes');
        var countSpan = document.getElementById('episodeCountEpisodes');
    
        var yearsSet = new Set();
        var participantsSet = new Set();
        allEpisodes.forEach(function(ep) {
          yearsSet.add(ep.year);
          ep.participants.forEach(function(p) { participantsSet.add(p); });
        });
    
        while (yearFilter.options.length > 1) yearFilter.remove(1);
        Array.from(yearsSet).sort(function(a, b) { return b - a; }).forEach(function(year) {
          var option = document.createElement('option');
          option.value = year;
          option.textContent = year;
          yearFilter.appendChild(option);
        });
    
        while (participantFilter.options.length > 1) participantFilter.remove(1);
        Array.from(participantsSet).sort().forEach(function(participant) {
          var option = document.createElement('option');
          option.value = participant;
          option.textContent = participant;
          participantFilter.appendChild(option);
        });
    
        function parseDate(dateStr) {
          var parts = dateStr.split('.');
          if (parts.length !== 3) return 0;
          var day = parseInt(parts[0], 10);
          var month = parseInt(parts[1], 10);
          var year = parseInt(parts[2], 10);
          return year * 10000 + month * 100 + day;
        }
    
        function applyFilters() {
          var selectedYear = yearFilter.value;
          var selectedParticipant = participantFilter.value;
          var selectedStatus = statusFilter.value;
    
          filteredEpisodes = allEpisodes.filter(function(ep) {
            if (selectedYear !== 'all' && ep.year !== selectedYear) return false;
            if (selectedParticipant !== 'all' && ep.participants.indexOf(selectedParticipant) === -1) return false;
            if (selectedStatus !== 'all' && ep.status !== selectedStatus) return false;
            return true;
          });
    
          filteredEpisodes.sort(function(a, b) {
            var dateA = parseDate(a.date);
            var dateB = parseDate(b.date);
            return dateA - dateB;
          });
    
          renderTimeline();
        }
    
        function renderTimeline() {
          if (filteredEpisodes.length === 0) {
            $(container).fadeOut(150, function() {
              container.innerHTML = '<div class="chronicle-loading-episodes">Нет эпизодов, соответствующих фильтрам.</div>';
              $(container).fadeIn(200);
              countSpan.textContent = '0';
            });
            return;
          }
    
          var grouped = {};
          filteredEpisodes.forEach(function(ep) {
            if (!grouped[ep.year]) grouped[ep.year] = [];
            grouped[ep.year].push(ep);
          });
    
          var years = Object.keys(grouped).sort(function(a, b) { return b - a; });
          var html = '<div class="chronicle-timeline-episodes">';
          var totalEpisodes = 0;
    
          years.forEach(function(year) {
            html += '<div class="chronicle-year-divider-episodes">' + year + ' AG</div>';
            grouped[year].forEach(function(ep) {
              totalEpisodes++;
              var statusClass = '';
              if (ep.status === 'активный') statusClass = 'status-active-episodes';
              else if (ep.status === 'завершённый') statusClass = 'status-closed-episodes';
              else if (ep.status === 'незаконченный') statusClass = 'status-unfinished-episodes';
    
              var participantsHtml = '<div class="chronicle-participants-episodes">' +
                ep.participants.map(function(p) {
                  return '<span class="participant-tag-episodes" data-participant="' + p + '">' + p + '</span>';
                }).join('') +
                '</div>';
    
              html += '<div class="chronicle-item-episodes ' + statusClass + '">';
              html += '<div class="chronicle-left-episodes">';
              html += '<div class="chronicle-date-episodes">' + ep.date + '</div>';
              html += '<div class="chronicle-title-episodes"><a href="' + ep.link + '" target="_blank">' + ep.title + '</a></div>';
              html += participantsHtml;
              html += '</div>';
              html += '<div class="chronicle-right-episodes">';
              html += '<div class="chronicle-location-episodes">' + ep.location + '</div>';
              html += '<div class="chronicle-desc-episodes">' + (ep.description || '') + '</div>';
              html += '</div>';
              html += '</div>';
            });
          });
    
          html += '</div>';
    
          $(container).fadeOut(150, function() {
            container.innerHTML = html;
            $(container).fadeIn(200);
    
            var tags = container.querySelectorAll('.participant-tag-episodes');
            for (var j = 0; j < tags.length; j++) {
              tags[j].addEventListener('click', function() {
                var participant = this.getAttribute('data-participant');
                participantFilter.value = participant;
                applyFilters();
              });
            }
          });
    
          countSpan.textContent = totalEpisodes;
        }
    
        yearFilter.addEventListener('change', applyFilters);
        participantFilter.addEventListener('change', applyFilters);
        statusFilter.addEventListener('change', applyFilters);
    
        resetBtn.addEventListener('click', function() {
          yearFilter.value = 'all';
          participantFilter.value = 'all';
          statusFilter.value = 'all';
          applyFilters();
        });
    
        applyFilters();
      }
    
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
      } else {
        init();
      }
      setTimeout(init, 200);
    })();
    </script>

    +1


    Вы здесь » DUNE: GREAT CONVENTION » Assassin’s Handbook » Хронология


    Рейтинг форумов | Создать форум бесплатно