Задача интерактивного написания: Проектирование нелинейной RPG, такой как Esoteric Ebb

Esoteric Ebb захватывает Steam штурмом – но как создается такая сюжетная CRPG с разветвленным сюжетом? В этом гостевом блоге Кристоффер Бодегорд рассказывает о сложных решениях в дизайне сюжета и о своем восьмилетнем пути к тому, как научиться управлять созданием по-настоящему нелинейной истории на основе диалогов.
С момента первого публичного тестирования Esoteric Ebb Еще в 2023 году мне снова и снова задавали один простой вопрос: “Как вы отслеживаете всё??” Это хороший вопрос – сложный. Скорее всего, я отвечал на него разными способами на протяжении многих лет, но никогда по-настоящему удовлетворительно... Так что давайте попробуем.
(Но сначала немного информации об Esoteric Ebb)
Эзотерическое течение - это масштабная, ориентированная на повествование, нелинейная CRPG. Нет традиционного боя, почти полностью основанный на диалогах, время игры где-то между 45 минутами и 50 часами, и так, так много выбора... Настоящий выбор, тот, который активно меняет ваш опыт фундаментальными способами вплоть до титров. Да, это одна из тех игр. И на его создание ушло немало времени: около восьми лет от начала до конца, половину из которых он провел в бездействии, сидя один в комнате и учась делать это интерактивное написание.
Три ограничения интерактивного письма
Я определяю интерактивное письмо в рамках трех несколько произвольных ограничений/целей. Это:
- Высокое соотношение выбора к тексту
- >50% контента является динамическим
- Открытая конструкция
Принимайте или оставляйте их по своему усмотрению, но если вы достигнете этих трех пунктов, то у вас будет рецепт интенсивного (потенциального) положительного игрового влияния. Но сразу же, взглянув на это, у вас может возникнуть несколько тысяч проблем.
Давайте разберем их.
The pale man holds incredible power, if he is able to bypass the esoteric limitation. #int #DC10
"However, I suggest you speak with Lady Sageleaf about this, if you require answers. I am simply a middle-man in this." #Visken
-(riverHub)
+.Snell==1-"Snell." \(Look at him.\)
The goblin gives you a conflicted expression. #Snell
"I... didn't know, Cleric. I really didn't." #Snell
"He did not." #Visken
"Lady Sageleaf instructed me to not inform anyone. Even her own agents." #Visken
"No need to be paranoid." #Visken
++"How can I not be paranoid? Everyone's lying to me!"
"Correction: I was lying to you. Lady Sageleaf, potentially as well." #Visken
++"True. It's just some esoteric bullshit."
"...Indeed." #Visken
--
Snell scratches his chin. #Snell
"I'm not entirely sure how to feel about this." #Snell
"The Old Lady isn't one to spend money on resurrecting a city cleric." #Snell
"But I'm guessing she didn't want to wait for another one to appear?" #Snell
"Hm. We should go speak with her. But... remember that she paid for your resurrection, Cleric." #Snell
++"That is true. She seemed nice enough."
"...I wouldn't use 'nice'. But she's at least very, very competent." #Snell
++"I'll refrain from commenting until I hear her side of it."
"Smart." #Snell
++"I'm not sure I believe you."
"That's okay." #Snell
"But really, I'm not sure what I would gain by lying about this." #Snell
--
The goblin is telling the truth. You can read it in his eyes. #wis #DC14
It was a LIE. But it was a LIE for <b>expediency</b>... #con #DC9
+"What spell did you use to revive me?"
He is quiet for several seconds. #Visken
Considering if he should share this knowledge. #wis #DC13
A modification, then. #int #DC12
A <i>personal</i> resurrection spell. #reply #int
"<i>Raise Dead</i>." #Visken
"With changes. It is not the original spell, as I'm sure you understand." #Visken
<i>Visken's Raise Dead</i>. #int #DC12
"My spell requires a higher cost, while lowering the spell's complexity in return." #Visken
++"A higher cost? Like... a blood-cost?"
"No, Cleric." #Visken
++"What do I owe you?"
"Nothing. Lady Sageleaf offered to pay it in full." #Visken
++"A higher crown cost?"
"Yes, Cleric." #Visken
--
"The new cost is doubled. One thousand crowns." #Visken
"Which is not too bad." #Visken
++"My life is worth much more than that, yes."
++"Eh. Could be better."
++"Waste of money."
--
The pale man stares at you. #Visken
+"Is this why I lost my ability to cast higher level spells?"
"Potentially." #Visken
"Whatever issues your body and soul appeared to have had with my spell, it was not permanent." #Visken
++"Yeah, I've rebounded quickly."
"Yes indeed." #Visken
++"I'm just that awesome of a wizard, I guess." #.WIZARD+=1
"Of course." #Visken
++"My soul <i>and</i> body?"
"It's more common than you might think." #Visken
+"I felt really weird when I woke up. Like... different. Is that your dark magic also?"
"That can happen, yes." #Visken
"As it can with any resurrection magic when a soul is given sufficient time spent away from its body." #Visken
++"So my soul is ruined?"
"No." #Visken
++"I like this new me."
"Wonderful to hear." #Visken
++"I don't think the difference was that big, honestly."
"Good." #Visken
++"Can I go back to my old self?"
"No." #Visken
--
His cold voice shows no interest in your personal business. #wis #DC10
Eh. Whatever changed, it was probably for the best. #dex #DC16
Still got your wits about you. That's what matters. #reply #dex
At least you are still highly intelligent. #int #FC8
That is all that matters. #reply #int
Soul magic is complicated. Not even the greatest Arcanists were able to unlock all of the secrets of the <i>inner light</i>. #int #DC15
Perhaps one day, you will. #reply #int
+"Right. I'll... go speak with Lady Sageleaf."
"Good idea." #Visken
The pale man was simply an instrument. #int #DC11
But it is good to understand this game you've been entangled within. #reply #int
->questions
-
->riverHubОптимизация вовлеченности игроков за счет соотношения «выбор к тексту»
Почему важно высокое соотношение «выбор к тексту»
Высокое соотношение выбора к тексту звучит замечательно. Во-первых, это отличный инструмент, чтобы игрок не засыпал и оставался вовлеченным. Если заставить их читать слишком много текстовых блоков, то глаза среднего игрока просто затуманятся. Но если вы продолжаете дразнить их — заставляя отвечать на интересные вопросы, толкая их к трудным решениям или просто заставляя реагировать на грубые обвинения — то это как вливание энергетического напитка в их вены. Они проснутся и действительно вовлекутся в текст. По крайней мере, статистически они с большей вероятностью будут это делать.
Проблема здесь проста: Вам бы следовало безумный хотите добавить такой уровень разветвления в ваш диалог. Это требует много работы, и, я думаю, более конкретно, это требует очень специфического набора инструментов. (Навыки тоже, конечно, но инструмент должен быть гибким и быстрым, чтобы процесс разветвления не превратился в испытание на выносливость).

Выбор правильного инструмента
Инструмент, который я использую, - это великолепный и невероятно замечательный ручной почерк созданный студией Inkle. Создав этот инструмент с открытым исходным кодом, который, кстати, безупречно работает в Unity, они буквально сделали мою карьеру. Я много им обязан. А чернила — это инструмент, который, помимо всего прочего, отлично подходит для быстрого и гибкого ветвления.
Когда я пишу диалог на языке чернил, я пишу с той же скоростью, что и при линейном контенте. Пока есть предварительный эскиз дизайна, я могу просто приступить к работе. Добавление выражений игроков, управление визуальными эффектами или проверка кубиков – все это занимает секунды, поскольку все это делается с помощью базовых (в основном настраиваемых подEbb) тегов и пользовательского кода, а также обычных (и хорошо продуманных) функций чернил.
"Beyond that, I also focus a lot on my own unverified theories..." #Snurre
He slaps his knees and grins. #Snurre
"<b>The Folk Spirit</b>. Have you heard of it?" #Snurre
It's something he made up. Doesn't mean it's not correct though. #int #DC18
Sounds like a collective folk view on morality. #wis #DC13
+"No. I have not."
--(spiritNo)
"Understandable. It's not yet published." #Snurre
+DC13 wis-"Is that some kind of unified moral or ethical code of a people or culture?"
"No, it's-" #Snurre
He leans back and squints. #Snurre
"That's not actually that far off. You've got a head on you, Cleric." #Snurre
+"Yes."
"Oh!" #Snurre
"Then tell me, what is it?" #Snurre
++"I lied. I have no idea what you're talking about."
->spiritNo
++ROLL18 int-Figure it out.
+++S
Ah... #int
Just look at this halfling. #int
He's clearly walking in the footsteps of the study of unconscious mind melding. #int
Your best guess would then be... #int
++++"The Folk Spirit... is that based on the idea of universal folk myths?"
His bushy eyebrows reach for the ceiling. #Snurre
"Why, yes! Very good guess, Cleric." #Snurre
+++F
You stare at the halfling for about thirty seconds. #int
"You're a quiet one, Cleric." #Snurre
An idea pops into your empty, empty skull. #int
++++"The Folk Spirit is a communal ghost that haunts us every autumn."
++++"The Folk Spirit is a great Fordnippian wine."
++++"The Folk Spirit? That's a music genre."
----
"...Not a terrible guess, but no." #Snurre
++++"Yeah, I have no idea."
->spiritNo
-
"The Folk Spirit is the working title for my new thesis." #Snurre
"Most of it is, if you excuse my anuran, <i>fucking bullshit</i>." #Snurre #XPGain #Minor
"But in short, it is about how each folk share a number of core communal archetypes, or myths. I have traveled around the Coast to collect as many tales, writing down thousands of stories previously only passed down orally." #Snurre
"All to see how well my theory holds up, in the minds of so, so many folk." #Snurre
He clears his throat and leans back into his chair. #Snurre
"Apologies. I am ranting here, let us put a stop to it. What do <i>you</i> want, Cleric?" #Snurre
->hubПланирование изменчивости: Динамический контент и открытый дизайн
Но что насчет пункта номер два нашего списка ограничений («>50% контента должно быть динамичным»)? Динамический контент и открытый (или нелинейный) дизайн оба исходят из схожей цели: создать изменчивость на основе ввода игрока.
Просто позвольте им делать все, что они хотят! Безумно веселись! У вас есть открытый мир, в котором вы можете двигаться в любом направлении! Ну, это один из способов сделать это. Но здесь важно отметить, что интерактивное написание всегда сосредоточено на дизайне, управляемом авторским намерением. Другими словами, всё контролируется писателем.
Вы все еще можете заниматься систематическим дизайном, и здесь есть большой перекрывающийся раздел, но практическое искусство интерактивного письма заключается именно в том, что вы не позволяете историям, возникающим в процессе, развиваться самостоятельно.
Вот что я имею в виду: У вас должны быть переменные. И вы должны отслеживать их. Для каждого выбора, который делает игрок, будь то характеристики, выбранные во время создания персонажа, или то, насколько он был жесток по отношению к этому вождю гоблинов, — все это требует какого-то типа обратной связи, чтобы вызвать феномен субъективности. Будь то динамичная реплика в конце игры или целая сюжетная линия с несколькими вариантами развития событий, эти моменты обратной связи так же важны, как и сами выборы, если не более того.

Отслеживание переменных
Мой метод отслеживания переменных прост и гибкий: Я называю его системой переменных сюжета (SV). Используя систему тегов, когда эти теги начинаются с знака препинания, это указывает на использование переменной. Если эта переменная никогда ранее не встречалась, то SV создается в одном огромном списке. В противном случае он просто обращается к уже существующему SV и либо устанавливает, либо проверяет его в соответствии с командой.
++DC20 wis-\(Look for the source of the breeze.\)
Your eyes glance upwards. #wis
The wall. The wall is not a wall. #wis #.TE_SecretDoorRevealed=1 #UpdateEntities
Look at the wall. #wis
+++E-Oh?
->ENDСтрока и int – обычно используются как булевы, но при необходимости расширяются для увеличения или уменьшения, когда это необходимо. Команды, которые я реализовал для Ebb, были «==», «=», «>=», «< =», «+=» и «-=».
Затем возникает вопрос организации. Со временем я стал лучше справляться с этим, но каждый SV использует префикс, основанный на местоположении или квесте. «TE» в данном случае относится к району Чайной лавки. SV с префиксом «Q» относится к квесту, а «QP» относится к точке квеста, то есть записи в журнале квестов, вашем журнале квестов.
Yes. #wis
A symbol. #wis #XPGain #Minor
A symbol of a sun. Definitely. #OBJ
If this is what Akzel wanted you to find, you've found it. #wis #.QP3_Mine=1 #.Q_Mine=2
+Huh. So what do I do now?
-
Get back to your dwarf buddy, of course! #dexПреимущества нарративного дизайна
Это грубая система, но с одним важным преимуществом для производительности: Вы можете просто продолжать писать. Нужна новая переменная для динамического выбора диалога? Просто добавьте ее, а затем скопируйте и вставьте в файл, где она должна быть установлена. Легко проверяйте использование любой переменной с помощью CTRL+F по всему проекту или управляйте радикальными изменениями с помощью базового управления текстом. Нет необходимости управлять базой данных. Сам список просто хронологический. Забыли имя переменной? Просто найдите соответствующий раздел или префиксы квестов и посмотрите список.
Сначала я не ожидал, что это сработает. В среднем, к концу игры в этом списке может оказаться более 3000 переменных сюжета. Но – как и в большинстве случаев, когда я работал над Esoteric Ebb – Unity просто справлялась с этим. И интеграция ink в Unity никогда не подводила меня, ни разу, даже после почти десяти лет использования. Перекомпиляция файлов ink занимает несколько секунд. Настройка функций на Esoteric Ebb{b}Ему{/b} всегда нравилось быть крайне эффективным. И как бы странно это ни звучало, я до сих пор удивляюсь, спустя все эти годы, что это просто течет. Если я смогу, я хочу продолжать разрабатывать эту конвейерную линию в течение многих лет.
Кроме того, я использую Notepad++ для всех моих записей в Esoteric Ebb. Хотя вы, очевидно, можете использовать любой текстовый редактор по своему выбору, использование легкого и быстрого редактора обеспечивает более комфортную работу. Именно возможность поиска среди миллиона слов за доли секунды позволила мне написать (и исправить ошибки!) такую огромную игру.
The croco-beast rushes forward and grabs you by the neck. #Kraaid #HPLoss #1d4
++\(Struggle to breathe.\) "I'm actually..."
He tightens the grip as you mutter out a faint response. #Kraaid
+++"...a rogue." #.ROGUE+=1
+++"...a wizard." #.WIZARD+=1
+++"...no, no okay, I'm a cleric. I'm <b>The Cleric</b>, even." #.CLERIC+=1
+++.BARD==1-"...I think I'm a Bard? You know what that is?" #.BARD_Choice+=1
+++.DRUID==1-"...a Druid. I guess?" #.DRUID_Choice+=1
+++DC17 con-"...<i>I'm Agrarian</i>...! No wait, shit. That's politics. I mean, uh..." #.AGRARIAN+=1
+++"...I'm whatever you want me to be. <i>Please don't kill me</i>."
"Whatever <wiggle>Kraaid</wiggle> wants?" #Kraaid
++++"Yes...! I'll even be apolitical!" #.APOLITICAL+=1
++++"Yes! I'm... I'm a rabbit!"
++"No! I am! I'm Cleric! That's me!"Заключительные мысли: Исправление ошибок и обучение работе с ветками
Но это также самый большой недостаток этой системы: исправление ошибок. Я должен был потратить больше времени на технические решения для исправленных логики и синтаксиса, но на самом деле я просто вынес все эти испытания на игровые тесты.
Поскольку Esoteric Ebb получил свой патч 1.1, мне удалось исправить примерно 704 «текстовые ошибки» — будь то орфографические или связанные с кодом — менее чем за четыре дня работы (очень спокойные дни, к тому же). Это, опять же, потому, что система чрезвычайно гибкая. Тем не менее, эти ошибки были, когда мы запустили Esoteric Ebb из-за настроек здесь тоже. Это безумное количество текста с огромным количеством ответвлений. Но я также уверен, что не смог бы написать даже четверть от окончательного количества слов, если бы не был одарен чернилами.

Послесловие: Другие рекомендуемые инструменты для дизайнеров нарративов
чернила делают практическое искусство интерактивного письма быстрым, потому что я. У меня всегда были проблемы с визуальным скриптированием, но я знаю, что у многих писателей проблема ровно противоположная. Поэтому я всегда рекомендую изучить другие решения, чтобы найти то, которое лучше всего подходит вам и вашей команде, некоторые примеры: articy:draft, Arcweaveи Yarn Spinner.
Эзотерическое течение сейчас доступно на Steam. Узнайте больше игр Made with Unity на нашем сайте Страница куратора Steam, и ознакомьтесь с другими историями разработчиков Unity на сайте Блог Unity и Центр ресурсов.
