O desafio da escrita interativa: Projetando um RPG não linear como Esoteric Ebb

CHRISTOFFER BODEGÅRD / SUDDEN SNAILGame Developer and Writer
Mar 17, 2026|7 Min
Arte principal de Esoteric Ebb, de Christoffer Bodegård | Made with Unity. Um aventureiro com uma túnica azul brandindo uma espada quebrada contra um guerreiro esquelético que está de costas para a câmera. Um duende vestido de rosa, ladeado por um dragão vermelho, observa angustiado. O título do jogo, ESOTERIC EBB, está no lado esquerdo.
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

Esoteric Ebb está conquistando o Steam – mas como um CRPG com narrativa ramificada como este é criado? Neste blog convidado, Christoffer Bodegård revela decisões complexas de design narrativo e sua jornada de oito anos aprendendo a gerenciar a criação de uma história verdadeiramente não linear e baseada em diálogos.

Desde o primeiro teste público do Esoteric Ebb, em 2023, tenho recebido repetidamente uma pergunta simples: “Como você consegue controlar tudo?” É uma boa pergunta – e difícil. Provavelmente, respondi a essa pergunta de várias maneiras diferentes ao longo dos anos, mas nunca de uma forma realmente satisfatória... Então, vamos tentar.

(Mas primeiro, um pouco de contexto sobre o Esoteric Ebb)

Esoteric Ebb é um CRPG enorme, focado na narrativa e não linear. Sem combate tradicional, quase inteiramente baseado em diálogos, com uma duração entre 45 minutos e 50 horas, e tantas, tantas opções... Opções reais, do tipo que alteram ativamente a sua experiência de forma fundamental até aos créditos finais. Sim, é um desses jogos. E levou um tempo para ficar pronto: cerca de oito anos do início ao fim, metade dos quais passei sem fazer nada, sentado sozinho em uma sala, aprendendo a escrever de forma interativa.

As três restrições da escrita interativa

Defino a escrita interativa dentro de três restrições/objetivos um tanto arbitrários. Sendo elas:

  • Uma elevada relação escolha/texto
  • Mais de 50% do conteúdo é dinâmico
  • Um design aberto

Aceite-os ou rejeite-os como quiser, mas se você atingir esses três, terá uma receita para uma intensa (e potencial) agência positiva do jogador. Mas, ao olhar para isso, você pode se deparar com alguns problemas.

Vamos analisá-los.

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

Otimizando o envolvimento do jogador por meio da relação escolha-texto

Por que a alta proporção entre escolha e texto é importante

Uma alta proporção entre opções e texto parece ótimo. É uma ótima ferramenta para manter o jogador atento e envolvido, por exemplo. Se você forçá-los a ler muitos blocos de texto, os olhos do jogador médio simplesmente se perderão. Mas se você continuar provocando e cutucando eles – forçando-os a responder perguntas interessantes, empurrando-os para decisões difíceis ou simplesmente forçando-os a responder a acusações rudes –, então é como injetar uma bebida energética em suas veias. Eles acordarão com um sobressalto e realmente se envolverão com o texto. Pelo menos, estatisticamente, eles estarão mais propensos a fazê-lo.

O problema aqui é simples, porém: Você teria que estar louco para querer adicionar esse nível de ramificação ao seu diálogo. Isso dá muito trabalho e, mais especificamente, requer um conjunto de ferramentas muito específico. (Habilidades também, claro, mas a ferramenta precisa ser flexível e rápida para que o processo de ramificação não se transforme em um teste de resistência).

Captura de tela de Esoteric Ebb, de Christoffer Bodegård | Made with Unity.
Esoteric Ebb | Christoffer Bodegård

Escolhendo a ferramenta certa

A ferramenta que utilizo é o magnífico e incrivelmente maravilhoso script de tinta criado pelo estúdio Inkle. Ao criar essa ferramenta de código aberto — que, aliás, funciona perfeitamente no Unity —, eles literalmente construíram minha carreira. Devo muito a eles. E a tinta é uma ferramenta que, além de todas as outras coisas legais que faz, é extremamente adequada para ramificações rápidas e ágeis.

Quando escrevo um diálogo a tinta, escrevo com a mesma velocidade que escrevo conteúdo linear. Desde que haja um esboço geral do projeto preparado, posso simplesmente seguir em frente. Adicionar expressões dos jogadores, gerenciar recursos visuais ou lidar com verificações de dados – tudo isso leva apenas alguns segundos, já que tudo é feito por meio de tags básicas (na maioria personalizadas para se adequarem ao Ebb) e código personalizado, juntamente com as funções ink regulares (e bem projetadas).

"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

Planejamento para variabilidade: Conteúdo dinâmico e design aberto

Mas e quanto ao item número dois da nossa lista de restrições (“>50% do conteúdo é dinâmico”)? O conteúdo dinâmico e os designs abertos (ou não lineares) têm um objetivo semelhante: criar variabilidade com base na interação do jogador.

Deixe-os fazer o que quiserem! Enlouqueça! Tenha um mundo aberto, onde você pode ir em qualquer direção! Bem, essa é uma maneira de fazer isso. Mas a distinção importante aqui é que a escrita interativa sempre se concentra em um design orientado pela intenção do autor. Em outras palavras, tudo é controlado pelo escritor.

Você ainda pode fazer um design sistemático, e há uma grande sobreposição, mas a arte prática da escrita interativa é especificamente quando você não deixa a narrativa emergente fazer seu trabalho.

O que quero dizer com isso é: Você precisa ter variáveis. E você precisa acompanhá-los. Para cada escolha que o jogador faz, seja nas estatísticas escolhidas durante a criação do personagem ou na forma como ele agiu contra o chefe dos goblins, tudo isso precisa de algum tipo de feedback para invocar o fenômeno da agência. Quer se trate de uma piada dinâmica no final do jogo ou de um enredo ramificado, esses momentos de feedback são tão importantes quanto as próprias escolhas, se não mais.

Captura de tela de Esoteric Ebb, de Christoffer Bodegård | Made with Unity.
Esoteric Ebb | Christoffer Bodegård

Acompanhando as variáveis

Meu método de rastreamento de variáveis é simples e flexível: Eu chamo isso de sistema de Variável da História (SV). Usando o sistema de tags, sempre que essas tags começam com um sinal de pontuação, isso indica o uso de uma variável. Se essa variável nunca tiver sido encontrada antes, o SV é criado em uma lista gigante. Caso contrário, ele apenas acessa o SV já existente e o define ou verifica conforme solicitado.


++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

Uma string e um int – geralmente usados como booleanos, mas quando necessário, expandem-se para aumentar ou diminuir sempre que necessário. Os comandos que implementei para o Ebb foram “==”, “=”, “>=”, “<=”, “+=” e “-=”.

A questão passa então a ser uma questão de organização. Fiquei melhor nisso com o tempo, mas cada SV usa um prefixo baseado na localização ou missão. “TE” neste caso refere-se à área da loja de chá. Um SV com o prefixo “Q” refere-se a uma missão, e um “QP” refere-se a um Ponto de Missão – ou seja, uma entrada no Diário de Missões, seu diário de missões.

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

Ganhos no design narrativo

É um sistema rudimentar, com um grande ganho de produtividade: Você pode simplesmente continuar escrevendo. Precisa de uma nova variável para uma escolha de diálogo dinâmico? Basta adicioná-lo e copiá-lo e colá-lo no arquivo onde ele precisa ser definido. Verifique facilmente qualquer uso de variável por meio de um CTRL+F em todo o projeto ou gerencie alterações abrangentes por meio do gerenciamento básico de texto. Não há banco de dados para gerenciar. A lista em si é apenas cronológica. Esqueceu o nome de uma variável? Basta procurar a área relevante ou os prefixos das missões e examinar a lista.

No início, não esperava que isso funcionasse. Uma jogada média pode resultar em mais de 3.000 variáveis de história nessa lista ao final do jogo. Mas, como a maioria das coisas que fiz no Esoteric Ebb, o Unity simplesmente funcionou com isso. E a integração do Unity com o Ink nunca me decepcionou, nem uma única vez, mesmo depois de usá-lo por quase uma década. A recompilação dos arquivos de tinta leva apenas alguns segundos. Personalizar os recursos de acordo com as preferências da Esoteric Ebb sempre foi extremamente eficiente. E por mais estranho que possa parecer, ainda me surpreendo, depois de todos esses anos, que tudo flua tão naturalmente. Se for possível, quero continuar desenvolvendo esse canal nos próximos anos.

Além disso, utilizo o Notepad++ para todos os meus textos no Esoteric Ebb. Embora você possa usar qualquer editor de texto de sua preferência, manter o editor leve e ágil torna a experiência muito mais suave. Pesquisar um milhão de palavras em uma fração de segundo foi exatamente o que me permitiu escrever (e corrigir bugs!) um jogo tão grande.

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!"

Considerações finais: Corrigindo bugs e aprendendo a abraçar o branch

Mas essa também é a maior desvantagem desse sistema: a correção de bugs. Eu deveria ter investido mais tempo em soluções técnicas para a lógica e a sintaxe defeituosas, mas, na verdade, acabei apenas forçando a barra durante todo o processo de testes.

Com a chegada da atualização 1.1 do Esoteric Ebb, consegui corrigir aproximadamente 704 “erros de texto” — relacionados à ortografia ou ao código — em menos de quatro dias de trabalho (dias muito tranquilos, aliás). Isso ocorre, mais uma vez, porque o sistema é extremamente ágil. Mesmo assim, esses bugs estavam presentes quando lançamos o Esoteric Ebb devido à configuração aqui também. É uma quantidade absurda de texto, com uma quantidade ridícula de ramificações. Mas também tenho certeza de que não teria conseguido escrever nem um quarto do número final de palavras se não tivesse sido abençoado com tinta.

Captura de tela de Esoteric Ebb, de Christoffer Bodegård | Made with Unity.
Esoteric Ebb | Christoffer Bodegård

Posfácio: Mais ferramentas recomendadas para designers narrativos

A tinta torna a arte prática da escrita interativa algo rápido, para mim. Sempre tive dificuldade com Visual Scripting, mas sei que muitos escritores têm exatamente o problema oposto. Por isso, recomendo sempre procurar outras soluções para encontrar a que melhor se adapta a você e à sua equipe, com alguns exemplos como articy:draft, Arcweave e Yarn Spinner.

Esoteric Ebb está disponível no Steam. Explore mais jogos Made with Unity em nossa página Steam Curator e confira mais histórias de desenvolvedores Unity no Blog Unity e no Centro de recursos.