Espaces disgracieux

Oui mais justement, créer un objet par mot-clef serait vraiment beaucoup plus pratique, et plus dans la philosophie d’Inform, selon moi.

Ça permet justement de supprimer tous les « if the player’s command matches », et d’utiliser le parser d’Inform plutôt que le tien qui est vraiment rudimentaire.
Ça devient plus facile d’ajouter des synonymes avec des « understand » (pas besoin d’écrire « il the player’s command matches « truc » or the player’s command matches « machin » or the player’s command…).
L’organisation du code est meilleure, puisque tu peux mieux organiser les règles (« carry out examing the néons when the néons are lit… »).
Ça ne fait pas passer un tour quand le joueur tape n’importe quoi.

Pareil pour le système de joueur. Vider l’inventaire à chaque fois, si tu peux l’éviter, c’est mieux. Et changer le player a d’autres bénéfices : ça permet de tester si tel ou tel personnage a fait telle action dans le passé ou a été dans tel ou tel endroit.

J’ai toujours l’impression que tu essaies d’injecter ton propre système dans Inform, alors qu’Inform sait déjà le faire, vraisemblablement mieux que toi. Je suis certain que ça va finir par te jouer des tours, comme par exemple le problème original de ce sujet.

J’ai l’impression qu’on a déjà eu cette discussion. :frowning:

Même si ce n’est pas le problème initial de ce sujet, je me permet de continuer, puisque on a commencé (et que c’était peut-être lié).

Voici une autre idée, si vraiment tu tiens à ton parser maison : plutôt que d’utiliser une action qui intercepte tout texte tapé par le joueur, il serait peut-être plus judicieux de placer l’analyse de la commande dans la règle « after reading a command ». Il s’agit de la règle qui se lance après que le joueur a tapé sa commande, mais avant qu’elle soit analysée par le jeu.

L’avantage par rapport à l’action texting, c’est qu’il n’y a plus à désactiver tous les verbes à la main, puisque tu interceptes la commande avant qu’elle ne soit analysée ; la commande n’est jamais convertie en action.

En revanche, il ne faut pas oublier de faire avancer le temps et le compteur de tours manuellement si ce qu’a tapé le joueur est considéré comme valide (ce n’est pas strictement obligatoire, mais c’est plus prudent de le faire quand même).

Il y a un exemple de cette technique dans le manuel : « Fragment of a Greek Tragedy ».

Bien sûr, je reste partisan de modéliser le système avec des objets. J’ai lu ton article sur L’Observatoire, et maintenant que je sais un peu mieux ce que tu veux, je réfléchis à un moyen de l’implanter. Comme tu souhaites garder le système d’objets et de relations d’Inform (et que c’est pourquoi tu ne veux pas utiliser Twine), je trouve que ce serait mieux un système comme Blue Lacuna : cliquer sur le nom d’un lieu convertit en l’action going, cliquer sur le nom d’un objet, en l’action examining (et chaque objet aurait une liste d’actions associées qui serait affichée comme ton histoire de revolver). Il faudrait juste créer un nouveau type pour des mots-clefs qui représentent autre chose.

Enfin, deux dernières remarques et j’arrête : je viens de regarder vite fait le code source (j’avais pas vu qu’il était disponible), et il y a deux choses que tu ne devrais plus faire, car ce sont de mauvaises habitudes de programmation.

N’utilise pas les truth states comme des variables à tout stocker. Il y en a des tonnes et tu vas finir par oublier de les actualiser. Il y a plein d’autres moyens plus pratiques de savoir ce que le joueur a fait ou peut faire : les scènes, les conditions au passé (if we have taken the revolver), les tests sur des propriétés (if the machin is visited)… Au pire, n’utilise pas des booléens libres, utilise des propriétés liées à des objets (The machin can be patati or patata).

Deuxième chose, n’utIlise pas de méga-règles qui contrôlent toutes les situations. Casse-les en plus petites, qui contrôlent juste un aspect (par exemple, une règle par mot-clef, plutôt qu’une règle pour tous les mots-clefs à la fois).

Voilà, désolé si j’ai débordé du sujet, mais je pense que c’est important. Après, rien ne te force à quoi que ce soit.
(il faut vraiment que j’apprenne à écrire moins de pavés.)

Rassure-toi, je suis moins une tête de mule qu’il n’y paraît.

J’ai commencé à revoir mon code et j’ai bel et bien implémenté des mots-clés qui sont des objets, sur le modèle :

[code]ImmeublesWord is a GameWord in AllémanesHub. Understand « immeubles » as ImmeublesWord.

Instead of keywording ImmeublesWord :
say « [line break]En pierre de taille, hauts de trois à cinq étages, abritant parfois un commerce au rez-de chaussée. Balcons fleuris et larges fenêtres, généralement obscures, mais qui parfois laissent deviner de riches intérieurs. Hautes et larges portes, qui cachent parfois des cours intérieures ou des jardins inacessibles, invisibles aux passants. » ; say the waitkey ; clear the screen ; try looking.[/code]

Je garde Texting au cas où l’activation d’un mot-clé ouvre un menu :

Instead of keywording OmbresWord : say "[line break]La piscine marque le croisement avec la rue du Placieux, longue et morne, faite de logements populaires, d[']immeubles anciens et poussiéreux, humides, aux cheminées fumantes ; les fenêtres laissent voir des intérieurs modestes, peuplés d[']ouvriers, d[']étudiants, de vieilles personnes, tout le petit peuple d[']Azthath. Un bistrot fait le croisement, îlot de lumière et de vie dans la pénombre ambiante, d[']où s[']échappe une musique joyeuse[if BistrotEntrable is true]. Vous repensez aux femmes brûlées, à vos camarades disparus[end if]. L[']autre rue que croise le boulevard des Allémanes est celle dite du Maréchal : des maisons Art Nouveau, à la gloire passée, mais où vit encore dans l'entre-soi une bourgeoise locale frileuse et coupée du monde. Des casernes leur font face, plus ou moins dissimulées, protégées, derrière un haut mur qui court tout le long de la rue[if EtoileVisible is true] ; la lumière verdâtre et étrange de l[']étoile leur donne un aspect hanté[end if]." ; say line break ; if BistrotEntrable is true, say "• Vous entrez dans le [fcs]bistrot[endfcs]." ; if CasernesEntrables is true, say "• Vous longez le mur des [fcs]casernes[endfcs]." ; say "• Vous retournez vers l['][fcs]Observatoire[endfcs]." ; now OmbresKeywords is true.

puis


[...]

otherwise if the player's command matches "bistrot" and OmbresKeywords is true and BistrotEntrable is true ;
	now the CurrentPéripétie is BistrotPéripétie ; say "[line break]Vous poussez les portes vitrées du bistrot, actionnant une petite sonnette au-dessus de la porte, que personne n[']entend. Un joyeux brouhara règne sur les lieux, les conversations et les rires couvrant une musique exotique et entraînante déjà bien forte. C[']est un bar de quartier, sans prétentions, avec sa clientèle de locaux et d[']habitués, ses nappes à carreaux et son vieux zinc devant lequel sont disposés des tabourets hors d[']âge, mais sa 'particularité' vous frappe d[']emblée : toutes les serveuses, elles sont une demi-douzaine, sont des érèbes, au teint hâlé, aux longs, cheveux noirs et bouclés, et toutes, sans exception, ont le visage brûlé, méconnnaissable ; elles n[']ont plus de nez, plus de lèvres, plus d[']oreilles, leur peau est lisse comme toutes celles qui ont connu le feu. Les femmes sont joyeuses et plaisantent avec les clients ; il ne semble pas y avoir de supérieure ni de subordonnées parmi elles. Des photos sont accrochées aux murs, montrant des paysages anonymes - fermes misérables à l[']orée du désert, forteresses de terre, immémoriales, marchés couverts, hommes et femmes en tenues traditionnelles qui filent la laine ou conduisent des troupeaux. Vous n[']avez pas besoin d[']identifier précisément tout cela pour savoir qu[']il n[']en reste que des cendres et des os ; et quelques survivantes, joyeuses malgré tout." ; 

[...]

Je vais essayer ton truc de « After reading a command », que je ne connaissais pas.

Sinon, le passage des tours en tant que tel n’a aucune importance dans mes jeux (en tous cas dans celui-ci). De même que le score.

Je sais bien que les truth states ne sont pas la panacée. J’ai été au plus simple sachant le peu de temps que j’avais pour boucler le jeu.

Et pour les mots-clés qui renvoient à des vrais objets (une banane, un flingue) c’est encore une autre action / règle, qui ouvre un menu contextuel selon la kind de l’objet.

C’est ce que je disais, ce n’est pas obligatoire de faire avancer les tours, mais je trouve ça toujours sympa quand tu sais que t’as passé 793 tours à jouer. Et c’est plus prudent dans le sens que si jamais un jour t’en a besoin, c’est déjà là.

Sinon, j’imagine que c’est possible d’avoir des menus sans texting : par exemple, chaque mot-clef peut posséder un tableau représentant le menu lui étant associé. Tu stockes le dernier mot-clef tapé par le joueur dans une variable et si ce mot-clef possèdent un tel tableau, tu empêches le joueur d’interagir avec autre chose que ce qu’il y a dans le tableau.
Ça m’a pris 10 secondes pendant l’écriture de ce post pour inventer cette solution, alors ce serait à tester plus amplement, pour voir si ça fonctionnerait correctement.