Wednesday, March 30, 2011

Lentement mais sûrement

De nouveau train d'enfer au boulot pour essayer de soumettre 2 articles à la conférence "RAID". Date limite le 7 avril. Du coup je cherche plutôt d'autres activités pour meubler ce qui reste de mes soirées que de me coller de nouveau devant un écran :P
Hier, c'était un peu de design pseudo-UML pour essayer de baliser le terrain sur la programmation d'AnimEDS. A grand renfort de bic 4 couleurs, comme vous pouvez le voir. J'ai un faible pour la combinaison "noir/cyan/magenta/turquoise" depuis plus de 10 ans, on dirait que les p'tits gars de Clichy ont fini par considérer que je n'étais pas le seul.

I'm rushing for a deadline at work. I barely got the time to shoot and upload some UML late-night-notes about AnimEDS design this morning. I'm afraid you'll have to rely on some online translator if you wish to learn more

Bref, la photo est surtout destinée à me permettre de profiter de mes notes dès que j'aurais un temps de midi disponible pour coder un peu (et qui ne se transforme pas en réunion de travail parce que je suis passé dans le bureau d'un collègue voir s'il voulait aussi une soupe :P). J'imagine que si la NoteSlate était sortie, je l'aurais gribouillé dessus pour l'avoir partout avec moi ... je ne sais pas trop dans quelle mesure l'absence de couleur m'aurait gêné. Peut-être pas trop si j'avais la possibilité de définir des "layers" (c'est l'usage que j'ai tenté de faire ici de la couleur).

todo: comment permettre de définir une nouvelle animation depuis FileWindow sans devenir dépendant de tout le reste du code ... Animation::Load(plain_data) qui déclenche les thumb_generator etc ?

Wednesday, March 23, 2011

Pix'N'Love

Pix'n'Love Editions ...Autre moment sympa au salon "Made In Asia 2011": le stand Pix'n'love. En tant que concepteur de jeu amateur doublé d'un nostalgique des jeux de l'ère 8/16-bit, je dévore assez régulièrement les exemplaires de mon frère (c'est d'ailleurs presqu'impossible d'en acquérir moi-même: il me les rachète avant que je n'ait eu le temps de les ouvrir :P)

French-speaking retro-gamers are lucky: we've got a high-level edition team that produces one pix'n'love magazine a month. More durable paper and more convenient format than former PC/console magazines, well-written and full of interviews, crunchy trivias and neat pixels. (Un)fortunately, my brother wants them all, so it's virtually impossible for me to own any of them: he immediately offers to buy the one I find/order ... Hopefully enough, he let me borrow them.

That being said, rejoice, English friends: http://pixnlovepublishing.com/ will take care of translating the pix'n'love magazine in Shakespears' language. Ready ? Set ? Order ! ...


Si le dossier "Another world" avait vaguement un goût de réchauffé (j'en avais déjà tant lu sur son développement sur le site d'Eric Chahi), lacher le "Spécial Rayman" aura relevé du défi psychologique. Je suis du coup plongé dans la biographie de Michel Ancel (quand ma fée me chipe la suite des aventures d'Emouchet, en tout cas) ... Puis je me re-ferai l'article sur Moktar avec l'interview d'Eric Zmiro ^_^. Réchauffé ? hmm ... peut-être pas, finalement. Je reste sur ma faim, mais c'est sans doute plutôt parce que je ne suis jamais parvenu à atteindre l'autre côté de la cascade et que j'enrage de frustration quand on mentionne des éléments du scénarios que je n'ai jamais rencontré dans le jeu.

PS: M. Sébastien Mirc, un numéro "best of spécial petit frère" avec une sélection des articles à la demande, c'est possible ?

-- "favourite articles" list will follow below --

Tuesday, March 22, 2011

M'enfin !?

Nous avons donc dans java.io.File une classe qui ne permet en aucune manière d'accéder au contenu du fichier, ou je me trompe ? Pas une référence à Reader ou à InputStream !?

Si l'idée était d'avoir "une représentation abstraite d'un nom de fichier/répertoire", quelqu'un peut m'expliquer pourquoi ce truc ne s'appelle pas java.io.FileName ? Je prie pour le rétablissement de tous ceux qui trouvent ça normal, parce qu'ils ont dû se chopper un sérieux coup de soleil ...

Yeah, that's another Java rant. If you're wondering how on Arrakis you would get the content of that java.io.File object you just created, welcome aboard! Don't panic and open the javadoc for FileReader or FileInputStream instead, because noone at Sun thought you'd be happy to be notified those classes exists. Not even after +10 years of confused readers! Seriously, dudes, socket.getInputStream(), but new FileInputStream(file)?

made in asia.

Prenez des fans de dragonball dégourdis du crayons et une bonne dose de peluches Nintendo. Ajoutez des vampires qui font la bise à Hello Kitty et un couple royal qui se faufile entre les antagonistes de Naruto. Saupoudrez de démonstrations de kendo et arrosez d'un jus de brocante retro-gaming, le tout sur une bande son "triumphante" de Valve "still alive"

Vous avez "Made in Asia", le salon "japan expo" à la belge.

La 3DS ...

Il y a malheureusement une ombre de taille sur cette nouvelle console Nintendo. Ses conditions de ventes sont tout bonnement intolérables.


J'avais accepté d'accompagner ma fée au salon Creativa ce week-end, qui devait se prolonger d'un souper chez ma cousine Clair. Je pensais bien aller trainer mes baskets dans la section "modélisme" quand j'en aurais assez du pixel art analogique, et je dois admettre que ce n'est qu'en croisant les premiers cosplayers que je me suis rappelé l'introduction d'un salon parallèle "made in asia" en 2009. J'ai été assez amusé d'y retrouver une ambiance que j'avais découvert essentiellement à travers les webcomics, mais j'étais surtout à la recherche d'un stand 3DS. Je n'ai pas été déçu.

La bête est en apparence fort proche d'une DSi, au niveau de sa finition et de sa taille. Je n'ai volontairement pas pris une image où Mario et ses amis sortent de l'écran, parce qu'à part dans quelques effets de "bosses", il est assez rare que les objets soient présentés à une distance plus courte que celle de l'écran. On a plutôt l'impression d'avoir ouvert une fenêtre sur un petit monde intérieur ... taille d'écran oblige.

Le jeu (?) préinstallé sur la console que j'ai eue en main était simplissime: photographiez quelqu'un, et sa tête sort du plan de l'écran pour devenir une boule pendant que l'image de fond "recule". Je dois ensuite utiliser les accéléromètres de la console pour pivoter autour de moi et tirer sur ces têtes (enfin, je crois) à la façon d'une tourelle sur un Faucon Millenium. L'effet est plutôt réussi.

Je jette un coup d'oeil à mon voisin, occupé sur un Street Fighter pour 3DS, mais je ne vois que des reflets colorés bizarres: si mes yeux ne sont pas de part et d'autre de l'écran, l'illusion ne marche pas. Je repense avec un brin de nostalgie aux heures passées dans les cars scolaires à regarder mes amis possesseurs de GameBoy avancer dans Super Mario Land 2. Une époque révolue ? peut-être pas... parce que dans son infinie sagesse (hum), Big Bowser nous a gratifié d'une glissière-volume qui ajuste l'effet pour revenir à un écran tout plat. Bon, j'admets ne pas avoir cherché à m'assurer qu'il n'y avait plus d'effet désagréable avec un angle plus large par la suite.

Ma principale crainte (suite à mes déboires avec les images stéréoscopiques) était que l'effet ne soit pas complet, ou d'avoir des reflets parasites sur mes lunettes, ou de voir double, etc. La plupart du temps, rien de tout ça. Je n'ai pas ressenti d'effort pour "faire le point" sur le jeu comme c'est le cas (pour moi) avec le cinéma 3D, et probablement pas plus dû ajuster la position de la console qu'on ne le ferait avec une DS classique pour éviter les reflets dans son salon. Je dis "la plupart du temps" parce que le jeu que j'avais entre les mains me demandait de déplacer la console dans tous les sens, bien qu'elle soit reliée à la table par un câble. Evidemment, à un moment, celui-ci s'est avéré trop court, l'angle de vision n'était plus bon, et le dédoublement de l'image est apparu. On ne nous hypnotise donc pas. C'est toujours ça.

Et vous ? Vous l'attendez ? vous l'avez déjà vue ?

Wednesday, March 16, 2011

raymanim.spr

Ma fée et ma loupiote sont chez Mamy Laine ... j'en profite pour bricoler mon éditeur d'animation. La version améliorée du script "imlib2spr.pl" (capable d'importer les images du RSD game-maker, souvenez-vous!) m'a permis de récupérer des têtes et des corps de Rayman, mais pour les mains et les pieds il me fallait de préférence du 16x16.

C'est l'occasion de rendre enfin fonctionnel le script sprtool.pl destiné à importer des spritepages d'un spriteset à l'autre. Me voilà donc armé d'un "raymanim.spr" pour tester le code de mon éditeur d'animation sans devoir (re-)passer par la case "pixel art". On devrait gagner du temps.

Using the scripts I developed in late October last year and some bug-fix on the sprtool.pl script that was longing for revival since 2008, I managed to build the perfect test-case for the in-progress animation editor: a rayman spritesheet with head and body as 32x32 sprites and a set of hands/feets as 16x16. This time with my beloved PSX sprites :P

(PS: Rayman est un personnage (C) Ubisoft, apparaissant ici à titre de "fair use" (pour ceux qui aurait passé les 100 dernières années dans un auto-cuiseur au fond de l'océean))

La rose de Saphir.

Me voilà donc dans mon "cubicle", nouvellement équipé d'une chouette bibliothèque où je rangerai sans doute fin de semaine le 3eme tome de la trilogie des Joyaux par David Eddings.
J'aime beaucoup l'idée avancée que la "Rose Bleue" est l'esprit qui a créé la planète sur laquelle l'intrigue se déroule, qui s'est "aggloméré" sous forme de gemme pour se défendre contre le fer, présent en trop grande quantité sur cette planète et qui est lui est fatal (vu qu'il est rouge). Ne soyez pas surpris si je vous ressert quelque-chose de ce genre pour les Magic Stones de Bilou (la version "contaminées par le cauchemard" que j'avais jusque-là ne m'a jamais convaincu), d'autant que c'est plus ou moins compatible avec le synopsys gribouillé l'été dernier.

Monday, March 14, 2011

SpriteRam, SpriteSheet, SpritePage, SpriteSet

Ce week-end, c'était priorité au montage des étagères dans mon petit bureau de 7m³, mais j'ai quand-même pu me concentrer un peu sur les petits soucis de gestion de mémoire qui me ralentissaient dans l'écriture de mon éditeur d'animations.

Pas étonnant que 3 ans après, je m'y perde un peu ... SpriteSet est commun à tous mes projets DS: c'est en gros le support du format .spr généré par le sprite editor. Mais les données graphiques qu'il manipule se sont étoffées. Les SpritePages ont été introduites en 2007 pour permettre d'éditer plus que ce que l'écran de SEDS ne peut afficher d'un coup. Les SpriteRams, en 2008 pour compenser le fait que la mémoire vidéo de la DS est séparées en "caractères" et "sprites".

I *had* to set the priority on some furniture assembly this week-end, to make my "7m³-desktop" a place where I can actually focus on what I do. Yet, I found some time to meditate on the VRAM allocation issues that were preventing me from doing progress on the animation editor. We're talking here about a set of classes that was initially designed to manipulate a single VRAM bank directly and that started to be multi-purpose (game engine + editors), multi-sets (manipulates set of sets of sprites), and that embraces ram heterogeneity (VRAM + main RAM). No wonder I was baffled.

In the case of the animation editor, the various "limbs" may use different spritepage (at least, 16x16 limbs may not reside on the same page as the 32x32 limbs), and at least for building miniatures on the timeline widget, those pages must be accessed simulatenously although there might not be enough VRAM to hold them altogether. I added a few methods to SpriteSet to address this situation in an almost clean manner.


Pour le moteur de jeu, l'ensemble des sprites est chargé en VRAM et les SpritePages servent uniquement à la construction des animations. Pour les éditeur, par contre, le contenu graphique (et donc SpriteRam.target) est généralement présent en mémoire centrale, et la VRAM est plutôt affectée aux SpriteSheets.

Pour AnimEDS, il ne me suffit plus d'avoir une seule "page" présente et affichée: les différentes étapes d'animation vont utiliser des éléments issus de différentes pages, parfois pour les afficher séparément, parfois pour les combiner. Les cogitations du week-end ont donc suggéré d'ajouter une fonction unique SpriteSet::getdata qui partage une partie de la fonctionalité de SpriteSheet::getdata mais qui peut récupérer n'importe quelle image du fichier .spr en mémoire à partir du seul numéro de page et numéro d'image dans la page.

N.B.: ça fait beaucoup d'espace "gâché" sur la gauche. J'imagine que 16x16 serait suffisant pour choisir un composant...

AnimEDS: main screen mockup.

Permettez que j'appelle Rayman à la rescousse pour venir poser pour un petit mockup de mon éditeur d'animation sur DS, puisque, par un vieux hasard, il est clairement basé sur la même technique d'animation que celle prévue pour Bilou (et utilisée dans la version BASIC, d'ailleurs :P). Les gribouilles que j'avais jusqu'ici n'étaient effectivement pas terriblement claires pour expliquer mes intentions.

Le Frame Editor, au centre, permet de positionner les différents éléments. Le "Component Selector", à gauche, permet de choisir un des constituants (dans cette image, c'est la tête de rayman qui est sélectionnée) alors que le SpriteSelector (sur la droite) montre la SpritePage correspondante pour permettre de remplacer l'image utilisée dans l'étape d'animation en cours. La Timeline (en bas) montre l'animation déroulée dans le temps et permet de sélectionner l'étape à éditer sur le Frame Editor, mais aussi de déplacer les étapes déjà "dessinées" sur la ligne du temps pour changer la dynamique de l'animation.

edit: avec une zone de 128x128 pour positionner les "morceaux" de sprites, je vais devoir me limiter à un zoom x2 si je veux pouvoir gérer des personnages suffisamment grands (les sprites peuvent au plus occuper une zone 2x plus grande que leur taille propre avec le hardware de la DS, de toutes façon). Comme l'éditeur ne gère que des blocs jusqu'à 32x32, ça ne devrait pas poser trop de problèmes. Le contournement de ces limites pour les objets plus gros ou un zoom plus important des objets plus petits, ce sera pour plus tard.

Saturday, March 12, 2011

Geek Bracelet Alarm ...

J'ai souvent ma DS en poche, et bien sûr, elle pourrait me servir aisément d'organiseur sauf que ... elle est incapable de sonner quand elle est éteinte, et elle ne sonnerait probablement pas au bon moment. C'est là que vient l'idée du Geek Bracelet Alarm: un gadget que vous glissez dans votre DS pour programmer ses 16 prochaines alarmes (éventuellement extraites automatiquement de votre agenda DS Organiser), mais qui dispose de sa pile autonome pour alimenter son horloge RTC et le petit buzzer intégré.

Déjà en soi, ce serait sympa, mais le must, c'est d'y intégrer un écran LCD de sorte que l'on puisse la décrocher de la DS et la clipser sur un un bracelet (cuir si vous voulez), histoire d'emmener vos alarmes avec vous là où votre DS ne serait pas de rigueur (faites travailler votre imagination).

We've got nice organiser software on the NintendoDS, but let's face it: none make the device half as efficient as a 1999 Palm for the purpose. The reason simply is that it has to remain powered on to notify you of a event ... and it also need to be running the organiser software, not playing your latest Mario/Zelda/Metroïd/homebrew game.

The Geek Bracelet Alarm solves this problem. Cased in a GBA cartridge, it can be plugged in your DS and import up to 16 calendar events through the GBA slot. An individual battery and a RTC clock circuit then allow the device to check and notify of those events independently ... even while you're playing the DS or when the device is plugged out.

Since then, it's just natural to make sure the Geek Bracelet Alarm has a LCD screen so that it can show you the time and a small event message in a standalone fashion. Its size even allow one to turn it into a wrist watch, so that you can take your events along in places where your DS organiser can't go (if any).


Evidemment, là, c'est du fake ultime, hein. Je profite lâchement que mes lecteurs sont en "mode veille technologique" comme dirait Mojo, pour caser ce petit délire.

Well, i'm unfortunately unable to solder all those components to make the thing exist, and yeah, the picture is obviously a gimp cheap cheat. So if anyone wants to turn it into a chip shipped, instead, feel free to do so and please, tell me where to buy it.

Thursday, March 10, 2011

Life-changing books (2/3)

When I turned 17, it became clear that I couldn't realise all my projects with BASIC alone. I opted for physics/chemics labs rather than computer labs, unfortunately, and the teacher wouldn't let me get a copy of the Turbo Pascal she was using for her courses. "It wouldn't make any sense to me without her teaching" or something alike.

A friend of mine (later known as Parmy in PPP Team) had a copy of A86 -- a 16-bit assembler for dos -- left over a floppy, and a book "Easy Assembly" he never really made sense of. Being from the 8-bit era, "Assembly" meant to me "the language of gods" and "blazing fast execution speed", so I immediately accepted the offer and started studying Intel's instruction set.


Vers 16 ans, je commençais a avoir fait le tour de ce qui peut se faire en BASIC. J'avais (mal?)heureusement préféré les cours de labo physique/chimie l'année précédente, et la prof d'informatique ne voulait pas me faire une copie du Turbo Pascal sous prétexte que je serais incapable de m'en servir sans suivre ses cours. Grmbl. En allant expliquer à un de nos nouveaux amis (que l'on connaîtra plus tard dans PPP Team sous le nom de Parmy) mes techniques graphiques en BASIC, je tombe dans sa bibliothèque sur un bouquin "L'assembleur facile" et une diskette 5'1/4 estampillée "A86". "Je ne m'y suis jamais vraiment mis", me confie-t'il. Pour un enfant de la génération 8-bit comme moi, l'assembleur, c'est comme le langage des dieux. J'emprunte sans hésiter le bouquin et je me mets à potasser le jeu d'instruction des processeurs Intel.


After I showed my uncle my first assembly program (iirc, a password-prompting tool to prevent my sister to mess up with "our" computer), he brought me a box full of low-level C64 stuff, including a copy of "programming the 6502" book, a disassembled and commented dump of the C64 kernal rom, an EEPROM programmer (with no EEPROM provided) and other similar books. SYS 49152 was no longer a mystery to me -- although POKEing machine instructions from a BASIC program wasn't a very sexy way to proceed. It took me time to wrap my brain around the LIFO stack concept ...
I never really "programmed" the 6502 at assembly level, as it was already a decade-old machine, but I must admit the beauty of 6502's instruction set simplicity has been inspiring to many regards... more about that in part 3.

At last, mastering assembly and the Ms-DOS service interrupts allow direct manipulation of any file format, opening up countless possibilities.


Voyant mon premier programme assembleur, mon oncle me propose de reprendre une caisse de documentation technique sur le commodore, dont une copie d'un livre d'introduction à la programmation du 6502 en assembleur -- le processeur du commodore 64. La caisse contient un programmateur d'EEPROM pour faire "de véritables cartouches" façon Rick Dangerous. Je bave. Je prends. Il n'en sortira pas grand-chose, cependant, hormis une meilleure compréhension de cette machine de rêve définitivement désuète et une admiration sans borne pour la simplicité de ces LAY et LAX. Mais n'anticipons pas.

Knowing the assembly language, however, wouldn't be of much use without knowing the hardware that sits around the CPU. A "PC" was still fairly simple by that time: everyone had a VGA-clone video card (super-VGA was only slowly starting to be adopted, and not by game vendors) and a Sound Blaster clone. Both and more were discussed in the "Bible of PC System Programming", a fairly huge book that I borrowed to another friend -- later known as Nowan -- before I got myself a copy of my own. He also let me grab another Sound-blaster related book (ISBN 978-2742901951) from the same editor, which was describing "how to build a 4-track modplayer from scratch -- in Pascal".

Bien sûr, l'assembleur tout seul ne servirait pas à grand-chose sans une meilleure compréhension du hardware du PC. Fort opportunément, c'est approximativement à ce moment qu'un autre ami (connu plus tard sous le pseudo de Nowan) va me préter coup sur coup la bible du PC et le supergrand livre de la SoundBlaster. Me voilà plongé de plus belle dans les documentations techniques, et armé jusqu'aux dents pour attaquer la conception 100% assembleur d'un modplayer -- pardon un S3Mplayer -- qui devra être le coeur de l'Ultimate Game Maker. J'aurai bien un petit jeu réalisé (Crazy Brix) fin '97, qui sera amélioré plus tard pour la Inscene '99, mais UGM restera un tas de papier attendant la réalisation de mon propre OS -- Clicker, une idée de Nowan, à l'origine -- le Windows 95 ne pouvant définitivement pas convenir pour nos projets.

I still had no Pascal compiler by that time, and I was sufficiently confident that, with that knowledge and the S3MINFO.TXT file shipped with my brother's Scream Tracker III, I would be able to run a 8-track Stereo S3M player instead, with 2 tracks dedicated to sound effects and 6 tracks dedicated to background music. I started copying every meaningful bit of information into a smaller draftbook, easier to carry around and not to be returned to a friend by the end of the month ^_^

According to my brother's archive, it took me another 6 month to convert that idea into something capable of replaying some simple modules. I never made it "the corner stone of the ultimate game maker" as I initially intended, but it was the core of Crazy Brix and Out'm'Up, the two awards-winning 100K game at Inscene'99 and Inscene'Y2K, respectively.

Friday, March 04, 2011

Pas d'iPad pour moi.

Non, vraiment ... merci. Par contre, la tablette e-ink autosuffisante "NoteSlate", elle, me fait de l'oeil ... A un prix annoncé à 99$, je pense que je vais me laisser tenter ...
Et pourquoi pas tenter d'en faire un outil pour l'édition de monstres, de niveaux, etc. compatible avec GEDS ?
Elle sera(it) WIFI-enabled et dispose d'un lecteur de carte SD elle aussi, après tout ;) Peut-être même bien un slot USB. On l'annonce open-source, aussi, pour ne rien gâcher.

I've had an iPad in hand a few times, but I never got convinced. Although it's sleek and slim, it's totally consumption-oriented. It's not worth its +500€ as far as I'm concerned, as i don't see how it would improve my creativity or ease digitization.
The announced Noteslate, however, could be the device I'm dreaming for a long time ago. Paper-like look and feel, long-lasting autonomy, WiFi+SD connectivity (which have proven sufficient on the DS), it could be the natural extension of the DS for more sophisticated tasks such as level planning, monsters debugging and the like. The only down side is the 1-bit only display. That means even a grid would be hard to render ... I have no idea how "bad" that would be for the device to blink a pixel so that it "looks" gray. I guess for a mere $99, I can afford trying it and adjust my needs to the offered features.

Disponible en Juin, dit-on ... patience ... patience ...
edit: Sauf que non. Même en 2020, la Noteslate n'a jamais sorti que quelques photos. Bref, j'ai pris un boox. Pour le meilleur et pour le pire.

Wednesday, March 02, 2011

TimeLine : public Widget

Okay... l'éditeur d'animation prend forme, mais on est encore loin du compte. Disons plutôt que j'ai enfin une base sur laquelle travailler le comportement de la "ligne du temps". C'est terriblement "prototypal" ... arithmétique de pointeurs pour configurer les sprites, et tout le tintouin. Il y a sans doute moyen de faire plus propre, mais je vais le garder tel quel jusqu'à ce que les éléments soient tous en place et que j'y voie un peu plus clair.

Slowly, the animation editor is shaping up. It's still far away from the objective, but at least I have now a more solid base on which I can work on the "timeline" widget behaviour. It's still very sketchy : pointer arithmetic circumvent the lack of proper OO containers or patterns ... but at least I can make the thing exist, grow up, and have a clearer view of what I still need.

A running list of things to work on:

  • [done] new frames added on the timeline can easily go out of the allowed width for the widget.
  • [done] moving frames along doesn't affect the animated version.
  • [done] we don't have any visual confirmation of the frame we selected.
  • [past] animation always start with a delay and can't end with a delay.