Gros problèmes avec Ink

Bonjour,
J’ai eu l’idée de reprendre mon « Thiercelin » pour en tirer un dungeon crawler pour mes trois petits-fils ( eh oui, je suis aussi vieux que ça ) et je trouve leurs réactions très encourageantes.
Pour leur faciliter les choses j’ai décidé d’écrire ça avec Ink et là, problèmes !

Le joueur doit affronter trois kobolds et il doit les tuer un par un, mais bien entendu je ne veux pas qu’un kobold déjà mort revienne au combat !

Supposons donc que j’aie une liste des kobolds vivants déclarée comme ça :

LIST Kob = (Kobold1),(Kobold2),(Kobold3)

A chaque tour, on tire au sort dans la liste avec un RANDOM(1,3) le kobold qui va affronter le joueur. Pas de problème.

A un moment, le Kobold2 est tué.

Alors on fait ~ Kob -= Kobold2
et la liste devient LIST Kob = (Kobold1),Kobold2,(Kobold3)

Problème : si je re-tire au sort pour déterminer le prochain kobold qui va au casse-pipes, bien entendu il ne faut pas que Kobold2 puisse ré-apparaître !
Et ça je ne sais pas faire simplement ( j’ai 50% de sang belge ). Mais alors, pas du tout ! C’est un ignoble bouzin qui m’a d’ailleurs déclenché le deuxième affreux problème ( défaut de conception du compilateur ) :

Quand le compilateur Ink détecte un problème il plante et affiche une bonne vingtaine de lignes de diagnostics pour décrire le problème. Compréhensible.
Seulement voilà : IL NE DIT PAS OU ÇA SE PASSE ! Horreur totale ! Qui pose carrément quelques questions de principe…

Vous ne pouvez évidemment pas m’aider pour le deuxième problème. Mais pour le premier ? Comment faire pour supprimer physiquement un élément d’une liste ?

Merci d’avance :smiley:

Je pense que tu atteins un peu les limites d’ink, dans le sens où le langage n’est pas vraiment fait pour faire un dungeon crawler et manipuler beaucoup de données.

Il n’y a pas de façon toute faite de faire ce que tu demandes — c’est même non trivial —, à cause de la façon dont les listes ink fonctionnent (ce sont des énumérations d’entiers). Au début, il suffit de tirer un nombre parmi {1, 2, 3}. Si on tombe sur 2, alors on l’enlève, et il faudra tirer parmi {1, 3}. On ne peut donc plus simplement prendre un nombre aléatoire entre 1 et 3 puisqu’il y a un trou. Il faut donc déterminer qui il reste dans la liste et tirer parmi ceux-là. (Mais bref, sûrement que tu avais déjà compris ça, mais c’était au cas où.)

On peut utiliser ce code, qui a été écrit par quelqu’un ici.

[code]=== function LIST_ENTRY_N(list, n) ===
{ list:
~ temp entry = LIST_MIN(list) //Get the LIST_MIN. This is the first entry in the LIST.
{ n <= 0:
~ return entry //If you are finally at listVariable[n], then return the entry.
- else:
~ return LIST_ENTRY_N(list - entry, n - 1) //Remove the LIST_MIN entry & iterate again.
}

  • else:
    ~ return () // if you run out return empty list //There is nothing left. Return empty list.
    }

=== function LIST_RANDOM_IN(list) ===
~ temp randomElement = LIST_ENTRY_N(list, RANDOM(0, LIST_COUNT(list) - 1))
~ return randomElement[/code]
La première fonction permet de prendre l’élément N parmi les éléments présents dans la liste seulement. La seconde est un raccourci pour en prendre un au hasard. Ça a l’air un peu compliqué parce que c’est un truc récursif. Le genre de truc qui m’aurait pris du temps à trouver seul, quand même.

Apparemment, c’est un peu lent pour les grosses listes et il y a possibilité qu’ils ajoutent ça de manière officielle dans le futur.

Dernière remarque, ça ne fonctionnera pas sur les variables contenant des éléments provenant de plusieurs listes différentes.

Merci pour ton aide, Natrium ! Tu es un puits de science, comme toujours.

Quelques remarques complémentaires :

Mon dungeon crawler n’est pas bien compliqué, même s’il étonne des garçons de 12 à 15 ans qui n’auraient pas cru cela possible et qui remarquent aussitôt la différence essentielle ( présence d’une véritable histoire, même simple, qui évolue en fonction de leurs choix ) avec leurs jeux vidéo. Et l’interface très simple de Ink leur convient parfaitement.

Le code que tu indiques fonctionne très bien et les performances ne sont pas un problème pour des listes d’une dizaine d’éléments au plus.

Comme toujours, j’ai mis ce combat du joueur contre trois kobolds dans un « jeu » à part, pour ne l’intégrer au reste qu’une fois au point. Il intéressera peut-être quelqu’un ( le diable est dans les détails ), et on le trouvera en pièce jointe ; merci de me prévenir en cas de bugs ! Evidemment, certaines variables globales seront inutiles dans ce cas mais ce n’est qu’un prototype, après tout… Ce qui intéressera peut-être est la modularité du truc.

N’exagérons rien, j’ai juste cherché sur le dépôt d’ink si quelqu’un avait eu le même problème et si ça avait été résolu. Comme je l’ai dit, c’est le genre de truc qui m’aurait vraiment pris de temps à trouver !

Mais tant que ça résout le problème, tant mieux. J’essaierai de regarder ton projet à l’occasion.