Ink
Ink e Inky
Ink è un linguaggio di scripting open source* per la narrativa interattiva, sviluppato da inkle studios, lo studio britannico autore del fortunato videogioco 80 Days e della serie Steve Jackson’s Sorcery!. Distribuito sotto licenza MIT, è usato professionalmente per videogiochi narrativi, installazioni interattive e creazione di storie ramificate. A differenza di Twine, Ink non ha un’interfaccia visuale per la costruzione della storia. Si scrive in un file di testo con estensione .ink, usando una sintassi minimalista e leggibile. L’editor ufficiale si chiama Inky e affianca al codice una finestra di anteprima interattiva in tempo reale. Queste caratteristiche lo rendono uno strumento adatto per quei docenti che hanno già familiarità con Twine e vogliono andare oltre, o che trovano la separazione tra logica narrativa e presentazione visiva un vantaggio piuttosto che un ostacolo. In Ink il testo narrativo è testo puro, le variabili sono dichiarate in testa al file, le condizioni sono blocchi separati. Il codice di una storia Ink si legge come un algoritmo.
Questo non significa che Ink sia migliore di Twine. Sono strumenti per usi diversi: Twine abbassa al minimo la barriera di ingresso; Ink offre più controllo sulla logica a chi è disposto a imparare una sintassi testuale.
Guida essenziale a Inky
Inky è scaricabile dall’url https://github.com/inkle/inky/releases, disponibile per Windows, macOS e Linux. Non richiede installazione di dipendenze aggiuntive: è un’applicazione autonoma.
Inky divide lo schermo in due pannelli affiancati: a sinistra il codice .ink, a destra lanteprima interattiva. Ogni modifica al codice si riflette immediatamente nell’anteprima, senza bisogno di salvare o ricaricare. I messaggi di errore appaiono in rosso nell’anteprima nel momento in cui vengono introdotti, rendendo il debug* immediato.
All’apertura, come si vede dalla Figura 1, ci troviamo di fronte a un abbozzo di codice e di storia:
Once upon a time...
* There were two choices.
* There were four lines of content.
- They lived happily ever after.
-> END
È un modo ironico per introdurre alcune logiche di base. Sono presenti in effetti quattro linee di contenuto: il "C’era una volta" iniziale (Once upon a time), due opzioni e una conclusione. Il testo iniziale è scritto direttamente, senza alcun markup*. Le scelte si introducono con un asterisco. Se proviamo a giocare questa storia rudimentale nell’anteprima a destra, vediamo che entrambe le scelte conducono allo stesso finale: They lived happily ever after. Questo perché Ink legge il testo in modo lineare. Se non si inserisce un comando di salto (->) all’interno di una scelta, il motore, una volta terminata la scelta selezionata, prosegue automaticamente all’istruzione successiva che trova nel file.
Proviamo a rendere più complessa la storia:
C'erano una volta due amici...
* [Scelta A]
-> fine_felice
* [Scelta B]
-> fine_triste
=== finale_felice ===
Che vissero felici e contenti.
-> END
=== finale_triste ===
Che litigarono e andarono ognuno per la sua strada.
-> END
Qui abbiamo introdotto due elementi nuovi. Per diversificare il finale abbiamo introdotto due nodi, che in Ink si chiamano knots, e che si dichiarano con tre segni di uguale:
=== nome_del_nodo ===
Le scelte sono ancora introdutte con l’asterisco, ma abbiamo del testo tra parentesi quadre per l’etichetta visibile al lettore. I salti tra nodi si indicano con ->, la fine della storia si segna con -> END.
Le variabili, utili per storie con logica più complessa, si dichiarano in testa al file con VAR e si modificano con ~:
VAR contatore = 0
* [Una scelta che incrementa il contatore]
~ contatore++
-> nodo_successivo
Una storia completata si esporta come file html* attraverso il menu File → Export for web. Viene creata una cartella che contiene il file in html*, un file style.css, che contiene il css* della pagina e che è possibile modificare per personalizzare l’aspetto della storia, un file story.js, che contiene il codice effettivo della storia e due file main.js e ink.js, che sono i file motore (in JavaS*) che permettono al browser di leggere ed eseguire la storia.
Il file funziona esattamente come quelli prodotti da Twine: si apre con qualsiasi browser, non richiede server, può essere caricato su qualsiasi hosting statico o distribuito direttamente agli studenti, avendo però cura di distribuire tutta la cartella e non il solo file html*.
Un esempio
Proviamo a creare una storia legata al pensiero di Spinoza. La Natura è un sistema deterministico e la nostra libertà consiste nel riconoscere la stessa necessità che ci governa. Per rendere in forma narrativa questa dialettica tra libertà e necessità immaginiamo che il lettore si ritrovi in una stanza in cui un uomo sta armeggiando intorno a un maestoso orologio. L’uomo accoglie il lettore e gli annuncia che tutte le sue scelte sono già determinate.
L’inizio della storia sarà dunque così:
VAR scelte_fatte = 0
-> introduzione
== introduzione ==
Ti risvegli in una grande sala. Davanti a te, un vecchio
sta riparando un meccanismo maestoso, che sembra fatto
di luce. "Benvenuto", ti dice. "Tutto ciò che accade è
scritto nel movimento dei denti di questo orologio.
Ogni tua scelta è solo un ticchettio già predeterminato."
Abbiamo inserito all’inizio la variabile relativa alle scelte, che si incrementerà man mano che procederà la storia. Dobbiamo aggiungere ora diverse opzioni di risposta.
* [Chiedi: "Se tutto è già scritto, perché posso
scegliere?"] -> sfida
* [Chiedi: "Chi ha costruito l'orologio?"] -> autore
* [Osserva gli ingranaggi in silenzio] -> osservazione
Abbiamo tre possibili risposte, introdotte da asterischi, che rimandano a tre nodi. Esploriamo il primo di questi nodi:
== sfida ==
"L'illusione della scelta è necessaria per far girare
il meccanismo," risponde lui sorridendo. "Tu credi di
decidere, ma sei solo il braccio che compie un'azione
già decisa fin dall'inizio."
~ scelte_fatte += 1
* [Reagisci: "Rifiuto questa idea. Se scelgo di fermare
l'orologio, il futuro cambia."] -> ribellione
* [Rifletti: "Allora la mia consapevolezza è solo un
effetto collaterale?"] -> riflessione
Abbiamo nominato il knot sfida, per riconoscerlo facilmente, utilizzando i tre segni di uguale. Dal momento che per giungere a questo nodo il lettore ha fatto una scelta (in questo caso illusoria), incrementiamo la variabile, segnando un 1.
Le due scelte, introdotte dagli asterischi, rimandano ad altri due nodi, che chiamiamo ribellione e verb|riflessione|, e ai quali rimandiamo con ->.
Procediamo così, costruendo un nodo dopo l’altro, fino alla conclusione:
== fine ==
Il vecchio scompare, lasciandoti solo nella stanza con il
meccanismo. Il suo rumore sembra ora sincronizzato con il
tuo battito cardiaco.
Hai fatto {scelte_fatte} scelte durante questa
conversazione. Erano tue, o erano già scritte nel codice
di questa pagina?
-> END
Al posto di {scelte_fatte} comparirà naturalmente il numero di "scelte" fatte dal lettore, che effettivamente abbiamo già previsto scrivendole nel codice della pagina.
La storia intera può essere giocata al seguente url: https://textusweb.netlify.app/orologio.