Introduction à Loreline
Loreline est un langage de script open-source pour écrire de la fiction interactive. Il gère les dialogues à embranchements, les choix de la personne qui joue, les personnages et l'état de l'histoire dans une syntaxe conçue pour être lisible par les autrices et auteurs tout en offrant de vrais outils de programmation (variables, conditions, fonctions) quand l'histoire en a besoin.
Loreline s'intègre partout : moteurs de jeu, applications web ou projets autonomes. Il s'adapte à vos outils, les histoires que vous écrivez restent portables.
À quoi ça ressemble
Voici un script Loreline minimal :
Une bonne odeur de café flotte dans la salle.
barista: Salut ! Comment tu vas aujourd'hui ?
choice
Je passe une excellente journée
barista: Formidable ! Le café va la rendre encore meilleure.
Besoin de caféine...
barista: N'en dis pas plus ! Laisse-moi m'en occuper.
Tu t'appelles Alex, non ?
barista.name = "Alex"
barista: Oh, je ne m'attendais pas à ce que tu t'en souviennes !
Le texte seul est de la narration. barista: ... est un dialogue prononcé par un personnage. choice présente des options, et l'indentation détermine ce qui se passe après chaque choix. C'est le schéma de base. Le Guide d'écriture couvre tout en détail.
Simple mais explicite par design
Loreline réduit la ponctuation au strict minimum. Le texte narratif et les dialogues s'écrivent tels quels, sans aucun délimiteur particulier. Passer à une autre section, c'est juste ->. Assigner une variable, c'est juste =. Les conditions n'ont pas besoin d'un mot-clé de fermeture. Un choix peut inclure un if en fin de ligne pour n'apparaître que si la condition est remplie.
D'un autre côté, les principaux éléments structurels (beat, choice, character, state, if, else) sont des mots-clés en anglais courant plutôt que des symboles. Ils se comprennent d'un coup d'œil, sans avoir besoin d'apprendre ce que signifie chaque caractère spécial. C'est un choix délibéré : des mots lisibles plutôt que de la ponctuation cryptique.
D'autres outils s'appuient davantage sur les symboles ou les délimiteurs : Yarn Spinner utilise <<if>>...<<endif>> et <<set>> ; Ink dispose de ses propres marqueurs pour les choix, les knots et les diverts. Loreline essaie de rester au plus proche du texte brut, et l'éditeur est suffisamment intelligent pour appliquer une coloration syntaxique correcte avec aussi peu d'indices :
Le café est calme ce matin.
choice
Commander un café
cafesCommandes += 1
if cafesCommandes > 3
barista: <concerned> Ça fait quand même beaucoup de café aujourd'hui...
else
barista: Un de plus, c'est parti !
Commander un déca if cafesCommandes > 2
barista: Bonne idée. Je t'en fais un bon.
Pour les autrices et auteurs, le résultat est un script qui se lit presque comme du langage naturel, avec moins de bruit visuel entre l'histoire et sa structure.
Structure de l'histoire
Une histoire est organisée en beats, des sections nommées qui fonctionnent comme des scènes ou des chapitres. On passe de l'une à l'autre avec ->, ou on en appelle une avec BeatName() qui reviendra à l'endroit de l'appel une fois terminée :
beat EnterCafe
Le soleil du matin traverse les fenêtres du café.
barista: Bienvenue ! Je ne crois pas t'avoir déjà vu.
TakeOrder()
barista: Bon café !
-> EndScene
beat TakeOrder
barista: Alors, qu'est-ce que je te prépare ?
Les personnages sont des éléments de premier plan : on les déclare avec des champs qui peuvent être lus et modifiés tout au long de l'histoire :
character barista
name: Alex
mood: friendly
friendship: 0
Les données persistantes vivent dans un bloc state. Les conditions (if, else if, else) permettent à l'histoire de réagir aux décisions prises, et les choix peuvent porter des conditions en ligne pour afficher ou masquer des options dynamiquement.
Autres fonctionnalités
Au-delà de la syntaxe de base, Loreline propose aussi :
- Tags de texte : attacher des métadonnées comme
<friendly>ou<whisper>à n'importe quelle ligne de dialogue, que le moteur de jeu peut interpréter comme il le souhaite. - Texte dynamique : insérer des variables avec
$et${}, et la pluralisation automatique avec$count pièce|pièces. - Alternatives : varier le texte au fil des visites grâce à cinq modes de sélection (
sequence,cycle,once,pick,shuffle). - Fonctions : plus de 60 fonctions intégrées pour les mathématiques, la manipulation de texte, les tableaux et les maps. On peut aussi définir ses propres fonctions, directement dans un script Loreline ou les exposer depuis le moteur hôte.
- Imports : répartir une histoire sur plusieurs fichiers
.lorpour organiser les gros projets. - Sauvegarde et restauration : sérialiser l'état complet de l'histoire à tout moment et le restaurer plus tard, incluant la position d'exécution, les variables, les champs des personnages et la progression générale.
- Localisation : une fonctionnalité de premier plan du langage : étiqueter les lignes avec des
#clesdans le script, fournir des fichiers de traduction.lorpar langue, et l'interpréteur les substitue à l'exécution.
Plateformes et intégration
Loreline est écrit en Haxe et compile nativement vers plusieurs cibles. L'API s'utilise de la même manière partout : charger un script Loreline, puis le jouer en fournissant des callbacks pour les dialogues, les choix et la fin de l'exécution. Toutes ces cibles partagent une base de code commune, ce qui garantit un comportement cohérent d'un langage à l'autre et permet de livrer les mises à jour partout simultanément sans différence majeure de fonctionnalité. Une batterie de plus de 160 fichiers de tests couvre le runtime et contribue à sa fiabilité au fil de l'évolution du langage.
| Plateforme | Notes |
|---|---|
| JavaScript / TypeScript | Fonctionne dans Node.js et le navigateur. Disponible en tant que package npm. |
| C# / .NET | S'intègre avec Unity, Godot (.NET) et tout projet .NET. |
| C++ | Bibliothèque autonome sans dépendances externes. |
| Python | Fonctionne avec Python 3.8+, sans dépendances externes. |
| Lua | Fonctionne avec Lua 5.1+, sans dépendances externes. |
| Haxe | Disponible en tant que package haxelib avec accès à l'API complète. |
Jetez un œil aux guides d'intégration pour les instructions de configuration dans chaque langage.
Outillage
- Extension VS Code : coloration syntaxique et panneau de prévisualisation en direct pour les fichiers
.lor. - Atelier en ligne : écrivez et exécutez des scripts Loreline directement dans le navigateur.
- CLI : un outil en ligne de commande pour exécuter les fichiers
.lor, disponible pour macOS, Linux et Windows.
Comparaison avec Ink et Yarn Spinner
Ink et Yarn Spinner sont les deux autres outils couramment utilisés pour le récit interactif. Voici un aperçu de ce qui les distingue.
Cette section essaie de faire une comparaison honnête, au moment où cet article a été rédigé, et ne prétend en aucun cas qu'un outil est meilleur ou moins bon qu'un autre. Militons pour plus de diversité dans les logiciels d'écriture de fiction interactive, et c'est en ce sens que Loreline s'invite à la fête !
Ink a été créé par Inkle et utilisé dans des jeux comme 80 Days et Heaven's Vault. Sa structure repose sur des knots (sections principales), des stitches (sous-sections) et un système de weave pour les embranchements en ligne. Le contrôle de flux utilise des diverts (-> knot_name), et les choix sont marqués avec * (une seule fois) ou + (permanents). Ink dispose d'un runtime C# mature avec un plugin Unity officiel. Un portage JavaScript (inkjs) est également officiellement supporté. Des portages C++ communautaires existent aussi, dont inkcpp (bibliothèque standalone disponible aussi en plugin UE) et Inkpot (plugin UE5 développé par The Chinese Room). Ink ne dispose d'aucun système de localisation natif, il faut donc construire son propre outillage à partir des métadonnées #tag.
Yarn Spinner utilise un format similaire à un scénario, organisé en nœuds délimités par --- et ===. Les commandes utilisent <<doubles crochets angulaires>> et les options -> (v2+). Il bénéficie d'une intégration Unity solide et d'un éditeur visuel de nœuds. C'est principalement un outil C#/.NET ; une implémentation C++ officielle pour Unreal Engine est en développement actif (en bêta début 2026).
Pour comparer plus concrètement, voici le même script écrit dans les trois langages : narration, dialogue, un choix conditionnel et une mise à jour de variable :
state
cafesCommandes: 0
character barista
name: Alex
beat Cafeteria
Une bonne odeur de café flotte dans la salle.
barista: Salut ! Qu'est-ce que je te sers ?
choice
Un café normal
barista: C'est parti !
Un déca if cafesCommandes > 2
barista: Tu passes au déca ? Sage décision.
cafesCommandes += 1
if cafesCommandes > 3
barista: Ça fait quand même beaucoup de café aujourd'hui...
VAR cafesCommandes = 0
=== Cafeteria ===
Une bonne odeur de café flotte dans la salle.
Alex: Salut ! Qu'est-ce que je te sers ?
+ Un café normal
Alex: C'est parti !
+ {cafesCommandes > 2} Un déca
Alex: Tu passes au déca ? Sage décision.
-
~ cafesCommandes = cafesCommandes + 1
{cafesCommandes > 3:
Alex: Ça fait quand même beaucoup de café aujourd'hui...
}
-> DONE
title: Cafeteria
---
<<declare $cafesCommandes = 0>>
Une bonne odeur de café flotte dans la salle.
Alex: Salut ! Qu'est-ce que je te sers ?
-> Un café normal
Alex: C'est parti !
-> Un déca <<if $cafesCommandes > 2>>
Alex: Tu passes au déca ? Sage décision.
<<set $cafesCommandes = $cafesCommandes + 1>>
<<if $cafesCommandes > 3>>
Alex: Ça fait quand même beaucoup de café aujourd'hui...
<<endif>>
===
Les trois scripts racontent la même histoire avec une longueur comparable mais des conventions différentes. Chaque langage a sa propre façon de gérer les déclarations, les choix et les embranchements.
Comparatif détaillé
| Loreline | Ink | Yarn Spinner | |
|---|---|---|---|
| Structure | Sections beat avec indentation ; choix et alternatives imbriqués |
Knots (sections principales) + stitches (sous-sections) + weave pour les embranchements en ligne | Nœuds nommés, chacun délimité par --- / === |
| Choix | Mot-clé choice + indentation ; conditions if en ligne sur les options individuelles |
* (disparaît après avoir été choisi) ou + (toujours disponible) ; le marqueur contrôle si l'option réapparaît ; weave gère les embranchements locaux |
Options -> avec conditions via <<if>> |
| Personnages | Natifs : déclarés avec des champs typés, lisibles et modifiables tout au long de l'histoire | Géré par l'application hôte | Géré par le moteur de jeu |
| État | Les variables sont déclarées dans des blocs state : state de haut niveau (partagé sur tout le script) ; state dans un beat (limité à ce beat) ; new state (temporaire, réinitialisé à chaque exécution du beat) |
Variables intégrées : VAR (globale), TEMP (locale), LIST (type énumération) |
Variables intégrées ; déclarées avec <<declare>> |
| Tags de texte | <tag> intégré sur n'importe quelle ligne ; transmis à l'hôte tel quel sans affecter le flux |
#tag ajouté au texte de sortie |
Blocs <<command>> pour les instructions de jeu |
| Alternatives | 5 modes intégrés : sequence, cycle, once, pick, shuffle |
Séquences et shuffle via les marqueurs de choix & / ~ |
Pas de support natif ; géré via du script personnalisé |
| Fonctions | Plus de 60 fonctions intégrées. Possibilité de programmer des fonctions personnalisées directement dans les scripts Loreline | Fonctions intégrées pour les opérations courantes ; la logique personnalisée nécessite des fonctions externes écrites en C# ou JavaScript | Logique personnalisée gérée via des commandes et fonctions C# enregistrées depuis l'application hôte |
| Localisation | Intégrée : étiquettes #clé dans le script + fichiers de traduction .lor par langue |
Pas de support natif ; les équipes s'appuient généralement sur les métadonnées #tag |
Export/import de tables CSV |
| Cibles | JS, TS, C#, C++, Python, Lua, Haxe, tous depuis une seule base de code Haxe | C# officiel (Unity) ; JS officiel (inkjs) ; C++ communautaire uniquement (inkcpp, Inkpot) | C# / .NET officiel (Unity) ; C++ pour UE en développement actif (bêta) |
Ink et Yarn Spinner sont matures, bien documentés et ont été utilisés dans des jeux publiés depuis des années. Loreline est plus récent et adopte une approche différente : structure par indentation, personnages et état comme éléments fondamentaux du langage, et compilation native vers plusieurs plateformes depuis une seule base de code. Le meilleur choix dépend de la familiarité de l'équipe, du moteur cible et du style de script qui correspond le mieux à la façon dont on veut écrire.
Essayer Loreline
Le moyen le plus rapide de commencer est l'Atelier, où vous pouvez écrire et exécuter des scripts Loreline directement dans le navigateur, sans rien installer. Pour aller plus loin, le Guide d'écriture couvre le langage complet pas à pas.