Objets et types d’objets aléatoires

Salut à tous !

Me revoici avec un petit défi technique, enfin, défi pour moi, pas pour vous j’espère. :slight_smile:

Pour rappel, je code sur inform 7. Il est de plus utile de préciser que mon jeu compte énormément sur le hasard afin de garantir une rejouabilité conséquente.

Voici ce que je voudrais faire.
Imaginons un endroit, qu’on va nommer Salle. Lorsque le joueur se rend dans cette Salle, le jeu doit y placer un monstre aléatoire. Néanmoins, puisque j’aime bien me compliquer la vie, le monstre en question pourrait ne pas être une chose unique, mais appartenir à un type de chose.

Je sais déjà qu’il est possible de créer des objets similaires, par exemple ainsi :

Un chocolat is a kind of thing. In Salle are 57878884 chocolats.

Oui, je sais, je suis gourmant. Mais passons. Mon but, c’est donc d’arriver à écrire :
« Maintenant il y a dans la Salle un type de monstre aléatoire. »

Je vous remercie d’avance pour vos réponses !

Je ne suis pas certain de comprendre, mais il y a un type « monstre », qui possède des sous-types ? Comme ça :

A monster is a kind of person. A goblin is a kind of monster. A gnoll is a kind of monster. An ogre is a kind of monster.

Puis

Before going to la salle: let K be an random kind of monster; now a random off-stage K is in la salle.
Je ne pense pas que ce soit possible de manipuler des kinds comme ça, pour diverses raisons compliquées (Par exemple, si on dit « a hobgoblin is a kind of goblin », quand on choisit un type de monstre au hasard, faut-il s’arrêter aux sous-types directs de monstre, ou on peut aller plus loin dans l’arbre ?). Il y a une extension qui permettent de faire ça dans une certaine mesure, mais ce serait sûrement te compliquer la vie. Pour voir ce qu’il est possible de faire avec des kinds par défaut dans Inform, il y a des choses dans le chapitre « Advanced Phrases », mais c’est un chapitre vraiment technique (et ça ne t’aidera pas ici).

J’imagine donc qu’il faudra le faire à la main :

Before going to la salle: let N be an random number between 1 and 3; if N is: -- 1: now a random goblin is in la salle; -- 2: now a random gnoll is in la salle; -- 3: now a random ogre is in la salle;
Il doit y avoir moyen de faire plus élégant (avec des tableaux ou des listes ?), mais le principe restera le même : il faudra écrire chaque cas indépendamment.

Je vais essayer de voir s’il y a pas un meilleur moyen. Et si je suis complétement à côté de la plaque et que tu voulais autre chose, désolé.

Bonsoir Natrium !

Rassures-toi, tu n’es pas à côté de la plaque. :slight_smile:

J’ai fait quelques tests et j’ai mieux identifié mon problème qui n’en est plus vraiment un. Cependant, j’aime bien saisir tout à fait les choses.

Prenons cette situation :

Monstre is a kind of personne. Type1 is a kind of Monstre. Type2 is a kind of Monstre.

Si j’en reste là et que je mets :

Before going to Salle : Now a random monstre is in Salle.

J’ai une erreur P15 il me semble. Impossible to move nothing.
Si je rajoute :

M1 is a Type1. M2 is a Type2. M3 is a type3.

Là ça marche. Il semble donc que pour faire appel au hasard, le programme a besoin d’objets et non de types d’objets. Du coup, je peux facilement me constituer une réserve avec tant de monstres de tel ou tel type (et ainsi pouvoir même contrôler les proportions de chaque type). Mais n’est-il pas possible d’éviter cette déclaration préalables de types d’objets en objets ?

C’est normal, parce qu’Inform ne peut pas créer d’objets à la volée, en cours de jeu, donc il essaie de prendre un monstre au hasard parmi tous les monstres du jeu, mais comme il n’y en a pas, il ne prend rien, d’où l’erreur.

(Bon, en fait, il y a une extension pour créer des objets en jeu, mais encore une fois, ça peut te compliquer la vie si tu peux faire autrement. C’est utile par contre si tu fais un RPG ou un roguelike avancé, mais il faut vraiment être sûr de ce que l’on fait.)

Donc oui, il faut créer une réserve de monstre pour chaque type, comme ça :

[code]There are 50 goblins. There are 50 gnolls.

Before going to la salle:
let M be a random off-stage monster;
if M is a monster: [c’est-à-dire si M n’est pas rien]
now M is in la salle;
else:
say « BUG : il n’y a plus de monstres en réserve ! »;[/code]
Et il ne faut pas oublier de recycler les monstres : quand il y en a un qui meurt, ou que le joueur est très loin de son emplacement, il faut le retirer du jeu et le réinitialiser (lui rendre ses points de vie, etc.), sinon le joueur finira par ne plus en rencontrer.

C’est là que ça devient compliqué si on utilise l’extension mentionnée plus haut. Dans ce cas, il faut créer un objet-prototype pour chaque type de monstre, et quand on en veut un nouveau, il faut d’abord vérifier s’il n’y en a pas un hors-jeu qu’on peut réutiliser. Si ce n’est pas le cas, alors on peut cloner le prototype pour faire un nouveau monstre. Ça devient vite complexe : est-ce qu’il faut aussi garder les propriétés et les relations du prototype ? Et il ne faut surtout pas oublier de les recycler, sinon le jeu finira avec des centaines de monstres qui prennent de la mémoire inutilement.

Aussi, pour gérer les proportions, je ne conseille pas de mettre un nombre différent pour chaque type de monstre dans la réserve. Je pense qu’il vaut mieux le calculer soi-même.

if a random chance of 2 in 3 succeeds: [on met un gobelin comme montré plus haut]; else: [on met un gnoll];
Encore une fois, il doit y avoir un moyen de gérer ça plus facilement, avec des tableaux, des activités ou des relations (tout dépend de comment tu gères les monstres).

(note technique : la tournure « a random [truc] » ne prend pas en argument des types ou des objets. Elle prend une description (voir le chapitre 6). Pour faire court, il s’agit d’un ensemble d’objet ayant certaines caractéristiques. C’était la même chose dans la boucle « repeat ».)

Encore une fois, tes explications sont très complètes et je t’en remercie.

Je ne vais pas avoir besoin d’utiliser l’extension que tu m’as indiquée pour ce projet, d’autant plus que la structure de celui-ci va facilement me permettre de recycler les éléments en cas de besoin. Je n’ai plus de question, tout est clair pour moi.

Bon, j’imagine que je tomberai bien sur un autre truc qui va me bloquer, mais pour l’heure, les difficultés techniques sont derrières moi.

N’hésites pas à me dire si mes pavés sont trop gros. J’ai tendance à écrire beaucoup quand il s’agit d’expliquer des choses. :slight_smile:

Ha non, pour moi tes pavées ne sont pas trop gros. J’aime les détails et la précision. Dans mon précédent topic, l’une de tes explications bonus m’a servi. Sans ça, j’aurais peut-être dû poser une nouvelle question.

Quand je me suis lancé dans Inform 7, une de mes craintes était de manquer de maîtrise, de devoir me cantonner à un tout petit sentier élémentaire et d’entrevoir d’inaccessibles étendues dans toutes les directions. Mes connaissances en Anglais sont parcellaires. Du coup, je n’arrive à me servir de la documentation que quand j’ai saisi les concepts de base dont traites les articles. Et pour ça, rien de mieux que d’avoir quelqu’un qui explique bien les choses.