Checkpoint

Bonjour,
je suis enseignant en SES.
Cette année j’ai décidé de créer un jeu pour les élèves de terminale qui souhaitent réviser leur programme de sciences économiques et sociales tout en s’entraînant à l’épreuve de Grand Oral. J’utilise pour cela Twine 2 sous Linux mint.
L’histoire que je suis en train de développer couvrira l’ensemble du programme. Il s’agit donc d’un jeu destiné à durer plusieurs semaines pour que les élèves aient le temps d’apprivoiser les notions, les méthodes et les raisonnements tout en évoluant dans un monde parallèle à celui qu’ils expérimentent dans leur lycée.
Je souhaite donc que les joueurs aient la possibilité de sauvegarder sous forme de checkpoints à certains moments de l’histoire pour avoir la possibilité de la reprendre plus tard. J’utilise Harlowe mais je suis néophyte en matière de programmation. Est-il possible de générer facilement un code pour permettre au joueur d’effectuer une sauvegarde dans le fichier html du jeu?
Merci,
Pierre

Oui, c’est possible ! Les sauvegardes seront stockées dans le navigateur utilisé par les joueurs, donc il faudra les prévenir de ne pas effacer leurs cookies entre deux sessions, sans quoi leur progression sera perdue.

Cela peut être très simple à implémenter, si on a besoin que d’un seul emplacement de sauvegarde, par exemple, le code suivant :

(link-repeat: "Sauvegarder")[(save-game: "Sauvegarde")]

Crée un lien affichant « Sauvegarder », qui ne disparaît pas quand on clique dessus (c’est le rôle de la macro (link-repeat:)), et sauvegarde l’état actuel de la partie (le passage sur lequel on est, l’état de toutes les variables, etc.) dans un fichier intitulé « Sauvegarde » (c’est ce que fait la macro (save-game:), donner un nom à la sauvegarde n’est pas essentiel si on utilise un seul emplacement, mais ça ne coûte pas plus cher, et ça rend les choses plus faciles si on veut par la suite un système à plusieurs emplacements).

Pour pouvoir charger la sauvegarde, il faut utiliser la macro (load-game:), voici le code associé, pour le même cas très simple à un seul emplacement :

(link-repeat:"Charger")[(if: (saved-games:) contains "Sauvegarde")[(load-game: "Sauvegarde")]]

On a de nouveau un (link-repeat:) pour créer le lien qui ne disparaît pas, on vérifie ensuite qu’une sauvegarde sous ce nom existe bien avec un (if:) et, si c’est le cas, on charge la dite sauvegarde.

J’avais utilisé ce code là dans un passage « footer », les liens apparaissaient donc à la suite de tous mes passages, ce qui permettait de sauvegarder et charger à tout moment. C’est pour cela que je ne voulais pas que le lien disparaisse quand on clique dessus, et que ces liens ne faisaient que ça. Pour un système avec des checkpoints, il suffit juste de n’inclure des liens qui incluent (save-game:) qu’au moment voulu, et il est parfaitement possible de « cacher » l’opération de sauvegarde dans un lien qui fait aussi autre chose, par exemple, conduit à un autre passage, en utilisant la macro (go-to: « Titre du passage de destination »), il suffit de mettre tout ce qu’on veut entre les crochets.
Petite subtilité : quand on charge une sauvegarde, le passage en cours est réaffiché « de zéro », donc si il incluait de l’aléatoire, les dés sont tirés une nouvelle fois à chaque chargement.

Pour plus de détails, le passage correspondant de la documentation est ici : https://twine2.neocities.org/#macro_load-game
J’espère que c’est assez clair, n’hésitez pas à demander des précisions si besoin !

Super,
merci beaucoup. Ça fonctionne très bien. J’avais lu la documentation sans parvenir à coder correctement. Les élèves vont pouvoir à présent jouer sur de courtes période et sauvegarder leur progression.
Pierre