Releases: timoncool/dungeon-ultimate
Release list
v0.11.0 — интерфейс на всех семи языках
Игра говорила на семи языках всем, кроме собственных кнопок. Теперь и ими тоже.
Интерфейс на языке игры
Рассказ, журнал и озвучка шли на семи языках с самого начала, а подписи оставались русскими: интерфейс переехал из прошлой версии как есть. Теперь он берёт язык истории — русский, английский, испанский, французский, немецкий, китайский, японский.
Переведено всё, что читает игрок: шапка и кнопки хода, поле ввода с режимами, лист героя с характеристиками, задания, журнал, достижения, разделы меню, панель движков с готовыми раскладками, «что скачать», монитор карты, страницы книги, создание истории с жанрами, поля персонажа, мир и правила, картинки, голос, инвентарь, тексты ошибок.
Служебные слова стадий остались русскими нарочно: это протокол между сервером и интерфейсом, а не текст на экране.
Как проверялось
Сборка сверяет ключи каждого языка с эталоном и отказывается собирать словарь, если хоть один потерян — у всех пяти новых языков ровно 211. Отдельная проверка ищет непереведённое, потерянные подстановки и пропавшие значки: чисто. Переводы прочитаны построчно; в японском нашлись латинские вопросительные знаки вместо полноширинных — поправлено.
Вживую: переключение языка истории меняет весь интерфейс, чужих подписей на экране не остаётся.
Что всплыло по дороге
Две ловушки, обе настоящие. Импорт словаря был написан через «@/», а остальной код — через «./»: сборщик считает это разными модулями и делает две копии контекста — провайдер в одной, читатели в другой. И корневой компонент не видит собственный провайдер, ему словарь нужен напрямую.
Ещё шесть списков лежали на уровне модуля — жанры, длина ответа, стадии, раскладки, адреса серверов, слоты — и застывали на языке загрузки навсегда. Развёрнуты в функции от словаря.
Мелочи
Плашка обновления больше не показывает сырую разметку релиза и не зовёт запускать батник — она говорит, что игра обновится сама. В шапке подпись про то, где что считается, пересчитывается при смене языка.
Установщик: DungeonUltimate-0.11.0-x64-setup.exe. Кто уже играет — обновление придёт само.
v0.10.0 — инструменты на своей Гемме, кадр по решению модели
Инструменты доехали до своей Геммы, кадр теперь заказывает сама модель, а копий модели в памяти больше не бывает.
Инструменты работают не только в облаке
Своя Гемма их умеет — сервер поднимается с --jinja. На живом ходу она сама позвала character_sheet, quest_complete и draw_frame.
Заодно нашлась причина, по которой казалось, что не умеет: поток терял имя инструмента. Событие стадии несло только слово «инструменты», и пять одинаковых строк подряд выглядели как молчание модели.
Мелочи оттуда же: метку броска Гемма писала по-английски — теперь на языке игры; характеристику называла «Dexterity» вместо dex — теперь распознаётся в любой записи.
Кадр заказывает модель
Инструмент draw_frame: промпт, крупность плана, пометка места и те, чьи лица должны остаться узнаваемыми. Отдельный проход со схемой остался запасным — для случаев, где инструментов нет. Проверено и в облаке, и на своей Гемме: обе заказывают кадр с подробным английским промптом.
Значки у событий журнала
Находка, бросок, урон и лечение, бой, эффект, задание, уровень, заметка — у каждого свой рисунок из того же пака game-icons, что и у наград. В ленте, в книге и в журнале. Ведущий эмодзи с экрана убран: его место занял рисунок.
Копий модели больше не бывает
llama-server переживал падение сервера, и уборка сирот при старте — лечение по факту: между падением и следующим запуском процесс живёт и держит видеопамять. У меня так набралось четыре штуки на двадцать гигабайт.
Теперь модель живёт в задании Windows с правилом «умереть вместе с родителем»: сервер сняли силой — модель умирает сама. Проверено: после taskkill /F процессов не осталось, видеопамять свободна.
Под капотом
Предупреждения clippy сведены к нулю: было 39, стало 0. Тесты — 312 зелёных.
Установщик: DungeonUltimate-0.10.0-x64-setup.exe. Кто уже играет — обновление придёт само.
v0.9.1 — бросок инструмента виден игроку
Починка одного вранья на экране: игра писала «Движок разрешает бросок…», а кубик не кидался.
Бросок теперь виден
Броски переехали в инструмент — модель кидает их прямо во время письма, чтобы исход был известен в том же ходу, а не в следующем. Но инструмент отдавал результат только модели: ни строки в журнале, ни трёхмерного кубика. Кидали за ширмой.
Теперь бросок оставляет такое же событие, как и проход механики, а события инструментов уезжают игроку вместе с ходом, а не появляются после перезагрузки. Заодно нашлось, что проход механики затирал список событий вместо того, чтобы дописывать в него, — из-за этого пропали бы и награды.
Проверено на живом ходу через интерфейс: два броска инструментом — d20 18 против 13 → успех и d20 8 против 14 → провал, оба с записью в журнале и с крутящимся кубиком.
Стадия больше не обещает лишнего
Надпись «Движок разрешает бросок…» висела на каждом ходу, даже когда бросать было нечего. Этот проход сводит последствия хода — так и написано.
Установщик: DungeonUltimate-0.9.1-x64-setup.exe. Кто уже играет — обновление придёт само.
v0.9.0 — достижения, одновременная озвучка, звук играет сам
Игра научилась награждать, облачная озвучка перестала ждать саму себя, а звук наконец играет без клика.
Достижения
Игра сама решает, когда игрок отличился, и вручает награду: выстоял против сильнейшего, пощадил побеждённого, вынес чужого ребёнка из-под обвала. Модель просит награду инструментом, а движок проверяет: повторить уже полученное нельзя, чаще раза в двенадцать ходов — тоже. Награда не выпрашивается: её нельзя выдать себе, о ней узнают постфактум.
Живут достижения в профиле игрока, а не внутри истории. Удалишь историю — награда останется и будет помнить, где заслужена. У них свой раздел в правом меню: значок, название, за что выдано, редкость, история и день. В ленте — короткая карточка: медальон, название цветом редкости и повод.
Значки
Весь пак game-icons.net — 4176 рисунков под CC BY 3.0, авторы указаны в README. Модель ищет значок отдельным вызовом: спросила «мост» — получила список, выбрала. Промах по слову больше не тупик: в ответ приходят значки общего назначения и подсказка, что названия английские.
Облачная озвучка идёт одновременно
Фразы уходили в синтез по мере готовности, но по одной: следующий запрос ждал ответа на предыдущий. Теперь в облаке до четырёх запросов в полёте, а клипы отдаются игроку строго по порядку — слушать вперемешку никто не хочет. Замер на живом ходу: клип каждые 0.4–0.6 с вместо 1.5–2 с.
На своей карте порядок прежний: движок там один, очередь обязательна.
Звук играет сам
WebView2 отклонял audio.play() без жеста по окну, а отказ проглатывался молча — игрок сидел в тишине без единого слова о причине. Окно поднимается с разрешением автозвука, а если браузер всё же откажет, об этом теперь говорят прямо.
Журнал перестал показывать служебное
Игрок читал разбор решений движка: «Рен обращается к Кайре с риторическим вопросом, не давая прямого поручения». Задания, броски и проверки отражаются собственными событиями — значит заметка о них служебная по определению. Так и отсеивается, а не списком отговорок.
Установщик: DungeonUltimate-0.9.0-x64-setup.exe. Кто уже играет — обновление придёт само.
v0.8.0 — карта делится честно, отмена работает
Версия про то, что игра перестала врать и подвисать. Каждая находка ниже вскрылась на живом прогоне, а не на бумаге.
Распознавание речи ожило
Оно висело намертво: ни ответа, ни ошибки в логе. Библиотека onnx лежит в models/asr, а загрузчик искал её в двух других местах и, не найдя, уходил в системную — в самом коде про этот случай написано «дедлок на чужой DLL».
Теперь оба движка проверены на обоих устройствах:
Parakeet на карте → 2.0 с
Parakeet на процессоре → 1.6 с
Whisper на карте → 15.7 с
Whisper на процессоре → 10.2 с
Whisper к тому же правильно держит кириллицу там, где Parakeet сбивается на латиницу. Качается он только по выбору и в обязательный набор не входит.
«Прервать» действительно прерывает
Раньше кнопка отцепляла только браузер: сервер досчитывал ход до конца и держал видеокарту, а за ним вставало всё остальное — озвучка, распознавание, следующий ход. Теперь ход получает признак отмены и смотрит на него прямо в потоке текста и между проходами. То же делает и таймаут: если ход затянулся, сервер не считает в пустоту.
Карта делится честно
Озвучка грузила свои 4 ГБ поверх 8 ГБ рассказчика, и всё упиралось в память: ход занимал одиннадцать минут. Теперь голос и текстовая модель сгоняют друг друга с карты — ход укладывается в минуту.
Процессы модели переживали закрытие игры: три штуки держали 23.7 ГБ из 24.5. При старте игра убирает своих сирот.
Мелочи, которые ломали жизнь
- Голосовой ввод отваливался с «слишком большой запрос» на нескольких секундах речи: стандартный предел в два мегабайта защищает публичные серверы, а этот слушает только себя. Предел снят.
- Загрузка весов подписана — «Модель едет на карту, это разово…». Раньше минута загрузки выглядела зависанием.
- Кадр и озвучка на процессоре больше не предлагаются: замеры показали минуты вместо секунд. Рассказчик остаётся, но с честной подписью — около полутора минут на отрывок.
Установка: скачай DungeonUltimate-0.8.0-x64-setup.exe, запусти.
304 теста, ни одного красного.
v0.7.0 — карта, процессор или облако на выбор
Стало понятно, чем считается ход, и что вообще нужно скачивать.
Карта, процессор или облако — на каждую стадию
Игроки жаловались, что непонятно, где что генерируется: у одного на процессоре, у другого на карте. Причина была настоящая — у каждой стадии был свой тумблер, и означали они разное:
- у рассказчика — «слоёв на карте», число;
- у картинок — «выгружать на процессор», хотя это про хранение весов в памяти: считает всё равно карта. Галка стояла по умолчанию, и человек думал, что рисует процессор;
- у распознавания — переменная окружения;
- у озвучки не было ничего: там намертво стояла карта, и на машине без неё озвучка падала.
Теперь один общий выбор и переопределение на каждую стадию, переключатель в три положения: Карта · Процессор · Облако. Настоящий выбор устройства для картинок отделён от выгрузки весов — в движке это разные вещи.
Панель показывает не выбор, а итог: чем стадия считается на самом деле, с учётом общего выбора и включённого облака.
Загрузка компонентов
Три ступени нужности вместо «да/нет». Раньше всё, что не обязательно, выглядело одинаково необязательным — голос и распознавание речи стояли рядом с альтернативными весами:
Модель картинок Krea-2 Turbo без него игра не пойдёт 7.22 ГБ
Движок озвучки рекомендуется 0.07 ГБ
Правка кадра по референсу по желанию 0.91 ГБ
Оборванная закачка больше не считается установкой. «Файл существует» — не то же самое, что «файл целый»: обрубок проходил проверку, игра падала на загрузке весов, а качалка была уверена, что всё на месте. Теперь размер сверяется до байта.
Настройки разложены по смыслу
Шаги и сила промпта уехали в «Картинки» — это про кадр, а не про железо. Включение озвучки, параллельность и длина эталона — в «Голос». В «Движках» осталось только железо.
Мелочи
- Иконка приложения была от другого проекта — заменена на книгу с картой подземелья.
- Проверка на Windows не проходила с версии 0.4.0: она осталась от прежней версии игры и звала команды, которых больше нет. Теперь собирает интерфейс, гоняет тесты и линтер.
Установка: скачай DungeonUltimate-0.7.0-x64-setup.exe, запусти. Игра сама предложит забрать нужное.
301 тест, ни одного красного.
v0.6.0 — установщик и один файл вместо папки
Игра наконец ставится как обычная программа: скачал setup.exe, запустил, играешь. Ни батников, ни папки с файлами рядом.
Установщик вместо папки
Dungeon Ultimate_0.6.0_x64-setup.exe — 9 МБ. Ставит игру, кладёт ярлык, дальше она сама. Внутри — одно приложение: сервер поднимается в его же процессе, отдельного du-server.exe рядом нет.
Кому нужен MSI для развёртывания — он тоже приложен.
Интерфейс внутри приложения
Раньше рядом с exe обязана была лежать папка frontend/dist, иначе игра отвечала «фронт не собран». Теперь весь интерфейс — разметка, скрипты, стили, даже текстуры кубика — лежит внутри самого файла. Проверено запуском из пустого каталога: страница, скрипт на 536 КБ, стили и текстуры отдаются из бинаря.
Автообновление
Игра проверяет GitHub-релиз в фоне и по согласию ставит новую версию в один клик — подпись проверяется открытым ключом, чужое не поставится. Если автоматически не вышло, предложит открыть страницу загрузки.
Установщик похудел с 1.8 ГБ до 9 МБ
В него складывали рантайм движка картинок — 336 МБ движка и 563 МБ библиотек CUDA, — хотя игра и так качает их при первом запуске, показывая размер и прогресс. Теперь в установщике только приложение, а движки и веса приезжают по кнопке «Скачать нужное».
Как играть: скачай Dungeon Ultimate_0.6.0_x64-setup.exe, запусти, дальше игра сама предложит забрать модели.
Нет мощной видеокарты? Раздел «Движки и облако» → ключ OpenRouter → раскладка «Без видеокарты — всё в облаке». Тогда качать почти ничего не нужно.
294 теста, ни одного красного.
v0.5.0 — свой стиль иллюстраций и рабочие задания
Иллюстрации в этой версии перестают быть случайными, задания наконец засчитываются, а смерть героя заканчивает историю.
У истории появляется свой стиль
При создании игры отдельный проход придумывает визуальный стиль под её мир — технику, палитру, свет, узнаваемую школу иллюстрации — и дальше он подставляется в каждый кадр. Для мрачного славянского средневековья, например, выходит вот такое:
Угольная ворожба — уголь и мел по грубой тонированной бумаге, тяжёлая светотень, палитра из жжёной умбры, охры и приглушённого мха, плотная штриховка и растушёванные фактуры, драматичный свет одной свечи или пасмурного болота, отсылка к русскому реалистическому рисунку XIX века.
Раньше поле стиля было пустым, и каждый кадр рисовался в своей манере: один похож на фотографию, другой на комикс. Стиль можно поправить руками — это обычное поле в настройках картинок.
Кадры держатся друг за друга
Облачной отрисовке теперь передаётся основа: прошлая картинка этого же места или портреты персонажей. До этого облако рисовало каждый кадр с чистого листа, и сцена «переезжала» из кадра в кадр.
Что именно положить в основу, решает сам оператор кадра — он видел отрывок целиком:
- прошлый кадр места — когда действие продолжается там же;
- портреты персонажей — когда важно не потерять лицо;
- ничего — новое место, где никого знакомого нет.
Промпт кадра стал промптом
Раньше оператору говорили «пиши конкретно и кинематографично», и выходила строка. Теперь у него есть порядок: кто и что делает в это мгновение, во что одет, что видно вокруг, откуда и какой свет, план и ракурс, палитра и настроение — с требованием конкретных существительных вместо прилагательных. На живой сцене выходит 1200–1350 знаков вместо строки.
Выполнение заданий засчитывается
Не засчитывалось никогда. Проход механики получает только текст отрывка, а список взятых заданий уходил рассказчику — движок не знал ни одного заголовка, который должен назвать. Теперь взятые задания уходят ему списком, с условиями и с тем, кто их дал:
📜 Предложено задание: Пропавший сын мельника — от Старый мельник
✅ Задание выполнено: Пропавший сын мельника
✨ Кайра: +50 опыта (Пропавший сын мельника) → 50
После гибели героя история заканчивается
Раньше можно было писать дальше как ни в чём не бывало: движок помечал героя мёртвым, а ход шёл своим чередом. Теперь сервер такой ход не принимает, поле ввода закрыто, а «Стереть» отменяет роковой ход — герой снова жив, и можно сыграть иначе.
Мелочи
- Скорость речи работает с любым голосом и больше не задирает тон. Просить её у провайдера бессмысленно: Grok и Gemini параметр принимают и молча игнорируют.
- Отговорки модели вместо награды («не указано», «не обещано») в журнал не попадают.
Установка: скачай архив, распакуй, запусти run.bat.
294 теста, ни одного красного.
v0.4.0 — задания, опыт и уровни
У героя появилось, ради чего идти дальше: задания от жителей мира и рост за их выполнение.
Задания
Задание выдаёт живой персонаж истории — мельник, стражник, трактирщица, — и только он. Если никто ни о чём не просил, задания не будет: находка, слух и надпись на стене заданием не считаются.
Игрок решает сам: Взять или Отказаться. Взятое ложится в профиль вместе с тем, кто его дал, что нужно сделать и по каким условиям оно закроется, — и держится в контексте истории, пока рассказчик не закроет его по этим условиям. Взятое можно бросить.
«Сын мельника у Чёрного брода» — от Старого мельника, +50 опыта
Найти пропавшего сына, ушедшего к старой мельнице.
— Найти сына мельника у Чёрного брода
— Вернуться к мельнику с известием о его судьбе
Задания — редкое событие, а не поток: следующее предложение не раньше чем через пятнадцать ходов, одновременно открытых не больше двух. Закрыть задание в обход условий нельзя — это делает только движок по ходу истории.
Опыт и уровни
Раньше в игре стояла вечная «ур. 1»: поля опыта и уровня в листе героя были, но их никто не менял, и вырасти было нельзя. Теперь опыт идёт за выполненные задания и за то, что объявит движок по ходу боя. Новый уровень поднимает запас сил и сразу лечит на ту же величину — рост чувствуется в тот же ход.
Видеокарта больше не просыпается зря
Справка о движке картинок сама его и грузила: страница состояния спрашивает версию и устройства, а движок ради ответа поднимал CUDA прямо в процессе сервера. Видеокарта оказывалась занята тем, чем игрок не пользуется, — при том, что кадры рисует облако.
Теперь, когда кадры уведены в облако, про свой движок не спрашивают вовсе, а сам он грузится только на настоящую отрисовку. Заодно поле «загружен» перестало повторять «весы на диске есть».
Установка: скачай архив, распакуй, запусти run.bat.
Нет мощной видеокарты? Раздел «Движки и облако» → ключ OpenRouter → раскладка «Без видеокарты — всё в облаке».
292 теста, ни одного красного.
v0.3.0 — голоса по ролям и честный интерфейс
Игра стала быстрее вчетверо, реплики персонажей читаются разными голосами, а интерфейс перестал врать о том, что происходит.
Схемы моделей решают за нас
Каталог моделей OpenRouter теперь скачивается целиком, и по каждой модели игра знает: можно ли отключать её размышления, какой уровень усилия она принимает, умеет ли строгий разбор по схеме. Раньше запрет размышлений слался всем подряд — Gemini и Grok его отвергают, — а у DeepSeek просился уровень, которого у неё нет. Отсюда были пустые ответы, молчащая механика и ход на 130 секунд.
Стало 13 секунд. Кубик снова бросается.
Автокастинг голосов
Рассказчик получает список голосов с пометками пола и возраста и сам помечает каждую реплику. Женщину читает женский голос, старика — пожилой, ребёнка — детский, и один и тот же персонаж звучит одинаково всю историю.
Работает и с кавычками, и с тире — русская проза оформляет прямую речь и так, и так. Слова автора остаются за рассказчиком. Если модель забыла пометить, говорящий узнаётся по самому тексту: «вдова», «старик», «девочка» — с учётом склонений.
Видеокарта больше не просыпается зря
- Иконки предметов рисовались на своей карте всегда — про облако этот путь не знал вовсе. Видеокарта включалась на каждой находке, хотя выбрано «всё в облаке».
- Облачный кадр рисовался дважды: напрямую и ещё раз в очереди — двойная задержка и двойная плата.
- Варианты действий и подсказки уходят в облако вместе с рассказчиком и не встают в очередь к карте.
Интерфейс говорит правду
- Подпись под кадром показывала движок из настроек карты: под кадром от Gemini стояло «krea2-turbo». Теперь там тот, кто рисовал.
- Строка состояния гаснет вместе с ходом, «рисуется кадр» появляется, когда кадр действительно рисуется, а на ожидании голоса стоит своя надпись.
- Отказ провайдера доносится словами. Раньше при отказе тело ответа выбрасывалось, и до игрока доезжал голый номер
400вместо «цензура Krea отклонила кадр». - Служебные ключи модели и её внутренние размышления больше не попадают в журнал.
Мелочи, которые заметны
- Кеш озвучки не учитывал сам текст: после правки отрывка играла прежняя запись.
- Правка одной настройки больше не сбрасывает остальные.
Установка: скачай архив, распакуй, запусти run.bat. Модели игра забирает сама на первом запуске.
Нет мощной видеокарты? Раздел «Движки и облако» → ключ OpenRouter → готовая раскладка «Без видеокарты — всё в облаке».
280 тестов, ни одного красного.