Mon système d'écoulement du temps dans Azthath

J’ai entièrement recodé un système d’écoulement pour mon jeu, n’étant pas satisfait de celui « de base » dans Inform (j’ai besoin de souvent faire passer plusieurs heures ingame, d’un seul coup, et ça prend un temps INTERMINABLE, même sans aucun « événement » pendant l’attente ; rien qu’avec la « turn sequence rule »).

Bref pour ceux que ça peut intéresser, voici mon truc, qui gère le passage des secondes, minutes, heures, jours de la semaine, mois, années…

[code]Book - Fondamentaux

NightState is a truth state that varies. NightState is false.

DayState is a truth state that varies. DayState is false.

Janvier is a truth state that varies. Janvier is false.
Février is a truth state that varies. Février is false.
Mars is a truth state that varies. Mars is false.
Avril is a truth state that varies. Avril is false.
Mai is a truth state that varies. Mai is false.
Juin is a truth state that varies. Juin is false.
Juillet is a truth state that varies. Juillet is false.
Août is a truth state that varies. Août is false.
Septembre is a truth state that varies. Septembre is false.
Octobre is a truth state that varies. Octobre is false.
Novembre is a truth state that varies. Novembre is false.
Décembre is a truth state that varies. Décembre is false.

Lundi is a truth state that varies. Lundi is false.
Mardi is a truth state that varies. Mardi is false.
Mercredi is a truth state that varies. Mercredi is false.
Jeudi is a truth state that varies. Jeudi is false.
Vendredi is a truth state that varies. Vendredi is false.
Samedi is a truth state that varies. Samedi is false.
Dimanche is a truth state that varies. Dimanche is false.

NuitLundiMardi is a truth state that varies. NuitLundiMardi is false.
NuitMardiMercredi is a truth state that varies. NuitMardiMercredi is false.
NuitMercrediJeudi is a truth state that varies. NuitMercrediJeudi is false.
NuitJeudiVendredi is a truth state that varies. NuitJeudiVendredi is false.
NuitVendrediSamedi is a truth state that varies. NuitVendrediSamedi is false.
NuitSamediDimanche is a truth state that varies. NuitSamediDimanche is false.
NuitDimancheLundi is a truth state that varies. NuitDimancheLundi is false.

The DayTime is a number variable. [ heure ]
The DayTimeMinutes is a number variable. [ minutes ]
The DayTimeSecondes is a number variable. [ minutes ]

The MonthDay is a number variable. [ jour dans le mois ]

The Year is a number variable.

The YearDay is a number variable. [ jour dans l’année ]

The DayAbsolu is a number variable. [ jour dans l’année ]

To say StefTime :
say « [if DayTime is less than 10]0[end if][DayTime]h[if DayTimeMinutes is less than 10]0[end if][DayTimeMinutes] et [DayTimeSecondes] secondes ».

To say WeekDay :
say « [if Lundi is true]Lundi[otherwise if NuitLundiMardi is true]Nuit de Lundi à Mardi[otherwise if Mardi is true]Mardi[otherwise if NuitMardiMercredi is true]Nuit de Mardi à Mercredi[otherwise if Mercredi is true]Mercredi[otherwise if NuitMercrediJeudi is true]Nuit de Mercredi à Jeudi[otherwise if Jeudi is true]Jeudi[otherwise if NuitJeudiVendredi is true]Nuit de Jeudi à Vendredi[otherwise if Vendredi is true]Vendredi[otherwise if NuitVendrediSamedi is true]Nuit de Vendredi à Samedi[otherwise if Samedi is true]Samedi[otherwise if NuitSamediDimanche is true]Nuit de Samedi à Dimanche[otherwise if Dimanche is true]Dimanche[otherwise if NuitDimancheLundi is true]Nuit de Dimanche à Lundi[end if] ».

To say Month :
say « [if Janvier is true]Janvier[otherwise if Février is true]Février[otherwise if Mars is true]Mars[otherwise if Avril is true]Avril[otherwise if Mai is true]Mai[otherwise if Juin is true]Juin[otherwise if Juillet is true]Juillet[otherwise if Août is true]Août[otherwise if Septembre is true]Septembre[otherwise if Octobre is true]Octobre[otherwise if Novembre is true]Novembre[otherwise if Décembre is true]Décembre[end if] ».

Book - Part - Passage du temps à chaque action

Attente is a truth state that varies.
AttenteMinutes is a truth state that varies.
AttenteHours is a truth state that varies.

When play begins :
now Attente is false ;
now AttenteMinutes is false ;
now AttenteHours is false.

Before doing anything :
increment the DayTimeSecondes ;
if DayTimeSecondes is not less than 60
begin ;
[ PASSAGE DU TEMPS ]
decrease DayTimeSecondes by 60 ;
increment the DayTimeMinutes ; make the HourPassage ;
check the GameTime ;
end if.

To make the HourPassage :
if DayTimeMinutes is not less than 60
begin ;
[ PASSAGE DU TEMPS ]
decrease DayTimeMinutes by 60 ;
increment the DayTime ;
check the GameTime ;
end if.

Part - Waiting

Instead of waiting :
now the DayTimeSecondes is 0 ;
increment the DayTimeMinutes ;
if DayTimeMinutes is not less than 60
begin ;
decrease DayTimeMinutes by 60 ; increment the DayTime ; check the GameTime ;
end if ;
stop the action.

Part - Minuteswaiting

Minuteswaiting is an action applying to a number. Understand « attendre [a number] minutes » or « attendre [a number] minutes » as Minuteswaiting.

Instead of Minuteswaiting :
let N be the number understood ;
if N is less than 61
begin ;
now Attente is true ; now AttenteMinutes is true ;
repeat with T running from 1 to (the number understood - 1)
begin ;
if Attente is true
begin ;
increment the DayTimeMinutes ;
if DayTimeMinutes is not less than 60
begin ;
decrease DayTimeMinutes by 60 ; increment the DayTime ; check the GameTime ;
end if ;
end if ;
end repeat ;
check the GameTime ;
now Attente is false ; now AttenteMinutes is false ;
follow the turn sequence rules ; try looking ;
end if.

Part - Hourswaiting

Hourswaiting is an action applying to a number. Understand « attendre [a number] heures » or « attendre [a number] heure » as hourswaiting.

Instead of Hourswaiting :
let N be the number understood ;
now Attente is true ; now AttenteHours is true ;
clear the screen ; say « Vous attendez. » ; say the waitkey ; clear the screen ;
repeat with T running from 1 to the number understood multiplied by 60
begin ;
if Attente is true
begin ;
increment the DayTimeMinutes ;
if DayTimeMinutes is not less than 60
begin ;
decrease DayTimeMinutes by 60 ; increment the DayTime ; check the GameTime ;
end if ;
end if ;
end repeat ;
check the GameTime ;
now Attente is false ; now AttenteHours is false ;
follow the turn sequence rules ; try looking.

Book - Check the game time

To check the GameTime :
[ CYCLE DES 24H ]
if DayTime is not less than 25
begin ;
decrease DayTime by 24 ; increment the YearDay ; increment the MonthDay ;
end if ;
[ JOUR ET NUIT ]
if DayTime is not less than 6
begin ;
now DayState is true ; now NightState is false ;
end if ;
if DayTime is greater than 21
begin ;
now NightState is true ; now DayState is false ;
end if.

Book - Mécanisme de passage des mois, etc

To make the MonthsPass :
[ PASSAGE DES MOIS ]
if Janvier is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Janvier is false ; now Février is true ; now the MonthDay is 1 ;
end if ;
if Février is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 28
begin ;
now Février is false ; now Mars is true ; now the MonthDay is 1 ;
end if ;
if Mars is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Mars is false ; now Avril is true ; now the MonthDay is 1 ;
end if ;
if Avril is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 30
begin ;
now Avril is false ; now Mai is true ; now the MonthDay is 1 ;
end if ;
if Mai is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Mai is false ; now Juin is true ; now the MonthDay is 1 ;
end if ;
if Juin is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 30
begin ;
now Juin is false ; now Juillet is true ; now the MonthDay is 1 ;
end if ;
if Juillet is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Juillet is false ; now Août is true ; now the MonthDay is 1 ;
end if ;
if Août is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Août is false ; now Septembre is true ; now the MonthDay is 1 ;
end if ;
if Septembre is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 30
begin ;
now Septembre is false ; now Octobre is true ; now the MonthDay is 1 ;
end if ;
if Octobre is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Octobre is false ; now Novembre is true ; now the MonthDay is 1 ;
end if ;
if Novembre is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 30
begin ;
now Novembre is false ; now Décembre is true ; now the MonthDay is 1 ;
end if ;
if Décembre is true and the DayTime is 24 and the DayTimeMinutes is 59 and the MonthDay is 31
begin ;
now Décembre is false ; now Janvier is true ; now the MonthDay is 1 ;
end if ;
[ PASSAGE DES JOURS DE LA SEMAINE ]
[ LUNDI ]
if Lundi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Lundi is false ; now NuitLundiMardi is true ;
end if ;
if NuitLundiMardi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitLundiMardi is false ; now Mardi is true ;
end if ;
[ MARDI ]
if Mardi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Mardi is false ; now NuitMardiMercredi is true ;
end if ;
if NuitMardiMercredi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitMardiMercredi is false ; now Mercredi is true ;
end if ;
[ MERCREDI ]
if Mercredi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Mercredi is false ; now NuitMercrediJeudi is true ;
end if ;
if NuitMercrediJeudi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitMercrediJeudi is false ; now Jeudi is true ;
end if ;
[ JEUDI ]
if Jeudi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Jeudi is false ; now NuitJeudiVendredi is true ;
end if ;
if NuitJeudiVendredi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitJeudiVendredi is false ; now Vendredi is true ;
end if ;
[ VENDREDI ]
if Vendredi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Vendredi is false ; now NuitVendrediSamedi is true ;
end if ;
if NuitVendrediSamedi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitVendrediSamedi is false ; now Samedi is true ;
end if ;
[ SAMEDI ]
if Samedi is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Samedi is false ; now NuitSamediDimanche is true ;
end if ;
if NuitSamediDimanche is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitSamediDimanche is false ; now Dimanche is true ;
end if ;
[ DIMANCHE ]
if Dimanche is true and the DayTime is 24 and the DayTimeMinutes is 59
begin ;
now Dimanche is false ; now NuitDimancheLundi is true ;
end if ;
if NuitDimancheLundi is true and the DayTime is 5 and the DayTimeMinutes is 59
begin ;
now NuitDimancheLundi is false ; now Lundi is true ;
end if.
[/code]

Désolé, mais ton code pique vraiment les yeux. Tous les mois et les jours en truth state, c’est vraiment horrible, peu pratique et enclins aux oublis. Il vaut mieux un kind of value :

[code]A month is a kind of value. The months are janvier, février, mars, avril , mai,juin, juillet, août, septembre, octobre, novembre and décembre.

The current month is a month that varies.

carry out blabla:
now the current month is the month after the current month.[/code] Plus simple, non ? (au passage, il n’y a pas de majuscules aux mois.)

Ensuite, pour les nouvelles actions, il ne faut jamais utiliser de instead pour leur comportement normal, mais des check, carry out et report.

Aussi, pourquoi initialiser tes variables dans un when play begins ? Ça ralentira le début du jeu, alors qu’on peut juste taper dans la source « blabla is false ».

Je vois aussi un autre problème : qu’est-ce qui se passe si je tape « attendre 2 heures et 9 minutes » ? Il me semble que ce n’est pas implémenté.

Enfin bref, le principe est sympa mais c’est vraiment pas optimisé. Ça te dit que je te donne des cours d’Inform ? :stuck_out_tongue: (c’est une blague boien sûr, encore que si y en a qui veulent…)

Quand je serais sur mon ordi, j’essaierai de te refaire le code au complet.

Dans la mesure où j’ai " appris " Inform tout seul (comme tout le monde, ceci dit), et dans la douleur, n’étant paaaaaas du tout programmeur, ni même un esprit porté sur logique à l’origine, je fais bien entendu beaucoup d’erreurs grossières, et ai un code tout sauf optimisé. Donc oui je ne doute pas une seconde que ça « pique » les yeux :slight_smile:

Ceci dit, ingame, mon truc marche : tu peux faire passer plusieurs heures en une seconde (avec des déplacements de PNJ et autres événements qui se déroulent pendant l’attente, et à l’heure exacte prévue).

Mais je veux bien que tu réécrives mon code « comme il faut », que je voie un peu comment il aurait fallu faire.

Rien que « kind of value », c’est une chose que je n’utilise jamais. Jamais compris exactement comment ça fonctionnait, à quoi ça servait, etc.

Là aussi tu pourrais me faire un exemple concret ? jamais pigé non plus ces trucs là :blush:

Moi aussi j’ai appris Inform tout seul :stuck_out_tongue: (si on ne compte pas le tuto d’Otto). Mais je suppose que connaître l’anglais (j’ai lu la doc plusieurs fois) et avoir touché à de la programmation au collège, ça sert…

Ce qui suit est l’explication sur les actions.
Chaque action possède trois rulebooks : check, carry out et report. Ces rulebooks sont là pour définir le comportement normal de l’action.

  • Check sert à vérifier si toutes les conditions requises sont là, et à interrompre l’action en affichant un message si ce n’est pas le cas.
  • Carry out sert à changer le monde en fonction de ce que l’action fait, mais aucun message ne doit être affiché.
  • Report sert à afficher un message pour lui indiquer ce qui a été fait.

L’action est considérée comme réussie si elle arrive à carry out.

Before, instead et after servent à court-circuiter ce comportement normal, lorsqu’on veut faire une exception quelque part dans le jeu. Instead en particulier fait échouer l’action.

Exemple :

[code]A camera is a kind of thing.
Photographing is an action applying to one thing. Understand "photographier [something] as photographing.

Check photographing:
if the player does not carry a camera, say « Vous n’avez pas d’appareil photo ! » instead.

Carry out photographing:
now the player carries a random photograph that depicts the noun.
[en admettant qu’on ait déjà défini une relation pour que chaque objet ait une photo le représentant.]

Report photographing:
say "Clic ! Vous prenez une photo [du noun].

[Là, on ajoute une exception quelque part dans le monde.]
Instead of photographing the soleil:
say « Vous êtes fou ! Vous allez vous brûler les yeux ! ».[/code]

Ce sera 30 €. :slight_smile:

C’est fait.

Tout d’abord, évite de mettre plusieurs instructions sur une même ligne, c’est gênant car en relisant le code on risque de ne pas les voir, et évite de mettre une espace avant les points-virgules et les deux-points (encore que ça c’est pas vraiment grave).

Enfin, il y a des trucs que je n’ai pas compris dans ton code original, donc j’ai supprimé ou modifié (cf. les commentaires dans mon code). Aussi, je me demande vraiment comment tes événements se déclenchent en fonction de l’heure. Mettons que tu as une scène qui commence à 6 heures 30. S’il est 6 heures et que j’attends une heure, la scène ne se déclenchera pas puis qu’on sera passé directement à 7 heures, sans passer par 6 heures 30. Dans tout les cas, que ce soit ton système ou celui par défaut, tu sera obligé de répéter le turn sequence rule une fois par minute (voire par seconde si tu veux être ultra précis). Donc dans tous les cas attendre plusieurs heures sera long. Alors je ne sais vraiment pas comment tes événements se déclenchent.

Sinon, tout ce que j’ai fait à l’air de fonctionner mais j’ai pas beaucoup tester. J’ai attaché le code en fichier texte pour garder les indentations.

EDIT : une version corrigée est disponible plus bas.

Merci d’avoir pris le temps de faire ça. Je n’ai pas encore eu le temps de lire.

Si si, on passe bien par chaque minute de l’écoulement du temps.

J’avais supprimé une ligne de mon code parce qu’elle ne vous aurait pas forcément parlé : check the events

[code]Before doing anything :
increment the DayTimeSecondes ;
if DayTimeSecondes is not less than 60
begin ;
[ PASSAGE DU TEMPS ]
decrease DayTimeSecondes by 60 ;
increment the DayTimeMinutes ; make the HourPassage ;
check the GameTime ;
end if ;
check the events.

To check the events :
[ ------------------ Déplacement de tel PNJ ------------------ ]
if the DayTime is 3 and the DayTimeMinutes is 1 and Momo is living
begin ;
move Momo to ChezMomo ;
end if ;
[ et ainsi de suite ][/code]

et je t’assure que ça fonctionne. Chaque événement ou déplacement de PNJ devant se produire à une heure précise, s’inscrit dans un journal, avec l’heure où il se produit, comme ça je peux vérifier ingame que tout se passe comme prévu. Et c’est le cas.

Exemple : j’attends 2 heures, directement dès le début du jeu. Je consulte mon petit journal d’admin et hop :

(En dehors des déplacements de PNJ, ces 2h voient plusieurs dizaines de changements de variables et autres vérifications (si machin est vivant, si truc est true ou false, etc) et l’attente passe en une fraction de seconde.

Je vais potasser ton TXT maintenant :wink:

J’avais bien vu qu’on passait minute pas minute, mais comme rien n’était actualisé dans le repeat, ben je voyais pas pourquoi y a avait un repeat.

Sinon, tu insères toutes tes actualisations dans une seule routine ? C’est vraiment pas top niveau organisation d’avoir une routine géante. :confused:
Et puis au final, j’ai du mal à voir en quoi c’est plus rapide que la méthode de répéter le turn sequence rule, puisque au final tu dois quand même vérifier à chaque minute ce qui se passe…

Et en plus, comme tu court-circuites le système d’avancement du temps d’Inform, tu te privent de choses super utiles comme les scènes. Si une scène débute à une certaine heure, ben elle ne démarera vraisemblablement jamais (sauf si le joueur attend pour être pile au bon moment).

Du coup, j’ai modifié le code, la nouvelle version est ci-dessous.
Mais je maintiens que ce que tu fais n’est pas la meilleure façon. Pourquoi ne pas mettre le code qui gère les événements dans les turn sequence rules, et les lancer à chaque minute ? Je ne vois pas en quoi ce serait plus lent que en ce moment (et ça correspondrait mieux à la mécanique d’Inform).

En fait, est-ce que TOUS les PNJ et autres événements sont actualisés à chaque tour ? Si c’est le cas, c’est normal que ce soit lent. Ce que je pense fonctionnerait bien, c’est découper ton jeu en région et actualiser seulement ce qui se trouve dans la région du joueur.
Quand on quitte une région, on stocke la date et l’heure à laquelle on l’a quittée. Comme ça, quand on y rentre, on rejoue tout le temps qui s’est écoulé depuis le moment où on l’a quittée d’un coup, pour remettre les pendules à l’heure.
Ça accélérerait le jeu en général, mais ça ajouterait un temps de chargement entre chaque région (je pense que ça reste mieux comme ça). Pour éviter le problème du tour qui simule 10 ans d’un coup si le joueur revient 10 ans plus tard dans une région, on peut faire une actualisation du monde au complet régulièrement, genre tous les mois, ou peut être même avant chaque sauvegarde (ou toutes les X sauvegardes) (à ajuster pour obtenir des temps de chargement raisonnables et à des intervalles raisonnables, car simuler un mois d’un coup, ça reste énorme).

Si tu veux essayer, je peux aussi t’aider à coder la règle d’actualisation.

lol … tu me crois ou tu ne me crois pas, c’est tout. Passer 8 heures prenait une bonne quinzaine de secondes, avec le " turn sequence rules ". Ça en prend une, maintenant. C’est bien parce que l’attente (réelle) était interminable et handicapante que je me suis résolu à faire mon propre truc.

" check the events " renvoie à plusieurs sous-machins qui spécifient les déplacements de PNJ, changements de variables divers, etc. On peut toujours s’organiser…

Je n’ai pas vraiment besoin des « scenes » dans mon jeu, ou disons que je peux tout à fait faire autrement.

J’ai pas dit que je ne te croyais pas, mais j’ai fait mes propres tests, et tout fonctionnait assez rapidement avec le turn sequence rule (en gros, il y avait un every turn qui faisait des trucs bidons des centaines de fois, et attendre 23 heures me prenait moins de 5 secondes). Peut-être que c’est ton code qui est mal fait. Après, j’en sais rien, puisque je ne l’ai pas vu, donc je ne sais pas ce qui pourrait ralentir le jeu. Parce que en l’état, que ce soit ton système où celui d’Inform, il y a quand même la même quantité de choses à actualiser.

Mais si tu peux faire autrement, pourquoi utiliser Inform ? Pourquoi tout recoder à partir de zéro alors que l’outil l’a déjà fait pour toi ? En plus, peut-être bien que les scènes restent plus pratique que ce que toi tu utiliseras.

Enfin bon, je suis pas là pour te dire comment faire. C’est des conseils que je te donne, libre à toi de les suivre ou pas.

Au passage, j’ai fait une correction dans le code, il y avait une boucle infinie.

Le problème d’inform, c’est que la syntaxe a été pas mal remaniée au cours des versions, du coup ce n’est pas toujours évident de se mettre à la page, une fois que l’on a ses habitudes. Perso j’ai lu une seule fois dans sa totalité le manuel d’inform 7 : lors de sa première sortie, il y a 9 ans de cela. Depuis, j’ai eu l’occasion de le parcourir un peu, mais je n’ai pas eu le courage de tout refaire, tout réapprendre. D’ailleurs dans le tuto sur le site du zéro, j’ai mis des choses de base, qui fonctionnent, mais qui pourraient être optimisée ou améliorée.

Inform c’est 2 choses (enfin, plus que ça mais bon), c’est un compilateur, et un ensemble de bibliothèques pour modéliser un monde virtuel. On peut très bien n’utiliser que les bases + le compilateur, et modifier ou remplacer les bibliothèques pour la gestion du monde si ça ne convient pas. Il y a quelques années, quelqu’un avait d’ailleurs créé un set complet de bibl. pour Inform 6, pour tout remplacer : platypus.

Les choix de l’équipe d’Inform 7 sont perfectibles, au début j’ai eu beaucoup de soucis pour créer de nouveaux verbes (ça s’est pas mal amélioré de ce côté là), adapter le code à mes besoins, et pour la gestion du temps c’est une façon de voir, et je peux comprendre qu’elle ne convienne pas toujours…

J’ai vraiment l’impression qu’on ne se comprend pas. :confused: (au passage, désolé pour la longueur du message.)

Déjà, je vois pas en quoi la syntaxe ou le manuel qui change a à voir dans la discussion, mais c’est toujours bon à rappeler.

Ensuite, je ne remet pas en cause le fait de vouloir changer la façon dont le temps passe dans Inform (c’est tout à fait légitime). Je remets en cause la façon dont le fait Azathoth. Je comprends qu’il puisse vouloir changer la façon dont le monde est modélisé. Mais c’est pas comme s’il faisait un changement radical, il essaie juste (dans ce cas-ci) d’adapter un certain aspect.

Et en ne suivant plus les turn sequence rules, il casse (entre autres choses) le fonctionnement des scènes. S’il a justement besoin de cette fonctionnalité, il doit trouver une autre façon, qui cassera peut-être autre chose, et ainsi de suite. Toi-même Otto tu as indiqué dans ton tuto que « les scène apportent un confort d’utilisation qu’il serait dommage de négliger » (après, je parle des scène, mais il n’y a pas que ça, je pense.)

Dans tout les cas, il y a mille façons (en exagérant un peu) de faire plus élégant (même si je sais que ça reste subjectif) qu’une routine géante qui actualise le monde.

Pour retourner au problème du temps (réel) que ça prend pour actualiser le monde, j’ai fait plus de tests.
Dans le premier test, j’ai créé une phrase check the events qui déplace une chose au hasard dans un autre endroit au hasard mille fois à la suite (littéralement) et qui se lance à chaque minute dans le jeu (façon Azathoth). Dans le deuxième, j’ai suivi les turn sequence rules, avec un Every turn qui faisait la même chose que le check the events (façon « standard »). J’ai chronométré le temps que ça prenait.

Résultat : c’est plus long en utilisant les turn sequence rules. MAIS seulement de quelques centièmes/dixièmes de seconde (en fonction de la longueur de l’attente en jeu). Et c’est compréhensible, car dans ce cas-ci, Inform fait aussi les vérifications pour les scènes et les « timed events ».

J’ai supposé qu’Azathoth avait plein de Every turn, et que c’est ça qui ralentissait le jeu avec les turn sequence rules (mais ça reste une supposition).
Ce que moi j’aurais fait dans ce cas là, c’est lancer les every turn rules seulement quand la variable attente est fausse (car après tout, on veut que les every turn ne se lance qu’une fois par tour, pas par minute), et j’aurai créé un rulebook appelé « every minute » pour les choses qui se lance à chaque minute.

Enfin bref, c’est ce que moi j’ai essayé et trouvé. Comme précédemment, comme je n’ai pas le code complet d’Azthath sous les yeux, je ne peux rien affirmer, juste donner des pistes d’idées. Après, Azathoth peut essayer de voir si ce que je propose fonctionne (j’ai peut-être tort), ou juste garder le code qu’il a déjà.

Je crois que ce qu’Otto essaie (peut-être) de dire, c’est qu’il faut faire attention avant de dire que le code d’un autre est mal fait :slight_smile: C’est jamais évident de savoir quelle est la meilleure façon de faire (en plus sachant que la syntaxe I7 a changé à mi-parcours et que le manuel n’existe qu’en anglais) quand on code.
Et je suis sûr qu’on a tous des trucs horribles qui traînent dans nos codes, et des fonctionnalités du langage qu’on n’aime pas ou qu’on maîtrise pas alors qu’elles pourraient nous changer la vie. On réinvente la roue, on fait des jeux en Inform en se passant du parser, on fait des hacks sordides - on fait tous de notre mieux :slight_smile: Donc quand on parle du code des autres, c’est bien d’y aller avec le dos de la cuillère :slight_smile:

La dernière fois que j’ai joué à Azthath, il y avait 300 lieux, quelques centaines de PNJ, des échoppes qui n’étaient ouvertes qu’à un certain moment, des milliers d’objets, etc. Je n’exagère pas ; c’est Morrowind++ ; c’est un code qui fait plus de 500 pages quand on l’imprime.
Peut-être que sur tes tests ça ne prend pas tant de temps que ça, mais Azthath est un projet tellement gros que je conçois qu’à un moment donné, on veuille hacker Inform comme on peut pour gagner de la vitesse. Peut-être qu’il y a des erreurs de conception, c’est dur à dire sans le code sous les yeux, mais Azathoth a changé tellement de fois le jeu, sa conception, et ses mécanismes, à cause d’erreurs de conception du code ou de changement d’interface ou de devoir se battre avec le compilateur, que ça doit en être épuisant. Si il s’aperçoit qu’il a besoin des scènes, il soupirera et il changera tout le code, comme il l’a déjà fait plusieurs fois. Mais je préfère le laisser faire et défaire à sa guise, l’important c’est qu’il garde son envie et sa motivation et qu’il arrive à le sortir à un moment :slight_smile:

Je propose à Azathoth de l’aider à refaire le bout de code qu’il a posté dans le premier message, et voilà comment se transforme la discussion… :frowning:

Ben justement, on est là pour apprendre, non ? Je vois que le code d’Azathoth pourrait être mieux, alors je lui dit ce qui, d’après moi, ne va pas et où est le problème. Où est le mal à ça ? C’est pas comme si je l’avais insulté méchamment… En tout cas, si mon message a été ressenti comme ça, ce n’était pas mon attention.

Je sais que le jeu est énorme, mais le problème n’est pas là. Le problème n’est pas de savoir pourquoi ça prend du temps, mais pourquoi une manière prendrait moins de temps que l’autre. Et là je ne comprends toujours pas ; je ne vois toujours pas en quoi son « hack » est plus rapide. Et quand j’exprime ma pensée, la réponse que je reçois c’est « lol … tu me crois ou tu ne me crois pas, c’est tout » et un tweet pour me narguer (si ce n’était pas pour me narguer, alors c’était vraiment un tweet inutile). J’essayais juste d’aider…

Enfin bon. Je pense que ça sert à rien de continuer, sinon on n’aura jamais fini…

Bah … je ne sais pas comment te dire qu’il ne s’agit pas d’opinions mais de faits. Peut-être pas de faits concernant Inform 7 lui-même et tous les jeux qui ont été faits et seront faits avec pour l’éternité, mais concernant Azthath, oui.

On peut faire le test simplement, en fait, si on a du temps à perdre

  1. Télécharger la vieille démo : http://azthath.free.fr/Azthath.gblorb
  2. Lancer le jeu et choisir un personnage « préfabriqué »
  3. Une fois sur le débarcadère, taper « attendre une heure » (pour passer les scènes d’intro) puis « attendre 6 heures ». Ca rame désespérément, et encore, j’ai « adouci » le truc en découpant le passage du temps en plusieurs fois, séparées par des petits textes, etc.

Bref, c’est injouable. Et à ce propos, non, mon code même à cette époque là comportait exactement zéro " every turn ".

Et maintenant la compilation la plus récente : https://drive.google.com/file/d/0BzSeWqiH0jgybThkaThMVWpfSlk/view?usp=sharing

  1. Lancer le jeu, choisir Zolgar Zorn
  2. Taper « attendre 8 heures ».

Ça me semble parlant.

Après je ne doute pas que mon code soit écrit avec les pieds et bourré de bugs et autres erreurs qui ont peut-être rendu le jeu plus lent qu’un truc Inform correctement codé. Comme dit Hugo, mon code est une accumulation de couches sédimentées, et il y a forcément ici et là des aberrations, des doublons, des trucs qui se contredisent, etc.
Il est possible que mon Super Nouveau Système de Temps (que j’ai partagé histoire de papoter, pas pour établir un nouveau standard…) ne soit qu’un cautère sur sur une jambe de bois - mais en attendant ça a résolu mes problèmes.

Ca n’était pas pour te « narguer », non, ta phrase m’a simplement et très sincèrement fait halluciner, parce qu’elle est d’une condescendance sans borne - ou tout au moins c’est la manière dont elle sonne. Que tu n’aies pas cherché à me blesser méchamment, je veux bien le croire, mais comme dit Hugo, y aller avec le dos de la cuillère peut être sympa…

J’admets que tu aies pu le prendre « mal » en retour. Je ne suis pas forcément très diplomate non plus, par moment. Ça n’était pas une déclaration de guerre pour autant, on a pas 12 ans.

(à ce propos, et là je digresse : je trouve inqualifiable la façon dont Auraes parle à ce type qui passe ici de temps à autres nous donner des news sur son jeu)

Comme dit plus haut, je n’avais aucun every turn. Zéro :slight_smile: Mais une fois par heure, par exemple, une routine qui, selon l’heure, provoquait tel ou tel truc dans le jeu.

Pour en revenir aux scènes, non, vraiment, je n’en ai pas besoin (ça fait un petit moment maintenant que je bosse dur sur mon game design, avant même de coder - ça m’évite de faire des bêtises et de devoir tout reprendre à zéro comme ça m’est déjà arrivé en effet, Hugo) :wink:

Déjà je ne trouve pas les scènes spécialement pratiques. Par exemple tu ne peux pas faire commencer une scène suite à une action précise du joueur (genre "after opening the Truc, now Scène is happening). Pourquoi ? C’est dommage.

J’ai crée divers " objets narratifs ", comme la « quest », par exemple. Qui peut donc avoir des variables (un number « compte à rebours », réactualisé chaque minute), être lié à d’autres objets matériels ou abstraits du jeu, par des relations, etc. Ça remplace les « scenes » sans le moindre soucis. Ou alors citez moi un aspect précis des « scenes » que j’ai oublié :slight_smile:

Je crois qu’on ne se comprend pas, oui. Et mon but n’était pas de polémiquer. Ceci dit, je ne manquerai pas de potasser le code que tu as écrit.

Sauf que ça prouve rien, puisque le test n’est pas réalisé dans les mêmes conditions (même si c’est vrai que c’est plus rapide). Il doit y avoir (selon moi) quelque chose dans le code qui ralentit le premier, ou qui accélère le deuxième.
Et tu devrais enlever le lien vers la dernière version, sauf si tu veux que n’importe qui puisse la télécharger.

C’était une supposition, hein.

Ça, pour papoter, ça a papoté. ^^

Avec le recul, en y pensant de toutes les façons possibles, je n’arrive toujours pas à voir de condescendance sans bornes et hallucinante dans cette phrase. Je voulais simplement dire que c’est un peu bête (j’ai pas réussi à trouver un mot moins « offensant ») de réinventer des choses qui existe déjà parce qu’on les a cassés, alors qu’on aurait pu ne pas les casser pour commencer (comprendre : je trouve ça nul comme mentalité — et ça n’implique que moi — de se dire « c’est pas grave si ça ne marche plus, je peux le faire différemment de toute façon », plutôt que de chercher à une façon qui fait tout marcher).
Et puis Twitter, ça enlève tout le contexte, alors c’est normal que ça sonne condescendant sur Twitter.
En fait, c’est plutôt ta phrase que je trouvais condescendante : genre, c’est pas grave, je peux le faire d’une autre façon de toute façon, je suis meilleur que les développeurs d’Inform (j’exagère un peu). Mais on tourne en rond à penser comme ça.

Pour la réponse, voir la dernière section du chapitre sur les scènes dans la doc (limite je la connais par cœur à force :slight_smile: ). Et puis dans ton exemple, il suffit de dire « Scène begins when truc is open ». Sincèrement, à force d’utiliser des scène, j’ai fini par croire qu’il y a toujours une façon d’exprimer leur début et fin par une condition.

Parlons design (mais comme des gens civilisés, bien sûr). Oui, j’ai pensé à un moyen de faire un système de quête, et dans mon concept, une quête commence quand certaines conditions sont réunies, et se termine quand certaines conditions sont réunies. C’est pile la définition d’une scène ! Et les scènes peuvent avoir des variables et être impliquées dans des relations ! Donc on peut ajouter, à chaque scène-quête, un printed name, une description, un tableau qui permet de leur faire posséder un mini-journal qui décrit chaque étape, etc.
Dans les aspects que tu as oubliés, il a le fait qu’une scène peut avoir des fins différentes (Blabla ends happily when… Blabla ends sadly when…) Ça pouvait permettre de faire des quêtes avec plusieurs fins différentes (bonnes ou mauvaises), et de tester comment une quête s’était finie (if Blabla ended happily…)
Et faut pas se focaliser sur les scènes. Si je les mentionnais souvent, c’est parce que c’était le premier truc qui me venait à l’esprit.

Tu sais qu’en vrai, quand j’ai découvert Inform, la première chose que je me suis dite c’est (grosso modo) « C’est trop cool ce truc. Je vais faire un Elder Scrolls-like avec un monde aussi grand que World of Warcraft, mais entièrement textuel » (je devais avoir ~14 ans).
Finalement, je ne l’ai jamais commencé parce qu’avec toutes les ébauches que j’avais faites, je me suis rendu compte que je me retrouverai avec un code qui partirait dans tous les sens, qui fonctionnerait mais qui serait bancal. J’ai préféré attendre et faire des petits jeux pour m’améliorer. Mais le projet me trotte toujours dans la tête, et je peux t’assurer que quand il sera fini, Azthath fera pâle figure à côté. :stuck_out_tongue: (et je pourrais te prouver qu’utiliser le turn sequence rule fonctionne :slight_smile: ) (j’ai vraiment envie de commencer ce projet depuis quelques temps — il a un même un nom : Scriptoria — mais j’attends qu’Inform soit totalement traduit en français, pour pas avoir à tout adapter mon code)

Et voilà, maintenant qu’on s’est expliqué et qu’on peut repartir sur de bonnes bases, je propose qu’on arrête vraiment la discussion, et qu’on parle du sujet initial uniquement. :smiley:

Pour répondre en vitesse au dernier paragraphe avant d’aller me pieuter : je n’ai aucune prétention avec Azthath, en tous cas sûrement pas celle de faire un jeu-immense-qui-va-humilier-tous-les-mini-jeux-des-autres. Le jeu sera immense parce que j’aime moi-même jouer à des jeux immenses. Je ne cherche rien d’autre qu’à faire un jeu auquel j’aimerais jouer moi-même. Ça n’est pas un concours de bites. Et je ne doute pas que ton jeu sera mieux (ou en tous cas mieux codé, ce qui n’est qu’un aspect des choses :stuck_out_tongue: ) que le mien. Ma foi, ça me fera une occasion de lire du bon code, et de mettre le mien à jour…

Ceci dit, je suis plutôt en train de réduire la taille du jeu que l’inverse (ou plus exactement, j’essaie de faire dans l’intensif plutôt que dans l’extensif). Parce que plus ça va, justement, plus je trouve que faire un Elder scrolls en mode texte n’a aucun sens (la prédominance des objets, par exemple, comme dans Morrowind où le moindre PNJ a un inventaire complet, n’a plus aucun sens pour moi - mais là c’est un autre débat)

Je n’ai rien prétendu ! Même si mon projet existe (mais dans un état encore très, très, très flou), je le comparais à Azthath juste pour blaguer. :slight_smile:

Et merci pour dire que je code bien. :stuck_out_tongue:

M’en fous, j’ai récupéré une version récente d’Azthath moi… Mouhahahaha!

Non, si ça t’embête Azathot je ne l’ouvre pas c’est promis!

Le Graal ! :smiley: :smiley:
Ah ! Mais ? Cette voix ?

VOILA CE QUI T’ATTEND SI TU L’OUVRES ! FUIS TANT QU’IL EST ENCORE TEMPS !