Files

4.1 KiB

Architecture

Statut : contrat de fondation pour 0.1.x.

Jeu Luanti, pas fork moteur

Le dépôt est installé comme un game nommé sanctuary_luanti. Luanti reste une dépendance externe. Cette séparation permet de suivre les versions de sécurité du moteur et de distribuer Sanctuary par les mécanismes ordinaires de Luanti.

Un fork du moteur ne peut être proposé qu'avec :

  • une limitation reproductible de l'API publique ;
  • l'absence d'une solution sûre par mod, menu ou service compagnon ;
  • un patch minimal discuté avec l'amont ;
  • un budget de maintenance multi-plateforme et de suivi sécurité.

Modules

La fondation contient un seul mod :

  • sanctuary_core — progression, étapes, jalons, événements et healthcheck.

Les futurs domaines (sanctuary_world, sanctuary_life, sanctuary_atlas, sanctuary_travel, etc.) ne seront extraits que lorsqu'ils auront une donnée propre, une API publique et des tests indépendants. Aucun mod ne doit écrire directement dans les métadonnées privées d'un autre.

Données persistantes

La première donnée joueur utilise les métadonnées Luanti :

sanctuary:progression_version
sanctuary:stat_<id>
sanctuary:stage
sanctuary:stardust

Règles :

  • version entière croissante ;
  • valeurs bornées par le serveur ;
  • migration monotone ;
  • conservation des clés inconnues ;
  • snapshot en lecture seule pour l'interface ;
  • aucune confiance dans un prix, rang ou résultat envoyé par un client.

Les données collectives utiliseront le ModStorage du monde avec un journal de migration distinct.

Trois échelles de voyage

1. Lieux d'un même monde Luanti

Luanti expose un espace de carte par monde, sans dimensions natives équivalentes à celles de Minecraft. Les premières ères peuvent donc être des régions séparées dans le même espace, reliées par des portails et des arrivées validées côté serveur. Cette voie permet un prototype jouable sans modifier le moteur.

2. Mondes d'une même installation

Deux sauvegardes restent deux mondes distincts. Le jeu peut présenter leur existence et préparer un handoff, mais ne doit pas copier directement leurs bases SQLite. Un transfert passe par un format d'export versionné puis une politique d'import explicite.

3. Serveurs fédérés

Luanti ne fournit pas d'identité centralisée : chaque serveur authentifie ses propres comptes. Le serveur de jeu ne dispose pas non plus d'un mécanisme général pour déplacer silencieusement un client vers un autre serveur.

Le premier portail fédéré sera donc honnête sur cette frontière :

  1. découverte d'un manifeste public de destination ;
  2. vérification de l'identité du monde et de sa compatibilité ;
  3. consentement visible du joueur ;
  4. émission éventuelle d'un billet de passage court et signé ;
  5. reconnexion explicite vers l'adresse choisie ;
  6. validation locale par le serveur d'arrivée.

Le prototype ne transporte ni inventaire, ni monnaie, ni privilèges. Il peut transporter un reçu minimal : monde d'origine, jalon public, instant d'émission, expiration et nonce anti-rejeu. La destination décide seule de ce qu'elle en fait.

Manifeste de monde envisagé

Format de travail, non stabilisé :

{
  "schema": "sanctuary.place.v1",
  "id": "did:web:example.org:worlds:orchard",
  "name": "Le Verger",
  "endpoint": { "host": "play.example.org", "port": 30000 },
  "game": { "id": "sanctuary_luanti", "compatibility": "0.1" },
  "public_key": "...",
  "routes": []
}

Avant implémentation, il faudra décider la canonicalisation, les signatures, la rotation des clés, l'expiration, la révocation et le modèle de menace. Aucun accès HTTP non sandboxé ne doit être activé par défaut dans un mod de jeu.

Préservation

Une release distribuable devra fournir :

  • un export cohérent du monde à l'arrêt ;
  • un manifeste de versions du moteur, du jeu et des schémas ;
  • des checksums ;
  • une procédure de restauration testée ;
  • une séparation entre données publiques, privées et secrets ;
  • une politique de rétention décidée par l'administrateur du lieu.