Claim, Adopt, Fork
La mécanique centrale de Suddenly permet aux personnages de traverser les fictions. Un PNJ mentionné dans un compte-rendu peut être réclamé, adopté ou dérivé par un autre joueur via trois actions distinctes.
Les trois types de lien
| Type | Signification | Résultat | PNJ original |
|---|---|---|---|
| Claim | "Ce PNJ était mon PJ depuis le début" — rétcon | PNJ remplacé par le PJ existant | Remplacé |
| Adopt | "Je reprends ce PNJ comme mon PJ" — transfert | PNJ devient le PJ du demandeur | Transféré |
| Fork | "Mon PJ est inspiré de ce PNJ" — dérivation | Nouveau PJ lié, PNJ reste intact | Conservé |
Statuts d'un personnage
Un personnage commence comme PNJ libre et évolue selon les demandes acceptées :
NPC → CLAIMED (rétcon : le PNJ était le PJ depuis le début)
NPC → ADOPTED (transfert : le PNJ devient le PJ du demandeur)
NPC → FORKED (dérivation : nouveau PJ lié, PNJ conservé)
Contraintes métier
- Claim — nécessite une cohérence narrative : le PJ proposé devait pouvoir être présent à ce moment
- Adopt — interdit si le PNJ est déjà réclamé (CLAIMED) ou adopté (ADOPTED)
- Fork — pas de contrainte de cohérence stricte, les deux personnages coexistent
- Conflit — si deux joueurs veulent le même PNJ, le premier à envoyer une demande bloque les autres (statut PENDING)
Flow Adopt (exemple)
Bob voit le PNJ "Viktor" dans un compte-rendu d'Alice :
- Bob envoie une Adopt Request avec un message narratif
- Alice reçoit la notification "Bob veut adopter Viktor"
- Alice accepte avec une réponse narrative
- Le système crée un
CharacterLinkde type Adopt - Viktor change de statut :
ADOPTED, propriétaire = Bob - Une SharedSequence est demandée aux deux joueurs
Cross-instance (fédération)
Quand Bob est sur une instance différente d'Alice, la même mécanique fonctionne via ActivityPub :
- Bob envoie une Adopt Request depuis son instance B
- L'instance B publie un
Offeractivity vers l'inbox d'Alice (instance A) - L'instance A notifie Alice
- Alice accepte — l'instance A publie un
Acceptactivity vers l'inbox de Bob - Le lien est visible sur les deux instances
Toutes les requêtes ActivityPub cross-instance sont signées avec HTTP Signatures (RSA-SHA256).
SharedSequence — règle MVP
Un lien sans SharedSequence est invalide. Après acceptation d'un lien :
- Le lien est accepté → notification aux deux joueurs
- L'initiateur rédige sa partie de la scène (Markdown)
- L'accepteur complète la scène
- Les deux valident → publication sur les deux instances
- La SharedSequence est visible dans les deux parties concernées