Wednesday, June 29, 2011

Goro mode activated

There are still a few things that are unpolished, such as (sprite-based) widgets that remain sticky between the FileWindow and the AnimWindow ... or whose state isn't coherent among the two. But at least, the basic feature is there: you can expand your "character" and give him more limbs if needed. Look at this 4-handed Mr. Egg, for instance. Isn't he wonderfully promising of future fun ?

Bin ça n'aura pas été une semaine très causante, sur ce blog, hein ? Que voulez-vous, c'est qu'en-dehors des "grands travaux", il y a parfois une série de petites choses ingrates qui n'ont droit qu'à une ligne dans une todo-list et une autre ligne lors de leur commit SVN. Mais ce coup-ci, les epsilon se sont additionnés suffisamment pour devenir un delta: je peux (enfin) modifier la "structure" de mes personnages (le nombre de sprites utilisés, les pages parmi lesquelles choisir les images et l'image de référence) depuis l'application DS elle-même. Il reste encore pas mal de nettoyage à faire pour éliminer les incohérences de l'application, bien sûr ... mais on a fait un bon pas en avant.

On s'approche déjà de la release 0.3 ... bonne chose.

  • [bugfix] : la "petite main" réapparaît quand je sélectionne qqch dans la spritetable de droite, AnimWindow
  • [bugfix partiel] : si je réouvre une animation 2-mains, elle est "promue" animation 3-mains-3-pieds :P
  • [now] : si je sauve par START+R+R, l'animation en cours n'est pas réécrite dans la feuille d'animations avant la sauvegarde (et donc pas sauvée).

Monday, June 27, 2011

Wii ! Une raclée pour Morton !

Sisi, souvenez-vous, c'était en 2007. Je venais de finir New Super Mario Bros et je faisais le point sur les hauts et les bas du jeu, le comparant notamment à SMB3. Eh bien mon frère a finalement de nouveau une Wii avec le Mario multi-joueur ... et qu'est ce qu'on s'éclate! Je crois bien qu'un jeu de plate-forme n'avait plus été aussi fun depuis ... houu ... Tic & Tac Rescue Rangers sur NES ?

Back in 2007, I had just completed New Super Mario Bros and I was making a list of things that was better in SMB3. Do you remember ? Well, my bro finally got another Wii and the multi-player game New Super Mario Bros. Wii ... and that's a lot of fun. I don't think I've enjoyed platforming that much since ... Tic&Tac Rescue Rangers on NES ?

Amusingly, without being completely NES-inspired, NSMBWii draws much more insipration from SMB3: mini-fights on the map, alternate routes depending on whether we completed some levels (cf. Woods zone). It sits somewhere in-between SMW and SMB3 on that regards (SMB3 had pushed the overworld options possibly as far as one could do).

Even power-ups are much closer to SMB3, with that propeller cap defying gravity (Mario's #1 ennemy) that echoes the magic leaf. Penguin suits that echoes the infamous frog suit of SMB3. The only thing that might be missing is that 'rare' power-up (tanooki or hammer bros), but maybe we just haven't found it yet.

Tous les éléments intéressants des maps n'ont pas été repris (quelqu'un a vu une boîte à musique ou des rochers à détruire ?), mais on garde les mini-combats avec monstres sur la map et les chemins alternatifs qui deviennent disponibles ou non d'un niveau à l'autre (cf. monde forestier). On est dans quelque-chose d'intermédiaire entre SMW et SMB3, en somme. Il faut bien dire que la gestion des "maps" était tellement poussée dans SMB3 qu'on se retrouve pour ainsi dire dans un "overworld" qui devient presque un mini-jeu tour à tour.

Le contrôle des power-ups est beaucoup plus proche de celui de SMB3, avec le chapeau-volant pour contrer la gravité -- qui reste votre ennemie numéro 1 dans un Mario -- qui vient remplacer la plume magique, et le costume de pingouin qui fait écho au costume de grenouille ... en mieux. Il manque peut-être, me semble-t-il, un power-up "rare". L'équivalent de la tenue des frères marteaux ou du costume de tanooki. Mais peut-être que je ne l'ai tout simplement pas encore trouvé ^_^

Thursday, June 23, 2011

Creating new skelettons.

Animation skeletton, GobStructure ... I haven't found yet the term that best describe "the set of pages to be used for the limbs of a compound GameObject". And I also struggle making it part of the AnimEditor. So I took the lunch to chart the three main components involved - AnimWindow, ThumbsWindow and FileWindow - and how they use each others. I want the skeletton to be defined on the FileWindow because it's convenient to navigate through available pages there (and I have plenty of room for widgets).

Je cale un peu sur la manière d'implémenter la création de la "structure" d'un sprite composite (quelle page de sprites utiliser pour quel "membre" et combien de membres y aura-t'il en tout. Entendons-nous bien: quand je dis "je cale", ici, ça signifie que je ne parviens pas à déméler la pelotte de code sur la demie-heure de disponible entre le souper et le bibi de *deline.
Dans ces cas-là rien de tel qu'un petit temps-de-midi-uml pour cartographier les alentours, même si je n'ai pas respecté la moitié des règles de bonnes pratique que je connais ^^".

Red path: FileWindow directly save the new structure into one of the animations under the selected thumb slot. Boulder: FileWindow can't convert a skeletton into a serialised representation.
Blue path: FileWindow just notify AnimWindow of the skeletton modification. Question: what should happen with the current animation ?


Edit: à bien y réfléchir, c'est quand-même un peu ridicule de se prendre à ce point la tête pour une telle bêtise! c'est tout le temps comme ça, le développement en C++ ?

Wednesday, June 22, 2011

"hackers handheld gaming platform"

G. Andrew Stone, author of the RSD Game-Maker has shown up. On his blog, he unveils some nice trivias on Game-Maker development.

Of course, I had to post a comment pointing out my own DS development, since the spirit is very similar to the one of RSD Game-Maker. I had the pleasure to read this reply this morning :

Hi! Great to hear from you and see the RSD Gamemaker helped you find your avocation! I read your posts on the DS and that is a pretty good idea; it would be great to have sort of a hackers handheld gaming platform!


Presque 15 ans plus tard, grâce à Aderack, je peux enfin mettre un nom sur le créateur du Game-Maker qui nous a permis mon frère et moi de laisser parler notre créativité de grands ados: G. Andrew Stone. Sur son blog, Andrew nous donne quelques détails techniques sur la réalisation du logiciel, qui était probablement le premier outil "do it yourself" à offrir tant de flexibilité (le Shoot-em-up Construction Kit de Sensible Software est plus ancien, mais limité à un seul type de jeu et s'apparente du coup d'avantage à un "level editor" avant l'heure).

L'absence de toute technique de protection du contenu (un utilisateur de RSD peut réimporter et modifier les jeux écrits par d'autres) était volontaire et vue comme une sorte de "creative common license" avant l'heure. Le plus étonnant, c'est que cet outil a lui aussi été développé par des jeunes, ne recevant du soutient d'adultes que pour les aspects "distribution, marketting", etc. La version 3.0 est sans doute sortie alors qu'Andrew et son frère étaient en 1ere année de collège (l'équivalent aux States des études supérieures ici).

Pourtant, Andrew n'a pas poussé plus loin le développement de jeu. Il nous parle majoritairement de jobs dans des sociétés en tant qu'informaticien détaché, et bricole des petits projets sur FPGA.

Tuesday, June 14, 2011

anim0-10 = spr0.anim0-10



I forgot to commit the few modifications I made to AnimEDS this week-end. That sort of rules out any lunchtime coding today ^^". So instead, let's plan a little bit what has to be done to allow the new animations to be used by the game engine ...

Les animations sont attachées au fichier qui a servi lors de spr.load "$FILENAME":$SPRSETNO. On souhaitera sans-doute en charger plusieurs à la fois, e.g. via anim$FIRSTNO..$LASTNO = spr$ANIMSHEET.anim$FIRST..$LAST. Cette "simple" instruction dans un fichier .cmd construit les structures GobAnim comme l'aurait fait une commande anim$NO $SPRPAGENO { ... }.

L'idée est de pouvoir ensuite réutiliser state$SNO : anim$ANNO { ... } sans plus devoir se soucier du type d'animation créée. Celà veut dire aussi qu'au moment d'interpréter gob$NO : state$SNO ($X, $Y) , le GameScript devra inspecter le GobState enregistré dans sa table pour décider s'il doit construire un SimpleGob ou un MultiGob.

Friday, June 10, 2011

Flip !

Reprise timide du développement sur AnimEditor, maintenant que les "problèmes de logistique" sont réglés. deux petits boutons pour inverser un des sprites horizontalement et verticalement, petit ajustement des zones de sensibilité de la TimeLine et de la prévisualisation de l'animation ...

Now that I got "logistics" issues fixed, I can resume development on the Animation Editor. Oh, well. Slowly resuming: I still have time-consuming activities in the office hours and much to do at home to get the staircases fixed this summer. However, I've tackled the difficulties of having two small buttons flipping limbs on the frame editor and during the animation preview.

Tiens, et tant qu'à faire, un vis-à-vis avec les fonctionnalités à rajouter ^_^

And well, since I've got a new screenshot (above) featuring Mr. Egg, let's turn it into a mockup showing what's left to do.
First, we'll need more limbs for those bugs in the caves, that will require more "limbs". Second, I'll need better control over the timeline: looping, inserting a pause at the end and so on.
An onion skin identification of the previous frame would help as well. Finally, I'll plan some room to host more advanced features such as controlling how the character would move in the world following the animation, and possibly defining hitboxes in a graphical fashion.


Mais avant ça:

  • [done] supprimer une étape dans une animation
  • [done] définir un nouveau "squelette" pour des animations.
  • [done] modifier un sprite dans tous les cellulos suivants ou précédents (en plus du cellulos en cours).
  • [need] dé-sélectionner le sprite en cours sans toucher à nouveau le FrameEditor avec le stylet: L-touch puis L
  • [done] Click sur AnimShow => joue une fois l'animation; L-Click => joue l'animation en boucle.
  • [bugfix] revenir correctement aux premiers sprites lorsque l'animation boucle.
  • [bugfix] charger plusieurs fois une "nouvelle" animation la rallonge

Microsoft cannot read!

Quand on se mêle d'écrire un serveur Web, le moins qu'on puisse espérer, c'est que les développeurs se soient correctement renseignés sur "ce que c'est, le Web" (donc au moins le RFC du protocole HTTP). Document dans lequel on trouve par exemple à la section 4.4

The transfer-length of a message is the length of the message-body as
it appears in the message; (...) 

If a Content-Length header field (section 14.13) is present, its
decimal value in OCTETs represents both the entity-length and the
transfer-length. The Content-Length header field MUST NOT be sent
if these two lengths are different


Seriously, dudes. When one dares to write books where chapters are entitled "users can't read" where you explain how to design GUIs, the same one should prove that *he* does read. And more obviously, when one pretend to ship a web server, the same one should ensure that it actually serves _the_ web and not _what you'd prefer the web to be_. Read the specification snippet above. Read the reply trace below. Any sound heard in your brain ?

En d'autre termes, si la taille du fichier (sur le serveur) et la taille des données envoyées (dans la réponse HTTP) diffèrent, l'en-tête Content-Length est interdit. C'est ce qu'il peut y avoir de plus fort dans un RFC qui se contente généralement de "SHOULD" et autres "MAY". Pensiez-vous que ça suffise aux guignols de Redmond ? Eh bien non.
13720 recv(12, "
HTTP/1.1 206 Partial Content\r\n
Content-Type: application/x-zip-compressed\r\n
Last-Modified: Mon, 16 May 2011 04:21:42 GMT\r\n
Accept-Ranges: bytes\r\n
ETag: \"6fe34bc28013cc1:0\"\r\n
Server: Microsoft-IIS/7.5\r\n
X-Powered-By: ASP.NET\r\n
Date: Thu, 09 Jun 2011 17:12:04 GMT\r\n
Content-Length: 4000000\r\n
Content-Range: bytes 0-3999999/38651711\r\n
\r\n
PK\3\4\24\0\0\0\10\0n\212;>\204\10\231\20\265\253\25\0
\222\202\26\0\25\0\0\0secret_garden_lrg.jpg\354|y8\324
"..., 8192, 0) = 1368

Voici donc une réponse qui dit à la fois "le fichier fait 4,000,000 bytes" (Content-Length == Entity-Length) et "le fichier fait 38,651,711 bytes" (Content-Range).

So the file is both 4,000,000 and 38,651,711 bytes long, right ?
No wonder why you dodged the IPv6 day, eh ?

Wednesday, June 08, 2011

=IPv6=

Pas de doodle-google pour célébrer la "journée IPv6" ... juste un logo "blogger" animé sur le dashboard (ça énèèèèèrve @_@). Pas de statistiques sur sourceforge.net, non plus, ni d'images, si bien qu'en voulant cliquer quand même sur les statistiques de téléchargement de mon SpriteEditor(0.)4, j'ai finalement cliqué sur le # qui voulait dire "effacer le fichier".

Ca m'aura pris un bon quart-d'heure sur Nintendomax pour retrouver le .zip (packagé sur un autre ordi :P) et le réenvoyer >_< Désolé pour ceux qui ont eu un "black-out de téléchargement" pendant ce temps-là.

Tuesday, June 07, 2011

#define atoi(str) Integer.parseInt(str)

J'ai beau essayer, essayer encore, y mettre de la bonne volonté, je ne comprends pas comment la version Java "Integer.parseInt(...)" peut être préférable à ma bonne vieille A(scii)TO()I(nteger). Les programmeurs sont supposés être des spécialistes. Celui qui trouve que strlen(itoa(42)) est obscur doit tout simplement pratiquer davantage et pas écrire un langage dans lequel il faille écrire new Integer(42).toString().length(), si ?

Je risque un deuxième coup de gueule contre Java the Hutt... Qui a été bourrer le crâne des gens au point que je me retrouve avec une classe Instances qui gère un vecteur de Instances, mais en donnant de nouveaux noms (numInstances(), enumerateInstances(), addInstance()) ? Hmmm ? Personne ne se dénonce? Eh bien vous serez tous privés de stdout! Tant pis pour vous.

J'ai peut-être bien été trop entrainé en secondaire à retenir "le sens" des choses plutôt que de retenir par coeur des phrases toutes faites ... Quant à dire que Java est le "langage plus simple qui crie pour sortir de C++", bin sorry, mais je ne ferai pas le pas: mes petits outils de conversion, ils resteront en PERL.

Bon, c'est pas tout ça, 'faut que je me replonge sur ce programme. Oh. length() n'est pas une méthode des tableaux, mais une ... euh. Une quoi, au fait? Rien d'autre dans Java ne semble se comporter de la même manière que args.length.

Tout n'est pas noir, dans Java, mais tout n'est pas rose non plus. Ils nous ont ajouté à la version 5 l'équivalent du foreach du PERL ... sympa et concis. Sauf que ça ne marche que sur les Iterators, qui avaient été introduits en remplacement des Enumeration -- dont les noms de méthodes avaient alors été jugés trop longs. Alors c'est vrai que getNextElement(), ça ne m'a jamais épaté, mais du coup, si j'utilise une bibliothèque (Weka ?) qui est restées aux Enumerations, je ne peux pas me servir de foreach >_<.

Monday, June 06, 2011

Welcome, libfat 1.0.9

While I was busy on a tons of things (including building up the first prototypes of AnimEDS) in february, Wintermute and his friends at devkitpro did a major revamp of the libfat, separating "what's good for the DS" from "what's good for the Wii". When it comes to mass storage performance, the two beasts are strongly different ... L1 cache, data transfer speeds, amount of L2 memory ... The release (1.0.7) I used in my "dkp-r32" setup tried (and failed) to provide a uniformised solution. I tried a few hacks that at some point looked to improve the performance, but didn't find the time to quantify the boost in a systemic way. I offered a patch, but ignoring the project's habbits made it doomed to /dev/null.

Hopefully, the new build seems to provide good performance again (PC->AP->DS transfer rates of 64-80KB/s at home).

Oh well, one annoying difference remain: i *have* to apply a DLDI patch manually for SCSD device (which used to have a built-in driver in former libfat). I also have an issue with directory scanning ... I hope it won't take too long to figure out what it is. it looks like I underestimated the MAX_FILENAME_LENGTH ... again ...


J'étais tellement à la bourre en février que j'ai complètement loupé la sortie de la version 1.0.9 de la libfat. Heureusement que je suis repassé jeter un oeil sur le forum de devkitpro après avoir tenté de refaire le point sur l'état du cache la semaine dernière, sinon j'aurais bêtement perdu plein de temps. Enfin, donc, une version qui traite la DS indépendamment de la Wii et de la gamecube, même si j'ai du ruser pour contourner les problèmes de __io_dsisd manquant et patchouiller mes programme pour m'ajuster à une augmentation de MAX_FILENAME_LENGTH visant à améliorer le support d'UTF8. Enfin, c'est réglé.

Une vitesse de transfer entre 64 et 80kB/s (@home en utilisant le wifi entre le PC et le routeur et entre le routeur et la DS), c'est tout ce que je demandais.

Bon, maintenant, 'faudra que je regarde comment faire en sorte que ma fonction die() marche à nouveau ...

(PS: oui, j'ai testé tout ça sur la PHAT de ma fée, histoire de limiter la casse et les pertes de données au cas où... honte à moi ^^" ... quoi que, avec le binaire de SEDS qui crèe systématiquement des fichiers de taille 0 datant de janvier 1979 ...)