The Lambda Reactor Moteur de jeu fonctionnel réactif Ordre du jour 1. 2. 3. 4. 5. Description Programmation réactive fonctionnelle Haskell - Elm Services offerts Moteur a. b. 6. 7. 8. 9. Fil d’exécution Méthode de développement Problèmes! Apprentissages Travail Futur Conclusion Description ● Moteur de jeu ○ ○ ○ ● Réactif ○ ○ ● Serveur Haskell Client Elm Communication Socket.IO Sécurité des fils d’exécution Développement aisé Fonctionnel ○ ○ ○ «Si ça compile, ça marche» Pur Tests unitaires Changement majeur : Programmation réactive ● Abandon du Jalon 3 (Facultatif) ○ ○ ○ ○ ○ ● Bots Explosions Classes Brouillard de guerre Esthétisme Exploration Programmation réactive fonctionnelle ● ● ● Existe depuis 1997 Un moyen de programmer avec des évènements en limitant les effets de bord Plusieurs implémentations disponible, nous en avons choisi deux: ○ Représentation de Reactive Banana Évènement: suite infinie représentée par un temps et une valeur (chaque évènement est immuable) ● Exemple: un message du client, une nouvelle connexion, un tic, … ■ Behavior: représente une valeur continue, variable dans le temps ● Exemple: l'état du jeu, un compteur de nombre de personnes connectées, ... Représentation de Elm ■ Signal: un mélange des deux, plus simple à utiliser mais moins flexible ■ Chaque signal doit avoir une valeur initiale ■ ○ Haskell ● ● ● Langage fonctionnel créé en 1990 dans le but de faciliter la recherche dans les langages de programmation Académique et «open source», donc beaucoup de fonctionnalités avant-gardistes Pur ○ ● ● Les effets de bord sont contrôlés par le système de types Évaluation paresseuse par défaut Commence à être présent dans le marché ○ ○ ○ Moteur anti-pourriel de Facebook Description de micro-conducteur chez Bluespec Et beaucoup plus! Elm ● ● ● Conçu en 2012 par Evan Czaplicki Langage fonctionnel pur inspiré de Haskell Créé pour rendre le développement Web plus agréable ○ ○ ● ● ● ● ● Simplicité La réactivité est au coeur du langage Compile en JavaScript, HTML et CSS Fortement typé et valeurs immuables Interopérabilité avec JavaScript Système de gestion des librairies Utilisé par: Prezi, NoRedInk et d’autres Services du moteur ● ● ● ● ● ● ● Chargeur de cartes Chargeur de lutins (sprite) Gestion des collisions Plusieurs outils d’algèbre linéaire Communication en JSON via Socket.IO Génération automatique des types en Elm depuis Haskell avec conversion en JSON Création d’un module «open source» pour utiliser une bibliothèque réactive Méthode de développement ● Construire le graphe d’évènements ○ ● Créer des fonctions évaluées («modifiées») par les évènements ○ ● Ce qui sera reçu du client Envoyer les informations aux clients Créer le client qui envoie/réagit au serveur ○ ○ Empêche la triche Peu de travail sur le client, se concentre sur l’affichage Problèmes rencontrés (Serveur) ● ● ● ● La bibliothèque de Socket.IO fonctionnait avec des «callbacks» impératif Code (un peu trop!) parallèle Création d’une bibliothèque «open source» pour remédier à ces problèmes Goulots d’étranglements Problèmes rencontrés (Client) ● Le langage est encore en développement ○ ○ ● Documentation restreinte Pas toutes les fonctionnalités qu’on voudrait ■ Pas de moyen de générer un canevas à partir d’une image Gestion des messages rendue difficile par le fureteur ○ Touche Backspace problématique Apprentissages (Frédéric) ● ● ● Functional Reactive Programming Gestion de projet, adaptation Connaissances approfondies en Haskell. ○ ○ Functor, Applicative, Aeson, Lens, Monad, etc Tests unitaires Apprentissages (Bruno) ● ● ● Functional Reactive Programming Elm Connaissances approfondies en Haskell ○ ○ ○ ○ Stack (gestionnaire de build pour le langage) Monad transformer (utilisation de plusieurs monades en même temps) Free monad (Structure de données permettant de travailler sur l’arbre syntaxique à l’exécution) Connaissances théoriques du langage Apprentissages (Philippe) ● Elm ○ ○ ● Functional reactive programming Programmation Web ■ HTML ■ JavaScript Gestion du temps ○ ○ ○ Estimations Attentes vs. Réalité Recherche et documentation Travail futur 1. Mieux séparer le moteur et le jeu a. b. Déjà commencé avec la bibliothèque FRP<->Socket.IO Service de «GameState» générique 2. Mécanisme de création d’ennemies a. b. 3. Deep Q-Learning Interface agréable pour employer des stratégies Plus de services a. b. Explosions Brouillard de guerre Conclusion ● ● Preuve de concept réussie malgré les changements Exploration ○ Nouvelles connaissances https://github.com/bruno-cadorette/TheLambdaReactor