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).
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
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
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