Friday, March 27, 2009

vgmaps tool for RDS Game-Maker


bbl2map.pl

Et voilà. L'outil ultime : conversion des fichiers .MAP en allant rechercher les animations des monstres dans les .MON. Je suis encore loin d'avoir tout compris aux .mon (déplacement, etc.), mais au moins, j'ai de quoi me faire un joli musée de niveaux de nos jeux RSD Game-Maker. Pour ce qui est de faire une conversion .gam -> .nds, par contre, ce n'est toujours pas gagné. Si la plupart des maps se "compressent" assez bien sur des tiles de 8x8 (pour Badman II, en tous cas), la gestion des animations serait un vrai cauchemar dans un environnement pareil ...

Good news if you used to design games on RSD Game-Maker: i managed to build a fully-featured RSD .MAP reader that lookups .MON files (at least animations) to render a full map of your levels, with monsters depicted... Oh, it could still use the information from .GAM files to show you entry/exit points as well, i admit.

I guess anyone fluent in PERL could reuse the code to write a RSD->XXX converter given that you already know the map format for XXX. Unfortunately, that doesn't really bring me much closer to the "RSD->NDS" conversion/replay tool due to the silly 20x20 block size in .BBL files. Not much of a concern for handling the map (at least, in Badman II, most of the maps use quite few blocks and a plain conversion to 8x8 tiles does the trick), but animating such 20x20 blocks that are split over different tiles would likely turn into a nightmare. And trying to update a bitmap rendering of the level might be tedious (and boring) to implement, not mentioning the limited bandwidth to the screen's backbuffer , that would hit the framerate quite badly.
.

Thursday, March 26, 2009

BBL metadata.

Voilà. Une fois qu'on dispose de tout un jeu de .BBL avec les tileset correspondant, c'est bien plus simple de reconstituer le rôle des 20 bytes de contrôle ... C'est ce que fait de son mieux ce petit outil "bblmeta.pl" que je vous offre également.

Chaque ligne rappelle le numéro du bloc (en hexa) et sa position dans l'image générée par bbl2png (le premier, par exemple, r02 c12 correspond au premier canon, tourné vers la gauche sur la 3eme ligne de l'image). Suit ensuite les "flags" tels que lus dans le fichier .BBL puis l'interprétation de ces flags par le script bblmeta.pl

J'ai repris la technique des répertoires UNIX: un '-' chaque fois qu'il n'y a rien à signaler, une lettre sinon. Ainsi "B--a-K" serait un bloc solide (B) animé qui interagit avec une clé (probablement une porte). "--g-+-" est un bonus qui rapporte uniquement des points, etc. Pour être exhaustif, je dirais que le programme reconnait:

  1. Bloc, Floor, Wall ou ciel (-)
  2. Pickme : l'objet peut être ramassé pour l'inventaire
  3. g, l ou r : gravité normale, vers la gauche ou la droite. Les autres combinaisons ne sont pas reconnues.
  4. a : bloc animé,
  5. t: réagit au contact
  6. bonus/malus : H=hitpoints, x=kills, + : score
  7. L = 1UP, K=clé/porte.
En plus de ces "flags", certaines valeurs sont indiquées dans une liste entre parenthèse, comme la succession des blocs pour une animation, le nombre de hitpoints ou de clés, ou de points modifiés lors d'un contact , le numéro du monstre tiré (pour les blocs qui tirent des monstres), etc.

Here comes a second funny PERL script. It extracts meta-data from .BBL (Background BLocks), .CBL (Character BLocks) and .MBL (Monster BLocks) produced by RSD Game-Maker. If you used to write games with that editor, feel free to use that tool to retrieve all meaningful elements and port your old funware to some new platform. If you do so (or just plan to do so), please share the joy and post a comment.

This tool is a kind of "preliminary" reverse-engineering tool. It can tell you roughly what are the properties of individual blocks but detailed information may need to be looked up in the 40-digits hex string. Each line describes a block. Right to left you'll have the following information :

1c (r01 c13): 400100000000000000ffff1b64001c0400010000  --ga-x-  (a1b,100)(h-1)
^    coords   |--- complete hex dump of meta-data ---|  |flags|  |---details--|
+- block number
On the right side, "flags" tell you roughly what are the properties of your block. here you see an Animated block that has downwards Gravity and that hurts the player (x) on contact. Details tell you that it animates to block 1b after 100 ticks and that hitpoints are reduced by 1 on contact. On the left, you have block number (block #x pixels are located at bytes x*420..x*420+399 in xBL file) and the row/column coordinates on the picture generated by my former bbl2png.pl script.
Bref, ce n'est certainement pas aussi souple que l'éditeur du game-maker (et d'ailleurs, ce n'est pas un éditeur, juste un outil d'inspection), mais ça capturera la plus grande partie des cas que l'on retrouve dans un jeu de plates-forme comme les Badman.

Hope it Helps ^_^
PS: 1st byte is the index of the generated monster (0x40 = no monster generated), thus byte 2 is likely the delay between two such generations.

BBL to .png converter

J'avais pris l'habitude de faire un p'tit cadeau sur Internet pour mon anniversaire, et là, pour mes 30 ans, schnol. Avec les travaux dans la maison et le retour de Suisse, je n'avais rien à montrer. Quelle idée saugrenue m'a pris ce midi? Aucune idée. Mais je vous offre un petit script de conversion des fichiers graphiques du Recreational Game Maker (.BBL, .CBL et .MBL) vers des .png, plus pratiques à manipuler. download bbl2png.pl exemple d'utilisation :

perl ~/DS/SEDS/runme/bbl2png.pl /tmp/TOYZONE2.PAL /tmp/%.MBL m%.png --sprites

Here comes some pixels dump of sprites i've been working on in '97, at the peak of my RSD Game-Maker years. Each level had its very own tileset and spriteset (though there might be much shared things between two levels in the same "zone"). Behold Badman III, most likely the more complex (and unfinished) project with the RSD-GM ever. I finally managed to write a small ".BBL->.png" conversion script, meaning that i can retrieve *all* the graphics from all our previous games. 

Ca veut donc dire que je peux récupérer tous les graphismes de Badman et autres pour vous les montrer... Je doute qu'il y ait grand-chose à en tirer à part de la nostalgie ... j'ai tant appris en matière de pixel art, que même mes "plus jolis" boss sont tartes "by today's standards" :P En vrac, donc voici quelques sprites tels qu'ils sont présents dans la démo jouable Badman 3 (Badboyz are Back!). On y découvre "Ratman", d'après un T-shirt de T-Bob, qui ne sera finalement pas repris comme boss de la Cheese Zone. Juste après, Burner "relooké" qui laisse derrière lui une trainée de feu quand il court, avec un shading un peu douteux. Enfin, le gris aux oreilles rondes, c'est le "ratman" tel que vous pouvez l'affronter, avec son astro-flasheur "kirsch" et ces attaques de roues de gruyère.  

In "Badman III: Badboyz are Back", you can play either with Badman or Rubishbin (who you saved in "Badman II: Out of This World") in three insane environments: the Cheese zone, the Toy zone and the Ice zone. Each character had unique abilities giving them access to hidden areas. Rubishbinn, for instance, can do a spin-jump that destroy some blocks below him while Badman can dash under low roofs. I also reused the technique developed in Badman II for creating shooting bosses. The result was near to an unmanageable nightmare that turned short as I entered university: with only 5 playable levels, Badman III games already lists 44 'levels' in the game editor. 

Ce serait à refaire, je prendrais le "ratman" initial comme PNJ genre "Je suis le seul maître légitime de la Lune Fromagère, et je délivrerai mon monde de la tyrannie des BadBoyz ... Enfin, si tu veux m'acheter des grenades Petit-Suisses ou des Camemberts lacrymogène, ... " Et oui, le volet 3 de Badman était franchement inspiré de la mécanique de jeu de Megaman ... Suit l'Ice Zone, dont les monstres sont pas mal inspirés du niveau des glaces de Prehistorik II (auquel je rejouais cet été-là -- juillet '97 selon le .zip -- en version complète). 

On y retrouve donc un le fameux pingouin et un eskimo dont je n'étais pas peu fier à l'époque et un "lemmings xmas" qui était là juste pour le fun. Ce genre d'apparition était d'ailleurs assez habituel dans la série des Badman : le bonhomme-promo de Belgacom, Moktar sur son tapis volant, une bestiole rampante "façon Commander Keen", des p'tits robots tout ronds "façon twinbee land", une souris bleue mécanique "à la sauce Alfred Chicken", etc. Vous remarquerez aussi "Rex", le chat (private joke) utilisé dans des "cut-scenes" façon "Kirby's dreamland". Le mamhout vous paraît bizarre ? logique. 

Le game maker de Recreational Software ne supporte qu'une seule taille pour les monstres: 20x20. Un monstre plus gros est indestructible par nature et construit à l'aide de plusieurs monstres que vous tentez de déplacer de manière synchronisée ... ce qui se traduisait généralement par un désastre complet. Allez, je vous mets aussi Badman "himself" et son compagnon d'aventures "Rubish bin" ... On est plus très loin d'un extracteur de niveaux complets, avec les autres infos dont je dispose déjà 

PS : mon frère possède aussi une mine de petits "trivias" sur le développement des épisodes de Badman, qu'il reconstitue a partir des commentaires de ses .S3M ... Si vous êtes fan, bonne lecture.

Friday, March 20, 2009

ça descentote ...

Je me faisais un petit tour de jeux SNES rapidos pendant que ma fée écoute Cedra... En retombant sur Twinbee, je me rends compte d'un élément intéressant: le perso peut rester sur une pente même si un seul pixel s'y trouve.

Autre élément: dans ce jeu, une pente "repousse" automatiquement le joueur vers le bas. Si vous marchez le long de la pente, arrivé au bord formé par un mur celui-ci vous "éjecte" avec une vitesse presqu'exclusivement horizontale.

Un système de contrôle original, qu'il faudra que je compare avec le comportement de SuperMario et autres Rayman the Hedgehog Commander ...

As i was busy converging my data to a new USB backup drive, I gave another try to some of my favourite platformers. Twinbee (rainbow island adventures) caught my attention with its slope management. First, slopes always "push" the character downwards, so you cannot "stand still" on a slope. If you walk down a slope, you'll get "thrown" horizontally when you go past the edge. Interestingly, you can stay "on the edge" of a slope, as shown on the screenshot, hanging in the air (i haven't checked whether it also happens when walking down the slope or only when being "pushed backwards when you stop walking up the hill").

I'll investigate that deeper, comparing the physics of slope-walking in Twinbee, Fury of the Furries, Mario, Keen and Rayman, and possibly some Sonic game if i manage to locate some. My feeling is that gameplay of slopes should prevail on accuracy of physical behaviours to make the game fun. Slopes are not just a way to have your character elevating as he moves: in a platformer, they should be used to tune the difficulty of basic moves (jump or stun ennemies).

Konami's decision to have Twinbee "pushed backwards" when halting on a slope clearly makes anything above a slope harder to reach precisely, yet the fact that you're stopped at the edge of the cliff compensate by not throwing you into hazards. Of course in Twinbee, slopes also play an important deflecting role when you're flying with your boosters, but that's a different story.


New Super Mario Bros. : pratiquement aucune pente en bord de plate-forme dans ce jeu. Les seuls emplacements où j'ai pu le détecter, c'est soit dans le niveau des glaces ou pour des plates-formes spéciales (champignons mobiles, leviers ...), pour lesquels le bord est carrément arrondi et où Mario suit l'arrondi. La friction est parfaite : hormis sur les pentes enneigées, Mario tient en place sur les pentes.
No real slope-edge to report in that game, except for some special objects (moving mushrooms, levers, falling rocks ...).

Commander Keen : dès que le test-point central de commander Keen n'est plus sur le sol, Keen tombe et se fait "repousser" par le mur. A noter que, compte-tenu de la faible largeur de Keen, il y aura ajustement de deux pixels à peine. En saut, il y a moyen de voir Keen "atterir presque" sur le bord d'une pente et se faire soudain repousser. Dans le mouvement, l'ajustement en X donnera aussi l'impression que Keen "saute" vers l'avant en quittant la pente en marchant. Idem: friction parfaite.
As soon as the "hot spot" test-point of Commander Keen leaves the slope, keen falls and is "pushed" by the wall. Given the small width of Keen, this is merely a 2-pixels extra move that you'll barely detect unless you try to land "not quite" on the edge of the slope.

Rayman : les pentes sont toujours terminées par un bord horizontal. La seule exception que j'aie relevé à cette règle, c'est dans le pencil pentathlon où au bout d'une course effreinée, Rayman passe le long de 3 crayons inclinés. Ceci dit, les crayons en question sont terminés par des gommes-bumper, et donc on a pas vraiment la physique d'un "bord incliné" comme les plate-formes de Commander Keen. A noter que, du coups, Rayman sait s'accrocher à tous les bords, alors que les bords inclinés ne permettent pas à Keen de se suspendre dans Goodbye Galaxy. Ils ont bien tenté de lever cette interdiction dans "Alien Ate my Baby-Sitter", mais c'est la source de bugs innombrables dans ce jeu.
Virtually all slopes are terminated by a horizontal edge. The only exception i could spot is the Pencil Pentathlon, but there are bumpers at the edge of those pencils, so it's not exactly what you'd call an edge.

Mario World: 4 angles de pentes différents dans ce jeu. Pas de doute : on cherchait à démontrer la supériorité de la nouvelle SNES ... A noter qu'il y a deux types de "bord de pente" : celui qui donne sur un mur solide, et celui qui n'est qu'un bord de plate-forme. Dans le cas "bords de mur" (comme avec le beetlebug), je ne note que des pentes possédant un rebord horizontal.
Four different slopes! That's what i call "technically amazing" for introducing the new (back then) Super Famicom. Two kind of slopes here: those who are merely platforms (side picture), and those who are the edge of a solid area (bottom picture). In first case, mario will fall as soon as the test point is no longer on the slope (like Keen), and in the second, there is usually a horizontal edge after the slope (like Rayman).

Sur les pentes à moins de 45°, friction parfaite. Les pentes à 45° et plus repoussent Mario vers le bas. En clair, il sera impossible de s'y arrêter et difficile d'y contrôler sa vitesse. Une pente comme celle représentée sur l'image du haut correspond donc à une double difficulté : on tombe plus tôt (des que le test-point a quitté la surface) et on ne sait pas s'arrêter. En revanche, c'est bien un "test de boîte" qui a lieu pour les surface horizontales.
Also note that friction differs from the slope: over 45°, the slope is slippery and you cannot stop, while slope below 45° behaves like plain horizontal ground.

Kirby (squeak squads): c'est le jeu idéal pour ce genre d'observation car l'animation de Kirby est différente selon qu'il est à l'arrêt sur une pente ou sur une surface horizontale. De plus, comme dans Keen, la friction est parfaite quelle que soit la pente (un jeu pour gamins, quoi, mais j'adore). A noter qu'à l'inverse d'un personnage comme Keen, Kirby se prète plutôt mal à un mécanisme de "test-point" unique, puisque sa base au sol est particulièrement large.
Interesting game to study as there are two different idle frames depending on whether Kirby stands on a slope or on a horizontal area. Here we can observe an additional "horizontal" move after the hot spot has left the slope, but while kirby cannot "fall" yet due to the wall (box-cando test).

Phénomène intéressant, dans le cas d'un "bord pentu descendant" comme sur la photo ci-contre, on observe un comportement "horizontale - pente - horizontale - chute". Dès que le "test-point" qui sert à suivre une pente a quitté la pente, Kirby a donc le choix entre deux actions: continuer à avancer à l'horizontale ou tomber. Il ne tombera pas tant qu'une partie de sa base reposera sur le bord du mur (d'où la deuxième phase horizontale). Du point de vue du code, ça pourrait se traduire par:

  • test = cando(FALL, x+dx , y+1);
  • if (test&FALL) return switch_state(falling);
  • if ((test&SLOPE) && testpoint_on_slope(x+dx,y+1)) return align_slope(x+dx, y+1);
  • if (cando(WALK, x+dx, y)) return simply_move(x+dx,y);

Friday, March 13, 2009

Guest Book -- Livre d'Or

Lecteur d'un jour, lecteur assidu,
Internaute occasionnel perdu

Si vous souhaitez laisser un petit message genre "courrier des lecteurs" qui ne se rapporte pas à un post particulier, cet espace est à vous.

Casual reader or #1 fan,
and you too, lost on the Internet

If you'd like to give a feedback on your reading experience of this blog's content, but don't want to comment on a specific post, this space is yours.

This page is also my treasure box, where i'll come and seek for motivation if i ever need some. More than money, you can donate motivation by just posting your comment here !

Cette page est en quelques sortes ma "boîte au trésor", où je puiserai un peu de motivation les jours de blues. Je n'ai pas encore de système de "donation d'argent pour le projet Bilou", ni d'utilité pour un tel système, mais vous pouvez donner de la motivation en laissant votre commentaire ici ;)

 edit: pour les 10 ans de mon premier jeu homebrew, et vu l'évolution de l'accès à Internet (sans clavier. Pauvres de vous), j'avais mis en marche un petit poll.

Thursday, March 12, 2009

Qwak!

C'est l'histoire d'un drôle de petit canard qui me fait de l'oeil depuis un moment ... Qwak! Un jeu d'arcade un peu genre "bubble bobble" qui a une histoire pas vraiment ordinaire.

Un vieux vieux jeu, en fait, développé sur un micro 8 bit en 1989 -- eh non. Pas sur C64 mais sur BBC micro, Angleterre oblige ^_^. Au fil du temps, le canard s'est fait relifter avec notamment une version Amiga à laquelle on doit les graphismes actuels (qui me rappellent franchement le look de James Pond). Avec le soutient de Team'17, quand-même!

This is the story of an unexpected duck. Qwak feels like an arcade game in the veins of Bubble Bobble, but it did not start in Japan. Instead, it kickstarted in 1989 on BBC 8-bit computer (logical consequence of being by someone in the UK).

What is notable, is that Jamie kept the little game alive, doing an Amiga reboot produced by Team17 (and visuals that were on par with James Pond titles at least), and even more surprising, a GBA homebrew port. Quite surprisingly, he also managed to get a chinese factory producing 300 cartridges with his own title, and selling them on his website. I'm not that much into international shipping, but I had to check. Maybe one day, Bilou might follow the same track.

En 2006, Jamie nous propose sur www.qwak.co.uk une version GBA. Décision peu courante, il s'est arrangé avec une fabrique chinoise pour recevoir 300 cartouches de son jeu (ben oui. On faisait bien des Supercards ... pourquoi pas mettre son petit jeu à soi sur ce support, du coup ?). J'ai donc décidé de risquer 15£ pour un achat par correspondance, un prix que je trouve tout à fait honnête pour un p'tit jeu sympa de ce genre, et une initiative qui m'ouvre des horizons pour Bilou (si j'arrive à une version vendable un jour).

Voilà, donc. Après quelques petits mails perdus, Qwak, lui, est bien arrivé dans ma boîte aux lettres, mais j'ai à peine pu vérifier qu'il fonctionnait bien que ma fée me l'a confisqué ... cadeau d'anniversaire. Je vous dirais mes impressions plus tard, donc.

Saturday, March 07, 2009

Chenillard

En faisant des fouilles dans les archives de la green zone (que je vous présenterais bientôt), je me rends compte qu'un des monstres qui revient le plus souvent est en réalité le seul monstre qui n'a jamais été retenu : le chenilleur. Je lui préféré, dans la version BASIC, le "petit ver jaune", maintenant connu sous le nom de "woodworm".

En allant chercher mon sandwich hier midi, j'ai essayé d'imagine ce que pourrait bien donner le "chenilleur" en 2009, sans faire un repompage trop ostensible sur wiggler de super Mario World (qui pourtant doit être à l'origine du personnage).

Mais évidemment, ça ne m'intéresse pas vraiment de juste rajouter un monstre dont le comportement ne serait pas différent des petits vers. La seule doc que j'ai dit "chenilleur : vulnérable ; petit ver : comme chenilleur, mais invincible au default power". En clair, si vous essayiez de sauter sur le petit ver de terre jaune, le monstre apparamment le plus innofensif du jeu, bardaf, vous perdiez un point de vie 0_o". Une référence de plus au Commander Keen, mais que je trouve franchement gênante au niveau du gameplay.

Tentative de changer la donne, donc. Je voudrais faire du chenilleur une chose qu'il vaut mieux éviter et pour laquelle il faudra ruser pour en venir à bout.

Tout d'abord (coup classique), seul un des éléments sera sensible à vos attaques. Mettons la queue. Si on saute sur sa tête, je reprend le coup de SMW: il se fâche, devient tout rouge et vous avez intérêt à prendre le large. De plus, ses ornements dorsaux devraient vous décourager de tenter un rodéo pour aller jusqu'à son point faible.

Facile, me direz-vous ? "Il suffit d'attendre qu'il ait fait demi-tour". Bin pas vraiment, parce qu'à l'instar de Robo Red (Commander Keen 5), j'ai l'intention de lui permettre "d'entendre" Bilou: si vous atterissez alors qu'il vous tourne le dos, le chenilleur se redresse pour vous faire face: c'est loupé.