Серия «Thread Of The World»

2

Выходные и тизер игры

Серия Thread Of The World

Я ранее писал про игру, которую делаем вдвоем с женой Делаем онлайн-книгу-игру вдвоём

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

1) Сварил кастрюлю рассольника

Это довольно большая чаша и глубокая и там не ложка, а пластиковый половник

Это довольно большая чаша и глубокая и там не ложка, а пластиковый половник

тарелка

тарелка

2) Добавил ИИ для чата дома: она (её зовут - Машка) анализирует и описывает, что видит на фото с камер (почему-то видит мужиков без штанов на улице) и умеет искать майки и кепки на Озоне.

Фото не из Макса, бот не умеет слать туда сообщения.

Фото не из Макса, бот не умеет слать туда сообщения.

3) Сделал ролик игры. Музыка может и странная, но она очень хорошо наложилась по хронометражу, ну и по моему вкусу. Если б делали с женой, она бы выбрала волынку или еще какой-нибудь фолк

Музыка: Infraction — «DOOM Cinematic Metal»

Показать полностью 2 1
1

SD Studio: свой Midjourney на своей видеокарте с LLM-помощником

Серия Thread Of The World
Скриншот программы

Скриншот программы

Краткое резюме: это не туториал, как работать с Automatic1111. Тут про open source desktop приложение, которое позволяет работать с A1111 просто.

И это не аналог ComfyUI. Другое приложение с другим функционалом.

Сперва — откуда взялась идея?

Мы с женой делаем текстовую игру по её фэнтези-вселенной. Что-то вроде совместного хобби: ей интересно писать, мне нравится программировать. Но суть не в этом. Рисовать никто из нас не умеет, а картинки в тексте нужны.

Сейчас это не проблема — нейросетей куча, особенно для генерации изображений. Но есть минусы: на платных сервисах можно хорошо так разориться, особенно для пет-проекта. Есть решение — Stable Diffusion, генерировать на своей видеокарте.

Первые шаги с Stable Diffusion

Для работы с локальным SD есть несколько инструментов. Взял первый и, наверное, самый популярный — Automatic1111. Сгенерировал — получил полную фигню. Начал читать, что пишут. Оказывается, уже создано огромное количество предобученных моделей и LoRA для добавления тех функций, что модель не умеет. Результат стал сильно лучше.

Дальше — промпты, то есть текстовое описание того, что мы должны получить на итоговом изображении. Там тоже есть свои рекомендации. Модель не читает мысли пользователя, ей нужно более точно и в понятном ей виде предоставить описание. Дополнительно разбираемся с настройками генерации — samplers, steps и т.д. Всё осуществимо, но получаем другую проблему: для генерации одной картинки мы очень долго подбираем все эти значения и тексты.

Первая автоматизация

Чтобы упростить процесс, я сделал следующее. Для наполнения контента в игре есть админка. Дополнительно в отдельной папке лежат файлы со всем лором книги/игры.

В итоге я написал код для связи с запущенными на игровом ПК в локально сети ИИшками.

— для общения с локальной LLM (Large Language Models, проще говоря, программа которая использует предварительно обученные модели ИИ и доступные для запуска локально), которая по нужному запросу берёт необходимый контент из папки с лором и составляет корректный промпт для SD.

— для SD, где заданы предварительные настройки: используемая модель, LoRA и вместе с промптом всё это отправляется в SD, и мы получаем итоговую картинку. Несколько попыток, потому что с первого раза вряд ли получим нужное. Получаем более-менее адекватный результат и идём в Photoshop — убрать лишнее, сжать и т.п.

Уже лучше, но не идеально.

В определённый момент я захотел подобное, но для другого контекста, с другой моделью и прочим. Можно переписать под нужды. А если опять захочу что-то другое? Снова переписывать?

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

Почему десктоп

Что мне было важно: работаю я на Linux, жена на Windows, на диване я лежу с макбуком. LLM и SD запущены на игровом ПК с Windows.

Можно было сделать веб-проект, но мне захотелось десктоп-приложение.

В итоге получилась SD Studio.

Как это выглядит и работает

Генерация по тексту

На странице Generate выбрали пресет (ниже напишу подробнее), пишем текст, жмём Generate, ждём и получаем результат.

Наш кот

Наш кот

Что такое пресеты? По сути, это сгруппированные настройки с предустановками: какие модели, LoRA-файлы и параметры использовать для генерации картинки. Плюс там есть свой промпт, на основе которого LLM дорабатывает ваше текстовое описание, чтобы получить итоговое изображение в стиле пресета — аниме, кино, реалистичное и прочее.

Если не знаете, какой пресет выбрать — на вкладке Generate есть кнопка для рекомендации. LLM знает все ваши пресеты и советует лучший.

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

Какой в этом смысл? Модели обучены по-разному, и фантазия у них сильно отличается. Очень много моделей, которые обучались на корейских девушках — умеют идеально рисовать кожу, людей, объекты, но с фантазией у них беда. А есть более простые в плане картинки, но с богатой фантазией. Pony, к примеру, очень хорошо придумывает, но результат сильно анимешный. Поэтому такую модель можно объединить в пайплайн и получить богатую на детали и красивую по реализации картинку.

Интеграция с локальной LLM

Есть провайдеры для работы с:

  • LM Studio — я начинал работу именно с этим инструментом

  • Ollama — сейчас использую, так как работает демоном, меняет модели по запросу и имеет удобный CLI

  • llama.cpp — самый шустрый инструмент, но с критичным для меня минусом: не меняет модели запросом через API

Зачем менять модели? В настройках SD Studio надо указать две: для генерации промптов из описания и для анализа изображений.

Generate From Image

Получили картинку, всё хорошо, но хочу другого кота. Открываем From Image.

Наши коты

Наши коты

Главные возможности:

  • Перерисовать картинку нужным пресетом

  • Inpaint — изменить часть изображения

  • Smart Remove — по сути тот же inpaint, но отправляет выделенную часть в LLM. LLM пытается понять, что там и какой фон вокруг, составляет промпт для inpaint и отправляет его в SD. В целом работает, но иногда лучше сделать inpaint руками.

Сессии

В процессе использования натолкнулся на проблему: добавил фото, изменил определённые части, нажал Export для сохранения. А там последняя генерация с кривой картинкой. И никакой отмены, нет возможности откатить последнее действие.

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

Multi-Scene

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

Я перебирал различные варианты из интернета для составления правильных промптов. Но реально работающим вариантом оказалось создание сцен генерацией нескольких элементов. Пишем текстовое описание сцены, LLM находит описание фона и всех персонажей и на форме предлагает разместить найденных персонажей — дополнительно можно поправить промпты для каждого.

Мульти-сцена

Мульти-сцена

Потом генерируется несколько изображений: для фона, для каждого персонажа отдельно в заданном пресете. Дальше появляется ещё один инструмент — Rembg (если мультисцены не нужны, можно его не использовать, да и SD сама может вырезать, но будет коряво). Rembg аккуратно вырезает персонажа и вставляет на фон. И ещё один шаг — обрабатываем итоговое изображение нужным пресетом ещё раз, иначе видно, что персонажи «вклеены» в картинку.

Детский режим

Отдельная фича - в настройках есть возможность включить KIDS-mode. Задаем пин-код и у ребенка станут не досутпны некоторые функции программы и, дополнительно, LLM пытается ограничивать опасные запросы.

Остальные инструменты

Batch — генерация картинок кучей. Иначе приходится долго тыкать Regenerate, пока не получим нужное. А так будет 10 картинок, из которых выбираем лучшую. И главное: работа с локальным GPU — это не очень быстро. Можно настроить Batch и пойти заниматься своими делами.

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

Стильные коты

Стильные коты

File Browser — чаще всего требуется работать с одной папкой, например, в пет-проекте, где мы храним изображения. Из File Browser можно сразу загрузить картинку, к примеру, в Generate From Image.

Для чего еще использую SD Studio?

К примеру, жена занимается хенд-мейдом, делает косметику и гидролаты. Пофоткал баночки на столе, обработали в программе:


SD Studio — open-source проект под лицензией AGPL v3. Все данные остаются на вашей машине, облако не используется.

GitHub: https://github.com/Zazza/sd-ai

Стоит добавить, у меня локально RTX 4070 Ti Super 16GB Vram, на видеокарте с меньшим объемом видеопамяти не тестировал, и вряд ли стоит это делать.

Показать полностью 5
4

Делаем онлайн-книгу-игру вдвоём

Серия Thread Of The World

В детстве у меня была книга-игра. Вы наверняка знаете этот формат: читаешь, делаешь выбор, переходишь к нужной главе. И еще бои - кубики и пишешь в тетрадке кто кого как стукнул. «Лабиринт Колдуна» Юрия Пульвера, 1991 год. Я проходил её много раз.

В начале этого года я решил перенести эту игру на ПК. Не просто оцифровать, а сделать полноценную игру с боями и выборами. Вообще, я хотел сделать свою игру с блекджеком и чтобы можно было грабить караваны. Но начинать с нуля сразу на амбициозном проекте — плохая идея.

Шаг 1: «Лабиринт Колдуна» как тест

Сперва хотел проверить стек: Go на бэкенде, Vue на фронте, Symfony для админки. Нужна была простая книга-игра для обкатки.

Выбор пал на «Лабиринт» — детская ностальгия плюс компактный материал (хотя, по правде говоря, там оказалось куча логики, которую сложно описать обычной структурой базы данных и обычными алгоритмами).

Что я сделал:

  • Движок для секций (читаешь текст → выбираешь → переходишь)

  • Боевая система с кубиками

  • Админка для заполнения контента

  • Простая регистрация с логином/паролем и авторизация

Запустил. Работает. Стек себя оправдал. Но сама реализация «Лабиринта» не очень интересна — это же чужая книга, там не разгуляешься.

Шаг 2: «Нить мира»

Как оно выглядит

Как оно выглядит

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

Мир называется Терралия. Если коротко: есть энергетическая ткань мира — Мага. Некоторые люди (ткачи) видят её нити и могут ими управлять. Есть культ, который использует других людей как «катушки» для починки разрывов в этой ткани. Один герой — медик с сердцем морского духа. Вторая — беглая ткачиха из культа. Третий — воин с мистической рукой.

Каждый герой проживает свою историю, а потом их пути пересекаются.

Дополнение от меня: можно было постараться просто издать книгу-фентези. Но авторов со своими мирами очень много. А попытаться сделать из нее, как раз книгу-игру в таком формате это уже другое.

Но тут нужно было адаптировать под новый формат. В книге, как таковых боёв не было. Поэтому отдельной задачей для неё стало придумать бои и вписать их в общий лор. Моей же задачей стало придумать, как эти самые бои реализовать в формате текстовой книги-игры.

Тут подробнее:

  • Кубики. По правде говоря, они мне не нравятся :) Да, это стандарт для подобных игр, но это случайность, как таковой тактики тут нет. Плюс, я посмотрел реализайции сущестующих игр-книг и бой выглядит так: выбрали чем бить - бросили кубик - резльтат. Ходит враг - бросил кубик - результат. Как по мне, не сильно захватывающая механика.

  • Статы для персонажей: Сила, Ловкость, Интеллект и Воля.

  • У нас уже есть три героя и у каждого своя фишка. Но требовалось сделать бои более тактическими, а не просто - бью, лечу и кастую защиту.

  • Каждый герой играет по-разному:


Анвар — танк.

* сагривает врагов на себя (значит в свой ход враг будет нападать именно на него),

* отталкивает (боевого поля нет, но есть текст, поэтому "отталкивать" — откинуть противника и он потратит ход на встать и подойти. И да, толкнуть можно только более слабых противников + рандом),

* бьёт мечом.

Кид — ткач.

* бьёт энергией,

* вешает щиты на союзников,

* связывает врагов - пропуск хода, но зависит от ловкости.

Хишоре — медик.

* лечит,

* кидает дротики,

* может крафтить предметы прямо в бою (аптечки и дротики или еще какой-нибудь самодельный "бабах")

  • У каждого персонажа своя «Воля» — это не HP, а эмоциональный ресурс. У Хишоре от стресса начинаются панические атаки (пропуск хода). У Кид — ярость, и она может ударить союзника. У Анвара — рука исчезает (слабее бьёт и меньше защита). Это делает бои не просто «бей-лечи», а заставляет учитывать состояние персонажа. Дополнительно у вех есть наывык "Концентрация" - если воля упала - восстановить часть. Если же воли много - получить бонус с критически ударам.

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

  • NPC тоже могут участвовать в бою. У них аналогичная система агро. Плюс у персонажей игрока есть способность "попросить помощи". Если у NPC есть силы - он "сагрит" врага. И он, в свою очередь, также может попросить помощи у игрока.

Случайный бой для тестирования в который я добавил всех персонажей, NPC и двух врагов

Случайный бой для тестирования в который я добавил всех персонажей, NPC и двух врагов

Что уже работает

  1. Сам бекенд. Выводит текст глав, предлагает варианты для перехода по главам. И еще куча логики. И такм же **Боевая система.** - пошаговая, через WebSocket. С теми механиками что описаны выше.

  2. Фронтенд. Простенький "сайт", который через REST-API общается с бекендом в синхронных запросах и через WebSocket в бою.

  3. Админка. Вся история забивается через админку — секции, враги, NPC, переходы, лут.

Картинки

Еще нужно уточнить про картинки. У нас нет художника. Но я программист и люблю играть в игры. Поэтому у меня есть RTX4070TI Super и 16GB VRAM ))

На игровом ПК запущены локальная LLM модель и StableDiffusion с выбранной моделькой.

Есть отдельный проект, где описывается весь лор с помощью Markdown.

В админке сделаны интеграции с запущенной в локальной сети LLM и StableDiffusion для генерации картинок.

В отдельной секции админки пишем обычным человекопонятным языком что нам надо. Этот текст уходит в LLM, та берет необходимый контекст из папки с лором (только необходимый, так как весь не влезет в контекст бедной локальной LLM) и на основе лора (и предзаданного текста для нужной модели в StableDiffusion) формирует prompt для генерации картинки. Затем отдаёт его обратно в админку.

Админка получает промпт. И с выбранным пресетом (генерация картинки для вставки в текст главы или малнекьая картинка для инветаря) шлет его в StableDiffusion. Та уже создаёт картинку и отдаёт результат в админку.

Проверяем сколько пальцев, глаз, подбородков, и генерируем заново или если результат устаривает — кликаем сохранить.

Аналогично локальная LLM в режиме чата может давать подсказки по лору: предложить статы персонажу и подобное. Адекватный текст она создать не может. Вот её попытки:


"Начав свой путь, Анвар начал идти по дороге. Вскоре он услышал громыхание копыт — это был медведь, который вышел из леса и направился на запад. "

"Прежде чем покинуть пансионат, он позвонил соседу-старичку, чтобы узнать дорогу.

«Давай», — сказал старик, расправив пальто."

Генерация картинки

Генерация картинки

Общение с ИИ

Общение с ИИ


Что не так (честно)

Контента мало. Пока пишем три пролога (для каждого игрока).

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

Два человека. Бэк, фронт, админ, девопс — это я. Лор, текст и наполнение админки - жена.

Что дальше

Планы такие:

1. Заполнить контент для прологов полностью + бои в прологе → дать поиграть знакомым → собрать фидбек

2. Сбалансировать бои

3. Сделать социальный элемент — «Нити». Игроки оставляют записки после прохождения секций, видят следы друг друга. Не чат, а асинхронные послания (Dark Souls, Death Stranding)

4. Запустить для всех

Вопрос к вам

Собственно, мне интересно:

- Кто вообще играет в текстовые РПГ / книги-игры?

- Что важнее для вас в такой игре: история или механика (бои, выборы, прокачка)?

- Привычные книги-игры или интерактивный формат в браузере?

PS. Я бы завел телеграм канал и писал там о процессе, но я не умею. Жена завела сообщество в VK, там почти никого нет.

Показать полностью 4
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества