phyver / GameShell

a game to learn (or teach) how to use standard commands in a Unix shell
GNU General Public License v3.0
2.17k stars 138 forks source link

[WIP] Internationalisation: proof of concept #22

Closed rlepigre closed 3 years ago

rlepigre commented 3 years ago

J'ai passé un peu de temps à essayer de voir comment pourrait fonctionner l'internationalisation des missions, et voilà le résultat. En gros l'idée est d'avoir un dossier locale dans chaque mission, avec des fichiers .po pour chaque langue supportée. Par example, j'ai crée des fichiers locale/fr.po et locale/en.po pour la mission 1.

Pendant l'exécution de start.sh ces fichiers sont transformés en fichiers .mo (par msgfmt) et placé sous un dossier locale à la racine GameShell (avec l'arborescence qui va bien). Les fichiers ainsi crées prennent le nom du dossier de la mission (plus l'extension), ce qui veut dire qu'ils sont activés en exportant TEXTDOMAIN=nom_de_la_mission. En gros, ça veut dire qu'il faut s'arranger pour que les scripts de la mission (et les éventuels fichiers binaires) soient toujours lancés dans un environnement ou TEXTDOMAIN contient le nom du dossier de la mission. (J'ai pris pour convention de définir TEXTDOMAIN="gash" en dehors de l'exécution du code des missions.)

L'autre chose à faire c'est d'exporter TEXTDOMAINDIR="$GASH_BASE/locale" dans start.sh.

Un autre point intéressant est qu'on peut utiliser la variable LANGUAGE pour controller la langues des messages. On peut même faire un truc comme LANGUAGE=fr_FR:fr:en_GB:en_US:en pour que le système donne la priorité au Français mais se rabatte sur l'anglais s'il n'est pas disponible. Il faudrait quand même s'assurer que les locales soient dispo pour une des langues du système (et que LANGUAGE est définie) parce que sinon gettext ne donne que la clé en résultat.

Dernière remarque : j'ai utilisé un fichier goal.sh dans la mission pour pouvoir utiliser gettext. C'est plus uniforme, et j'imagine que pour des missions compliquées on pourrait avoir besoin de générer les instructions donc c'est pas idiot. Une autre possibilité serait de s'assurer que les fichiers locales définissent toujours une entrée avec la clé "Mission goal", et on pourrait appeler gettext directement depuis lib/game_shell.sh.

Qu'en penses-tu Pierre?

phyver commented 3 years ago

Tu ne vois pas d'inconvénient à renommer gash show en gash goal ?

Sinon, pour les fichiers .po, voila ce que je compte faire :

Tu peux générer un fichier Makefile avec ./bin/new-mission.sh -M si tu veux tester.

Rien d'autre de prévu pour ce soir...

Sinon, j'ai trouvé ça pour visualiser un fichier README.md avant de l'envoyer sur github: https://github.com/joeyespo/grip Tu sais si y'a une autre solution ?

rlepigre commented 3 years ago

Tu ne vois pas d'inconvénient à renommer gash show en gash goal ?

Non, c'est très bien, c'est plus explicite !

Tu peux générer un fichier Makefile avec ./bin/new-mission.sh -M si tu veux tester.

OK, très bien, je vais essayer.

Sinon, j'ai trouvé ça pour visualiser un fichier README.md avant de l'envoyer sur github: https://github.com/joeyespo/grip Tu sais si y'a une autre solution ?

Je n'ai jamais vraiment ressenti le besoin pour un tel outil ! Un truc que tu peux faire c'est éditer le fichier dans l'interface de GitHub, elle permet de voir une preview (comme dans les messages de PR): https://github.com/phyver/GameShell/edit/master/README.md.

rlepigre commented 3 years ago

Je viens d'essayer de réfléchir au nom du jeu avec Bran, et on ne trouve rien de mieux que GameShell, donc restons avec ça, et OK pour gsh pour le nom de la commande.

phyver commented 3 years ago

Petite pause dans les corrections, quelques patch, avec des changements de noms !

 GASH              => GSH
 GASH_BASE         => GSH_ROOT
 GASH_LOCAL_BIN    => GSH_MISSION_BIN
 GASH_CONFIG       => GSH_BASHRC      -> $GSH_ROOT/.bashrc
 GASH_MISSION_DATA => GSH_VAR         -> $GSH_ROOT/.var
 GASH_DATA         => GSH_CONFIG      -> $GSH_ROOT/.config

J'y retourne...

phyver commented 3 years ago

J'ai avancé un peu sur la doc.

Sinon, j'ai aussi passé les missions avec le labyrinthe dans un sous-dossier, pour partager du code.

Y'a probablement moyen de faire un peu mieux... On pourrait par exemple conserver l'arborescence et avoir $MISSION_DIR et $MISSION_GROUP_DIR. J'ai un peu peur que ce genre de fonctionalité ne serve pas très souvent, et j'aimais bien l'idée de tout applatir dans les archives. (En plus, je ne sais ce qu'il faudrait faire sur les groupes imbriqués.)

Une solution simple serait de vérifier que toutes les missions ont un nom différent. Ça interdirait d'avoir deux 00_shared dans des groupes distincts, mais ça garantit qu'on peut utiliser le nom de la mission partagée sans risque.

rlepigre commented 3 years ago

J'ai avancé un peu sur la doc.

Cool !

Sinon, j'ai aussi passé les missions avec le labyrinthe dans un sous-dossier, pour partager du code.

  • plutôt qu'une mission factice 00_shared, on peut mettre le code à partager dans la mission 01_.... Si on l'inclut normalement, le code est partagé. Et si on ne veut pas mettre la mission dans une archive, il suffit de l'inclure avec un ! dans le fichier index.txt. Je ne sais pas ce que je préfère...

En principe je trouves plus logique d'avoir une mission factice réelle. Mais c'est vrai qu'on peut aussi faire ce que tu dis et utiliser une mission dont on dépend comme mission factice dans le cas où on ne la veut pas. Un argument pour garder la mission factice 00_shared est que ça te donne plus de flexibilité pour l'ordre des missions: la mission 01_... doit toujours être la première si c'est celle qui introduit les fichiers partagés, et donc c'est pas possible de commencer par 02_.... Tu n'as pas ce problème avec le 00_shared.

  • Si on veut partager le fichier static.sh, ou init.sh, etc. on est obligé de le copier dans $GSH_VAR et de le renomer en ma_super_mission_static.sh, parce que sinon il risque d'être écrasé par un autre static.sh partagé. On s'en sort, mais c'est pas super pratique.

Ouais, c'est pas génial...

  • Comme j'applatis toutes les missions dans les archives, on perd le nom du dossier parent : mes_supers_missions/03_find se retrouve dans 00017_find. C'est pas très très grave, mais pas très satisfaisant non plus.

Y'a probablement moyen de faire un peu mieux... On pourrait par exemple conserver l'arborescence et avoir $MISSION_DIR et $MISSION_GROUP_DIR. J'ai un peu peur que ce genre de fonctionalité ne serve pas très souvent, et j'aimais bien l'idée de tout applatir dans les archives. (En plus, je ne sais ce qu'il faudrait faire sur les groupes imbriqués.)

Je suis plutôt d'accord. Sinon on peut essayer l'approche que j'avais suggéré et utiliser des liens symboliques. Dans l'archive on pourrait avoir un dossier pour les missions à plat, puis un dossier à côté pour les fichiers partagés, et des liens vers le bon dossier partagé pour chaque mission qui en a besoin.

Une solution simple serait de vérifier que toutes les missions ont un nom différent. Ça interdirait d'avoir deux 00_shared dans des groupes distincts, mais ça garantit qu'on peut utiliser le nom de la mission partagée sans risque.

C'est pas super satisfaisant je trouve, on risque de vouloir utiliser le même nom pour deux missions quand on en aura plus (par exemple si on veut avoir plusieurs alternatives pour telle ou telle mission).

De mon côté j'ai ajouté mes missions à l'index et viré les anciennes (sans supprimer les dossiers). J'ai aussi fait en sorte qu'il y ait un peu moins d'affichage au début du jeu quand on fait start.sh -RF. Un truc que j'ai remarqué (je sais pas si c'est vraiment gênant) c'est que quand on a le message Press Enter si on tape sur des touches le texte s'ajoute (on voudrait plutôt que rien ne se passe). J'ai essayé de changer ce comportement mais je ne sais pas très bien comment faire ça (peut-être utiliser une option comme pour entrer un mot de passe?).

J'ai aussi expérimenté un peu avec termtosvg (https://github.com/nbedos/termtosvg) pour générer des animations (pour mettre dans le README peut-être?).

phyver commented 3 years ago

Je suis plutôt d'accord. Sinon on peut essayer l'approche que j'avais suggéré et utiliser des liens symboliques. Dans l'archive on pourrait avoir un dossier pour les missions à plat, puis un dossier à côté pour les fichiers partagés, et des liens vers le bon dossier partagé pour chaque mission qui en a besoin.

Ça risque de poser des problème car les noms des répertoires sont modifiés. Plus ça va, et plus je me dis que je vais arrêter d'applatir l'arborescence. Après-tout, le joueur ne fait jamais de ls $GSH_MISSIONS. Ça simplifierais plusieurs trucs...

De mon côté j'ai ajouté mes missions à l'index et viré les anciennes (sans supprimer les dossiers). J'ai aussi fait en sorte qu'il y ait un peu moins d'affichage au début du jeu quand on fait start.sh -RF.

Je trouve que c'est plutôt bien d'avoir une "animation" pendant l'initialisation, pour si jamais un fichier statique prend quelques secondes. Je verrais à l'usage. Au pire, je les remettrais !

Un truc que j'ai remarqué (je sais pas si c'est vraiment gênant) c'est que quand on a le message Press Enter si on tape sur des touches le texte s'ajoute (on voudrait plutôt que rien ne se passe). J'ai essayé de changer ce comportement mais je ne sais pas très bien comment faire ça (peut-être utiliser une option comme pour entrer un mot de passe?).

Corrigé : il faut utiliser l'option -s ("silent") de read.

J'ai aussi expérimenté un peu avec termtosvg (https://github.com/nbedos/termtosvg) pour générer des animations (pour mettre dans le README peut-être?).

Chouette !

À ce propos, au tout début, je voulais enregistrer toutes la partie avec ttyrecord pour pouvoir en "visualiser" des morceau. C'était pas très pratique car je n'avais pas trouvé de moyen de lancer un enregistrement pour chaque mission. Je pense que ça ne sert à rien, mais ça serait marrant d'avoir une commande gsh replay...

On ne pouvait pas non plus changer la vitesse de lecture de ttyplay de manière dynamique, mais ça semble possible maintenant. (Bizarre, je n'imaginais pas cette commande évoluer...)

phyver commented 3 years ago

Je vais faire un passage sur tes missions, et commencer à les traduire en français. Tu as prévu de bosser dessus ce soir ?

Aussi, je vais essayer d'ajouter quelques trucs en ASCII art dans des fichiers (araignées, Servillus, etc.) J'en ai déjà mis quelques uns, mais ça serait bien d'en avoir plus. Si tu as des idées de trucs, note les dans un coin. L'idée serait de motiver les joueurs à regarder ce qu'il y a dans les fichiers...

rlepigre commented 3 years ago

Je vais faire un passage sur tes missions, et commencer à les traduire en français. Tu as prévu de bosser dessus ce soir ?

OK très bien. Tu peux y aller, si je fais quelque chose ce sera créer une autre mission.

Aussi, je vais essayer d'ajouter quelques trucs en ASCII art dans des fichiers (araignées, Servillus, etc.) J'en ai déjà mis quelques uns, mais ça serait bien d'en avoir plus. Si tu as des idées de trucs, note les dans un coin. L'idée serait de motiver les joueurs à regarder ce qu'il y a dans les fichiers...

Bonne idée, je pense qu'il faut qu'on ajoute des choses comme ça pour d'autres missions. Pourquoi pas ajouter quelques arbres dans la forêt par exemple ? Par contre pour ce genre de chose, est-ce qu'on les installe avec le static.sh? Est-ce que c'est un problème si ce genre de fichier est modifié / supprimé ? Si oui, est-ce qu'on veut le vérifier sur le gsh check ?

phyver commented 3 years ago

Je me suis rendu compte qu'on pouvait facilement éviter les problèmes de traduction si on partage des scripts static.sh ou similaires avec des liens symboliques.

J'ai fait un petit commit, et normalement, ça marche. J'ai donc remplacé les init.sh et static.sh de tes missions par des liens vers le static.sh et init.sh de 00_shared.

Par contre, si on fait make, comme il suit les liens symboliques, on va se retrouver avec des entrées en trop. Il faut donc supprimer ces scripts de la liste SH_FILES. (Je ne l'ai pas fait pour deps.sh, parce que le message actuel référence la "vraie" mission...)

Il faudrait tester un peu plus, pour être sûr que ça ne casse rien...

J'ai fait une première traduction des 5 missions, mais je n'ai pas touché au livre des potions. Tant que ce n'est pas finalisé, ça ne sert pas à grand chose.

Sinon, je n'aime pas beaucoup ta mission 5. Ce n'est pas clair qu'il faut compter les lignes "sauf les 3 premières". Une manière de donner la solution, qui est acceptée, c'est de compter le nombre d'étapes de la recette, et de faire tail -n8 Book/page_06 | wc -l. Je trouve la combinaison head -n+K | wc -l un peu artificielle et je préfere encore la combinaison tail | head pour récupérer des trucs au milieu.

Aussi, je vais essayer d'ajouter quelques trucs en ASCII art dans des fichiers (araignées, Servillus, etc.) J'en ai déjà mis quelques uns, mais ça serait bien d'en avoir plus. Si tu as des idées de trucs, note les dans un coin. L'idée serait de motiver les joueurs à regarder ce qu'il y a dans les fichiers...

Bonne idée, je pense qu'il faut qu'on ajoute des choses comme ça pour d'autres missions. Pourquoi pas ajouter quelques arbres dans la forêt par exemple ? Par contre pour ce genre de chose, est-ce qu'on les installe avec le static.sh? Est-ce que c'est un problème si ce genre de fichier est modifié / supprimé ? Si oui, est-ce qu'on veut le vérifier sur le gsh check ?

Je les installe avec init.sh, histoire que les étudiants ne commencent pas par essayer d'explorer tout le monde pour chercher les trucs marrants. Je ne suis pas sûr qu'on veuille vérifier le contenu dans le check, sauf cas particulier. Et ce n'est pas très grave si on n'est pas uniforme la dessus.

rlepigre commented 3 years ago

Quelques remarques sur les missions (je fais une partie complète en anglais):

Bon, le jeu commence à bien marcher je trouve. Il y a encore un peu de boulot sur les fichiers "goal" de certaines missions, mais les missions elles-même sont plutôt satisfaisantes maintenant!

phyver commented 3 years ago
  • La mission 16_tab n'est pas très marrante: il n'y a rien à voir au fond du couloir.

C'est vrai : on pourrait demander à se déplacer dans le couloir (ou autre chose) et faire copier un long fichier dans le coffre. Je réfléchis, et dis moi si tu as une idée.

  • Dans la mission finding_files_maze/03_find_1 j'ai eu les deux pièces dans le même répertoire, est-ce qu'on veut s'assurer que ça n'arrive pas?

C'était un bug ! Corrigé.

  • Au niveau de la mission 28_stdout_redirection on n'a pas introduit ls FILE1 FILE2 ... FILEn donc on ne peut pas s'attendre à une solution de type ls grimoire* > Drawer/inventory.txt. Et find -name "grimoire*" Drawer/inventory.txt ne fonctionne pas comme find laisse des ./ au début du nom des fichiers.

Un jours, je vais ajouter une mission pour faire faire la différence entre ls * et ls -d * qui introduira forcément ça...

Mais on peut l'introduire pour l'occasion, même si en pratique, je ne pense pas que ça ne pose de problème. (On peut même mentionner explicitement l'utilisation des jokers...)

  • Mission 30_stdout_stderr_redirection: l'instruction de merlin (sur stdout) n'est pas traduite.

TODO

  • Mission finding_files_maze/04_find_2: certaine fichiers contiennent (gettext stone) (a priori j'ai corrigé).

Merci

  • Mission finding_files_maze/05_find_xargs_grep est-ce que tu attends un ... | xargs mv -t ~/Forest/Hut/Chest à la fin?

Non. Il n'y a pas de limite de nombre de commande. J'attends plutôt un truc du style find -type f | xargs grep diamant. Les connaisseurs peuvent aussi utiliser grep -rl diamant *, mais on n'a pas introduit l'option -r...

Dans tous les cas, le joueur peut ensuite déplacer le fichier "normalement".

Bon, le jeu commence à bien marcher je trouve. Il y a encore un peu de boulot sur les fichiers "goal" de certaines missions, mais les missions elles-même sont plutôt satisfaisantes maintenant!

Chouette !

phyver commented 3 years ago

Je viens de faire une nouvelle mission 16 plus marrante. Il faut peut-être ajuster la limite de temps. Tu en penses quoi ?

Sinon, je viens d'ajouter un fichier TODO.md pour faire la liste des trucs à faire. Tu peux y ajouter des trucs...

rlepigre commented 3 years ago

Je viens de faire une nouvelle mission 16 plus marrante. Il faut peut-être ajuster la limite de temps. Tu en penses quoi ?

C'est génial ! La limite est bien je pense : même si c'est largement faisable en 10 secondes, je ne vois pas d'intérêt à donner un temps plus limité. Par contre un truc qui pourrait être bien serait d'afficher ton temps même quand tu réussis la mission !

Sinon, je viens d'ajouter un fichier TODO.md pour faire la liste des trucs à faire. Tu peux y ajouter des trucs...

OK très bien !

phyver commented 3 years ago

J'ai essayé de remettre une "animation" pour l'initialisation en mode "standard" (pas debug). Tu penses que ą vaut le coup ? (Tu peux essayer avec d'autres fichiers lib/titlescreen (j'en ai mis 2 autres dans lib).

rlepigre commented 3 years ago

J'ai essayé de remettre une "animation" pour l'initialisation en mode "standard" (pas debug). Tu penses que ą vaut le coup ? (Tu peux essayer avec d'autres fichiers lib/titlescreen (j'en ai mis 2 autres dans lib).

Ah oui, c'est vraiment pas mal! J'aime beaucoup la première (activée par défaut). C'est toi qui a créé l'image ? En tout cas c'est bien plus rigolo que d'avoir just des points qui s'affichent ! Par contre je pense qu'on devrait changer le cadre utilisé pour l'écran d'accueil, un truc en forme de parchemin serait plus joli je pense.

D'ailleurs, pour les missions qui ont encore une "barre de chargement" on pourrait peut-être faire un truc avec une araignée ou une chauve-souris en ASCII art qui se déplace d'un côté de l'écran à l'autre ! Je pense que ça pourrait être sympa.

rlepigre commented 3 years ago

On pourrait peut-être aussi avoir une petite animation pour (ou en tout cas mettre plus en avant les) récompenses. Pour l'instant c'est assez facile de louper le message. Peut-être qu'il suffirait de mettre le message en couleur, ou de le faire clignoter.

On pourrait avoir une image d'un coffre en ASCII-art.

phyver commented 3 years ago

Ah oui, c'est vraiment pas mal! J'aime beaucoup la première (activée par défaut). C'est toi qui a créé l'image ?

J'ai fait des copier/coller à partir d'autres trucs trouvés sur le net. Je voulais avoir un chateau, des montagnes, une forêt et une grotte !

En tout cas c'est bien plus rigolo que d'avoir just des points qui s'affichent ! Par contre je pense qu'on devrait changer le cadre utilisé pour l'écran d'accueil, un truc en forme de parchemin serait plus joli je pense.

Je le fais...

D'ailleurs, pour les missions qui ont encore une "barre de chargement" on pourrait peut-être faire un truc avec une araignée ou une chauve-souris en ASCII art qui se déplace d'un côté de l'écran à l'autre ! Je pense que ça pourrait être sympa.

Oui, mais un truc qui se déplace est pas super portable, en particulier s'il y a plusieurs lignes. (On peut essayer avec des chauves souris \,/ et /`\, mais sans le contexte, c'est pas clair... (cf "gnome castle ici https://ascii.co.uk/art/castles)

On pourrait peut-être aussi avoir une petite animation pour (ou en tout cas mettre plus en avant les) récompenses. Pour l'instant c'est assez facile de louper le message. Peut-être qu'il suffirait de mettre le message en couleur, ou de le faire clignoter.

On pourrait avoir une image d'un coffre en ASCII-art.

Je regarde ce que je trouve...

Sinon, je suis en train d'essayer de changer les missions sur les processus. J'en ai mis 2, et je suis en train d'en préparer une troisième. Tu peux tester ? (groupe missions/processes)

rlepigre commented 3 years ago

D'ailleurs, pour les missions qui ont encore une "barre de chargement" on pourrait peut-être faire un truc avec une araignée ou une chauve-souris en ASCII art qui se déplace d'un côté de l'écran à l'autre ! Je pense que ça pourrait être sympa.

Oui, mais un truc qui se déplace est pas super portable, en particulier s'il y a plusieurs lignes. (On peut essayer avec des chauves souris \,/ et /`\, mais sans le contexte, c'est pas clair... (cf "gnome castle ici https://ascii.co.uk/art/castles)

J'aime bien cette idée avec une chauve-souris toute simple. J'ai essayé un début de truc dans lib/progress.sh, pour l'instant c'est un script qui fait progresser la chauve-souris sur chaque entrée jusqu'à un e. Donc pour le tester tu peux le lancer et taper sur n'importe quelle touche pour faire avancer l'animation. Je sais pas trop comment intégrer ce genre de chose proprement. Une idée serait d'utiliser un "named pipe", et donc de fournir une bibliothèque avec les trois commandes suivantes:

J'ai essayé de faire ça vite fais, mais c'est plus compliqué que ce que je pensais ! (En particulier je pensais que le pipe avais son propre buffer, donc qu'il suffirait de faire un printf "." > PIPE pour progresser, mais visiblement c'est pas comme ça que ça marche.) Est-ce que ça te semble une bonne approche ? Si oui, je peux essayer de continuer plus tard.

Sinon, je suis en train d'essayer de changer les missions sur les processus. J'en ai mis 2, et je suis en train d'en préparer une troisième. Tu peux tester ? (groupe missions/processes)

OK super, je teste ça ce soir !

phyver commented 3 years ago

Je viens de mettre une dernière mission sur les processus. C'est mieux que les trucs d'avant, mais il faut tester, et revoir un peu les fichiers goal.

Sinon, gsh pass est devenu gsh skip, qui me parait plus clair. ("pass" veut dire "réussi"...)

Pour la chauve-souris, j'aime bien l'idée. On garde ça dans un coin, mais c'est pas très prioritaire. (Il n'y a que 2 ou 3 missions qui l'utiliseraient.) Je réfléchis aussi de mon coté...

rlepigre commented 3 years ago

Je viens de mettre une dernière mission sur les processus. C'est mieux que les trucs d'avant, mais il faut tester, et revoir un peu les fichiers goal.

OK. J'avais testé les deux premières missions plus tôt, et je trouve que c'est plutôt pas mal ! Par contre il semblerait que tu as cassé la deuxième mission avec tes derniers changements (je n'ai pas encore compris pourquoi). Le gsh check échoue en disant que je n'ai pas essayé de faire un kill avec le signal par défaut.

Sinon, gsh pass est devenu gsh skip, qui me parait plus clair. ("pass" veut dire "réussi"...)

OK, j'avais aussi repéré ça, et j'allais suggérer exactement ce renommage !

Pour la chauve-souris, j'aime bien l'idée. On garde ça dans un coin, mais c'est pas très prioritaire. (Il n'y a que 2 ou 3 missions qui l'utiliseraient.) Je réfléchis aussi de mon coté...

OK, c'est vrai, c'est pas du tout une priorité.

phyver commented 3 years ago

OK. J'avais testé les deux premières missions plus tôt, et je trouve que c'est plutôt pas mal ! Par contre il semblerait que tu as cassé la deuxième mission avec tes derniers changements (je n'ai pas encore compris pourquoi). Le gsh check échoue en disant que je n'ai pas essayé de faire un kill avec le signal par défaut.

C'est normalement corrigé. J'avais oublié des trucs dans la version python des scripts !

Y'a des trucs pas hyper pratiques dans ces missions : je veux lancer des processus, mais leur nom dépend de la locale, il ne suffit donc pas de les mettre dans bin. D'autre part, j'utilise 2 scripts différents avec le même nom (le sortilège de la fée, et celui du luting). Je pourrais les fusionner, mais ce n'est pas très naturel. (Et j'utilise de toute façon des scripts de même nom dans plusieurs missions...) Bref, je me retrouve à copier les fichiers exécutables dans $GSH_VAR à la main pour les exécuter depuis le init.sh.

Pour la chauve-souris, j'aime bien l'idée. On garde ça dans un coin, mais c'est pas très prioritaire. (Il n'y a que 2 ou 3 missions qui l'utiliseraient.) Je réfléchis aussi de mon coté...

OK, c'est vrai, c'est pas du tout une priorité.

Par contre, je ne vois pas le problème avec un tube nommé. Je viens de tester avec

$ mkfifo test
$ ./lib/pogress.sh < test

et

$ cat - > test

et j'ai bien l'animation.

rlepigre commented 3 years ago

C'est normalement corrigé. J'avais oublié des trucs dans la version python des scripts !

Ah OK !

Y'a des trucs pas hyper pratiques dans ces missions : je veux lancer des processus, mais leur nom dépend de la locale, il ne suffit donc pas de les mettre dans bin.

Ouais, c'est un peu chiant. Peut-être qu'on ne devrait pas copier les fichiers de bin automatiquement, mais laisser ça à static.sh? On pourrait fournir une commande install_gsh_bin qui fait ce qu'il faut avec le TEXTDOMAIN et compagnie, et ça permettrait de traduire le nom de l'executable au passage.

D'autre part, j'utilise 2 scripts différents avec le même nom (le sortilège de la fée, et celui du luting). Je pourrais les fusionner, mais ce n'est pas très naturel. (Et j'utilise de toute façon des scripts de même nom dans plusieurs missions...) Bref, je me retrouve à copier les fichiers exécutables dans $GSH_VAR à la main pour les exécuter depuis le init.sh.

Ouais, c'est un peu chiant de devoir faire ça. Mais bon, on peut toujours améliorer ça plus tard.

Pour la chauve-souris, j'aime bien l'idée. On garde ça dans un coin, mais c'est pas très prioritaire. (Il n'y a que 2 ou 3 missions qui l'utiliseraient.) Je réfléchis aussi de mon coté...

OK, c'est vrai, c'est pas du tout une priorité.

Par contre, je ne vois pas le problème avec un tube nommé. Je viens de tester avec

  $ mkfifo test
  $ ./lib/pogress.sh < test

et

 $ cat - > test

et j'ai bien l'animation.

Oui, ça marche très bien. Mais ce que je pensais pouvoir faire c'est un truc du genre echo "." > test, mais si tu fais ça le pipe est fermé en lecture dans progress.sh. Ceci dit, on peut très bien l'ouvrir à nouveau. J'essayerai peut-être de tester ça ce soir.

phyver commented 3 years ago

Oui, ça marche très bien. Mais ce que je pensais pouvoir faire c'est un truc du genre echo "." > test, mais si tu fais ça le pipe est fermé en lecture dans progress.sh. Ceci dit, on peut très bien l'ouvrir à nouveau. J'essayerai peut-être de tester ça ce soir.

Peut-être qu'un truc comme ça pourrait marcher : https://stackoverflow.com/questions/65347320/how-can-i-keep-a-fifo-open-for-reading

(Là, je suis à ma deuxième réunion Zoom de la matinée...)

phyver commented 3 years ago

Je suis en train de reprendre un peu les missions 9 et 10, mais je finirais demain.

Est-ce que ça serait pas mieux de remplacer l'entrée du chateau par la "salle de banquet" ?

Aussi, je me demande si ça veut vraiment le coup de faire tous ces tests compliqués : ici, chaque étendart contient une somme de contrôle avec aléa, que l'on vérifie ! C'est probablement inutile. (Si le joueur est capable de recréer un fichier avec le bon nom au bon endroit, il mérite sa mission.) En tout cas, ça vaudrait le coup de faire quelques fonctions pour faciliter tout ça. (sign FILE qui ajoute une signature en haut du fichier, et check FILE qui vérifie cette signature) Tu en penses quoi ?

Autre truc, la fonction mission_source permet de charger un fichier. Par exemple, pour les missions 09 et 10, j'ai créé un fichier init0.sh pour générer les objets "inutiles" dans la mission 09, et j'ai fait un lien vers ce fichier dans la mission 10. Je le charge avec mission_source dans le fichier init.sh principal. Pour que ça marche, la fonction mission_source doit résoudre les liens symboliques pour définir MISSION_DIR (un script qui fait référence à MISSION_DIR veut accéder au répertoire correspondant) et pour définire TEXTDOMAIN (pour pouvoir accéder aux bon fichiers de traduction). Il ne faut pas résoudre les liens pour définir MISSION_NAME qui est utilisé dans les messages. Est-ce que tu vois des cas où ce n'est pas ce qu'il faut faire ?

rlepigre commented 3 years ago

Est-ce que ça serait pas mieux de remplacer l'entrée du chateau par la "salle de banquet" ?

Oui, pourquoi pas, par contre je sais pas ce que ça doit être en anglais. Sinon on pourrait peut-être utiliser "Grande Salle" / "Great Hall" (utilisé dans Harry Potter par exemple).

Aussi, je me demande si ça veut vraiment le coup de faire tous ces tests compliqués : ici, chaque étendart contient une somme de contrôle avec aléa, que l'on vérifie ! C'est probablement inutile. (Si le joueur est capable de recréer un fichier avec le bon nom au bon endroit, il mérite sa mission.)

C'est vrai, je suis d'accord.

En tout cas, ça vaudrait le coup de faire quelques fonctions pour faciliter tout ça. (sign FILE qui ajoute une signature en haut du fichier, et check FILE qui vérifie cette signature) Tu en penses quoi ?

Je suis complètement d'accord, c'est pour partager ce genre de chose que je voulais un dossier de bibliothèques partagées au départ.

Autre truc, la fonction mission_source permet de charger un fichier. Par exemple, pour les missions 09 et 10, j'ai créé un fichier init0.sh pour générer les objets "inutiles" dans la mission 09, et j'ai fait un lien vers ce fichier dans la mission 10. Je le charge avec mission_source dans le fichier init.sh principal. Pour que ça marche, la fonction mission_source doit résoudre les liens symboliques pour définir MISSION_DIR (un script qui fait référence à MISSION_DIR veut accéder au répertoire correspondant) et pour définire TEXTDOMAIN (pour pouvoir accéder aux bon fichiers de traduction). Il ne faut pas résoudre les liens pour définir MISSION_NAME qui est utilisé dans les messages. Est-ce que tu vois des cas où ce n'est pas ce qu'il faut faire ?

Ça me semble correct, je ne vois pas de cas où on voudrait autre chose. Par contre il faut vraiment documenter tout ça !

De mon côté j'ai réussi à faire à peu près ce que je voulais avec la barre de progression. Il y a encore quelques trucs à améliorer avant de pouvoir l'utiliser. Il y a un truc assez mystérieux : j'utilise mktemp pour avoir un nom de fichier temporaire, mais pour une raison que j'ignore ça me donne un fichier dans le dossier courant au lieu de /tmp/. Tu as une idée pourquoi ? J'avais juste oublié l'option -t, et je ne donnais pas de PATTERN en testant dans le terminal (d'où ma confusion).

Si tu veux tester la bibliothèque tu peux utiliser:

#!/bin/bash

source lib/progress.sh

echo "Start of the script..."

P=$(new_progress)

progress_start "$P"

for I in $(seq 1 80)
do
  sleep 0.03
  progress_step "$P"
done

progress_done "$P"

echo "End of the script..."

Un truc que j'ai essayé sans succès est de combiner new_progress et progress_start. Je ne comprend pas pourquoi on ne peut pas juste combiner les deux fonctions. J'imagine que c'est une histoire de pipe non fermé. En gros la fonction se terminait par un truc du genre:

_progress_start "$PIPE"&
echo "$PIPE"

J'imagine que le process en background bloque le retour de la fonction parce qu'il garde les pipes d'entrée/sorties ouverts. Mais du coup je ne comprend pas pourquoi l'actuel progress_start termine bien: la fonction se termine par un _progress_start "$PIPE"&. Le problème ne devrait-il pas être le même?

rlepigre commented 3 years ago

Au fait, j'ai testé à nouveau les missions sur les processus et tout semble bien marcher. Par contre je me demande si on ne fait pas trop de choses avec des fichiers cachés: presque toutes les missions en utilisent, et ils ne me semblent pas aussi présent dans la pratique. Qu'en penses-tu ?

phyver commented 3 years ago

De mon côté j'ai réussi à faire à peu près ce que je voulais avec la barre de progression.

Pourquoi utiliser mktemp ? Ça veut dire qu'il faut ensuite donner le nom au second processus. On peut utiliser $GSH_VAR/progress_fifo. Le problème, c'est peut-être si un processus continue à utiliser progress_step en arrière plan.

Est-ce que ça permet de supprimer new_progress ? Il faudrait juste que progress_start vide la file. Non ?

EDIT : et est-ce que la fonction "progress_step" est obligatoire ? Je verrais plutot un truc du style

progress_start "$GSH_VAR/progress_fifo" &
long_process > "$GSH_VAR/progress_fifo"
progress_done

Comme ça, on demande juste que long_process affiche son avancement sur stdout (ou stderr, mais ça me parait moins bien).

rlepigre commented 3 years ago

De mon côté j'ai réussi à faire à peu près ce que je voulais avec la barre de progression.

Pourquoi utiliser mktemp ? Ça veut dire qu'il faut ensuite donner le nom au second processus. On peut utiliser $GSH_VAR/progress_fifo. Le problème, c'est peut-être si un processus continue à utiliser progress_step en arrière plan.

L'idée est que cette bibliothèque n'est pas nécessairement utile que pour GameShell, et on peut bien imaginer qu'elle soit utilisée parallèlement par deux shells distincts, auquel cas il ne faut pas partager le pipe.

Mais bon, la solution que tu propose, où le nom de fichier pour le pipe est donné à toutes les fonctions, me semble très bien. Comme ça c'est au client de la bibliothèque de s'assurer que le fichier est spécifique à une instance de barre de progression.

Est-ce que ça permet de supprimer new_progress ? Il faudrait juste que progress_start vide la file. Non ?

Oui, je pense qu'on pourrait faire comme ça, ce serait très bien.

EDIT : et est-ce que la fonction "progress_step" est obligatoire ? Je verrais plutot un truc du style

progress_start "$GSH_VAR/progress_fifo" &
long_process > "$GSH_VAR/progress_fifo"
progress_done

Pour progress_done il faut aussi donner le chemin du pipe en argument non? Et pour long_progress ce serait peut-être mieux de prendre le pipe en argument non?

Comme ça, on demande juste que long_process affiche son avancement sur stdout (ou stderr, mais ça me parait moins bien).

Peut-être que je ne comprend pas exactement ce que tu suggères : est-ce que long_progress est fourni par la bibliothèque ? Ou est-ce que c'est la partie du script qui fait le travail (et qui affiche ce qu'il faut sur son stdout)?

phyver commented 3 years ago

Mais bon, la solution que tu propose, où le nom de fichier pour le pipe est donné à toutes les fonctions, me semble très bien. Comme ça c'est au client de la bibliothèque de s'assurer que le fichier est spécifique à une instance de barre de progression.

Et on peut fournir une fonction pour créer un tube au besoin, comme tu fais...

EDIT : et est-ce que la fonction "progress_step" est obligatoire ? Je verrais plutot un truc du style

progress_start "$GSH_VAR/progress_fifo" &
long_process > "$GSH_VAR/progress_fifo"
progress_done

Pour progress_done il faut aussi donner le chemin du pipe en argument non?

Oups... Oui. (Ou alors, il faut que progress_start définisse une variable d'environnement, ce qui n'est pas très joli dans ce cas.)

Et pour long_progress ce serait peut-être mieux de prendre le pipe en argument non?

Non. Mon idée est que si l'utilisateur a une fonction qui affiche une progression "basique" (une suite de points comme actuellement), il puisse facilement la remplacer par une progression "marrante". Typiquement, long_process sera la fonction d'initialisation d'une mission.

D'ailleurs, pour GameShell, on peut faire encore plus simple et utiliser une redirection standard :

init_mission | progress_bar

progress_bar lit simplement sur stdin. Pas besoin de tube, de progress_start ou de progress_done. On peut imaginer une option pour faire une étape "par caractère", ou "par ligne", suivant l'affichage que fait la fonction init_mission.

Tu vois des exemples où ça ne nous suffirait pas ?

rlepigre commented 3 years ago

D'ailleurs, pour GameShell, on peut faire encore plus simple et utiliser une redirection standard :

init_mission | progress_bar

Oui, tu as raison. C'est ce que j'avais au tout début, et je sais pas trop pourquoi je me suis lancé dans un truc super compliqué.

Tu vois des exemples où ça ne nous suffirait pas ?

Non, il suffit juste de changer le code pour utiliser une fonction, et c'est effectivement bien plus simple. L'animation est maintenant utilisée pour l'initialisation de missions/stdin_stdout_stderr/04_stderr_dev-null_grimoires.

Dans la version actuelle tout se passe caractère par caractère, on verra si on a besoin d'un option qui progresse ligne par ligne plus tard. Et on pourra aussi voir si on veut plus d'options et des animations alternatives plus tard.

rlepigre commented 3 years ago

Je viens d'ajouter la récompense pour la mission 15 (bashrc dans le coffre). Je pense que c'est à peu près ce que tu avais en tête, mais n'hésite pas à me dire si tu veux que je change des trucs !

phyver commented 3 years ago

C'est exactement ça ! Sinon, j'ai déplacé progress_bat dans le nouveau fichier lib/missions_utils.sh avec quelques autres nouvelles fonctions...

phyver commented 3 years ago

J'ai un peu simplifié ta fonction progress_bat. Ça pourrait être plus facile de mettre d'autres animations. (un millepattes : ,',',',',',',',(:), un serpent __/\__/\__/\<:>, une fourmi >|<(), etc.)

rlepigre commented 3 years ago

J'ai un peu simplifié ta fonction progress_bat. Ça pourrait être plus facile de mettre d'autres animations. (un millepattes : ,',',',',',',',(:), un serpent __/\__/\__/\<:>, une fourmi >|<(), etc.)

En effet, c'est un bonne idée !

Par contre, j'aimais bien qu'on efface la ligne à la fin de l'animation. Toi tu préfères garder le dernier affichage ? Un autre truc que j'ai remarqué c'est qu'avec les \b l'affichage commence sur la ligne précédente, ce qui est un peu bizarre. (D'ailleurs c'est pire avec un serpent.)

phyver commented 3 years ago

Par contre, j'aimais bien qu'on efface la ligne à la fin de l'animation. Toi tu préfères garder le dernier affichage ? Un autre truc que j'ai remarqué c'est qu'avec les \b l'affichage commence sur la ligne précédente, ce qui est un peu bizarre. (D'ailleurs c'est pire avec un serpent.)

Zut, effectivement, le premier élément du tableau contient les \b\b\b. Je ne sais pas ce qui est le mieux.

Pour le dernier affichage, je ne sais pas trop. Si ça va vite, on n'a pas forcément le temps de voir ce qui se passe. (J'ai d'ailleurs augmenté le délai du sleep parce que je trouvais que ça allait trop vite.)

C'est pas encore complètement au point tout ça.

rlepigre commented 3 years ago

Par contre, j'aimais bien qu'on efface la ligne à la fin de l'animation. Toi tu préfères garder le dernier affichage ? Un autre truc que j'ai remarqué c'est qu'avec les \b l'affichage commence sur la ligne précédente, ce qui est un peu bizarre. (D'ailleurs c'est pire avec un serpent.)

Zut, effectivement, le premier élément du tableau contient les \b\b\b. Je ne sais pas ce qui est le mieux.

Peut-être qu'on pourrait construire une chaîne d'espaces: un est ajouté à chaque tour de boucle. Comme ça on peut virer les \b\b\b et utiliser \r à nouveau. Ils sont de toute façon un peu problématiques quand tu veux faire un serpent comme il faut en écrire une quinzaine.

Pour le dernier affichage, je ne sais pas trop. Si ça va vite, on n'a pas forcément le temps de voir ce qui se passe. (J'ai d'ailleurs augmenté le délai du sleep parce que je trouvais que ça allait trop vite.)

Ouais, c'est pas mal de le ralentir un peu, de toute façon ça ne bloque pas le truc qui prend du temps, on ne ralentit que l'affichage. Mais bon, c'est aussi un peu bizarre de se retrouver avec une chauve-souris qui se fige en plein vol.

C'est pas encore complètement au point tout ça.

Oui, mais on n'est pas loin je pense.

phyver commented 3 years ago

Peut-être qu'on pourrait construire une chaîne d'espaces: un est ajouté à chaque tour de boucle. Comme ça on peut virer les \b\b\b et utiliser \r à nouveau. Ils sont de toute façon un peu problématiques quand tu veux faire un serpent comme il faut en écrire une quinzaine.

J'avais pensé à ça au début : on regarde la taille de la chaine, et on en déduit le nombre de \b à mettre. J'aime bien ma solution parce qu'on peut donner (".") pour afficher une progression basique, ou ("\b|" "\b/" "\b-" "\b\\") pour afficher une barre qui tourne, etc.

Mais c'est vrai que pour le serpent, c'est pas super pratique...

Pour le dernier affichage, je ne sais pas trop. Si ça va vite, on n'a pas forcément le temps de voir ce qui se passe. (J'ai d'ailleurs augmenté le délai du sleep parce que je trouvais que ça allait trop vite.)

Ouais, c'est pas mal de le ralentir un peu, de toute façon ça ne bloque pas le truc qui prend du temps, on ne ralentit que l'affichage. Mais bon, c'est aussi un peu bizarre de se retrouver avec une chauve-souris qui se fige en plein vol.

Oui, je viens finalement de l'enlever...

C'est pas encore complètement au point tout ça.

Oui, mais on n'est pas loin je pense.

Ouaip.

Je vais essayer de refaire une partie complète en francais en notant les trucs à changer :

Dans les trucs à faire, il y a finaliser ton groupe de missions book_of_potions, en remplaçant notamment la dernière mission que je n'aime pas ; et traduire le livre.

Tu vois d'autres trucs ?

rlepigre commented 3 years ago

J'avais pensé à ça au début : on regarde la taille de la chaine, et on en déduit le nombre de \b à mettre. J'aime bien ma solution parce qu'on peut donner (".") pour afficher une progression basique, ou ("\b|" "\b/" "\b-" "\b\\") pour afficher une barre qui tourne, etc.

Mais c'est vrai que pour le serpent, c'est pas super pratique...

On peut aussi avoir une option pour controller ce qui se passe.

Sinon il faut donner une "image initiale" qui est affichée avant de commencer l'animation, comme ça on n'a pas le problème de retour sur la ligne précédente.

Ouais, c'est pas mal de le ralentir un peu, de toute façon ça ne bloque pas le truc qui prend du temps, on ne ralentit que l'affichage. Mais bon, c'est aussi un peu bizarre de se retrouver avec une chauve-souris qui se fige en plein vol.

Oui, je viens finalement de l'enlever...

OK.

Je vais essayer de refaire une partie complète en francais en notant les trucs à changer :

  • enlever certains des fichiers cachés
  • voir si on modifie certains lieux (je vais remplacer l'entrée par le grand hall. J'aime bien, et j'avais toujours imaginé l'entrée comme la porte extérieure du chateau, juste derrière le pont levis. C'était toujours un peu bizarre d'y récupérer des tapisseries !)
  • décider si l'ordre des missions est cohérent
  • etc.

OK, très bien.

Dans les trucs à faire, il y a finaliser ton groupe de missions book_of_potions, en remplaçant notamment la dernière mission que je n'aime pas ; et traduire le livre.

Oui, je vais m'occuper de ça dés que j'ai un moment. Et je vais faire une partie complète en anglais avec Bran.

Tu vois d'autres trucs ?

Non, rien d'autre de vraiment important dans l'immédiat, à part une grosse passe sur la documentation. Je pense qu'après tout ça, on peut commencer à l'envoyer à des gens pour faire tester le jeu un peu plus.

rlepigre commented 3 years ago

J'ai enfin traduit le livre de potions en français ! Par contre, il y a un truc que je ne comprend pas bien avec les traductions : il semble que les fichiers de traduction ne se mettent plus à jour directement, je suis obligé de les supprimer dans le dossier locale pour qu'ils soient mis à jour. Est-ce que c'est normal ?

Aussi, je ne me rappelle plus ce qu'on a dit pour les missions du groupe "livre de potions". Qu'est-ce que tu n'aimes pas déjà avec la mission 5? (J'arrive plus à retrouver ce que tu avais dit, il y a trop de messages sur cette page !) Est-ce qu'il suffit de la supprimer, ou est-ce qu'on veut un truc à la place ? Il y a plusieurs idées de missions pour le groupe (toutes les parties du livre ne sont pas encore utilisées), mais je ne sais pas si on veut faire ça maintenant ou plus tard.

phyver commented 3 years ago

J'ai enfin traduit le livre de potions en français !

Super !

Par contre, il y a un truc que je ne comprend pas bien avec les traductions : il semble que les fichiers de traduction ne se mettent plus à jour directement, je suis obligé de les supprimer dans le dossier locale pour qu'ils soient mis à jour. Est-ce que c'est normal ?

Ah oui, pour gagner un peu de temps, il ne sont regénérés que s'ils sont absents. Il faut donc faire un make clean dans $GSH_ROOT pour les supprimer. Je devrais peut-être toujours les regénérer en mode debug. Tu en pense quoi ?

Aussi, je ne me rappelle plus ce qu'on a dit pour les missions du groupe "livre de potions". Qu'est-ce que tu n'aimes pas déjà avec la mission 5?

Ça serait bien d'avoir une seconde mission avec un tube dans le groupe. On peut mettre soit une combinaison head | tail pour récupérer le milieu, soit une combinaison head | nl ou tail | nl pour numéroter les étapes. (J'ai eu une autre idée pour utiliser paste : retrouver les 2 morceaux d'une carte au trésor...

(J'arrive plus à retrouver ce que tu avais dit, il y a trop de messages sur cette page !)

C'est vrai que ça commence à faire long !

rlepigre commented 3 years ago

J'ai enfin traduit le livre de potions en français !

Super !

Par contre, il y a un truc que je ne comprend pas bien avec les traductions : il semble que les fichiers de traduction ne se mettent plus à jour directement, je suis obligé de les supprimer dans le dossier locale pour qu'ils soient mis à jour. Est-ce que c'est normal ?

Ah oui, pour gagner un peu de temps, il ne sont regénérés que s'ils sont absents. Il faut donc faire un make clean dans $GSH_ROOT pour les supprimer. Je devrais peut-être toujours les regénérer en mode debug. Tu en pense quoi ?

Ah OK. Ce serait peut-être pas mal de faire ça effectivement. Il suffit de supprimer le dossier locale au début c'est ça ? Une alternative serait de vérifier que les .mo sont plus récents que les .po correspondants. Mais bon, ça risque de prendre presque autant de temps que de toujours les générer.

Aussi, je ne me rappelle plus ce qu'on a dit pour les missions du groupe "livre de potions". Qu'est-ce que tu n'aimes pas déjà avec la mission 5?

Ça serait bien d'avoir une seconde mission avec un tube dans le groupe. On peut mettre soit une combinaison head | tail pour récupérer le milieu, soit une combinaison head | nl ou tail | nl pour numéroter les étapes.

OK, je vais faire le head | tail je pense comme c'est le plus adapté avec la version actuelle du livre.

(J'ai eu une autre idée pour utiliser paste : retrouver les 2 morceaux d'une carte au trésor...

Bonne idée ! Après, on a les deux pages arrachées du livre qui ne sont pas utilisées, donc ce serait peut-être pas mal de les utiliser pour une mission. Peut-être que ça pourrait être l'occasion de parler du fait que paste book/page truc > book/page ne fait pas ce qu'on attend. On pourrait avoir une mission qui utilise un fichier temporaire pour la première page, et puis une mission qui fait la deuxième page avec sponge. (Mais bon, si on fait ça, on peut le faire plus tard.)

(J'arrive plus à retrouver ce que tu avais dit, il y a trop de messages sur cette page !)

C'est vrai que ça commence à faire long !

Un truc qui est pas mal c'est d'utiliser les "review", comme ça tu peux marquer les fils de discussions "resolved" donc ils ne s'affichent plus. Mais bon, ça marche que pour les points particuliers, et on a surtout eu des discussions générales. Donc bref, c'est pas très grave !

phyver commented 3 years ago

Un truc qui est pas mal c'est d'utiliser les "review", comme ça tu peux marquer les fils de discussions "resolved" donc ils ne s'affichent plus. Mais bon, ça marche que pour les points particuliers, et on a surtout eu des discussions générales. Donc bref, c'est pas très grave !

Ah ! J'essaierais, si j'y pense...

Je viens de faire un gros patch pas très élégant pour améliorer la compatilibilé BSD (et donc probablement macOS). Y'avais des trucs pas très marrants, et des trucs pas encore faits. Un truc chiant pour les missions sur les processus, c'est que freebsd ne nomme pas les processus comme linux. Même avec un shebang correct, le fichier spell

#!/usr/local/bin/bash
...

ne donne pas un processus spell mais un processus bash ...chemin.../spell. C'est un peu con pour les missions...

J'ai du aussi par exemple modifier la création du "book of potion" parce que csplit n'a pas les même options. Et d'autres trucs similaires...

C'est pas fini, mais je m'arête pour le moment...

rlepigre commented 3 years ago

Je viens de faire un gros patch pas très élégant pour améliorer la compatilibilé BSD (et donc probablement macOS). Y'avais des trucs pas très marrants, et des trucs pas encore faits.

OK cool ! Je peux peut-être trouver un collègue avec un mac pour tester si tu veux.

Un truc chiant pour les missions sur les processus, c'est que freebsd ne nomme pas les processus comme linux. Même avec un shebang correct, le fichier spell ne donne pas un processus spell mais un processus bash ...chemin.../spell. C'est un peu con pour les missions...

Ouais, c'est un peu dommage. Mais bon, c'est pas dramatique non plus.

J'ai modifié progress_bar pour choisir une version au hasard (parmi les animaux seulement) si il n'y a pas d'arguments, et sinon le "theme" spécifié comme premier argument. J'ai aussi ajouté des poissons.

D'ailleurs, je suis assez déçu par le mille-pates : je pensais que l'animation serait plus marrante, mais on ne vois pas vraiment les pates bouger comme les caractères sont très petits. Et puis je trouve aussi que la fourmi est difficile à reconnaître, surtout qu'il n'y a pas de mouvement. (Les poissons ont le même problème, mais c'est quand même mieux, surtout pour celui qui fait des allers-retours.)

phyver commented 3 years ago

D'ailleurs, je suis assez déçu par le mille-pates : je pensais que l'animation serait plus marrante, mais on ne vois pas vraiment les pates bouger comme les caractères sont très petits.

Je suis d'accord. Il y a surement moyen de l'améliorer...

Je viens d'en ajouter un dont je suis très fier : la chenille (`caterpillar'). Je te laisse tester...

rlepigre commented 3 years ago

Je viens d'en ajouter un dont je suis très fier : la chenille (`caterpillar'). Je te laisse tester...

Excellent !

rlepigre commented 3 years ago

J'ai fait une partie complète en anglais ce soir, je met ce que j'ai noté dessous. J'ai pas réussi à motiver Bran assez pour qu'elle refasse une partie ce weekend, mais on fera peut-être ça un soir cette semaine pour voir si il y a des choses à améliorer dans la traduction.

Here are a few possible improvements:

phyver commented 3 years ago

J'ai changé bin en sbin. Ça permet de différencier les exécutables qu'on veut rendre accessible dans le PATH (bin) de ceux qu'on ne veut pas rendre accessibles (sbin). Je ne suis pas super content, mais c'est le plus souple et le plus simple. Non ?

Et j'ai mis un canard et une araignée dans progress_bar, et modifié un peu le mille-pattes... :)

phyver commented 3 years ago

Mission basic/rm_wildcard_spiders_cellar should perhaps only introduce the wildcards on non-hidden files? We could introduce a mission before this one, where spiders are not hidden.

Fait.

In the missions of the processes group there are messages shown (after the check) involving process test-proc-name. Hide this?

Corrigé.

In mission stdin_stdout_stderr/stderr_dev-null_grimoires I got zero match, but the mission was still checked correctly. Maybe we should ensure that the incantation actually appears at least one or two times?

Oups... La fonction random_string ne renvoyait que des A et B ! Corrigé.

In mission stdin_stdout_stderr/stdout_stderr_redirection_merlin is the player supposed to copy/paste the secret key? Or is it rather to use a temporary file? Maybe we should add a hint.

Corrigé. Je n'ai pas changé le goal, mais le check refuse de valider si on essaie de faire un copier-coller et précise qu'il faut faire une redirection. Tu en penses quoi ?

In mission pipes_merchant_stall/pipe_1 is there a way to not count gsh in the command count? Or at least gsh goal?

Fait, mais c'est probablement bien de tester un peu plus.

After the missions of the pipes_merchant_stall group it seems that the command counter remains there. (A gsh hardreset fixes the problem.)

Normalement corrigé.

At the end of mission misc/tr_caesar_shift it is a bit weird to have the chest appear in the cellar. Maybe it should simply appear in the office? Maybe we should thing of a few more things to put in there?

Fait.

I think it would be nice to add a more "treasures" (not sure what though).

Autres trucs dans le prompt ? (nombre de "jobs", couleurs, valeur de la dernière commande (vrai / faux)) D'autres alias ? (.. pour cd .., pst pour pstree -p $$) À réfléchir.

Au fait, est-ce que l'affichage des messages des trésors te convient ?

phyver commented 3 years ago

J'ai fini une première version des fichiers doc/gameshell.md et doc/mission.md. Tu peux y jeter un coup d'oeuil si tu veux.

2 questions :