Утилита для просмотра и фильтрации спойлер-логов
Elden Ring Item & Enemy Randomizer.
Открывает большой .txt-лог рандомайзера, парсит его по категориям и даёт удобный
GUI с пресетами, поиском, копированием в буфер обмена и экспортом.
- Парсинг всех секций реального лога рандомайзера: Великие Руны, Воспоминания, подсказки ключевых предметов / колокольчиков / основных механик / квестовых предметов, размещения боссов / мини-боссов / обычных врагов, размещения жестов и BGM, полный список item-спойлеров с ценами.
- Подсказки и Великие Руны автоматически обогащаются полной информацией из
секции
-- Spoilers:лога: видно не только регион, но и где именно лежит предмет, как его получить и что он заменяет. - Структурированный вывод в GUI: имя предмета — отдельной строкой, под ним
с отступом —
Где / Как / Заменяет. Никакой каши из сырых строк лога. - 9 готовых пресетов (Великие Руны, Боссы + Мини-боссы, Все Подсказки, Полная Информация, Спидран Пресет и т. д.).
- Свои пресеты — список конкретных предметов. У каждой строки в
результатах есть чекбокс ☐ / ☑. Кликни — добавил/убрал из «сборки».
Работаешь как обычно через серию поисков (
great rune→scorpion→academy key), сборка копится между запросами. Когда готово — кнопка «Сохранить как пресет…» под результатами, ввёл имя — пресет появится в выпадающем списке сверху с пометкой★. «Применить» показывает только выбранные предметы. Хранится в~/.er_randomizer.json. - Поиск по результатам (по подстроке, регистронезависимо), с дебаунсом и «soft cap» в 2000 строк, чтобы поиск оставался отзывчивым даже на полном пресете (~26 000 записей).
- Копирование результата в буфер обмена и сохранение в
.txt. - Светлая и тёмная тема, переключение из тулбара (☀/🌙). Выбор
сохраняется в
~/.er_randomizer.jsonмежду запусками. - Парсер можно использовать без GUI как библиотеку (
er_randomizer.SpoilerParser).
На странице Releases
лежат self-contained бинари для Windows / macOS / Linux. Качаете нужный файл,
запускаете — никакого pip install, Python и python3-tk ставить не нужно.
| OS | Файл |
|---|---|
| Windows | er-randomizer-spoiler-viewer-windows.exe |
| macOS | er-randomizer-spoiler-viewer-macos |
| Linux | er-randomizer-spoiler-viewer-linux |
Сборки публикуются автоматически из GitHub Actions на любой v* тег
(см. .github/workflows/release.yml). Чтобы выпустить новую версию:
git tag v0.3.0
git push origin v0.3.0— workflow прогонит PyInstaller на трёх ОС-раннерах, прикрепит бинари к GitHub Release и сгенерирует release notes.
Требования: Python 3.10+, tkinter (на Linux: sudo apt install python3-tk).
git clone https://github.com/foblako/RandomizerSpoilerLogChecker.git
cd RandomizerSpoilerLogCheckerДополнительные зависимости нужны только для тестов и линтера:
pip install -e ".[dev]"python -m er_randomizer
# или, для обратной совместимости:
python er_randomizer_viewer.pyДальше: Открыть файл… → выбираете лог рандомайзера, отмечаете категории (или применяете пресет), при необходимости вводите запрос в поле поиска, копируете или сохраняете результат.
Пример вывода для пресета Великие Руны (фрагмент):
Великие Руны (7)
• Godrick's Great Rune
Где: Limgrave - Groveside Cave
Как: Dropped by Beastman of Farum Azula
Заменяет: Flamedrake Talisman
• Rykard's Great Rune
Где: Volcano Manor
Как: Given by Tanith upon joining Volcano Manor, or in her chair after defeating Rykard
Заменяет: Drawing-Room Key
Пример размещений боссов — формулировка явная, без двусмысленности «кто кого»: имя в bullet — кого вы реально встретите в этой точке.
Размещения боссов (218)
• Misbegotten Crusader
Где найти: Limgrave - Groveside Cave
Кого заменяет: Beastman of Farum Azula
Откуда взят: Castle Sol
from er_randomizer import SpoilerParser, PRESETS
log = SpoilerParser().parse_file("samples/2026-04-28_18.15.20_log_92835768_84233.txt")
print(log.counts())
# {'great_runes': 7, 'remembrances': 25, 'boss_placements': 218, ...}
for entry in log.great_runes:
# все hint-категории (great_runes, key_item_hints, bell_bearing_hints и т.д.)
# возвращают SpoilerEntry с полями item / location / description / replaces.
print(f"{entry.item} — {entry.location}")
if entry.description:
print(" Как:", entry.description)
if entry.replaces:
print(" Заменяет:", entry.replaces)
# Для вывода в том же формате, что в GUI:
from er_randomizer.formatting import entry_to_text
for entry in log.great_runes:
print(entry_to_text(entry))
for key in PRESETS["Боссы + Мини-боссы"]:
for entry in log.get(key):
print(entry_to_text(entry))Доступные категории (SpoilerLog.CATEGORY_KEYS):
| Ключ | Описание |
|---|---|
great_runes |
Великие Руны |
remembrances |
Воспоминания |
key_item_hints |
Подсказки ключевых предметов |
bell_bearing_hints |
Подсказки колокольчиков |
core_mechanics_hints |
Подсказки основных механик |
quest_item_hints |
Подсказки квестовых предметов |
boss_placements |
Размещения боссов |
miniboss_placements |
Размещения мини-боссов |
basic_placements |
Размещения обычных врагов |
gesture_placements |
Размещения жестов |
level_bgm_placements |
Размещения BGM |
spoilers |
Полный список item-спойлеров (с ценами) |
Пресеты живут в er_randomizer/presets.py — это обычный словарь
PRESETS: dict[str, list[str]]. Чтобы добавить свой:
PRESETS["Только лут торговцев"] = ["spoilers"]RandomizerSpoilerLogChecker/
├── er_randomizer/ # библиотека
│ ├── __init__.py
│ ├── parser.py # SpoilerParser + dataclass-модели
│ ├── formatting.py # красивый вывод записей (Где / Как / Заменяет)
│ ├── presets.py # PRESETS, CATEGORY_LABELS
│ ├── gui.py # Tkinter-интерфейс
│ └── __main__.py # `python -m er_randomizer`
├── er_randomizer_viewer.py # обратно-совместимая точка входа
├── samples/ # реальные спойлер-логи (тест-фикстуры)
├── tests/
│ └── test_parser.py
├── pyproject.toml
└── README.md
pip install -e ".[dev]"
pytest
ruff check .Тесты прогоняют парсер на всех samples/*.txt и проверяют, что в каждом
из реальных логов нашлись Великие Руны, Воспоминания, размещения боссов,
жесты, BGM и item-спойлеры в осмысленных количествах.
Свободное использование (Unlicense).