Skip to content

Releases: timoncool/dungeon-ultimate

v0.11.0 — интерфейс на всех семи языках

Choose a tag to compare

@timoncool timoncool released this 18 Aug 20:16

Игра говорила на семи языках всем, кроме собственных кнопок. Теперь и ими тоже.

Интерфейс на языке игры

Рассказ, журнал и озвучка шли на семи языках с самого начала, а подписи оставались русскими: интерфейс переехал из прошлой версии как есть. Теперь он берёт язык истории — русский, английский, испанский, французский, немецкий, китайский, японский.

Переведено всё, что читает игрок: шапка и кнопки хода, поле ввода с режимами, лист героя с характеристиками, задания, журнал, достижения, разделы меню, панель движков с готовыми раскладками, «что скачать», монитор карты, страницы книги, создание истории с жанрами, поля персонажа, мир и правила, картинки, голос, инвентарь, тексты ошибок.

Служебные слова стадий остались русскими нарочно: это протокол между сервером и интерфейсом, а не текст на экране.

Как проверялось

Сборка сверяет ключи каждого языка с эталоном и отказывается собирать словарь, если хоть один потерян — у всех пяти новых языков ровно 211. Отдельная проверка ищет непереведённое, потерянные подстановки и пропавшие значки: чисто. Переводы прочитаны построчно; в японском нашлись латинские вопросительные знаки вместо полноширинных — поправлено.

Вживую: переключение языка истории меняет весь интерфейс, чужих подписей на экране не остаётся.

Что всплыло по дороге

Две ловушки, обе настоящие. Импорт словаря был написан через «@/», а остальной код — через «./»: сборщик считает это разными модулями и делает две копии контекста — провайдер в одной, читатели в другой. И корневой компонент не видит собственный провайдер, ему словарь нужен напрямую.

Ещё шесть списков лежали на уровне модуля — жанры, длина ответа, стадии, раскладки, адреса серверов, слоты — и застывали на языке загрузки навсегда. Развёрнуты в функции от словаря.

Мелочи

Плашка обновления больше не показывает сырую разметку релиза и не зовёт запускать батник — она говорит, что игра обновится сама. В шапке подпись про то, где что считается, пересчитывается при смене языка.


Установщик: DungeonUltimate-0.11.0-x64-setup.exe. Кто уже играет — обновление придёт само.

v0.10.0 — инструменты на своей Гемме, кадр по решению модели

Choose a tag to compare

@timoncool timoncool released this 17 Aug 21:47

Инструменты доехали до своей Геммы, кадр теперь заказывает сама модель, а копий модели в памяти больше не бывает.

Инструменты работают не только в облаке

Своя Гемма их умеет — сервер поднимается с --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 — бросок инструмента виден игроку

Choose a tag to compare

@timoncool timoncool released this 17 Aug 21:17

Починка одного вранья на экране: игра писала «Движок разрешает бросок…», а кубик не кидался.

Бросок теперь виден

Броски переехали в инструмент — модель кидает их прямо во время письма, чтобы исход был известен в том же ходу, а не в следующем. Но инструмент отдавал результат только модели: ни строки в журнале, ни трёхмерного кубика. Кидали за ширмой.

Теперь бросок оставляет такое же событие, как и проход механики, а события инструментов уезжают игроку вместе с ходом, а не появляются после перезагрузки. Заодно нашлось, что проход механики затирал список событий вместо того, чтобы дописывать в него, — из-за этого пропали бы и награды.

Проверено на живом ходу через интерфейс: два броска инструментом — d20 18 против 13 → успех и d20 8 против 14 → провал, оба с записью в журнале и с крутящимся кубиком.

Стадия больше не обещает лишнего

Надпись «Движок разрешает бросок…» висела на каждом ходу, даже когда бросать было нечего. Этот проход сводит последствия хода — так и написано.


Установщик: DungeonUltimate-0.9.1-x64-setup.exe. Кто уже играет — обновление придёт само.

v0.9.0 — достижения, одновременная озвучка, звук играет сам

Choose a tag to compare

@timoncool timoncool released this 17 Aug 21:10

Игра научилась награждать, облачная озвучка перестала ждать саму себя, а звук наконец играет без клика.

Достижения

Игра сама решает, когда игрок отличился, и вручает награду: выстоял против сильнейшего, пощадил побеждённого, вынес чужого ребёнка из-под обвала. Модель просит награду инструментом, а движок проверяет: повторить уже полученное нельзя, чаще раза в двенадцать ходов — тоже. Награда не выпрашивается: её нельзя выдать себе, о ней узнают постфактум.

Живут достижения в профиле игрока, а не внутри истории. Удалишь историю — награда останется и будет помнить, где заслужена. У них свой раздел в правом меню: значок, название, за что выдано, редкость, история и день. В ленте — короткая карточка: медальон, название цветом редкости и повод.

Значки

Весь пак 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 — карта делится честно, отмена работает

Choose a tag to compare

@timoncool timoncool released this 17 Aug 19:20

Версия про то, что игра перестала врать и подвисать. Каждая находка ниже вскрылась на живом прогоне, а не на бумаге.

Распознавание речи ожило

Оно висело намертво: ни ответа, ни ошибки в логе. Библиотека 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 — карта, процессор или облако на выбор

Choose a tag to compare

@timoncool timoncool released this 17 Aug 17:30

Стало понятно, чем считается ход, и что вообще нужно скачивать.

Карта, процессор или облако — на каждую стадию

Игроки жаловались, что непонятно, где что генерируется: у одного на процессоре, у другого на карте. Причина была настоящая — у каждой стадии был свой тумблер, и означали они разное:

  • у рассказчика — «слоёв на карте», число;
  • у картинок — «выгружать на процессор», хотя это про хранение весов в памяти: считает всё равно карта. Галка стояла по умолчанию, и человек думал, что рисует процессор;
  • у распознавания — переменная окружения;
  • у озвучки не было ничего: там намертво стояла карта, и на машине без неё озвучка падала.

Теперь один общий выбор и переопределение на каждую стадию, переключатель в три положения: Карта · Процессор · Облако. Настоящий выбор устройства для картинок отделён от выгрузки весов — в движке это разные вещи.

Панель показывает не выбор, а итог: чем стадия считается на самом деле, с учётом общего выбора и включённого облака.

Загрузка компонентов

Три ступени нужности вместо «да/нет». Раньше всё, что не обязательно, выглядело одинаково необязательным — голос и распознавание речи стояли рядом с альтернативными весами:

Модель картинок Krea-2 Turbo   без него игра не пойдёт   7.22 ГБ
Движок озвучки                 рекомендуется             0.07 ГБ
Правка кадра по референсу      по желанию                0.91 ГБ

Оборванная закачка больше не считается установкой. «Файл существует» — не то же самое, что «файл целый»: обрубок проходил проверку, игра падала на загрузке весов, а качалка была уверена, что всё на месте. Теперь размер сверяется до байта.

Настройки разложены по смыслу

Шаги и сила промпта уехали в «Картинки» — это про кадр, а не про железо. Включение озвучки, параллельность и длина эталона — в «Голос». В «Движках» осталось только железо.

Мелочи

  • Иконка приложения была от другого проекта — заменена на книгу с картой подземелья.
  • Проверка на Windows не проходила с версии 0.4.0: она осталась от прежней версии игры и звала команды, которых больше нет. Теперь собирает интерфейс, гоняет тесты и линтер.

Установка: скачай DungeonUltimate-0.7.0-x64-setup.exe, запусти. Игра сама предложит забрать нужное.

301 тест, ни одного красного.

v0.6.0 — установщик и один файл вместо папки

Choose a tag to compare

@timoncool timoncool released this 17 Aug 16:44

Игра наконец ставится как обычная программа: скачал 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 — свой стиль иллюстраций и рабочие задания

Choose a tag to compare

@timoncool timoncool released this 17 Aug 16:21

Иллюстрации в этой версии перестают быть случайными, задания наконец засчитываются, а смерть героя заканчивает историю.

У истории появляется свой стиль

При создании игры отдельный проход придумывает визуальный стиль под её мир — технику, палитру, свет, узнаваемую школу иллюстрации — и дальше он подставляется в каждый кадр. Для мрачного славянского средневековья, например, выходит вот такое:

Угольная ворожба — уголь и мел по грубой тонированной бумаге, тяжёлая светотень, палитра из жжёной умбры, охры и приглушённого мха, плотная штриховка и растушёванные фактуры, драматичный свет одной свечи или пасмурного болота, отсылка к русскому реалистическому рисунку XIX века.

Раньше поле стиля было пустым, и каждый кадр рисовался в своей манере: один похож на фотографию, другой на комикс. Стиль можно поправить руками — это обычное поле в настройках картинок.

Кадры держатся друг за друга

Облачной отрисовке теперь передаётся основа: прошлая картинка этого же места или портреты персонажей. До этого облако рисовало каждый кадр с чистого листа, и сцена «переезжала» из кадра в кадр.

Что именно положить в основу, решает сам оператор кадра — он видел отрывок целиком:

  • прошлый кадр места — когда действие продолжается там же;
  • портреты персонажей — когда важно не потерять лицо;
  • ничего — новое место, где никого знакомого нет.

Промпт кадра стал промптом

Раньше оператору говорили «пиши конкретно и кинематографично», и выходила строка. Теперь у него есть порядок: кто и что делает в это мгновение, во что одет, что видно вокруг, откуда и какой свет, план и ракурс, палитра и настроение — с требованием конкретных существительных вместо прилагательных. На живой сцене выходит 1200–1350 знаков вместо строки.

Выполнение заданий засчитывается

Не засчитывалось никогда. Проход механики получает только текст отрывка, а список взятых заданий уходил рассказчику — движок не знал ни одного заголовка, который должен назвать. Теперь взятые задания уходят ему списком, с условиями и с тем, кто их дал:

📜 Предложено задание: Пропавший сын мельника — от Старый мельник
✅ Задание выполнено: Пропавший сын мельника
✨ Кайра: +50 опыта (Пропавший сын мельника) → 50

После гибели героя история заканчивается

Раньше можно было писать дальше как ни в чём не бывало: движок помечал героя мёртвым, а ход шёл своим чередом. Теперь сервер такой ход не принимает, поле ввода закрыто, а «Стереть» отменяет роковой ход — герой снова жив, и можно сыграть иначе.

Мелочи

  • Скорость речи работает с любым голосом и больше не задирает тон. Просить её у провайдера бессмысленно: Grok и Gemini параметр принимают и молча игнорируют.
  • Отговорки модели вместо награды («не указано», «не обещано») в журнал не попадают.

Установка: скачай архив, распакуй, запусти run.bat.

294 теста, ни одного красного.

v0.4.0 — задания, опыт и уровни

Choose a tag to compare

@timoncool timoncool released this 16 Aug 07:17

У героя появилось, ради чего идти дальше: задания от жителей мира и рост за их выполнение.

Задания

Задание выдаёт живой персонаж истории — мельник, стражник, трактирщица, — и только он. Если никто ни о чём не просил, задания не будет: находка, слух и надпись на стене заданием не считаются.

Игрок решает сам: Взять или Отказаться. Взятое ложится в профиль вместе с тем, кто его дал, что нужно сделать и по каким условиям оно закроется, — и держится в контексте истории, пока рассказчик не закроет его по этим условиям. Взятое можно бросить.

«Сын мельника у Чёрного брода» — от Старого мельника, +50 опыта
  Найти пропавшего сына, ушедшего к старой мельнице.
  — Найти сына мельника у Чёрного брода
  — Вернуться к мельнику с известием о его судьбе

Задания — редкое событие, а не поток: следующее предложение не раньше чем через пятнадцать ходов, одновременно открытых не больше двух. Закрыть задание в обход условий нельзя — это делает только движок по ходу истории.

Опыт и уровни

Раньше в игре стояла вечная «ур. 1»: поля опыта и уровня в листе героя были, но их никто не менял, и вырасти было нельзя. Теперь опыт идёт за выполненные задания и за то, что объявит движок по ходу боя. Новый уровень поднимает запас сил и сразу лечит на ту же величину — рост чувствуется в тот же ход.

Видеокарта больше не просыпается зря

Справка о движке картинок сама его и грузила: страница состояния спрашивает версию и устройства, а движок ради ответа поднимал CUDA прямо в процессе сервера. Видеокарта оказывалась занята тем, чем игрок не пользуется, — при том, что кадры рисует облако.

Теперь, когда кадры уведены в облако, про свой движок не спрашивают вовсе, а сам он грузится только на настоящую отрисовку. Заодно поле «загружен» перестало повторять «весы на диске есть».


Установка: скачай архив, распакуй, запусти run.bat.

Нет мощной видеокарты? Раздел «Движки и облако» → ключ OpenRouter → раскладка «Без видеокарты — всё в облаке».

292 теста, ни одного красного.

v0.3.0 — голоса по ролям и честный интерфейс

Choose a tag to compare

@timoncool timoncool released this 16 Aug 06:37

Игра стала быстрее вчетверо, реплики персонажей читаются разными голосами, а интерфейс перестал врать о том, что происходит.

Схемы моделей решают за нас

Каталог моделей OpenRouter теперь скачивается целиком, и по каждой модели игра знает: можно ли отключать её размышления, какой уровень усилия она принимает, умеет ли строгий разбор по схеме. Раньше запрет размышлений слался всем подряд — Gemini и Grok его отвергают, — а у DeepSeek просился уровень, которого у неё нет. Отсюда были пустые ответы, молчащая механика и ход на 130 секунд.

Стало 13 секунд. Кубик снова бросается.

Автокастинг голосов

Рассказчик получает список голосов с пометками пола и возраста и сам помечает каждую реплику. Женщину читает женский голос, старика — пожилой, ребёнка — детский, и один и тот же персонаж звучит одинаково всю историю.

Работает и с кавычками, и с тире — русская проза оформляет прямую речь и так, и так. Слова автора остаются за рассказчиком. Если модель забыла пометить, говорящий узнаётся по самому тексту: «вдова», «старик», «девочка» — с учётом склонений.

Видеокарта больше не просыпается зря

  • Иконки предметов рисовались на своей карте всегда — про облако этот путь не знал вовсе. Видеокарта включалась на каждой находке, хотя выбрано «всё в облаке».
  • Облачный кадр рисовался дважды: напрямую и ещё раз в очереди — двойная задержка и двойная плата.
  • Варианты действий и подсказки уходят в облако вместе с рассказчиком и не встают в очередь к карте.

Интерфейс говорит правду

  • Подпись под кадром показывала движок из настроек карты: под кадром от Gemini стояло «krea2-turbo». Теперь там тот, кто рисовал.
  • Строка состояния гаснет вместе с ходом, «рисуется кадр» появляется, когда кадр действительно рисуется, а на ожидании голоса стоит своя надпись.
  • Отказ провайдера доносится словами. Раньше при отказе тело ответа выбрасывалось, и до игрока доезжал голый номер 400 вместо «цензура Krea отклонила кадр».
  • Служебные ключи модели и её внутренние размышления больше не попадают в журнал.

Мелочи, которые заметны

  • Кеш озвучки не учитывал сам текст: после правки отрывка играла прежняя запись.
  • Правка одной настройки больше не сбрасывает остальные.

Установка: скачай архив, распакуй, запусти run.bat. Модели игра забирает сама на первом запуске.

Нет мощной видеокарты? Раздел «Движки и облако» → ключ OpenRouter → готовая раскладка «Без видеокарты — всё в облаке».

280 тестов, ни одного красного.