SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
Pesto
Un langage pour coder des IAs.
Fabrice Kocik
CTO Pastagames
fabrice@pastagames.net
http://www.pastagames.com
Pesto, en résumé
2 applications: ExploRobots (Pastagames) et Wild (Wild Sheep Studio).
Pesto est un langage de scripts, dédié au développement de
comportements des PNJ dans les jeux vidéo.
Les étapes de l’exposé
Il intègre primitivement le principe de continuation avec l’instruction
yield et l’instruction exec.
Il introduit de nouvelles constructions (do/onResume).
Il permet d’implémenter simplement des Automates à états (finally).
Problématique
Perception
Mémoire
(Connaissances)
Comportement du PNJ
Actions
Le Monde
Lisible pour le joueur
Contrôlé (niveau de difficulté…)
Pesto
C++, boucle
du jeu
Script Pesto
Frame 1
Frame 3
Frame 2
Frame 4
Frame 5
La continuation (yield)
Trouver la princesse
Scripts & instructions
Chercher un cheval
Monter le cheval
Tuer le troll
Sauver la
princesse
Pesto
… …
… …
● Le script
○ dans une classe
○ séquence d’instructions
○ instructions de contrôle (if,
while),
○ appel de procédures,
affectation de variables…
● L’instruction exec
○ exécution d’un sous-script
Scripts
Connaissances
Primitives
(Perceptions)
Actions
primitives
Connaissances
C++
Script Pesto
Pesto
modifient
Evénements
extérieurs
Le Monde
Arggg !
J’aime quand un plan se
déroule sans accroc.
Do-onResume (la supervision) : la force de Pesto
do
{
< 1- actions supervisées >
}
onResume
{
< 2- actions de supervision >
}
Pesto
● Un yield est déclenché dans < 1 >.
● La main est rendue au C++.
● Le retour dans le script se fait dans le
onResume. < 2 > est exécuté d’abord.
● Le déroulement normal reprend après
le yield déclencheur dans < 1 >.
Pesto, do-onResume
Trouver la princesse
Chercher un cheval
Monter le cheval
Tuer le troll
Sauver la
princesse
Désarçonné
du cheval
Interrompre & recommencer un script
Pesto, do-onResume
Trouver la princesse
Chercher un cheval
Monter le cheval
Tuer le troll
Sauver la
princesse
Désarçonné
du cheval
Mort du
cheval
do-onResume imbriqués
on reprend en partant du onResume le plus haut.
● Extension de la séquentialité
○ Plus générale
○ Plus flexible
○ Écriture plus lourde (surtout
texte, id d’état, id de super-
états...)
● Repose sur l’interruption
○ Changement d’état
Problématique
Automate à états finis
Combattre
Attaquer
au corps
à corps
Se
cacher
Fuir
Attaquer
à
distance
Automate à états finis
Pesto
Un état
Pesto & FSM
finally { <instructions> }
Exécutées quoi qu’il arrive
Même si le script est
interrompu par l’appelant
(break, retry, return)
Libération des ressources
allouées pour le script
Interruptions des états
Pesto, FSM
Pesto, do-onResume
Trouver la princesse
Se lamenter
Mort de
princesse
Interruption d’un script par
un autre script
dans le onResume
○ Exécution d’un script temporaire
○ Suivi d’un éventuel break
manger
Avoir
faim
Auto-adaptation
Pesto, do-onResume
Le script follow(Ennemi)
L’ennemi est mouvant.
La supervision permet de
re-déclencher le path finding
quand nécessaire
Time-out
Pesto, do-onResume
Ajouter un time-out à un script
existant
En ré-utilisant ce script
Sans le réécrire
L’instruction “as” (à venir)
…
as (<condition>) { <instructions> }
⟺
do { while (condition) { <instructions> } } onResume { if (not <condition>) { break; } }
Pesto
Un emploi du temps
Les outils, l’implémentation
Le compilateur
● Un script Pesto ⟶ une classe C++
○ une méthode execute
○ La classe est un automate à état (state = id de l’instruction en cours)
○ Les variables ⟶ champs
○ Appel à un sous-script = instanciation d’un sous-automate à état (autre classe c++)
○ Utilisation d’une resume stack pour gérer l’ordre d’exécution des onResume, onYield,
finally
● Le code obtenu est proche du script Pesto
○ Lisible
○ debuggable
Pesto
PESTO
C++
Extraction de l’automate à états à partir des scripts Pesto
○ Création d’un fichier texte définissant le graphe
○ Utilisation GraphViz (vieux projet MIT) pour générer un png
Pesto, outils et implémentation
L’interpréteur
● Mini IDE basé sur ImGui (https://github.com/ocornut/imgui)
● Le do-onResume n’utilise qu’une seule stack,
○ Mais effectue des déplacements des data dans cette stack.
● Utilisation d’une “resume stack” pour gérer l’ordre d’exécution des
onResume, finally
● Hot reload de scripts
Pesto, les outils, l’implémentation
D‘autres trucs
● Classe / Objet
○ Champs, Fonction, Procédure, script
○ Utilisation d’un pool d’objets
○ Manipulation des objets par des refs
○ Référence null typée ( Creature#null )
● Struct
○ Manipulation par valeur sur la stack ou comme champs
○ Passage de paramètre par référence
● Les classes externes
○ L’allocation, l’itération et la représentation interne et celle du pointeur sont gérées
par le C++
Pesto
● for ( creature : Creature; creature.isDangerous ) { … }
○ itération sur tous le pool d’objets d’une classe
○ pas de liste
● do { } onYield { }
○ exécution des onYield avant de rendre la main au c++
○ du bas vers le haut si imbrication des onYield
● do for ()
○ = parallelFor
● Syntaxes : regroupement fonction/champs
Pesto, d’autres trucs
if (isDead[creature]) { … }
field bool isDead [Creature creature]
func bool isDead [Creature creature]
Conclusion
● Evolution progressive du code
○ Procedure -> script
○ Séquence d’instructions -> automate à états
○ Séquence d’instructions -> emploi du temps
○ Ajout de condition d’interruptions
● Lisibilité, concision
○ Pas de code technique
● Modularité & réutilisabilité
○ Grâce au do-onResume
● Performant
○ Grâce au compilateur
● Sérialisation possible de l’état d’un pnj
○ Pour la persistence
○ Transmission réseau -> multi
Pesto
http://www.pastagames.com
fabrice@pastagames.net
● Inconvénients
○ Encore des trous d’implem, constructions manquantes (switch/case)
○ Une syntaxe à améliorer (elseif)
○ IDE encore trop sommaire
● Retour d’XP
○ Le compilateur est nécessaire.
○ Et c’est beaucoup plus facile et plus léger à coder !
○ ⇒ commencer par le compilateur.
Pesto, conclusion
http://www.pastagames.com
fabrice@pastagames.net
Se passer de Pesto ?
● En C++ (langage performant),
○ mélange code technique / fonctionnel
○ automates à micro-états gigantesques
○ Beaucoup de classes, beaucoup de code...
une complexité difficile à assumer
● Lua
○ Continuation = la co-routine = technique
○ interprété : pas aussi efficace que C++
○ pas typé, pas de classe, peu structurant
○ La supervision est possible mais pas lisible

Contenu connexe

Similaire à Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames

Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...Horgix
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
Enib cours c.a.i. web - séance #5 - groovy
Enib   cours c.a.i. web - séance #5 - groovyEnib   cours c.a.i. web - séance #5 - groovy
Enib cours c.a.i. web - séance #5 - groovyHoracio Gonzalez
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
PPT Python.pptx
PPT Python.pptxPPT Python.pptx
PPT Python.pptxbpmana
 

Similaire à Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames (12)

Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Theme 7
Theme 7Theme 7
Theme 7
 
Compte rendu jess
Compte rendu jessCompte rendu jess
Compte rendu jess
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
Enib cours c.a.i. web - séance #5 - groovy
Enib   cours c.a.i. web - séance #5 - groovyEnib   cours c.a.i. web - séance #5 - groovy
Enib cours c.a.i. web - séance #5 - groovy
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
PPT Python.pptx
PPT Python.pptxPPT Python.pptx
PPT Python.pptx
 

Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames

  • 1. Pesto Un langage pour coder des IAs. Fabrice Kocik CTO Pastagames fabrice@pastagames.net http://www.pastagames.com
  • 2. Pesto, en résumé 2 applications: ExploRobots (Pastagames) et Wild (Wild Sheep Studio). Pesto est un langage de scripts, dédié au développement de comportements des PNJ dans les jeux vidéo. Les étapes de l’exposé Il intègre primitivement le principe de continuation avec l’instruction yield et l’instruction exec. Il introduit de nouvelles constructions (do/onResume). Il permet d’implémenter simplement des Automates à états (finally).
  • 3. Problématique Perception Mémoire (Connaissances) Comportement du PNJ Actions Le Monde Lisible pour le joueur Contrôlé (niveau de difficulté…)
  • 4. Pesto C++, boucle du jeu Script Pesto Frame 1 Frame 3 Frame 2 Frame 4 Frame 5 La continuation (yield)
  • 5. Trouver la princesse Scripts & instructions Chercher un cheval Monter le cheval Tuer le troll Sauver la princesse Pesto … … … … ● Le script ○ dans une classe ○ séquence d’instructions ○ instructions de contrôle (if, while), ○ appel de procédures, affectation de variables… ● L’instruction exec ○ exécution d’un sous-script
  • 7. Do-onResume (la supervision) : la force de Pesto do { < 1- actions supervisées > } onResume { < 2- actions de supervision > } Pesto ● Un yield est déclenché dans < 1 >. ● La main est rendue au C++. ● Le retour dans le script se fait dans le onResume. < 2 > est exécuté d’abord. ● Le déroulement normal reprend après le yield déclencheur dans < 1 >.
  • 8. Pesto, do-onResume Trouver la princesse Chercher un cheval Monter le cheval Tuer le troll Sauver la princesse Désarçonné du cheval Interrompre & recommencer un script
  • 9. Pesto, do-onResume Trouver la princesse Chercher un cheval Monter le cheval Tuer le troll Sauver la princesse Désarçonné du cheval Mort du cheval do-onResume imbriqués on reprend en partant du onResume le plus haut.
  • 10. ● Extension de la séquentialité ○ Plus générale ○ Plus flexible ○ Écriture plus lourde (surtout texte, id d’état, id de super- états...) ● Repose sur l’interruption ○ Changement d’état Problématique Automate à états finis Combattre Attaquer au corps à corps Se cacher Fuir Attaquer à distance
  • 11. Automate à états finis Pesto
  • 12. Un état Pesto & FSM finally { <instructions> } Exécutées quoi qu’il arrive Même si le script est interrompu par l’appelant (break, retry, return) Libération des ressources allouées pour le script
  • 14. Pesto, do-onResume Trouver la princesse Se lamenter Mort de princesse Interruption d’un script par un autre script dans le onResume ○ Exécution d’un script temporaire ○ Suivi d’un éventuel break manger Avoir faim
  • 15. Auto-adaptation Pesto, do-onResume Le script follow(Ennemi) L’ennemi est mouvant. La supervision permet de re-déclencher le path finding quand nécessaire
  • 16. Time-out Pesto, do-onResume Ajouter un time-out à un script existant En ré-utilisant ce script Sans le réécrire
  • 17. L’instruction “as” (à venir) … as (<condition>) { <instructions> } ⟺ do { while (condition) { <instructions> } } onResume { if (not <condition>) { break; } } Pesto Un emploi du temps
  • 18. Les outils, l’implémentation Le compilateur ● Un script Pesto ⟶ une classe C++ ○ une méthode execute ○ La classe est un automate à état (state = id de l’instruction en cours) ○ Les variables ⟶ champs ○ Appel à un sous-script = instanciation d’un sous-automate à état (autre classe c++) ○ Utilisation d’une resume stack pour gérer l’ordre d’exécution des onResume, onYield, finally ● Le code obtenu est proche du script Pesto ○ Lisible ○ debuggable Pesto
  • 20. Extraction de l’automate à états à partir des scripts Pesto ○ Création d’un fichier texte définissant le graphe ○ Utilisation GraphViz (vieux projet MIT) pour générer un png Pesto, outils et implémentation
  • 21. L’interpréteur ● Mini IDE basé sur ImGui (https://github.com/ocornut/imgui) ● Le do-onResume n’utilise qu’une seule stack, ○ Mais effectue des déplacements des data dans cette stack. ● Utilisation d’une “resume stack” pour gérer l’ordre d’exécution des onResume, finally ● Hot reload de scripts Pesto, les outils, l’implémentation
  • 22. D‘autres trucs ● Classe / Objet ○ Champs, Fonction, Procédure, script ○ Utilisation d’un pool d’objets ○ Manipulation des objets par des refs ○ Référence null typée ( Creature#null ) ● Struct ○ Manipulation par valeur sur la stack ou comme champs ○ Passage de paramètre par référence ● Les classes externes ○ L’allocation, l’itération et la représentation interne et celle du pointeur sont gérées par le C++ Pesto
  • 23. ● for ( creature : Creature; creature.isDangerous ) { … } ○ itération sur tous le pool d’objets d’une classe ○ pas de liste ● do { } onYield { } ○ exécution des onYield avant de rendre la main au c++ ○ du bas vers le haut si imbrication des onYield ● do for () ○ = parallelFor ● Syntaxes : regroupement fonction/champs Pesto, d’autres trucs if (isDead[creature]) { … } field bool isDead [Creature creature] func bool isDead [Creature creature]
  • 24. Conclusion ● Evolution progressive du code ○ Procedure -> script ○ Séquence d’instructions -> automate à états ○ Séquence d’instructions -> emploi du temps ○ Ajout de condition d’interruptions ● Lisibilité, concision ○ Pas de code technique ● Modularité & réutilisabilité ○ Grâce au do-onResume ● Performant ○ Grâce au compilateur ● Sérialisation possible de l’état d’un pnj ○ Pour la persistence ○ Transmission réseau -> multi Pesto http://www.pastagames.com fabrice@pastagames.net
  • 25. ● Inconvénients ○ Encore des trous d’implem, constructions manquantes (switch/case) ○ Une syntaxe à améliorer (elseif) ○ IDE encore trop sommaire ● Retour d’XP ○ Le compilateur est nécessaire. ○ Et c’est beaucoup plus facile et plus léger à coder ! ○ ⇒ commencer par le compilateur. Pesto, conclusion http://www.pastagames.com fabrice@pastagames.net
  • 26. Se passer de Pesto ? ● En C++ (langage performant), ○ mélange code technique / fonctionnel ○ automates à micro-états gigantesques ○ Beaucoup de classes, beaucoup de code... une complexité difficile à assumer ● Lua ○ Continuation = la co-routine = technique ○ interprété : pas aussi efficace que C++ ○ pas typé, pas de classe, peu structurant ○ La supervision est possible mais pas lisible