[I7] Prolifération des objets idiots (2)

Bonjour,

Par ce titre accrocheur j’entends la nécessité de créer et de mettre en place des objets qui n’ont pas d’autre intérêt ( limité ) qu’un rôle purement décoratif.
Il y a un an j’avais mis un post sur ce sujet et on m’avait donné une excellente solution : les backdrops. C’est très bien, mais ce n’est pas toujours suffisant. Certains objets, pourtant parfaitement banaux, doivent pouvoir être regardés, par exemple. Alors, toujours acharné à ne pas déclarer des objets qui ne servent à rien, j’ai trouvé ça :

"Test" by thierry_st_malo (in French)
[Include Exit Descriptions by Matthew Fletcher.]

La table is a thing.
The description of table is "Pas à dire, c'est une belle table.".

La chaise is a thing.
Le canapé is a thing.
Le tabouret is a thing.

A room has a number called furniture.
The furniture of the room is usually -1.

Bureau is a room.

Salon is north of cuisine and east of bureau.
The furniture of salon is 1.

Cuisine is a room.
The furniture of cuisine is 2.

Table of Mobilier
ROWID	MEUBLES
1	{table, canapé}
2	{table, tabouret}

Before going to salon:
	let N be the furniture of salon;
	if N is not -1:
		choose the row N in Table of Mobilier;
		let L be a list of things;
		now L is the MEUBLES entry;
		repeat with meuble running through L:
			now meuble is in salon;
	
Before going to cuisine:
	let N be the furniture of cuisine;
	if N is not -1:
		choose the row N in Table of Mobilier;
		let L be a list of things;
		now L is the MEUBLES entry;
		repeat with meuble running through L:
			now meuble is in cuisine;	

Ça marche très bien mais c’est lourd, c’est très lourd…
Alors je me suis dit qu’on pourrait peut-être remplacer ça par une seule règle every turn, mais je n’y arrive pas. Est-ce possible ?
Merci d’avance.

« Every turn », c’est le mal absolu. Ça alourdit ton jeu.

Je ne suis pas du tout d’accord avec StephaneF. Les règles every turn ne posent en général pas de problème. Vu ce qu’Inform fait déjà par défaut à chaque tour, ce n’est pas une petite règle en plus qui va ralentir le jeu. Après, bien sûr, il ne faut pas faire de calculs compliqués ou de boucles qui font 10 000 itérations à chaque tour ; là c’est sûr que ça va ralentir.

Mais bien sûr, s’il existe quelque chose de mieux et qu’on peut éviter les every turn, alors oui, évitons-les. Dans ton cas, c’est en effet inutile puisque ce n’est qu’aux déplacement que tu veux bouger tes objets, pas à chaque tour.

Tu peux faire plusieurs choses pour simplifier ton code. Par exemple, tu peux enlever la colonne ROWID puisque tu ne l’utilises pas (ce n’est pas grave, les tableaux à une colonne). Ensuite, plutôt que de donner un nombre arbitraire à chaque endroit, tu pourrais directement mettre l’endroit dans le tableau !

[code]Table of mobilier
Piece Meubles
salon {table, canapé}
cuisine {table, tabouret}

Before going to a room (called R):
if R is listed in Table of mobilier:
let L be the meubles entry;
repeat with meuble running through L:
now meuble is in R.[/code]
Et voilà, il n’y a plus qu’une seule règle (je n’ai pas testé, il se peut que ça ne fonctionne pas, mais l’idée est là). Une autre chose faisable, c’est d’assigner la liste directement aux endroits sans passer par un tableau, mais je pense que ça consommerait de la mémoire pour rien, car plein d’endroits auraient une liste vide (après, ça serait sûrement négligeable).

Cependant, je ne comprends pas pourquoi tu ferais tout cela : les backdrops peuvent être regardés. En fait, ce que tu fais (déplacer les objets pour simuler le fait qu’ils soient dans plusieurs endroits à la fois), c’est exactement ce qu’Inform fait avec les backdrops ! Du coup, tu as simplement recodé quelque chose qu’Inform fait à plus bas niveau, et donc de manière plus efficace. Alors, sauf si tu expliques pourquoi tu ne peux pas utiliser de backdrops, utilise-les.

Enfin, si tu veux un objet décoratif, mais à un seul endroit, il ne faut pas utiliser le type backdrop, mais la propriété scenery (Le canapé is a scenery thing in le salon). Je dis ça au cas où.

Merci, Natrium :smiley: C’est exactement ce que je cherchais.

Là-dessus, with all due respect, il y avait un petit problème dans ton code : le « listed in ». Alors je me suis plongé dans la doc, j’ai changé cette ligne et ça, ça marche. Très bien, même.

Before going to a room (called R):
	repeat through Table of Furniture:
		if the SALLE entry is R:
			let L be the MOBILIER entry;
			repeat with meuble running through L:
				now meuble is in R.		

Merci encore.

Oui, c’était spécifiquement sur cette partie que je n’étais pas sûr.

Je suis allé voir dans la doc, en fait j’ai oublié de spécifier le nom de la colonne (ce qui semble assez évident, après coup). Le code deviendrait :

Before going to a room (called R): if R is a SALLE listed in Table of Furnitures: let L be the MOBILIER entry; repeat with meuble running through L: now meuble is in R.
Je n’ai pas testé non plus, mais ça devrait être la bonne. Avec une boucle, ça fonctionne bien aussi (en fait je pense qu’Inform fait la boucle implicitement dans le code ci-dessus), mais c’est plus clair sans, je trouve.

(Et je ne comprends toujours pas pourquoi ne pas utiliser des backdrops, mais c’est toi qui voit.)