[i7] liste d'identité

Bonjour/Bonsoir à tous,

ça fait maintenant presque deux ans que je n’ai rien posté ici, et à peu près autant de temps que je n’ai pas essayé de bidouiller inform et les théories de game design. J’ai maintenant la chance de pouvoir m’y consacrer un peu et j’envisage même de participer au concours 2019 s’il aura lieu.

En tout cas ça fait plaisir de voir le forum toujours aussi actif et regorgeant de tant de sujets tous aussi instructifs les uns que les autres.

Voici mon problème :

Je voudrais, dans le but d’ancrer le joueur avec le personnage joueur, assigner à ce dernier un ensemble de phrases qui seraient autant de caractéristiques qui le définiraient (d’une certaine manière ces phrases feraient à la fois office de Points de vie, de caractéristique, de compétences et de buts à atteindre). Ces phrases, non seulement donneraient des indications au joueur sur l’identité de son personnage mais seraient en plus autant de leviers possibles pour faire avancer l’intrigue dans un sens ou dans l’autre. Ces phrases seraient donc dynamiques et le personnage joueur pourrait en acquérir comme il pourrait en perdre. De plus, il faudrait que le joueur à l’entrée d’une commande puisse consulter la liste de toutes les phrases qui le définissent.

Voici par exemple ce que cela pourrait donner sur une entrée de commande :

  • Je suis alcoolique et je poursuis une vendetta contre mon beau-frère
  • J’ai été élevé avec des valeurs traditionalistes et machiste
  • J’aime les chats et les hamsters
  • J’ai un cancer du foie

Mon problème est en fait un problème de conception, j’ai d’abord essayé de faire un tableau dans lequel j’entrais toutes les phrases avec un nom raccourcis pour m’y référer mais à partir d’un tableau, comment assigner des rangs de ce tableau au joueur ?

J’ai ensuite pensé faire un tableau avec les phrases initiales et des rangs vides. Ainsi, dès que le joueur acquière de nouvelles phrases celles-ci sont rentrées dans le tableau sur les rangs vides. Cependant, mon problème c’est que dès que j’efface un rang je me retrouve avec une erreur.
J’ai aussi pensé à faire une liste…

Bref, je crois que j’ai besoins d’idées neuves pour résoudre mon problème. De quelle manière vous y prendriez-vous pour facilement ajouter ou retirer des phrases dans la liste et pour tester si certaines phrases sont présentes ou pas dans cette liste ?

Est-ce que chaque point de ta liste ne correspond qu’à une seule phrase ? Par exemple, « Je suis alcoolique et je poursuis une vendetta contre mon beau-frère » est-elle une seule phrase, ou bien la combinaison de deux (« je suis alcoolique » et « je poursuis une vendetta ») ?

Si c’est le second cas, ça sera assez compliqué de combiner plusieurs faits entre eux alors j’assume qu’il s’agit du premier cas.

Un tableau pourrait fonctionner, mais ce ne serait pas très pratique. Si tu choisis cette voie, le plus simple serait d’ajouter une colonne de true et de false en fonction de si le joueur possède cette phrase ou pas. Mais après,c’est assez lourd de séléctionner une phrase (ça ferait un truc du style : dans le tableau X, choisir la ligne ayant un fait dont la valeur est « je suis alcoolique »; si l’entrée « possédé » est vrai…).

Une liste serait effectivement plus facile à gérer, mais pareil, ça ne me semble pas naturel de procéder ainsi.

En fait, je pense que tu essaies de faire trop sophistiqué ; pour moi, le plus simple serait de créer un type d’objet correspondant aux faits, et de leur ajouter une propriété quand le joueur les possède.

[code]A fact is a kind of thing.
A fact can be pertinent. A fact is seldom pertinent.

Fait alcoolique is a fact.
The description is « Je suis alcoolique et je poursuis une vendetta contre mon beau-frère. ».

Fait cancer is a fact.
The description is « J’ai un cancer du foie. ».[/code]
Et là ça devient très facile à manipuler:

[code][Rendre un fait pertinent:]
now fait cancer is pertinent;

[Tester si un fait est pertinent:]
if fait alcoolique is pertinent:

[Afficher tous les faits pertinents:]
repeat with F running through pertinent facts:
say « [Description of F][line break] »;[/code]
Avec cette manière, ça devient aussi plus facile d’attacher d’autres informations à des faits : par exemple, le joueur pourrait avoir un cancer (propriété pertinent) mais ne pas le savoir (une propriété connu).

Si jamais ces phrases peuvent aussi bien décrire le joueur que des PNJ, alors il faudra remplacer les propriétés par des relations (ce qui donnerait now Fact X describes Person Y).

Voilà, j’espère avoir bien compris ce que tu souhaitais !

[j’édite mon poste car je me rends compte que j’avais mal compris]

Oui c’est effectivement du premier cas dont il s’agit.

Sinon tout ce que tu décris c’est exactement ce que j’avais en tête !

En tout cas merci pour ce défrichage, je vais essayer de suivre cette piste !

La solution proposée par Natrium est très bonne :wink:

En fait c’est quelque chose de plus général, que j’ai déjà vu appliquée dans pas mal de contextes différents : dès qu’on a une liste de choses à manipuler en Inform, on les implante comme des objets et on les met à l’intérieur d’un gros objet. J’ai déjà vu :

  • Dans un jeu de détective, les faits connus du détective sont des objets dans l’inventaire du détective.
  • Dans l’extension « DMenus.h », les options du menu sont des objets tous à l’intérieur d’un objet « MonMenu ».
  • Dans l’extension « Achievements » de vlaviano, chaque succès/trophée/achievement est un objet, et il y a un gros objet contenant tous les trophées non débloqués et un gros objets avec les trophées débloqués.
  • Dans un de mes jeux j’ai modélisé chaque sujet de conversation possible comme un objet.
  • Des extensions permettant de faire des dialogues à choix multiples traitent chaque option comme un objet.

L’avantage c’est qu’un objet en Inform a une description, un nom, un emplacement, et peut être verrouillé, caché, etc. ; on peut aussi accéder à la liste de sous-objets à l’intérieur d’un objet. Tout ceci donne pas mal de ressource !

Mmh ça me donne une idée d’article tout ça…

Pour ajouter à ce que Mule a dit, c’est en fait une solution très standard dans les langages très orientés objets. En Python, on n’utiliserait jamais une liste globale pour ce genre de chose, on créerait une nouvelle classe d’objet.

Un petit défaut avec Inform (mais qui peut aussi être un avantage), c’est qu’une chose vient avec toute une panoplie de relations, de propriétés et autres, qui ne seront pas forcément utiles et qui prendront de la mémoire inutilement. On peut remédier à ce problème en utilisant un kind of object (qui est le type le plus haut, le plus abstrait et avec le moins de propriétés) plutôt qu’un kind of thing, mais ça n’est en général pas un problème. Après tout, de la mémoire, on en a en masse, il n’y a pas raison de s’inquiéter.