Entries feed - Comments feed

Tuesday, 2 December 2014

Socorro: the Super Search Fields guide

Socorro has a master list of fields, called the Super Search Fields, that controls several parts of the application: Super Search and its derivatives (Signature report, Your crash reports... ), available columns in report/list/, and exposed fields in the public API. Fields contained in that list are known to the application, and have a set of attributes that define the behavior of the app regarding each of those fields. An explanation of those attributes can be found in our documentation.

Continue reading...

Tuesday, 1 July 2014

About Socorro

I have been working on Socorro for about 3 years now. It was about time that I started talking about it on this blog! With this first post, I am inaugurating 2 new tags, socorro and mozilla. I'm also going to add a language tag to my posts, so each new post will either be en or fr. This way, you can choose more accurately what kind of content you want to read from this blog. The previous links on the tags lead to the filtered Atom feeds, and I will add the mozilla feed to the Planet.

Continue reading...

Tuesday, 27 May 2014

Play Michel in Hell, our Ludum Dare 29 game!

Last year, my friend Aurélien invited me to participate with him and a few other friends in the Ludum Dare, for the 26th edition. We made a Flash game, which is probably why I didn't write about it (how could I face my Mozilla colleagues after making a Flash game? ). It's called Sniff and it's about a drug dealer that needs to deliver its magical powder to his customers. As those customers are in a night club, you will need to use the music to find your way through the town. Beware of the cops that want to catch you, and beware of not using the different powers the drug gives you...

Continue reading...

Monday, 8 April 2013

Soviet VS Asteroids

Dear readers,

I am happy to announce today the release of a new game I worked on: Soviet VS Asteroids. The game was developed during the last jam of the Game Dev Party (see the introduction of that 4th jam [fr] or a report of the 2nd edition [en]). The concept is simple: during an entire weekend, 50 people gather, make teams and work on a game, with the goal of having something to show (and to play) in the end.

Greetings, comrade cosmonaut!

This time I decided to work with my friend Aurélien Defossez, who proposed a "planet defense" gameplay. The idea is that you are in space, and asteroids are flying at you. You will need to use your weapons to destroy those nasty asteroids and survive as long as possible. Aurélien gathered a team of 6: he was managing the project and programming, along with Louis-Rémi Babé, Maxime Viry and myself. Mathieu Perez created all the sounds and musics of the game, and did a bit of code as well. Frédéric Ostéréro drew all the beautiful graphics. With this fine team and a lot of work, we demonstrated something pretty good on Sunday evening. But it was not ready for release yet. Over the last 2 weeks, we did some bug fixing, added the missing menus (things like credits or tutorial that do not matter for the demo but are needed when you release the game to the public), and polished the gameplay, mainly by adjusting the difficulty so as many people as possible can enjoy it.

And now, it is time: we believe the game is ready to be played! At this point I hope you are excited and want to download the game as soon as possible. You can do just that by clicking one of those links:

You can play the game with your mouse and keyboard, or with a pad. Make sure your pad is plugged in before you start the game or it will not be detected. You have 2 weapons at your disposal: a rocket launcher and a laser command. You aim at asteroids with the joysticks or your mouse and the Q, A or D keys of your keyboard. If you play with a keyboard, the lasers will fire automatically, and you can shoot rockets by clicking your mouse or hitting the space key. With a pad, you shoot with LS and RS. By pressing the Tab or Enter keys, or the Y button on a pad, you enter the upgrade menu: use your money to make your weapons better, or clear the space around you if you are overrun, or place new lasers or drones around you to improve your defense.

We all hope you are going to enjoy our game! Do not hesitate to make any comments here or to share your high scores! We would love to hear from you.

If you are interested by the technical details, there you go: the game in programmed in lua, using the LÖVE framework (also known as love2d). You can find the source code on github: feel free to fork and open pull requests or issues if you find bugs. Quick feedback on lua: it's nice, but some choices in the design of the language are weird. I definitely prefer Python, but wouldn't mind working with lua again. LÖVE on the other hand was quite a pain to work with, for 2 majors reasons: missing features (no sprite system in a 2d game framework? ) and documentation. As usual, the documentation of a tool is critical and even if the API was well documented, there was almost no tutorial, and no examples of basic features or code.

Play & Enjoy!

Wednesday, 31 October 2012

Web Game Workshop: Creating a Game with Crafty.js

Earlier this month, I gave a workshop in Lyon to teach people how to create Web games with the now famous Crafty.js framework. 13 people attended (out of 15 open places), which appeared to be a good number: I could really help everyone and answer all the questions I received. It was a really good experience, but a short one sadly: we only had 2 hours (30 minutes being me talking about Crafty), and it's really short to be able to actually create a playable game. I think with an hour or two more some people could have had something playable.

Anyway, I created a bunch of content for that workshop, and I wanted to share it. So here it is!

Presenting Crafty.js

I spent the first 30 minutes of that workshop talking about Crafty.js, what it is, what it can do, and how it works. As usual, slides without the actual talk are not really good, but at least you will find some code examples and links to various resources in there. And who knows, maybe someone could make good use of these slides someday?

Creating Web Games with Crafty.js

Workshop: Coding a Web Game

My plan for the coding part was to come with 3 game ideas that people could work on, to provide some help (basic algorithms, some graphic resources) and to give them a working version in the end. That's what I did: I created a simple Snake game, a kind of Fruit Ninja and a Side Runner. After my presentation, I showed the 3 games I coded and asked people to pick one and start working on it. Most people picked the simplest one (some assuming it was the snake, when it was actually the Fruit Ninja clone in my opinion), and no one picked the Side Runner which was certainly harder and mostly impossible to do in less than 2 hours.

After an hour and a half of intense coding, documentation reading and some debugging (I had a few mistakes in my slides sadly), we had some snakes moving and some fruits falling!

I made a simple page with all the resources needed for this workshop:

The Crafty Workshop Awesome Page

There you can find:

  • links to the base template in github or as a zip file
  • short help with algorithms
  • graphics
  • and my own implementation of each game

I really enjoyed doing this, and I wish I can do it again someday! Thanks to everyone who attended and thanks to the Game Dev Party association for organizing this event.

Make Games, Not War /-)

Sunday, 18 December 2011

Component Entity Manager for JavaScript games

Hi everyone!

I recently wrote a library to handle a Component Entity model in a JavaScript game. I need it for my ongoing Fightly Game Engine, which I'm trying to work on. If you don't know what the Component Entity model is, here are great resources about it:

Basically, the idea is to replace classical inheritance with composition. Your game is composed of entities, each being just a list of components. JavaScript's flexibility is well adapted to this sort of programming, as it is easy to change an object to add attributes or methods to it.

That system I implemented is highly based on what Louis Stowasser did on Crafty.js. It works on both server- and client-side, and comes with a few unit tests and examples. Let's first show you how it can be used:

How to use the ComponentEntityManager

Ok, so I like showing code instead of writing English. Here is the most basic way to use that library. First, import and instantiate the Manager:

var cem = require('component-entity-manager'),
    myCEM = new cem.ComponentEntityManager();

Then, declare a new component:

myCEM.c('HelloWorld', function() {
    this.hello = function() { console.log('Hello, World!'); };

Now create an entity using this component:

var hi = myCEM.e('HelloWorld');

And finally use that entity the way you like. For example:

hi.hello(); // prints "Hello, World!" in the console

Pretty simple, right? Right, we only printed a "Hello World" but still, we did so by using the Component Entity model! Now you can obviously add a thousand more components, and create hundreds of thousands entities. Let's see a more concrete example before I explain why it is useful.

A more concrete example

See example1.js on github

var cem = require('../../component-entity-manager'),
    // Instanciate the Game Engine
    myGE = new cem.ComponentEntityManager();

// Create a few components that can be used in-game
var Hero = {
    "life": 100,
    "defense": 100,
    "attack": 100,

    "hit": function(opponent) {
        var points = this.attack * 1.1 - opponent.defense;

        if (points > 0) {
            opponent.life -= Math.round(points);
        return this;

    "specialHit": function(opponent) {
        return this.hit(opponent);

var Wizard = {
    // this component requires the Hero component, and
    // any entity having a Wizard component will automatically have a Hero one
    "_requires": "Hero",

    "life": 80,
    "mana": 100,

    // "Overwrite" the specialHit method of the Hero component
    "specialHit": function(opponent) {
        var points = this.attack * 1.2 - opponent.defense;

        if (this.mana > 20) {
            points += 20;
            this.mana -= 20;

        if (points > 0) {
            opponent.life -= Math.round(points);
        return this;

var Necromancer = {
    "_requires": "Wizard",
    "life": 70,
    "attack": 110

var Paladin = {
    "_requires": "Hero",
    "defense": 150

// Add those components to the Game Engine so we can use them
myGE.addComponent("Hero", Hero)
    .addComponent("Wizard", Wizard)
    .addComponent("Necromancer", Necromancer)
    .addComponent("Paladin", Paladin);

// Create two entities than we can manipulate
var gerard = myGE.e("Paladin"),
    igor = myGE.e("Necromancer");

// And now play with those entities
console.log("Before we do anything: ");
console.log("  Gerard's life is " + gerard.life);
console.log("  Igor's life is " + igor.life);


console.log("\nAfter Gerard hits Igor: ");
console.log("  Gerard's life is " + gerard.life);
console.log("  Igor's life is " + igor.life);


console.log("\nAfter Igor hits Gerard: ");
console.log("  Gerard's life is " + gerard.life);
console.log("  Igor's life is " + igor.life);

How is this useful?

And how is it better than classical inheritance? Some people answered this better than I could do in other places (see the two links above), but here is the main point. When you come to have a very complex hierarchy, with lots of classes and dependencies between them, you will certainly end up having unneeded code in some of your objects. Let's say you have a few classes: Moving, Vehicle, Car. Vehicle inherits from Moving, Car inherits from Vehicle. Now at some point you want to add a BrokenCar class, to represent a car than cannot move. It seems quite logical to make it inherit from Car as it shares almost everything with it. But that is the point: almost. As you don't want that BrokenCar to move, you will have to overwrite the code from Moving, or to break your entire hierarchy. With composition, you just specify directly what you need in your object. For example, I want this object to be a Car, a Vehicle and a Moving. Or I want that other object to be a BrokenCar, a Car and a Vehicle (but not a Moving). It is more flexible and allows for a wider range of mixing.

Now about that library precisely. The main features are here: you can create components and declare them, express requirements in a component, create entities from one or several components, get entities from their components. It is intended to be used as a building block for any JavaScript game, or any JavaScript game engine. Oh and I'm pretty sure you guys can find some other use cases as well... :)


I release this code under a simple MIT license. It's the simplest I know. I'm considering adding a GPL-ish license as well, and maybe some BSD if people ask me to. 

And the future...

There are a few things I want to add to this library: a function to get an entity from it's ID, more unit tests, more options for selectors... But what I would really, really love to hear is everything you have to say! I will gladly accept code reviews, forks, pull requests, emails, comments here... 

Hack & Enjoy! /-)

Tuesday, 15 November 2011

Examples of how to break long lines in Python

I recently started learning Python, and as I am a bad student, I didn't follow the coding style PEP8 recommends. So I'm currently in the process of rewriting all of my code to follow PEP8, and that basically means breaking long lines. I ran into several cases where I didn't know how to break my line, and the Internet doesn't seem to be very helpful about this. But fortunately my awesome coworkers are, so here are some examples of cases I had to deal with, and how I ended up dealing with them.

Before I start showing examples, I just wanted to outline the few rules that matter here about PEP8:

  • Lines must not be longer than 79 characters ;
  • Use 4-space indentation for blocks ;
  • Alignment matters ;
  • The rest of the rules is well described in the PEP8 documentation.

Breaking an if statement

if condition1 and condition2 and condition3 and condition4 and condition5 or condition6:

At first I did something like this:

if condition1 and condition2 and condition3 and condition4 and condition5 or \

It seemed better to me mainly because that way the second line of conditions is not on the same indentation level than the content of the block, but my coworkers convinced me that using parentheses instead of backslashes is better. Reasons are backslashes are not "pythonic", and the use of parentheses shows the limits of the conditions.

Here is what I then thought would be the best solution:

if (condition1 and condition2 and condition3 and condition4 and condition5 or

But it's still not perfect as the block is aligned with conditions, and it makes it difficult to differenciate them. I believe now the best way to go is the following:

if (condition1 and 
    condition2 and 
    condition3 and 
    condition4 and 
    condition5 or


assert condition, "This is a very long error message because I like to be verbose when I describe assertion errors with this content: %s" % variable


assert condition, ("This is a very long error message because I like to be "
                   "verbose when I describe assertion errors with this "
                   "content: %s" % variable)

Or when the condition is long:

assert condition1 and condition2 and condition3 or condition4, (
    "This is a small error message. ")

Other examples?

If you ran into similar examples and couldn't find a documented solution on the Web, please share them in the comments and I'll add them here!

Monday, 21 March 2011

Fightly Game Engine : un moteur de jeux web libre

Amis lecteurs, bonjour ! 

J'en avais parlé il y a quelques temps (plus de 6 mois maintenant), j'ai travaillé ces derniers temps sur un projet nommé Fightly. Comme ce projet a subit pas mal de changements, commençons par un peu d'histoire pour que les choses soient claires... 


La vie d'un projet

Tout commence il y a environ un an, Gandi offre des noms de domaine gratuits, et j'acquiers fightly.fr et fightly.com avec dans l'idée de faire un jeu de stratégie très simple. Je garde le concept dans un coin de mon cerveau, jusqu'à ce que je découvre les WebSockets : je code quelques essais simplistes de jeu de stratégie sur carte hexagonale, et je fais des tests de communication par WebSocket. Ça me botte bien, donc j'approfondis le concept du jeu, et je lance une première campagne de recrutement en juillet dernier, sur le Site du Zéro et bien d'autres sites spécialisés : [Jeu Web] Fightly

À ce moment, l'idée est de créer un jeu web de stratégie au tour par tour, au concept simpliste, avec pour ambition de faire un projet réalisable par une équipe amateur. On y travaille donc pendant les deux mois de vacances, puis vient la rentrée scolaire, et le rythme ralentit pendant quelques semaines. Et j'ai là une occasion sur laquelle je saute : faire passer ce projet dans le cadre d'un projet universitaire, et ainsi pouvoir travailler sur un projet que j'ai lancé et donc que j'affectionne, et être noté pour ça ! 

Avec l'aide de Pierre-Antoine Champin, enseignant-chercheur au LIRIS et avec qui j'avais déjà travaillé, qui accepte de jouer le rôle de "client", nous remanions le projet : l'objectif sera de créer un moteur de jeu web de stratégie au tour par tour, libre, exploitant des technologies récentes du Web Ouvert, et d'implémenter une démonstration simple de ce moteur. Je recrute 4 collègues de formation, et nous voilà partis ! 

Fightly Game Engine

Venons-en donc au projet en question, et reprenons-en les objectifs. Le coeur c'est de créer un moteur de jeu, donc un outil permettant de construire et de faire tourner un jeu vidéo. En réalité, le terme "moteur de jeu" est peut être mal adapté. Ce serait plutôt un framework, puisque notre application fournira les briques de base pour créer un jeu. Il serait intéressant de débattre sur ces noms : est-ce qu'un moteur de jeu est une spécialisation de framework ? Quoi qu'il en soit, l'idée ne change pas : on fournit un ensemble de fonctionnalités de base, dont on sait qu'il constitue la base d'un certain type de jeu, et on facilite donc le développement de ce type d'application. 

La première subtilité ici est qu'on s'intéresse uniquement aux jeux Web : on n'est plus du tout dans le même cadre que les moteurs de jeu "classiques" (par exemple, le Unreal Engine, le Cry Engine ou le Gamebryo), la structure de base de l'application change totalement puisqu'il faut gérer avant tout une architecture client / serveur basée sur les protocoles du Web. On cherchera donc à fournir une application gérant les connexions de clients, l'envoi et la réception de données via le réseau, le tout étant réalisé avec un client qui s'exécute dans un navigateur. 

Battle for Wesnoth

Deuxième point important, on se limite à un certain type de jeu bien particulier : les jeux de stratégie au tour par tour. Pensez Civilization, Dofus, Heroes of Might and Magic ou encore Battle for Wesnoth. Notre but est donc de faciliter la création de ce type de jeu dans un navigateur : gestion de parties, des tours, des joueurs, des unités, des combats entre unités, etc. Là où le Fightly Game Engine se différencie d'un moteur de jeu classique, c'est qu'il sera largement extensible. À la manière d'un framework comme jQuery, il sera possible d'ajouter des modules au moteur, pour en étendre les fonctionnalités. Nous avons l'ambition de fournir un outil avec lequel il ne sera pas nécessaire de savoir programmer pour créer un jeu : vous choisissez les modules nécessaires à votre jeu, vous les configurez pour qu'ils répondent à vos attentes, vous écrivez vos règles dans un format défini par le moteur et vous n'avez plus qu'à lancer votre serveur et à attendre vos premiers joueurs. 

Bien entendu, s'il sera possible de ne pas programmer, tout sera fait pour qu'un développeur puisse étendre ou modifier le comportement du moteur de manière simple. De même, on cherchera à faciliter grandement la création de modules, puisque c'est par eux que le moteur grandira et deviendra réellement intéressant pour les créateurs de jeux. 

Ce projet est libre, c'est-à-dire que vous pouvez, à tout moment, en lire les sources, les modifier, les redistribuer, selon les termes des licences. Notez cependant que le jeu n'est pas encore explicitement sous licence (il est donc encore soumis au droit d'auteur), mais qu'il sera très certainement distribué sous double licence MIT et GPL

Enfin, le Fightly Game Engine utilise des technologies émergentes du Web : les WebSockets pour une couche réseau solide et performante, Canvas côté client pour l'affichage, HTML5 et CSS3, du JavaScript côté serveur avec Node.js, et bien d'autres. Nous souhaitons profiter de toutes ces nouvelles possibilités techniques pour fournir un outil puissant et robuste, permettant la création de jeux de plus en plus poussés, qui profitent de l'énorme avantage du Web : ils marcheront sur toutes les plateformes disposant d'un navigateur récent. 

Où en sommes-nous ?

Le projet Fac est terminé, et si nous sommes loin d'avoir atteint tous nos objectifs, nous avons su créer quelque chose d'exploitable. Ce n'est pas encore un moteur à proprement parler, c'est plutôt une application configurable. Etant donnés nos délais et le peu de temps que nous pouvions consacrer au projet, nous avons du couper beaucoup de choses, et aller au plus rapide pour pouvoir avoir un résultat présentable. Nous avons donc une démo de jeu, très simple, dans laquelle les unités s'affichent sur une carte, et les joueurs peuvent les déplacer chacun à leur tour. Un bon début à mon avis, et une bonne base de code. 

Si vous souhaitez en savoir plus sur le travail que nous avons effectué durant le projet Fac, je vous invite à lire les documents que nous avons produit : le cahier des charges, la veille technologique et le dossier bilan. Ou un zip contenant les trois

Cependant, ce que nous avons réalisé est très loin d'être terminé. Nous n'avons pas résolu de nombreuses problématiques clés du projet : comment rendre le moteur générique et extensible, pour permettre d'ajouter ou de retirer des modules ? Comment gérer les dépendances entre ces modules ? Comment gérer les correspondances des modules côté client et côté serveur ? 

Il reste donc beaucoup à faire, il y a des défis très intéressants à relever, en terme d'architecture générique et extensible, en terme d'application orientée réseau, en terme de moteur de jeu, en terme de performances côté client, et bien d'autres choses encore. Voila pourquoi j'en viens au... 


Je pense qu'il est nécessaire de travailler à plusieurs sur ce projet, pour plusieurs raisons. D'abord parce que j'aime travailler en équipe. Ensuite parce que mes seules compétences ne me paraissent pas suffisantes : j'ai besoin de gens meilleurs que moi en architecture logicielle et en performances JavaScript, qui sont deux points clés de ce projet. Et enfin parce qu'on réfléchit bien mieux à plusieurs, surtout sur des problèmes complexes. 

Je recherche donc des coéquipiers pour travailler avec moi sur le Fightly Game Engine. Il y a trois axes majeurs pour le développement immédiat du projet, qui sont les suivants :

  • Architecture : Réflexion sur l'architecture du projet, mise en place de solutions adaptées à nos besoins de généricité et d'extensibilité. 
  • Communauté : Mise en place d'outils favorisant la création d'une communauté autour de notre logiciel libre. 
  • Développement : Refactoring du code sur des bases saines, mises en place de bonnes pratiques, correction des bugs existants, amélioration constante de la documentation, ajout de nouvelles fonctionnalités.

Je cherche en priorité des gens relativement compétents, avec une bonne expérience en JavaScript, en jeu vidéo ou en gestion de communauté libre. Bien entendu, le travail serait bénévole, le projet étant libre et n'ayant pas pour but de générer, de lui-même, des bénéfices commerciaux. 

Pourquoi participer à ce projet alors ? Pour l'intérêt des difficultés techniques à surmonter. Pour participer à un projet que vous estimez et que vous voulez voir aboutir. Pour avoir l'occasion de travailler sur une application dont les performances sont critiques. Pour approfondir vos connaissances en JavaScript, en jeu vidéo, en Web. Pour expérimenter le travail en équipe amateur (dans le sens, qui travaille sur son temps libre). Ou pour toute autre raison de votre choix ! 

Si vous êtes intéressé ou que vous avez des questions, n'hésitez pas à me contacter via les commentaires de ce billet, via ma page de contact ou directement par mail : adrian@gaudebert.fr

- page 2 of 5 -