Friday, July 25, 2008

Encore une victoire de Canard !

Yes! j'ai trouvé le moyen de produire une animation Gif à partir d'une de mes planches de sprites. C'est encore fastidieux, et il faudra scripter ça, mais au moins ça marche (enfin, sous FF en tout cas). Accrochez vous à vos baskets, voilà ce que ça donne :
# convert .spr file into a tileset image (64xn*16)
perl DS/SEDS/spr2png.pl biloucoin.spr bcoin.png
# extract the 64x48 region where we have our coin
convert bcoin.png -crop 64x48+0+656 -repage +0+0 coinb.png
# extract individual frames for the animation
convert coinb.png -crop 16x16+16+0 -repage +0+0 coin1.png
convert coinb.png -crop 16x16+32+0 -repage +0+0 coin2.png
convert coinb.png -crop 16x16+48+0 -repage +0+0 coin3.png
convert coinb.png -crop 16x16+0+16 -repage +0+0 coin4.png
convert coinb.png -crop 16x16+16+16 -repage +0+0 coin5.png
# etc.
# produce the animation using the sequence 1-2-3-4-5-a 1-a-8-b-8-9
convert -loop 0 -dispose 2 -background darkgrey -delay 10 coin1.png 
  coin2.png coin3.png coin4.png coin5.png coina.png coin1.png coina.png 
  coin8.png coinc.png coin8.png coin9.png -loop 0 -delay 10 mycoin.gif
# here we are...
Howdy! I managed to produce an animated .gif out of my sprites. That's the first step towards an "beam out animation" feature in SEDS ;)

Tuesday, July 22, 2008

Tileset Headaches ...

I'm getting into the business of letting SEDS (and friends) deal with +64K of data in a tileset. Among other things, i want to be able to "flag" certain data as being part of "an extra tileset", desipte they belong to the same file. This is handy e.g. for animations. And i also need block-erasing features, which asks for more "memory management" than i had so far (barely watermarking :P) Yet, i need to be able to edit levels, too, which means i'm not totally free to "rearrange" the tilesets (at least, not the "master" one that will be loaded in VRAM).

Related todo-items :

Which in turns introduces :
  • [done] a new class for managing some memory
  • [done] a new section in .SPR files to indicate which blocks are free for reuse in an editor

(btw, it's quite frightening to see how many posts i have with "dangling todo items" :P)

Thursday, July 17, 2008

Morukutsu's Machine

Plutôt rare de voir des homebrew de cette ambition et de cette qualité. Morukutsu, à qui on doit déjà Pocket Pixie, un des plus sérieux concurrents de SEDS, nous propose la démo jouable d'un petit jeu de plate-formes sympa: Inside the Machine.

Oui, oui, un vrai jeu de plateforme, avec bonus, ennemis (deux types plus un boss), des pentes, etc. Côté technique, je dois dire que c'est du bon boulot (scrolling parallaxe, alpha-blending, etc) même si le côté "moteur physique" peut encore être améliorer pour donner un gameplay plus intéressant.
Homebrew game of that quality (and complexity) are rare enough to be mentioned. Inside the Machine -- a homebrew platformer by Morukutsu, the former author of Pocket Pixie, has now a playable demo available. A truly "complete" platformer with ennemies, bonus, sloped ground and a boss.
Technically speaking, this is a fairly good job (featuring parallax scrolling and alpha-blending), even though the physical engine could be improved to provide better gameplay (especially regarding gravity).

Et au passage, je dois dire que j'ai bien apprécié la petite discussion sur les tiles pentus que j'ai pu avoir avec Morukutsu... Genre "j'ai essayé ton histoire de vy=-1/TILESIZE, ça n'a pas marché" et "je double les tests pour la détection des pentes, ce n'est vraiment pas un problème". C'est un aspect que je dois régler dans Bilou, mais je suis hésitant sur la voie à suivre. Difficile de mettre ça en place sans orienter définitivement le moteur de jeu vers des jeux de plate-forme (alors que pour l'instant, il pourrait tout aussi bien gérer un shoot'm'up :)

fuuuusiooonn

hop. Je profite de mes p'tites vacances pour démarrer la branches "avec effets" du projet libntxm de 0xtob. Et à jouer avec les diff de GoogleCode, je me rends compte que j'ai changé bien plus de choses que je ne m'en souvenais. Je crois que je vais avoir droit à reprendre les fichiers un par un, passer les diff en revue pour voir ce que je dois garder et ce que je dois changer pour avoir une version "avec effets" qui soit la plus proche possible du code de base de 0xtob...

Since it's now holidays time, i start a branch in the libntxm's svn tree to bring in effects support ... Hm. And it seems i'll have full evening of diff'ing and patch'ing to keep my changes while remaining close to 0xtob's update (yeah, he did changes over what i used as a base too, now let's merge those changes ;)

Tuesday, July 15, 2008

Bon anniversaire, Bilou

Eh oui, ça fait maintenant deux ans que je bricole sur ma DS. Et figurez-vous que en voulant retracer l'historique, ma mémoire m'a fait défaut. Elle n'a apparemment retenu que les évènement "vie réelle" (achat de maison, mariage, conférences, changement de voiture, etc) et éventuellement greffé les bouts de développement DS qui s'y rapportaient.

For some reason, /dev/brain only stored memories of real-life events since I started homebrew development. Let's recap.

juillet 2006 - octobre 2006 : Balbutiements
Les débuts de SEDS, qui commence sur émulateur uniquement, puis reçoit la libfat pour stocker les fichiers sur la carte SD. Et en deux ans, je n'ai toujours pas fait sauter la "limite" de 4 fichiers, même si la quantité de données autorisée sur un fichier, elle, a considérablement progressé.

July 2006: Baby steps. I get started with a sprite editor attempt just on emulator, then I got true hardware and add libfat support so I could save my work on the SD card. I take shortcuts such as '4 files will be enough for everybody' which is still true as of today. By October'06, I have a first snowy tileset and a santa character converted from a .PCX file. I'd like to bring in a pinguin baddie I had drawn in an unifinished PC game project and make a Rick Dangerous clone out of it.

Fin octobre, j'ai mon premier petit "tileset" hivernal et Mr Noël récupéré du PC, de sorte que je peux envisager un Rick Dangerous like avec mon papa noël de 2000. Faute d'avoir retrouvé le pingouin de Badman III, le projet n'ira jamais plus loin que ce petit "mockup".
Novembre 2006 - Mars 2007 : Rumbling
Entre la thèse et le déménagement, j'avais apparemment trouvé le temps pour coder un petit "whack a rat" nommé "apple rumble", partant des sources de Tetris Attack. C'est aussi pendant cette période que mon lecteur de carte SD m'a laché, et que je me suis rendu compte de l'ampleur des lacunes du Desmume (l'émulateur DS) de l'époque. D'où le démarrage du projet "runme" permettant des transfers "over wifi"

November'06 to March'07 was a busy time. Writing my PhD, moving to a new home and the like. But still a dug enough time to convert a Tetris Attack clone into a whack-a-mole: Apple Rumble. A definitive failure of my SD card reader will trigger development of runME, my custom WiFi transfer tool. I still rely on emulator snapshots to show my pixels to the world.

Et si les tiles de la "bibliothèque" de Bilou sortent dans leur première version, c'est toujours à coups de SEDS émulé que je les convertis en "mockup". En revanche, beaucoup de fêtes en famille, donc beaucoup de level design pendant cette période-là ^_^
Avril 2007 - Juillet 2007 : Rédaction

Calme plat ... il fallait s'y attendre :P

Aout 2007 - Octobre 2007 : L'odysée du Wifi

C'est la grande reprise de "runme", qui jusque-là pouvait télécharger des fichiers par wifi, voire en afficher certains (.pcx, .spr, .it ...) mais c'est tout. Deux petites lib' releasées au bon moment (l'attente de ma thèse relue) vont permettre la pierre d'angle de mon développement DS : l'auto-update par wifi, ou comment un programme va récupérer une nouvelle version de lui-même et la démarrer sans autre intervention qu'un clic de l'utilisateur.

August'07. The thesis is submitted. I push WiFi support further: all the dsgametools will now support hot-update over WiFi. runME becomes the 'hub' from which SEDS can be invoked, and to which it can return once user tries to 'quit' it.

Suivra une ré-écriture de SEDS pour qu'il puisse gérer plus de sprites (multi-page) et "sortir" vers runme (qui sera aussi en mesure de lancer SEDS), qui sera annoncé sur les forums (à partir de Player Advance) vers la mi-octobre.

Novembre 2007 - Février 2008 : Objectif LEDS
Quelques scripts bien placés et je m'attaque maintenant au débuts de mon moteur de jeux de plate-formes: le scrolling. Théorique d'abord, puis pratique via une petite modification de runme (qui me sert une fois encore d'homme à tout faire) Ensuite, je m'attaque a un éditeur de niveau "autonome", ce qui amène son lot de nouveaux "widgets" et à la création d'une bibliothèque de fonctions utilisées par les trois programmes, j'ai nommé "libgeds" (pour Game Edition on DS).

November'07: it is time I start with the core of my future platforming game engine: scrolling. Once again, runME will be the host (and the fits-all-purpose tool) for testing things. Then comes the time to scroll not only things converted by scripts on a PC, but maps drawn on the NDS itself. That's how libgeds appeared by collecting "widgets" and functions shared by the three programs I have so far.

Février 2008 - Mars 2008 : NTXM
libmikmod ne me convient plus. Trop lourd, trop buggué. Je m'attaque à une intégration du player XM que Oxtob vient de publier. J'attaque aussi la gestion des effets ... un des côtés les plus obscurs des modplayers qui avait fini par avoir raison de mes efforts sous DOS/Assembler en 2000.

February'08: I drop libmikmod. Too heavy. Too buggy. 0xtob has just released an XM tracker and player. Let's integrate that. It lacks effects support, but I can do that. Unlike back in 1997, I now have the power of Internet to explain those things to me

Avril 2008 - Juillet 2008 : GedsDemo
Après cette petite pause musicale, je reprends le développement de mon moteur de jeu. Collisions, animations, déplacements ... Tout ça prend peu à peu place. La première animation postée sur le forum pixelation va aussi être à la base d'une révision quasi-complète du look de Bilou et de sa forêt, ce qui ne se fera pas sans pas mal de bricolage autour de SEDS (de nouveau) notamment pour la gestion et l'import/export des palettes.

April'08. Enough for the musical break. Let's get back to game engine development. Hitboxes, animations, motions, scrolling. Things are getting in place slowly. First 'movie' is posted on pixelation and will trigger an almost complete relooking of Bilou and the green zone, which will require another iteration on SEDS to improve palettes management. And it's also time to extend compatibility to other (DLDI-capable) linkers...

Le tout sur fond de "R4volution", afin d'améliorer la compatibilité de mes programmes avec d'autres linkers que mon Super Card...

Bilou : première mise en page



Quelques images de "la farde Bilou" ... un document estampillé "P.P.P. Software '94", dans lequel pour la première fois le projet du jeu de plate-formes mettant en scène Bilou et Bouli est décrit avec un peu de cohérence. Jusque là, c'étaient essentiellement quelques croquis de Piet qui tenait lieu de scénario.

Dans les grandes lignes, le scénario est simple: Bilou et Bouli se baladent tranquillement dans l'espace quand un incident quelconque (c'est allé du rayon tracteur à la collision d'astéroïde selon les périodes) provoque un crash de leur "astro-cruiser".

A noter aussi qu'au départ, Bilou et Bouli sont supposé être des humains transformés par un rayon émis depuis cette planète (en cause, 7 pierres magiques qu'il va falloir rassembler pendant le jeu). J'ai laissé tomber cette partie du scénario quand je l'ai repris pour ma petite BD en 2000. Plus question "d'alien des plus étranges" donc.

This was not exactly "the very beginning", but that's the closest we have preserved from that beginning. Somewhere at the end of 1994, there was a video-game design contest where the first prize was to have your game realised by a professional team. It definitely motivated my brother and myself to get some real "design documents" written. This is how the first ever storyline for "Bilou's Adventure" was written. Funny enough, by that time, Bilou and Bouli were initially humans that got lost in space. They're unfortunately approaching a mysterious planet and get hit by a "beam" that both attracts their ship and crash it on the surface, but also turn them into "strange aliens" : a blue ball and a yellow stick.

This is where the 7 "magic stone" initially appeared (influenced by Sonic's chaos emerald ? who knows ?) : they're the key to get back to your old self again, as you probably don't want to stay a blue ball for the rest of your days. I totally droped that part when writing down the comic in 2000. Bilou and Bouli *are* aliens, they don't find themselves "strange" and they are happy to be a ball and a "stick".
Piet était super-motivé par ce fameux concours "décrivez votre jeu vidéo et on le réalise pour vous", puisque non seulement il avait doublé le nombre de niveaux de la Green Zone (apparition du "puit de la clairière", notamment), mais il avait même pris le temps de détailler le "gameplay": "Jumper Mushroom invincible à vos armes" (tiens, ça fait un peu Keen 4, ça, non?), levier pour "dépolluer" le puits avant de tomber dedans, respiration dans l'eau limitée à 5 secondes, avec un pouvoir magique (Blue Stone) pour le prolonger, etc.

De mon côté, il fallait illustrer l'utilisation de tous ces pouvoirs magiques imaginés par Piet qui --jusque là-- se limitaient à un ou deux mots : "invincible", "voler", etc.
Evidemment, au fil du temps, c'est cet ensemble de "pouvoirs" qui a le plus souvent été remis en question. Ainsi, dans la version BASIC, Bilou ne lance pas de gameboy mais a un poing téléscopique et peut s'aggriper au plafond (toute ressemblance avec Rayman est absolument fortuite, puisque celui-ci fait son apparition sous DOS et PSX uniquement l'année après, en 1995).

This has led my brother to start sketching levels for the Green Zone -- and not only sketching them, but also describing them, giving hints on the ennemies movement patterns, gameplay etc. It was full of fun (but impractical for me) ideas such as "stop the pollut-o-matic so that you can enter the river safely", floating, walking and flying bumpers, etc. On my side, i of course had to bring flesh to the bones, and visuals to all of those funny "special powers" that my brother had in mind. "flying", "diving", ... have seen a couple of animations sketched.

Somehow, after the School Zone (which was deeply influenced by Pierrick's sketches), it seemed that my brother had his focus moving away. He just recycled levels of our very first video game "Calimero Against the Black Empire" that i hadn't completed : pyramid zone, water zone, computer/techno zone and the "pipe zone" full of warp pipes and pirhana plants ... hum.
Certains pouvoirs (voler et nager, entre-autres) et la présence d'une "zone des pyramides" n'est pas sans rappeler notre tout premier jeu vidéo "Calimero against the Black Empire", et bien qu'il n'y ait jamais eu de niveau dessinés pour la Fire Zone ou la Water Zone de Bilou, je soupçonne fort mon frère d'avoir penser s'en tirer en repompant les niveaux que je n'avais pas su complètement exploiter dans ce jeu (dont seule la première zone avait été réalisée à grand coups de Gotos ;)

De mon côté, ces illustrations on pratiquement vidé mon microfin de l'époque et ma collection de marqueurs destinés à souligner les titres de mon cours de Français, mais qu'importe. C'était les tout premiers éléments ou je pouvais amener un peu de personnalité à ces deux bonshommes -- Bouli ayant été tout fraichement dessiné (avant ça, il était dessiné comme un "SuperLapin") pour être le dual parfait de Bilou, tant dans les couleurs que dans la version "Laurel & Hardy". Probablement une influence des frères "Jack & Elwood" des Blues Brothers auxquels on jouait tant ... Quoi que j'aie retrouvé en prenant ces photos une première esquisse pour le jeu "Logic Labyrinth", un puzzle-platformer inspiré de Rick Dangerous où mon frère n'avait pas prévu de personnage, et où je pensais bien introduire une balle avec des cheveux punk qui courait très vite et une espèce de saucisse faisant plutôt des sauts en hauteur (un début de Lost Vikings ?). Celui-là n'était pas daté, mais j'aurais tendance à le placer aux alentours de 1990, vu que je me limitais toujours à la palette CGA ;)

It's fun to think that this era is where i initially introduced Bouli in the game. Bilou was there for a long time ago, starring Pierrick's games as "a blue ball named Bubble". I somehow tried to make him look "opposite" to Bilou, unconciously using warm colours where Bilou was all of cold colours, being long and slim (mimmick'ing memorable duos such as Laurel&Hardy or Jack&Elwood) while Bilou was all round. Even his "mood" was different. Bilou started being fast and a bit "impetuous" while Bouli has that kind of "Zen Attitude" that suits the engineer of a revolutional spaceship -- Bilou being instead a talentuous pilot. Think about it: if things had not turned out that way, you might have seen Bouli dubbed "Superabbit" and Bilou might have been blue and magenta with some punk hair...

Voilà. Je vous laisse visionner les archives et je retourne faire mes p'tits trous dans les murs de la cave pour installer des étagères ;)

Friday, July 11, 2008

Pyramid of the Forbidden ...

Bienvenue dans la pyramide interdite, le secret le mieux gardé du jeu "Commander Keen 4". Pensez, alors qu'on a chevauché Nessie et trouvé Korath III avec nos voisins pogoteurs, impossible de trouver un chemin jusqu'à cette fichue pyramide arborant une main, bien en évidence, mais définitivement inaccessible.

Seul indice donné par la princesse Lindsey "le chemin se trouve au fond de la pyramide de la Lune. Alors moi, tout ce qe j'ai trouvé au fond de la pyramide de la Lune, à l'époque, c'est un passage secret ultra-kill vers le sommet de cette pyramide (totalement inutile) et un tas de petits vers jaunes dont je n'ai jamais compris l'utilité.

Qu'importe. Je ne vais pas lever le secret, puisqu'à l'heure des wiki, vous n'avez qu'à chercher pour trouver. Non, je me suis contenté d'un "/tedlevel 14" pour démarrer directement au niveau voulu.

There are number of secret levels or worlds in videogame history, but few are teasing you as much as
the Pyramid of the Forbidden in Keen Commander 4. It this there, in plain sight. There seems to be a path to it, yet you cannot walk that path. And you know it *must* be a level of some kind because there is a put-your-flag-here hole next to the graphics of the level. You cannot imagine how many new games of KEEN4E.EXE we played just with the excuse that 'maybe we'll find the path to the hands pyramid, this time'.

There's an in-game hint telling you that the path for that pyramid is burried deep in the Pyramid of the Moons. All I've found there was an insanely hard secret passage to the top of the pyramid. Almost useless. So I won't spoil what's really to do to unlock the true path, and will just use /tedlevel 14 command line argument to hop to the level I want to test.

Forget all you know about welcoming players in a level. You're barely there and two flame-throwing blobs jump at you. And there you go, climbing a sort of giant staircase of poison slugs while more blue flame-throwers make sure you're under constant pressure.

Does that sound 'impossible mission' enough for you ? well, the 'free' 1-UP flask waiting for you at the top of the stairs can only mean one thing: the real deal is only about to begin.

Et quel accueil. A peine arrivé, deux licks viennent chaleureusement (hum) me saluer. C'est parti pour la première épreuve: escalader tout un escalier truffé de vers jaunes chieurs (litéralement) qui nous oblige de marquer des temps d'attente tandis que les licks cracheurs de feu sautent dans tous les sens, ce qui demande des réflexes d'aciers et des nerfs à toutes épreuves.

Ca paraissait déjà un peu "mission impossible", mais arrivé en haut vous apercevez une fiole "1-UP" qui est à votre portée, même pas sous le feu d'un tir de fléchettes, rien.

Ca, en langage de level-design, ça ne peut vouloir dire qu'une seule chose : "tu n'as encore rien vu. On va tellement t'en faire baver que tu vas regretté d'avoir eu un PC, alors fais demi-tour tant qu'il en est encore temps, tu n'auras rien perdu".

Et effectivement. Après la classique chute en aveugle qui donne sur des picots, on débarque pour ramasser (et utiliser) la première gemme sous un feu nourri. Tout tient dans le rythme : baisse toi, deux pas, un tir sur le slug, baisse toi, deux pas, baisse toi, saute pour attraper la clé, etc. Et une fois la porte ouverte, on remet ça avec trois tirs croisés et un slug à dégommer à l'arrivée.

Fin de la première "salle"

And how could the real deal begin better than a blind jump into a spiky pit where you have to evade to the side just before getting killed ? Once this is done, get ready for grabbing a key-gem (and use it) under constant darts fire. Commander Keen has now turned into a rythm game. Duck. step. shoot the slug. duck. step. step. duck. jump for the key. duck. etc. Once the door is open, we'll now have to deal with 3 crossed dart fires and a slug to shoot before landing. That was the first 'room'.

The start of the second room seems to offer a sort of pause. Sure things are still tricky, but none of it looks impossible until you reach the skypest's nest. They are by far the ennemy I "fear" the most in the game. Protected against our shots, the only way to get rid of them is with the pogo-stick, which is quite a nice monster design trait, but the pogo makes it almost impossible to fine-tune our movements. And they are (like any monsters) instant-kill enemies. So putting 8 of them in such a confined space is pure designer evil. If you're lucky enough, 3 or 4 of them will come close to you, you'll pogo-splat them and then close your eyes and run for the door. At this point, I'll just forget my self-imposed 'no save state' rule.

On continue apparemment en douceur. La deuxième salle est bien un peu corsée, mais rien d'infaisable avant d'atteindre le nid de skypests. Je n'aime déjà pas bien ces bestioles, invincibles à moins de les pogoter au repos, mais huit d'un coup dans un si petit espace, c'est vraiment du vice de programmeur à l'état brut. Seule technique, en attendre trois ou quatre avant de se lancer, puis y aller d'une traite et rentrer dans la porte.

Et là, ça relève tellement de la chance de passer que sorry, mais je sauve un coup.

On arrive ainsi dans les bas-fonds de la pyramide, près de la nappe de goudron bouillonnant qui semble s'étendre sous l'entièreté de Shadowland.
Si se laisser tomber sur une plate-forme mobile pour aller dégommer des slugs n'est pas bien difficile, c'est une tout autre histoire quand les murs sont truffés de lances. Heureusement, il y a juste la place, le tout résidera donc dans le timing.

And so we reach the bottom of the pyramid, close to that boiling-tar-sea that seems to be omnious in Shadowlands undergrounds. Getting down a floating platform and stun slugs souldn't be a big deal, but with spears hidden in every wall and ceiling, that's a different story. Hopefully, the space isn't too tight so it is mostly a wait-and-do timing challenge.

The second underground room is much more deathly. Nothing but tar and a few floating platforms that will let you down in no time. Oh, and a couple of skypests having fun in that open space. At the top of the room, a good deal of slugs wait for us, watching the door out with their puddle of acid ... thing.


La deuxième salle du fond est bien plus dangereuse. Rien qu'une mare de goudron et quelques plate-formes (tombantes de préférences) avec quand-même deux skypest se baladant dans tout celà pour notre plus grand bonheur (?) Et en haut à droite, une flopée de slugs (de nouveau) qui vous attendent sur une de ces passerelles étroites dont Commander Keen a le secret.

Bref, c'est parti pour la remontée. La dernière ligne droite, en somme. Un labyrinthe pénible, qui demande une bonne concentration au moment de dégommer les slugs et autres licks, parce qu'ici la marge de manoeuvre est quasimment inexistante. On se faufile sous le mad mushroom. Allez, courage, il y aura une glace à l'arrivée.

Et tout ça pour un faux-mage qui nous fait preuve de l'excellent humour de l'équipe ^_^

Alors quoi? A quand un Keen sur DS (un vrai, je veux dire. Pas un navet façon "Commander Keen GBC) ? La politique de Nintendo est-elle compatible avec ce type de difficulté ? d'humour glacial et racé ? Et ID software, après s'être vu refuser le boulot de porter SMB3 sur PC et n'avoir pu concrétiser Invasion of the Vorticon sur NES seront-ils encore ouverts à ce genre d'expérience pour un personnage que plus personne à part les croulants de mon époque ne connaît ?

We're almost done. All that's left is climbing up that side of the pyramid, through some tedious labyrinth full of slugs and licks. You'd better keep focused because there's virtually no headroom. Now sneak below the mad mushroom for the ice-cream reward. And the fake mage. Yes, of course: since the level was completely optional, we're rewarded with some totally useless humour.

Would that be publishable as of today ? will we ever see a true Commander Keen episode on Nintendo DS ? (not some sad clone like we got on GBC, I mean) Would Nintendo's Seal of Quality allow that level of game difficulty ? and humour ? Would ID software be willing to do it after they've been denied the porting of SMB3 on IBM-PC and failed to offer Invasion of the Vorticon on NES ?

Could we dream of seeing it run as a homebrew ? well, we've got pictures, levels and tunes. That's a good start.There are even tool to mess with the levels. "All" that's left is a reliable game engine to play it. I won't offer direct help here, I'm afraid, but there's one thing you can take for granted: once the game engine for Bilou's Adventure is ready, it will also be possible to rebuild Commander Keen's logic with it.

Et en homebrew ? Oh, bah on a les sprites, les décors et les musiques. C'est un bon début. Il y a même des outils pour bidouiller les niveaux. Reste à reproduire le moteur de jeu suffisamment fidèlement. Ne comptez pas sur moi, pour m'y atteler, mais soyez certains que le moteur de jeu de Bilou sera tout à fait capable de faire bouger Commander Keen et toute sa clique de sale bestioles pour peu qu'on le programme pour ça. A bon entendeur ...

Thursday, July 10, 2008

Surprenant Squeak Squads!

Mon frère m'ayant prété sa DS, je profite aussi un peu de sa ludothèque... Avec tous les travaux dans la maison, mon budget "jeux vidéos" est en effet assez réduit, si bien que mon dernier Zelda, c'est ma fée qui me l'avait offert à Noël ^_^ J'aurais bien sauté directement sur la cartouche quand elle est sortie, mais les derniers "pinceau magiques" m'avaient franchement déçu. Je suis un oldschooler, voyez-vous. Un jeu de plate-forme ça ce joue avec un pad et un bouton "A" pour sauter, sinon ce n'est pas un jeu de plate-formes :) Mais alors ? Quid de Squeak Squads, ce jeu apparemment trop court aux dire de plusieurs.

Eh bien j'adore. Primo, je trouve le coup des coffres excellent. Il ne suffit plus de localiser les bonus comme dans les épisodes précédents: il faut les choper et les garder. Eh oui, parce que si Kirby peut avaler un coffre, en revanche, les souris (qui déboulent au moment ou vous chopez le gros coffre du niveau) vont tenter de vous les reprendre. C'est alors parti pour une petite course-poursuite qui rafraîchit agréablement le genre. Mais que contiennent donc ces coffres ? Des musiques et des bombes de couleurs (pour customiser kirby) pour la plupart, mais dans quelques-uns, on trouvera aussi des upgrades pour les mouvements spéciaux. Je m'explique. 

@english readers: the web is full of squeak squads review. I second the one you can find on "press the button" even though I'm still very enthusiast about the game. I have been completely convince by the 'treasure chest' mechanics which adds a "you got it, now don't lose it or ..." dimension not unlike "can you beat that section without losing the hammer you'll need later" of Amazing Mirror. At first, I thought a belly full of upgrades would make the game too easy, but pad in hands, it turns out you're using Kirby's belly for many other things (including chests and part-of-1UPs), so you rarely still have as many options as depicted on-screen when you approach the goal. Yes, clearly, it's going to be short and would hardly might not be worth $30 unless you have kids. Try to rent it in a library or borrow it to a friend as i did... and save your pennies for Amazing Mirror ;)

Dans un kirby classique, si vous avalez un "Sir Kibble", vous chopez la possibilité d'utiliser le boomerang. Arme d'une portée restreinte vers l'avant et qui s'avère donc autant un handicap qu'une aide quand il s'agit de dégommer un boss. Mais un premier parchemin vous permet d'en prolonger la durée en gardant le bouton enfoncé ... et un second de le faire monter ou descendre avec le pad (eh oui, Link n'a plus le monopole du boomerang magique. Quelle époque ... tout fout le camp). Et si je pensais au départ que le "ventre de kirby" allait rendre les puzzle trop simples à résoudre, un petit coup d'essai m'a vite montré à quel point je me trompais. 

D'abord parce que vous ne pourrez à la fin du niveau ne garder que deux "items" si vous souhaitez pouvoir ramasser les trois coffres du niveau en question. Ensuite, parce que si les "1UP" sont rares, en revanche, il y a des "mini-kirby" (vous ne pouvez pas imaginer le mal que j'ai à ne pas dire "p'tits Bilous") qui vous donneront une vie si vous en regroupez trois. Je me suis donc déjà retrouver à faire la course aux souris tout en tâchant de regrouper les trois mini-kirby que j'avais pour faire de la place au coffre convoité. Ajoutez à ça la musique sautillante habituelle et des graphismes de toute beauté ... Ce n'est peut-être pas à la hauteur d'un "amazing mirror", mais ça reste un très bon jeu.

Wednesday, July 09, 2008

00:00:00 January 1, 1970

"Epoch" Le commencement de toute mesure de temps pour les systèmes informatiques Unix et BSD ... Le premier janvier 1970. C'était aussi l'heure de création de tous les fichiers sur mes cartes-mémoire avec mes petits outils DS jusqu'ici ^_^

Côté ARM9, si tout ce passe bien, ce sont nos bonnes vieilles fonctions time() et ctime() de la bibliothèque standard qui vont faire tout le boulot. A noter aussi qu'on a bien le champ "ctime" et "mtime" pour connaître l'heure de la dernière modification de fichier, mais ça, ça n'a pas l'air terriblement au point (mon nouveau fichier est renseigné comme datant de 1998 :P)

Attention à ne pas oublier "initClockIRQ();" côté ARM7, après irqInit(), sans quoi l'heure restera définitivement bloquée à "epoch". Si vous utilisez l'ARM7 par défaut du devkitpro, aucun soucis.

Tiens, en parlant du devkit, j'avais migré vers la r21 essentiellement pour pouvoir faire des "delete" et des "rename" dans le système de fichier. Bin c'est pas encore ça (rename, notamment, foire bien). Si bien que j'en suis réduit à faire l'appel explicite à la libfat en court-circuitant la "newlib" intégrée :

#include <reent.h>
extern "C" int _FAT_rename_r (struct _reent *r, const char *oldName, const char *newName);
// ...
{
struct _reent err;
if (_FAT_rename_r(&err, name, "/data/seds/backup.spr")<0)
iprintf("failed to backup %s",name);
else
iprintf("%s moved to /data/seds/backup.spr")
}

Monday, July 07, 2008

En parlant de level design ...

Tiens, justement, squidi nous proposait les débuts d'un générateur aléatoire (en fait, procédural, mais c'est du pareil au même pour le résultat) de niveaux pour un Megaman. L'idée étant de décider d'enchainer "saut facile, saut moyen, saut facile, saut dur, saut moyen, saut dur, saut facile" etc. La "difficulté" d'un saut étant entre autre fonction du type de saut, mais aussi du résultat en cas d'échec (retour en arrière, perte d'un point de vie, mort immédiate, etc).

Oui, en effet, c'est un bon début d'analyse, mais il y a bien plus à prendre en compte, notamment la taille de la zone d'aterrissage qui peut être considérée comme "sûre" (rétrécie par des obstacles ou des ennemis qui ne pourraient être éliminés avant le saut.

In his "300 game mechanics", Squidi suggested a technique for random generation of platformer levels (actually, for megaman-like shooting sidescrollers). Each jump is given a "difficulty ratio", depending on how far away things are, but also on how falling will affect the gameplay (death, hit, have to climb again, etc.)

While this is an interesting starting point for analyzing levels, i'd dare to say that this is not enough. Other elements such as the size of the landing zone should be taken into account, but also how much time the player has to get ready to jump. Moving/ephemeral platforms as well as platforms guarded by an ennemy are obviously "hotter" places where you can't just wait.

Evidemment, d'autres points (comme la présence d'un obstacle au-dessus de vous) sont aussi à prendre en compte, et j'aurais envie d'y ajouter le temps dont on dispose pour se préparer. Qu'il s'agisse d'un scrolling imposé, d'un ennemi sur la plate-forme de départ, ou du fait qu'il s'agit d'une plate-forme éphémère ou mobile ...

Bref. J'ai eu envie d'illustrer ça avec un bout du niveau Isle of Fire de Commander Keen IV, selon moi un des plus durs du jeu, avec du rouge pour marquer les "zones à risques" et un coup de bleu pour les itinéraires a priori les plus sûrs. A noter qu'en fait, pour le joueur qui s'y prend bien, les "berkeloids" (lanceurs de feu invincibles) ont essentiellement un effet psychologique, puisqu'il y aura moyen de se ménager un itinéraire qui les évite presqu'entièrement... enfin, à condition d'avoir trouvé le truc pour les écarter -- un peu comme le DopeFish, quoi.

I tried to illustrate this concept of "platform temperature" on the second half of the "Isle of Fire" in Commander Keen IV, using red overlay for "risky" areas and blue/green for "safest path"... Funny enough, while the level gives a feeling of a very risky environment (imho, this is one of the hardest levels in the game), the safe path virtually avoid any of the hardest ennemies (the berkeloids flame throwers).

Une application intéressante du principe "a (good) game is a succession of (interresting) choices" ;)

Alors? ils sont toujours "vicelards", mes niveaux ?

Friday, July 04, 2008

I see Debug Sessions coming, darker than night itself ...

Well, patching the ARM9 stub when executing another .nds, that works. Fine. But now, i also need to ensure that the stub patches the binary. This is supposed to take place in LoadNDSArm9(), and the DLDIEnabled flag and DLDIStub themselves are found in some "magic" addresses in VRAM that need to match those used by exec.cpp in the calling program.

As far as i can tell, everything should work fine in that regards. I tweaked the stub a bit (yeah, now i manage to compile it properly ;) to make it halt before and after patching ... it all seems right, but for some reason, the freshly downloaded "runme" do not detect the presence of DLDI, nor does it manage to access FAT (of course :P)

// Copy the DLDI patch into the application
- memcpy (pAH, pDH, dldiFileSize);
+ memcpy (pAH, pDH, ddmemSize);
+ printf("%i bytes of driver copied\n",ddmemSize);

Hmm. Fortunately enough, i'm now fluent with diff and other revision control tools, so just checking what changed in my own copy of chishm's DLDI patcher (integrated to runme when it patches the stub) revealed a wrong memcpy that was using 0 bytes (dldiFileSize) instead of the just-computed driver size (ddmemSize). This affects v1.23 as far as i can tell, though i cannot guarantee this isn't just something odd in DSchannels' copy of the DLDI tool, as this is where my stuff comes from.

(this is usually where Beyond Infinity waved his towels in a "GG. Stay Safe.")

*fix*
*compile*
*snip -- getting the SD card out of the R4*
*copying files*
*snap -- pushing the SD card back in the R4*
*can't help to press "start" again and again while the device is booting*
*launching runme*
*updating runme*
*seems to work*
*yeah. indeed, it works ^_^*
*updating again, then launching LEDS, just for fun*

Okay, everything seems fine. So it was "just" my exec_stub.arm9 that was buggy. it's now in the CVS too ...

credits : chishm for the libfat and DLDI patchers -- EyeballKid for DSlurper/happyhttp -- sgstair for the libwifi (of course) -- whoever wrote DSChannels and did not stick his name there -- chishm again for the exec_stub i'm using (as far as i can tell) -- padrinator for non-jumpy stylus input -- wintermute, darkfader and many others working on libnds and devkitpro ;)

*ahem* test ? un deux ? un deux? *broum* Chers amis francophones, bienvenue sur le Blog de Bilou. J'ai l'insigne honneur et l'immense plaisir de vous annoncer qu'au terme d'une longue et fastidieuse semaine de débugging, runme et mes éditeurs de sprite/niveau tournent enfin au maximum de leur possibilités sur le linker R4. J'ai de bonnes raisons de croire que du coup, la compatibilité sur l'ensemble des linkers devrait être améliorée. Merci pour votre attention. A vous les studios. *wiiiit*


edit: oh well, now it seems that SEDS is touch-screen-blind and only recognize "gba" buttons (e.g. it ignores X and Y aswell) when started directly. Launching it through runme still works fine.

edit again: fixed. When you have some interrupt handler checking a "commands" buffer shared between ARM7 and ARM9, better make sure that you initialized the command buffer properly, even if you don't intend to send any commands in your program ^^"

Thursday, July 03, 2008

Un peu de level design

L'autre jour Pierrick me proposait de faire une sorte de générateur aléatoire de niveaux pour Bilou. Je dois bien avouer que construire un niveau qui soit intéressant, ça n'est pas une mince affaire ...

Mais non. De l'aléatoire, là, je n'en veux pas. J'aime partir d'un élément nouveau, qui sera unique dans le niveau, et construire autour de ça.

Ici, c'était les lattes tournantes. Placées à l'horizontale, elles tournent autour de leur centre, ce qui en fait pour Bilou des plate-formes qui s'étendent et se contractent.
Le tout sera évidemment de bien gérer son timing pour être dessus au bon moment. On peut encore corser la chose en disant que non, il n'est pas question de sauter *à travers* la latte. C'est plus ou moins sur cette base-là qu'est apparue la scène ci-dessus.

My friend Pierrick was hyp'ing about random-generated levels for platformers, not so far ago. Personnally, I prefer to craft maps on purpose, preferably around a specific "level item" that will give it a "theme". Here, the theme is some rotating rulers, which force you to adapt the timing of your jumps aand grab the only Dumblador that hangs around that could stun the pendat.

The skilled dare-devil player is allowed to try and get the key without stunning the pendat, but there will barely got room for that. Plus, Pendat tend to be aggressive and run towards Bilou as soon as he's spotted.


Une "clé", planquée en hauteur, qu'il va falloir aller chercher en grimpant sur une late. Pour épicer la scène, un crayon belliqueux dont Bilou ne sait pas se débarasser seul.

Le joueur impétueux pourra malgré tout tenter sa chance en passant "par-dessus" le crayon en question. Moui, pourquoi pas. Mais bon, il faudra être super-précis, parce que l'espace est des plus justes. Et puisque la latte bouge en permanence, il faudra en plus calculer son timing pour arriver au bon moment, choper la clé, contourner à nouveau le crayon et repasser à fond dans l'autre sens

Bref, pour un joueur moins "casse-cou" (moi, par exemple) on préfèrerait de loin avoir un taille-crayon à lancer à la figure du crayon histoire qu'il se tienne tranquille. Seulement voilà. Vous êtes arrivé dans cette zone à dos d'encrier, ce qui retire toute possibilité de transporter un taille avec vous . . .

C'est là qu'on va pouvoir s'amuser avec le level design.

Seul voie d'exploration possible : vers le haut, ce qui nous donne évidemment la possibilité d'une longue série de lattes tournant à des vitesses différentes, obligeant le joueur à "sauter de latte en latte" pour atteindre le repaire de Dumblador, le taille crayon crétin.

Evidemment, on peut de nouveau placer les lattes de manière à ce que les plate-formes qu'elles constituent disparaissent et réapparaissent. Classique. Un faux pas, et on retombe chez le crayon: l'escalade est à recommencer avec en prime le risque de se prendre un coup de pique.

Mais on peut aussi pimenter la chose avec des encriers lançant des gouttes d'encre ou des crayons qui blesseront Bilou avant même que la latte ne se soit complétement retirée.

Et une fois le taille-crayon ramassé, il faudra refaire le trajet en sens inverse (quoi qu'un joueur un peu casse-cou tentera probablement le retour en chute libre).
So the 'dumb blado' pencil sharpener is actually a key itself. An organic key according to Kirby Kid's vocabulary.
PS: vous aurez noté que j'ai trouvé un nom marrant pour le taille crayon : dumb + blade = dumblador. L'occasion de faire une catégorie par perso ...

En terme de level design, dumblador est donc ici une "clé organique" (sisi, c'est KirbyKid qui l'a dit).

car4mba! encore r4té

Bon, suivant les bons conseils de gbadev.org, j'ai essayé d'adapter un "exception handler" pour l'ARM7, histoire de savoir si oui ou non il y a un plantage sur ce processeur. J'en ai aussi profité pour remettre une ou deux choses en place et voilà que je me retrouve avec un ARM7 qui fonctionne sur R4 sans tout planter. Son, wifi, tout y est.

Bref. J'espère juste être mieux armé pour le prochain plantage (je n'aime pas laisser un bug derrière moi comme ça). En attendant, la guerilla avec le R4DS est encore loin d'être finie : j'en prends à témoin un message du genre "DLDI driver available ; using built-in driver for R4TF; operating without DLDI" ... mes routines de détections sont dans les choux, quoi.

Résultat, si je lance SEDS depuis Runme, par exemple, SEDS n'aura plus accès à la carte mémoire (et donc sera incapable de se remettre à jour) ... hum, hum ...

Tuesday, July 01, 2008

[blogroll] fury of the furries

Si comme moi, vous lisez l'anglais et que vous êtes un grand fan de Fury of the Furries, mais que contrairement à moi, vous avez assez de temps pour une petite lecture online, je vous invite à dévorer le billet d'Alec Meer sur Fury of the Furries.

Si vous ne lisez pas l'anglais, ne vous bilez pas de trop : on a déjà parlé de Squeek (le jeu d'origine dont les personnages de Fury sont tirés) dans Pix'n'Love, on finira bien par parler de Fury lui-même ... et à l'occasion, soyez sûr que j'en reparlerai ;)

for those who can read english and who once loved "fury of the furries", that puzzle platformer featuring blue-swimmer, yellow-burner, red-stoneater and green-roper furballs, i strongly recommend Alec Meer's post ^_^

Et pour le coup de nostalgie, on se remet le remix de mon frère CJ