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 :

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

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.