|
INCLUDE relations-system.ink |
|
INCLUDE mes-relations.ink |
|
INCLUDE texte.ink |
|
INCLUDE utils.ink |
|
|
|
|
|
/* |
|
Objectif : il y a 3 bols, il faut déposer dans chacun le bon objet (qu'on déduit de la forme dessinée au fond du bol) et qu'il soit fait du même matériau. Au besoin, le transmuteur permet de changer le matériau d'un objet. |
|
*/ |
|
|
|
|
|
// Quelques relations initiales |
|
~ relate(Pièce, EstEn, Cuivre) |
|
~ relate(Pièce, EstDeForme, Triangle) // Et ouais |
|
~ relate(Dé, EstEn, Bois) |
|
~ relate(Dé, EstDeForme, Carré) |
|
~ relate(Bille, EstEn, Verre) |
|
~ relate(Bille, EstDeForme, Cercle) |
|
|
|
// Oh, on peut gérer un inventaire avec les relations ! |
|
~ relate(Hervé, Possède, Dé) |
|
~ relate(Hervé, Possède, Bille) |
|
// La pièce est dans une salle |
|
|
|
// On veut tirer des matières au hasard sans piocher 2 fois la même. |
|
// On fait donc une copie de la liste dont on va à chaque fois enlever un élément aléatoirement (pop_random, une fonction disponible dans l'éditeur Inky). |
|
~ temp m = LIST_ALL(Matières) |
|
~ relate(BolGauche, EstEn, pop_random(m)) |
|
~ relate(BolCentral, EstEn, pop_random(m)) |
|
~ relate(BolDroit, EstEn, pop_random(m)) |
|
|
|
~ temp f = LIST_ALL(Formes) |
|
~ relate(BolGauche, Réclame, pop_random(f)) |
|
~ relate(BolCentral, Réclame, pop_random(f)) |
|
~ relate(BolDroit, Réclame, pop_random(f)) |
|
|
|
// Si c'était un vrai jeu et pas juste un exemple, on pourrait vouloir s'assurer qu'on n'est pas tombé aléatoirement sur un cas trop simple à résoudre (tous les objets déjà de la bonne matière). |
|
|
|
|
|
-> intro |
|
|
|
=== intro |
|
À la lueur de sa lampe à pétrole, Sandrine termine de déchiffrer ce qui ressemble à des instructions peintes sur la paroi de la grotte. Pour votre part, plus modestement, vous essayez de lire l'heure sur votre montre. Vous savez très bien l'heure qu'il est puisque vous consultez les aiguilles au moins trois fois par ligne que Sandrine arrive à décoder. |
|
|
|
— Détends-toi Hervé, s'il te plait. Plus tu trépignes et plus c'est difficile pour moi de me concentrer. J'arrive à la fin, je pense avoir saisi l'idée générale. |
|
|
|
Elle prend encore cinq interminables minutes puis se redresse. |
|
|
|
— Si je comprends bien ces symboles, il faut déposer le bon objet dans chacun de ces trois petits bols, et si on ne se trompe pas, un trésor sera revélé. |
|
|
|
+ [Le médaillon ?] |
|
- |
|
|
|
— Ça dit si c'est bien le médaillon de Nicolas Flamel ? demandez-vous. |
|
|
|
— Je ne suis pas sûre, la moitié des symboles sont ambigus, tu sais… Il me semble clair que ce n'est pas la pierre philosophale. Peut-être un autre transmuteur mineur, comme celui de tout à l'heure. |
|
|
|
— Et si on se trompe pour les bols ? |
|
|
|
— Classique, un énorme rocher sera libéré et roulera vers nous jusqu'à nous écraser inexorablement… |
|
|
|
+ [Continuer] -> salle_des_bols |
|
|
|
=== pre_fin(status) |
|
Vous remplissez le dernier bol avec ce que vous espérez être le bon objet. |
|
|
|
— Sandrine, comment sait-on si c'est bon ? Il ne se passe rien. |
|
|
|
— Chut… Il y a peut-être un mécanisme qui s'active. |
|
|
|
Vous tendez l'oreille, en vain. |
|
|
|
— Éteins la lampe, ordonne Sandrine, je crois que je vois quelque chose ! |
|
|
|
— Mais il va faire tout noir… |
|
|
|
— Éteins, je te dis ! |
|
|
|
Vous soulevez le verre qui protège la flamme et soufflez sur celle ci. En quelques secondes, vos yeux s'habituent à l'obscurité et vous remarquez enfin ce que Sandrine a repéré. Les bols semblent luire d'une teinte {status == Victoire:verte|rouge}. La lueur est d'abord presque imperceptible puis, petit à petit, son intensité augmente jusqu'à faiblement éclairer la salle. |
|
— {status == Victoire:Vert|Rouge}, c'est bien, non ? Et je n'entends pas de gros rocher qui roule… |
|
->-> |
|
|
|
=== victoire |
|
-> pre_fin(Victoire) -> |
|
La lueur continue à croître jusqu'à la limite de l'inconfort puis quitte soudainement les bols sous la forme de trois rayons qui vous frappent avant même que vous ayez le temps ne serait-ce que de songer à les éviter. |
|
Pendant quelques secondes, c'est vous qui brillez de cette étrange lumière verte. Impossible de dire quoi, mais vous sentez qu'elle vous fait quelque chose, qu'elle vous change. Un frisson vous parcourt puis la lumière disparait. |
|
— Hervé ! crie Sandrine, morte d'inquiétude. Ça va ? Où es-tu, je ne vois rien ! |
|
— Ça va, enfin, je crois, tentez-vous de la rassurer. |
|
Vous entendez Sandrine tâtonnez dans le noir pour vous retrouver. Vous tendez la main pour attraper la sienne et tressaillez sous le choc : sa main est dure et froide. |
|
— Aah ! hurle Sandrine. Qu'est-ce que… Ça se propage Hervé ! Arrête ! |
|
Vous lui lâchez la main mais elle continue de crier. |
|
— Ça ne s'arrête pas ! Ma gorge ! Hervé, c'est toi le transmut- |
|
|
|
-> END |
|
|
|
=== defaite |
|
-> pre_fin(Défaite) -> |
|
La lueur continue à croître, encore et encore, et devient inconfortable. Ce n'est plus une lueur, les bols sont en flamme et vous sentez leur chaleur, qui devient vite intolérable. |
|
Alors que vous attrapez la main de Sandrine pour courir vous réfugier dans la salle du transmuteur, les bols se mettent soudainement à irradier avec la puissance d'une étoile et vous vaporise tous les deux en un instant. |
|
|
|
-> END |
|
|
|
|
|
=== salle_des_bols |
|
{ TURNS_SINCE(-> salle_du_transmuteur) == 1: |
|
Vous reprenez le tunnel jusqu'aux bols. |
|
- else: |
|
Trois bols sont alignés sur un piédestal en pierre. |
|
} |
|
// Ne montrer que les bols tant qu'on ne les a pas tous examinés |
|
// On pourrait gérer ça avec un simple compteur de visite (vu_bol_xyz) sur chaque choix de bol, mais c'est un article sur les relations ;-) |
|
~ temp tous_bols_vus = LIST_COUNT(whatIs(Hervé, Connait)) == 3 |
|
|
|
+ [Bol gauche {info_bol(BolGauche)}] -> menu_bol(BolGauche) -> |
|
+ [Bol central {info_bol(BolCentral)}] -> menu_bol(BolCentral) -> |
|
+ [Bol droit {info_bol(BolDroit)}] -> menu_bol(BolDroit) -> |
|
+ {tous_bols_vus} |
|
[{salle_du_transmuteur:Aller au transmuteur|Explorer la grotte}] |
|
-> salle_du_transmuteur |
|
+ {tous_bols_vus} |
|
[Inventaire] |
|
-> inventaire -> |
|
- |
|
-> redirect_0(-> salle_des_bols) |
|
|
|
=== menu_bol(bol) |
|
~ relate(Hervé, Connait, bol) |
|
~ temp contenu = whatIs(bol, Contient) |
|
~ temp matière = whatIs(bol, EstEn) |
|
~ temp symbole = whatIs(bol, Réclame) |
|
|
|
Ce bol est {texteMatiere(matière)}. |
|
<> {contenu:Il contient {t("un", contenu)}|Il est vide}. |
|
<> {contenu:Sous {texteObjet("le", contenu)}|Au fond}, vous distinguez un symbole : {texteSymbole(symbole)}. |
|
|
|
// S'il y a quelque chose dans le bol, on peut le reprendre, sinon on peut y déposer un objet |
|
+ {contenu} [Reprendre {contenu}] |
|
~ relate(Hervé, Possède, contenu) |
|
~ unrelate(bol, Contient, contenu) |
|
+ {not contenu} [Déposer] -> menu_deposer(bol) -> |
|
// Après un dépôt, on vérifie les bols |
|
{ verifier_bols(): |
|
- Victoire: -> victoire |
|
- Défaite: -> defaite |
|
} |
|
+ [Retour] |
|
- |
|
->-> |
|
|
|
=== salle_du_transmuteur |
|
|
|
{ TURNS_SINCE(-> salle_des_bols) == 1: |
|
{La grotte n'est constituée que de deux chambres connectées par un étroit tunnel. Vous vous retrouvez donc la salle du transmuteur que vous aviez découvert précédemment avec Sandrine.|Vous vous faufilez jusqu'au transmuteur} |
|
} |
|
// Vu qu'on ne s'est pas embêté à gérer de manière générique la possibilité qu'une salle contiennent des objets, on gère la pièce en cuivre ainsi : si ni Hervé ni le transmuteur ni un bol ne contient la pièce, alors elle est dans la salle du transmuteur. |
|
~ temp piece_ici = LIST_COUNT(whatIs(Contient, Pièce) + whatIs(Possède, Pièce)) == 0 |
|
{piece_ici: Un objet triangulaire traine dans la poussière.} |
|
|
|
~ temp contenu_transmuteur = whatIs(Transmuteur, Contient) |
|
|
|
+ {piece_ici} [Ramasser l'objet triangulaire] |
|
Vous ramassez le triangle, qui semble {texteMatiere(whatIs(Pièce, EstEn))}. Vous reconnaissez le symbole qui est gravé sur une des faces : c'est une pièce de monnaie. |
|
~ relate(Hervé, Possède, Pièce) |
|
+ {contenu_transmuteur} [Récupérer {t("le", contenu_transmuteur)}] |
|
~ relate(Hervé, Possède, contenu_transmuteur) |
|
~ unrelate(Transmuteur, Contient, contenu_transmuteur) |
|
+ {not contenu_transmuteur} [Déposer un objet dans le transmuteur] |
|
-> menu_deposer(Transmuteur) -> |
|
~ contenu_transmuteur = whatIs(Transmuteur, Contient) |
|
{ contenu_transmuteur: |
|
-> transmuter(contenu_transmuteur) -> |
|
} |
|
+ [Retourner dans la chambre des bols] |
|
-> salle_des_bols |
|
+ [Inventaire] |
|
-> inventaire -> |
|
- |
|
-> redirect_0(-> salle_du_transmuteur) |
|
|
|
|
|
=== menu_deposer(contenant) |
|
~ temp objets = whatIs(Hervé, Possède) |
|
{ LIST_COUNT(objets) == 0: |
|
Vous n'avez rien à déposer. |
|
->-> |
|
} |
|
// On utilise un thread résursif pour générer un choix pour chaque item de la liste |
|
<- thread_choix_deposer(contenant, objets, -> retour) |
|
+ [Retour] |
|
- (retour) // On a besoin d'un point de retour pour que le thread puisse revenir dans le tunnel |
|
->-> |
|
|
|
|
|
=== thread_choix_deposer(contenant, liste, -> retour) |
|
~ temp item = LIST_MIN(liste) |
|
{ item: |
|
<- thread_choix_deposer(contenant, liste - item, retour) |
|
+ [Déposer {t("le", item)}] |
|
~ unrelate(Hervé, Possède, item) |
|
~ relate(contenant, Contient, item) |
|
-> retour |
|
} |
|
|
|
=== inventaire |
|
~ temp objets = whatIs(Hervé, Possède) |
|
{ objets: |
|
Vous avez : |
|
-> recursion_objets(objets) -> |
|
- else: |
|
Vous n'avez rien. |
|
} |
|
->-> |
|
|
|
=== recursion_objets(liste) |
|
~ temp item = LIST_MIN(liste) |
|
{ not item: ->-> } |
|
\- {t("un", item)} |
|
-> recursion_objets(liste - item) -> |
|
->-> |
|
|
|
=== transmuter(objet) |
|
~ temp matière = whatIs(objet, EstEn) |
|
{ not matière: ->-> } |
|
~ temp nouvelle_matière = rotate_list_item(matière) |
|
Le transmuteur vibre un moment puis s'arrête. |
|
{t("Le", objet)} est désormais {texteMatiere(nouvelle_matière)}. |
|
~ unrelate(objet, EstEn, matière) |
|
~ relate(objet, EstEn, nouvelle_matière) |
|
->-> |
|
|
|
|
|
=== function info_bol(bol) |
|
// Afficher les infos uniquement si le bol est connu |
|
~ temp connu = isRelated(Hervé, bol, Connait) |
|
{ not connu: |
|
~ return |
|
} |
|
~ temp contenu = whatIs(bol, Contient) |
|
~ temp matière = whatIs(bol, EstEn) |
|
~ temp texteContenu = "{contenu:contient {t("un", contenu)}|vide}" |
|
~ return "({texteMatiere(matière)}, {texteContenu})" |
|
|
|
=== function verifier_bols() |
|
LIST StatutBols = Incomplet, Victoire, Défaite |
|
~ temp contenuGauche = whatIs(BolGauche, Contient) |
|
~ temp contenuCentral = whatIs(BolCentral, Contient) |
|
~ temp contenuDroit = whatIs(BolDroit, Contient) |
|
|
|
// Si < 3 contenus, le puzzle est incomplet |
|
{ LIST_COUNT(whatIs((BolGauche, BolCentral, BolDroit), Contient)) < 3: |
|
~ return Incomplet |
|
} |
|
{ verifier_bol(BolGauche) and verifier_bol(BolCentral) and verifier_bol(BolDroit): |
|
~ return Victoire |
|
- else: |
|
~ return Défaite |
|
} |
|
|
|
=== function verifier_bol(bol) |
|
// On valide l'objet et sa matière |
|
~ temp contenu = whatIs(bol, Contient) |
|
~ temp matière_contenu = whatIs(contenu, EstEn) |
|
~ temp forme_contenu = whatIs(contenu, EstDeForme) |
|
~ temp bol_ok = isRelated(bol, forme_contenu, Réclame) and isRelated(bol, matière_contenu, EstEn) |
|
~ return bol_ok |