Разработка текстовой РПГ, часть 1.5
В общем, в этой части немного напишу про возможные варианты реализации, т.к. я еще не определилась на чем писать. Заодно по запросам трудящихся немного познакомлю с лором русскоязычной ифни, кто не в курсе.
Значит, что мы имеем. Такая общая концепция, более подробно я всё это опишу в следующих частях. Мир игры представляет собой ориентированный граф, вершины которого соответствуют локациям, а ребра - переходам. Большинство переходов двусторонние, но могут быть и переходы в одну сторону (например для порталов). Диалоги тоже являются локациями, а варианты выбора - по сути переходами между ними.
Теперь про ролевую систему. Есть 4 основных блока.
- Первичные статы при генерации персонажа
- Первичные статы полученные с повышением уровня
- Бонусы от экипировки
- Вторичные статы
Сначала вычисляются полные первичные статы с учетом бонусов экипировки, потом вычисляются вторичные статы по формуле в зависимости от первичных и от бонусов экипировки.
Существует множество эффектов, каждый из которых представляет собой скрипт, который делается вручную. В скрипте с помощью формул и условий описывается действие эффекта (например лечение или нанесение урона). Эффекты могут быть прикреплены к предметам или заклинаниям.
С предметами тоже всё просто, есть тип предмета: экипировочный или расходуемый. Экипировочные бывают тоже разных видов: шапка, ботинки и т.д. Расходуемый тип это всякие зелья и т.п. К предмету прикрепляется описание, название, список статов, рыночная стоимость, вес, прикрепленный эффект (если есть). Разницы между квестовыми предметами и обычными не существует (это моя принципиальная позиция). Инвентарь ограничивается по весу, ограничение по ячейкам отсутствует. Вес может зависеть от статов, например от силы или выносливости.
Окно торговли может запускаться как один из вариантов перехода с локации. По сути переход не осуществляется, но происходит вызов торговца из заранее заданного списка. В списке указывается название торговца, картинка и список товаров, которые он продает. Количество предметов для покупки неограниченно. Стоимость предметов всегда постоянна, обычно неписи продают именно по этой стоимости, а при покупке лута у игрока коэффициент более низкий, например 0.5. В игре так же есть класс торговец, у которого есть пассивные способности, повышающие коэфф при покупке и понижающие при продаже лута неписям.
Боёвка пошаговая с заранее закрепленным порядком действий. Чтобы было понятнее, расскажу на примере. Скажем, вариант Атаки подразумевает использование заклинания "атака". Это заклинание подразумевает выбор цели (если игра партийная), целью можно указать монстра или сопартийца. Параметр субъекта и цели атаки передается в процедуру обработки заклинания "атака" вычисляется кто кого и на сколько атаковал. Если заклинание без выбора цели, то ничего не передается. Тоже самое с предметами, которые игрок может использовать по ходу битвы. Под бафф всего один слот, замена одних эффектов другими определяется непосредственно в процедуре эффекта. Призываемые существа - это тоже баффы. Обработка баффов происходит в конце хода. Вообще, всё зависит от конкретной реализации, это примерное описание технических подробностей боевой системы.
Монстры задаются названием, картинкой, набором статов и заклинаний. Обычно они используют заклинания рандомно, но могут быть описаны и специфические варианты, например для боссов, или когда монстр-лекарь должен лечить только своих, а не выбирать цели для лечения рандомно. Обычно я для этого делаю отдельные монстрячие заклинания, которые выглядят так же, но логика их работы отличается. В них записываются принципы выбора цели, момента использования и так далее. Таким методом можно создавать цепочки заклинаний, которые будут вызывать другие заклинания, более специфические. Например главное заклинание определяет тип (атака, лечение, магия), второе определяет заклинание внутри этого типа, а третье определяет цель. Так можно без усложнения описания монстров или боевой системы создавать более сложное поведение противников.
Графический интерфейс (пример того, как может выглядеть, я кидала в предыдущей части дневника) делится на следующие блоки:
Основное окно
- Название локации/непися
- Название более крупного географического образования/гильдии непися или его профессии (в этой рпг возможно не будет)
- Картинка локации или непися
- Текстовое описание локации или диалог с неписем
- Выходы из локации/варианты диалога с неписем
- Окно статуса персонажа или группы
- Всякие дополнительные кнопки
Расширенное окно статуса
- Инвентарь
- Экипировка
- Список заклинаний/способностей
- Окно с вторичными статами
- Окно с первичными статами
Окно боёвки
- Меню с выбором вариантов действий
- Статусы персонажей
- Лог боя
Окно торговли
Могут быть всякие вариации. На чем писать такую текстовую игру? Да в принципе на чем угодно, но гуру интерактивной литературы рекомендуют не создавать велосипеды, а воспользоваться уже существующими платформами. Давайте посмотрим, что же они нам предлагают. Для начала традиционные русские платформы.
URQ
Написанный где-то в конце девяностых интерпретатор менюшных текстовых квестов. Автором этого шедевра был Корвин, а может он только какую-то версию написал, но в целом он считается родоначальником платформы. Были разные версии для DOS и для винды. По сути ничего особенного, просто комнаты, переходы по ссылкам, есть встроенный инвентарь. В версии для доса даже была поддержка звуков.
Потом чуть позже в середине нулевых появилась FireURQ за авторством Фаертона, которая и стала основной. Туда уже прикрутили всякие свистелки и перделки, которые называются ДЕКОРАТОРЫ. Можно выводить на экран спрайты, по всякому крутить их, есть поддержка слоёв, шрифтов, есть стили, поддержка несложных анимаций, например подвигать спрайт туда-сюда. Более-менее нормальная поддержка музыки и звуков, можно даже делать какие-то фейды. А в чем подвох? А в том, что URQL (это язык на котором пишутся игры) представляет собой низкоуровневый язык, на котором очень проблематично делать самые банальные вещи (например, вложенные ветвления). Поведение программы неинтуитивно и изобилует всякими неопределенностями, а нормальной документации не существует. Более-менее во всём этом разбирается всего 3 человека на земле (я не шучу): это собственно сам Корвин, это Фаертон и это Аджента. Поддержки массивов кстати тоже нет, вместо них "библиотека" которую написала Аджента, там всё основано на подстановке строк или что-то типа того. Короче, любая игра с более-менее сложной механикой потребует кастования совершенно еретического техноколдунства довольно высокого уровня. Я много по этому поводу общалась с Аджентой, и теоретически да, на фурке можно написать РПГ, но цена будет слишком высока. Лично мне проще было сделать вообще всё с нуля (буквально создать свою платформу), чем пытаться разобраться в логике фурки, которая явно не от мира сего.
Естественно, при таком раскладе фурку нельзя назвать популярной платформой. На ней не было сделано буквально ничего ценного. Активно на ней пишет 0 человек. Иногда ради лулзов Аджента запиливает лабиринт с розочками раз в 5 лет. Как-то так.
QSP
Это чудовище тоже появилось где-то в начале нулевых, за авторством спредового короля всея амстердама Byte. С тех пор практически не изменилось. Суть в том, что есть окно, разделенное на вкладки: описание локации, переходы, инвентарь и т.д. Возможности языка QSP намного превосходят URQL: можно делать нормальные ветвления, циклы, есть поддержка массивов и т.д. Тогда в чем подвох? А подвох на этот раз в том, что кусп НЕ ОБЛАДАЕТ нормальными возможностями для оформления. Ненужные вкладки можно скрывать, есть поддержка некоторых html-тегов, но далеко не всех (а те, что есть, могут работать не так, как обычно). В теории можно сверстать что-нибудь на таблицах (ну а как вы хотели? на дворе всё еще 2002 год). Эксперименты были (в том числе у меня), но естественно тут вам никаких слоёв и прозрачности. Ах да, будьте готовы, что весь текст вместе с вёрсткой разъедется и будет попячен, например если у вас 4к монитор и стоит какой-то другой масштаб шрифта (кстати точно такая же проблема есть у фурки).
Значит далее, есть QSpider - это браузерный кусп. Здесь уже есть поддержка css, то есть в теории можно сделать нормальное оформление? Да? Да ведь? (нет)
В течении десяти лет кусп не обновлялся и существовал перманентно в версии 5.7.0. Пару лет назад Byte родил версию 5.8.0, основной фичей которой стало отсутствие поддержки игр, написанных для 5.7.0. В этом году сверхразум Byte выпустил новую версию с поддержкой какой-то новой никому не нужной фигни. А я ему неоднократно говорила, что единственное, чего реально не хватает платформе сейчас - это декораторов как на фурке. Дык как бы бесполезно, мол "пишите плеер сами, я тут лучше в библиотеку добавлю новых багов". В таком ключе.
В целом, кусп всегда был более популярен чем фурка. В основном у школьников, которые изучают на нём программирование (до сих пор самые популярные темы на форуме "как сделать" и "первые шаги"). Другая категория пользователей - это пейсатели букв, которые ищут простых решений, но настолько ленивы, что не хотят даже изучать ренпи (привет человеку-ранобэ). Ну и третья категория - это разработчики порно-игр. Одно время кусп был флагманом в этой области и существовало параллельно два сообщества: официальное и намного более многочисленное стороннее, которое пряталось в тени и занималось своими черными делами.
Если так подытоживать, кусп не дал миру особо никаких игр, возможно стоит выделить только Асатаму 1, Асатаму 2 и Асатаму 3 Кирдана. Это как раз текстовые РПГ, но вообще не в моём вкусе. Хотя довольно проработанные и масштабные.
Пару слов о комьюнити куспа. Это буквально полюс фекалий внутри и так довольно токсичной ифни. ТАКОЙ концентрации людей Говна вы не найдете вообще нигде. Буквально заповедник всякой мерзости собранной со всей планеты.
Instead
Появился во второй половине нулевых, а создал его Петр (gloomy). Суть примерно такая же: интерпретатор текстовых квестов. Но возможности на совершенно ином уровне: можно написать что угодно, люди писали даже платформеры. Но надо знать язык Lua. Там всё прям объектное, можно применять объекты к объектам, кликать одно на другое и так далее. Идея, насколько я поняла, сделать гибрид текстовых квестов и графических, типа сиерры, где можно походить, понюхивать, полизывать всякие предметы и т.д. Вот инстед это всё позволяет, можно ссылками выделять объекты, кликать на одни, потом давать взаимодействие другим и т.д. (кстати! в последней версии фурки тоже ввели подобный функционал). Возможности для оформления тоже довольно широкие, даже те, что идут из коробки. Многие игры на инстеде сделаны очень красиво. Но это всё требует чтения документации и какого-то более основательного похода, что естественно не подходит для большинства иферов, которые люди искусства, тонкие гуманитарии и художники, т.к. тут думать надо. С другой стороны инстед облюбовали линуксоиды и возникло довольно мощное и многочисленное комьюнити, которое сейчас конечно уже подзатухло (полностью умерло).
Инстед, я бы даже сказала, обладает каким-то своим вайбом. Большая часть игр - это либо закос под советскую фантастику, либо побег из лифта/туалета. Ну или поиск кота. Это самое адекватное и ценное, что родила русскоязычная ифня. Если я бы стала рекомендовать поиграть во что-то из ифни, то это инстедовские игры. Кстати спрашивали про Дракошу, это Khalemone Thaal (или как-то так) тоже из инстедовского комунити, один из двух человек, который прошел мою рпг хаха.
Кстати да, надо упомянуть, что инстед это не только менюшная, но и парсерная платформа. У них это называется МЕТАПАРСЕР. На данный момент, это считается типа самым крутым русскоязычным парсером, потому что всякие RTADSы нервно курят в сторонке. Но понятное дело, что это всё детские игры в сравнении с нейросетями...
Это три основные платформы русскоязычной ифни. Если брать зарубежные платформы, то там в основном twine, а это веб, а значит сразу нафиг. Есть конечно еще куча всего: вымершие платформы, веб-платформы, вымершие веб-платформы. Хотя, если уж так честно, то они все уже вымершие, а вся движуха идет на самоподдуве и вливании денегов Аджентой для призовых фондов. Ифню можно сравнить с больным на искусственном жизнеобеспечении. Абсолютно бесполезное и бессмысленное существование: никто не любит текстовые игры, никто в них не играет и почти никто не пишет (просто боятся в этом себе и другим признаться). Чтобы заставить людей делать это, проводятся всякие мероприятия, типа конкурсов, паровозов и т.д. Зачем? Я давно задаюсь этим вопросом, видимо Аджента связана положительными воспоминаниями о своей молодости, когда в комьюнити еще было весело. И когда оно еще было живым.
Тяжелая артиллерия: Godot, GameMaker и т.д.
Это универсальные платформы на которых можно делать что угодно, но минус в том, что придется создавать кучу всего с нуля: системы локаций, инвентаря, статов и т.д. Одну рпг я уже писала на годоте, поэтому кое-какие наработки остались, что может сильно ускорить процесс. В целом, годот довольно приятный в плане разработки текстовых игр. И освоить значительно проще, чем некоторые ИФ-платформы...
Свой движок
Тоже самое, что предыдущий пункт, только с нуля придется делать еще больше вещей, например визуальный интерфейс. Но и тут у меня есть наработки, так что этот вариант тоже не отпадает!
Если так подытоживать, я не знаю на чем писать. Варианты с куспом и фуркой - это чисто для фана и развлекухи, такой своего рода челлендж, написать игру в неудобных условиях. Если брать по критерию удобства инструментария, тут однозначно годот, либо самописный движок. Иногда у меня в голову закрадывается крамольная мысль написать РПГ на инстеде, но стоит ли оно того? Это тоже фановый вариант, но комьюнити ифни для меня мертво, поэтому как-то уже неинтересно.
В общем, вот такие дела. Оставлю напоследок опрос для развлекухи. А так, посмотрим будет ли смысл продолжат. Вроде ставите много лайков, но понятно что это чисто из-за пиетета, а так особо никто не читает. Тоже как бы не самая здоровая тема фармить мне репу таким способом. В общем, напишите что думаете. Может предложите какие-то альтернативные варианты? Я вообще открыта для изучения всего нового. Только не UE и не юнити, пожалуйста, я всё-таки пишу текстовую игру!
P.S. Если следующая часть будет, то наверное про редактор локаций.
- 05 ноября 2024, 04:16
- 06
Cryengine!
Он разве не платный? 🤔
Нет, у него открыт исходный код, но нужно заявку подать.
Ну всё, значит решено.
Instead - классный движок, изучал его, когда заинтересовался такими играми. Конечно, играл в Возвращение квантового кота. Очень, очень понравилась игра и движок. Он все платформы поддерживает. Классная вещь, но, разумеется, ограниченная любителями данного направления. Хотя...
Выбор движка зависит от требований. На любом можно сделать текстовую игру, только зависит от трудоемкости, где-то подготовлено для этого, а где-то нет. Тот же RenPy и его аналоги дадут такие же возможности. Предложу составить чёткий список необходимых задач для инструмента как для самой игры (например, ты захочешь добавить красивых эффектов с использованием шейдеров), так и для "не игровых" возможностей. Например, поддерживаемые платформы, или если ты хочешь выходить на игровые площадки, то нужно (скорее всего) встраивать какие-то библиотеки, SDK. Позволит ли выбранный движок это сделать легко? Ну или с большей трудоемкостью сделать вообще? Конечно, потом ещё субъективные желания будут брать вверх, то уже будет отфильтрованный список.
Не понял про веб. Ведь у Twine есть версия редактора для ПК, чтобы работать в офлайне. Это не предложение движка, а просто интересно.
Дак а qspider тоже работает в офлайне, например. Просто стойкое отвращение ко всей этой теме с вебмакакингом, жаваскриптами и цсс. Вот ВООБЩЕ неохото заниматься с этим, потому что работает всегда через одно место. У меня исключительно негативные впечатления от всей это фронтендовой идиотии.
Ну, JavaScript это просто язык, который несильно от других и отличается. К нему можно также относится как к скриптовому языку (аналогично, Lua, AngelScript и т.п.). С веб-технология понятно, это отдельная тема. В движках обычно, это не обязательное применение (есть встроенные функции), а скорее расширенные возможности. С таким подходом, тебе точно лучше использовать игровой движок типа Godot, Defold, Solar2D и т.п. Тут уже на вкус и на требования.
По идее да, потому что посоветовали например сделать анимацию фона или границ окон с текстом и чето думаю, что неплохо бы и шейдеров для этой цели накатить... Хотя многие эффекты такого плана могла бы и без них сделать.
Ещё есть конструкторы GDevelop или Construct. В первом есть ещё диалоговая система. В принципе, тоже подходит, но помнить по Гаминатору 27 опыт работы с кодом есть, так что, возможно, это лучше вариант.
Макет в прошлом посте выглядит похожим на консольное приложение, я бы делал такой на BearlibTerminal (по сути это терминал на стероидах, хотя там и картинки можно выводить). Но там чисто вывод символов, так что этот вариант ближе к "свой движок" чем к годоту, даже кнопки и окошки придётся самому делать.
> Вроде ставите много лайков, но понятно что это чисто из-за пиетета, а так особо никто не читает
Я читаю с удовольствием и уверен что не я один, главное чтоб тебе это игру пилить не мешало - каждый день потраченный на написание постов это день отнятый у разработки игры и всё такое.
Интересно, надо будет глянуть.
Жалко конечно что нету явы...
там dll которую можно из любого языка вызывать, из java тоже (с помощью JNI). Другое дело конечно что если цель сделать игру то не уверен что есть смысл этим заморачиваться (я из беглого гугла понял что JNI требует писать бойлерплейт, JNA тормозит а в новых версиях запилили какой-то Panama).
Удивительно, но именно после этого комментария я нашёл-таки устраивающую меня библиотеку с виртуальным терминалом под jvm, который искал уже год, вот она — моя прелесть. Правда она на котлине и во всю обмазана корутинами, так что из джавы её дёргать будет весело, но я так-то больше по котлину.
Только вот есть один маааленький нюанс. Для разработки твоей игры терминалы вредны. Потому что звучит-то всё круто, хардкордный минимализм, стилистика и всё такое, а на практике выясняется, что рамка интерфейса по ширине равняется не паре пикселей, а паре символов. А ещё окно терминала может меняться в размерах и расположение интерфейса надо или пересчитывать вручную или пользоваться сторонними библиотеками, что уже на минимализм тянет слабо. А ещё размеры окна терминала могут не только легко измениться, но и поменять соотношение. Было 4х3, потянули, растянули, стало 9х16 и либо ты забиваешь на это и фиксируешь разрешение, чтобы игра не расползалась либо начинается адская вёрстка кучи макетов под разные соотношения сторон. Ах да, так же не забудь, что система сохранений, система проигрывания музыки/звуков а так же система создания дистрибутивов в сделку не входили, так что их тебе тоже придётся либо делать либо подключать сторонние библиотеки.
Нет, терминалы имеют свою нишу. На BearlibTerminal активно пилят роглайки, которые не современные, а с символьной графикой; я терминал искал, потому что хотел сделать что-то типа Undum, только без привязки к js и браузеру.
Для данного же проекта могу посоветовать Godot — он и бесплатный полностью, и редактор интерфейсов в нём на уровне мировых стандартов разработки (в нём даже можно сделать классический для веба адаптивный интерфейс), дистрибутивы под ПК и веб формируются одним нажатием (с андроидом сложнее, так как все приложения под него нуждаются в подписи разработчика), да и свалить заботу о ресурсах на движок будет не лишним. Единственное, с Unity, Construct и т.д. я почти не знаком, может там всё ещё лучше.
В принципе, меня это не особо пугает, уже просто делала игру, где практически всё с нуля было: система гуи с отслеживанием координат курсора, кнопки там, масштабирование и т.д. причем всё чисто на процедурных принципах, без использования ООП (хотела сама наглядно убедиться, что разработка в процедурном стиле ничем не сложнее чем в объектном, и это оказалось действительно так). Но вообще как бы да, склоняюсь к годоту, там и отрисовку можно сделать как мне надо, и кнопки уже готовые только забиндить, и если че еще шейдеров нафигачить, еще есть прикольная система частиц для погодных эффектов например, чтобы вручную не писать, туманы там всякие тоже...
P.S. Не по теме: у меня тут начали комменты пропадать, одмэн отмалчивается, так что пока издательский дом закрывается до выяснения обстоятельств, а то запощу и опять удалят, ну его нафик.
Это не хорошо. Причину надо знать.
Нет, всё вполне понятно... Просто слишком много политики было в комментариях.
Интересно пишешь, аж захотелось самому текстовую рпг сделать
Вот. Ради этого и пишу.
Собственно лет 10 назад я как раз и выбрал FireURQ. Эх, я тогда хотел "свой текстовый системшок" сделать, что по атмосфере, что по рпг-шности (очень низкой).
Забавно, выходит у меня "чёрная жижица" на станции атаковала и покромсала всех ещё до того, как это стало Prey 2017.
Наверняка есть какие-то готовые "модули", хотя я сам не любитель (не умею) ими пользоваться. Но в ГМ есть точно один минус, если хочется красивостей в тексте — там нет rich text т.е. всех этих жирных, курсивов и вставления картинок прямо в текст. Ну, из коробки нет, а сторонними решениями — есть.
Кажется, я знаю что я буду делать на следующий проект!
Выбрал в опросе "свой вариант": Считаю что на чём лучше лично пишется — на том и писать. Ну а вообще есть ещё РенПай, но как я понимаю это больше визуально-текстовые игры. Наверно, взвешивая всё, то можно было бы подумать о Godot как реальном выборе, особенно если есть какие-то модули. Но и ГеймМейкер не скидывал бы, хоть и с натягом.
Ren'Py
Хех, а сайт урк.плут.инфо ещё жив... Респект плуту! Сейчас посмотрел там, 11 лет назад в 2013 написал свою первую на urq игру для конкурса. Перед фуркой мощным прорывом казался интерпретатор от акеллы, звался, соответственно - Akurq. Он позволял свободно относительно координат демонстрировать картинки. Вот для него я писал и для досурки. Сразу две версии запилил, на досурке без картинок, естественно. В фурке кое-какого функционала до сих пор (я предполагаю) нет, а Акурк мог реализовывать некоторые фичи заимствуя их у html.
Что хочу сказать, не понял фразы про проблемы со вложеными ветвлениями и массивами. Мои знания достаточно примитивны, но язык мне показался очень гибким, удивило, что он, например, позволяет игроку генерировать названия переменных.
Это не баг а фича!))) Когда-что-о не работает как задумывал, то просто попробуй написать это через жопу чуть по-другому.